M5Stack의 Joystick에서 WHILL Model CR을 움직여 보았습니다.
소개
이 기사는 WHILL Advent Calendar 2018의 15 일째 기사입니다.
지난번처럼 좋아하는 M5Stack에서 WHILL을 움직여 본 시리즈입니다.
마지막 기사는 여기
M5Stack에서 WHILL Model CR의 전원을 ON/OFF해 보았다
이번에는 Joystick module에서 Model CR을 움직여 보겠습니다.
접속 방법이나 Model CR Arduino SDK (esp32) 의 사용 방법은 마지막 기사 를 참조해 주십시오.
주의점
이번 기사는 실제로 기체를 주행시키는 것이 됩니다.
Model CR은 사람도 탈 수 있는 이동성이므로 잘못된 조작으로 부상이나 물손상이 발생할 수 있습니다.
실제로 실시하는 경우는 자기 책임이며, 사고 등에 충분히 주의해 가 주세요.
위험하다고 생각하면,
- 전원 OFF
- 배터리 빼기
- RS232C 케이블 분리
- 기체를 들어 올려 뒷바퀴를 띄우십시오.
등 즉시 대응하십시오.
또, 최초의 시험으로 움직일 때는, 후륜을 띄운 상태로 실험하는 것이 추천입니다.
준비하는 것
이번 기사는 실제로 기체를 주행시키는 것이 됩니다.
Model CR은 사람도 탈 수 있는 이동성이므로 잘못된 조작으로 부상이나 물손상이 발생할 수 있습니다.
실제로 실시하는 경우는 자기 책임이며, 사고 등에 충분히 주의해 가 주세요.
위험하다고 생각하면,
- 전원 OFF
- 배터리 빼기
- RS232C 케이블 분리
- 기체를 들어 올려 뒷바퀴를 띄우십시오.
등 즉시 대응하십시오.
또, 최초의 시험으로 움직일 때는, 후륜을 띄운 상태로 실험하는 것이 추천입니다.
준비하는 것
comm module은 Joystick를 연결하는 데 유용합니다. 그렇지 않으면 I2C 포트에 연결하면 사용할 수 있습니다.
연결하면 이렇게 됩니다.
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도 할 수 있도록 했습니다.
실제로 움직이고 있는 모습입니다.
타면서 찍었기 때문에 계속 보고 있으면 취하기 때문에 주의.
M5Stack의 joystick module에서 WHILL Model CR을 움직여 보았다. #M5Stack #WHILL 피 c. 라고 r. 코 m / 이 gma d2 우지 8 — Katsushun89 (@katsushun89) 2018년 12월 14일
#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가 잡히는 곳이 가끔 중심으로 돌아오지 않기 때문에 조금 무서웠습니다. (웃음)
마지막으로
마지막으로 M5Stack에서 Model CR을 움직여 보았습니다.
SDK가 준비되어 있기 때문에 움직이는 것도 꽤 간단하게 할 수 있었습니다.
코드도 첨부한 것+SDK뿐입니다.
꼭 시도해보십시오.
Reference
이 문제에 관하여(M5Stack의 Joystick에서 WHILL Model CR을 움직여 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/KatsuShun89/items/5d18ba24622d3536520a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)