Go Down

Topic: Problema multicontrollo telecomando ir e led RGB (Read 866 times) previous topic - next topic

andrea2000

Ciao a tutti,sto realizzano un circuito composto da un led RGB ,  un MOC3021  e un ricevitore a infrarossi TSOP31238. Sto utilizzando arduino uno, e gli sketch che sto usando sono in parte fatti da me.
Ecco quello che deve fare arduino:
-accendo la scheda e subito si attiva il moc
-sul telecomando ir ho 2 pulsanti in modalità "toggle button", uno accende/spegne il moc , l'altro accende/spegne il loop del led RGB(il led RGB crea un effetto rainbow in dissolvenza ).
i due sketch  funzionano perfettamente se li tengo separati, ma quando li unisco per fare lo sketch definitivo e faccio partire il tutto, se premo il pulsante del MOC funziona ma quando premo l'altro il led si accende facendo il loop ma dopo non sono più in grado di spegnerlo e/o di comandare l'altro pulsante, è come se una volta dentro il loop non riesca più ad uscirne. Probabilmente sbaglio o ignoro qualcosa.

Vi allego i due sketch:

Code: [Select]

#include <IRremote.h> // use the library
int receiver = 11; // pin 3 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
int moc = 4;
int val = 0;                   
int vecchio_val = 0;         
int stato = 0; 

void setup()
{
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  pinMode(10, OUTPUT); // Verde
  pinMode(5, OUTPUT);//  Blu
  pinMode(6, OUTPUT);//  Rosso
  pinMode(4, OUTPUT);// MOC
  digitalWrite(moc,HIGH);
}

void loop()
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
   val=results.value == 0x20DF8877; // pulsante 1 del telecomando
    if ((val == HIGH) && (vecchio_val == LOW)){ 
    stato = 1 - stato; 
    delay(15);                // attesa di 15 millisecondi 
  }   
 
  vecchio_val = val;            // ricordiamo il valore precedente di val 
 
    if (stato == 1) { 
    digitalWrite(moc, LOW);   // disattiva il MOC 
  }   
  else { 
    digitalWrite(moc, HIGH);    // attiva il MOC 
  } 




Code: [Select]

int blu   = 5;
int verde = 10;
int rosso = 6;   

void setup()  {}

void loop()  {

  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(rosso, fadeValue);         
       delay(30);                           
  }
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(verde, fadeValue);         
       delay(30); 
  }
 
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(rosso, fadeValue);         
       delay(30);                           
  }
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(blu, fadeValue);         
       delay(30); 
  }
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(verde, fadeValue);         
       delay(30);                           
  }
   for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(rosso, fadeValue);         
       delay(30);                           
  }
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(verde, fadeValue);         
       delay(30); 
  }
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(verde, fadeValue);         
    analogWrite(blu, fadeValue);
    analogWrite(rosso, fadeValue);
       delay(30);                           
  }
}



E' da settimane che sono fermo a questo punto facendo molte prove e cercando in internet  ma niente , per questo sto chiedendo aiuto qui.
Voi come unireste i due sketch per fare quello che ho detto sopra?  avete qualche consiglio da darmi?
Grazie mille in anticipo!

lesto

probabilmente il problema è che internamente le due libreire usano gli stessi timer. Bel problema, o trovi una versione alternativa di libreria, o adatti una libreria, o riscrivi il codice di una libreria.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

andrea2000

Io per ora scrivere da zero o modificare le librerie non sono capace...    Non c'è un modo per aggirare questa cosa?   se serve sono anche disposto a cambiare o modificare sia il codice sia l'hardware, non ci sono problemi.
Ad esempio tu come faresti (escludendo il discorso libreria) ?

lesto

allora, fonfermo che la irRemote usa dei settaggi PWM, quindi rompe l'analogWrite.

costui ha avuto lo stesso problema ed ha risolto:
http://blog.sui.li/2011/05/27/use-any-arduino-pin-for-transmission-with-the-irremote-libary-by-soft-pwm/
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

La IRRemote usa il timer 2 di default, che significa che si perdono le funzionalità PWM sui pin 11 e 3.
Siccome andrea2000 usa i pin 5/6/10 non dovrebbe avere interferenze causate dalla libreria.
Penso piuttosto ad un errore di codice, potresti pubblicare lo sketch che ti da problemi (quello che è la fusione dei 2)?

andrea2000

Prima di tutto il codice:

Code: [Select]

#include <IRremote.h> // use the library
int receiver = 11; // pin 3 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
int moc = 4;
int val = 0;                   
int vecchio_val = 0;         
int stato = 0;
int val1 = 0;                   
int vecchio_val1 = 0;         
int stato1 = 0;
int blu   = 5;
int verde = 10;
int rosso = 6;

void setup()
{
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  pinMode(10, OUTPUT); // Verde
  pinMode(5, OUTPUT);//  Blu
  pinMode(6, OUTPUT);//  Rosso
  pinMode(4, OUTPUT);// MOC
  digitalWrite(moc,HIGH);
}

void loop()
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
   val=results.value == 0x20DF8877; // pulsante 1 del telecomando
    if ((val == HIGH) && (vecchio_val == LOW)){ 
    stato = 1 - stato; 
    delay(15);                // attesa di 15 millisecondi 
  }   
 
  vecchio_val = val;            // ricordiamo il valore precedente di val 
 
    if (stato == 1) { 
    digitalWrite(moc, LOW);   // disattiva il MOC 
  }   
  else { 
    digitalWrite(moc, HIGH);    // attiva il MOC 
  } 
  val1=results.value == 0x20DF48B7; // pulsante 2 del telecomando
    if ((val1 == HIGH) && (vecchio_val1 == LOW)){ 
    stato1 = 1 - stato1; 
    delay(15);                // attesa di 15 millisecondi 
  }   
 
  vecchio_val1 = val1;            // ricordiamo il valore precedente di val1 
 
    if (stato1 == 1) { 
    fade();                 // attiva il loop del led rgb 
  }   
  else { 
    analogWrite(rosso, 0); // metto a 0 il PWM
    analogWrite(verde, 0);
    analogWrite(blu, 0);
  } 



void fade()  {

  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(rosso, fadeValue);         
       delay(30);                           
  }
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(verde, fadeValue);         
       delay(30); 
  }
 
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(rosso, fadeValue);         
       delay(30);                           
  }
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(blu, fadeValue);         
       delay(30); 
  }
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(verde, fadeValue);         
       delay(30);                           
  }
   for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(rosso, fadeValue);         
       delay(30);                           
  }
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(verde, fadeValue);         
       delay(30); 
  }
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(verde, fadeValue);         
    analogWrite(blu, fadeValue);
    analogWrite(rosso, fadeValue);
       delay(30);                           
  }
}


Nel frattempo ho fatto altre prove e ho corretto degli errori poi ho  visto che ora lo sketch in parte funziona,cioè nello spegnimento(quando premo OFF) devo aspettare che finisca il loop RGB prima che funzionino gli altri comandi che ho dato nel frattempo , forse ho capito il problema... il  delay() mi rallenta il programma, ho ragione?   

lesto

esatto devi usare la millis(), vedi l'esempio blinkWithoutDelay
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

andrea2000

Ciao, ho guardato l'esempio BlinkWithoutDelay e l'ho inserito nel mio codice, ma non mi funziona, ho fatto molte prove cambiando anche l'ordine ma niente. Lo sketch qua sotto è il risultato migliore che sono riuscito a fare... si accende il rosso di colpo (0-100%) e poi resta acceso e non succede più niente, invece dovrebbe fare la dissolvenza.  Ho notato che cambiando il  long interval = 30; con altri valori aumenta solo il ritardo all'accensione e per il resto fa sempre come ho già detto prima. Cosa sbaglio ?

Code: [Select]

int blu   = 5;
int verde = 10;
int rosso = 6;
unsigned long previousMillis = 0;       
long interval = 30;

void setup()  {}

void loop()  {

  unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(rosso, fadeValue);
    previousMillis = currentMillis;   
  }
}
  if(currentMillis - previousMillis > interval) {
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(verde, fadeValue);         
    previousMillis = currentMillis;   
  }
}
  if(currentMillis - previousMillis > interval) {
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(rosso, fadeValue);         
     previousMillis = currentMillis;   
  }                           
}
if(currentMillis - previousMillis > interval) {
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(blu, fadeValue);         
     previousMillis = currentMillis;   
  }
}
  if(currentMillis - previousMillis > interval) {
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(verde, fadeValue);         
     previousMillis = currentMillis;   
  }                     
}
if(currentMillis - previousMillis > interval) {
   for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(rosso, fadeValue);         
      previousMillis = currentMillis;   
  }                   
}
if(currentMillis - previousMillis > interval) {
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
     analogWrite(verde, fadeValue);         
     previousMillis = currentMillis;   
  }
}
  if(currentMillis - previousMillis > interval) {
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
    analogWrite(verde, fadeValue);         
    analogWrite(blu, fadeValue);
    analogWrite(rosso, fadeValue);
     previousMillis = currentMillis; 
  }
}
}


Grazie per l'aiuto che mi state dando.

Go Up