はじめに
本ページはプロモーションが含まれています。
前回はLチカについてまとめてみました。意外に奥が深い内容でした。
今回はM5Stackでモータを制御してみようと思います。難しそうですが、頑張ってやっていきましょう!
※以降はM5Stack Basic V2.6を使うことを前提に話を進めていくのでご注意を!
モータ制御に必要なもの
さて、今回モータを制御するにあたって、必要なものはM5Stackを除けば以下の3つです。
- ステッピングモータ
モータの種類はいろいろありますが、今回はステッピングモータを選びました。選んだ理由は正直なんとなくです。興味が出てくれば他の種類のモータも試そうかなと思っています。 - ステッピングモータドライバ
ドライバとはモータの駆動や制御を行うために必要なICです。ドライバがあると簡単にモータを駆動したり制御することができるので、ほぼ必須のものかと思います。 - ジャンパーワイヤー
以前紹介したものですね。M5Stackやドライバとの接続を考えて選べば良いと思います。下のようなセットのものを買うと何かと便利かなとは思いますが、何でも大丈夫です。
ステッピングモータとステッピングモータドライバのセットが売られていて、1000円前後で買えるものが多いです。筆者はスイッチサイエンス様で購入させていただきました。いつもお世話になっております。
接続方法
M5Stack、モータドライバ、モータの接続は下の画像のようにします。
M5Stack側の3、1、16、17ピンは出力できるピンなら何でも大丈夫です。どれが出力できるピンなのかわからない場合(私もわかりませんでした)は、”M5Stack ピンアサイン”などで調べればわかりやすいサイトがいくつも出てきます。私も気が向いたらまとめてみますか・・・
5V(VCC用)、5V(VM用)、Gは間違わないように注意しましょう。
モータ制御のスケッチ
それではモータ制御のスケッチを書いてみます。今回使用しているステッピングモータドライバの販売元であるSeeed Studio様のSeeed Studio Wikiというサイトを大いに参考にさせていただいています。
参考にさせていただいたサイトはこちらになります。
https://wiki.seeedstudio.com/Gear_Stepper_Motor_Driver_Pack/
スケッチはいろいろ書き方はあると思いますが、下のように書きました。
#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を設定
void setup() {
M5.begin(); //M5Stackを初期化
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() {
for (i = 10; i >= 1; i--) {
//LOW状態で励磁される
//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);
}
}
上のようなスケッチをM5StackにUploadすれば、Upload完了と同時にモータが駆動します。今回はゆっくりと回転させています。もし早くしたり遅くしたい場合は、変数 t を小さくしたり大きくしたりしてみてください。ちなみに変数 t はdelayMicrosecond()に渡すので、単位はマイクロ秒と思っておいてください。
せっかくなので今までの内容の復習がてらM5Stackのボタンを使ってモータを制御してみました。
M5Stackのボタンを使ったモータ制御
今回はボタンAとボタンBを使って、下のような制御をしてみました。
・ボタンAを押すと画面に表示した数値に +1 され、一定角度だけ時計回りにモータが回転する
・ボタンBを押すと画面に表示した数値から −1 され、一定角度だけ反時計回りにモータが回転する
・ただし、画面の数値が 0 の場合は、ボタンBを押しても反時計回りに回転せず、
”Current location is origin.”という表示がされる
・初期の画面に表示されるのは 0 とする
ボタンの使い方なんて忘れたという方はこちらの記事に書いてあります。とても簡単です!
一見難しく思えますが、ボタンの使い方さえわかれば簡単です。スケッチは下のようになります。
#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.");
}
}
}
上のようなスケッチをM5StackにUploadすると先ほどとは違い、何も起こりません。
最初はM5Stackの画面左上に緑色で 0 と表示されていると思います。
ボタンAを押してみると、モータが駆動し、M5Stack画面の数値が 1 に変わると思います。さらにボタンAを押せば、数値が 2 に変わると思います。
次にボタンBを押してみると、モータが逆回転してM5Stack画面の数値が 2 から 1 に変わると思います。さらにボタンBを押せば、数値が0に変わり”Current location is origin.”が表示されると思います。
以上がM5Stackのボタンを使ったモータの制御です。他にも工夫すれば、いろいろなことができそうですね。
最後に
今回はM5Stackでモータを制御してみました。細かい話は割愛していますが、モータ制御の基礎は学べたかなと思います。モータの制御が自由自在になれば、IoTデバイス開発にも活かせそうです。
それでは今回はこの辺りで終わりにします。また次回をお楽しみに!
おすすめの書籍
もっと詳しくM5Stackについて知りたい!という方はこちらの書籍がおすすめです。とても詳しく載っていてわかりやすいです。
とりあえず何か作ってみたい!という方にはこちらの書籍がおすすめです。書いてある通りにやるだけでお手軽にIoTデバイスを作ることができます。
※Amazonのアソシエイトとして、当メディア(Nラボ備忘録)は適格販売により収入を得ています。
他記事のご紹介
当ブログではさまざまな記事を投稿しています。IoT開発に関連する記事を紹介します。
ぜひご覧ください!
コメント