M5Stackとラズパイ間で、UDPを使って、データを送受信する方法

M5Stack

M5Stackとラズパイ間で、UDPを使って、データを送受信する方法を紹介します。

スポンサーリンク

前提

・M5Stack本体

・Raspberry Pi4

M5Stackとラズパイは、同じWi-Fiで繋がるようにします。

私は、M5Stack Fireを使ってます。

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

M5Stackとラズパイ間で、UDPを使って、データを送受信する方法

M5Stackとラズパイの両方にソフトを用意します。

サンプルコード(M5Stack)

ArduinoIDEを起動して、以下のサンプルコードをコピーしてください。

ソースコード内のssid、passwordは、自分のWi-Fiのものを設定してください。


#include <WiFi.h>
#include <WiFiUDP.h>
#include <M5Stack.h>

/////////////////////////////////////////////////
#define N 1024

const char* ssid     = "*******";  // Wi-Fiのssid
const char* password = "***********";  // Wi-Fiのパスワード

const int my_port = 5000;  //M5Stackのポート

const char *raspi_addr = "***.***.***.***";  //ラズパイのIPアドレス
const int raspi_port = 5001; //ラズパイのポート

WiFiUDP udp;

String  TxBuffer;

/////////////////////////////////////////////////

void setup_wifi(){

  // Wi-Fi接続開始を画面表示
  M5.Lcd.fillScreen(TFT_OLIVE);
  M5.Lcd.setCursor(3, 10);
  M5.Lcd.print("Connecting to ");
  M5.Lcd.println(ssid);

  // WiFi接続性改善のため、いったん切断
  WiFi.disconnect( true, true ); //WiFi OFF, eraseAP=true
  delay(500);
 
  // Wi-Fiモジュールの開始
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
 
  // 通信相手との接続待ち
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    M5.Lcd.print(".");
  }
 
  // Wi-Fi接続完了時の画面表示
  M5.Lcd.fillScreen(TFT_OLIVE);
  M5.Lcd.setCursor(3, 3);
  M5.Lcd.println("");
  M5.Lcd.println("WiFi connected.");

  // M5StackのIPアドレスを表示
  M5.Lcd.print("IP address: ");
  M5.Lcd.println(WiFi.localIP());
  M5.Lcd.print("Port: ");
  M5.Lcd.println(my_port);

  // UDP開始   
  udp.begin(my_port);
}

// データ送信
void Tx_Data(){

  // データ送信
  udp.beginPacket(raspi_addr, raspi_port);
  int i = 0;
  while( TxBuffer.length() > i){
    char temp = TxBuffer.charAt(i);
    udp.write(temp);
    i++;
  }
  udp.endPacket();

  M5.Lcd.setCursor(3, 100);
  M5.Lcd.print("                                ");  
  M5.Lcd.setCursor(3, 100);
  M5.Lcd.print(TxBuffer);  

}

// 送信タスク
void task0(void* arg){
  
  while (1) {
    M5.update();

    // ボタンに応じて、メッセージを変える
    if( M5.BtnA.wasPressed() == 1 ){
      TxBuffer = "botton_A";
      Tx_Data();
    }else if( M5.BtnB.wasPressed() == 1 ){
      TxBuffer = "botton_B";
      Tx_Data();
    }else if( M5.BtnC.wasPressed() == 1 ){
      TxBuffer = "botton_C";
      Tx_Data();
    }else{
      
    }
    delay(100);
  }
}

// 受信タスク
void task1(void* arg) {
  char packetBuffer[N];

  while (1) {
    int packetSize = udp.parsePacket();
   
    // UDPパケットの受信処理
    if (packetSize){
      int len = udp.read(packetBuffer, packetSize);
      if (len > 0){
        packetBuffer[len] = '

#include <WiFi.h>
#include <WiFiUDP.h>
#include <M5Stack.h>
/////////////////////////////////////////////////
#define N 1024
const char* ssid     = "*******";  // Wi-Fiのssid
const char* password = "***********";  // Wi-Fiのパスワード
const int my_port = 5000;  //M5Stackのポート
const char *raspi_addr = "***.***.***.***";  //ラズパイのIPアドレス
const int raspi_port = 5001; //ラズパイのポート
WiFiUDP udp;
String  TxBuffer;
/////////////////////////////////////////////////
void setup_wifi(){
// Wi-Fi接続開始を画面表示
M5.Lcd.fillScreen(TFT_OLIVE);
M5.Lcd.setCursor(3, 10);
M5.Lcd.print("Connecting to ");
M5.Lcd.println(ssid);
// WiFi接続性改善のため、いったん切断
WiFi.disconnect( true, true ); //WiFi OFF, eraseAP=true
delay(500);
// Wi-Fiモジュールの開始
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// 通信相手との接続待ち
while (WiFi.status() != WL_CONNECTED) {
delay(100);
M5.Lcd.print(".");
}
// Wi-Fi接続完了時の画面表示
M5.Lcd.fillScreen(TFT_OLIVE);
M5.Lcd.setCursor(3, 3);
M5.Lcd.println("");
M5.Lcd.println("WiFi connected.");
// M5StackのIPアドレスを表示
M5.Lcd.print("IP address: ");
M5.Lcd.println(WiFi.localIP());
M5.Lcd.print("Port: ");
M5.Lcd.println(my_port);
// UDP開始   
udp.begin(my_port);
}
// データ送信
void Tx_Data(){
// データ送信
udp.beginPacket(raspi_addr, raspi_port);
int i = 0;
while( TxBuffer.length() > i){
char temp = TxBuffer.charAt(i);
udp.write(temp);
i++;
}
udp.endPacket();
M5.Lcd.setCursor(3, 100);
M5.Lcd.print("                                ");  
M5.Lcd.setCursor(3, 100);
M5.Lcd.print(TxBuffer);  
}
// 送信タスク
void task0(void* arg){
while (1) {
M5.update();
// ボタンに応じて、メッセージを変える
if( M5.BtnA.wasPressed() == 1 ){
TxBuffer = "botton_A";
Tx_Data();
}else if( M5.BtnB.wasPressed() == 1 ){
TxBuffer = "botton_B";
Tx_Data();
}else if( M5.BtnC.wasPressed() == 1 ){
TxBuffer = "botton_C";
Tx_Data();
}else{
}
delay(100);
}
}
// 受信タスク
void task1(void* arg) {
char packetBuffer[N];
while (1) {
int packetSize = udp.parsePacket();
// UDPパケットの受信処理
if (packetSize){
int len = udp.read(packetBuffer, packetSize);
if (len > 0){
packetBuffer[len] = '\0'; // end
}
// UDPパケット受信時の画面表示
M5.Lcd.fillScreen(TFT_OLIVE);
M5.Lcd.setCursor(3, 3);
M5.Lcd.print("                                ");  
M5.Lcd.setCursor(3, 3);
M5.Lcd.println(packetBuffer);
}
}
}
void setup() {
M5.begin();
M5.Power.begin();
// 起動画面設定
M5.Lcd.fillScreen(TFT_NAVY);
M5.Lcd.setTextSize(2);
M5.Lcd.printf("START");
setup_wifi();
xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 1, NULL, 1);
}
void loop(){
}
'; // end } // UDPパケット受信時の画面表示 M5.Lcd.fillScreen(TFT_OLIVE); M5.Lcd.setCursor(3, 3); M5.Lcd.print(" "); M5.Lcd.setCursor(3, 3); M5.Lcd.println(packetBuffer); } } } void setup() { M5.begin(); M5.Power.begin(); // 起動画面設定 M5.Lcd.fillScreen(TFT_NAVY); M5.Lcd.setTextSize(2); M5.Lcd.printf("START"); setup_wifi(); xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0); xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 1, NULL, 1); } void loop(){ }

上記サンプルコードをM5Stackに書き込むと、Wi-Fiへの接続が始まります。

Wi-Fiへの接続完了後は、ラズパイからデータ待ちとなります。

サンプルコード(ラズパイ)

ラズパイには、2つのサンプルコードを用意します。

一つは、ラズパイがM5Stackからのデータを受信するソフトで、もう一つは、ラズパイからM5Stackへデータを送信するソフトです。

# -*-coding:utf-8-*-

from socket import socket, AF_INET, SOCK_DGRAM

HOST = ''
PORT = 5000
ADDRESS = "***.***.***.***"    # M5StackのIPアドレス

s = socket(AF_INET, SOCK_DGRAM)

while True:
    msg = input("> ")
    # 送信
    s.sendto(msg.encode(), (ADDRESS, PORT))

s.close()

# -*-coding:utf-8-*-

from socket import socket, AF_INET, SOCK_DGRAM

HOST = '***.***.***.***'   # ラズパリのIPアドレス
PORT = 5001

s = socket(AF_INET, SOCK_DGRAM)
s.bind((HOST,PORT))

while True:
    # 受信
    msg, address = s.recvfrom(8192)
    print(f"message: {msg}\nfrom: {address}")

s.close()

ラズパイでのサンプルコードの実行方法

ラズパイでは、2つのソフトを動かしますので、コンソールを2つ開きます。

コンソールAでは、以下のコマンドを入力してください。

> python3 app_tx.py

上記コマンドを実行すると、> が表示されますので、M5Stackが起動できているならば、なにか文字列を入力して、Enterを押してください。そうすると、M5Stackの画面にその文字列が表示されます。

コンソールBでは、以下のコマンドを入力してください。

> python3 app_rx.py

M5Stackが起動できていれば、ボタンを押すと、そのボタンに応じたメッセージが表示されます。

ちなみに、pythonソフトを停止させるには、ctrl + c です。

まとめ

今回は、M5StackとラズパイをUDPでつなげ、双方からデータ送受信できる方法を紹介しました。

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

コメント

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