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