リモートコントロール(RC)戦車をつくる【スケッチ_モータ制御】 [RC戦車]
モータドライバ回路ができたので、モータを制御するスケッチを完成させます。以前にモータの状態の代わりに3個のLEDを組み合わせて点灯・消灯させたスケッチを作ったので、それを元に編集していきます。
【スケッチ】
※#include <IRremote.h>は表示の不具合で全角<>で記載しています。本当は半角<>ですのでご注意ください。
【Tips】 ちょっとしたノウハウをまとめます。
①ピンはボードのピンヘッダでアサイン
最初、デバイスピン番号でアサインしていましたが、動作確認で挙動がおかしかったので確認していたところ、ボードのピンヘッダでアサインしてうまくいきました。ちょっと焦りました。。。
【ArduinoProMini(The Simple)ピン配置図】
②3ピンはPWM出力可能のはずだが、信号が出ない!
最初、アナログ出力(PWM)として「R_Vref = 3;」でピンアサインしたのですが、その後動作確認したところ信号が出力されていないので、5ピンに再アサインしたらOKでした。
3ピンはPWM出力可能のはずですが、出力しない原因は不明。
個体の問題なのか、互換機としてのこの製品の制限なのかなー?
#月が近いので続きもののようにみえるけど、実は1年ぶりだー( ´艸`)
【スケッチ】
/* SparkFun Electronics 2013 Playing with Infrared Remote Control IR Receiver Breakout (SEN-8554): Supply voltage of 2.5V to 5.5V Attach OUT: To pin 13 on Arduino GND: GND VCC: 5V This is based on Ken Shirriff's code found on GitHub: https://github.com/shirriff/Arduino-IRremote/ This code works with cheap remotes. If you want to look at the individual timing of the bits, use this code: http://www.arduino.cc/playground/Code/InfraredReceivers */ #include <IRremote.h> // 赤外線送受信用ヘッダファイル int RECV_PIN = 11; // 赤外線受信モジュール IRrecv irrecv(RECV_PIN); // 赤外線受信用オブジェクトの設定 decode_results results; // 赤外線受信結果を格納する #define POWER 0x10EFD827 #define A 0x10EFF807 #define B 0x10EF7887 #define C 0x10EF58A7 #define UP 0x10EFA05F #define DOWN 0x10EF00FF #define LEFT 0x10EF10EF #define RIGHT 0x10EF807F #define SELECT 0x10EF20DF #define SPEED 128 //モータへの電圧(スピード)は一定 // set pin numbers: // 右キャタピラ用ピン const int R_Vref = 5; //D5(PWM) const int R_OUT1 = 3; //D3 const int R_OUT2 = 4; //D4 // 左キャタピラ用ピン const int L_Vref = 6; //D6(PWM) const int L_OUT1 = 7; //D7 const int L_OUT2 = 8; //D8 // 初期化(電源投入/リセット時1回のみ実行): void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver // initialize the motor driver pin as an output(Arduinoにモータドライバへのピンが出力であることを伝える) pinMode(R_Vref, OUTPUT); pinMode(R_OUT1, OUTPUT); pinMode(R_OUT2, OUTPUT); pinMode(L_Vref, OUTPUT); pinMode(L_OUT1, OUTPUT); pinMode(L_OUT2, OUTPUT); // モータドライバのスピードを指定 analogWrite(R_Vref, SPEED); analogWrite(L_Vref, SPEED); } // main loop: void loop() { if (irrecv.decode(&results)) //(★これが無いと動作しない) { switch(results.value) { case UP: //UPなら前進 digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); delay(1600); //100µs待つ(貫通電流防止) digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case RIGHT: //RIGHTなら右転進 digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); delay(1600); //100µs待つ(貫通電流防止) digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case LEFT: //LEFTなら左転進 digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); delay(1600); //100µs待つ(貫通電流防止) digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case DOWN: //DOWNなら後進 digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); delay(1600); //100µs待つ(貫通電流防止) digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case SELECT: //SELECTなら停止 digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); break; default: break; } irrecv.resume(); // 受信機をリセットする(★これが無いと1回のみの制御となる) } }
※#include <IRremote.h>は表示の不具合で全角<>で記載しています。本当は半角<>ですのでご注意ください。
【Tips】 ちょっとしたノウハウをまとめます。
①ピンはボードのピンヘッダでアサイン
最初、デバイスピン番号でアサインしていましたが、動作確認で挙動がおかしかったので確認していたところ、ボードのピンヘッダでアサインしてうまくいきました。ちょっと焦りました。。。
【ArduinoProMini(The Simple)ピン配置図】
②3ピンはPWM出力可能のはずだが、信号が出ない!
最初、アナログ出力(PWM)として「R_Vref = 3;」でピンアサインしたのですが、その後動作確認したところ信号が出力されていないので、5ピンに再アサインしたらOKでした。
3ピンはPWM出力可能のはずですが、出力しない原因は不明。
個体の問題なのか、互換機としてのこの製品の制限なのかなー?
#月が近いので続きもののようにみえるけど、実は1年ぶりだー( ´艸`)