ロボットの移動方向、移動距離を算出するために、加速度センサ、ジャイロセンサ、磁気センサを使用します。今回は、それらが一体となった9軸センサをから、データを取得してみましょう。
I2C通信を使って、9軸センサの値を取得し、そのデータをシリアル通信を使って、PCに送信します。その後、受信した値をTera TermでPC上に表示します。
使用する9軸センサ:
ストロベリー・リナックス
・ LSM9DS0 9軸センサモジュール(3軸加速度+3軸ジャイロ+3軸コンパス)
以下のプログラムをコンパイルし、mbedフォルダに入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include "mbed.h" #define addr1 (0x6b<<1) //LSM9DS0のジャイロのスレーブアドレス #define addr2 (0x1d<<1) //LSM9DS0の加速度・磁気のスレーブアドレス I2C i2c(p28, p27); // sda, scl Serial pc(USBTX, USBRX); char cmd[2]; void i2c_write(int addr,char regist,char data) { cmd[0]=regist; cmd[1]=data; i2c.write(addr,cmd,2); } char i2c_read(int addr,char regist) { cmd[0]=regist; i2c.write(addr,cmd,1); i2c.read(addr,cmd,1); return cmd[0]; } int i2c_read_16bit(int addr,char registL,char registH) { return (int(i2c_read(addr,registH))<<8)+int(i2c_read(addr,registL)); } int main() { while(1){ i2c_write(addr1,0x20,0xff); pc.printf("GX:%d\n",i2c_read_16bit(addr1,0x28,0x29)); pc.printf("GY:%d\n",i2c_read_16bit(addr1,0x2a,0x2b)); pc.printf("GZ:%d\n",i2c_read_16bit(addr1,0x2c,0x2d)); i2c_write(addr2,0x20,0xa7); pc.printf("AX:%d\n",i2c_read_16bit(addr2,0x28,0x29)); pc.printf("AY:%d\n",i2c_read_16bit(addr2,0x2a,0x2b)); pc.printf("AZ:%d\n",i2c_read_16bit(addr2,0x2c,0x2d)); i2c_write(addr2,0x26,0x00); pc.printf("MX:%d\n",i2c_read_16bit(addr2,0x08,0x09)); pc.printf("MY:%d\n",i2c_read_16bit(addr2,0x0a,0x0b)); pc.printf("MZ:%d\n",i2c_read_16bit(addr2,0x0c,0x0d)); wait(0.5); } } |
回路図を参考に回路を製作してください。
回路図
外観
次に、Tera Termを起動し、mbedのリセットスイッチを押します。するとこのように、9軸センサの値が出力されます。
非常に見やすいプログラムでした
参考になりました。ありがとうございます