marți, 8 ianuarie 2013

Arduino, un LED RGB si un buton de selectie

   Pe internet, la http://blog.bricogeek.com/noticias/tutoriales/video-tutorial-arduino-led-rgb-y-pulsadores/ am depistat un material scris de Oscar Gonzales in 2009, care prezinta un Arduino care comanda un LED RGB cu ajutorul a 3 taste (una de selectie, una de reducere intensitate si una de crestere a intensitatii).
   Este prezentat si un filmulet:
si un sketch (program).

    Deoarece ma tot jucasem cu LED-ul RGB si era deja conectat (cu rosu la pin 11, albastru la 10 si verde la 9), am pus o rezistenta de 2k2 (asta am avut la indemana) intre +5V si pinul 7 (acolo a ajuns rezistenta) si cu o bucata de conductor am simulat un buton intre pinul 7 si GND (masa).

   Schema de conectare este urmatoarea (fata de cea de comanda,  prin program a LED-ului multicolor, doar am mai pus rezistenta si .. intrerupatorul):

   Am constatat ca e o mica eroare in program (linia 54 trebuie mutata inainte de 51, altfel, LEd-urile se aprind corespunzator stari si se sting imediat).
   Am avut la indemana doar un "buton" (adica o sarmulita), am eliminat partea cu modificarea intensitatii (scadere sau crestere) si am mai adaugat o stare (toate LED-urile stinse), sketch-ul devenind:

/*********************************** 
  Tutorial Diodos LED Tricolor y Pulsadores   
  Oscar Gonzalez - Marzo 2009 
  www.BricoGeek.com 

original sketch from http://blog.bricogeek.com/noticias/tutoriales/video-tutorial-arduino-led-rgb-y-pulsadores/
adapted sketch by niq_ro ( http://www.tehnic.go.ro/ )
 ************************************/  
  
// Define los pines a utilizar para cada color 
// definire pin unde sunt legate LED-urile din componenta LED-ului RGB
int ledRojo=11;  // pin 11 la LED-ul rosu
int ledAzul=10;  // pin 10 la LED-ul albastru
int ledVerde=9;  // pin 9 la LED-ul verde
  
// Guarda los valores a signar a cada color (0-255)  
// intensitatea fiecarui LED poate avea valori de la 0 la 255 (0 pentru stins si 255 pentru maxim) 

int ValorRojo=255;  // intensitate luminioasa LED rosu
int ValorVerde=255; // intensitate luminioasa LED verde 
int ValorAzul=255;  // intensitate luminioasa LED albastru
  
// Define los pines utilizados por los botones  
// definire pin folosit pentru tasta de selectie
int BotonSelect = 7;  
  
int ledSeleccionado = 0;  
// initializare stare ca zero
   
void setup()   
{   
  
  // Hay que indicar que lo pines utilizados por los botones son de ENTRADA  
  // se defineste pinul ca intrare pentru tasta
  pinMode(BotonSelect, INPUT);  
    
  analogWrite(ledRojo, 255);    
}   
   
// Valor por defecto: Rojo  
// starea initiala va fi cu LED-ul rosu aprins
// 0= Rojo, 1=Verde, 2=Azul  
// 0 = rosu, 1 = verde si 2 = albastru 3 = stinse
int pinLed = 0;  
int valorLed = 0;  

void loop()   
{   
         
  // in mod normal pinul este in starea logica HIGH (rezistenta de 2..10k intre pin si +5V, contactul facandu-se la masa)
   if (digitalRead(BotonSelect) == LOW)   
   {  
      pinLed++;    
        
      // Para no pasarnos de vueltas  
      // daca starea e numarul 3 se readuce la 0
      if (pinLed > 3) { pinLed=0; }  
     
      // Apagamos todos los LED ya qu eluego se mostrará sólo el led seleccionado  
      // se sting toate LED-urile
      analogWrite(ledRojo, 0);  
      analogWrite(ledVerde, 0);  
      analogWrite(ledAzul, 0);        
        
      // Esperamos a que el boton se suelte  
      // se asteapta eliberarea tastei
      while (digitalRead(BotonSelect) == LOW) {  }              
      delay(10); // Esperamos un poquito más...  
   }  
     

  // Actualiza el valor del color seleccionado  
  // cele 4 cazuri sunt: LED rosu aprins, LED verde aprins, LED albastru aprins, respectiv toate stinse
  if (pinLed == 0) { analogWrite(ledRojo, ValorRojo); }  
  if (pinLed == 1) { analogWrite(ledVerde, ValorVerde); }  
  if (pinLed == 2) { analogWrite(ledAzul, ValorAzul); } 
  if (pinLed == 3) { ledSeleccionado = 0; } 
 delay (100);  
}

    Functionarea se poate vedea in urmatorul filmulet:

      O alta varianta de program e aceea e cand sunt 8 stari, incluzand stingerea...


/*********************************** 
  Tutorial Diodos LED Tricolor y Pulsadores   
  Oscar Gonzalez - Marzo 2009 
  www.BricoGeek.com 

original sketch from http://blog.bricogeek.com/noticias/tutoriales/video-tutorial-arduino-led-rgb-y-pulsadores/

adapted sketch by niq_ro ( http://www.tehnic.go.ro/ )
 ************************************/  
  
// Define los pines a utilizar para cada color 
// definire pin unde sunt legate LED-urile din componenta LED-ului RGB
int ledRojo=11;  // pin 11 la LED-ul rosu
int ledAzul=10;  // pin 10 la LED-ul albastru
int ledVerde=9;  // pin 9 la LED-ul verde
  
// Guarda los valores a signar a cada color (0-255)  
// intensitatea fiecarui LED poate avea valori de la 0 la 255 (0 pentru stins si 255 pentru maxim) 

int ValorRojo=255;  // intensitate luminioasa LED rosu

int ValorVerde=255; // intensitate luminioasa LED verde 
int ValorAzul=255;  // intensitate luminioasa LED albastru
  
// Define los pines utilizados por los botones  
// definire pin folosit pentru tasta de selectie
int BotonSelect = 7;  
  
int ledSeleccionado = 0;  
// initializare stare ca zero
   
void setup()   
{   
  
  // Hay que indicar que lo pines utilizados por los botones son de ENTRADA  
  // se defineste pinul ca intrare pentru tasta
  pinMode(BotonSelect, INPUT);  
    
  analogWrite(ledRojo, 255);    
}   
   
// Valor por defecto: Rojo  
// starea initiala va fi cu LED-ul rosu aprins
// 0= Rojo, 1=Verde, 2=Azul  
// 0 = rosu, 1 = verde si 2 = albastru 3 = stinse
int pinLed = 0;  
int valorLed = 0;  

void loop()   

{   
         
  // in mod normal pinul este in starea logica HIGH (rezistenta de 2..10k intre pin si +5V, contactul facandu-se la masa)
   if (digitalRead(BotonSelect) == LOW)   
   {  
      pinLed++;    
        
      // Para no pasarnos de vueltas  
      // daca starea e numarul 8 se readuce la 0
      if (pinLed > 8) { pinLed=0; }  
     
      // Apagamos todos los LED ya qu eluego se mostrará sólo el led seleccionado  
      // se sting toate LED-urile
      analogWrite(ledRojo, 0);  
      analogWrite(ledVerde, 0);  
      analogWrite(ledAzul, 0);        
        
      // Esperamos a que el boton se suelte  
      // se asteapta eliberarea tastei
      while (digitalRead(BotonSelect) == LOW) {  }              
      delay(10); // Esperamos un poquito más...  
   }  
     

  // Actualiza el valor del color seleccionado  
  // cele 4 cazuri sunt: LED rosu aprins, LED verde aprins, LED albastru aprins,  respectiv toate stinse
  if (pinLed == 0) { analogWrite(ledRojo, ValorRojo); }  // doar LED rosu aprins
  if (pinLed == 1) { analogWrite(ledVerde, ValorVerde); }  // doar LED verde aprins
  if (pinLed == 2) { analogWrite(ledAzul, ValorAzul); }  // doar LED albastru aprins
  if (pinLed == 3) { analogWrite(ledAzul, ValorAzul); analogWrite(ledRojo, ValorRojo); }  // LED albastru si rosu aprinse
  if (pinLed == 4) { analogWrite(ledVerde, ValorVerde); analogWrite(ledRojo, ValorRojo); }  // LED rosu si verde aprinse
  if (pinLed == 5) { analogWrite(ledAzul, ValorAzul); analogWrite(ledVerde, ValorVerde); }  // LED albastru si verde aprinse
  if (pinLed == 6) { analogWrite(ledAzul, ValorAzul); analogWrite(ledVerde, ValorVerde); analogWrite(ledRojo, ValorRojo); }  // toate 3 LED-urile aprinse
  if (pinLed == 7) { ledSeleccionado = 0; } 
 delay (100);  
}


    Functionarea se vede in urmatorul filmulet:



     Pentru a obtine si un joc de lumini, am adaugat inca ceva si am mai curatat programul. Starile obtinute sunt: rosu, albastru, verde, albastru si rosu, rosu si verde, verde si albastru, toate 3 culorile aprinse, joc si apoi toate stinse. Pentru a trece de la joc la toate stinse se tine tasta apasata ami mult pana ajunge la starea de toate 3 LED-urile aprinse, apoi dupa ce se ajunge la starea de toate stinse se reia ciclul, incepand cu rosu...


/*********************************** 
original sketch from http://blog.bricogeek.com/noticias/tutoriales/video-tutorial-arduino-led-rgb-y-pulsadores/
adapted sketch by niq_ro ( http://www.tehnic.go.ro/ )
 ************************************/  
  
// definire pin unde sunt legate LED-urile din componenta LED-ului RGB
int ledRojo=11;  // pin 11 la LED-ul rosu
int ledAzul=10;  // pin 10 la LED-ul albastru
int ledVerde=9;  // pin 9 la LED-ul verde
  
// intensitatea fiecarui LED poate avea valori de la 0 la 255 (0 pentru stins si 255 pentru maxim) 
int ValorRojo=255;  // intensitate luminoasa LED rosu
int ValorVerde=255; // intensitate luminoasa LED verde 
int ValorAzul=255;  // intensitate luminoasa LED albastru
  
// definire pin folosit pentru tasta de selectie
int BotonSelect = 7;  
  
int ledSeleccionado = 0;  
// initializare stare ca zero
   
void setup()   
{   
  // se defineste pinul ca intrare pentru tasta
  pinMode(BotonSelect, INPUT);  

  // prima stare la pornire cu LED-ul rosu aprins    
  analogWrite(ledRojo, 255);    
}   
   
// 0 = rosu, 1 = verde, 2 = albastru, 3 - rosu cu albastru, 4 - rosu cu verde, 5 - verde cu albastru, 6 - toate aprinse, 7 - joc, 8 - toate stinse
int pinLed = 0;  
int valorLed = 0;  

void loop()   
{   
         
  // in mod normal pinul este in starea logica HIGH (rezistenta de 2..10k intre pin si +5V, contactul facandu-se la masa)
   if (digitalRead(BotonSelect) == LOW)   
   {  
      pinLed++;    
        
      // Para no pasarnos de vueltas  
      // daca starea e numarul 8 se readuce la 0
      if (pinLed > 8) { pinLed=0; }  
     
      // Apagamos todos los LED ya qu eluego se mostrará sólo el led seleccionado  
      // se sting toate LED-urile
      analogWrite(ledRojo, 0);  
      analogWrite(ledVerde, 0);  
      analogWrite(ledAzul, 0);        
        
      // Esperamos a que el boton se suelte  
      // se asteapta eliberarea tastei
      while (digitalRead(BotonSelect) == LOW) {  }              
      delay(10); // Esperamos un poquito más...  
   }  


  // cele 9 cazuri sunt:
  if (pinLed == 0) { analogWrite(ledRojo, ValorRojo); }  // doar LED rosu aprins
  if (pinLed == 1) { analogWrite(ledVerde, ValorVerde); }  // doar LED verde aprins
  if (pinLed == 2) { analogWrite(ledAzul, ValorAzul); }  // doar LED albastru aprins
  if (pinLed == 3) { analogWrite(ledAzul, ValorAzul); analogWrite(ledRojo, ValorRojo); }  // LED albastru si rosu aprinse
  if (pinLed == 4) { analogWrite(ledVerde, ValorVerde); analogWrite(ledRojo, ValorRojo); }  // LED rosu si verde aprinse
  if (pinLed == 5) { analogWrite(ledAzul, ValorAzul); analogWrite(ledVerde, ValorVerde); }  // LED albastru si verde aprinse
  if (pinLed == 6) { analogWrite(ledAzul, ValorAzul); analogWrite(ledVerde, ValorVerde); analogWrite(ledRojo, ValorRojo); }  // toate 3 LED-urile aprinse
  if (pinLed == 7) {

analogWrite(ledAzul, 0);
analogWrite(ledVerde, 0);
analogWrite(ledRojo, ValorRojo); 

analogWrite(ledAzul, ValorAzul);
analogWrite(ledVerde, 0);
analogWrite(ledRojo, 0); 
delay (1000);

analogWrite(ledAzul, 0);
analogWrite(ledVerde, ValorVerde);
analogWrite(ledRojo, 0); 
delay (1000);

analogWrite(ledAzul, 0);
analogWrite(ledVerde, ValorVerde);
analogWrite(ledRojo, ValorRojo); 
delay (1000);

analogWrite(ledAzul, ValorAzul);
analogWrite(ledVerde, 0);
analogWrite(ledRojo, ValorRojo); 
delay (1000);

analogWrite(ledAzul, ValorAzul);
analogWrite(ledVerde, ValorVerde);
analogWrite(ledRojo, 0); 
delay (1000);

analogWrite(ledAzul, ValorAzul);
analogWrite(ledVerde, ValorVerde);
analogWrite(ledRojo, ValorRojo); 
delay (1000);
   }
// se apasa lung tasta pana se termina ciclul jocului, dupa care se sting toate (starea a 9-a), la o noua apsare apare iar rosu
 delay (100);  
}

     Modul de functionare este prezentat in urmatorul filmulet:

Niciun comentariu:

Trimiteți un comentariu