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でつなげ、双方からデータ送受信できる方法を紹介しました。
Pythonでプログラムを作るのなら、ラズパイが安くて、環境構築も楽で、おすすめです。
Raspberry Pi は、Raspberry Pi Foundationによって開発された低価格で小型のシングルボードコンピュータです。最初は教育目的で2012年にリリースされましたが、その手頃な価格と高性能により、教育用にとどまらず、さまざまなプロジェクトやプロトタイピングのプラットフォームとして広く利用されています。Raspberry Piは、LinuxベースのOSを主に使用し、簡単にカスタマイズ可能であるため、プログラミングやエレクトロニクスの教育、IoTデバイス、ホームオートメーション、メディアセンターなどに活用されています。
AI(人工知能)特化型プログラミングスクール「Aidemy Premium」
Aidemy Premiumは、AIや機械学習などの最先端技術の修得に留まらず、それらを活用して目標達成を実現するまでを一気通貫して支援するオンラインコーチングサービスです。
こんな思いを持っている人にオススメ
・AIエンジニア/データサイエンティストにキャリアチェンジしたい
・業務課題(研究課題)をAIを使って解決したい
・教養としてAIについて知りたい
・AIに関してのスキルを身に着け就職活動に活かしたい…
オススメポイント
・3ヶ月間集中して「AIプログラミング」を修得するオンラインコーチングサービスです。
・完全なプログラミング初心者から研究者にまで幅広く優良なコンテンツを提供します。
・通常のプログラミングスクールとは異なり、受講者の進捗管理を徹底して行います。
・専属メンターがAIの学び方から徹底的にコーチングします。
・完全オンライン完結なので、東京以外に在住・在勤の方も気兼ねなくお申込み頂けます。
実績
・日本最大級のAI/人工知能プログラミングスクール
・SaaS型AI学習サービス「Aidemy」会員登録者数 55,000名突破
・法人向けAI内製化支援サービス「Aidemy Business」導入企業数 120社突破
・第16回 日本e-Learning大賞「AI・人工知能特別部門賞」受賞
・「HRアワード2019」プロフェッショナル部門 入賞
無料ビデオカウンセリング実施中です。


コメント