Jetbot RCカー&M5stack core2 でモード切替


Jetbot RCカーでM5stack core2 コントローラーのZ軸加速度データを使い
ラインフォローのモード入り切りも実装しました。
JetbotはCore2を傾けた方向に進み、裏返しで自動運転です。
<追伸>Core2が落下しないように輪ゴム追加しました(落ちるとパニックになります)。
動画はこちら。
https://www.youtube.com/watch?v=m27CFoWe25k

live_demo.ipynb
import ipywidgets
from socket import *

automode = 0
manualR = 0
manualL = 0

## UDP受信クラス
class udprecv():
    def __init__(self):

        SrcIP = "192.168.***.***"                         # 受信元IP
        SrcPort = 9000                                  # 受信元ポート番号
        self.SrcAddr = (SrcIP, SrcPort)                 # アドレスをtupleに格納

        self.BUFSIZE = 1024                             # バッファサイズ指定
        self.udpServSock = socket(AF_INET, SOCK_DGRAM)  # ソケット作成
        self.udpServSock.bind(self.SrcAddr)             # 受信元アドレスでバインド

    def recv(self):
        global manualR, manualL, automode, a0_slider, a1_slider, a2_slider

        while True:                                     # 常に受信待ち

            data, addr = self.udpServSock.recvfrom(self.BUFSIZE)
                                                        # 受信
            #print(data.decode(), addr)                 # 受信データと送信アドレス表示
            a = data.decode().split(',')
            #print(float(a[0]), float(a[1]), float(a[2]))
            a0_slider.value = float(a[0])
            a1_slider.value = float(a[1])
            a2_slider.value = float(a[2])

            manualR = (float(a[0]) - float(a[1]))*0.4
            manualL = (-float(a[0]) - float(a[1]))*0.4

            if float(a[2]) < -0.2:
                automode = 1                   # 裏返しでラインフォローON
            else:
                automode = 0                   # 表向きでラインフォローOFF

a0_slider = ipywidgets.FloatSlider(min=-2.0, max=2.0, step=0.01,  value=0.0, description='a[0]')
a1_slider = ipywidgets.FloatSlider(min=-2.0, max=2.0, step=0.01, value=0.0, description='a[1]')
a2_slider = ipywidgets.FloatSlider(min=-2.0, max=2.0, step=0.01, value=0.0, description='a[2]')
display(a0_slider, a1_slider, a2_slider)
live_demo.ipynb
def line_follow():
    execute({'new': camera.value})
    camera.observe(execute, names='value')

import threading

# UDP run
th1 = threading.Thread(target=udp.recv)
th2 = threading.Thread(target=line_follow)

th1.start()
th2.start()

display(a0_slider, a1_slider, a2_slider)

参考

kashi takuさん、つっきーさんありがとうございました。
[Python3] UDP でデータを送受信する方法
https://qiita.com/kashitaku/items/8db929ad6bf3a13e5e68
ESP32でUDP通信やってみた(ESP32インストール手順解説あり)
https://qiita.com/Tsukkey/items/247285c703fbbc6c6cd2