chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

9DoFのセンサーをNUCLEO経由でPCに転送できた

Rustで書いた9DoF(ST社のLSM9DS1)の制御プログラムをNUCLEO-L476RG上で動かし、USB-Serial経由でPCに送信している。PC側はPythonのデータダンプツールを作って、9DoFから得られたジャイロと加速度センサの値を随時更新するようにした。実際の値は以下
この値は、LSM9DS1のレジスタ設定はデフォルトで、動作ONにしただけの状態。だから、、値域とか分能度とか、さらに調整が必要。

-----------------------------------------------------------------------
 ジャイロ    加速度     レジスタ値(ジャイロ)    (加速度)
-----------------------------------------------------------------------
-35 67 67   306 -1146 15855    G:DD FF 43 00 FF 00  X:32 01 86 FB EF 3D 
-29 72 72   375 -1087 15790    G:E3 FF 48 00 09 00  X:77 01 C1 FB AE 3D 
-27 63 63   157 -1186 15819    G:E5 FF 3F 00 0A 00  X:9D 00 5E FB CB 3D 
-49 73 73   390 -1140 15830    G:CF FF 49 00 00 FF  X:86 01 8C FB D6 3D 
-31 57 57   312 -1138 15830    G:E1 FF 39 00 12 00  X:38 01 8E FB D6 3D 
-36 65 65   220 -1123 15836    G:DC FF 41 00 04 00  X:DC 00 9D FB DC 3D 
-32 71 71   329 -1159 16003    G:E0 FF 47 00 14 00  X:49 01 79 FB 83 3E 
-13 70 70   300 -1108 15749    G:F3 FF 46 00 1B 00  X:2C 01 AC FB 85 3D 
-----------------------------------------------------------------------

センサパラメータを調整するとして、次は、このデータを視覚化したい。本当はUnity等を使って、リアルタイムでセンサの傾きを3Dで描画できたらいいのだけど、Unityよくわかっていないし、動かすまでが手間なので、、最低限の傾き計算をPython+GUIで表示させる予定

センサー制御はジャイロと加速度を動かすための最低限の設定だけを実施(Rustのソース)

const CTRL_REG1_G:u8 = 0x10;
const CTRL_REG6_XL:u8 = 0x20;

#[no_mangle]
#[entry]
fn main() ->! {

  driver::gpio_setup();
  driver::serial_setup();
  driver::i2c_setup();
  let i2c_addr = 0x6a;

  driver::i2c_write_reg(i2c_addr, CTRL_REG1_G, 0x80);
  driver::i2c_write_reg(i2c_addr, CTRL_REG6_XL, 0x80);

9DoFセンサーからの値取得+Serial出力ルーチン

fn sensor_reg_gylo(i2c_addr:u8){

  driver::serial_putc(b'G'); 
  driver::serial_putc(b':'); 
  for offset in 0..6 {
     let addr = 0x18 + offset;
     let val = driver::i2c_read_reg(i2c_addr, addr);
     driver::serial_puthex(val);          
     driver::serial_putc(b' '); 
  }
}

fn sensor_reg_accel(i2c_addr:u8){

  driver::serial_putc(b'X'); 
  driver::serial_putc(b':'); 
  for offset in 0..6 {
     let addr = 0x28 + offset;
     let val = driver::i2c_read_reg(i2c_addr, addr);
     driver::serial_puthex(val);          
     driver::serial_putc(b' '); 
  }
}