M5Atom을 PlatformIO로 이동 - 라이브러리 설치에서 가속도 획득까지

M5Atom을 PlatformIO로 이동 - 라이브러리 설치에서 가속도 획득까지

2022-10-06 last update

14 minutes reading PlatformIO M5Atom Arduino M5StickC ESP32

우치에도 M5Atom이 도착했습니다!



M5AtomMatrix


옆의 버튼은 리셋 버튼으로, 이른바 버튼은 화면 누름이군요. 호.
덧붙여서 버튼은 뒷면을 눌러도 작동하는 것 같습니다.

조만간 PlatformIO로 시험해 보았는데, M5StickC를 지정해 빌드가 통과했습니다.

platformio.ini
[env:m5stick-c]
platform = espressif32
board = m5stick-c
framework = arduino
monitor_speed = 115200

라이브러리 설치



게다가 여기 에 공식 라이브러리의 초기 버젼이 오르고 있었으므로, 이쪽도 시도해 보았습니다.


PlatformIO 명령 행 (맨 오른쪽 [>])을 열고
platformio lib install 3113

를 입력하면 M5Atom 라이브러리가 설치됩니다.
현재 라이브러리 버전은 0.0.1

FastLED 라이브러리 설치



그대로 빌드하면 오류가 발생했습니다. 분명히 FaltLED 라이브러리가 필요한 것 같습니다.
게다가 자신의 환경이라고 최신판(3.3.3)으로 빌드하면 에러가 되었습니다.
PlatformIO>Libraries에서 라이브러리 화면으로 이동하여 FastLED를 선택한 후 3.2.10을 선택하여 설치하면 빌드가 통과하게 되었습니다.

[정정] 빌드 에러는 Adafruit_Neopixel 라이브러리와 FastLED 라이브러리를 #if로 전환하려고 했기 때문이었습니다. #if 문제는 여기 페이지에서와 같이

platformio.ini(part)
lib_ignore = RF24_STM32

추가로 피할 수있었습니다 (Mac 만?)



가속도 획득



샘플의 동작도 확인할 수 있었으므로, 다음에 샘플에 손을 가해 가속도를 취해 보겠습니다.

main.cpp
#include "M5Atom.h"
#define SIG_MAX (4096)

extern const unsigned char AtomImageData[375 + 2];

uint8_t DisBuff[2 + 5 * 5 * 3];
int16_t adX,adY,adZ;

void setBuffP(uint8_t posData, uint8_t Rdata, uint8_t Gdata, uint8_t Bdata)
{
    DisBuff[2 + posData * 3 + 0] = Rdata;
    DisBuff[2 + posData * 3 + 1] = Gdata;
    DisBuff[2 + posData * 3 + 2] = Bdata;
}
void setBuff(uint8_t Rdata, uint8_t Gdata, uint8_t Bdata)
{
    for (uint8_t i = 0; i < 25; i++)
        setBuffP(i, Rdata, Gdata, Bdata);
}
void shftBuff()
{
    for (uint8_t i = 24; i > 0; i--)
    {
        for (uint8_t j = 0; j < 3; j++)
            DisBuff[2 + i * 3 + j] = DisBuff[2 + (i-1) * 3 + j];
    }
}

void setup()
{
    DisBuff[0] = 0x05;
    DisBuff[1] = 0x05;
    M5.begin(false, true, true);
    delay(10);
    M5.IMU.Init();
    setBuff(0x20, 0x20, 0x20);
    M5.dis.displaybuff(DisBuff);
}

void loop()
{
    M5.update();
    if (M5.Btn.read()==0)
    {
        M5.IMU.getAccelAdc(&adX, &adY, &adZ);
        int r = min(max((int)map(adX,-SIG_MAX,SIG_MAX,0,255),0),255);
        int g = min(max((int)map(adY,-SIG_MAX,SIG_MAX,0,255),0),255);
        int b = min(max((int)map(adZ,-SIG_MAX,SIG_MAX,0,255),0),255);
        shftBuff();
        setBuffP(0,r,g,b);
        M5.dis.displaybuff(DisBuff);
    }
    delay(20);
}

이것으로 기울기에 따라 LED가 빛나게 된다고 생각합니다.
동영상


일단 간단하게 보충해 둡니다.
    M5.begin(false, true, true);

인수는 왼쪽에서 Serial,I2C,Display(LED Matrix)의 유효/무효 플래그입니다.
Serial 을 true 로 하면(자) Serial.println() 등을 사용할 수 있게 됩니다.
또, I2C를 유효하게 해도 가속도 센서는 초기화되지 않기 때문에(Wire.begin()가 불릴 뿐),
    M5.IMU.Init();

추가로 호출합니다.
IMU에는 이런 식으로 함수가 준비되어 있습니다.

MPU6886.h(part)
       :
    public:
      MPU6886();
      int Init(void);
      void getAccelAdc(int16_t* ax, int16_t* ay, int16_t* az);
      void getGyroAdc(int16_t* gx, int16_t* gy, int16_t* gz);
      void getTempAdc(int16_t *t);

      void getAccelData(float* ax, float* ay, float* az);
      void getGyroData(float* gx, float* gy, float* gz);
      void getTempData(float *t);

      void SetGyroFsr(Gscale scale);
      void SetAccelFsr(Ascale scale);

      void getAhrsData(float *pitch,float *roll,float *yaw);
       :

버튼은

Button.h(part)
       :
  public:
    uint8_t read();
    uint8_t isPressed();
    uint8_t isReleased();
    uint8_t wasPressed();
    uint8_t wasReleased();
    uint8_t pressedFor(uint32_t ms);
    uint8_t releasedFor(uint32_t ms);
    uint8_t wasReleasefor(uint32_t ms);
    uint32_t lastChange();
       :

등이 준비되어 있습니다.
    if (M5.Btn.read()==0)

는 ```누름시가 1, 떨어진 때가 0입니다.

Wi-Fi 등의 기능도 시도했습니다. 가 M5StickC 그대로 빌드에서 작동했습니다.
그 밖에도 여러가지 놀 수 있을 것 같습니다!