※本ページはプロモーションが含まれています。
はじめに
前回は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
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--;
delay(500);
}
M5.Lcd.setCursor(5, 5);
M5.Lcd.clear(BLACK);
M5.Lcd.println(x);
}
}
上のようなスケッチをM5StackにUploadして、3回ほどボタンAを押してみてください。M5Stackの画面に表示されている数値も変わっていることが確認できたら、ボタンCを押してみてください。ボタンAを押した回数だけ、つまり今回の場合であれば3回だけ逆回転するはずです。M5Stackの画面にも 0 が表示されるはずです。今回のスケッチではわかりやすいように逆回転1回ごとに0.5秒(500マイクロ秒)だけdelay()させていますが、それ以上の意味はありません。
筆者はボタンの押し方をいろいろと試してみて正常に動作することは確認していますが、未確認のエラーが存在しているかもしれません。もし見つけた方があればコメント等でお教えいただけるととても嬉しいです。なお、このスケッチの使用したことによって不利益が生じても筆者は責任を負えないので、よく確認した上でご使用ください。
ボタンの使い方なんて忘れたという方はこちらの記事に書いてあります。とても簡単です!
最後に
今回は前回内容に加えて、初期位置に戻る機能をボタンCに付与してみました。考え方自体は簡単ですが、考えた通りに動いた時の達成感はなんとも言えないですね!
それでは今回はこの辺りで終わりにします。また次回をお楽しみに!
おすすめの書籍
もっと詳しくM5Stackについて知りたい!という方はこちらの書籍がおすすめです。とても詳しく載っていてわかりやすいです。
とりあえず何か作ってみたい!という方にはこちらの書籍がおすすめです。書いてある通りにやるだけでお手軽にIoTデバイスを作ることができます。
※Amazonのアソシエイトとして、当メディア(Nラボ備忘録)は適格販売により収入を得ています。
他記事のご紹介
当ブログではさまざまな記事を投稿しています。最近はExcelに関する記事を投稿しています。便利な小技をたくさん紹介しているので、ぜひご覧ください!
コメント