Led RGB Anodo comune

Ciao ragazzi, una semplice domanda, i led RGB ad anodo comune (per evitare miei errori tra anodo e catodo specifico il polo positivo in comune), si possono usare con Arduino?
ho visto qualche tutorial che li usa ma in versione high e low, mentre io ero curioso se si possono usare con le uscite pwm di arduino e quindi gestendo la potenza di accensione di ogni colore.

Se si, a parte il montaggio e la resistenza sull'anodo il codice di programmazione si scrive in maniera identica oppure bisogna apportare modifiche?
Nel tutorial se non ho capito male dicevano che per High e low il comando era opposto, in pratica il low lo accendeva e high lo spegneva, mentre per i pwm con i valori 0, 255 come funziona?

Grazie per le vostre risposte.

Led RGB ad anodo comune ce ne sono, ma direttamente con i pin di Arduino, al massimo ne piloti uno (due se usi tutti e 6 i pin PWM, tre per led) ... e le resistenze vanno sui catodi, non sull'anodo :wink:

Le resistenze, in generale, devono essere una per ogni led: se gli anodi sono collegati insieme, devono essere messe sui catodi. :slight_smile:

Se si, a parte il montaggio e la resistenza sull'anodo il codice di programmazione si scrive in maniera identica oppure bisogna apportare modifiche?

A parte le limitazioni sul numero dei pin (e che comunque valgono anche per quelli a catodo comune), nel caso dell'anodo comune devi invertire il valore del PWM, cioè avrai la massima luminosità con il valore mino e viceversa. In pratica invece di scrivere analogWrite(pwmval) devi scrivere analogWrite(255- pwmval), dove pwmval può variare tra 0 e 255.

Ciao, Ale.

Vi ringrazio a tutti per l'aiuto sia a livello di montaggio che di programmazione

Ciao ragazzi, mi sono arrivati i led, grazie al vostro aiuto, ho ottenuto il risultato voluto.
volevo chiedervi ma se volessi abbassare la luminosità, senza aumentare il valore delle resistenze o senza inserire un potenziometro, è possibile tramite codice?
Grazie

Hedaa:
... ma se volessi abbassare la luminosità, senza aumentare il valore delle resistenze o senza inserire un potenziometro, è possibile tramite codice?

Solo se i pin usati possono funzionare in PWM ... quali sono dipende dalla scheda Arduino usata :slight_smile:

Guglielmo

Puoi provare alimentando l'anodo comune con un altro PWM, di quelli a frequenza diversa, ad esempio l'I/O9.

Datman:
Puoi provare alimentando l'anodo comune con un altro PWM, di quelli a frequenza diversa, ad esempio l'I/O9.

... NON ci siamo con la corrente ... sta alimentando un LED RGB quindi un pin sull'anodo comune te lo scordi ... gli serve comunque un piccolo MOSFET, ma, se ha usato pin PWM per i tre catodi fa prima a regolare il PWM come gli è già stato chiaramente indicato al post #3.

Guglielmo

Beh... Con 3 resistenze da 1k (con cui già si ottiene una bella luce) può farlo.
Mi sembra, però, che non abbia scritto che resistenze usa. D'altra parte, anche con 330 Ohm sono circa 10mA l'uno e 30mA totali.

Datman:
Mi sembra, però, che non abbia scritto che resistenze usa. D'altra parte, anche con 330 Ohm sono circa 10mA l'uno e 30mA totali.

... sei veramente al limite ... l'absolute maximum rating per un pin Arduino (AVR) è di 40mA ... ma, per evitare danni, bisogna stare lontani da tale limite (60%, max 70%) ... io eviterei di assorbire più di un 20 - 25mA da un pin, poi ... ciascuno rischia come vuole.

Guglielmo

Visivamente, modulando il PWM, l'effetto non è graduale, la stessa variazione si nota meno quando sono tanto accesi e di più quando si stanno per spegnere. Credo dipenda dal fatto che il nostro occhio rimane abbagliato e nota meno le differenze quando c'è troppa luce.

I 3 led interni, lavorano a tensioni differenti e possono avere resa differente a parità di corrente.
Per il primo motivo è obbligatorio mettere una resistenza per ogni led e non una sola sul comune. Se non lo fai, si accenderà correttamente solo il led con tensione di lavoro minore forzando questa tensione su tutti gli altri led tenendoli spenti o quasi.
Per il secondo motivo (oltre che per il primo), si possono calcolare le resistenze distintamente, sia per venire incontro alle differenze di tensione di lavoro (primo motivo), che di resa, abbassando la corrente sui led dalla resa più elevata, in modo da non averne uno che prevale rispetto agli altri. Questo, tipicamente, lo faccio ad occhio aumentando i valori rispetto al valore ideale calcolato in base alle tensioni di lavoro.
Non ricordo a memoria se il rosso è tipicamente quello con resa maggiore o minore.

Questo vale sia per l'anodo comune che per il catodo comune, per questo ho usato termini generici.

Qui una spiegazione con i led normali e i valori tipici che dovrebbero essere simili anche per i led rgb.
Pur essendo quelli del link valori indicativi, sono comunque significativi, perchè si discostano di poco da quelli riscontrabili nella realtà.

Maurizio

maubarzi:
...
Non ricordo a memoria se il rosso è tipicamente quello con resa maggiore o minore.
...

Per l'occhio umano, minore ... (il contrario per i componenti elettronici) ...

Sui led per pannelli pubblicitari lo vedresti subito, perche' sono RRGB invece che RGB, cioe' ci sono due chip rossi, uno verde ed uno blu per compensare la minor sensibilita' all'occhio del rosso ...

maubarzi:
Visivamente, modulando il PWM, l'effetto non è graduale, la stessa variazione si nota meno quando sono tanto accesi e di più quando si stanno per spegnere.

E' poca la dinamica di 8 bit. Considera che quando passi:
da 200 a 201, l'incremento è dello 0,5%;
da 50 a 51, 2%;
da 10 a 11, 10%;
da 3 a 4, 33%;
da 2 a 3, 50%;
da 1 a 2, 100%;
da 0 a 1, ∞ !
Se la luminosità a livello 1 è percepibile, i salti da 0 a 1, da 1 a 2 e da 2 a 3 sono molto evidenti.
Volendo fare uno sfumo come un cuore che pulsa, alla fine ho fatto una semplice commutazione alto-basso e ho messo un integratore RC e un transistor.
Sarebbe interessante provare ad aggiungere un'altra uscita PWM con due resistenze pesate, in rapporto 256:1.

Datman:
... da 0 a 1, ∞ ...

Quindi, se volessi luminosita' infinita, basterebbe fare PWM = 1 ... :stuck_out_tongue:

(scherzo, ovviamente, lo so che e' dinamica e non livello ... solo non ho resistito :D)

A proposito, anche mettere un condensatore in parallelo ai chip aiuta ad "ammorbidire" un po le variazioni, anche se non molto ... un sistema RCR leggermente di piu (dividere la resistenza in due mettendo il condensatore fra il centro delle resistenze e l'altro pin del led) ... ma ammorbidiscono solo le transizioni, comunque ...

Ciao ragazzi.
Sto usando le porte PWM per avere il cambio colore con il codice che mi è stato consigliato al post 3, ma non capisco una cosa se io vario da o a 255 i vari pin ottengo colori diversi, ma se volessi ottenere colori diversi ma con una luce non forte, ma una luce veramente bassa, c'è un modo per farlo tramite codice?

Analogwirte(255- valore random), mi crea un cambio di colore ora faccio un esempio:
....
AnalogWrite (rosso, 255 - 134);
AnalogWrite (verde, 255 - 120);
AnalogWrite ( blu, 255 - 100);
....

Mi da un certo colore supponiamo il viola, se volessi il viola ma molto fioco come quantità di luce emessa c'è un metodo che non sia aumentare il valore delle resistenze o mettere un potenziometro?
un linea di codice che gestisce sia il colore sia la potenza di luce (passatemi il termine)?
Per le mie conoscenze, ho iniziato da poco, pensavo che potessi fare così, ma forse sbaglio:
invece di calcolare un valore sulla scala 0, 255, potrei calcolarlo su una scala 0, 150 quindi usare come livello massimo 150 ed avere tutte le scale di colore ma a luce più bassa, giusto oppure ho detto una sciocchezza?

Una cosa del genere:

analogWrite(ledR, R*I/100);
analogWrite(ledG, G*I/100);
analogWrite(ledB, B*I/100);

dove R, G e B sono le intensità (byte) di ciascun colore tra 0 e 255 e I, unsigned int tra 0 e 100, l'intensità complessiva. Però perdi dinamica...

Hedaa:
Sto usando le porte PWM per avere il cambio colore con il codice che mi è stato consigliato al post 3

... nei limiti dell'errore dell'occhio umano ... se vari proporzionalmente il valore PWM per tutti, in realtà NON cambi colore, ma cambi intensità, se invece cambi i rapporti di PWM cambi proprio colore.

Tutto questo in pura teoria dato che, come ti è stato più volte detto, l'occhio tutto è meno che lineare, per cui ... alla vista molte cose NON sembreranno come sono.

Guglielmo

P.s.: Ho scritto bene che almeno I deve essere unsigned int per contenere il risultato temporaneo di RI, GI e B*I, che potrà essere fino a 25500?
Potrei anche dividere prima per 100, ottenendo sempre calcoli intermedi con i decimali e poi il risultato troncato?
Esperti di C, ci fate un ripassino? :slight_smile: Grazie!

Uhmm... Dopo aver consultato "C++ Fondamenti di programmazione" credo di poter dire che la seconda risposta sia SI'...

Datman:
E' poca la dinamica di 8 bit. Considera che quando passi:
da 200 a 201, l'incremento è dello 0,5%;
da 50 a 51, 2%;
da 10 a 11, 10%;
da 3 a 4, 33%;
da 2 a 3, 50%;
da 1 a 2, 100%;
da 0 a 1, ∞ !
Se la luminosità a livello 1 è percepibile, i salti da 0 a 1, da 1 a 2 e da 2 a 3 sono molto evidenti.

Ecciavresti ragione pure tu ;D daltrondeeeeeee... in effettiiiiiiiii......

Bella la singolarità da 0 a 1 :stuck_out_tongue: :smiley:

Maurizio