这里非常基本的问题:
我目前正尝试通过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个单位的写入值。有人能够为我提供这个价值吗?
谢谢!
答案 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: ¶meter, length: 2)
self.sensorTagPeripheral.writeValue(data as Data, for: thisCharacteristic, type: CBCharacteristicWriteType.withResponse)
此外,如果您不喜欢选项设置,则swift具有二进制文字,因此您可以在代码中编写var parameter = 0b1001111111而不是0x027F