今回は、ラズパイとM5Stackを、GPIOで繋ぎ、シリアルで通信する方法を紹介します。
この記事で解決できること
この記事を読むことで、以下ができるようになります。
・M5Stackで、GPIOで、シリアル通信を送受信する方法
・Raspberry Piで、GPIOで、シリアル通信を送受信する方法
今回、作るアプリ
・M5Stackのボタンを押すと、RaspberryPiのコンソールに、”Hello”が表示される
・Raspberry Piのコンソール上で、文字を入力すると、M5Stack画面に一文字ずつ表示される
準備
・M5Stack (この記事では、M5GOを使いました)
・Raspberry Pi (この記事では、Raspberry Pi4を使いました)
\ キーボード一体型のラズパイがおすすめです。モニターとつなげるだけです /
構成
ラズパイとM5Stackをケーブルでつなぐ
M5Stack側
M5GOの場合
M5GOでは、ポートCを使用します。ポートCは、UARTとして使用できます。
ラズパイ側
シリアル通信は、GPIO14(TXD)、GPIO15(RXD)を使用します。
TXDが送信側で、RXDが受信側です。
M5Stackとラズパイのつなぎ方
M5Stackとラズパイは、以下の通りにつなぎます。
ラズパイのGPIO : M5StackのポートC
Pin10:GPIO15(RXD) ――――――― TXD
Pin8:GPIO14(TXD) ―――――――― RXD
Pin6:Ground ―――――――――――― GND
M5Stack側の設定
ArduinoIDEを立ち上げて、以下のサンプルコードをコピーしてください。
サンプルコード
#include <M5Stack.h>
void setup() {
M5.begin();
M5.Power.begin();
Serial.begin(115200);
// 画面初期設定
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextSize(2);
M5.Lcd.println("START");
// シリアル通信機能の設定
// Serial2.begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert)
Serial2.begin(115200, SERIAL_8N1, 16, 17);
}
void loop() {
M5.update(); // update button state
// シリアル通信を受信したときの処理
if(Serial2.available()) {
M5.Lcd.print("Recived : ");
// 受信データを取得
char ch = Serial2.read();
// 受信データをラズパイ側へそのまま送信
Serial2.write(ch);
M5.Lcd.println(ch);
}else{
M5.Lcd.setCursor(0, 60);
}
// ボタンAが押された時の処理
if (M5.BtnA.wasPressed()) {
M5.Lcd.setCursor(0, 10);
M5.Lcd.print("Transmitted : hello");
// "Hello"をラズパイへ送信する
Serial2.write("hello");
}else{
}
}
コンパイル後、M5Stackへのダウンロードすると、
M5Stack画面に”START”と表示がでます。
ラズパイ側の設定
ラズパイのコンソールを開いて、以下のコマンドを入力します。
> sudo nano app.py
app.pyの編集画面が出てきます。以下のサンプルコードをコピーして貼り付けます。
サンプルコード
import serial
import time
import concurrent.futures
ser = serial.Serial('/dev/serial0', 115200, timeout = 1.0)
def func1():
while True:
line = ser.readline()
if(line.decode('utf-8') != ""):
# バイト型末端の改行文字を除外して、文字列変数に変換
print(line.strip().decode('utf-8'))
def func2():
while True:
flag=bytes(input(),'utf-8')
#シリアル通信で文字を送信する際は, byte文字列に変換する
#input()する際の文字列はutf-8
ser.write(flag)
#シリアル通信:送信
if(flag==bytes('z','utf-8')):
break;
time.sleep(1)
ser.close()
if __name__ == "__main__":
executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)
executor.submit(func1)
executor.submit(func2)
「CTRL」+「o」で、ファイルへの保存
「CTRL」+「x」で、ファイル編集の終了
動かし方
M5Stack
「スケッチ」-「マイコンボードへ書き込む」で、コンパイルしてM5Stackへダウンロードします。
画面に、STARTが表示されれば、OKです。
ボタンAを押すと、ラズパイへ”Hello”が送信されます。
ラズパイのコンソールに、任意の英数字を入力してEnterを押すと、M5Stack画面に、一文字ずつ表示されます。
Raspberry Pi
コンソールに、以下のコマンドを入力します。
> python3 app.py
コンソールで、任意の英数字を入力すると、M5Stackへ送信されます。
M5Stackのボタンを押すと、コンソール上に”hello”が表示されます。
まとめ
ラズパイとM5Stackをシリアル通信でつないで、それぞれからデータを送受信する方法を紹介しました。
\ キーボード一体型のラズパイがおすすめです。モニターとつなげるだけです /
コメント