前回、M5stack~raspberry pi間のUDP通信についてまとめました。↓
前回は、ボタン押下時に決められた文字列を送信するだけでした。今回はM5stickCの加速度センサーを利用して、前後左右+斜めの傾き情報に応じた文字列を、Raspberry PiにUDP通信で送信する方法についてまとめたいと思います。
micropythonとpythonで記述しています。
目次
初めに
m5stackシリーズのmicropythonについて
MicroPythonは、Pythonの文法を使ってマイコンや組み込み機器のプログラミングができる言語ですが、使えるライブラリなどがpythonと異なったりします。
例えばM5stackシリーズでは、多くの製品でmicropythonでの開発が可能ですので、専用のライブラリが用意されていますが、ネットでの情報量が少ないために少し苦労しがちです。
そこで役に立つのがUiFLOWになります。
UiFLOW
M5stackのUiFLOWを使えば、使いたい機能をBlockyで選択することで、タブ切替でmicropythonの記述が確認できます。
これ実はBlockyの方が難しいと思う(パズルのルールがややこしい。。)ので、ライブラリ名や主要になる記述を把握する用途で使えば、後は自力でmicropythonを書けると思います。
プログラム
Raspberry Pi側(サーバー、python)
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 |
from socket import socket, AF_INET, SOCK_DGRAM import time import network 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()) HOST = "サーバーのIP" PORT = ポート番号 s = socket(AF_INET, SOCK_DGRAM) s.bind((HOST, PORT)) while(True): msg, address = s.recvfrom(8192) #print(f"message: {msg}\nfrom: {address}") msg = msg.decode() print(msg) time.sleep(0.1) s.close() |
サーバー側は前回と同じです。サーバー宛てのデータを受け取って、表示させているだけです。
M5stickC側(クライアント、micropython)
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
import network import time from socket import socket, AF_INET, SOCK_DGRAM from m5stack import * from m5ui import * from uiflow import * from m5stack import lcd import imu imu0 = imu.IMU() wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('Buffalo-G-29CE', 'AKANE0918') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) serv_address = ("192.168.11.220", 5000) s = socket(AF_INET, SOCK_DGRAM) #s.setsockopt(socket.SOL_SOCKET、socket.SO_REUSEADDR、1) #while True: #print(imu0.ypr[1]) #print(imu0.ypr[2]) #time.sleep(0.1) while True: #data,addr=s.recvfrom(1024) #s.sendto(data,addr) #print('received:',data,'from',addr) if imu0.ypr[1] < -15 and -10 < imu0.ypr[2] < 10:#btnA.wasPressed(): lcd.clear(lcd.BLACK) lcd.clear(lcd.BLUE) message = "forward" s.sendto(message.encode("utf-8"), serv_address) print(imu0.ypr[1]) time.sleep(0.1) elif imu0.ypr[1] > 30 and -10 < imu0.ypr[2] < 10:#btnB.wasPressed(): lcd.clear(lcd.BLACK) lcd.clear(lcd.RED) message = "backward" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif -10 < imu0.ypr[1] < 10 and 20 < imu0.ypr[2]:#btnC.wasPressed(): lcd.clear(lcd.BLACK) lcd.clear(lcd.GREEN) message = "right" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif -10 < imu0.ypr[1] < 10 and -80 < imu0.ypr[2] < -20: lcd.clear(lcd.BLACK) lcd.clear(lcd.ORANGE) message = "left" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif -15 > imu0.ypr[1] and -80 < imu0.ypr[2] < -10: lcd.clear(lcd.BLACK) lcd.clear(lcd.PINK) message = "leftforward" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif -15 > imu0.ypr[1] and 80 > imu0.ypr[2] > 10: lcd.clear(lcd.BLACK) lcd.clear(lcd.YELLOW) message = "rightforward" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif 30 < imu0.ypr[1] and -80 < imu0.ypr[2] < -10: lcd.clear(lcd.BLACK) lcd.clear(lcd.PURPLE) message = "leftback" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif 30 < imu0.ypr[1] and 80 > imu0.ypr[2] > 10: lcd.clear(lcd.BLACK) lcd.clear(lcd.BLUE) message = "rightback" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif 80 < imu0.ypr[2]: lcd.clear(lcd.BLACK) lcd.clear(lcd.RED) message = "r turn" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) elif -80 > imu0.ypr[2]: lcd.clear(lcd.BLACK) lcd.clear(lcd.RED) message = "l turn" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) else: lcd.clear(lcd.BLACK) message = "stop" s.sendto(message.encode("utf-8"), serv_address) time.sleep(0.1) s.close() |
前回のプログラムに、加速度センサーと、傾きの判定を分かりやすくするためにLCDを発光させる記述を追加しています。
ロール角とピッチ角の値の組み合わせで傾きの判定を出しています。判定ごとに紐づけされている文字列をサーバー側にUDP通信で送信しています。
確認
こんな感じになりました。↓
次回はこれを応用して、Raspberry Pi ZERO W で作成したメカナムクローラーラジコンを、M5stickCの加速度センサーで制御してみたいと思います。