//
表示中
モノづくり, Computer - コンピューター, Electronics - 電子工作

KonashiとHMC5883L3軸磁気コンパスを接続する


電子部品が足りないので前回の続きをやるのは部品が届くまでの我慢です。

今日はKonashi(Bluetooth LEモジュール)とHMC5883L(3軸磁気コンパスセンサー)を接続して、iPhoneでセンサーが取得した値を表示する実験です。このセンサーは海外でも使っている人が多く、HMC5883Lで検索すると参考になるページがいくつもヒットします。

2016-03-13 17.54.52

KonashiとHMC5883Lの接続は次の通りです。

Konashi HMC588CL
 +3V  VDD
 GND  GND
 SDA  SDA
 SCL  SCL

これが実行結果です。面白くないですね。

2016-03-13 17.55.07

まだ少し計算のおかしいところがあるのでソースは載せませんが、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];
}

kazz12211 について

Working as a OO programmer and enjoying music, bicycle and photography.

ディスカッション

コメントはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

評価

ブログ統計

  • 562,089 ヒット

カテゴリー

アーカイブ

カレンダー

2016年3月
« 2月   4月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  
%d人のブロガーが「いいね」をつけました。