M5StickCでモーターを回す ~ TA7291Pを使う
今まで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>
const uint8_t motor0 = 0 ; // PWM GPIO 0
int diff = 1;
int isStart = 0 ;
void setup() {
// put your setup code here, to run once:
m5.begin();
pinMode(motor0, OUTPUT);
// チャネルと周波数、段階を設定
ledcSetup(0, 12800, 8); // 8bitで256段階になる
// motor0をチャネル0へ接続
ledcAttachPin(motor0, 0);
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(3, 3);
M5.Lcd.setTextColor(GREEN);
M5.Lcd.println("Ready!");
}
void loop() {
// put your main code here, to run repeatedly:
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を使えば、少しは変わるでしょうか。
今後もテストしていきます。