見出し画像

M5StickC-Plusのシリアル出力をPythonで受信する

こんにちは、ロック204チャンネルです。
今回の動画では、「M5StickC-Plussのシリアル出力をPythonで受信する」といったタイトルでお送りします。
この動画では、前回の「M5StickC-PlusのUARTを使用してみる」の続編となります。

前回の動画では、こちらに示す装置を使用し可変抵抗よりの電圧変化をM5スティックcプラスで測定し
結果をUART機能を使ってパソコンに送信するプログラムを紹介しました。
今回もこの装置を使用します。

こちらは、M5Stickに配置したUiFlowで作成したプログラムの前半となります。
詳細は「M5StickC-PlusのUARTを使用してみる」の動画をご参照ください。

こちらはプログラムの後半となります。(今回は「uart1
に"OutPut to UART"を1行書き出す」を「uart1
に"Start"を1行書き出す」に変更、「50回繰り返す」を「100回繰り返す」に変更して実行しました。)

今回紹介するのはM5Stickよりのシリアル出力をUSBケーブルを通したWindows PCに受信しPC上のpythonプログラムによってグラフ化するプログラムを紹介します。

プログラムはVS Codeを使用し作成しました。
最初にシリアル通信に使用するモジュール「serial」とグラフ化するためのモジュール「matplotlib」をインポートします。
そして5行に示すようにserialモジュールを使用し、シリアル通信のポート番号ここでは「COM4」と通信速度9600 bpsを設定します。
またタイムアウトを5秒として設定しました。
このポート番号はパソコンの状況によって変わりますのでコントロールパネルのデバイスマネージャーなどで確認してください。

次にグラフの準備をします。
Plt.ion()で描画モードをインターラクティブモードとします。
これはプロットした時にリアルタイムにプロットできるようにするための設定です。
そしてx軸のラベルをno
y軸のラベルをad_valueとして設定します。

このスライド以降がwhileループとなります。
14行で変数データにシリアル通信の受信データを一行取り込みます。
このデータの中には、データ番号noとAD変換された値ad_valueがふくまれています。
またデータの開始時が”Start”,終わりが”END”の文字がふくまれています。
16行のif文はデータの終わりに”END”を受信した場合に、ループを抜け出すbreak命令を配置しています。

20行のif文では、データーに”Start”という文字が含まれていた場合の処理です。
ここでは”Start”はAD変換データではないのでno=0,ad_value=Noneに設定し
コンソール出力として”Read Start!”と表示します。
またx軸,y軸の表示範囲を24行25行で設定しています。
それ以外の場合、つまりAD変換データであった場合の処理が27行から29行にわたって記述しています。
27行では、データをカンマで区切ってread_dataにリストとして格納します。
つまりリストの最初の要素としてno、次の要素としてad_valueをリストに格納します。
28行は、変数noにread_dataの最初の要素を整数変換し格納します。
また29行ではad_valueにread_dataの一番目の要素を整数変換して代入します。

32行のif文では、条件として変数ad_valueの内容が存在する場合を設定し
32行で条件が成立した場合、x軸のデータをno、y軸のデータをad_value、マーカーの色をブルーでグラフデータとして設定します。
そして36行でグラフにプロットします。
37行では、0.01秒時間を置き次の処理に移行します。
40行41行はwhile文外の記述でグラフの処理を終了します。
以上でpythonプログラムの説明を終わります。
それでは実行状況を見て行きましょう。

プログラムの実行状態

import serial
import matplotlib.pyplot as plt

# シリアルポートを開く
ser = serial.Serial("COM4", 9600, timeout=5)

# グラフの準備
plt.ion() #インターラクティヴモードon
plt.xlabel("no")
plt.ylabel("ad_value")

# データの受信
while True:
    data = ser.readline().decode("utf-8")
    #print(data)
    if data[:3] == "END":
        break
    
    # データの分解
    if data[:5] == "Start":
        no = 0
        ad_value = None
        print('Read Start!')
        plt.xlim(0,100) #x軸の範囲を設定
        plt.ylim(0,3000)
    else:
        read_data = data.split(",") #","で分割
        no=int(read_data[0]) #read_dataの0番目の要素を取得
        ad_value=int(read_data[1])

    # グラフに追加
    if ad_value is not None:
        plt.plot([no], [ad_value],color="blue",marker="o", markeredgewidth=0)
        #マーカー(丸印: o)、枠線なしで出力
    # 画面の更新
    plt.draw()
    plt.pause(0.01)

# グラフの終了
plt.ioff()
plt.show()


この記事が気に入ったらサポートをしてみませんか?