STM32資料 応用編2

I2C通信でセンサーのデータを読み取ってみよう

今回は前回のプログラムを使って求めた加速度を使って角度を簡単に求めてみよう

今回やること

前回のコードをそのまま使うのでプロジェクトは分けなくても大丈夫!

今回からは実際に自分でコードを書いてみよう(ヒントはいっぱいあるから頑張ってね)

作業の流れ

プログラム

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";

終わりに

今回は実際にセンサーデータを取得してみました

リンク

・メインページ