TVの赤外線リモコンを用いた制御のためのArduinoスケッチです。

#define LdirectionA 2 // 1st bit of direction of the left tire// INPUT1
#define LdirectionB 3 // 2nd bit of direction of the left tire// INPUT2
#define Lspeed 9  // Speed of left tire, analog write only 5,6,9,10,11 //Ain

// right tire
#define RdirectionA 4 // 1st bit of direction of the right tire//INPUT1
#define RdirectionB 5 // 2nd bit of direction of the right tire//INPUT2
#define Rspeed 10 // Speed of left tire, analog write only 5,6,9,10,11//Ain

// sensors
#define Lsensor 0 // sensor for tire analog in
#define Rsensor 1 // sensor for tire analog in
#define Fsensor 2 // sensor for tire /analog in

#define Vin 8// sensor for tire /analog in

boolean IR=LOW; 
unsigned long timeIR=0;
byte ReceiveA=B00000000;  // 8bitの情報
byte Receive[4]={B00000000,B00000000,B00000000,B00000000};  // 8bitの情報
unsigned int ReceiveNo[4]={0,0,0,0};
unsigned int CheckReceive=0;
unsigned int CommandA=0; //最終的なコマンド
unsigned int CommandAold=0; //最終的なコマンド
unsigned int i=0;
unsigned int j=0;

unsigned int Lrpm=150;  //0 to 255  //左タイヤの速度
unsigned int Rrpm=150; //0 to 255  //右タイヤの速度
unsigned long timeC=0;
unsigned long dt=500; //dt=0.1 msec


void DecideMotion(){
  switch(CommandA){
  case 88: Lrpm=Lrpm+10; Rrpm=Rrpm+10; analogWrite(Lspeed,Lrpm); analogWrite(Rspeed,Rrpm); break; //speed up
  case 120:Lrpm=Lrpm-10; Rrpm=Rrpm-10; analogWrite(Lspeed,Lrpm); analogWrite(Rspeed,Rrpm); break; //speed down
  case 124: PORTD=PORTD & = B00000011; delay(5); PORTD= PORTD |= B00101000;delay(dt); break; //go forward
  case 250: PORTD=PORTD &= B00000011; delay(5); PORTD= PORTD |= B00011000;delay(dt); break; //turn left
  case 218: PORTD=PORTD &= B00000011; delay(5); PORTD= PORTD |= B00100100;delay(dt); break; //turn right
  case 252: PORTD=PORTD &= B00000011; delay(5); PORTD= PORTD |= B00010100;delay(dt); break; //go backward
  case 188: PORTD=PORTD &= B00000011; delay(5); break; // stop
  }
  CommandAold=CommandA;
}

void setup()   {               
  i=0;
  j=0;
pinMode(Vin, INPUT);
pinMode(LdirectionA, OUTPUT);
pinMode(LdirectionB, OUTPUT);
pinMode(RdirectionA, OUTPUT);
pinMode(RdirectionB, OUTPUT);
pinMode(Lspeed, OUTPUT);
pinMode(Rspeed, OUTPUT);
analogWrite(Lspeed,Lrpm);
analogWrite(Rspeed,Rrpm);
DDRD=DDRD | B00111100;
Serial.begin(115200); //シリアル通信の開始  
}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop(){ //プログラム本体(ずっと繰り返す。)
  IR=digitalRead(Vin); // 11番ピンを読んでHIGHまたはLOWをIRに代入。ここに赤外線センサーを接続
   delayMicroseconds(300); //300usec待つ。
  if(IR<digitalRead(Vin)){
    timeC=micros()-timeIR;
    if(timeC> =20000){j=0;i=0;ReceiveA=B00000000;} //しばらく信号が無ければ読み直し
      else if(timeC>9000){ReceiveA=B00000000;}  //9msec
      else if((timeC)>1700){ReceiveA=((ReceiveA< <1) | 1); i++;Serial.print(1);} //1700 usec
      else{ReceiveA=ReceiveA< <1;i++;Serial.print(0);}
    timeIR=micros();
 } //IRがoffからonになったタイミング
 if(i>=8){i=0;j++;ReceiveNo[j]=(int) ReceiveA; ReceiveA=0; // 
   if(j>=4){j=0;i=0;ReceiveA=0;CheckReceive=ReceiveNo[3]+ReceiveNo[4];
     if(CheckReceive==255){
       CommandA=ReceiveNo[3];CheckReceive=0;Serial.println(CommandA);Serial.println("OK");
        if(CommandA!=CommandAold){
        DecideMotion();  //動き方を決定
      } 
     }
    }
 }
}

戸田よろず研究所トップページへ

ここで公開するアイデア/装置は安全性を保障しておりません。 用途に応じた設計を行い、十分な安全検査を行ってからご利用ください。 本サイトの情報の営利目的での利用はご遠慮ください。 本サイトの内容の無断転載を禁じます。© 2010 TYK