astrobeed, se hai voglia e mi posti il codice sarebbe bello, almeno capisco e mi evolvo.....
Poi ovviamente vi tengo aggiornati sugli sviluppi, dovese servire ad altri.....
Beh ... QUI trovi una discreta spiegazione con sufficienti dettagli tecnici ... :
Guglielmo
Scusate la domanda scema.....
ma... io sto usando dei moduli "compatibili" basati su Ws2812, è d'obbligo usare la libreria NeoPixel, o posso comandare il Ws2812 in altro modo, preservando la servo di Arduino e quindi montando i tre servo?
Tipo, il lavoro di questo ragazzo mi pare interessante.....
adepalo:
ma... io sto usando dei moduli "compatibili" basati su Ws2812, è d'obbligo usare la libreria NeoPixel
Neopixel è un nome commerciale che si è inventato Adafruit per i WS2812, la libreria di Adafruit è fatta bene, possiede diverse funzioni per gestire i giochi di luce, l'unica libreria alternativa che conosco è la FastLed, tra le due non saprei dire qual'è la migliore dal punto di vista efficienza del codice, la Fastled ha meno funzioni però gestisce diversi tipi di smartled e gira anche su vari tipi di Arm.
La pagina che hai linkato fa il sunto di quanto ti ho già spiegato, la libreria, non importa quale, nel momento in cui deve inviare i dati ai led disattiva gli interrupt e fino a che non ha finito non li riattiva, quanto tempo ci vuole dipende da quanti led devi gestire, come indicato nella pagina occorrono circa 30 us per ogni led su cui devi scrivere.
Da notare che se hai 100 led e scrivi solo su i primi dieci il tempo totale sono 300us, per contro se scrivi solo sull'ultimo led il tempo totale sono 3000 us, in realtà qualcosa di meno, perché la comunicazione deve propagarsi di led in led e il micro deve comunque generare 100 frame di comando, 99 vuoti 1 con i dati per il centesimo led.
Come ti accennavo per i servo la soluzione è aggiornare i led quando l'impulso di comando si trova a 0, in questa condizione non c'è rischio di perdere interrupt relativi alla libreria servo, pertanto ipotizzando di collegare 6 servo, sulla UNO sono gestiti in cascata, occorrono fino a 15 ms per generare tutti gli impulsi ppm, caso peggiore, il che lascia 5 ms liberi, il frame dei servo dura 20 ms, per aggiornare i WS2812, ne puoi gestire fino a 155-160 con una velocità di aggiornamento fino a 50 volte al secondo, più che sufficiente per una barra che indica la posizione del servo.
Sto iniziando a capire, in pratica si tratta di lanciare un comando che baypassi gli interrupt aggiorni tutti i led in un colpo solo (senza fare un incrementale), a servo fermi?
Quindi.... avend io ho una ledbar da 8 e una da 24..... come traslo il buon vecchio "map" in tutto questo gioco di comunicazioni seriali?
Mi sembrano frammenti di sketch scritti per uno che A) sa le cose B) ha un livello di preparazione superiore al mio.
const uint8_t header[4] = { 0xDE, 0xAD, 0xBE, 0xEF };
void loop() {
// we're going to read led data directly from serial, after we get our header
uint8_t b = Serial.read();
while(true) {
bool looksLikeHeader = false;
if(b == header[0]) {
looksLikeHeader = true;
for(int = 1; looksLikeHeader && (i < sizeof(header)); i++) {
b = Serial.read();
if(b != header[i]) {
// whoops, not a match, this no longer looks like a header.
looksLikeHeader = false;
}
}
}
if(looksLikeHeader) {
// hey, we read all the header bytes! Yay! Now read the frame data
int bytesRead = 0;
while(bytesRead < (NUM_LEDS *3)) {
bytesRead += Serial.readBytes(((uint8_t*)leds) + bytesRead, (NUM_LEDS*3)-bytesRead);
}
}
}
// now show the led data
FastLED.show();
// finally, flush out any data in the serial buffer, as it may have been interrupted oddly by writing out led data:
while(Serial.available() > 0) { Serial.read(); }
}
ho compreso la questione degli header, non bene il contenuto degli if, ma soprattutto non trovo l'equivalente del map......
Perdonate l'ignoranza, non punitela
astrobeed:
Neopixel è un nome commerciale che si è inventato Adafruit per i WS2812, la libreria di Adafruit è fatta bene, possiede diverse funzioni per gestire i giochi di luce, l'unica libreria alternativa che conosco è la FastLed, tra le due non saprei dire qual'è la migliore dal punto di vista efficienza del codice, la Fastled ha meno funzioni però gestisce diversi tipi di smartled e gira anche su vari tipi di Arm.
La pagina che hai linkato fa il sunto di quanto ti ho già spiegato, la libreria, non importa quale, nel momento in cui deve inviare i dati ai led disattiva gli interrupt e fino a che non ha finito non li riattiva, quanto tempo ci vuole dipende da quanti led devi gestire, come indicato nella pagina occorrono circa 30 us per ogni led su cui devi scrivere.
Da notare che se hai 100 led e scrivi solo su i primi dieci il tempo totale sono 300us, per contro se scrivi solo sull'ultimo led il tempo totale sono 3000 us, in realtà qualcosa di meno, perché la comunicazione deve propagarsi di led in led e il micro deve comunque generare 100 frame di comando, 99 vuoti 1 con i dati per il centesimo led.
Come ti accennavo per i servo la soluzione è aggiornare i led quando l'impulso di comando si trova a 0, in questa condizione non c'è rischio di perdere interrupt relativi alla libreria servo, pertanto ipotizzando di collegare 6 servo, sulla UNO sono gestiti in cascata, occorrono fino a 15 ms per generare tutti gli impulsi ppm, caso peggiore, il che lascia 5 ms liberi, il frame dei servo dura 20 ms, per aggiornare i WS2812, ne puoi gestire fino a 155-160 con una velocità di aggiornamento fino a 50 volte al secondo, più che sufficiente per una barra che indica la posizione del servo.
astrobeed
sul forum in lingua inglese ho trovato questo:
Il detach può essere una soluzione?