arduino NANO による赤外線コントロールカー

 赤外線リモコンによる制御を試したくて、ロボットかーのコントロールを試してみた。条件は以下のとおり。
 
  1. ロボットカー本体はこれまで色々試してきた田宮のキャタピラーベース車に台を付けたもの。、モーターコントロールは東芝のTA7291を2個使用
  2. リモコンは osoyooの ラズパイスターターキットにはいっていたものを使用
  3. CPUはarduino NANO を使用
  4. 車の電源は単三電池四本を使用(実は空気電池四本計5.2V)


 操作は、前進ボタン(2)で1秒間前進、後退ボタン(8)で1秒間後退、左右ボタン(4と6)で0.5秒間)動いた後停止する。
さらに動かしたい場合は再度ボタンを押す。リモコンは押し続けても信号の連続送出はしないため、連続操作は出来ない。必ず一操作後停止する。

 Programは以下の通りである。


#include "configuration-Ver2.h"
#include 
int For = 16718055; //2
int Left = 16716015; //4
int Right = 16734885; //6
int Back = 16730805;  //8

int RECV_PIN = 6;

IRrecv irrecv(RECV_PIN);
decode_results results;

void go_Advance()  //Forward
{
  digitalWrite(dir1PinL, HIGH);
  digitalWrite(dir2PinL,LOW);
  digitalWrite(dir1PinR,HIGH);
  digitalWrite(dir2PinR,LOW);
}
void go_Left()  //Turn left
{
  digitalWrite(dir1PinL, HIGH);
  digitalWrite(dir2PinL,LOW);
  digitalWrite(dir1PinR,LOW);
  digitalWrite(dir2PinR,HIGH);
}
void go_Right()  //Turn right
{
  digitalWrite(dir1PinL, LOW);
  digitalWrite(dir2PinL,HIGH);
  digitalWrite(dir1PinR,HIGH);
  digitalWrite(dir2PinR,LOW);
}
void go_Back()  //Reverse
{
  digitalWrite(dir1PinL, LOW);
  digitalWrite(dir2PinL,HIGH);
  digitalWrite(dir1PinR,LOW);
  digitalWrite(dir2PinR,HIGH);
}
void stop_Stop()    //Stop
{
  digitalWrite(dir1PinL, LOW);
  digitalWrite(dir2PinL,LOW);
  digitalWrite(dir1PinR,LOW);
  digitalWrite(dir2PinR,LOW);
}


void setup()
{
  Serial.begin(115200);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
 /* pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW); */
}


void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value) {
      case 16718055: 
        go_Advance();   // turn the LED on (HIGH is the voltage level)
        delay(1000);                       // wait for a second
        stop_Stop(); 
        break;
      case 16716015:
        go_Left();   // turn the LED on (HIGH is the voltage level)
        delay(500);                       // wait for a second
        stop_Stop(); 
        break;
      case 16734885:
        go_Right() ;   // turn the LED on (HIGH is the voltage level)
        delay(500);                       // wait for a second
        stop_Stop(); 
        break;
      case 16730805:
        go_Back();   // turn the LED on (HIGH is the voltage level)
        delay(1000);                       // wait for a second
        stop_Stop(); 
        break;
   
    }

    irrecv.resume(); // Receive the next value
  }
  delay(100);
}
------------------------------------------------------------------------------------

configuration-Ver2.h 今回使っていない定義も入っている。
/*Declare L298N Dual H-Bridge Motor Controller directly since there is not a library to load.*/
//Define L298N Dual H-Bridge Motor Controller Pins
#define dir1PinL  12    //Motor direction
#define dir2PinL  11    //Motor direction
//#define speedPinL 6    // Needs to be a PWM pin to be able to control motor speed

#define dir1PinR  10    //Motor direction
#define dir2PinR  9   //Motor direction
#define dirRIFor  2 //remocon number 2
#define dirRILeft 3 //remocon number 4
#define dirRIRight  4    //remocon number 6
#define dirRIBack  5   //remocon number 8

#define SPEED  150     //both sides of the motor speed
int leftscanval, centerscanval, rightscanval, ldiagonalscanval, rdiagonalscanval;
const int distancelimit = 30; //distance limit for obstacles in front           
const int sidedistancelimit = 30; //minimum distance in cm to obstacles at both sides (the car will allow a shorter distance sideways)
int distance;
int numcycles = 0;
const int turntime = 800; //Time the robot spends turning (miliseconds)
int thereis;
#define BARRIER 30 // 障害物までの距離
#define BARRIER1 10 // 障害物までの距離(至近距離)

// 移動時間の定義
#define T_MOVE 500
//#define T_MOVE 1000
#define T_BACK 300
#define T_LEFT 300 // 左へ90度回転
#define T_RIGHT 300 // 右へ90度回転
#define DELAY 10
#define T_STOP 300
#define OK 0
#define NG 1