LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-28

IMG_3082a.jpg

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0