vineri, 4 februarie 2011

C1RM controlat cu o telecomanda IR

Dupa ce am imbinat unele programe folosite in post-urile anterioare si dupa ce am "rezolvat" bug-urile care au aparut din cauza incompatibilitatii librariilor, am reusit sa controlez robotul cu o telecomanda prin IR.
Telecomanda IR nu este la fel de precisa ca o telecomanda RC dar iti poti face treaba cu ea.

Am folosit 7 butoane de pe telecomanda, dintre care 2 butoane actioneaza un LED iar 5 butoane actioneaza motoarele robotului.

Am folosit:

  • IR reciver (TSOP48)
  • telecomanda IR
  • LCD Serial
  • 2 x motoare DC
  • Arduino Duemilanove
  • LED
  • L293D (punte H  pentru motoare)
Pe LCD sunt afisate operatiunile pe care le executa robotul.

Program:




 #include
 #include
 #define rxPin 9                                                        
 #define txPin 10

 int RECV_PIN = 12;
  IRrecv irrecv(RECV_PIN);

  decode_results results;
NewSoftSerial serial =  NewSoftSerial(rxPin, txPin);

const int motor1a = 2;
const int motor2a = 4;
const int motor1b = 5;
const int motor2b = 7;
const int enable1 = 3;
                  
const int ledPin = 13;
boolean val = HIGH;
int led = 8;

void setup()
{
pinMode(rxPin, INPUT);                                              
pinMode(txPin, OUTPUT);
pinMode(motor1a, OUTPUT);
pinMode(motor2a, OUTPUT);
pinMode(motor1b, OUTPUT);
pinMode(motor2b, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(enable1, HIGH);

serial.begin(9600);
 irrecv.enableIRIn();


// clipeste ledPin de 3 ori. Asta trebuie sa se intample doar 1 data.
// daca vezi ca ledul clipeste de mai multe ori inseamna ca s-a
// resetat; probabil din cauza ca motorasele sunt arse
// sau este un scurt circuit.
blink(ledPin, 3, 100);
}

void Reverse()
{
digitalWrite(enable1, HIGH);
digitalWrite(motor1a, HIGH);
digitalWrite(motor2a, LOW);
digitalWrite(motor1b, HIGH);
digitalWrite(motor2b, LOW);
}

void Forward()
{
digitalWrite(enable1, HIGH);
digitalWrite(motor1a, LOW);
digitalWrite(motor2a, HIGH);
digitalWrite(motor1b, LOW);
digitalWrite(motor2b, HIGH);
}

void Left()
{
digitalWrite(enable1, HIGH);
digitalWrite(motor1a, LOW);
digitalWrite(motor2a, HIGH);
digitalWrite(motor1b, HIGH);
digitalWrite(motor2b, LOW);
}

void Right()
{
digitalWrite(enable1, HIGH);
digitalWrite(motor1a, HIGH);
digitalWrite(motor2a, LOW);
digitalWrite(motor1b, LOW);
digitalWrite(motor2b, HIGH);
}

void Stop()
{
digitalWrite(enable1, LOW);
digitalWrite(motor1a, LOW);
digitalWrite(motor2a, LOW);
digitalWrite(motor1b, LOW);
digitalWrite(motor2b, LOW);
}

void blink(int whatPin, int howManyTimes, int milliSecs)
{
int i = 0;
for(i=0; i<=3; i++)
 {
   digitalWrite(ledPin, HIGH);
   delay(100/2);
   digitalWrite(ledPin, LOW);
   delay(100/2);
  }
serial.print("$CLEAR\n\r");                                                
serial.print("$GO 1 1\n\r");
serial.print("$PRINT Strat asteapta \n\r");                                            
serial.print("\n\r");
}

void rectsop()
{
 if (irrecv.decode(&results))
    irrecv.resume();
}

void loop()
{
  rectsop();
if(results.value==16718055)  //scrie 2
 {
 Forward();
 serial.print("$CLEAR\n\r");                                              
 serial.print("$GO 1 1\n\r");
 serial.print("$PRINT Inainte (2) \n\r");                                            
 serial.print("\n\r");
 delay(100);
 }

if(results.value==16726215)   // scrie 5
 {
 Stop();
 serial.print("$CLEAR\n\r");                                                
 serial.print("$GO 1 1\n\r");
 serial.print("$PRINT Stop (5) \n\r");                                            
 serial.print("\n\r");
 delay(100);
 }
if(results.value==16734885)  //scrie 6
{
 Right();
 serial.print("$CLEAR\n\r");                                              
 serial.print("$GO 1 1\n\r");
 serial.print("$PRINT Dreapta (6) \n\r");                                            
 serial.print("\n\r");
 delay(100);
 }

if(results.value==16716015)   // scrie 4
{
 Left();
 serial.print("$CLEAR\n\r");                                            
 serial.print("$GO 1 1\n\r");
 serial.print("$PRINT Stanga (4) \n\r");                                            
 serial.print("\n\r");
 delay(100);
 }

if(results.value==16730805)  // scrie 8
{
 Reverse();
 serial.print("$CLEAR\n\r");                                                
 serial.print("$GO 1 1\n\r");
 serial.print("$PRINT Inapoi (8) \n\r");                                            
 serial.print("\n\r");
 delay(100);
 }

if(results.value==16750695) //scrie+100
{
 digitalWrite(led, HIGH);
 serial.print("$CLEAR\n\r");                                                
 serial.print("$GO 1 1\n\r");
 serial.print("$PRINT Aprinde LED \n\r");                                          
 serial.print("\n\r");
 delay(100);
 }

if(results.value==16754775)
{
 digitalWrite(led, LOW);
 serial.print("$CLEAR\n\r");                                              
 serial.print("$GO 1 1\n\r");
 serial.print("$PRINT Stinge LED \n\r");                                            
 serial.print("\n\r");
 delay(100);
 }

}



*In locul librariei SoftwareSerial.h care intra in conflict cu IRremote.h am folosit NewSoftSerial.h

Roboti

Ce este un robot?
Este un sistem automatizat care acționează pe baza unui program (COD) de lucru stabilit sau care reacționează la anumite influențe exterioare (senzori).

Din ce este format?
Robotul este format din :

  • 3 parti:
  1. mecanica
  2. electronica
  3. programare
  • 2 parti:
  1. mecanica
  2. electronica
Robotii se impart in mai multe categorii, roboti industriali, roboti cu roti, roboti cu picioare, etc.

Pe mine m-au atras robotii cu roti sau senile, si de aceea am inceput sa lucrez la un robot cu roti care sa se deplaseze singur, sa se fereasca de obstacole si sa adune date pe care sa le trimita pe un telefon mobil.

Momentan datele vor fi afisate pe un LCD Serial 16x2, pana mai strang bani sa cumpar modulele de care mai am nevoie.
Robotul meu este construit pe platforma Arduino Duemilanove, pe care peste ceva timp intentionez sa o schimb cu o platforma Arduino Mega sau Seeeduino Mega.

Datele pe care le strange robotul sunt: temperatura, umiditatea, calitatea aerului (gaz, CO2), intensitatea luminii.

Pentru detectarea obstacolelor folosesc un senzor  Ping))) (SRF05) si 3 senzori SHARP(1 x GP2D120,   2 x GP2Y0D805Z0F)

Mai multe detalii o sa dau in post-urile viitoare pe care le voi scrie in timp ce fac progrese cu robotul a carui denumire este C1RM.

     

joi, 3 februarie 2011

Arduino controlat cu o telecomanda

Arduino este o placuta open source, asta insemnand ca poate fi folosit la aproape orice. Astazi am vrut sa vad cum functioneaza combinatia dintre:

  • Arduino
  • display cu 7 segmente
  • receptor IR TSOP48
  • telecomanda
Am facut un montaj cu Arduino si TSOP48 am deschis "Serial Monitor" din programul arduino, apoi am apasat pe diferite butoane de la telecomanda pentru a afla codul numeric pentru fiecare buton; pentru asta am folosit urmatorul COD:


#include

int RECV_PIN = 12;
  IRrecv irrecv(RECV_PIN);

  decode_results results;


void setup() {            
  
  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() {
   if (irrecv.decode(&results))
   {
    Serial.println(results.value, DEC);
    irrecv.resume(); // Receive the next value
   }
}

dupa ce am aflat ce  cod numeric are fiecare buton, am folosit un display cu 7 segmente pe care sa imi apara ce buton am apasat pe telecomanda.
(nu am folosit toate butoanele in urmatorul montaj ci butoanele de la 0 la 9, care afiseaza pe display numerele de la 0 la 9 si inca 3 butoane, unul care afiseaza punctul pe display, altul care stinge punctul si inca un buton care stinge tot display-ul)

Pentru asta am folosit urmatorul COD:


#include

int RECV_PIN = 12;
  IRrecv irrecv(RECV_PIN);

  decode_results results;

void setup() {            
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() {
   if (irrecv.decode(&results))
   {
    Serial.println(results.value, DEC);
    irrecv.resume(); // Receive the next value
   }

if(results.value==16724175)  //scrie 1
{
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
}

 if(results.value==16718055)  //scrie 2
{
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
}

 if(results.value==16743045)   //scrie 3
{
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
}

 if(results.value==16716015)   // scrie 4
{
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
}

 if(results.value==16726215)   // scrie 5
{
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
}

 if(results.value==16734885)  //scrie 6
{
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
}

 if(results.value==16728765) // scrie 7
{
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
}

 if(results.value==16730805)  // scrie 8
{
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
}

 if(results.value==16732845)  // scrie 9
{
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
}

 if(results.value==16738455)   // scrie 0
{
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
}

if(results.value==16756815)   // sterge display
{
 digitalWrite(2, 0);
 digitalWrite(3, 0);
 digitalWrite(4, 0);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 digitalWrite(9, 0);
}

if(results.value==16750695)   // scrie punct
{
 digitalWrite(9, 1);
}

if(results.value==16748655)   // sterge punct
{
 digitalWrite(9, 0);
}

}



Dupa cum vedeti, in acest montaj sunt combinate 2 COD-uri(programe) cel de la display-ul cu 7 segmente si cel de la receporul infrarosu.