Salve a tutti, sto provando a realizzare una lampada con arduino ed 1 metro di stripled rgb, per amplificare il PWM di arduino uso dei bc337 la cui base è collegata ad arduino tramite una resistenza da 1kohm ed un pulldown di 10kohm per dare un riferimento a massa.
Per regolare le intensità dei colori uso un potenziometro ed un bottone aggiuntivo per scegliere quale colore (fra rosso verde e blu) far variare.
Tutto funziona bene se non il fatto che quando il PWM è al minimo le luci sono spente ma ogni tanto lampeggiano flebilmente come se arrivasse parzialmente corrente a tratti. ho provato ad inviare il segnale direttamente spegnendo il pin in maniera digitale ma non cambia nulla.
Consigli?
P.S.
Invio il codice di prova con cui sto lavorando per una migliore comprensione.
int rpin = 5; // pin RED
int gpin = 3; // pin GREEN
int bpin = 6; // pin BLU
int tasto= 4; //pin tasto
const int analogInPin = A0; // pin dei potenziometrivoid setup()
int coloreprovvisorio = 3;
int conta = 1;
int valred = 0; // variable to store the read value
void setup()
{
pinMode(bpin, OUTPUT); // sets the pin as output
pinMode(gpin, OUTPUT); // sets the pin as output
pinMode(rpin, OUTPUT); // sets the pin as output
pinMode(tasto, OUTPUT);
pinMode(analogInPin, INPUT); // sets the pin as Input
// Serial.begin(9600);
}
void loop()
{
if(digitalRead(tasto))
{
conta = conta + 1;
delay(1000);
if (conta > 3 )
{ conta = 1;}
if (conta == 3)
{ coloreprovvisorio = bpin;}
if (conta == 2)
{ coloreprovvisorio = rpin;}
if (conta == 1)
{ coloreprovvisorio = gpin;}
}
// Serial.println(valred / 4);
valred = analogRead(analogInPin);
if (valred==0) digitalWrite (coloreprovvisorio, LOW); else
analogWrite(coloreprovvisorio, valred / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}
Ok funziona, a questo punto il problema era la mia divisione per 4 anche se in fondo doveva comunque andar bene visto che cmq da monitor seriale ottenevo solo 0.
Una cosa non mi è chiara però usando map perchè non riesco ad avere lo 0 nonostante la nuova mappatura va da 0 a 1023? il minimo valore che ottengo è 1.
pin destro a massa, pin sinistro a 5v pin centrale ad analogic pin 0, con il serialwrite del valore letto ottengo valori tra 0 e 1024 correttamente.
valred = analogRead(analogInPin);
int k = valred;
// if (valred==0)
// { digitalWrite (coloreprovvisorio, LOW);
// }
// else
{ valred = map(valred, 0, 1023, 0, 255);
if (valred > 0 ) {
analogWrite(coloreprovvisorio, valred );
}
}
Serial.println(k);
ok come ti dicevo è uguale a 0 ma i led rimangono accesi anche se in maniera flebile
In realtà stampando anche valred è giustamente uguale a 0 anche questo, non capisco proprio perchè i led non si spengano.
ho tolto il risolto perchè prestando maggiore attenzione mi sono accorto che sono ancora presenti degli istanti di accensione.
Per debuggare ho provato cosi':
ed ho avuto in 1 minuti 2 istanti in cui il monitor seriale segnava 1, per eliminare il dubbio di un potenziometro difettoso ho cortocircuitato la massa di arduino con il pin A0 in modo da avere un segnale sempre nullo, ma il problema è rimasto.
Consigli o riflessioni sulla possibile causa?
P.S.
inoltre non è un problema di pwm il fatto che rimaneva acceso prima poichè con analogWrite(3, 0); il led sta spento normalmente.
con questo codice tutto funziona quindi mi fa pensare ad un problema di codice
void setup()
{
//led Rosso
pinMode(5, OUTPUT);
//led verde
pinMode(3, OUTPUT);
//led blu
pinMode(6, OUTPUT);
//init seriale
Serial.begin(9600);
}
void loop() {
//se arrivano dati...
if (Serial.available())
{
//leggi il carattere in arrivo
byte data = Serial.read();
if(data == 'q') //accende il led blu
analogWrite(3, 255);
else if (data == 'w') //spegne il led blu
analogWrite(3, 0);
if(data == 'a') //accende il led verde
analogWrite(5, 255);
else if (data == 's') //spegne il led verde
analogWrite(5, 0);
if(data == 'z') //accende il led rosso
analogWrite(6, 255);
else if (data == 'x') //spegne il led rosso
analogWrite(6, 0);
}
}
per la serie "fatti una domanda e datti una risposta" forse sono riuscito a risolvere, il problema di fondo è la lettura dell'adc che a causa di rumore non sempre è esattamente 0 ma legge 1, al che per eliminare questo rumore ho pensato di fare una media delle letture (tanto a 16mhz le letture del valore sono molto veloci) posto il codice sperando che questo sia quello definitivo, si accettano consigli e commenti sulla soluzione adottata.
int rpin = 5; // pin RED
int gpin = 3; // pin GREEN
int bpin = 6; // pin BLU
int tasto= 4; //pin tasto
const int analogInPin = A0; // pin dei potenziometrivoid setup()
int coloreprovvisorio = 3;
int conta = 1;
int valred = 0; // variable to store the read value
void setup()
{
pinMode(bpin, OUTPUT); // sets the pin as output
pinMode(gpin, OUTPUT); // sets the pin as output
pinMode(rpin, OUTPUT); // sets the pin as output
pinMode(tasto, INPUT);
pinMode(analogInPin, INPUT); // sets the pin as Input
Serial.begin(9600);
}
void loop()
{
if(digitalRead(tasto))
{
conta = conta + 1;
delay(1000);
if (conta > 3 )
{ conta = 1;}
if (conta == 3)
{ coloreprovvisorio = bpin;}
if (conta == 2)
{ coloreprovvisorio = rpin;}
if (conta == 1)
{ coloreprovvisorio = gpin;}
}
valred=0;
for (int i = 0; i<10; i++) {
valred+= analogRead(analogInPin);
}
valred = ((float)valred/10+0.5);
valred = map(valred, 0, 1023, 0, 255);
analogWrite(coloreprovvisorio, valred );
}
p.s. il lato negativo è che forse si perde qualcosa in risoluzione del potenziometro.