스마트 폰의 가속도 센서를 사용하여 무선 제어

13083 단어 BlynkM5StickCESP32

소개



이전에 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 사이에서 변화해 그렇게.





    움직임



    이런 느낌.



    결론



    세세한 외형이나 구부러지는 방향이라든지 변경하려고 하면, 미조정+디버그에 시간이 걸린다.
    나름대로, 힘들었지만, 만족할 수 있었다.

    다음은, 센서 점화하는가, 타이어를 졸업하는가? 어쨌든.

    좋은 웹페이지 즐겨찾기