Quantcast
Channel: okahiro | Okahiro's Gadget Lab
Viewing all articles
Browse latest Browse all 40

EV3をラズパイのゲームパッドからインターネット経由で操縦してみた。(その1)

$
0
0

image

今日は何だか長いタイトルになりました。

ずっと前に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があれば一つのラズパイから同時に同じ動きをさせることも可能です。

少し先が長くなりそうなので、今日のところはこの辺で。☕️


Viewing all articles
Browse latest Browse all 40

Trending Articles