M5StickCの取得データをUSBシリアル通信でPCロギング

M5StickCで計測した加速度データをUSBを経由してPCでロギングする実験をしたので記事にしてみました。

PCロギングは、3種類の方法を紹介します。

1つ目はターミナルソフト TeraTermを使ったロギング。2つ目はArduino IDEのシリアルモニタ、シリアルプロッタを使ったロギング。3つ目はPythonでのロギングです。

この記事はこんな人におすすめ!

  • M5Stack/M5Stickのシリアル通信方法を学びたい人
  • M5Stack/M5StickCとPC間をUSB経由でデータ通信したい人
  • M5Stack/M5StickCが取得したデータをPCでロギングする方法を学びたい人

この記事のゴールはこちら▼

Arduino IDE シリアルプロッタを用いた加速度データのロギング

それでは始めていきましょう!

目次

準備するもの

  • 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」に変更します。

「LF」は、Line Feedの略で、「\n」で改行となります。

これで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にデータを書き出すなど応用が効くと思います。

以上、今回の記事が皆さんの参考になりましたら幸いです。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

大学で機械工学を学んだ後、製造業で働く40代の会社員です。
IT系、電気系を学んでこなかった機械系人間が、ゲーム制作、電子工作に奮闘してます。
極力低コストでものづくりを楽しむのがモットー。

目次