電子部品が足りないので前回の続きをやるのは部品が届くまでの我慢です。
今日はKonashi(Bluetooth LEモジュール)とHMC5883L(3軸磁気コンパスセンサー)を接続して、iPhoneでセンサーが取得した値を表示する実験です。このセンサーは海外でも使っている人が多く、HMC5883Lで検索すると参考になるページがいくつもヒットします。
KonashiとHMC5883Lの接続は次の通りです。
Konashi | HMC588CL |
+3V | VDD |
GND | GND |
SDA | SDA |
SCL | SCL |
これが実行結果です。面白くないですね。
![]() |
まだ少し計算のおかしいところがあるのでソースは載せませんが、Konashi SDKでi2cを扱う部分だけ抜粋しておきます。iPhoneからKonashiを見つける部分のコードはKonashi SDKのサンプルプログラムを参考にすれば難しくありません。
i2cというものがよくわかっていなかったので最初少し戸惑いましたが、多分、i2cを理解すれば他のモジュールとのデータのやり取りも同様に書ける書けるんじゃないかと思います。
Konashiの初期設定
- (void)viewDidLoad { [super viewDidLoad]; .... .... [[Konashi shared] setReadyHandler: ^{ [self showStatusMessage:@"Ready"]; [Konashi i2cMode:KonashiI2CModeEnable400K]; [self configSensor]; }]; }
i2c書き込み
サンプルコードを見るとi2c関連メソッドの呼び出しの後にウェイトを入れてあったので、その方法を踏襲しました。DeviceAddressがi2cモジュール固有のアドレスです。今回使ったHMC5883Lの場合は1E(16進数)です。
- (void)send:(NSData *)data { [Konashi i2cStartCondition]; [NSThread sleepForTimeInterval:0.01]; [Konashi i2cWriteData:data address:DeviceAddress]; [NSThread sleepForTimeInterval:0.01]; [Konashi i2cStopCondition]; [NSThread sleepForTimeInterval:0.01]; }
i2c読み込み
- (NSData *)receive:(int)length { NSData *receivedData = nil; unsigned char bytes[2]; bytes[0] = DataAddress; // 0x03 Data Register Address [self send:[NSData dataWithBytes:bytes length:1]]; [Konashi i2cStartCondition]; [NSThread sleepForTimeInterval:0.01]; [Konashi i2cReadRequest:length address:DeviceAddress]; [NSThread sleepForTimeInterval:0.01]; receivedData = [Konashi i2cReadData]; [NSThread sleepForTimeInterval:0.01]; [Konashi i2cStopCondition]; return receivedData; }
コンパスデータの読み込み
- (void)read { NSData *data = [self receive:6]; unsigned char bytes[6]; [data getBytes:bytes length:6]; // Data Registerから6バイト読み込み int16_t x = (bytes[0] << 8) | bytes[1]; // MSB << 8 | LSB int16_t y = (bytes[2] << 8) | bytes[3]; // MSB << 8 | LSB int16_t z = (bytes[4] << 8) | bytes[5]; // MSB << 8 | LSB }
HMC5883Lの設定
- (void)configSensor { unsigned char data[7]; data[0] = RegisterAddressA; // 0x00 Configuration Register A data[1] = RegisterConfDataA; // Conf. Register Aの内容 data[2] = RegisterAddressB; // 0x01 Configuration Register B data[3] = RegisterConfDataB; // Conf. Register Bの内容 data[4] = ModeAddress; // 0x03 Mode Register data[5] = ModeIdle; // 0b0000011 NSData *nsdata = [NSData dataWithBytes:data length:6]; [self send:nsdata]; [NSThread sleepForTimeInterval:0.5]; }
ディスカッション
コメントはまだありません。