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

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

$
0
0

今日は前回からの続きです。

MQTTによる疎通は確認できたと思うので、早速ゲームパッドを使ってev3のモーターを動かしてみましょう。

ラズパイでゲームパッドを利用するにはこのページを参考にします。もちろんMQTTとev3devについては前回と同様このページも参考にします。

まずはPublisherであるラズパイ側のコードです。

#!/usr/bin/env python
import pygame, sys, time
from pygame.locals import *
import paho.mqtt.client as mqtt

# Initialize a joystick and pygame
pygame.init()
pygame.joystick.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption('Controll ev3')

interval = 0.01

# This is the Publisher
loopQuit = False
#ループ処理
while loopQuit == False:

        axis_1 = joystick.get_axis(1) #.get_axis(1)の1がジョイスティックの軸の番号
        axis_1 = axis_1 * 100 #ジョイスティックの出力を100倍
        str_axis_1 = str(int(axis_1)) #float型をint型に、int型をstr型に。

        #MQTTでPublish
        client = mqtt.Client()
        client.connect("localhost",1883,60)
        client.publish("topic/motor-B/dt", str_axis_1);
        client.disconnect();
        #Publishした値を画面にも表示。
        print (str_axis_1)

        #終了処理
        for event in pygame.event.get():
            if event.type == QUIT:
                loopQuit = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE: #キーボードのkとescのコンビでも終了
                    loopQuit = True
        
        time.sleep(interval)

pygame.quit()
sys.exit()

次にSubscriberであるEV3側のコードです。

#!/usr/bin/env python
import paho.mqtt.client as mqtt
from ev3dev.auto import *

# This is the Subscriber
mb = Motor(OUTPUT_B) #ポートBのラージ・モーターを制御対象とする。

#Publisherと接続できたら0を表示し、"topic/motor-B/dt"をSubscribeする関数。
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("topic/motor-B/dt")

#msgの値を表示し、モーターの回転数として渡す関数。
def on_message(client, userdata, msg):
    print(msg.payload)
    mb.duty_cycle_sp = msg.payload

#ラズパイに接続。
client = mqtt.Client()
client.connect("PublisherであるラズパイのIPアドレス",1883,60)
#関数を実行。
client.on_connect = on_connect
client.on_message = on_message
#モーターを駆動
mb.run_direct()
mb.duty_cycle_sp = 0
#以上をループ処理。
client.loop_forever()

両方のコードを起動すると、両方に現在のジョイスティックの値を変換したものが画面にずらーっと表示されます。その状態で、ラズパイにUSB接続したゲームパッドの左側のアナログスティックを上下に動かすと値が変化し、EV3のポートBに接続したラージ・モーターが前後に動くはずです。

なお、ゲームパッドの機種によってはアナログジョイスティックの軸の番号がこのサンプルコードと異なる場合があるので、アプリで事前に確認してみて下さい。

sudo apt-get install jstest-gtk

このパッケージをインストールして、メニューのシステムツールから起動してみて下さい。

2016-10-01-000532_1920x1080_scrot

この例では、Axis1が左側のアナログジョイスティックの上下の軸であることが再確認できました。

ここまでくれば目標まであと一息です。

今日のところはこの辺で。☕️

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

関連記事:「EV3をラズパイのゲームパッドからインターネット経由で操縦してみた。(その3)


Viewing all articles
Browse latest Browse all 40

Trending Articles