macsbug

Operate M5 Whell (moio) with RCWControll

leave a comment »

M5 Whell ( moio ) を RCWController アプリ で操作しました。 2019.08.26

RCWController アプリは ゲームパッドのインターフェイス を持ち、
iPhone や iPad で 操作する事ができます。

 M5 Wheel ( moio ) RCWController

RCWController の機能:UDP通信でWi-Fi機器と接続でき、ジョイスティク や ボタン
_ などを タップすることで、操作に対応するデータが送信されます。

RCWController ダウンロード:App Store RCWController。micutil氏に感謝致します。

robo8080氏のブログに RCWController アプリを使用した記事、
ESP32-DevKitCに、RCWControllerを接続してみた。」があります。
その github に ESP32とRCWControllerを接続するテストプログラム
ESP32_RCWController_Test」があり 設定、操作、データの仕様が書かれています。
上記からダウンロードして RCWController.h を入手します。robo8080氏に感謝致します。

以上から RCWController.h を使用し、M5 Whell ( moio ) のスケッチを作成しました。

仕様:今回のスケッチは Right Joystick 操作のみです。
_  必要に応じて 他の操作を追加します。
_  追加機能は Loop内の x , y に 操作の値を入れます。


.
データフォーマット表: Operation と buffer[ 0 to 9 ]
_ 縦軸は Operation、横軸は 0 – 9 で buffer[ 0 to 9 ] の配列です。
_ 例:Right Joystick の UP / DN は 配列5の値が UP は 255 , DN は 1 です。
_ 例:Right Joystick の Right/Left は 配列4の値が Right は 255 , Left で 1 です。

 

Operation \ buffer 0 1 2 3 4 5 6 7 8 9
 ……………………………. ……… ……… ……… ……… ……… ……… ……… ……… ……… ………
 R JOY CENTER 128 128 9
 R JOY UP 255 9
 R JOY DN 1 9
 R JOY R 255 9
 R JOY L  1 9
 R PUSH SW Y 16 1
 R PUSH SW A 32 1
 R PUSH SW B 64 1
 R PUSH SW X 1 1
 R1 8 1
 R2 16 1
 L1 2 1
 L2 4 1
 SELECT 12 1
 START 3 1
 L JOY CENTER  128 128 18
 L JOY UP 255 18
 L JOY DN  1 18
 L JOY R 255 18
 L JOY L 1 18
 L TOGGLE UP 1 1
 L TOGGLE DN  2 1
 L TOGGLE R  4 1
 L TOGGLE L  8 1
 R ACCEL CENTER 128 128 1 97
R ACCEL UP 1 1 97
R ACCEL DN 255 255 97
R ACCEL R 255 255 97
 R ACCEL L 1 1 97
 L ACCEL CENTER 128 128 1 65
 L ACCEL UP 1 1 65
 L ACCEL DN 255 255 65
 L ACCEL R 255 255 65
 L ACCEL L 1 1 65
 ……………………………. ……… ……… ……… ……… ……… ……… ……… ……… ……… ………
Operation \ buffer 0 1 2 3 4 5 6 7 8 9

.
作成:
_ RCWController と Blynk 、Servo のスケッチを合体しました。
_ iOS RCWController アプリからの値は データフォーマット表に示す 1 〜 255 です。
_ M5の Blynk servo ルーチンでは この値を 255 〜 -255 で使用します。
_ これにより void loop内で map命令にて 以下の様に変換しています。
_ 例:x = map(buffer[4], 1, 255, 255, -255); // R JOYSTICK X
_ 後に Blynk servo ルーチンは 見やすくする為に while文から if文に変更しました。

接続方法:
_ 1. iPad の WiFi設定 は ESP32-RCWC を選択します。 Password は esp32pass です。
_ 2. RCWController アプリを動かし 中央の ON ボタンで WiFi接続します。
_  もしくは接続時に IP が表示されます。
_ 3. 右下側の ANALOG ( pink ) を選択し Joystick にします。
_ 4. Joystick で操作が出来ます。( ACCEL にも反応します)


.
参考:
M5 Wheel Module ( moio )
Make M5Stack Servo Module
robo8080のブログ:ESP32-DevKitCに、RCWControllerを接続してみた。
ESP32_RCWController_Test


.
感想:
身近な iPhone や iPad で操作出来ると簡単です。
Blynk:前回記事の Blynk は ネット接続が必要で 不便です。
RCWController の 接続は iPad と M5 moio 間で接続する時に便利です。
PS4 等の専用コントローラーで操作出来るとさらに便利になります。
コントローラー以外に、自動操縦の機能が出来ると良いかと思っています。

BeetleC:操作性の良く無い BeetleC のコントローラーに使用出来ます。


.
スケッチの構成:
_ 

スケッチ:M5 moio RCWControll :
_ ORG : : 2019.08.26 : macsbug
_ rev.1 : battery, motor : 2019.09.01 : macsbug
_ rev.2 : UDP, Operability of x : 2019.09.05 : macsbug
仕様:Right Joystick のみのスケッチです。
.

// M5Stack moio + RWCController JoyStick: org 2019.08.26 : macsbug
// rev.1 : battery, motor                   : 2019.09.01 : macsbug
// rev.2 : UDP, Operability of x            : 2019.09.05 : macsbug  
// https://macsbug.wordpress.com/2019/08/26/operate-m5-whell-mono-with-rcwcontroll/
// RCWController Test Program for ESP-WROOM-32 2017/4/3 by robo8080
// https://github.com/robo8080/ESP32_RCWController_Test
// https://macsbug.wordpress.com/2019/08/21/m5-wheel-module-moio/
// https://homemadegarbage.com/esp32_minirobot01
// https://mvdlande.wordpress.com/2019/06/02/drv8833-motor-driver-module/
// DRV8833 + M5Stack + DC MOTOR
// INx  :GPIO:  OUTx : MOTOR   :CH : 
// IN1  :  5 :  OUT1 : LEFT  - : 2 : Motor position reversed
// IN2  : 17 :  OUT2 : LEFT  + : 1 : Motor position reversed
// IN3  : 13 :  OUT3 : RIGHT + : 3 : 
// IN4  :  0 :  OUT4 : RIGHT - : 4 : 
// DRV8833 H-BRIDGE
// IN1 = PWM, IN2 = 0   : Foword  PWM, fast decay
// IN1 = 1  , IN2 = PWM : Foword  PWM, slow decay
// IN1 = 0  , IN2 = PWM : Reverse PWM, fast decay
// IN1 = PWM, IN2 = 1   : Reverse PWM, slow decay
// Controll/buffer:   0   1   2   3   4   5   6   7   8   9
// ---------------: --- --- --- --- --- --- --- --- --- ---
// R JOY CENTER   :                 128 128               9
// R JOY UP       :                     255               9 
// R JOY DN       :                       1               9
// R JOY R        :                 255                   9
// R JOY L        :                   1                   9
// R PUSH SW Y    :      16                               1
// R PUSH SW A    :      32                               1
// R PUSH SW B    :      64                               1
// R PUSH SW X    :   1                                   1
// R1             :   8                                   1
// R2             :  16                                   1
// L1             :   2                                   1
// L2             :   4                                   1
// SELECT         :      12                               1
// START          :       3                               1
// L JOY CENTER   :         128 128                      18
// L JOY UP       :             255                      18
// L JOY DN       :               1                      18
// L JOY R        :         255                          18
// L JOY L        :           1                          18
// L TOGGLE UP    :       1                               1
// L TOGGLE DN    :       2                               1
// L TOGGLE R     :       4                               1
// L TOGGLE L     :       8                               1
// R ACCEL CENTER :   0   0 128 128 128 128 128 128   1  97
// R ACCEL UP     :   0   0 128 128 128   1 128   1 128  97
// R ACCEL DN     :   0   0 128 128 128 255 128 255 128  97
// R ACCEL R      :   0   0 128 128 255 128 255 128 128  97
// R ACCEL L      :   0   0 128 128   1 128   1 128 128  97
// L ACCEL CENTER :   0   0 128 128 128 128 128 128   1  65
// L ACCEL UP     :   0   0 128   1 128 128 128 255 128  65
// L ACCEL DN     :   0   0 128 255 128 255 128 255 128  65
// L ACCEL R      :   0   0 255 128 128 128 255 128 128  65
// L ACCEL L      :   0   0   1 128 128 128   1 128 128  65
// ---------------: --- --- --- --- --- --- --- --- --- ---
// Controll/buffer:   0   1   2   3   4   5   6   7   8   9

#include <M5Stack.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include "RCWController.h"
const char ssid[] = "ESP32-RCWC";
const char pass[] = "esp32pass";
WiFiUDP udp;
unsigned int localPort = 10000;
const int PACKET_SIZE = 256;
char packetBuffer[PACKET_SIZE];
long S, L, R, c1, c2, c3, c4, x = 0, y = 0;
char buff[32]; // UDP buffer

int8_t getBatteryLevel(){
  Wire.beginTransmission(0x75);
  Wire.write(0x78);
  if (Wire.endTransmission(false) == 0
    && Wire.requestFrom(0x75, 1)) {
    switch (Wire.read() & 0xF0) {
    case 0xE0: return 25;
    case 0xC0: return 50;
    case 0x80: return 75;
    case 0x00: return 100;
    default: return 0;
    }
  }
  return -1;
}

void battery_level(){
  M5.Lcd.setCursor(0, 200);
  M5.Lcd.print("Battery Level: ");
  M5.Lcd.print(getBatteryLevel());
  M5.Lcd.print("%");
  M5.Lcd.setCursor(0, 220);
  if (getBatteryLevel() == -1){M5.Lcd.print(" or Not USB IP5306");}
}

void motor() {
  S = sqrt( x * x + y * y );
  if ( S > 255 ){ S = 255;}
  M5.Lcd.clear(BLACK);
  M5.Lcd.setCursor(5, 25);M5.Lcd.print("speed: ");M5.Lcd.print(S);
  M5.Lcd.setCursor(5, 65);M5.Lcd.print("x: ");M5.Lcd.print(x);
  M5.Lcd.setCursor(5,105);M5.Lcd.print("y: ");M5.Lcd.print(y);
  R  = 0 ; if (x >= 0){ R = abs(x);}
  L  = 0 ; if (x <  0){ L = abs(x);}
  c1 = c3 = 1 ; if ( y >= 0 ){ c1 = S - R; c3 = S - L;}
  c2 = c4 = 1 ; if ( y <  0 ){ c2 = S - R; c4 = S - L;}
  ledcWrite(1, c1); // ch1, Phase,  5, IN1, RIGHT MOTOR-
  ledcWrite(2, c2); // ch2, PWM  , 17, IN2, RIGHT MOTOR+
  ledcWrite(3, c3); // ch3, Phase, 13, IN3, LEFT  MOTOR+
  ledcWrite(4, c4); // ch4, PWM  ,  0, IN4, LEFT  MOTOR-
}

void setup() {
  M5.begin();
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.setTextSize(2);
  ledcSetup(1,5000,8);ledcSetup(2,5000,8); // channel,freq,resolution_bits
  ledcSetup(3,5000,8);ledcSetup(4,5000,8); // channel,freq,resolution_bits
  ledcAttachPin(17, 1); // GPIO17 , ch1, IN2, OUT2, LEFT  MOTOR+
  ledcAttachPin( 5, 2); // GPIO 5 , ch2, IN1, OUT1, LEFT  MOTOR-
  ledcAttachPin(13, 3); // GPIO13 , ch3, IN3, OUT3, RIGHT MOTOR+
  ledcAttachPin( 0, 4); // GPIO 0 , ch4, IN4, OUT4, RIGHT MOTOR-
  ledcWrite(1,0);ledcWrite(2,0);ledcWrite(3,0);ledcWrite(4,0);// STOP
  battery_level();delay(3000);
  WiFi.softAP(ssid, pass);
  IPAddress myIP = WiFi.softAPIP();
  M5.Lcd.setCursor(5, 15);M5.Lcd.print("AP IP address: ");M5.Lcd.println(myIP);
  M5.Lcd.setCursor(5, 35);M5.Lcd.print("Starting UDP");
  udp.begin(localPort);
  M5.Lcd.setCursor(5, 55);M5.Lcd.print("Local port: ");M5.Lcd.println(localPort);
  M5.Lcd.setCursor(5, 75);M5.Lcd.print("wifi ssid = ESP32-RCWC");
  M5.Lcd.setCursor(5, 95);M5.Lcd.print("password  = esp32pass");
  M5.Lcd.setCursor(5,115);M5.Lcd.print("Operate RCWController");delay(5000);
  M5.Lcd.fillScreen(BLUE);delay(1000);M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(5,25);M5.Lcd.print("START");
}

void loop() {
  int rx = udp.parsePacket();              // UDP packet size
  if (rx) {                                // UDP recive
   int len = udp.read(buff,rx);            // recive lengs
    if (len > 0){                          // recive action
       buff[len] = '\0';                   // Termination clear    
          x = map(buff[4],1,255,100,-100); // R JOYSTICK X:  50 to -50
          y = map(buff[5],1,255,-255,255); // R JOYSTICK Y:-255 to 255
          if ( abs(y) < 100 ){ x = x * 2;} // Operability of x 
         motor();                          // move motor
      }
  } 
  battery_level();                         // battery check
}

moio , M5Stack , M5 Wheel Module , RCWController , wifi , UDP ,

Written by macsbug

8月 26, 2019 @ 6:00 pm

カテゴリー: M5STACK

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。