見出し画像

Arduino UNO R4 でR3のプログラムを使うときの注意点・対処方法

変数の型名

マイコンの仕様に関連して型名が示すサイズが異なるのがINT型です。
Arduino UNO R3までは8bitマイコンのATmega328でしたが、R4は32bitマイコンのArm Cortex-M4です。
R3以前のプログラムで "INT型が2BYTEであることを前提"としたプログラムはINT型が4BYTEであるR4では正しく動作しません

問題が起こる場合の実例

int Get_GZ()
{
Wire.beginTransmission(0x68);
Wire.write(0x47);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 2);
while (Wire.available() < 2);
int GZ = Wire.read() << 8 | Wire.read(); // 0x47
return GZ;
}
これは、IIC6軸センサーのジャイロZ軸の値を得る関数です。
センサーのデータレジスタには上位、下位の1BYTEづつ格納されているので、それぞれ呼び出し、INT型に格納して符号付き2BYTEのデータとして扱います。
R3の符号付INT型はbit15が符号を表します。
しかし、INT型が4BITEのR4ではbit31が符号を表すので正しい値になりません。
このようなプログラムはビルトエラーもなくダウンロード・実行ができますが、期待する値が得られない問題を発生します。

対処方法
対処方法はとても簡単で、ローカル変数宣言 ”int GZ””int16_t GZ”に変更するだけです。

int Get_GZ()
{
Wire.beginTransmission(0x68);
Wire.write(0x47);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 2);
while (Wire.available() < 2);
int16_t GZ = Wire.read() << 8 | Wire.read(); // 0x47
return GZ;
}

これで正しくジャイロセンサーZ軸の値が得られました。

いつもサポートありがとうございます!いただいたサポートは新しい記事の糧となります。 製作記事は部品購入が必要ですので大変助かります!