Go Down

Topic: Lampada RGB con Apple Remote (Read 4117 times) previous topic - next topic

peenieman

May 02, 2013, 11:13 am Last Edit: May 02, 2013, 11:19 am by peenieman Reason: 1
Buongiorno a tutti :)
da buon utente neofita di Arduino (da circa un mese), mi sono messo in testa di farmi la classica lampada rgb telecomandata con Apple Remote.
Dopo varie letture e configurazioni suggerite ho optato per comandare le strip rgb(anodo comune) con 1 ULN2003 (allego schema Fritzing, per schemi con Eagle devo ancora capire :D).

Considerato che non mi piace avere la pappa pronta ho scritto un pò di codice che compila, ma non funziona come dovrebbe.
Il codice che allego non è completo delle funzionalità che vorrei per la lampada, ma per gestire meglio il tutto faccio delle prove in corso d'opera per verificarne il funzionamento e correggere eventuali errori.
Ecco lo sketch
Code: [Select]
/*
                 PeenieLamp v0.1
Lampada RGB con telecomando Apple

Codici Apple Remote
+         2011287595
-           2011279403
<<        2011238443
play pause 2011242539
>>                2011291691
menu 2011250731
tenuti premuti 4294967295


° Play/Pause accende e spegne
° "+" e "-" regolano luminosità
° "<<" e ">>" Cambiano modalità
° "menu" luce bianca


Modalità:
0 - luce bianca
1 - Dissolvenza
2 - Arcobaleno
3 -
4 -
5 -

ultima modifica 02-05-2012
*/


#include <IRremote.h>

int r1=3;         //pin dei colori
int g1=5;
int b1=6;
int r2=9;
int g2=10;
int b2=11;
int RECV_PIN=12;   // pin del ricevitore

IRrecv irrecv(RECV_PIN);
decode_results results;

int PP = 0 ;      //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 100;   //luminosità iniziale
int modo = 0;     // inizio da modo 0
int passo=3;      //aumento per cambio colori
int vel=10;       //velocità cambio colori

///SETUP///

void setup()
{

 irrecv.enableIRIn();// attiva il ricevitore

 pinMode (r1,OUTPUT);
 pinMode (g1,OUTPUT);
 pinMode (b1,OUTPUT);
 pinMode (r2,OUTPUT);
 pinMode (g2,OUTPUT);
 pinMode (b2,OUTPUT);

 analogWrite (r1, lumi);
 analogWrite (g1, lumi);
 analogWrite (b1, lumi);
 analogWrite (r2, lumi);
 analogWrite (g2, lumi);
 analogWrite (b2, lumi);
}

///MODALITA'///

void modo0(){
 analogWrite (r1, 255);
 analogWrite (g1, 255);
 analogWrite (b1, 255);
 analogWrite (r2, 255);
 analogWrite (g2, 255);
 analogWrite (b2, 255);
}


void modo1()  {
 for (int fadevalue=0; fadevalue<= lumi; fadevalue +=5){      
   analogWrite (r1, fadevalue);
   analogWrite (g1, fadevalue);
   analogWrite (b1, fadevalue);
   analogWrite (r2, fadevalue);
   analogWrite (g2, fadevalue);
   analogWrite (b2, fadevalue);
   delay(50);
 }
 for ( int fadevalue=lumi;fadevalue>=0; fadevalue -=5){
   analogWrite (r1, fadevalue);
   analogWrite (g1, fadevalue);
   analogWrite (b1, fadevalue);
   analogWrite (r2, fadevalue);
   analogWrite (g2, fadevalue);
   analogWrite (b2, fadevalue);
   delay(50);
 }
}


void modo2 () {
 for (int L=0;L<256;L+=passo) {
   analogWrite(r1,255-L);
   analogWrite(g1,L);
   delay(100);
 }

 for (int L=0;L<256;L+=passo) {
   analogWrite(g1,255-L);
   analogWrite(b1,L);
   delay(100);
 }

 for (int L=0;L<256;L+=passo) {
   analogWrite(b1,255-L);
   analogWrite(r1,L);
   delay(100);
 }
}


///MAIN LOOP///

void loop()  {

 if (irrecv.decode(&results)) {

   //play/pausa premuto
   if(results.value == 2011242539) {
     if(PP==LOW){
       PP=HIGH;
     }
     else  {
       PP=LOW;
     }
   }

   //tasto + premuto
   if (results.value ==2011287595 && lumi<240){
     lumi=lumi +20;
   }

   //tasto - premuto
   if (results.value == 2011279403 && lumi>0){
     lumi=lumi -20;
   }

   // tasto << premuto
   if (results.value==2011238443){
     if(modo>0) {
       modo =modo-1;
     }
     else{
       modo = 2;
     }
   }

   // tasto>>premuto
   if (results.value==  2011238443){
     if(modo <2){
       modo = modo +1;
     }
     else{
       modo = 0;
     }
   }
   irrecv.resume();
 }
 switch (modo) {
 case 0:
   if (PP==HIGH){
     analogWrite (r1, lumi);
     analogWrite (g1, lumi);
     analogWrite (b1, lumi);
     analogWrite (r2, lumi);
     analogWrite (g2, lumi);
     analogWrite (b2, lumi);
   }
   else {
     analogWrite (r1, 0);
     analogWrite (g1, 0);
     analogWrite (b1, 0);
     analogWrite (r2, 0);
     analogWrite (g2, 0);
     analogWrite (b2, 0);
   }
   break;
 case 1:
   if(PP==HIGH){
     modo1();
   }
   break;
 case 2 :
   if(PP==HIGH){
     modo2();
   }
   break;
 }
}


Il problema è che dopo aver premuto i tasti per la luminosità si impalla tutto il sistema, inoltre non riesco a gestire le varie modalità di accensione della lampada.
Sono sicuro di aver commesso un sacco di errori ed infatti vi chiedo aiuto e suggerimenti per l'avanzamento del mio progetto.
Avrei anche bisogno di qualche idea per giochi di luci da implementare nella lampada :D.
Insomma mi farebbe piacere completarla con il vostro aiuto e la vostra esperienza.

Andrea
Il fare è il miglior modo d'imparare

nid69ita

#1
May 02, 2013, 04:40 pm Last Edit: May 02, 2013, 04:45 pm by nid69ita Reason: 1
Cosa intendi con "si impalla" ?

Quando sei in modalità 1 o 2   Arduino esegue delle funzioni con dei cicli for e parecchi delay. In tutto quel tempo di certo l'Arduino non può anche leggere i comandi dal telecomando.
Prova a mettere nel modo1 e modo2 solo accensione di 2 colori a scelta senza quei for/delay per vedere se è quello il problema.

Alcuni consigli per il codice.
1. farei una funzione anche per il modo0 (hai una funzione modo0 non usata) per rimpicciolire lo switch.
2. per i pin è meglio dichiarare
Code: [Select]
const byte r1=3;
3. crea delle costanti per i codici Apple ed usa quelle nel codice, esempio      
Code: [Select]
 #define K_PLUS 2011287595
oppure meglio ancora
Code: [Select]
 const unsigned long K_PLUS=2011287595;
my name is IGOR, not AIGOR

peenieman

Intanto per grazie per i consigli :) che ho subito messo in pratica assegnando le costanti per i codici del ricevitore e per i pin dei colori.
Per quel che riguarda il modo0 credo di avere sistemato rimpicciolendo lo switch.
Per " si impalla" intendo che non riceve più nessun comando dal ricevitore e si blocca a luce bianca fissa fino al reset manuale del micro, dopo le modifiche al codice questo non succede più.
Ho anche provato a mettere solo due colori nei modo1 e modo2 togliendo i 'for' e i 'delay' come suggerito ed in effetti i colori funzionano.
Segue sketch modificato
Code: [Select]

/*
                  PeenieLamp v0.2
Lampada RGB con telecomando Apple

Codici Apple Remote
+ 2011287595
- 2011279403
frw 2011238443
play pause 2011242539
ffw 2011291691
menu 2011250731
tenuti premuti 4294967295


° Play/Pause accende e spegne
° "+" e "-" regolano luminosità
° "<<" e ">>" Cambiano modalità
° "menu" luce bianca


Modalità:
modo0 - Bianco
modo1 - Viola
modo2 - Verde
modo3 - Rosso
modo4 -
modo5 -

ultima modifica 02-05-2012
*/


#include <IRremote.h>

const byte r1=3;         //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12;   // pin del ricevitore

            ///Costanti per codici ricevitore

const unsigned long Kpiu  = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew  = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw  = 2011291691;
const unsigned long Kmenu = 2011250731;

IRrecv irrecv(RECV_PIN);
decode_results results;

int PP = 0 ;      //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 100;   //luminosità iniziale
int modo = 0;     // inizio da modo 0
int passo=3;      //aumento per cambio colori
int vel=10;       //velocità cambio colori

///SETUP///

void setup()
{

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);

  analogWrite (r1, LOW);
  analogWrite (g1, LOW);
  analogWrite (b1, LOW);
  analogWrite (r2, LOW);
  analogWrite (g2, LOW);
  analogWrite (b2, LOW);
}

///MODALITA'///

void modo0(){
  analogWrite (r1, 255);
  analogWrite (g1, 255);
  analogWrite (b1, 255);
  analogWrite (r2, 255);
  analogWrite (g2, 255);
  analogWrite (b2, 255);
}


void modo1()  {
         
    analogWrite (r1, 255);
    analogWrite (g1, 0);
    analogWrite (b1, 255);
    analogWrite (r2, 255);
    analogWrite (g2, 0);
    analogWrite (b2, 255);
   
  }



void modo2 () {
 
    analogWrite(r1,0);
    analogWrite(g1,255);
    analogWrite (b1,0);
    analogWrite(r2,0);
    analogWrite(g2,255);
    analogWrite (b2,0);
   
}
void modo3 (){
  analogWrite(r1,255);
    analogWrite(g1,0);
    analogWrite (b1,0);
    analogWrite(r2,255);
    analogWrite(g2,0);
    analogWrite (b2,0);
}

///MAIN LOOP///

void loop()  {

  if (irrecv.decode(&results)) {

    //play/pausa premuto
    if(results.value == Kplay) {
      if(PP==LOW){
        PP=HIGH;
      }
      else  {
        PP=LOW;
      }
    }

    //tasto + premuto
    if (results.value == Kpiu && lumi<240){
      lumi=lumi +20;
    }

    //tasto - premuto
    if (results.value == Kmeno && lumi>0){
      lumi=lumi -20;
    }

    // tasto << premuto
    if (results.value == Krew){
      if(modo>0) {
        modo = modo-1;
      }
      else{
        modo = 3;
      }
    }

    // tasto>>premuto
    if (results.value==  Kffw){
      if(modo <3){
        modo = modo +1;
      }
      else{
        modo = 0;
      }
    }
    irrecv.resume();
  }
  switch (modo) {
  case 0:
    if (PP==HIGH){
      modo0();
    }
     
    break;
  case 1:
    if(PP==HIGH){
      modo1();
    }
    break;
  case 2 :
    if(PP==HIGH){
      modo2();
    }
    break;
    case 3 :
    if(PP==HIGH){
      modo3();
    }
  }
}



Ci sono delle cose che non capisco :) :

con i tasti + e - non aumenta ne diminuisce la luminosita mentre prima lo faceva ma si "impallava" :) dopo un paio di pressioni del tasto

con il tasto play che dovrebbe accendere/spegnere le luci , riesco solo ad accendere ma non a spegnere, mentre con lo sketch di prima riuscivo (era l'unica cosa che funzionava).





Il fare è il miglior modo d'imparare

nid69ita

#3
May 02, 2013, 07:01 pm Last Edit: May 02, 2013, 07:11 pm by nid69ita Reason: 1
Beh, per il +/- è normale, perchè ora lumi non lo usi più.

Per quanto riguarda lo spegnere, non hai più nessun modox che mette tutto a 0, se non sbaglio.

modo0 modificalo cosi:
Code: [Select]

void modo0()
{ if (PP==HIGH)
  {   analogWrite (r1, lumi);
      analogWrite (g1, lumi);
      analogWrite (b1, lumi);
      analogWrite (r2, lumi);
      analogWrite (g2, lumi);
      analogWrite (b2, lumi);
  }
  else
  { analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
  }
}
my name is IGOR, not AIGOR

peenieman

anche con la modifica fatta non spegne

non capisco il discorso della luminosità (lumi), se io l'ho definita all'inizio, nel momento che la richiamo dovrebbe funzionare, o no? :D
chiedo 'lumi' :):):) in merito

P.S.: scusate il pessimo gioco di parole :D
Il fare è il miglior modo d'imparare

nid69ita

#5
May 02, 2013, 07:30 pm Last Edit: May 02, 2013, 07:46 pm by nid69ita Reason: 1
Nella seconda versione che hai postato, lumi la inizializzi, la aumenti/diminuisci a seconda del tasto del remote.
Ma poi NON la usi, non c'e' più nessun        analogWrite (r1, lumi); !!!   :smiley-mr-green:


un consiglio, per fare debug e vedere da te dove stai passando nel programma.
Nella setup, come prime istruzioni aggiungi:
Code: [Select]

delay(1000);
Serial.begin(9600);


Questo permette di inviare dei dati al monitor di arduino IDE
Ora nel modo0:
Code: [Select]

void modo0()
{ if (PP==HIGH)
 {   analogWrite (r1, lumi);
     analogWrite (g1, lumi);
     analogWrite (b1, lumi);
     analogWrite (r2, lumi);
     analogWrite (g2, lumi);
     analogWrite (b2, lumi);
     Serial.print("Modo 0: lumi="); Serial.println(lumi);
 }
 else
 { analogWrite (r1, 0);
   analogWrite (g1, 0);
   analogWrite (b1, 0);
   analogWrite (r2, 0);
   analogWrite (g2, 0);
   analogWrite (b2, 0);
   Serial.print("Modo 0: spento");
 }
}



Altro suggerimento, creati anche una costante per il numero di modi:
Code: [Select]
 const K_MAXMODI=3;
nel codice:
Code: [Select]
 if(modo <3)   => diventa      if(modo<K_MAXMODI)
anche nell'altro punto  
Code: [Select]
 modo = 3;    => diventa     modo=K_MAXMODI;
my name is IGOR, not AIGOR

peenieman

#6
May 02, 2013, 07:36 pm Last Edit: May 02, 2013, 07:43 pm by peenieman Reason: 1
in effetti hai ragione nel secondo sketch postato non c'è
Code: [Select]
analogWrite (r1, LOW);
 analogWrite (g1, LOW);
 analogWrite (b1, LOW);
 analogWrite (r2, LOW);
 analogWrite (g2, LOW);
 analogWrite (b2, LOW);

ma nell'IDE l'avevo messa
Code: [Select]
 analogWrite (r1, lumi);
 analogWrite (g1, lumi);
 analogWrite (b1, lumi);
 analogWrite (r2, lumi);
 analogWrite (g2, lumi);
 analogWrite (b2, lumi);


ecco il perchè della mia domanda, cmq la luminosità non funziona lo stesso

EDIT: aggiunto il monitor seriale, lumi comincia da 255 si abbassa di 20 come da sketch, arriva a 235 e poi si 'impalla' fino al reset manuale
quando ripremo play per spegnere, nel monitor seriale non mi scrive spento però smette di trasmettere il valore di lumi
Il fare è il miglior modo d'imparare

nid69ita

Io ti ho fatto aggiungere solo 2 punti in cui mandare valori/segnali al monitor.
Ti conviene aggiungerne in ogni funzione modex   e non solo
Code: [Select]

  if (irrecv.decode(&results))
  { //play/pausa premuto
    if(results.value == Kplay)
    { if(PP==LOW)
      { PP=HIGH;
        Serial.println("remote: PLAY  ACCESO");
      }
      else 
       {  PP=LOW;
           Serial.println("remote: PLAY  SPENTO");
      }
...
    }
my name is IGOR, not AIGOR

peenieman

#8
May 02, 2013, 07:58 pm Last Edit: May 02, 2013, 08:03 pm by peenieman Reason: 1
Stavo pensando la stessa cosa, ora vedo di aggiungerli  :D
grazie per i suggerimenti

EDIT:
aggiunto ed in effetti nel monitor da spento, ma le luci non si spengono
Il fare è il miglior modo d'imparare

nid69ita

Anche con il primo sketch non ti si spegnevano, vero?

Quello non credo sia un problema di software ma di hardware. Non so bene come consigliarti.
Mi sembra di aver letto che per spegnere non basta portare a 0.

Prova comunque a fare i vari    analogWrite (r1, 1);    non proprio a 0 ma quasi per spegnere. E' una prova.
my name is IGOR, not AIGOR

nid69ita

Dopo i vari suggerimenti, sarebbe meglio allegassi di nuovo la tua ultima versione.
Mi sono un pò perso, forse ho visto un errore ma non son sicuro.
my name is IGOR, not AIGOR

peenieman

Con il primo sketch era l'unica cosa che funzionava  :D

ecco la nuova versione del codice
Code: [Select]
/*
                  PeenieLamp v0.4
Lampada RGB con telecomando Apple

Codici Apple Remote
+ 2011287595
- 2011279403
frw 2011238443
play pause 2011242539
ffw 2011291691
menu 2011250731
tenuti premuti 4294967295


° Play/Pause accende e spegne
° "+" e "-" regolano luminosità
° "<<" e ">>" Cambiano modalità
° "menu" luce bianca


Modalità:
modo0 - Bianco
modo1 - Viola
modo2 - Verde
modo3 - Rosso
modo4 -
modo5 -

ultima modifica 02-05-2012
*/


#include <IRremote.h>

const byte r1=3;         //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12;   // pin del ricevitore

int K_MAXMODI=3; //costante per i modi

            ///Costanti per codici ricevitore

const unsigned long Kpiu  = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew  = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw  = 2011291691;
const unsigned long Kmenu = 2011250731;

IRrecv irrecv(RECV_PIN);
decode_results results;

int PP = 0 ;      //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 255;   //luminosità iniziale
int modo = 0;     // inizio da modo 0
int passo=3;      //aumento per cambio colori
int vel=10;       //velocità cambio colori

///SETUP///

void setup()
{
 
delay(1000);
Serial.begin(9600);

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);

  analogWrite (r1, lumi);
  analogWrite (g1, lumi);
  analogWrite (b1, lumi);
  analogWrite (r2, lumi);
  analogWrite (g2, lumi);
  analogWrite (b2, lumi);
}

///MODALITA'///

void modo0()
{ if (PP==HIGH)
  {   analogWrite (r1, lumi);
      analogWrite (g1, lumi);
      analogWrite (b1, lumi);
      analogWrite (r2, lumi);
      analogWrite (g2, lumi);
      analogWrite (b2, lumi);
      Serial.print("Modo 0: lumi="); Serial.println(lumi);
      delay(500);
  }
  else
  { analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
    Serial.print("Modo 0: spento");
  }
}


void modo1()  {
         
    analogWrite (r1, 255);
    analogWrite (g1, 0);
    analogWrite (b1, 255);
    analogWrite (r2, 255);
    analogWrite (g2, 0);
    analogWrite (b2, 255);
   
  }



void modo2 () {
 
    analogWrite(r1,0);
    analogWrite(g1,255);
    analogWrite (b1,0);
    analogWrite(r2,0);
    analogWrite(g2,255);
    analogWrite (b2,0);
   
}
void modo3 (){
  analogWrite(r1,255);
    analogWrite(g1,0);
    analogWrite (b1,0);
    analogWrite(r2,255);
    analogWrite(g2,0);
    analogWrite (b2,0);
}

///MAIN LOOP///

void loop()  {

  if (irrecv.decode(&results)) {

    //play/pausa premuto
    if(results.value == Kplay) {
      if(PP==LOW){
        PP=HIGH;
        Serial.println("remote: PLAY ACCESO");
      }
      else  {
        PP=LOW;
        Serial.println("remote: PLAY SPENTO");
      }
    }

    //tasto + premuto
    if (results.value == Kpiu && lumi<255){
       lumi = lumi+20;
    }

    //tasto - premuto
    if (results.value == Kmeno && lumi>0){
      lumi=lumi -20;
    }

    // tasto << premuto
    if (results.value == Krew){
      if(modo>K_MAXMODI) {
        modo = modo-1;
      }
      else{
        modo = K_MAXMODI;
      }
    }

    // tasto>>premuto
    if (results.value==  Kffw){
      if(modo< K_MAXMODI ){
        modo = modo +1;
      }
      else{
        modo = 0;
      }
    }
    irrecv.resume();
  }
  switch (modo) {
  case 0:
    if (PP==HIGH){
      modo0();
    }
     
    break;
  case 1:
    if(PP==HIGH){
      modo1();
    }
    break;
  case 2 :
    if(PP==HIGH){
      modo2();
    }
    break;
    case 3 :
    if(PP==HIGH){
      modo3();
    }
  }
}
Il fare è il miglior modo d'imparare

nid69ita

#12
May 02, 2013, 09:56 pm Last Edit: May 02, 2013, 10:03 pm by nid69ita Reason: 1
Bene, allora avevo visto giusto:
Code: [Select]

...
switch (modo) {
 case 0:
   if (PP==HIGH){
     modo0();
   }...


Dai, dimmi dove hai scritto la strunzata... prova a ragionartela
sta in quelle righe, ricorda come è fatta la modo0()     :smiley-zipper:
my name is IGOR, not AIGOR

nid69ita

Anche questo non mi risulta molto:
Code: [Select]

if(modo>K_MAXMODI)
{ modo = modo-1;
}
else
{ modo = K_MAXMODI;
}


invece cosi si:
Code: [Select]

 modo = modo-1;
 if(modo<0) modo = K_MAXMODI;     // puoi anche scrivere tutti su riga senza {} se solo 1 istruzione



Code: [Select]

if(modo< K_MAXMODI )
{ modo=modo+1;    
}
else
{ modo=0;
}

Code: [Select]

modo=modo+1;      // puoi anche scrivere:           modo++;
if(modo>K_MAXMODI) modo=0;
my name is IGOR, not AIGOR

peenieman

Grandioso, così mi piace.
Si impara meglio, si allena il cervello a ragionare ed è molto più divertente :D:D:D

.....nello switch devo dirgli di spegnere, e così per tutti i colori giusto?
Il fare è il miglior modo d'imparare

Go Up