メリーゴーランドをつくる②
こんにちは。文理融合系女子のすしこ🍣とお茶子🍵です。
前回の記事はこちら⇒観覧車をつくる①
メリーゴーランドをつくる①
前回と同様に、スイッチを押すとメリーゴーランドの回転するというモーターのコード内容に触れていきたいと思います。
コードの内容はこちら
int mf = 2;
int mr = 4;
int mp = 3;
const int button = 16;
int val = 0;
void setup() {
Serial.begin(9600);
pinMode(mf, OUTPUT); //モーター制御ピンを出力にする
pinMode(mr, OUTPUT);
pinMode(mp, OUTPUT);
pinMode(button,INPUT);
digitalWrite(mf, LOW);
digitalWrite(mr, LOW);
}
void loop() {
int i = 0;
val = digitalRead(button);
Serial.println(val);
if (val == 1) {
digitalWrite(mf, HIGH);
digitalWrite(mr, LOW);
for (i = 0; i <= 100 ; i++) {
analogWrite(mp, i);
delay(50);
}
delay(6000);
for (i = 100 ; i > 0 ; i--) {
analogWrite(mp, i);
delay(50);
}
val = 0;
digitalWrite(mf, LOW);
digitalWrite(mr, LOW);
delay(500);
}
delay(50);
}
前半部分
(//以降の文が説明文です。実際のコードではありません)
int mf = 2;
int mr = 4;
int mp = 3;
const int button = 16;
int val = 0;
void setup() {
Serial.begin(9600);
pinMode(mf, OUTPUT); //モーター制御ピンを出力にする
pinMode(mr, OUTPUT);
pinMode(mp, OUTPUT);
pinMode(button,INPUT);
digitalWrite(mf, LOW);
digitalWrite(mr, LOW);
}
前半は初期設定。入れ物の名前を決めたり、どこに線をつなげるかなどを決めていきます。では分割して説明していきます。
int mf = 2;
int mr = 4;
int mp = 3;
モーター制御のためのピン番号を入力。これは使用するarduinoによって違いが出ます。詳しくは各々の説明書をご覧ください
上記の変数(入れ物)は今回コードの中にたくさん登場しますが、意味解説は最後のページで行っています。
const int button = 16;
int val = 0;
void setup() {
Serial.begin(9600);
constはなくてもいい。ボタンの接続位置
数字を入れるvalという変数(入れ物)をここで作っておきます
pinMode(mf, OUTPUT);
pinMode(mr, OUTPUT);
pinMode(mp, OUTPUT);
モーター制御ピン(最後のページへ)を出力(=OUTPUT)にする
pinMode(button,INPUT);
ボタンを接続した場所を入力(=INPUT)にする
digitalWrite(mf, LOW);
digitalWrite(mr, LOW);}
最初の時点ではモーターに止まっていてほしいので、DCモーターにかかる電圧を低くしてブレーキをかけておく
後半部分(こっちが具体的な指令)
void loop() {
int i = 0;
val = digitalRead(button);
Serial.println(val);
if (val == 1) {
digitalWrite(mf, HIGH);
digitalWrite(mr, LOW);
for (i = 0; i <= 100 ; i++) {
analogWrite(mp, i);
delay(50);
}
delay(6000);
for (i = 100 ; i > 0 ; i--) {
analogWrite(mp, i);
delay(50);
}
val = 0;
digitalWrite(mf, LOW);
digitalWrite(mr, LOW);
delay(500);
}
delay(50);
}
このメリーゴーランドではボタンを押せば回転スタートです。徐々に回転が速くなって、しばらく回転すれば自動で止まる設定になっています。
void loop(){動作したい内容} //ずっと繰り返し動作したいことを書く宣言int i = 0;
カウントに使う用のiという変数を作っておく。0は始まりの数字。
今はiという入れ物に0という数字は入っている状態。
val = digitalRead(button);
ボタンを押したかどうか(押すと1)をvalという変数に入れる
ここからがメリーゴーランドが徐々に早く回るようにしている内容です!!
If=もし~なら~~をするという条件文です。
シナリオ分岐するというものです。ゲームで言うなら選択肢によってハッピーエンドになったりバッドエンドになったりを作る感じですね。
今回のメリーゴーランドでは、もしvalに1が入っていたら(ボタンが押されたら)というルートとそれ以外というルートが作られています。
//以降がコードの説明です
if (val == 1) { //もしvalに1が入っていたら(ボタンが押されたら
digitalWrite(mf, HIGH); //DCモーターが回転する(最終ページの図参照)
digitalWrite(mr, LOW);
//↓回転の速さを決めていきます。
for (i = 0; i <= 100 ; i++) { //++は1ずつ足すという意味
//先にカウントのために作った変数iを0から1ずつ増えて、100になるまで{}内のことを繰り返す
analogWrite(mp, i); //回転数をiの値にする
delay(50); //0.05秒待つ(1000で1秒です)
}
delay(6000); //6秒待つ(その間モーターは100の回転数のまま回り続ける)
for (i = 100 ; i > 0 ; i--) { //--は1ずつ引くという意味
//変数iを100から1ずつ減らして、1になるまで{}内のことを繰り返す
analogWrite(mp, i); //回転数をiの値にする
delay(50); //0.05秒待つ
}
val = 0; //valの値を0にする
digitalWrite(mf, LOW); //DCモーターにかかる電圧を低くしてブレーキをかけておく
digitalWrite(mr, LOW);
delay(500); //0.5秒待つ
}
//↑分岐シナリオ終了!該当しなかった場合はイベントが起こらないよ
delay(50); //0.05秒待つ
}
少し見にくくなってしまいましたが、ざっくりとこんな内容です。
この文の中のforというのは繰り返し処理をすることを命令しています。上の内容で行くと、
1ずつ数を足すこと。足した数をiという入れ物に入れること。0.05秒待つこと。この動作を繰り返し繰り返し行ってくださいということを言っています。
だんだん自分でも何言ってるか分からなくなってきました(笑)
なんとなくここでこんなことやってるんだ~ふ~~~ん(鼻ほじ)くらいで大丈夫です!!!
さらに少し難しい話になりますが
DCモーターを動かすために、今回はPWM制御というものを使用していきます。PWM(Pulse Width Modulation)とは日本語で「パルス幅変調」といい、PWM制御はオンとオフを繰り返しきりかえることで出力される電力を制御するというものです。
DCモータは電圧ONで全速力回転,OFFで停止します。
DCモータにかける電圧を強くすれば速く回り、小さくすれば遅く回ります。
しかし電圧を自在に変化させることは大変で、それ専用の回路が必要になります。
そこでPWM制御を用いるとどのくらいの時間、電圧をHighにするかを決めて実効電圧をコントロールすることができ、断然楽です。わざわざ電圧を上げたり下げたりすることなくDCモータを制御することができます。
⇓参照はこちら
https://dotstud.io/docs/pulse-width-modulation/
DCモーターに関しては他製品を使用しているのでややこしいかもしれませんが、Arduinoの中にもサーボモーターという今回使用していない別のモーターがあるのでぜひそちらも使ってみてください。
(本当はサーボモーターでコーヒーカップを作ろうとしたのですが、工作がうまくいかず別のものにしたのはここだけの話)
長くなってしまいましたが、少しでも参考になればと思います!
スイッチョフ!!!!!!
すしこ🍣&お茶子🍵