ミニ四駆の改良と基礎的なプログラミングに挑戦する
FULLERミニ四駆 プログラム編
次のプログラムがFULLERミニ四駆に搭載されているものです。このプログラムは筆者のGithubのリポジトリ mini4w_motor_driveで公開されています。
/** * ピンの指定 */ const int FORWARD_PIN = 5; const int BACKWARD_PIN = 6; /** * コマンドの定義 */ const char FORWARD = 'F'; const char BACKWARD = 'B'; const char ERROR_SIGNAL = 'E'; /** * スピードの調整パラメータ */ const int MIN_SPEED = 0; const int MAX_SPEED = 9; const int STOP_SPEED = 0; const int SPEED_WEIGHT = 25; /** * コマンドを保持する変数 */ int incommingSignal; char lastSignal; boolean mini4wdDirection = true; void setup() { Serial.begin(115200); pinMode(FORWARD_PIN, OUTPUT); pinMode(BACKWARD_PIN, OUTPUT); } void loop() { if (Serial.available() > 0) { char incommingSignal = Serial.read(); if (String(incommingSignal).length() == 1) { switch (incommingSignal) { case FORWARD: case BACKWARD: lastSignal = incommingSignal; # FORWARDかBACKWARDだった場合、コマンドを保存して、次のスピードパラメータが来るのを待つ break; default: int mini4wdSpeed = incommingSignal - 48; if ((lastSignal == FORWARD || lastSignal == BACKWARD) && mini4wdSpeed >= MIN_SPEED && mini4wdSpeed <= MAX_SPEED) { # FOWARDかBACKWARD以外で、かつ数値が渡された場合、incommingSignalの方向に従ってモーターを駆動させる if (goDirection(lastSignal, mini4wdSpeed)) { String returnValue = String(lastSignal) + String(mini4wdSpeed); Serial.println(returnValue); } } else { lastSignal = ERROR_SIGNAL; } break; } } } delay(10); } boolean goDirection(char mini4wdDirection, int mini4wdSpeed) { int mini4wdSpeedWithWeight = mini4wdSpeed * SPEED_WEIGHT; switch (mini4wdDirection) { case FORWARD: analogWrite(FORWARD_PIN, mini4wdSpeedWithWeight); analogWrite(BACKWARD_PIN, STOP_SPEED); break; case BACKWARD: analogWrite(BACKWARD_PIN, mini4wdSpeedWithWeight); analogWrite(FORWARD_PIN, STOP_SPEED); break; } return true; }
FULLERミニ四駆は、前進、後退の他に速度制御を行うことができます。停止のコマンドは用意していないのですが、これは速度を0にすることで対応できるからです。
速度制御にはPWMという信号を使っています。PWMは簡単に言ってしまうと、擬似的に電圧の高さを制御する技術です。
* PWM
ArduinoではPWMを送ることが出来るピンが決まっています。
>> PWM: 3, 5, 6, 9, 10, and 11. Provide 8-bit PWM output with the analogWrite() function. (Arduino Pro Mini より)
PWM信号を送る際にはanalogWrite関数を使用します。
analogWrite([ピン番号], [0-255の数値]) # 第2引数を大きくすれば、電圧が上がる
今回製作したミニ四駆にもこのPWM信号を使うことができます。5Vにセットされている制御ピンをPWM信号に置き換えます。
/** * ピンの定義 * * signal1とsignal2で使用するピンに名前を付ける。 */ const int SIGNAL1_1 = 4; const int SIGNAL1_2 = 5; const int SIGNAL2_1 = 2; const int SIGNAL2_2 = 3; /** * 転送速度の定義 */ const int SERIAL_TRANS = 115200; /** * 速度の設定 * * 0-255の値を指定する */ const int SPEED = 100; /** * setup関数 * * シリアル通信を使うため、初期化する。 * モーターの制御に使用するピンをOUTPUTに指定する。 */ void setup() { Serial.begin(SERIAL_TRANS); pinMode(SIGNAL2_1, OUTPUT); pinMode(SIGNAL2_1, OUTPUT); pinMode(SIGNAL1_1, OUTPUT); pinMode(SIGNAL1_2, OUTPUT); } /** * signal1関数 * * モーターの制御をわかりやすくするため、シグナル関数を用意する。 * signal1関数とsignal2関数を使って、モーターの正転、逆転、停止を制御する。 * * signal1関数とsignal2関数に同時に1を渡すと、FETモジュールが壊れるので注意する。 */ void signal1(int value) { switch (value) { case 0: digitalWrite(SIGNAL1_1, HIGH); digitalWrite(SIGNAL1_2, LOW); break; case 1: digitalWrite(SIGNAL1_1, LOW); analogWrite(SIGNAL1_2, SPEED); # ここをanalogWriteに変更 break; } } /** * signal2関数 * * モーターの制御をわかりやすくするため、シグナル関数を用意する。 * signal1関数とsignal2関数を使って、モーターの正転、逆転、停止を制御する。 * * signal1関数とsignal2関数に同時に1を渡すと、FETモジュールが壊れるので注意する。 */ void signal2(int value) { switch (value) { case 0: digitalWrite(SIGNAL2_1, HIGH); digitalWrite(SIGNAL2_2, LOW); break; case 1: digitalWrite(SIGNAL2_1, LOW); analogWrite(SIGNAL2_2, SPEED); # ここをanalogWriteに変更 break; } } /** * stop関数 * * 停止コマンドが来た場合のステータスの変更を行う。 */ void stop() { signal1(0); signal2(0); } /** * forward関数 * * 前進コマンドが来た場合のステータスの変更を行う。 */ void forward() { signal1(1); signal2(0); } /** * back関数 * * 後退コマンドが来た場合のステータスの変更を行う。 */ void back() { signal1(0); signal2(1); } /** * loop関数 * * コマンドを受け取り、forward / back / stop のいずれかの適切な関数を呼ぶ。 */ void loop() { if (Serial.available() > 0) { char c = Serial.read(); if (c == 'f') { forward(); } else if (c == 'b') { back(); } else if (c == 's') { stop(); } } }
定数SPEEDを変更することで、モーターの速度を変化させることができます。このサンプルはBluetooth経由でスピードを制御するプログラムではありません。自身でコマンドを定義し、Bluetooth経由で速度制御できるようにしてみてください。
別のアイデアですが、ミニ四駆を急停止することもできます。停止コマンドに一定時間の逆転を加えるのですが、このように制御することで、単にモーターの回転を止めるよりも、ミニ四駆を素早く停止させることができます。サンプルプログラムは載せませんので、課題のつもりで試してみてください。