M5StickC
前回、M5StickCのスケッチ例Displayをみて、M5.Lcd.drawRect、M5.Lcd.fillRect、Lcd.drawCircle、M5.Lcd.fillCircle、M5.Lcd.drawTriangle、M5.Lcd.fillTriangle、M5.Lcd.drawLine、M5.Lcd.drawFastVLine、M5.Lcd.drawFastHLine、M5.Lcd.drawPixelといった図形の描写に関するコマンドを勉強しました。
今回は内蔵の加速度センサ、ジャイロセンサ、温度センサの使い方を学んでいこうと思います。
そこで参考にするスケッチ例が「ファイル > スケッチ例 > M5StickC > Basic > IMU」です。
この「IMU」という名前ですが、「Inertial Measurement Unit」、日本語では慣性測定ユニットといいます。
このIMUは姿勢制御するためのセンサ類をまとめたユニットで目的によって搭載されるセンサが異なるようですが、M5StickCでは加速度センサ、ジャイロセンサ、温度センサが搭載されています。
それでは始めていきましょう。
プログラム全体
まずはプログラム全体を見てみましょう。
/*
*******************************************************************************
* Copyright (c) 2021 by M5Stack
* Equipped with M5StickC sample source code
* 配套 M5StickC 示例源代码
* Visit the website for more information:https://docs.m5stack.com/en/core/m5stickc
* 获取更多资料请访问:https://docs.m5stack.com/zh_CN/core/m5stickc
*
* describe: IMU.
* date:2021/9/3
*******************************************************************************
*/
#include <M5StickC.h>
float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;
float gyroX = 0.0F;
float gyroY = 0.0F;
float gyroZ = 0.0F;
float pitch = 0.0F;
float roll = 0.0F;
float yaw = 0.0F;
/* After M5StickC is started or reset
the program in the setUp () function will be run, and this part will only be run once.
在 M5StickC 启动或者复位后,即会开始执行setup()函数中的程序,该部分只会执行一次。 */
void setup() {
M5.begin();
M5.IMU.Init(); //Init IMU. 初始化IMU
M5.Lcd.setRotation(3);
M5.Lcd.setCursor(40, 0);
M5.Lcd.println("IMU TEST");
M5.Lcd.setCursor(0, 10);
M5.Lcd.println(" X Y Z");
M5.Lcd.setCursor(0, 50);
M5.Lcd.println(" Pitch Roll Yaw");
}
/*****************************************
M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
M5.IMU.getAccelData(&accX,&accY,&accZ);
M5.IMU.getAhrsData(&pitch,&roll,&yaw);
M5.IMU.getTempData(&temp);
*****************************************/
/* After the program in setup() runs, it runs the program in loop()
The loop() function is an infinite loop in which the program runs repeatedly
在setup()函数中的程序执行完后,会接着执行loop()函数中的程序
loop()函数是一个死循环,其中的程序会不断的重复运行 */
void loop() {
float temp = 0;
M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
M5.IMU.getAccelData(&accX,&accY,&accZ);
M5.IMU.getAhrsData(&pitch,&roll,&yaw);
M5.IMU.getTempData(&temp);
M5.Lcd.setCursor(0, 20);
M5.Lcd.printf("%6.2f %6.2f %6.2f o/s\n", gyroX, gyroY, gyroZ);
M5.Lcd.printf(" %5.2f %5.2f %5.2f G\n\n\n\n", accX, accY, accZ);
M5.Lcd.printf(" %5.2f %5.2f %5.2f\n", pitch, roll, yaw);
M5.Lcd.printf("Temperature : %.2f C", temp);
delay(100);
}
これまでに勉強してきたコマンドが結構出ていますので、もし今回解説する以外のコマンドがわからない場合は、前の記事をご覧ください。
ちなみにこのスケッチをM5StickCに書き込むとこんな感じに動きます。
変数の定義
コマンドを見ていく前にこれまで出てきていない形での変数の定義が出てきているので、そこから勉強していきます。
float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;
float gyroX = 0.0F;
float gyroY = 0.0F;
float gyroZ = 0.0F;
float pitch = 0.0F;
float roll = 0.0F;
float yaw = 0.0F;
「float 変数名 = 値」は出てきましたが、数字の後ろに「F」が付いている表現はこれまでに出てきていません。
このように数字の後ろに「F」または「f」が付いている場合は、この値は「float型」を指定しているとのことです。
何故なら、小数は桁数は違うにせよfloat型としてもDouble型として取れることからです。
そのためもし数字の後ろに何もつけないと自動で「Double型」として扱われるようです。
この最後につける「F」のことを、浮動小数点接尾語と言うそうです。
M5.IMU.Init
「M5.IMU.Init」はM5StickCに内蔵されているセンサ全般の初期化をするためのコマンドです。
これによりM5StickC内蔵のセンサである加速度センサとジャイロセンサが使用可能な状態になります。
M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ)
「M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ)」はジャイロセンサの数値データの取得です。
得られたX軸、Y軸、Z軸のジャイロセンサの値はそれぞれ括弧内の「&gyroX,&gyroY,&gyroZ」の変数に格納されます。
値を取り出すときは「&」は抜いて、それぞれ「gyroX, gyroY, gyroZ」で取得できます(変数名を変更していない場合)。
つまりプログラム内ではこの部分です。
M5.Lcd.printf("%6.2f %6.2f %6.2f o/s\n", gyroX, gyroY, gyroZ);
ちなみに「%6.2f」は6桁の数で小数点2桁まで表示すると言うことらしいですが、詳しくは別の機会に勉強してみることにします。
M5.IMU.getAccelData(&accX,&accY,&accZ)
「M5.IMU.getAccelData(&accX,&accY,&accZ);」は加速度センサの値を取るコマンドです。
先ほどのジャイロセンサと同様に「&accX,&accY,&accZ」がそれぞれX軸、Y軸、Z軸の値の変数名で、取得するにはそれぞれ「accX, accY, accZ」を使います(変数名を変更していない場合)。
取得している部分はこちらです。
M5.Lcd.printf(" %5.2f %5.2f %5.2f G\n\n\n\n", accX, accY, accZ);
この場合は5桁の数値で小数点以下2桁まで表示するということでしょう。
M5.IMU.getAhrsData(&pitch,&roll,&yaw)
「M5.IMU.getAhrsData(&pitch,&roll,&yaw)」は回転角のデータを取得するためのコマンドです。
この回転角のデータは先ほどのジャイロセンサと加速度センサのデータを計算することで取得できるデータのようです。
そして軸の方向によって「ピッチ(前後方向)」、「ロール(左右方向)」「ヨー(上下方向)」と言うらしいです。
こちらの値もそれぞれ「pitch, roll, yaw」で取得できます(変数名を変更していない場合)。
M5.Lcd.printf(" %5.2f %5.2f %5.2f\n", pitch, roll, yaw);
M5.IMU.getTempData(&temp)
最後は温度センサです。
温度センサのデータの取得のコマンドは「M5.IMU.getTempData(&temp)」で値は「temp」で取得できます(変数名を変更していない場合)。
M5.Lcd.printf("Temperature : %.2f C", temp);
これでIMUセンサのデータの取得はできるようになりました。
思ったよりも簡単でほっとしましたが、外部のセンサ、つまりHATとして接続したセンサのデータの取得はどうなのでしょうか。
次回は前に使用したENV II HATのデータを取得する方法を勉強してみましょう。
ではでは今回はこんな感じで。
コメント