WS2811 problemi interrupt - alternative HW

Ciao a tutti,

ho un arduino mega e sto comandando una striscia a led basata su WS2811 via seriale usando la libreria FastLed.
Avrei la necessità di utilizzare contemporaneamente la analogWrite (PWM) e la FastLed.
Ovviamente mi sono imbattuto nel problema conosciuto degli interrupt (Interrupt problems · FastLED/FastLED Wiki · GitHub).
Credo mi convenga cambiare le strisce a LED e andare sui modelli basati su APA102 o LPD8806.
Guardando in rete ci sono un pò di alternative effettivamente ma a prezzi direi abbastanza impegnativi.

Chiedo ai più esperti: esistono altre tipologie di strisce comandabili via seriale che risolvano il problema ad un prezzo un po’ minore?
Non volendo cambiare strisce nè Arduino, esistono alternative software funzionanti? Cosa mi consigliate?

Grazie mille,

Giovanni

Ci sono le SK9822 che sono dei cloni delle APA102 e costano un pochino meno (ma comunque sensibilmente di più rispetto le WS2811).

Altre soluzioni software non ne conosco. Il timing da rispettare è quello del datasheet e con il Mega puoi farlo solo usando gli interrupt… praticamente in modo esclusivo.

Potresti pensare di dedicare una MCU “secondaria” alla gestione diretta delle strisce con la quale interagisci con una delle 4 seriali hardware del Mega. Se fa solo quello, basta anche un piccolo clone di Arduino Nano ad esempio che si trova per una manciata di euro.

AnalogWrite() su un Mega non richiede interrupt. Il timer funziona ma commuta lo stato dei pin tramite hardware. Illustra il problema pubblicando il codice (minimo) che mostra che non funziona come dovrebbe.
Potrebbe esserci un'opzione software che consente l'esecuzione di interrupt, o almeno di altro codice, tra l'invio del segnale LED. Il primo chip che riceve il segnale si resetta se non c'è stato alcun segnale per la durata del tempo di reset del frame (che sfortunatamente per un WS2811 è di soli 50 µs circa, ma per un WS2812B è più vicino a 300 µs).
Se si riesce a completare l'elaborazione prima che questo tempo sia scaduto e si continua con l'invio del successivo blocco di 24 bit, il primo chip non si resetterà per ricevere i dati. Ci sono riuscito con successo utilizzando un piccolo MCU che non aveva la memoria necessaria per avere il buffer di output completo, ma con una quantità "nota" e un numero limitato di istruzioni. Un'altra opzione economica sarebbe quella di passare a una scheda diversa, come un ESP32, che consenta la trasmissione del segnale LED in background (RMT per FastLED, I2S per Makuna Neopixelbus).
Si prega di pubblicare il codice che crea il problema.

n.b con l'aiuto di Google Translate

Grazie delle risposte.

AnalogWrite() su un Mega non richiede interrupt.

@Deva_Rishi Si, corretto il problema ce l’ho sui pin dove sto usando la SoftPWM (mi ero dimenticato di indicarlo).

@cotestatnt nel caso volessi acquistare le strisce SK9822, come è l’integrazione con la FastLED?
Tu cosa faresti? Strisce a led nuove o MCU secondaria? Parla a livello di semplicità perchè non ho moltissimo tempo..

Io userei una sola MCU più “moderna” e veloce (nel 99% dei casi scelgo ESP32 perché mi piace particolarmente, ma ci sono molte altre soluzioni) a meno che tu non abbia effettivamente bisogno della gran quantità di GPIO disponibili sul mega.

Grazie delle risposte.

E usare nel codice “#define FASTLED_ALLOW_INTERRUPTS 1“ cosa comporterebbe?

Se ho capito bene la FastLED ritarda tutti gli altri interrupt fino a che tutti i dati dei led non sono stati scritti. Di fatto mettendo quindi FASTLED_ALLOW_INTERRUPTS a 1 significherebbe dire alla FastLED di permettere interrupt da parte di altri comandi e quindi dovrei attenuare il problema.

Corretto? A quali altre problematiche posso andare incontro?

Visto che ho trovato questo problema durante l’utilizzo della libreria SoftPWM, mi chiedo se può aver senso pensare di utilizzare altri modi di fare il soft PWM (istruzioni tipo millis o micros)..anche queste utilizzano l’interrupt? Ricadrei nel problema precedente utilizzando FastLED e queste istruzioni (non più Soft PWM)?

Devo accegnere e spendere lampadine con poco assorbimento (al max 100 mA) quindi mi basterebbe una frequenza di PWM di qualche centinaio di Hz.

Grazie mille

Molto probabilmente il segnale LED indirizzabile risulterebbe troppo distorto.

Poiché il segnale della striscia LED impiega un bel po' di tempo per essere trasmesso, il pin rimarrà in stato ALTO o BASSO per tutto il periodo di trasmissione, il che probabilmente si tradurrà in qualcosa di simile e manterrà il processore in posizione. SoftPWM almeno non è bloccante. Finora non hai spiegato il motivo per cui utilizzi un PWM software. Ci sono 11 pin PWM disponibili sul Mega, perché te ne servono di più? Se vuoi usare più LED e poterli sfumare, perché non usi più LED indirizzabili, visto che li usi già? Infatti, anche aggiungendo chip WS2811 sciolti avrai 3 canali PWM hardware per chip e potrai semplicemente aggiungerli alla catena. Quindi, per favore, spiega prima perché hai bisogno di SoftPWM, altrimenti possiamo considerare questo un problema X-Y.

Ho bisogno di tante uscite PWM per comandare più luci (non sono LED) e poterlo fare singolarmente variandone l’intensità.
La striscia a LED mi serve per creare lo sfondo colorato della mia ambientazione (presepio) e devo poter variare sia colore sia l’intensità.

I pin hardware PWM non mi sono sufficienti per gestire tutte le luci che ho, quindi sto utilizzando la SoftPWM che però va in “conflitto” con la FAstLED perchè la FastLED disabilita tutti gli interrupt.
Sto cercando una soluzione software (se esiste) prima di passare all’acquisto delle strisce a LED APA102 o SK9822.