Translate

duminică, 11 decembrie 2011

"Semafor" Shield for Arduino

Proiectul urmator este un mic upgrade al ultimului proiect prezentat, respectiv este un semafor cu perechea sa pentru pietoni; unul conceput pentru treceri de pietoni; are un buton push; cand este apasat declanseaza secventa de oprire a masinilor(rosu pentru masini) si de liber pentru pietoni (verde pentru pietoni). Scopul acestui proiectel este exemplificarea utilizarii unui buton push, a posibilitatii de creere de functii si a functiei de timp predefinita millis().
Schema generala a conexiunilor shield-ului
Am realizat o schema a shield-ului; conexiunile sunt asemanatoare, dar pentru a putea fi vazut mai usor, schema nu este chiar shield.
Voi prezenta modul de lucru al semaforului. In conditii normale, semaforul va fi verde pentru masini si rosu pentru pietoni. In momentul in care este apasat butonul, dupa 10 (10000ms) secunde se stinge becul verde si se aprinde galbenul pentru masini timp de 4 secunde apoi rosu pentru masini; in tot acest timp pentru pietoni este rosu. Din motive de siguranta, verdele pentru pietoni se va aprinde la 3 secunde dupa rosul pentru masini; dupa 20 de secunde verdele pietonilor va incepe sa lumineze intermitent si se stinge becul verde si se aprinde becul rosu; peste 2 secunde se da liber masinilor. Din motive practice, trebuie sa adaugam o functie care sa impiedice schimbarea semaforului pentru fiecare pieton care doreste sa traverseze; asa ca vom adauga in program o conditie care sa contorizeze timpul trecut de la ultima declansare; astfel timp de 2 minute nu se va mai da liber pentru pietoni de oricate ori este apasat butonul.
 In timp ce scriam postul, mi-am dat seama ca am omis sa introduc pposibilitatea de a memora apasarea butonului in cele 2 minute si la scuregerea lor sa apeleze functia de schimbare a semaforului.
Rezumatul Proiectului
 Daca realizam lipiturile conform cu schema de mai sus; evident avand grija sa punem pinii pe sheld in asa fel incat atunci cand vom dori sa il conectam cu Arduino, pinii de pe shield sa intre in pinii corespunzatori de pe Arduino; pini pe care i-am folosit in sketch.
Shield-ul pe care l-am construit este conectat la pinii digitali 13, 12, 11, 10, 9, 8 si la pinii de alimentare 5V si GND. Am ales acest layout pentru o fixare mai buna. Desigur, se poate folosi si pin-ul GND de langa pin-ul 13. Pentru buton, alegerea pinului 13 nu este intamplatoare( rol de control); acesta avand un led pe placuta Arduino; astfel pot vedea un efect atunci cand apas butonul din circuit. Voi pune acum si codul complet pe care l-am folosit la realizarea proiectului:

Arduino cu "semafor" shield atasat


//Interactive Traffic Lights
/*
Author:
  THE ARDUINO BLOG
http://thearduinoblog.blogspot.com
*/  

// assign the car lights
 int carRed = 12;
int carYellow = 11;
int carGreen = 10;


// assign the pedestrian lights
int pedRed = 8;
int pedGreen = 9;
int button = 13; // button pin
int crossTime = 20000; // time allowed to cross
unsigned long changeTime; // time since button pressed
void setup() {

Arduino si "Semafor" Shield

  pinMode(carRed, OUTPUT);
  pinMode(carYellow, OUTPUT);
  pinMode(carGreen, OUTPUT);
  pinMode(pedRed, OUTPUT);
  pinMode(pedGreen, OUTPUT);
  pinMode(button, INPUT); // button
  // turn on the green light
  digitalWrite(carGreen, HIGH);
  digitalWrite(pedRed, HIGH);
}
void loop() {
  int state = digitalRead(button);
  /* check if button is pressed and it is
  over 2 minutes since last button press */
  if (state == HIGH && (millis() - changeTime) > 120000) {
    // Call the function to change the lights
    delay(10000);
    changeLights();
  }
}
void changeLights() {
  digitalWrite(carGreen, LOW); // carGreen off
  digitalWrite(carYellow, HIGH); // carYellow on
  delay(4000); // wait 4 seconds
  digitalWrite(carYellow, LOW); // carYellow off
  digitalWrite(carRed, HIGH); // carRed on
  delay(3000); // wait till its safe
  digitalWrite(pedRed, LOW); // pedRed off
  digitalWrite(pedGreen, HIGH); // pedGreen on
  delay(crossTime); // wait for preset time period
  // flash the ped green
  for (int x=0; x<5; x++) {
    digitalWrite(pedGreen, HIGH);
    delay(250);
    digitalWrite(pedGreen, LOW);
    delay(250);
  }
  // turn pedRed on
  digitalWrite(pedRed, HIGH);
  delay(2000);
  digitalWrite(carYellow, HIGH); // carYellow on
 
  delay(2000);
  digitalWrite(carRed, LOW); // carRed off
  digitalWrite(carGreen, HIGH); //carGreen on
  digitalWrite(carYellow, LOW); // carYellow off
  // record the time since last change of lights
  changeTime = millis();

}
Conexiunea shield - board

Fiecare linie de program are un comentariu care arata ce face linia respectiva. Un exercitiu de aplicare a ceea ce a fost prezentat este adaugarea memorarii apasarii butonului in intervalul de 2 minute.

3 comentarii:

  1. wow that is really awesome man

    RăspundețiȘtergere
  2. interesant si multumim ! 10x
    adaugarea memorarii timp de 2 minute, de la apasarea butonului cum se face ?

    RăspundețiȘtergere
    Răspunsuri
    1. este deja inclusa in program.
      if (state == HIGH && (millis() - changeTime) > 120000)
      in variabila changeTime este retinut momentul final al ultimei schimbari. In momentul cand butonul este apasat, se verifica daca intre momentul ultimei schimbari si momentul actual (dat de functia millis()) au trecut 12 000 de milisecunde adica 2 minute. Daca au trecut schimba semaforul, daca nu au trecut pur si simplu ignora apasarea butonului. Se poate adauga o alta variabila care sa retina faptul ca butonul a fost apasat in intervalul de doua minute si care sa activeze functia de schimb cand trec cele doua minute.
      Sper ca am inteles bine intrebarea
      Zi buna

      Ștergere