今日は何だか長いタイトルになりました。
ずっと前にLEGO MINDSTORM EV3にev3devというOSをインストールした記事を載せましたが、その一つの応用編になるでしょうか。
今回の目標は、EV3のロボットを遠隔でゲームパッドから操縦することです。遠隔からということは地球の裏側からでも操作できることを意味しますので、必然的にインターネットを経由することになります。そのためには、EV3はev3devで動かす必要があります。(Bluetoothなら標準搭載のファームウェアでもいけるかもしれませんが。)
ゲームパッドといえばRaspberry Pi(以降ラズパイ)のpygameを利用しない手はありません。ラズパイのUSBポートにゲームパッドをつなげ、Pythonのコードからpygameを呼び出して利用するわけです。これについてはこの文献がモロに参考になります。
一番の難関は、ラズパイとEV3とのインターネット経由の通信をどうするか?です。これにはこのページが参考になります。MQTTというTCP/IPのプロトコルを利用するものです。MQTTについてはこのページが参考になります。IOTで主に活用されるプロトコルのようです。
MQTTをラズパイとEV3で利用するためには、それぞれにmosquittoというMQTTのブローカー・パッケージと、paho-mqttというPythonライブラリを使用しますのでこれらをインストールします。(なお、前回記事にあるとおり、EV3にはsshでログインできます。)
mosquittoはバックグラウンドで動作するサービスとしてインストールされます。
sudo apt-get install mosquitto
paho-mqttはpipでインストールできるのですが、ev3devにはpipがインストールされていません。pipをインストールするにはcurlを使いたいのですがこれも無いので、curlからインストールします。(ラズパイにはcurlがあるので飛ばしてください。)
sudo apt-get install curl
次にcurlでpipをインストールします。(ここもラズパイ側は飛ばす。)
curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python
pipのインストールが終わったら、pipでpaho-mqttをインストールします。
sudo pip install paho-mqtt
以上で必要なソフトウェアのインストールは完了です。
まずはMQTTによる通信が可能かどうか、参考ページにあるサンプルコードをそのまま利用して確認してみます。
まず、EV3側はSubscriberになるので以下のコードを作成・保存して起動(python コード名)しておきます。
#!/usr/bin/env python import paho.mqtt.client as mqtt # This is the Subscriber def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("topic/test") def on_message(client, userdata, msg): if (msg.payload == "Hello world!"): print("Yes!") client.disconnect() client = mqtt.Client() client.connect("PublisherであるラズパイのIPアドレス",1883,60) client.on_connect = on_connect client.on_message = on_message client.loop_forever()
次に、ラズパイ側はPublisherになるので以下のコードを作成・保存して起動します。
#!/usr/bin/env python import paho.mqtt.client as mqtt # This is the Publisher client = mqtt.Client() client.connect("localhost",1883,60) client.publish("topic/test", "Hello world!"); client.disconnect();
EV3側で”Yes!”と表示されれば成功です。仕組みとしては、topic/testという名前のメッセージを受信して、その中身(msg.payload)が”Hello world!”と一致していれば”Yes!”と出力するというものです。Publisher側では送信先を指定しないので、複数のEV3があれば一つのラズパイから同時に同じ動きをさせることも可能です。
少し先が長くなりそうなので、今日のところはこの辺で。☕️