M5StickCで計測した加速度データをUSBを経由してPCでロギングする実験をしたので記事にしてみました。
PCロギングは、3種類の方法を紹介します。
1つ目はターミナルソフト TeraTermを使ったロギング。2つ目はArduino IDEのシリアルモニタ、シリアルプロッタを使ったロギング。3つ目はPythonでのロギングです。
この記事はこんな人におすすめ!
- M5Stack/M5Stickのシリアル通信方法を学びたい人
- M5Stack/M5StickCとPC間をUSB経由でデータ通信したい人
- M5Stack/M5StickCが取得したデータをPCでロギングする方法を学びたい人
この記事のゴールはこちら▼
それでは始めていきましょう!
準備するもの
- M5Stack or M5StickC (今回はM5StickC Plusを使用しています)
- USBケーブル
- PC
- Tera Term
- Arduino IDE
- Python開発環境
通信方法
M5StickC側からデータ送信する方法
加速度データを送信するM5StickC側のサンプルプログラムを以下に示します。
#include <M5StickCPlus.h>
float x, y, z; // 加速度データを格納
bool isSend = false; // データ送信フラグ
void setup() {
M5.begin();
M5.IMU.Init();
Serial.begin(57600);
M5.Lcd.setRotation(3);
M5.Lcd.setCursor(0,0,4);
M5.Lcd.println("Not Send");
}
void loop() {
M5.update();
if(M5.BtnA.wasPressed()){
isSend = !isSend;
if(isSend){
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0,0,4);
M5.Lcd.println("Send");
}
else{
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0,0,4);
M5.Lcd.println("Not Send");
}
}
if(isSend){
// 加速度データ取得
M5.IMU.getAccelData(&x, &y, &z);
// 加速度データを送信
Serial.printf("%5.3f,%5.3f,%5.3f\n", x, y, z);
}
delay(200);
}
シリアル通信によるデータ送信方法はとても簡単です。
まず、Serial.begin()関数を呼び出し、シリアル通信のデータ転送速度を設定します。単位は「bps(ビット/秒)」です。
データを送信するには、Serial.printf()の引数に送信したいデータを指定するだけです。
PC側でデータを受信する方法
Tera Termを使ったデータ受信
ターミナルソフト「Tera Term」でデータ受信する方法について解説します。
Tera Termを起動したらTCP/IP、シリアルが選択できますので、シリアルを選択しましょう。
次に「設定」から「シリアルポート」を選択し、スピードをM5StickCで設定した値にします。今回のサンプルプログラムでは、57600[bps」です。
続いて改行コードの設定です。M5StickCは、改行を「\n」で指定しています。そのため、「設定」から「端末」を選択し、改行コードを「LF」に変更します。
これでTera Termの設定は完了です。M5StickのAボタン(M5と彫られたボタン)を押しましょう。
0.2秒ごとに加速度センサのデータを受信することが出来ます。
Arduino IDEのシリアルモニタ、シリアルプロッタを使ったデータ受信
Arduino IDEにもシリアル通信する機能があります。シリアルモニタとシリアルプロッタです。
まずシリアルモニタについての解説です。
Arduino IDEを起動し、「ツール」から「シリアルモニタ」を選択して下さい。
M5StickCのAボタンを押すと、Tera Termのときと同様に加速度センサのデータを受信することが出来ます。
次にシリアルプロッタです。シリアルプロッタは受信したデータを時系列で表示することが出来ます。
「ツール」から「シリアルプロッタ」を選択して下さい。
M5StickCのAボタンを押すと、受信したデータが時系列で表示されていきます。
簡易的な機能なので、縦軸などの変更は出来ないようです。
Pythonを使ったデータ受信
Pythonを使ったデータ受信は、プログラムを書く必要がありますが、プログラム次第でどんな表示も出来ます。今回は、TeraTerm、Arduino IDEのシリアルモニタと同様、受信データを順に表示するようにしました。
Pythonには、シリアル通信を簡単に実装することが出来る「pySerial」モジュールがありますので、これを使いました。
import serial
import time
ser = serial.Serial("COM4", 57600, timeout=0.1)
time.sleep(2)
try:
while True:
if ser.in_waiting > 0: # シリアル通信 受信待ち
bytes = ser.readline()
result, buf = bytes.decode('utf-8').split('\n')
data = list(map(float, result.split(',')))
print("AccX: {0}, AccY: {1}, AccZ: {2}".format(data[0], data[1], data[2]))
time.sleep(0.2)
except KeyboardInterrupt:
pass
print('program end')
ser.close()
まず、serial.Serialクラスを呼び出します。第1引数にはCOMポート番号、第2引数にはデータ転送速度を設定します。
データを受信したときのみターミナル表示にしたかったので、if文の条件としてser.in_waitingが0より大きいときにしました。ser.in_waitingは受信データのバイト数を戻り値として返します。
無限ループを避けるため、「ctrl + c」でプログラムを終了するようにしました。
M5StickCのAボタンを押すと、ターミナル上に加速度データが表示されていきます。
まとめ
M5StickCで計測した加速度データをUSBを経由してPCでロギングする方法について、TeraTermを使ったロギング、Arduino IDEのシリアルモニタ、シリアルプロッタを使ったロギング、Pythonでのロギングを例に挙げて解説しました。
TeraTerm、Arduino IDEはプログラムを書く必要が無く、手軽にデータロギングすることが出来ます。
一方、Pythonは自分でプログラムを書く必要がありますが、matplotlibなどのグラフ描画ライブラリを使ってグラフ化したり、csvにデータを書き出すなど応用が効くと思います。
以上、今回の記事が皆さんの参考になりましたら幸いです。