2021/12/15 よりサイトリニューアルしました

M5stackとRaspberry Pi間でUDP通信を通してみる(Python)

UDP通信

 

今まで、スマホからマイコンボードのLEDやらモーターを制御させるための無線通信手段として「Apache等のミドルウェアを使ったWEBサーバー経由」または「Bluetooth」を主に利用してきたのですが、今回コントローラー側をスマホでは無くマイコンボードでやってみた際に、これらが使えない状況だったので、その時のメモになります。

新たに試してみた無線通信手段は、UDP通信になります。これもWEB通信なので、サーバー経由になるっちゃあなるんでしょうが、冒頭に書いた「 Apache等のミドルウェアを使ったWEBサーバー経由 」とは異なります。 ミドルウェアを使った場合、WEB通信のやり取り等は特段気にする必要性が無いためです。つまり、無線のやり取り部分はブラウザとApacheが勝手にやってくれるのでプログラムを作る必要性がありません。

ですので、サーバー側にApache等のミドルウェアを入れることが出来ない、もしくはクライアント側でブラウザが使えない、といった場合ですと、必然的にデバイス間でWEB通信のプログラムを作らなければなりません。

今回の経緯としましては、ラズパイで作ったラジコンをM5stickCの加速度センサで無線操作してみたいと思ったからです。恐らく、C使いならばBluetoothで行けたんでしょうが、生憎Cが全く使えないので、M5側はmicropythonで行くしかありません。しかし、micropythonではBluetooth通信が簡単に出来ません(何故か情報が少ない)。OSは無いのでブラウザもない。ってことで、WEB通信のUDP通信プログラムを作ってみる事になりました。

前置きがかなり長くなってしまいましたが、ここで詳細をまとめておこうと思います。

なお、参考にさせて頂いたサイトのリンクは以下になります。↓

PythonによるUDP通信

 

 

初めに

やりたいこと

サーバー側をRaspberry Pi ZERP Wとし、pythonで記述。クライアント側にM5stackを使い、micropythonで記述。

M5stackでボタンを押せば文字列を送信し、Raspberry pi側で受け取ってシェルで表示。これをUDP通信で実現する。

 

UDP通信について

WEB通信のトランスポート層で動作するプロトコルで、TCPとUDPがあります。前者がコネクション型、後者がコネクションレス型と呼ばれています。TCPは送ったパケットがちゃんと届いているかを確かめて、届いていなければ再送するといった動作をします。確認や再送の手間がある分時間がかかりますが、データの完全性が高いのでWEB閲覧時等などに使われています。UDPはパケットが届いたかどうかの確認をしないので、速度が速い代わりにデータの完全性が損なわれます。音声通話や動画配信など、リアルタイム性重視の場面で利用されています。

今回はコントローラーとして文字列を送るだけなので、とりあえずUDPでやってみました。

 

ソケットについて

通信を確立させるためにソケットが使われています。クライアント側、サーバー側にそれぞれソケットがあり、下図のような順序で通信を確立させています。

udp
日々、コレ勉強さまのサイトより引用

tcp
日々、コレ勉強さまのサイトより引用

 

 

プログラム

M5stack(クライアント側)

Raspberry Piと同じLANに接続されていなければダメですので、まず無線LANにステーションモードで接続しています。

続いてサーバーの情報(IPとポート番号)をインスタンス化します。

最後のループではボタン押下するとボタンに応じた文字列がサーバーに送られます。

Raspberry Pi(サーバー側)

無線LANにステーションモードで接続しています。

その後ソケットを作り、サーバー側のIPとポートを紐づけています。

最後のループで、作成したソケットに対して文字列のデータが飛んできているか確認し、データがあれば文字列を表示させています。

 

 

テスト

こんな感じになります。↓

https://twitter.com/ketunorobio/status/1487356722578477059

 

次回は、これを応用してM5stickCの加速度センサーの位置情報を、Raspberry PiにUDP通信で送信してみます。

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です