Go Down

Topic: kitt knight rider (Read 2177 times) previous topic - next topic

Datman

Considera il movimento è veloce, quindi l'occhio non riesce ad apprezzare finezze sullo sfumo! :-) Penso che due led di scia siano più che sufficienti.

Trent'anni fa feci delle luci "Supercar" per un venditore di auto che le montava sulle auto dei clienti. Usavo un contatore (CD4017? o forse contavo in binario e poi decodificavo a 16 uscite?) con le uscite combinate in OR con coppie di diodi che realizzavano un contatore avanti-indietro. Poi c'erano dei transistorini piccoli ma robusti (BC637?...) pilotati tramite una resistenza e un condensatore (per la scia) che accendevano delle lampadine da albero di Natale. :-)

Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Standardoil

#16
Mar 15, 2019, 06:51 pm Last Edit: Mar 15, 2019, 07:10 pm by Standardoil
EDIT
doccia fatta, sto per uscire mi accorgo di essermi dimenticato i tag code
Ok, piatto ricco mi ci ficco
non ho la libreria, tanto non ho nemmeno i LED necessari, quindi non ho nemmeno provato a compilare
ma questa mi sembra un'idea interessante
cominciamo col premabolo
Code: [Select]

// di Nelson "StandardOil"
// Idea da sviluppare: Kitt di supercar

#include <SoftPWM.h>

// Numero totale di LED
#define NULED 8
// Primo pin corrispondente al primo led e così via
#define START 2
// Numero di passi da 0 a 100% luminosità
#define STEP 10
//Tempo tra un passo e l'altro
#define TEMPO
// variabile attuale tempo
unsigned long int tempo;


come vedete imposto il solito cinema
numero dei led, primo piedino, variabile tempo
ma imposto anche il numero di passi da fare per passare da 0 a 255 di luminosità
Non mi vergogno di avere un premabolo simile a quelli già postati, si tratta come ho detto del solito circo...
la setup
Code: [Select]

void setup(void)
{
    SoftPWMBegin();

    // inizializziamo i led
    for (byte i = 0; i < NULED; i++)
    {
        SoftPWMSet(i + START, 0);
    }

    // tempo di fade controllato dalla loop
    SoftPWMSetFadeTime(ALL, 0, 0)
    // primo passo
    tempo = millis();
}


non mi risulta che con la softpwm serva la pinMode, casomai è una riga
anche qui, il solito cinema, si puo' dire copiato pari pari dai soliti esempi
la loop
Code: [Select]

void loop(void)
{
    if (millis() - tempo > TEMPO)
    {
        tempo = millis();
        passo();
    }

    // loop cortissima
    // non bloccante
}

è provate a dirmi che non è chiara....
solo un test su millis e il richiamo di una funzione ad hoc
naturalmente il lavoro sporco lo fa la passo()
Code: [Select]

void passo(void)
{
    // avanza di un passo nella sequenza
    // indicatore della luminosità raggiunta
    static byte lum = 0;
    // indicatore al led da accendere (come dire puntatore)
    static byte indicatore = 0;
    // indicatore al led da spegnere
    static byte spegnimento = 0 + NULED - ACCESI;
    // alzo la sua luminosità
    lum++;
    SoftPWMSet(indicatore + START, int a = (int)255 * lum / PASSI)

    if (lum >= PASSI)
    {
        // led tutto acceso
        // passo a quelli dopo
        lum = 0;
        indicatore++;
        indicatore = indicatore % NULED;
        spegnimento++;
        spegnimento = spegnimento % NULED;
    }

    // e così ho acceso il led
    // devo spegnere quello acceso prima
    SoftPWMSet((spegnimento - 3 + NULED) % NULED, 255 - a)
}

dove abbiamo una serie di variabili static (per tenere tracca da una chiamata con l'altra
del numero del led da accendere
del passo raggiunto con quel led
e, udite udite:
del numero del led da "spegnere", alcuno led "indietro" rispetto a quello da accendere

ora devo andare, e quindi non posso finire, manca solo una cosa
in questo momento è monodirezionale, la luce non torna indietro
ma si tratta di una banalità: con un paio di operatori modulo e assoluto si mette a posto
adesso bella barista, auguratemi buona fortuna....
Prima legge di Nelson (che sono io): A parità di risultato maggiore è il pensiero, minore il lavoro. Quindi prima di fare pensa!
Non si da retta a studenti: andate a copiare da un'altra parte...
Lo hai visto su Youtube? -> lo chiedi su Youtube

Standardoil

#17
Mar 16, 2019, 07:49 am Last Edit: Mar 16, 2019, 08:02 am by Standardoil
naturalmente non andava, qualche variabile con grafia differente, qualche punto e virgola, cose leggere insomma
peraltro fortunato in amore....
ma siccome vi devo ringraziare per gli auguri di ieri metto qui la versione che almeno compila
Code: [Select]

// di Nelson "StandardOil"
// Idea da sviluppare: Kitt di supercar

#include <SoftPWM.h>

// Numero totale di LED
#define NULED 8
// Primo pin corrispondente al primo led e così via
#define START 2
// Numero di passi da 0 a 100% luminosità
#define PASSI 10
//Tempo tra un passo e l'altro in millisecondi
#define TEMPO 10
// Numero dei led da tenere accesi contemporanemante
#define ACCESI 2
// variabile attuale tempo
unsigned long int tempo;

void setup(void)
{
    SoftPWMBegin();

    // inizializziamo i led
    for (byte i = 0; i < NULED; i++)
    {
        SoftPWMSet(i + START, 0);
    }

    // tempo di fade controllato dalla loop
    SoftPWMSetFadeTime(ALL, 0, 0);
    // primo passo
    tempo = millis();
}

void loop(void)
{
    if ((millis() - tempo) > TEMPO)
    {
        tempo = millis();
        passo();
    }

    // loop cortissima
    // non bloccante
}

void passo(void)
{
    // avanza di un passo nella sequenza
    // indicatore della luminosità raggiunta
    static byte lum = 0;
    // indicatore al led da accendere (come dire puntatore)
    static byte indicatore = 0;
    // indicatore al led da spegnere
    static byte spegnimento = 0 + NULED - ACCESI;
    // alzo la sua luminosità
    lum++;
    int a = (int)255 * lum / PASSI;
    SoftPWMSet(ritorno(indicatore) + START, a);

    if (lum >= PASSI)
    {
        // led tutto acceso
        // passo a quelli dopo
        lum = 0;
        indicatore++;
        indicatore = indicatore % (NULED * 2);
        spegnimento++;
        spegnimento = spegnimento % (NULED * 2);
    }

    // e così ho acceso il led
    // devo spegnere quello acceso prima
    SoftPWMSet((ritorno(spegnimento) + NULED) % NULED, 255 - a);
}

byte ritorno(byte ingresso)
{
    // fa ritornare indietro se abbiamo superato la metà
    if (ingresso > NULED)
    {
        return NULED * 2 - ingresso;
    }

    return ingresso;
}

invece, ho pensato che se usassi la funzione specifica della libreria che il fade in ed out se le gestisce lei...
avrei questo:
Code: [Select]

// di Nelson "StandardOil"
// Idea da sviluppare: Kitt di supercar V2

#include <SoftPWM.h>

// Numero totale di LED
#define NULED 8
// Primo pin corrispondente al primo led e così via
#define START 2
// tempo di fade
#define FADE 100 // che ne so quale e' bello all'occhio, serve provare
//Tempo tra un passo e l'altro in millisecondi
#define TEMPO 100
// Numero dei led da tenere accesi contemporanemante
#define ACCESI 2
// variabile attuale tempo
unsigned long int tempo;

void setup(void)
{
    SoftPWMBegin();

    // inizializziamo i led
    for (byte i = 0; i < NULED; i++)
    {
        SoftPWMSet(i + START, 0);
    }

    // tempo di fade controllato dalla loop
    SoftPWMSetFadeTime(ALL, FADE, FADE);
    // primo passo
    tempo = millis();
}

void loop(void)
{
    if ((millis() - tempo) > TEMPO)
    {
        tempo = millis();
        passo();
    }

    // loop cortissima
    // non bloccante
}

void passo(void)
{
    // avanza di un passo nella sequenza
    // indicatore della luminosità raggiunta
    static byte lum = 0;
    // indicatore al led da accendere (come dire puntatore)
    static byte indicatore = 0;
    // indicatore al led da spegnere
    static byte spegnimento = 0 + NULED - ACCESI;
    // lo accendo
    SoftPWMSet(ritorno(indicatore) + START, 255);
    // e così ho acceso il led
    // devo spegnere quello acceso prima
    SoftPWMSet(ritorno(spegnimento) + START, 0);
    // passo a quelli dopo
    indicatore++;
    indicatore = indicatore % (NULED * 2);
    spegnimento++;
    spegnimento = spegnimento % (NULED * 2);
}

byte ritorno(byte ingresso)
{
    // fa ritornare indietro se abbiamo superato la metà
    if (ingresso > NULED)
    {
        return NULED * 2 - ingresso;
    }

    return ingresso;
}

che lascia gestire i tempi di fade alla softpwm
e comunque ci ho ancora trovato un bel bacherozzo nel calcolo del piedino
....niente....
la soluzione migliore come leggibilità sarebbe passare per un array di piedini, che a questo punto potrebbero anche non essere ne contigui ne in ordine, e l'indice dell'array come numero del led
una cosa così:
Code: [Select]

// di Nelson "StandardOil"
// Idea da sviluppare: Kitt di supercar V3

#include <SoftPWM.h>

// array di pin
byte piedino[]={2,3,4,5,6,7,8,9,10};
// numero dei led
byte NULED=sizeof(piedino)/sizeof(piedino[0]);
// tengo NULED maiuscolo per non alterare il codice rispetto a quando era una define


// tempo di fade
#define FADE 100 // che ne so quale e' bello all'occhio, serve provare
//Tempo tra un passo e l'altro in millisecondi
#define TEMPO 100
// Numero dei led da tenere accesi contemporanemante
#define ACCESI 2
// variabile attuale tempo
unsigned long int tempo;

void setup(void)
{
    SoftPWMBegin();

    // inizializziamo i led
    for (byte i = 0; i < NULED; i++)
    {
        SoftPWMSet(piedino[i] , 0);
    }

    // tempo di fade controllato dalla loop
    SoftPWMSetFadeTime(ALL, FADE, FADE);
    // primo passo
    tempo = millis();
}

void loop(void)
{
    if ((millis() - tempo) > TEMPO)
    {
        tempo = millis();
        passo();
    }

    // loop cortissima
    // non bloccante
}

void passo(void)
{
    // avanza di un passo nella sequenza
    // indicatore al led da accendere (come dire puntatore)
    static byte indicatore = 0;
    // indicatore al led da spegnere
    static byte spegnimento = 0 + NULED - ACCESI;
    // lo accendo
    SoftPWMSet(piedino[ritorno(indicatore)], 255);
    // e così ho acceso il led
    // devo spegnere quello acceso prima
    SoftPWMSet(piedino[ritorno(spegnimento)], 0);
    // passo a quelli dopo
    indicatore++;
    indicatore = indicatore % (NULED * 2);
    spegnimento++;
    spegnimento = spegnimento % (NULED * 2);
}

byte ritorno(byte ingresso)
{
    // fa ritornare indietro se abbiamo superato la metà
    if (ingresso > NULED)
    {
        return NULED * 2 - ingresso;
    }

    return ingresso;
}
Prima legge di Nelson (che sono io): A parità di risultato maggiore è il pensiero, minore il lavoro. Quindi prima di fare pensa!
Non si da retta a studenti: andate a copiare da un'altra parte...
Lo hai visto su Youtube? -> lo chiedi su Youtube

maubarzi

bene bene bene ma non benissimo...
@doppiozero aveva il fade anche in accensione creando una prescia che dava all'effetto un aspetto migliore ;)
però un plauso per il risultato ottenuto:
doccia fatta...
:P :P :P
;)
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Standardoil

Va che io ho sempre avuto il fade in accensione, guarda bene
Prima legge di Nelson (che sono io): A parità di risultato maggiore è il pensiero, minore il lavoro. Quindi prima di fare pensa!
Non si da retta a studenti: andate a copiare da un'altra parte...
Lo hai visto su Youtube? -> lo chiedi su Youtube

maubarzi

#20
Mar 16, 2019, 12:01 pm Last Edit: Mar 16, 2019, 12:03 pm by maubarzi
scappommi? chiedo venia allora ;) mi devo essere fatto abbindolare dal "solito cinema" iniziale :P
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Standardoil

non mi è chiaro...
ma io e te abbiamo avuto la stessa maestra? siamo per così dire "fratelli di quaderno a righe"?
parliamo e pensiamo in maniera simile........
comunque tutto il meccanismo che ho pensato da ultimo sfrutta la caratteristica della softpwm di gestire lei le rampe in e out
se si gioca in maniera opportuna coi tempi, le velocità delle rampe e il numero di led accesi (shift tra accensione e spegnimento) permettee di avere pre-scie, scie lunghe e magari anche l'effetto di terminare la rampa e avere il led N pienamente acceso "senza" che sia partita la pre-scia su N+1 (che non so che effetto scenico sia, dopo averlo scritto mi sono reso conto che vale "una caxata pazzzzeeesscaaaaa", comunque c'è)
Prima legge di Nelson (che sono io): A parità di risultato maggiore è il pensiero, minore il lavoro. Quindi prima di fare pensa!
Non si da retta a studenti: andate a copiare da un'altra parte...
Lo hai visto su Youtube? -> lo chiedi su Youtube

maubarzi

ma io e te abbiamo avuto la stessa maestra? siamo per così dire "fratelli di quaderno a righe"?
Io sono un po' come Schwarzenegger, se tu sei un po' come DeVito allora si spiegherebbero tante cose...
Stasera chiedo a mia madre se mi ha per caso tenuto nascosto un fratello gemello ;)
Comunque, in particolare mi riferivo a quanto scritto da Datman che su un suo vecchio lavoro aveva fatto la scia solo dietro come le comete, se non ho capito male e al fatto di non usare la libreria softpwm.
Poi tu hai postato 4 o 5 versioni diverse nell'unità di tempo e devo essere andato in cortocircuito.
Dal video dei primi post, che ho visto al rallentatore, si vede bene la dissolvenza e non è malaccio, per cui ero particolarmente sensibile alla cosa...
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

doppiozero

#23
Mar 16, 2019, 01:42 pm Last Edit: Mar 16, 2019, 01:43 pm by doppiozero
Ho provato a valutare anche l'opzione con dissolvenza fatta con condensatore ma mi sono venuti valori abbastanza grandi, dell'ordine del mF da 100uF a 2mF a seconda della durata della dissolvenza con corrente di picco sul led di 20mA. Un po' tantino, per cui ho accantonato l'idea.

Mi pare di aver usato 100uF ma ovviamente sono abbastanza scomodi condensatori di quella taglia, uno per ogni led. Meglio sicuramente via software
Runtime Clock Manager -- https://github.com/duezero/RCM---Runtime-Clock-Manager
GPX datalogger -- https://github.com/duezero/GPX-datalogger
AVR HV Rescue Board -- https://www.youtube.com/watch?v=EErKo0aTEio

Standardoil

Del mio aspetto fisico ne abbiamo già discusso qui circa un anno fa
sono la versione "bella" del buon dottore (Isaac Asimov, per chi non lo sapesse) solo che non ho le basette, ma una barba da Babbo Natale (in effetti quando sono di stagione i bimbi al supermercato mi scambiano per lui, e io accontento le madri prendedole sulle mie ginocchia Ops non le madri almeno non subito, i bimbi)
comunque non sono tre o 4 versioni, sono tre successivi affinamenti della stessa
io mio gioco è che io non gestisco i led spenti o accesi, li lascio lì dove sono
con due indici chiusi in circolo accendo (prima e spengo dopo) un solo led in successione
gestendo il fade nella prima stesura (dove non avevo ancora capito che poteva farlo la libreria) e lasciando che lo gestisca la libreria nelle successive
invece nella terza ho mandato a mare i conti di piedino offset modulo ritorno e altro, uso l'indice di un array di piedini (ho "in-diretto" i piedini)
Prima legge di Nelson (che sono io): A parità di risultato maggiore è il pensiero, minore il lavoro. Quindi prima di fare pensa!
Non si da retta a studenti: andate a copiare da un'altra parte...
Lo hai visto su Youtube? -> lo chiedi su Youtube

maubarzi

Del mio aspetto fisico...
Io ho lo stesso taglio di sopracciglia di Schwarzenegger e una pettinatura simile ;)

Non volevo criticare la tua soluzione ma solo dire che l'avevo letta con troppa superficialità e quindi ne sono rimasto abbagliato, da cui lo schianto ;)

Mi pare di aver usato 100uF ma ovviamente sono abbastanza scomodi condensatori di quella taglia, uno per ogni led. Meglio sicuramente via software
Valutando 20mA e mezzo secondo di dissolvenza mi risultava qualcosa come 2mF dimezzando la corrente e il tempo si scende come dimensione, comunque restano un po' grossetti lo stesso, quindi anche io ho preferito abbandonare l'idea.
Mi ero anche buttato a ipotizzare di usarli per pilotare la base di un transistor, e quindi ridurre di un fattore 100 le correnti in gioco facendolo, però, lavorare in zona lineare, ma stava diventando un progetto un po' troppo: cannnone per uccidere il moscerino.

Nei prossimi giorni, se mi avanza curiosità e tempo, provo la soluzione con shift register e byte a scorrimento di bit (sul film le luci mi sembravano 8).
Sarebbe abbastanza sulla falsariga del progetto di Standardoil anche se vorrei evitare di usare la libreria.
Con lo shift register passerei il byte direttamente al cip un po' adulterato per gestire la dissolvenza, quindi bit prima e dopo accesi con temporizzazione differente in base ad un valore di dissolvenza sulla falsariga di Stand.
Anche io pensavo a segnarmi un solo bit che va avanti e indietro e poi da quello partire a capire come trattare i suoi vicini.
Se non voglio lo shift register, il byte lo passo ad un metodo che smista ai pin fisici. Potrebbe quasi diventare una opzione pluggable.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

manolomao

Ragazzi, belle idee e bei spunti...tornando a bimba sul mio post #12, volendo utilizzare un i/o expander tipo MCP2301, come si potrebbe fare??? La libreria che suggerite utilizza i pin di arduino, mentre MCP2301 lavora in i2c... che approccio devo avere per farlo?
Grazie

zoomx

Io userei i Neopixel.
Una sola linea, niente librerie PWM, il PWM lo genera il controller del neopixel, numero di pixel molto maggiore, dipende dalla libreria e dalla RAM ma 100 ci stanno.

Datman

Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

docdoc

#29
Mar 19, 2019, 02:07 pm Last Edit: Mar 19, 2019, 05:01 pm by docdoc
cominciamo col premabolo

// di Nelson "StandardOil"
// Idea da sviluppare: Kitt di supercar
Ehm, scusa ma usi la mia "bozza" (completa di commenti, #define e tutto il resto) e te la "marchi" come se l'avessi scritta tu?  :)  :smiley-evil:
Non si fa così, sai?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up