STM32資料 応用編2
I2C通信でセンサーのデータを読み取ってみよう
今回は前回のプログラムを使って求めた加速度を使って角度を簡単に求めてみよう
今回やること
前回のコードをそのまま使うのでプロジェクトは分けなくても大丈夫!
今回からは実際に自分でコードを書いてみよう(ヒントはいっぱいあるから頑張ってね)
作業の流れ
- ピンを割り当てる(前回と同じなので省略)
- wrapper.cppにコードを書き込む
- センサーとSTM32をつなぐ
- TeraTermでデータを受信する
プログラム
I2C通信で書き込みをする関数
前回は読み取りの関数を紹介したので、書き込みの関数を紹介する
関数
HAL_I2C_Mem_Write(&hi2cx, I2CADDR, REGISTER, REGLen, Data, DataLen, TimeOut);
この関数の引数
引数名 | 変数型 | 内容 |
---|---|---|
&hi2cx | I2C_HandleTypeDef* | I2Cのポインタ(xはI2Cの番号) |
I2CADDR | uint8_t | 送信相手のアドレス |
REGISTER | uint8_t | 書き込むレジスタアドレス |
REGLen | uint16_t | 書き込むレジスタの数 |
Data | uint8_t* | 書き込む値を入れるバッファー(ポインタ) |
DataLen | uint16_t | 書き込むデータの数 |
TimeOut | uint32_t | 最大実行時間(超えたら処理を諦める) |
データの処理について
センターから受信できるデータはuint8_t(8桁の2進数)であるため、0~255までの値しか表現できない
これだと表現できる値が少ないので、2つのレジスタに上8桁と下8桁を分割してデータが入っている
そのため、2つのレジスタから読み取った値を上8桁を8桁ずらして下8桁を足すことで元の16桁のデータとしている
書き方としては"<< 8"で8桁ずらし、2つのデータを"|"を使ってOR演算(足し算)する
AccelData[0] = (int16_t)(HighByte << 8 | LowByte)
前回紹介した受信のコードと合わせるとこのように書くことができる(引数の変数を定義して使ってね)
//センサーからデータを読み取り
//受信データの配列
uint8_t RawData[12] = {};
HAL_I2C_Mem_Read(&hi2c1, I2CADDR, ACEEL_DATA_X1_UI, 1, RawData, 12, 1000);
//取得データの処理
AccelData[0] = (int16_t)(RawData[0] | RawData[1] << 8);
AccelData[1] = (int16_t)(RawData[2] | RawData[3] << 8);
AccelData[2] = (int16_t)(RawData[4] | RawData[5] << 8);
GyroData[0] = (int16_t)(RawData[6] | RawData[7] << 8);
GyroData[1] = (int16_t)(RawData[8] | RawData[9] << 8);
GyroData[2] = (int16_t)(RawData[10] | RawData[11] << 8);
サンプルコード
実際にICM45686から値を取得するコードを書いてみよう
今回は最低限のレジスタ操作しかしないのでこの3つのみを設定すればよい
今回使用するレジスタ
WIA→ PWM_MGMT → ACEEL_DATA_X1_UIの順番で操作していこう
レジスタ名 | レジスタアドレス | 内容 | 値 |
---|---|---|---|
ACEEL_DATA_X1_UI | 0x00 | センターデータ(ここから12byteにAccelとGyroのデータがある) | 読み取り専用 |
PWR_MGMT | 0x10 | センサーの電源設定 | 書き込み(値: 0x0f) |
WIA | 0x72 | 通信チェック用 | 読み取り専用(0xE9が返ってくる) |
TeraTermへの送信はusart.hと"string"をインクルードしてこのコードで送ることができる
受信したデータが入っている変数がAccelDataとGyroDataになっているので必要に応じて変えてね
str = "AccelData: " + std::to_string(AccelData[0]) + std::to_string(AccelData[1]) + std::to_string(AccelData[2]) + "\n";
str = "GyroData: " + std::to_string(GyroData[0]) + std::to_string(GyroData[1]) + std::to_string(GyroData[2]) + "\n";
終わりに
今回は実際にセンサーデータを取得してみました