M5StickCでモーターを回す ~ TA7291Pを使う

2020年9月16日

今までRaspberry Pi(ラズベリーパイ)でモーターを制御してきましたが、Raspberry Piに適した電源の用意が難しいことと、電源とRaspberry Piを接続するケーブルも必要となり、入念な準備が必要な状況です。

そこでM5StickCを使えば、簡単じゃないだろうかと思いました。M5StickCは、電源を自ら持っているし、PWMやGPIOのON/OFFもできます。そこで、1モーターでテストしてみました。モータードライバは、今まで同様にTA7291Pを使います。

1.M5StickCとTA7291Pとの接続

Raspberry Piとは違って、M5StickCに用意されているI/Oは限られます。I/Oについては、以下のサイトを参考にさせて頂きました。

LANG-SHIP:M5StickCのIOについて調べてみた

このように、使えるポートが限られています。今回はGROVEの方のポートは使わずに、ハットに繋がる8ピンポートのみを使用します。

接続は以下のとおりで、左がTA7291Pのピン番号で、右がM5StickCとモーターになります。

PIN1 ⇒ GND M5StickCのGNDとバッテリーの(-)が繋がる
PIN2 ⇒ モーター(+)
PIN3 ⇒ 未接続
PIN4 ⇒ GPIO0 PWM
PIN5 ⇒ M5StickCの3.3V出力に接続
PIN6 ⇒ 未接続
PIN7 ⇒ M5StickCの5Vに接続
PIN8 ⇒ バッテリー(+)
PIN9 ⇒ 未接続
PIN10 ⇒ モーター(-)

本当はGPIO26とGPIO36を使って正転と逆転を制御しようと思ったのですが、GPIO36はdigitalWrite()などが使えません。そこで、割り切って正転だけにします。しかもGPIO26を使うのも無駄なので、M5StickCの3.3V端子に繋げています。

モーターを回す電源は、USB電源から取っています。3.3Vでは自力で回ってくれないモーターなので(ノーブランドで仕様が良く分からない)5Vの電圧が必要でした。

接続写真を最初に載せましたが、Raspberry Piのテスト環境を使ったので分かりずらいかもしれません。ご了承を願います。

2.プログラムソース

#include <M5StickC.h>

#define MOTOR_ON  1
#define MOTOR_OFF 0

const uint8_t motor0 = 0 ; // PWM GPIO 0
const uint8_t  drv_in1 = 26 ; // モータードライバIN1 = GPIO 26
const uint8_t  drv_in2 = 36 ; // モータードライバIN2 = GPIO 36 // digitalWriteが使えないので放置

int diff = 1;

int isStart = 0 ;

void setup() {
  // put your setup code here, to run once:
  m5.begin();
  pinMode(motor0, OUTPUT);
  pinMode(drv_in1, OUTPUT);
  pinMode(drv_in2, OUTPUT);

  // チャネルと周波数、段階を設定
  ledcSetup(0, 12800, 8); // 8bitで256段階になる

  // motor0をチャネル0へ接続
  ledcAttachPin(motor0, 0);

  // 正転は、IN1=1 IN2=0
  digitalWrite(drv_in1, MOTOR_ON);
  // digitalWrite(drv_in2, MOTOR_OFF); 使えないので、放置。逆転しないのであれば、0でおOK

  M5.Lcd.setRotation(3);

  M5.Lcd.fillScreen(BLACK);
    
  M5.Lcd.setCursor(3, 3);
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.println("Ready!");

}

void loop() {
  static uint8_t power = 0;

  M5.update();

  // ボタンAが押されたら、出力開始
  if ( M5.BtnA.wasReleased() ) {

    isStart = 1 ;

  }  

  if (isStart) {

    // チャネル0にモーターのパワーを設定
    ledcWrite(0, power);
  
    if (power < 255) {
      power += diff;
    }

    M5.Lcd.fillScreen(BLACK);
    
    M5.Lcd.setCursor(3, 3);
    M5.Lcd.setTextColor(GREEN);
    M5.Lcd.println(power);
  
    delay(10);
  }
  
}

プログラムを起動すると、待ち状態になります。そしてHOMEボタンを押すと、PWMの出力が徐々に上がってモーターが回転します。

PWMの周波数は12800で、出力を0~255で制御します。例での出力は0から1ずつアップして、255で頭打ちになります。

3.動かしてみる

動かしてみると、HOMEボタンを押したのち、モーターが徐々に回転をし始めて、最大値で一定の回転になります。それは滑らかな動作で、Raspberry Piで制御した時よりもスムーズでした。

このように、M5StickCを使ったモーター制御は使えそうです。M5StickC自身が電源を持つので、モーターを回す電源だけを考えれば良い利点は大きいです。

しかし、GPIOに限りがある点をどうするか検討しなければなりません。 GROVEポートも有効活用しなければならないでしょう。

また、試しにモーターを回す電源もM5StickCを使ってみましたが、1分間程度しか回せません。ちょっと容量が足りないですね。小さいモーターでM5StickC plusを使えば、少しは変わるでしょうか。

今後もテストしていきます。