制御回路のハードウェアができたので、次にスケッチに取り掛かりましょう。
戦車を動かすリモコンはこれを使います。8方向に動かすことが可能です。

オプトサプライ赤外線リモコン: バラエティグッズ 秋月電子通商-電子部品・ネット通販↗
このリモコンを使うために、ボタンに対応したコードを取得する必要があります。

サンプルスケッチからダンプファイルを使い、ボタンを押下してコードを取得していきます。

NECフォーマットでボタンに応じたコードが出力されているのがわかります。
このコードをメモしておいてスケッチに記載します。
/*
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
*/
/*******************************************************************************
モータ制御 for RC_Tank
++++++ note ++++++
・赤外線リモコン(OE13KIR)
・ARDUINO PRO MINI 5V 16MHz(62.5ns)
・Delay100µs→1,600クロック
・-「ハイフン」は使えない
・スケッチ例>IRremote>IRrecvDumpV2
で赤外線リモコン(OE13KIR)のコードを確認
*******************************************************************************/
#include <IRremote.h> // 赤外線送受信用ヘッダファイル
int RECV_PIN = 11; // 赤外線受信モジュール
IRrecv irrecv(RECV_PIN); // 赤外線受信用オブジェクトの設定
decode_results results; // 赤外線受信結果を格納する
#define POWER 0x8F71BE4
#define A 0x8F71FE0
#define B 0x8F71EE1
#define C 0x8F71AE5
#define UP 0x8F705FA
#define DOWN 0x8F700FF
#define LEFT 0x8F708F7
#define RIGHT 0x8F701FE
#define SELECT 0x8F704FB
#define UP_LEFT 0x8F78D72
#define DOWN_LEFT 0x8F78877
#define UP_RIGHT 0x8F7847B
#define DOWN_RIGHT 0x8F7817E
#define SPEED_0 0 //モータへの電圧(スピード)を3種類用意
#define SPEED_1 77
#define SPEED_2 153 //0~255(MAX):Vref電圧を3Vまでに制限
// 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);
}
// main loop:
void loop()
{
if (irrecv.decode(&results)) //(★これが無いと動作しない)
{
switch(results.value)
{
case UP: //UPなら前進
analogWrite(R_Vref, SPEED_2); // モータドライバのスピードを指定
analogWrite(L_Vref, SPEED_2);
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, HIGH);
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, HIGH);
digitalWrite(L_OUT2, LOW);
break;
case RIGHT: //RIGHTなら右超信地旋回
analogWrite(R_Vref, SPEED_2); // モータドライバのスピードを指定
analogWrite(L_Vref, SPEED_2);
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, LOW);
digitalWrite(R_OUT2, HIGH);
digitalWrite(L_OUT1, HIGH);
digitalWrite(L_OUT2, LOW);
break;
case LEFT: //LEFTなら左超信地旋回
analogWrite(R_Vref, SPEED_2); // モータドライバのスピードを指定
analogWrite(L_Vref, SPEED_2);
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, HIGH);
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, HIGH);
break;
case DOWN: //DOWNなら後進
analogWrite(R_Vref, SPEED_2); // モータドライバのスピードを指定
analogWrite(L_Vref, SPEED_2);
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, LOW);
digitalWrite(R_OUT2, HIGH);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, HIGH);
break;
case SELECT: //SELECTなら停止(ブレーキ→ストップ)
analogWrite(R_Vref, SPEED_0); // モータドライバのスピードを指定
analogWrite(L_Vref, SPEED_0);
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, HIGH); //ブレーキ
digitalWrite(R_OUT2, HIGH);
digitalWrite(L_OUT1, HIGH);
digitalWrite(L_OUT2, HIGH);
digitalWrite(R_OUT1, LOW); //ストップ
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
break;
case UP_RIGHT: //UP_RIGHTなら右前進緩旋回
analogWrite(R_Vref, SPEED_1); // 右キャタピラの速度を遅く
analogWrite(L_Vref, SPEED_2); // 左キャタピラの速度を速く
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, HIGH);
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, HIGH);
digitalWrite(L_OUT2, LOW);
break;
case DOWN_RIGHT: //DOWN_RIGHTなら右後進緩旋回
analogWrite(R_Vref, SPEED_1); // 右キャタピラの速度を遅く
analogWrite(L_Vref, SPEED_2); // 左キャタピラの速度を速く
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, LOW);
digitalWrite(R_OUT2, HIGH);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, HIGH);
break;
case UP_LEFT: //UP-LEFTなら左前進緩旋回
analogWrite(R_Vref, SPEED_2); // 右キャタピラの速度を速く
analogWrite(L_Vref, SPEED_1); // 左キャタピラの速度を遅く
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, HIGH);
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, HIGH);
digitalWrite(L_OUT2, LOW);
break;
case DOWN_LEFT: //DOWN-LEFTなら左後進緩旋回
analogWrite(R_Vref, SPEED_2); // 右キャタピラの速度を速く
analogWrite(L_Vref, SPEED_1); // 左キャタピラの速度を遅く
digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ)
digitalWrite(R_OUT2, LOW);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, LOW);
digitalWrite(R_OUT1, LOW);
digitalWrite(R_OUT2, HIGH);
digitalWrite(L_OUT1, LOW);
digitalWrite(L_OUT2, HIGH);
break;
default:
break;
}
irrecv.resume(); // 受信機をリセットする(★これが無いと1回のみの制御となる)
}
}
スケッチです。


-150x150.jpg)
コメント