クリエイター手抜きプロジェクト[582]IoT M5 Stack編 パソコンと接続してシリアル通信(UART)
── 古籏一浩 ──

投稿:  著者:



今回は、M5 Stackとパソコンを接続して、シリアル通信を行ってみます。シリアル通信なので、特にパソコンでなくてもやりとりが可能です。ここではMacとM5 Stackを使ってシリアル通信を行います。

シリアル通信を行う前に必要なものがあります。まず、シリアル通信を行うためのモジュールです。また、USBケーブルやジャンパーピンなどが必要になります。

他にもドライバー等をインストールし、さらにCooltermなどのシリアル通信を行うためのアプリケーションも、インストールする必要があります。昔のパソコンやIoT機器だと簡単ですが、最近のパソコンではシリアル通信は扱うためのハードルが多少高くなってます。





都合のいいことに、シリアル通信を行うための手順が、以下のページに用意されています。これはScracth 3とIchigoJamを接続するためのものですが、USBシリアルモジュールまで接続できれば、あとはシリアル通信可能なアプリケーションをインストールするだけです。

https://sije.shizentai.jp/


シリアル通信をおこなうアプリケーションとして、CoolTermがあります。Mac、Windows、UNIX版が用意されており、以下のページからダウンロードできます。なお、macOSの場合、セキュリティの関係で、実行を許可しないと動作しませんので注意してください。

http://freeware.the-meiers.org/


次に、M5 Stackとパソコンをシリアルケーブルで接続します。M5 Stack GOには、シリアル接続するためのコネクタとコードが用意されています。付属の説明書にあるように、PORT Cに接続します。

ケーブルの線の色でGND, TXDなどがわかるようになっています。シリアルモジュールとM5 StackのPORT Cを以下のように接続します。

パソコン側 M5 Stack側
GND    GND(黒色の線)
5V     5V (赤色の線)
TXD    RXD(白色の線)
RXD    TXD(黄色の線)

もし、この接続でうまく通信できない場合は、TXDとRXDを入れ替えて接続してみてください。

次に、CoolTermなどシリアル通信を行うアプリケーションを起動します。通信速度を115200に設定します。改行コードなどは設定しなくても通信できます。特に指定しない限り、M5 Stackから送られる改行コードは\r\nです。これで準備完了です。

それではブロックを使って、シリアル通信をしてみましょう。まずは、パソコンから送られたデータを受信してみます。ただし、ブロックの機能の関係で、受信した文字コードのみの表示としています。

受信したデータは、ラベルに表示することにします。最初にラベルをドラッグ&ドロップして、画面上に配置します。名前はlabel0です。特に何も指定しなければ、この名前になります。

次に、「高度なブロック」のカテゴリをクリックします。その中に「UART」というカテゴリがあります。これがシリアル通信のカテゴリになります。

最初に通信速度などの設定を行います。[UART [uart] tx[17] rx[16] ボーレート[9600]]のブロックをクリックして配置します。[ Setup ]ブロックの下にくっつけます。

通信速度は115200など、通信するアプリケーションと同じになるようにしてください。ここでは通信速度は115200としています。通信ポートであるtx, rxの数値は変更する必要はありません。

次に「イベント」のカテゴリから[ くりかえし ]ブロックを配置します。その中に「ロジック」ブロックから[ もし ... do ]ブロックがあるので、[ くりかえし ]ブロックの中に入れます。

条件の部分には、「UART」カテゴリにある[ read uart available [uart] ]ブロックを指定します。これは、データが送られてきたかどうかを判別するものです。

データを受信するブロックは、「UART」カテゴリにある[ UART [uart] [10] 文字読み込み]になります。この読み込む文字数は10でなく1にしておきます。

実はこのままでは期待通りに文字が表示されません。必要な文字だけ抜き出す必要があります。このため、「テキスト」のカテゴリにある[ テキスト [ ]の、以下の数字番目の文字:[ ]]ブロックを使います。抜き出す数字番目には0を指定します。

Pythonのコードだと以下のようになります。

--------------------------------------------------------------------------
from m5stack import *
from m5ui import *
clear_bg(0x000000)
btnA = M5Button(name="ButtonA", text="ButtonA", visibility=False)
btnB = M5Button(name="ButtonB", text="ButtonB", visibility=False)
btnC = M5Button(name="ButtonC", text="ButtonC", visibility=False)
label0 = M5TextBox(0, 10, "Text", lcd.FONT_Default, 0xFFFFFF)
uart = None
uart = machine.UART(1, tx=17, rx=16)
uart.init(115200, bits=8, parity=None, stop=1)
while True:
if uart.any():
label0.setText(str((uart.read(1))[-1]))
wait(0.001)
--------------------------------------------------------------------------

実行したらパソコン側で何か文字を送ってみてください。押された文字の文字コードが、M5 Stackの画面に表示されます。本当は文字を表示したいところですが、ブロックの制約上できません(開発環境のUI.Flowは進化が早いので、この文章を読んでいる頃には解決しているかもしれません)。

それでは次に、M5 Stackからパソコンにデータを送ってみましょう。受信の時と同じく、通信速度などを設定するブロックを配置します。

ここでは無限にM5 Stack!という文字を3秒ごとに送信します。「UART」のカテゴリから[ write a line " " in uart ]ブロックを配置します。空欄になっている文字部分にM5 Stack!の文字を入力します。

「タイマー」のカテゴリから[[1] 秒間停止]のブロックを配置し、秒数を3に変更します。

Pythonのコードだと以下のようになります。

--------------------------------------------------------------------------
from m5stack import *
from m5ui import *
clear_bg(0x000000)
btnA = M5Button(name="ButtonA", text="ButtonA", visibility=False)
btnB = M5Button(name="ButtonB", text="ButtonB", visibility=False)
btnC = M5Button(name="ButtonC", text="ButtonC", visibility=False)
label0 = M5TextBox(0, 10, "Text", lcd.FONT_Default, 0xFFFFFF)
uart = None
uart = machine.UART(1, tx=17, rx=16)
uart.init(115200, bits=8, parity=None, stop=1)
while True:
uart.write('M5 Stack!\r\n')
wait(3)
wait(0.001)
--------------------------------------------------------------------------

実行するとM5 Stackからパソコンに文字が送信されます。

せっかくM5 Stackからデータが送信できるのですから、センサーの値を取得してパソコンに送りたくなります。ただ、ブロックの機能の関係で、すんなりとセンサーの値を送ることができません。

仕方ないので、ブロックではなくPythonで書くことになります。以下のプログラムは、ジャイロセンサー3軸の値をパソコンに送信します。

--------------------------------------------------------------------------
from m5stack import *
from m5ui import *
from mpu6050 import MPU6050
import i2c_bus
clear_bg(0x000000)
imu = MPU6050(i2c_bus.get(i2c_bus.M_BUS))
uart = None
uart = machine.UART(1, tx=17, rx=16)
uart.init(115200, bits=8, parity=None, stop=1)
while True:
uart.write(str(imu.acceleration[0]))
uart.write(',')
uart.write(str(imu.acceleration[1]))
uart.write(',')
uart.write(str(imu.acceleration[2]))
uart.write('\r\n')
wait(1)
--------------------------------------------------------------------------


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/


なんにせよ3巻だったかでブツ切れになっていた、キャプテンハーロックのマゾーン編が終わった。ああなるほど、そういう具合につなぐのね〜という感じ。ハーロックは映画も見たけど、TV版の無限軌道SSXが一番よかった気がする。

・キャプテンハーロック 次元航海(10)最終巻
https://www.amazon.co.jp/dp/4253237304/


・InDesign自動化サンプルプログラム逆引きリファレンス上/下
https://www.amazon.co.jp/dp/4844396846/

https://www.amazon.co.jp/dp/4844396854/


・創って学ぼうプログラミング
https://news.mynavi.jp/series/makeprogram


・みんなのIchigoLatte入門 JavaScriptで楽しむゲーム作りと電子工作
https://www.amazon.co.jp/dp/4865940936

[正誤表]
http://www.openspc2.org/book/error/ichigoLatte/


・After Effects自動化サンプルプログラム 上巻、下巻
https://www.amazon.co.jp/dp/4844397591

https://www.amazon.co.jp/dp/4844397605


・IchigoLatteでIoT体験
https://www.amazon.co.jp/dp/B06X3X1CHP

http://digiconcart.com/dccartstore/cart/info/2561/218591


・みんなのIchigoJam入門 BASICで楽しむゲーム作りと電子工作
http://www.amazon.co.jp/dp/4865940332/


・Photoshop自動化基本編
http://www.amazon.co.jp/dp/B00W952JQW/


・Illustrator自動化基本編
http://www.amazon.co.jp/dp/B00R5MZ1PA/


・4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/


・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/