Swift Sensortag 2.0写入BLE位

时间:2016-10-26 00:50:45

标签: swift bluetooth-lowenergy accelerometer gyroscope magnetometer

这里非常基本的问题:

我目前正尝试通过Swift 3.0控制sensortag 2.0。

我试图同时打开acc,gyro和磁力计。

根据德州仪器的文档,以下内容适用于IMU:

轴使能位:gyro-z = 0,gyro-y,gyro-x,acc-z = 3,acc-y,acc-x,mag = 6范围:bit 8,9

我写了#34; 0x023F"以下列方式打开陀螺仪和加速度计取得了巨大的成功。

    ManualResetEventSlim _mre = new ManualResetEventSlim(false);

    public Task<string> WaitForIdleAndGetErrors()
        {
            return Task.Factory.StartNew(() =>
            {
                if (!_queue.IsCompleted)
                {
                    _mre.Wait();
                }
                return ErrorsOccurred;
            });
        }

但是,我无法找出要同时打开所有3个单位的写入值。有人能够为我提供这个价值吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

将正在使用的当前值(0x023F)转换为二进制时,得到0b1000111111。每个位代表给定传感器组件的开/关(on = 1 / off = 0)状态。

如果从从右到左读取二进制数,并通过参考下表来映射每个位,您将看到陀螺仪z / y / x和加速度计z / y / x是全部启用。如果要启用磁力计,只需将“位6”更改为“1”并将该二进制数转换为十六进制数。

所以,谷歌说:0b100 1 111111是十六进制的0x027F

映射:
位0 =&gt;陀螺z轴
位1 =&gt;陀螺y轴
第2位=&gt;陀螺仪x轴
第3位=&gt; acc z轴
第4位=&gt; acc y轴
bit 5 =&gt; acc x轴
第6位=&gt; mag(启用所有轴)
bit 7 =&gt;唤醒动作启用
第8位和第8位9 =&gt;加速度计范围
位10-15 =&gt;没用过

有关映射的更多信息(即第8位和第9位的内容),请参阅Sensor Tag Wiki Page

答案 1 :(得分:1)

在peters回答的基础上,这样做的很好的方法是使用一个选项集,这无疑是更多的工作,但比十六进制更具可读性:

    struct SensorOptions: OptionSet {
        let rawValue: Int32
        static let gyroZ = SensorOptions(rawValue: 1 << 0)
        static let gyroY = SensorOptions(rawValue: 1 << 1)
        static let gyroX = SensorOptions(rawValue: 1 << 2)
        static let accZ  = SensorOptions(rawValue: 1 << 3)
        static let accY  = SensorOptions(rawValue: 1 << 4)
        static let accX  = SensorOptions(rawValue: 1 << 5)
        static let mag   = SensorOptions(rawValue: 1 << 6)
        static let wakeOnMotion = SensorOptions(rawValue: 1 << 7)
        static let accelerometerRange1 = SensorOptions(rawValue: 1 << 8)
        static let accelerometerRange2 = SensorOptions(rawValue: 1 << 9)
    }

    let options: SensorOptions = [.gyroZ, .gyroY, .gyroX, .accZ, .accY, .accX, .mag, .accelerometerRange2]
    var parameter = options.rawValue
    let data = NSData(bytes: &parameter, length: 2)
    self.sensorTagPeripheral.writeValue(data as Data, for: thisCharacteristic, type: CBCharacteristicWriteType.withResponse)

此外,如果您不喜欢选项设置,则swift具有二进制文字,因此您可以在代码中编写var parameter = 0b1001111111而不是0x027F