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でつなげ、双方からデータ送受信できる方法を紹介しました。
\ キーボード一体型のラズパイがおすすめです。モニターとつなげるだけです /
コメント