스마트 폰의 가속도 센서를 사용하여 무선 제어
소개
이전에 M5StickC와 LEGO와 Blynk를 사용하여 라디오 컨트롤을 만들었습니다 (M5StickC Plus (ESP32)와 3D 프린터와 Blynk와 LEGO로 라디오 컨트롤했다. - Qiita
).
조작성에 어려움 + 모처럼 화면 있는데 활용할 수 없었기 때문에 조금 개선했다.
개선점은 하기 2점.
코드
M5StickC측
이런 느낌. my token
변경하면 움직일 것입니다.
가속도 센서의 방향과 움직이는 방향과 눈의 방향을 맞추는데 고생했다.
주의한 것은, 모터가 좌우 역방향에 대해 있기 때문에 양쪽 플러스라고 타이어가 한쪽은 전방향, 한쪽은 뒤 방향으로 회전해, 본체는 그 자리에서 회전하는 곳. 다소 좋다.
눈 모양은 fillRect()
로 사각형을 썼다. constrain()
로 화면의 테두리에서 튀어나오지 않게 했다.
어라, constrain()
의 반환값은, int같다. 마음대로 캐스팅 해 주시겠습니까? 아무튼 움직이고 있을까?
constrain() - Arduino Reference
LCD 주위는 여기를 참고로 했다.
M5StickC의 Display 주변 해석 | Lang-ship
m5-docs/lcd.md at master · m5stack/m5-docs
m5-docs/lcd.md at master · m5stack/m5-docs
BLE 절단시의 콜백이라도 만들 수 있을 것 같지만, 뭔가 안정되어 없을 것 같았기 때문에, 개선 희망.
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include "esp32-hal-ledc.h"
#include <M5StickCPlus.h>
char auth[] = "my token";
const int WIDTH_BIT = 10;
const int FREQ = 50;
const int LEFT_PIN = 26;
const int LEFT_CH = 2;
const int RIGHT_PIN = 25;
const int RIGHT_CH = 3;
const int OFFSET = 75;
const int GAIN = 5;
void setup()
{
Serial.begin(115200);
Serial.println("Waiting for connections...");
Blynk.setDeviceName("Blynk");
Blynk.begin(auth);
ledcSetup(LEFT_CH, FREQ, WIDTH_BIT);
ledcAttachPin(LEFT_PIN, LEFT_CH);
ledcSetup(RIGHT_CH, FREQ, WIDTH_BIT);
ledcAttachPin(RIGHT_PIN, RIGHT_CH);
M5.begin();
M5.Lcd.fillScreen(TFT_BLACK);
M5.Lcd.setRotation(1);
M5.Lcd.fillRect(30, 70, 40, 10, TFT_WHITE);
M5.Lcd.fillRect(170, 70, 40, 10, TFT_WHITE);
}
void loop()
{
Blynk.run();
}
BLYNK_WRITE(V1) {
int16_t x_axis = (int16_t) param[0].asInt();
int16_t y_axis = (int16_t) param[1].asInt();
int16_t right = - GAIN * (+ x_axis + y_axis) + OFFSET;
int16_t left = + GAIN * (+ x_axis - y_axis) + OFFSET;
ledcWrite(LEFT_CH, left);
ledcWrite(RIGHT_CH, right);
M5.Lcd.fillScreen(TFT_BLACK);
M5.Lcd.setRotation(1);
// Resolution: 135*240
const int16_t low_xlim = 0;
const int16_t upp_xlim = 239;
const int16_t low_ylim = 0;
const int16_t upp_ylim = 134;
int16_t x_position_left = constrain(35-2*y_axis, low_xlim, upp_xlim);
int16_t x_position_right = constrain(185-2*y_axis, low_xlim, upp_xlim);
int16_t y_position = constrain(60-2*x_axis, low_ylim, upp_ylim);
M5.Lcd.fillRect(x_position_left, y_position, 20, 20, TFT_WHITE);
M5.Lcd.fillRect(x_position_right, y_position, 20, 20, TFT_WHITE);
Serial.println(left);
Serial.println(right);
}
스마트폰(Blynk) 쪽
매우 간단합니다.
BLE와 GRAVITY만.
파라미터도 OUTPUT을 V1로 한 것. Z-axis도 있지만, 사용하지 않았다.
스마트폰을 수평으로 하면 X-axis와 Y-axis가 0이 된다.
전송되어 온 데이터를 보면 -10~+10 사이에서 변화해 그렇게.
움직임
이런 느낌.
결론
세세한 외형이나 구부러지는 방향이라든지 변경하려고 하면, 미조정+디버그에 시간이 걸린다.
나름대로, 힘들었지만, 만족할 수 있었다.
다음은, 센서 점화하는가, 타이어를 졸업하는가? 어쨌든.
Reference
이 문제에 관하여(스마트 폰의 가속도 센서를 사용하여 무선 제어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/optimisuke/items/35977311c9ed79010e4e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include "esp32-hal-ledc.h"
#include <M5StickCPlus.h>
char auth[] = "my token";
const int WIDTH_BIT = 10;
const int FREQ = 50;
const int LEFT_PIN = 26;
const int LEFT_CH = 2;
const int RIGHT_PIN = 25;
const int RIGHT_CH = 3;
const int OFFSET = 75;
const int GAIN = 5;
void setup()
{
Serial.begin(115200);
Serial.println("Waiting for connections...");
Blynk.setDeviceName("Blynk");
Blynk.begin(auth);
ledcSetup(LEFT_CH, FREQ, WIDTH_BIT);
ledcAttachPin(LEFT_PIN, LEFT_CH);
ledcSetup(RIGHT_CH, FREQ, WIDTH_BIT);
ledcAttachPin(RIGHT_PIN, RIGHT_CH);
M5.begin();
M5.Lcd.fillScreen(TFT_BLACK);
M5.Lcd.setRotation(1);
M5.Lcd.fillRect(30, 70, 40, 10, TFT_WHITE);
M5.Lcd.fillRect(170, 70, 40, 10, TFT_WHITE);
}
void loop()
{
Blynk.run();
}
BLYNK_WRITE(V1) {
int16_t x_axis = (int16_t) param[0].asInt();
int16_t y_axis = (int16_t) param[1].asInt();
int16_t right = - GAIN * (+ x_axis + y_axis) + OFFSET;
int16_t left = + GAIN * (+ x_axis - y_axis) + OFFSET;
ledcWrite(LEFT_CH, left);
ledcWrite(RIGHT_CH, right);
M5.Lcd.fillScreen(TFT_BLACK);
M5.Lcd.setRotation(1);
// Resolution: 135*240
const int16_t low_xlim = 0;
const int16_t upp_xlim = 239;
const int16_t low_ylim = 0;
const int16_t upp_ylim = 134;
int16_t x_position_left = constrain(35-2*y_axis, low_xlim, upp_xlim);
int16_t x_position_right = constrain(185-2*y_axis, low_xlim, upp_xlim);
int16_t y_position = constrain(60-2*x_axis, low_ylim, upp_ylim);
M5.Lcd.fillRect(x_position_left, y_position, 20, 20, TFT_WHITE);
M5.Lcd.fillRect(x_position_right, y_position, 20, 20, TFT_WHITE);
Serial.println(left);
Serial.println(right);
}
이런 느낌.
결론
세세한 외형이나 구부러지는 방향이라든지 변경하려고 하면, 미조정+디버그에 시간이 걸린다.
나름대로, 힘들었지만, 만족할 수 있었다.
다음은, 센서 점화하는가, 타이어를 졸업하는가? 어쨌든.
Reference
이 문제에 관하여(스마트 폰의 가속도 센서를 사용하여 무선 제어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/optimisuke/items/35977311c9ed79010e4e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(스마트 폰의 가속도 센서를 사용하여 무선 제어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/optimisuke/items/35977311c9ed79010e4e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)