クリスマスで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の受信データがスライダーで表示されます。
###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.***.***"; //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