意外と簡単!M5Stackでモータを制御してみた+初期位置に戻したい【超初心者がIoT開発に挑んでみる#8+α】

IoT

※本ページはプロモーションが含まれています。

はじめに

前回はM5Stackでモータを制御してみました。思いのほか簡単にできましたね。

今回は前回の内容に+αして、初期位置に戻す機能もつけたいと思います。
モータ制御に必要なものやM5Stack、モータドライバ、モータ同士の接続方法は前回の記事を参考にしていただければと思います。

※以降はM5Stack Basic V2.6を使うことを前提に話を進めていくのでご注意を!

初期位置に戻す機能を足したスケッチ

前回の内容のスケッチに以下のようにスケッチを書き加えました。

#include <M5Stack.h>

int in1 = 3;    //M5Stackの3番のピンを指定->ドライバのIN1に接続
int in2 = 1;    //M5Stackの1番のピンを指定->ドライバのIN2に接続
int in3 = 16;   //M5Stackの16番のピンを指定->ドライバのIN3に接続
int in4 = 17;   //M5Stackの17番のピンを指定->ドライバのIN4に接続
int i = 0;      //for文用の変数i
int t = 12000;  //モータの駆動時のdelayを設定
int x = 0;      //位置(x≧0)を画面に表示する数字


void setup() {

  M5.begin();  //M5Stackを初期化
  M5.Lcd.begin();
  M5.Lcd.fillScreen(BLACK);    //画面をBLACKで塗りつぶす
  M5.Lcd.setTextColor(GREEN);  //テキストの色をGREENにする
  M5.Lcd.setCursor(5, 5);      //テキストの表示座標を指定
  M5.Lcd.println(x);           //xに代入されている数値を表示

  pinMode(in1, OUTPUT);  //3番ピン(in1)から出力
  pinMode(in2, OUTPUT);  //1番ピン(in1)から出力
  pinMode(in3, OUTPUT);  //16番ピン(in1)から出力
  pinMode(in4, OUTPUT);  //17番ピン(in1)から出力
  delay(1);              //1秒間だけdelay
}

void loop() {

  M5.update();  //ボタンの状態を更新

  //正回転
  //ボタンAが押されたら正方向に1回転する
  if (M5.BtnA.isPressed()) {
    x = x + 1;
    //LOW状態が励磁される
    for (i = 10; i >= 1; i--) {
      //IN1
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, HIGH);
      delayMicroseconds(t);
      //IN1,IN2
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, HIGH);
      delayMicroseconds(t);
      //IN2
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, HIGH);
      delayMicroseconds(t);
      //IN2,IN3
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delayMicroseconds(t);
      //IN3
      digitalWrite(in1, HIGH);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delayMicroseconds(t);
      //IN3,IN4
      digitalWrite(in1, HIGH);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      delayMicroseconds(t);
      //IN4
      digitalWrite(in1, HIGH);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      delayMicroseconds(t);
      //IN4,IN1
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      delayMicroseconds(t);
    }
    M5.Lcd.setCursor(5, 5);
    M5.Lcd.clear(BLACK);
    M5.Lcd.println(x);
  }

//これより下が新しく追加したスケッチです

  //逆回転
  //ボタンBを押したら逆方向に1回転する
  if (M5.BtnB.isPressed()) {
    //初期位置(電源を入れた時の位置)なら回転しない
    if (x > 0) {
      for (i = 10; i >= 1; i--) {
        //IN1
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, HIGH);
        delayMicroseconds(t);
        //IN4,IN1
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        delayMicroseconds(t);
        //IN4
        digitalWrite(in1, HIGH);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        delayMicroseconds(t);
        //IN3,IN4
        digitalWrite(in1, HIGH);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
        delayMicroseconds(t);
        //IN3
        digitalWrite(in1, HIGH);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, HIGH);
        delayMicroseconds(t);
        //IN2,IN3
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(in3, LOW);
        digitalWrite(in4, HIGH);
        delayMicroseconds(t);
        //IN2
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, HIGH);
        delayMicroseconds(t);
        //IN1,IN2
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, HIGH);
        delayMicroseconds(t);
      }
      x = x - 1;  //逆回転なので座標を1戻す
      M5.Lcd.setCursor(5, 5);
      M5.Lcd.clear(BLACK);
      M5.Lcd.println(x);
    } else {
      M5.Lcd.setCursor(5, 5);
      M5.Lcd.clear(BLACK);
      M5.Lcd.println(x);
      M5.Lcd.println("Current location is origin.");
    }
  }

  if (M5.BtnC.isPressed()) {
    //初期化
    //while文でx回(正回転した回数)だけ逆回転
    while (x > 0) {
      for (i = 10; i >= 1; i--) {
        //IN1
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, HIGH);
        delayMicroseconds(t);
        //IN4,IN1
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        delayMicroseconds(t);
        //IN4
        digitalWrite(in1, HIGH);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
        delayMicroseconds(t);
        //IN3,IN4
        digitalWrite(in1, HIGH);
        digitalWrite(in2, HIGH);
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
        delayMicroseconds(t);
        //IN3