LoginSignup
0
0

More than 3 years have passed since last update.

Jetbot RCカーでM5stack core2 コントローラー追加(UDP通信)

Last updated at Posted at 2020-12-27

クリスマスでM5Stack core2を入手しました!
Jetbotに搭載し姿勢制御と考えていましたが、Core2は9軸ではなく6軸でしたので見送り。
実際Core2はバッテリー、Wifi、画面、センサなどが標準で付いているので、
RCのコントローラーにしてみました。
UDP通信でつないでいます。
動画はこちら! マインクラフト風(?)。
https://www.youtube.com/watch?v=BTsYxIs-Gnc
###まずはJetbot側の設定です。

basic_motion-UDP.ipynb
from jetbot import Robot
robot = Robot()

###UDPとcontrollerを追加

basic_motion-UDP.ipynb
import ipywidgets
from socket import *

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

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

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

    def recv(self):
        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])               # 裏表の傾き
            
            robot.set_motors((-float(a[0]) - float(a[1]))*0.4, (float(a[0]) - float(a[1]))*0.4)


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)
            
udp = udprecv()                                         # クラス呼び出し
udp.recv()                                              # 関数実行

###UDPの受信データがスライダーで表示されます。
slider.PNG
###RC終了時にrobot停止し、UDPを閉じる。

basic_motion-UDP.ipynb

robot.stop()
udp.udpServSock.close()

###ここからはM5Stack core2用です。
Arduino IDEを使い書き込みます。

//Arduino_UDP.ino
#include <WiFi.h>
#include <WiFiUDP.h>
#include <WiFiClient.h>
#include <M5Core2.h>

const char* ssid = "[SSID名]"; // SSID名を入れる
const char* password = "[パスワード]"; // PASSWORDを入れる

static WiFiUDP wifiUdp; 
static const char *kRemoteIpadr = "192.168.***.***"; //JetbotIPです
static const int kRmoteUdpPort = 9000; //送信先のポート

float acc[3];

char s0[16];
char s1[16];
char s2[16];
char t[16];

static void WiFi_setup()
{
  static const int kLocalPort = 7000;  //自身のポート

  WiFi.begin(ssid, password);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500);  
  }  
  wifiUdp.begin(kLocalPort);
}

static void Serial_setup()
{
  Serial.begin(115200);
  Serial.println(""); // to separate line  
}

void setup() {
  M5.begin();
  M5.IMU.Init();
  WiFi_setup();
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(40, 0);
  M5.Lcd.println("IMU TEST");
  M5.Lcd.println("IP: ");
  M5.Lcd.println(WiFi.localIP());
}

void loop() 
{
  M5.IMU.getAccelData(&acc[0],&acc[1],&acc[2]);
  M5.Lcd.setCursor(0, 50);
  M5.Lcd.print("G");
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", acc[0], acc[1], acc[2]);
  
  dtostrf(acc[0], 5, 5, s0);
  dtostrf(acc[1], 5, 5, s1);
  dtostrf(acc[2], 5, 5, s2);
  
  wifiUdp.beginPacket(kRemoteIpadr, kRmoteUdpPort);

  for(int i=0; i < 7; i++){
    wifiUdp.write(s0[i]);
  }

  wifiUdp.write(',');
  
  for(int i=0; i < 7; i++){
    wifiUdp.write(s1[i]);
  }
  
  wifiUdp.write(',');

  for(int i=0; i < 7; i++){
    wifiUdp.write(s2[i]);
  }
 
  wifiUdp.endPacket();  
  
  delay(50);
}

#参考
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