Raspberry Pi(ラズパイ)とM5Stackを、GPIOで接続し、シリアル(UART)通信する方法

M5Stack

今回は、ラズパイと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が受信側です。

ラズパイのGPIOピン配置
Raspberry Pi Documentation - Raspberry Pi OS
The official documentation for Raspberry Pi computers and microcontrollers

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”が表示されます。

\ つながり応援 PCMAX 無料会員登録 /

まとめ

ラズパイとM5Stackをシリアル通信でつないで、それぞれからデータを送受信する方法を紹介しました。

\ キーボード一体型のラズパイがおすすめです。モニターとつなげるだけです /

参考

コメント

タイトルとURLをコピーしました