[HOW TO - GUIDA] Remote Control (Controllo Remoto) Arduino

Salve a tutti, mentre girovagavo per il web ho notato qualcosa di strano, ma a parer mio, bellissimo. Oggi vi spiegherò dunque come controllare a distanza il vostro robottino o qualsiasi altro progetto =D
Vi dico subito che la guida non è mia, è riportata su un altro sito di cui non ho intenzione di fare pubblicità, ma data l'importanza vi riporto, in italiano, la spiegazione.

Iniziamo con i componenti:
a) Arduino UNO / Duemilanove
b) x1 Ricevitore IR
c) Avrete anche bisogno di un telecomando come QUESTO
d) 1x resistenza da 220 ohm
e) 1x Buzzer
f) BreadBoard (naturalmente xD)
g) Cavetti

Iniziamo con l'assemblaggio del circuito:

Il circuito come potete vedere non richiede molto impegno, nè economico, nè di componenti =D
Adesso si passa alla programmazione del ricevitore -> Si ricorda che il codice seguente è stato scritto per quel telecomando.

#define BUZZER 10 //Indica che il Buzzer è nel Pin Digitale 10
#define LED_RED 11 //Indica che il LED Rosso è nel Pin Digitale 11
#define IR_IN  8  //Indica che il Sensore ad Infrarossi è nel Pin Digitale 8

int Pulse_Width=0;
int  ir_code=0x00;

void timer1_init(void)//Inizializziamo un timer che ci permetterà di ricevere i segnali dei tasti del telecomando periodicamente
{
  TCCR1A = 0X00; 
  TCCR1B = 0X05; 
  TCCR1C = 0X00;
  TCNT1 = 0X00;
  TIMSK1 = 0X00;	
}
void remote_deal(void)// Da il comando al sensore
{ 
  switch(ir_code)
  {
  case 0xff00://Se premi il pulsante STOP del telecomando
    digitalWrite(LED_RED,LOW);//Spegni il led rosso
    digitalWrite(BUZZER,LOW);//Buzzer silenzioso
    break;
  case 0xfe01://Press VOL+ button
    digitalWrite(LED_RED,HIGH);//Spegni il led rosso
    break;
  case 0xf609://Press VOL- button
    digitalWrite(BUZZER,HIGH);//Attivi il Buzzer
    break;
  }
}

//Le seguenti 2 funzioni non sono altro che delle funzioni per l'interfaccia del telecomando al sensore
char logic_value()
{
  while(!(digitalRead(8)));
  Pulse_Width=TCNT1;
  TCNT1=0;
  if(Pulse_Width>=7&&Pulse_Width<=10)
  {
    while(digitalRead(8));
    Pulse_Width=TCNT1;
    TCNT1=0;
    if(Pulse_Width>=7&&Pulse_Width<=10)
      return 0;
    else if(Pulse_Width>=25&&Pulse_Width<=27) 
      return 1;
  }
  return -1;
}

void pulse_deal()
{
  int i;
  
  for(i=0; i<8; i++)
  {
    if(logic_value() != 0) 
        return;
  }
  
  for(i=0; i<6; i++)
  {
    if(logic_value()!= 1) 
        return;
  }
  
  if(logic_value()!= 0)
      return;
  
  if(logic_value()!= 1) 
      return;


  //Codice per la decodifica del telecomando
  ir_code=0x00;//Nessun tasto
  for(i=0; i<16;i++ )
  {
    if(logic_value() == 1)
    {
      ir_code |=(1<<i);
    }
  }
}
void remote_decode(void)//Funzione per la decodifica
{
  TCNT1=0X00;       
  while(digitalRead(8))
  {
    if(TCNT1>=1563)  //Indica che nessun pulsante, nell'arco di 100ms è stato premuto
    {
      ir_code = 0xff00;
      return;
    }  
  }

  
  TCNT1=0X00;

  while(!(digitalRead(8))); 
  Pulse_Width=TCNT1;
  TCNT1=0;
  if(Pulse_Width>=140&&Pulse_Width<=141)//9ms
  {

    while(digitalRead(8));
    Pulse_Width=TCNT1;
    TCNT1=0;
    if(Pulse_Width>=68&&Pulse_Width<=72)//4.5ms
    {
      pulse_deal();
      return;
    }
    else if(Pulse_Width>=34&&Pulse_Width<=36)//2.25ms
    {
      while(!(digitalRead(8)));
      Pulse_Width=TCNT1;
      TCNT1=0;
      if(Pulse_Width>=7&&Pulse_Width<=10)//560us
      {
        return; 
      }
    }
  }
}
void setup()
{
  unsigned char i;
  pinMode(LED_RED,OUTPUT);//Setto il led come output
  pinMode(BUZZER,OUTPUT);//lo stesso faccio per il buzzer
  pinMode(IR_IN,INPUT);//Il sensore sarà di input
}
void loop()
{  
  timer1_init();
  while(1)
  {
    remote_decode();  
    remote_deal();  
  }  
}

QUI trovate il risultato =D

Enjoy! =P

Ottimo, grazie di aver condiviso questa idea.