duminică, 25 septembrie 2011

CD Bot

Astazi am gasit timp sa termin robotelul pe care l-am facut "printre picaturi". Este un robot care ocoleste obstacolele, iar in drumetia pe care o parcurge afiseaza pe un LCD intensitatea luminii. Are 2 LED-uri unul galben si unul RGB, cel galben licareste cand detecteaza un obstacol iar cel RGB isi schimba culoarea in functie de activitatea curenta a robotului.
Din titlu cred ca banuiti din ce este construit robotul, anume din cd-uri, forma sa estetica nu este cea finala; mie imi pare destul de dragut si imi place sa il privesc in actiune, doar e creatia mea. Actual nu are prea multe intrebuintari si multi probabil ar socoti acest robot nefolositor, momentan este distractiv si acesta e scopul lui, sa amuze intr-o mica masura.
In urmatoarele upgrade-uri robotul va cauta cele mai luminoase locuri, va afisa temeratura pe LCD, o sa ii atasez si un difuzor sa fie mai comic, va mai primi in dotare un receptor si un emitator IR, si in functie de forma estetica poate si un brat robotizat.

Mai jos afisez codu-l robotului dupa cum am obisnuit, dar din cauza ca nu stiu cum sa il pun altfel cum intalniti pe alte sitte-uri si din cauza ca ocupa foarte mult spatiu, acesta este ultimul cod afisat(cele scurte vor face exceptie), pentru viitoarele cod-uri trebuie doar sa imi lasati un comentariu cu adresa de e-mail iar eu voi trimite codu-l sursa in cel mai scurt timp.



COD:


/*
* Robt obsticle evasion prgoram Version 2.3
* By Musat Cristian
* 19/2/2010
*/

#include // Servo library

int dir = 1; // declare variables
int pos = 0;
int pingPin = 8;
int pwm_a = 3; //PWM control for motor outputs 1 and 2 is on digital pin 3
int pwm_b = 11; //PWM control for motor outputs 3 and 4 is on digital pin 11
int dir_a = 12; //direction control for motor outputs 1 and 2 is on digital pin 12
int dir_b = 13; //direction control for motor outputs 3 and 4 is on digital pin 13
Servo headservo;

void setup()
{
pinMode(pwm_a, OUTPUT); //Set control pins to be outputs
pinMode(pwm_b, OUTPUT);
pinMode(dir_a, OUTPUT);
pinMode(dir_b, OUTPUT);

pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(2, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(2, LOW);
digitalWrite(9, LOW);
headservo.attach(7);

Serial.begin(9600); // attach LCD to com port

wait(1); // stop the robot

ledWrite(LOW,HIGH,HIGH); // Flash LED
delay(500);
ledWrite(HIGH,LOW,HIGH);
delay(500);
ledWrite(HIGH,HIGH,LOW);
delay(500);
}


void loop (void) { // Main body of the program

int inches;

while(inches>8) // while nothing is within 10 inches do the following
{
if (pos == 0)
{
dir = 3; // if it is looking left direction is positive
headservo.write(pos); // tell servo to go to position in variable 'pos'
delay(3);
}

else if (pos == 180)
{
dir = -3; // if it is looking right direction is negative
headservo.write(pos); // tell servo to go to position in variable 'pos'
delay(3); // waits 3ms for the servo to reach the position
}
headservo.write(pos);
inches = ping (); // anybody there?
pos += dir; // recalculate position variable
forward(1); // Move forward

}

int x = headservo.read();
wait(0); // stop the robot

if(inches>5) // for objects further away turn gradually
{
if (x>=0 && x<90) { digitalWrite(pwm_a, 80); //set both motors to run at (100/255 = 39)% duty cycle (slow) digitalWrite(pwm_b, 230); delay(50); } if (x>=90 && x<=180) { digitalWrite(pwm_a, 230); //set both motors to run at (100/255 = 39)% duty cycle (slow) digitalWrite(pwm_b, 80); delay(50); } // if (x>=75 && x<105) // { // backward(100); // right(50); // } } else // for close objects turn hard { if (x>=0 && x<90) { right(100); } if (x>=90 && x<=180) { left(100); } // if (x>=75 && x<105)
// {
// backward(100);
// left(50);
// }

}

blinck();
}

// This function sends a signal to the Ping semsor and reterns a value in inches

int ping ()
{
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW); // make sure the signal pin starts low
delayMicroseconds(2);
digitalWrite(pingPin, HIGH); // hello, ping)))
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
pinMode(pingPin, INPUT);
return pulseIn(pingPin, HIGH) / 148; // wait for echo and return inches
}

// Movement functions

void forward(int fsec)
{

Serial.print("forward");
digitalWrite(pwm_a, 240); //set both motors to run at (100/255 = 39)% duty cycle (slow)
digitalWrite(pwm_b, 240); // display direction
digitalWrite(dir_a, LOW); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, LOW); //Set motor direction, 3 high, 4 low
ledWrite(LOW,LOW,LOW); // set LED colour

delay(fsec); // delay period defined in function call
}

void left(int lsec)
{

Serial.print("left");
digitalWrite(pwm_a, 240); //set both motors to run at (100/255 = 39)% duty cycle (slow)
digitalWrite(pwm_b, 240);
digitalWrite(dir_a, LOW); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, HIGH); //Set motor direction, 3 high, 4 low
ledWrite(HIGH,LOW,HIGH);

delay(lsec);
}

void right(int rsec)
{

Serial.print("right");
digitalWrite(pwm_a, 240); //set both motors to run at (100/255 = 39)% duty cycle (slow)
digitalWrite(pwm_b, 240);
digitalWrite(dir_a, HIGH); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, LOW); //Set motor direction, 3 high, 4 low
ledWrite(HIGH,HIGH,LOW);

delay(rsec);
}

void backward(int bsec)
{

Serial.print("backward");
digitalWrite(pwm_a, 0); //set both motors to run at (100/255 = 39)% duty cycle (slow)
digitalWrite(pwm_b, 0);
digitalWrite(dir_a, HIGH); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, HIGH); //Set motor direction, 3 high, 4 low
ledWrite(LOW,LOW,HIGH);

delay(bsec);
}

void wait(int wsec)
{

Serial.print("stop");
digitalWrite(pwm_a, 0); //set both motors to run at (100/255 = 39)% duty cycle (slow)
digitalWrite(pwm_b, 0);
digitalWrite(dir_a, LOW); //Set motor direction, 1 low, 2 high
digitalWrite(dir_b, LOW); //Set motor direction, 3 high, 4 low
ledWrite(LOW,HIGH,HIGH);

delay(wsec);
}

// LED write function

void ledWrite(boolean r, boolean g, boolean b)
{
digitalWrite(4, r);
digitalWrite(6, g);
digitalWrite(5, b);
}

void blinck()
{
digitalWrite(10, HIGH);
delay(40);
digitalWrite(10, LOW);
delay(140);
}

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.

duminică, 23 ianuarie 2011

Arduino si 7-segment display

   Pentru a afisa pe un display cu 7 segmente trebuie mai intai sa identificati pinii display-ului de la 1 la 10.
In tabel se gasesc pinii din arduino care corespund fiecarui pin din display. pinii 3 si 8 sunt GND si de aceea nu apar in tabel.  Mai jos aveti imagini informative despre display.




Arduino Pin7 Segment Pin Connection
 27 (A)
 36 (B)
 44 (C)
 52 (D)
 61 (E)
 79 (F)
 8  10 (G)
 9 5 (DP)


COD:

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);
  digitalWrite(9, 1);  // aprinde punct
  delay(100);
}

void loop() {
//punct
digitalWrite(9, 0);
delay(500);

// write '9'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '8'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '7'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(10000);
 // write '6'
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '5'
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '4'
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(10000);
 // write '3'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(10000);
 // write '2'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(10000);
 // write '1'
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(10000);
 // write '0'
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
 delay(4000);


}

Aceasta varianta este foarte usor de inteles, dar avem mult de muncit la cod. Asa ca voi prezenta si o varianta mai compacta de cod, cu acelasi rezultat.

COD:



// 1 = LED on, 0 = LED off
//                                    Arduino pin: 2,3,4,5,6,7,8
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                                           { 0,1,1,0,0,0,0 },  // = 1
                                                           { 1,1,0,1,1,0,1 },  // = 2
                                                           { 1,1,1,1,0,0,1 },  // = 3
                                                           { 0,1,1,0,0,1,1 },  // = 4
                                                           { 1,0,1,1,0,1,1 },  // = 5
                                                           { 1,0,1,1,1,1,1 },  // = 6
                                                           { 1,1,1,0,0,0,0 },  // = 7
                                                           { 1,1,1,1,1,1,1 },  // = 8
                                                           { 1,1,1,0,0,1,1 }   // = 9
                                                           };


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);
  writeDot(0); 
}


void writeDot(byte dot) 
{
  digitalWrite(9, dot);
}
    
void sevenSegWrite(byte digit)
 {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount)
   {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
   }
}


void loop() 
{
  for (byte count = 10; count > 0; --count) 
{
   delay(1000);
   sevenSegWrite(count - 1); 
  }
  delay(4000);
}





Controlul unui releu cu Arduino

     Puteti controla un motor DC cu arduino prin intermediul unui releu, insa nu recomand aceasta metoda deoarece polaritatea se schimba brusc si nu puteti controla turatia motorului. In locul motorului se poate pune orice altceva, releul care il folosesc poate fi utilizat ca un switch. Cand releul este deschis trece curent pe o punte iar cealalta este inchisa, cand releul este inchis, puntea prin care trecea curent este inchisa si cealalta este deschisa.



   Uitandu-ne de la stanga la dreapta:

  • primul pin deschide si inchide releul
  • al doilea este GND (pinul comun)
  • al treilea este V1
  • al patrulea este V2
 (Pinii au simetrici pe partea cealalta a releului)

COD:



void setup() {              

  pinMode(12, OUTPUT);   // pinul la care este conectat releul
}

void loop() {
  digitalWrite(12, HIGH);   // merge inainte
  delay(10000);            
  digitalWrite(12, LOW);    // merge inapoi
  delay(10000);            
}



sâmbătă, 22 ianuarie 2011

Arduino si senzor de distanta SHARP

In urmatorul montaj folosesc:
  • Arduino Duemilanove
  • SHARP GP2D120
  • LCD Serial 16x2
  • LED
SHARP GP2D120 este un senzor de distanta analog; cu ajutorul valorilor returnate de acesta putem pune diferite conditii.
In montajul meu senzorul afiseaza valoarea pe LCD iar cand valoarea returnata de senzor e mai mica decat 70, se aprinde un LED. 
 Senzorul se conecteaza la 5v, GND si pinul de semnal la un pin analog din arduino.

COD:

#include SoftwareSerial.h

int IRpin = 0;
int LED = 12;
#define rxPin 2                                                          
#define txPin 3

SoftwareSerial LCD =  SoftwareSerial(rxPin, txPin); 

void setup() {
  pinMode(rxPin, INPUT);                                                 
  pinMode(txPin, OUTPUT);                                                
  pinMode(LED, OUTPUT);                                                   
  LCD.begin(9600);   
}

void loop() {
  float volts = analogRead(IRpin)* ((float) 5 / 1024);
  float distance = 65*pow(volts, -1.10);

   LCD.print("$CLEAR\n\r");
   LCD.print("$GO 1 4\n\r");
   LCD.print("$PRINT Distanta: \n\r");
   LCD.print("\n\r");
   LCD.print("$GO 2 1\n\r");
   LCD.print("$PRINT ");
   LCD.print(distance, DEC);
   LCD.print("\n\r");
  
   delay(100);
   
   if (distance<70)
      digitalWrite(LED, HIGH);                                          
   else
      digitalWrite(LED, LOW);
}