Impianto led 12V

Ciao a tutti,
vorrei realizzare un impianto led con il mio arduino. I led da comandare saranno almeno 36, si dovranno accendere in maniera indipendente e sono già cablati a 12v


La mia idea era di collegare ogni led ad un Mosfet però poi mi sono chiesto: come interagiscono i led con ardunio?
esiste un modulo da poter utilizzare?
Avevo pensato al modulo PCA9685 (almeno 3 in serie o parallelo dato che avrei arduino dedicato solo a questo progetto) ma verrebbe una cosa troppo complessa (oltre a non sapere se è realizzabile prendere il segnale dalla PCA (con il suo alimentatore dedicato a 5v), inviare il segnale
ai vari mosfet alimentati tutti con lo stesso alimentatore a 12v.
grazie mille

Allora, ciascun LED lo controlli con un segnale, come vedi nell'allegato ...
... per pilotarli indipendentemente ti basta usare un multiplexer digitale così daa vere quante uscite digitali vuoi.

Guglielmo

P.S.: Attenzione ... i MOSFET debbono essere "logic level" come il IRL540 indicato nello schema.

Un MOSFET a led mi pare davvero esagerato...
Prendi dei multiplexer che si possano alimentare a 12V e ci attacchi direttamente i LED che tanto più di 20/30mA non assorbono.

Ad esempio il MAX336 o il MAX306 sono dei 16 canali e te ne basterebbero 3.
A quel punto hai bisogno di un totale di 7 GPIO: 4 in parallelo su ciascun multiplexer e 3 di enable che potresti anche eventualmente usare per modulare in PWM l'intensità.

cotestatnt:
Un MOSFET a led mi pare davvero esagerato...

... mmm ... parla di LED a 12V già cablati ... non mi sembrano dei normali LED ... magari è roba ad alta potenza ... ::slight_smile:

>zioleo87: dacci un po' più di specifiche su questi LED a 12V che devi controllare ...

Guglielmo

Dalle immagini sembrano dei classici led 5mm con cavo e resistenza pre-cablata, ma in effetti tutto è possibile senza ulteriori specifiche.

Comunque anche led ad alta efficienza difficile che vadano oltre i 30mA di solito, in ogni caso se **zioleo87 **ne prova uno al volo con un multimetro in serie si toglie (e ci toglie) ogni dubbio.

Devi accenderli in maniera completamente indipendente o è sufficiente a gruppi? Per fare delle luci che "camminano", per esempio, è sufficiente comandare 3 gruppi: 1,2,3,1,2,3,1,2,3,...

cotestatnt:
Dalle immagini sembrano dei classici led 5mm con cavo e resistenza pre-cablata ...

Hai ragione, NON avevo esaminato con attenzione l'immagine ... ho fatto una ricerca, sono dei banali LED effetto fuoco con in serie una resistenza da 470Ω che, a 12V, da un 20/25 mA (dipende dalla caduta di tensione di quei LED).

10 LED 5 MM RED/ORANGE EFFETTO TREMOLANTE FUOCO ULTRALUMINOSI - EUR 6,98

Led già cablati lunghezza filo 18 cm circa, saldati e protetti con guaina termorestringente e resistenza da 470 ohm, per un alimentazione a 12 v.

... in effetti i MOSFET sono sprecati (salvo non ne voglia pilotare dei gruppetti messi assieme) :smiley: :smiley: :smiley:

Guglielmo

Si esatto, le caratteristiche sono quelle specificate da Guglielmo. In realtà potrei pure lavorare a gruppi.

Costant non mi è ben chiaro il tuo schema, come collegherei le GPIO ai multiplex? scusami ma non ho mai usato un multiplex.
Guglielmo il tuo schema elettrico mi è chiaro e coincide con ciò che avevo pensato (ad eccezione dei mosfet),ma essendo sprecati tutti questi mosfet, cosa consigli?

grazie mille

Se devono per forza essere indipendenti ... shift register piu ULN2803 ? ... oppure se lo spazio e' un problema, MIC5821 ? (che poi sono semplicemente degli shift register con driver incorporato, ognuno vale uno shift piu un ULN)

4 per 32 uscite, 5 per 40 uscite ... il tutto pilotabile con 4 pin (3, se dovessero esere troppi 4 :stuck_out_tongue: e se non interessa poter spegnere tutto in una volta o usare un PWM sull'intero blocco di led)

zioleo87:
come collegherei le GPIO ai multiplex? scusami ma non ho mai usato un multiplex.

Il collegamento sarebbe tipo questo, solo che qui viene usato il 74HC4067 che purtroppo non va bene nel tuo caso perché funziona con max 10V.
Questo schema è pensato "al contrario" ovvero per acquisire n segnali analogici, ma il principio è lo stesso. Al post di A0 nel tuo caso potresti collegare il +12v.

A,B,C,D selezionano quale canale è attivo in ciascun multiplexer, mentre il pin (attivo basso) EN abilita il singolo multiplexer (e qui potresti anche modulare in PWM se necessario).

Anche l'uso di uno shift register "High Voltage" come proposto da Etemenanki è un'ottima soluzione, anche se forse per un neofita un po' più complessa da mettere in piedi perché devi "serializzare" lo stato dei tuoi led.

A me sembra che anche usare un multiplexer hardware, o il multiplex software, non sia affatto una soluzione più semplice, anzi, se non ci sono latch in mezzo (che gli shift register contengono) ci si vincola al ciclo di scansione con notevoli complicazioni di design software.

Probabilmente il modulo PCA9685 comandato via i2c con l'aggiunta di alcuni driver per i 12V a mosfet è la via più semplice SE costruirsi qualcosa da sé è troppo complesso. Altrimenti sono un sostenitore convinto degli shift register in cascata o dei latch indirizzabili.

Se dovessi invece comandare indipendentemente 36 LED 12V in multiplex con 12 pin di Arduino (6 righe per 6 colonne) farei così:

Il che porta però alla necessità di un certo design del software, con un loop che si incarica solo di restare agganciato alla frequenza di scansione:

void loop()
{
    static uint32_t t = 0;

    if ((micros() - t) >= 3333)  // 50,005 Hz
    {
        t += 3333;
        multiplex();
        process();
    }
}

Seguito da una funzione per scandire le righe:

void multiplex()
{
    static byte i = 0;          // indice riga attuale

    digitalWrite(righe[i], 0);  // spegne riga attiva
    i = (i + 1) % 6;            // conteggio circolare 0..5

    // imposta nuove colonne attive
    digitalWrite(colonne[0], vidmem[i] & 0b00100000);
    digitalWrite(colonne[1], vidmem[i] & 0b00010000);
    digitalWrite(colonne[2], vidmem[i] & 0b00001000);
    digitalWrite(colonne[3], vidmem[i] & 0b00000100);
    digitalWrite(colonne[4], vidmem[i] & 0b00000010);
    digitalWrite(colonne[5], vidmem[i] & 0b00000001);
    
    digitalWrite(righe[i], 1);  // accende nuova riga
}

E con l'aiuto di un paio di funzioni per accendere e spegnere il singolo LED da 1 a 36:

void seton(byte n)
{
    n--;
    vidmem[n/6] |= 1 << (5 - n%6);
}


void setoff(byte n)
{
    n--;
    vidmem[n/6] &= ~(1 << (5 - n%6));
}

Il tutto prevede che vi siano due array 'righe' e 'colonne' con i pin da usare, e un array di sei byte 'vidmem' con funzione di memoria video per rappresentare le sei righe. I sei bit più bassi di ogni byte rappresentano gli stati dei singoli LED.

E naturalmente la funzione 'process', che contiene la logica del programma, non deve mai durare più di 3 millisecondi...

Aspetta, leggo adesso "effetto tremolante" ... allora se vuoi usare il multiplexing, metti un condensatore in parallelo ad ogni led ... perche' l'elettronica interna di quei led, se fa come quelli RGB flickering, si sballa a pilotarla in multiplexing, io almeno con gli RGB fast-flickering ho avuto problemi con il multiplexing ... rimaneva sempre il rosso, perche' ad ogni accensione e spegnimento del multiplex il led ricominciava il ciclo da zero ... risolto saldando dei ceramici da 1u smd direttamente sui terminali dei led, perche' era un montaggio "volante" ...

Etemenanki, che ne pensi invece di un driver per VFD tipo il MAX6921 o simili?
(dico questo perché in passato mi è capitato di usarlo, ma sicuro ci sarà qualcosa di più adeguato al caso in questione).

Che e' uno shift register con 20 uscite a bassa corrente ... occhio dove dice "Outputs can Source 40mA, Sink 4mAContinuously" sul datasheet ... quindi un led per uscita a catodo comune lo piloti, due iniziano ad essere gia troppi ... ad anodo comune invece neppure quello ...

Comunque se ne metti due in cascata e ti limiti ad un led per uscita, hai 40 uscite come con 5 shift normali ...

Ciao a tutti,
Dopo vari tentativi sono riuscito a far funzionare tutto. Con il multiplex non ci sono riuscito quindi ho optato per il mosfet ad ogni led ed ho usato 3 proceprocessori differenti.
Ho usato lo schema di gpb01 per i collegamenti.
Grazie a tutti