電子工作で主にラジコンなどの動くものを作っているのですが、コントローラー側でジョイスティックの実装をやったことがなかったので、M5Stackの拡張ボード?の「JoyC HAT」を購入しました。
JoyC HATは、ジョイスティックが実装された基板にM5StickCを取り付けるPINがついていて、M5StickCを取り付ける事で、ジョイスティックの無線コントローラーとして扱う事ができます。
専用のライブラリも用意されていますので(UiFlow)、プログラムも比較的簡単に実装できます。
という事で今回は、joyC HATの使い方について、簡単にまとめておこうかと思います。
※micropythonでの実装になります。
初めに
HATにM5StickCを接続するだけで、スティックを倒すとその方向にあるLEDが点灯します。これがなんか気持ちいいです。
HATの電源は、基板の裏にリチウムバッテリーが付いていて、それで動いています。
充電も可能ですが、充電はM5StickC経由、つまりM5StickCを接続した状態でUSBケーブルを接続(M5StickCに)しなければ充電が出来ないみたいです。
また、HATからM5StickCへの充電は出来ないみたいです。
M5StickCとの通信はI2C
JoyC HATとM5StickCとの通信はI2Cで行われるようです。
ですので、初めはJoyC HATのアドレスを調べて、先ずpythonでI2Cのオブジェクトをつくるもんだと思っていたのですが、その必要はありませんでした。
UiFlowのブロックで、ジョイスティックの値を受け取るブロックを選択するだけで、自動的にI2C接続してくれるようです。楽ですね~
プログラム
それでは、このHATを使ってメカナムラジコンを操作したプログラムがありますので、それを乗っけておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
import network from socket import socket, AF_INET, SOCK_DGRAM from m5stack import * from m5ui import * from uiflow import * import hat import time setScreenColor(0x111111) wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('SSID', 'PASS') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) serv_address = ("ラジコンのIP", ポート番号) s = socket(AF_INET, SOCK_DGRAM) hat_joyc0 = hat.get(hat.JOYC) while True: y = hat_joyc0.GetX(0) x = hat_joyc0.GetY(0) yy = hat_joyc0.GetX(1) xx = hat_joyc0.GetY(1) #print(x) # print(y) #print(c) #print(d) if x >= 159 and 39 <= y <= 159: message = "forward" s.sendto(message.encode("utf-8"), serv_address) print("for") elif x <= 39 and 39 <= y <= 159: message = "backward" s.sendto(message.encode("utf-8"), serv_address) print("back") elif y >= 159 and 39 <= x <= 159: message = "left" s.sendto(message.encode("utf-8"), serv_address) print("left") elif y <=39 and 39 <= x <= 159: message = "right" s.sendto(message.encode("utf-8"), serv_address) print("right") elif x >= 150 and y >= 150: message = "leftforward" s.sendto(message.encode("utf-8"), serv_address) print("left for") elif x <= 50 and y >= 150: message = "leftback" s.sendto(message.encode("utf-8"), serv_address) print("left back") elif x >= 150 and y <= 50: message = "rightforward" s.sendto(message.encode("utf-8"), serv_address) print("right for") elif x <= 50 and y <= 50: message = "rightback" s.sendto(message.encode("utf-8"), serv_address) print("right back") elif yy >= 159 and 39 <= xx <= 159: message = "l turn" s.sendto(message.encode("utf-8"), serv_address) print("left turn") elif yy <=39 and 39 <= xx <= 159: message = "r turn" s.sendto(message.encode("utf-8"), serv_address) print("rightturn") else: message = "stop" s.sendto(message.encode("utf-8"), serv_address) print("stop") time.sleep(0.1) |
UDPで相手方にジョイコンの値を送信しています。
hat_joyc0 = hat.get(hat.JOYC) がおそらく、ジョイコンのI2Cのオブジェクトになってるっぽいです。
hat_joyc0.GetX(0) でジョイコンの値を受け取っています。引数は0が左で1が右になります。
値は0~200で、センターがx,y共に100になります。
ステアリング付ラジコンも操作してみました。