[M5StickC]Wifi経由でジョイスティックの値をRaspberry Piに送信
- 2020.07.25
- M5StickC
先日購入したM5StickC用のジョイスティックモジュールをロボットのコントローラにすべく、プログラムを用意しました。
送信側
送信側はジョイスティックの入力を取得するプログラムと、Wifiで通信するプログラムを合体したものとなります。2つのプログラムについては、下記サイトで紹介されていたものを使用しました。
プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
#include <M5StickC.h> #include <WiFi.h> #include <WiFiUDP.h> #include "Wire.h" #include <math.h> const char* ssid = "xxx"; const char* password = "xxx"; const int port = 8000; const char* sendIP ="xxx.xxx.xxx.xxx"; #define JOY_ADDR 0x38 WiFiUDP udp; void print_wifi_state(){ M5.Lcd.fillScreen(BLACK); M5.Lcd.setTextColor(YELLOW); M5.Lcd.setCursor(3, 3); M5.Lcd.println(""); M5.Lcd.println("WiFi connected."); M5.Lcd.print("IP address: "); M5.Lcd.println(WiFi.localIP()); } void setup_wifi(){ M5.Lcd.setRotation(3); M5.Lcd.setTextColor(RED); M5.Lcd.setTextSize(1); M5.Lcd.setCursor(3, 3); M5.Lcd.print("Connecting to "); M5.Lcd.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(100); M5.Lcd.print("."); } print_wifi_state(); udp.begin(port); } void setup() { M5.begin(); setup_wifi(); Wire.begin(0,26); } int8_t x_data; int8_t y_data; int8_t x_zero=-3; int8_t y_zero=-1; int8_t button_data; char data[100]; float angle=0; void loop() { M5.Lcd.fillScreen(BLACK); Wire.beginTransmission(JOY_ADDR); Wire.write(0x02); Wire.endTransmission(); Wire.requestFrom(JOY_ADDR, 3); if (Wire.available()) { x_data = Wire.read()+x_zero; y_data = Wire.read()+y_zero; button_data = Wire.read(); angle=atan2(y_data/125.,x_data/125.)*180./M_PI; sprintf(data, "x:%d y:%d button:%d\n angle:%.2f", x_data, y_data, button_data, angle); Serial.print(data); M5.Lcd.setCursor(1, 30, 2); M5.Lcd.printf(data); } udp.beginPacket(sendIP, port); udp.print(angle); udp.endPacket(); delay(100); } |
プログラムの内容としては、ジョイスティックから取得したX,Yの値をもとにして、どの方向に倒れているのか角度を計算してその角度を送信しています。ジョイスティックの値そのままだと、触っていない時でも0にならなかったので、x_zero、y_zeroという変数で補正しています。
受信側
受信はRaspberry Piで行うものとしてPythonで記述します。プログラムは下記サイトのものに少しだけ手を加えたものです。
プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from socket import socket, AF_INET, SOCK_DGRAM HOST="" PORT=8000 s=socket(AF_INET, SOCK_DGRAM) s.bind((HOST, PORT)) while True: msg, adress=s.recvfrom(32) if float(msg)!=0: print (float(msg)) s.close() |
受信するだけなので、とても短いプログラムです。
結果
プログラムを2つとも実行してジョイスティックを動かすと、下記のように角度を受信できます。
M5StickCは小さくてバッテリも搭載しているので、ロボットのコントローラに使うにはとても便利だと思います。私もそのように使う予定です。
-
前の記事
Raspberry PiにROSをインストール 2020.07.19
-
次の記事
エンコーダを使ってオドメトリ 2020.07.27