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

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

```ruby:basic_motion-UDP.ipynb
from jetbot import Robot
robot = Robot()
```
###UDPとcontrollerを追加

```ruby: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/3a98aa6e-2eea-c4b0-c4dc-c36acc2f148a.png)
###RC終了時にrobot停止し、UDPを閉じる。

```ruby:basic_motion-UDP.ipynb

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

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

```ruby:
//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.***.***"; //JetbotのIPです
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