Help us understand the problem. What is going on with this article?

M5StackのJoystickでWHILL Model CRを動かしてみた

More than 1 year has passed since last update.

はじめに

この記事はWHILL Advent Calendar 2018の15日目の記事です。


前回同様に、大好きなM5StackでWHILLを動かしてみたシリーズです。

前回の記事はこちら
M5StackでWHILL Model CRの電源をON/OFFしてみた

今回はJoystick moduleでModel CRを動かしてみます。
Joystick_module.jpg

接続方法やModel CR Arduino SDK(esp32)の使用方法は前回記事を参照ください。

注意点

今回の記事は実際に機体を走行させるものになります。
Model CRは人も乗れるモビリティですので、誤った操作でケガや物損する可能性があります。
実際に実施する場合は自己責任かつ、事故などに十分注意して行ってください。

もし危険だと思った際は、
- 電源OFFする
- バッテリーを抜く
- RS232Cケーブルを外す
- 機体を持ち上げて後輪を浮かせる
など即時に対応してください。

また、最初お試しで動かす際は、後輪を浮かせた状態で実験するのがオススメです。
”jack_up.jpeg"


準備するもの

  • WHILL Model CR
  • M5Stack
  • M5Stack Joystick module
  • M5Stack comm module(WANT)

comm moduleはJoystickを接続するのにあれば便利ですが、なくてもI2Cのポートに接続すれば使えます。

接続するとこのようになります。
接続.jpg

Joystick制御のコーディング

Joystick moduleのセンサー値の取得はM5Stack exampleのJoystickのコードを参考にしました。

Model CR側は、Arduino SDKのsetJoystick(joy_x, joy_y)関数を使用すれば実際に動きます。
joy_x, joy_yには-100 ~ 100の値を設定してください。
前進後進:joy_y
左右:joy_x
となります。

joystick moduleの値は中心 128程度の0 ~ 256程度の範囲を取るuint8_tの値になっていましたので、
適当に-100 ~ 100に変換します。

具体的にはコードはこのようになります。
このコードも動作補償をしたものではありませんですので、参考にされる方は自己責任でご使用ください。

M5Stack_whill_joystick_controller.ino
#include <M5Stack.h>
#include "WHILL.h"
#include "Wire.h"

#define JOY_ADDR 0x52

uint8_t x_data;
uint8_t y_data;
uint8_t button_data;
char data[100];

const uint8_t NEUTRAL = 120;
const int8_t MAX_TH = 100;
const int8_t MIN_TH = 10;

WHILL whill(&Serial2);

bool is_power_on = false;

void setup()
{
  Serial.begin(115200);
  // Power ON Stabilizing...
  delay(500);
  M5.begin();

  Wire.begin(21, 22, 400000);
}

int8_t convertJoystick(uint8_t ext_joy)
{
  int8_t conv_joy = ext_joy - NEUTRAL;

  if(conv_joy >= 0){
    if(abs(conv_joy) < MIN_TH) return 0;
    conv_joy -= MIN_TH; //offset;
    if(abs(conv_joy) >= MAX_TH) return MAX_TH;
    return conv_joy;
  }else{
    if(abs(conv_joy) < MIN_TH) return 0;
    conv_joy += MIN_TH; //offset;
    if(abs(conv_joy) >= MAX_TH) return -MAX_TH;  
    return conv_joy;
  }
}

void loop() {
  Wire.requestFrom(JOY_ADDR, 3);
  if (Wire.available()) {
    x_data = Wire.read();
    y_data = Wire.read();
    int8_t conv_y = convertJoystick(y_data);
    int8_t conv_x = convertJoystick(x_data);
    button_data = Wire.read();

    sprintf(data, "x:%d y:%d button:%d\n", conv_x, conv_y, button_data);
    Serial.print(data);

    if(button_data == 1){
      if(is_power_on){
        whill.setPower(false);
        is_power_on = false;
      }else{
        whill.setPower(true);
        is_power_on = true;
      }
    }else{
      whill.setJoystick(conv_x, conv_y);
    }
  }
   delay(10);
}

ついでに、joystick押し込むとボタンになっていたので、それで電源ON/OFFも出来るようにしました。

実際に動かしている様子です。
乗りながら撮ったからずっと見てると酔いますので注意。

Joystickが引っかかるところがあってたまに中心に戻ってこないので、ちょっと怖かったです。(笑)

最後に

前回同様にM5StackでModel CRを動かしてみました。
SDKが用意してあるので動かすのもかなり簡単に出来ました。
コードも添付したもの+SDKだけです。
是非試してみてください。

KatsuShun89
組み込みソフトウェアエンジニアからの組み込まないエンジニアへの脱皮を目指しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした