今日は前回からの続きです。
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
このパッケージをインストールして、メニューのシステムツールから起動してみて下さい。
この例では、Axis1が左側のアナログジョイスティックの上下の軸であることが再確認できました。
ここまでくれば目標まであと一息です。
今日のところはこの辺で。☕️