前回に引き続き、今回も9軸センサを扱います。前回は9軸センサの値をwait()関数を使って、読み取っていましたが、今回は、タイマ割り込みを使って、他の動作をしていても確実に一定の周期でセンサの値を読み取れるようにします。
回路は前回と一緒です。プログラムはタイマ割り込み部分を加えたの少し変更してあります。
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 50 51 52 53 54 |
#include "mbed.h" #define addr1 (0x6b<<1) //LSM9DS0のジャイロのスレーブアドレス #define addr2 (0x1d<<1) //LSM9DS0の加速度・磁気のスレーブアドレス I2C i2c(p28, p27); // sda, scl Serial pc(USBTX, USBRX); Ticker timer; 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)); } void time() { 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)); } int main() { timer.attach(&time, 0.5); while(1){} } |
TeraTerm及びmbedを起動すると、0.5秒間隔で、読み取ったセンサの値が表示されます。