Go Down

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

Standardoil

Diciamo che io ho capito che stai scherzando
Adesso facciamolo capire anche agli altri
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

Datman

Ramses II, millenni fa, faceva di peggio...  :)
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

#32
Mar 19, 2019, 05:01 pm Last Edit: Mar 19, 2019, 05:02 pm by docdoc
Diciamo che io ho capito che stai scherzando
Adesso facciamolo capire anche agli altri
Io le faccine le ho messe, se uno non sa a che servono le faccine e quindi equivoca, meglio che si dia alla coltivazione del pero. :)
Resta comunque il fatto che se "ricicli" codice magari non metterci il nome tuo sopra.. ;)

Ramses II, millenni fa, faceva di peggio...  :)
Haha veroo! :D
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Standardoil

Resta comunque il fatto che se "ricicli" codice magari non metterci il nome tuo sopra.. ;)

vediamo un po'
questo è il tuo preambolo:
Code: [Select]

#include <SoftPWM.h>
#include <SoftPWM_timer.h>

// Numero totale di LED
#define TOTLEDS 9
// Primo pin corrispondente a led[0] (pin consecutivi)
#define MINLED 2

unsigned long int StartTime = 0;
unsigned long int[TOTLEDS] StartTimeOld;
unsigned long int[TOTLEDS] delay;

byte[9] FadeIn;

byte[9] reset = true;

byte forward = false;

int[9] a;

const int TimeFadeIn = 1; // millis
const int TimeFadeOut = 3; //millis
const byte brightness = 110; // pwm value and speed



questo è il mio preambolo:
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;



adesso dimmi che cosa ci vedi di uguale
forse che ho usato il // come commento?
o magari usiamo tutti e due lo spazio invece del tabulatore?
accacchio, ho capito: sto usando anch'io la numerazione indiana............
devo passare a scrivere in numeri romani?
facciamo così confrontati riga a riga i preamboli
troverai che ci sono due sole righe uguali
una include
e un commento
adesso, seriamente, devo cambiare la maniera di commentare?

e questo tralasciando che il nocciolo duro del programma è completamente differente
che io gestisco solo due pin con un indice circolare e tu usi un approccio estensivo

io per me considero chiuso qui l'incidente
anche il mio precedente post era una mano tesa a chiudere
non è stata colta, vabbe'
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

gpb01

#34
Mar 19, 2019, 07:28 pm Last Edit: Mar 19, 2019, 07:30 pm by gpb01
STOP ... basta così, grazie !

Guglielmo

P.S: Tutte le risposte, gli schemi, le indicazioni e quant'altro dato all'interno del forum è sotto licenza GPL, ove non diversamente specificato (REGOLAMENTO, prima frase del punto 15.1).
Search is Your friend ... or I am Your enemy !

maubarzi

#35
Mar 19, 2019, 11:09 pm Last Edit: Mar 20, 2019, 09:50 am by maubarzi
Ecco che sul filo di lana arrivo anche io con il mio plagio ;)
Alla fine ho ceduto alla tentazione pure io ...
Non ho led, l'output si vede sul serial output sparandolo a 115200, altrimenti è troppo lento e non si vede bene.
Una riga per ogni giro di loop.
Una X per un LED acceso un blank per un LED spento.
Ho un problema sulle librerie, mi da "No call found" forse perchè non ne ho usate? :P :P :P

ATTENZIONE: VERSIONE OBSOLETA, CON ERRORI E IMPRECISIONI!
Code: [Select]

#define NUM_LED 8           // Numero totale di LED della sequenza.
#define TEMPO_SEQUENZA 2    // Misura in secondi del tempo di una singola sequenza avanti e indietro.
#define PASSI_DISSOLVENZA 8 // Passi di dissolvenza per il led in accensione e spegnimento.

byte ledMap = B00000010;    // Mappa di scorrimento del led di riferimento che scorrerà a destra e sinistra fino agli estremi.
int durataSingoloPasso = TEMPO_SEQUENZA * 1000 / (NUM_LED - 1) / PASSI_DISSOLVENZA; // La calcoliamo dividendo il tempo totale sequenza in millisecondi per il numero di led-1 e per i passi della dissolvenza.
unsigned long millisUltimoPasso = 0;
byte dissolvenza = 0;       // Indice di dissolvenza, va da 0 a PASSI_DISSOLVENZA -1 e indica il tempo di accensione dei LED esterni.
bool direzione = true;      // Indica l'attuale direzione di scorrimento: true = destra, false = sinistra.
byte contaPassi = 0;        // Conta le esecuzioni del loop resettandosi ogni volta che raggiunge PASSI_SEQUENZA. Confrontandolo con dissolvenza simuliamo il PWM.

byte luminositaLed = B00000000;

void setup() {
  Serial.begin(115200);
  millisUltimoPasso = millis();
}

void loop() {
  unsigned long currMillis = millis();
  if (currMillis - millisUltimoPasso > durataSingoloPasso) {
    muovi();
    millisUltimoPasso += durataSingoloPasso;
  }
  simulaPWM();
  applicaAiLed();
}

void muovi() {
  // Facciamo un nuovo passo.
  dissolvenza = (PASSI_DISSOLVENZA + dissolvenza + 1) % PASSI_DISSOLVENZA;
  if (dissolvenza == 0) {
    if (direzione) {
      if (ledMap == B00000010) {
        direzione = !direzione;
      } else {
        ledMap = ledMap >> 1;
      }
    } else {
      if (ledMap == B10000000) {
        direzione = !direzione;
      } else {
        ledMap = ledMap << 1;
      }
    }
  }
}

/*
 * Richiamato ad ogni giro di loop simula il pwm decidendo se ad ogni giro
 * i led esterni in dissolvenza devono essere accesi o spenti.
 */
void simulaPWM() {
  for (byte i = 0; i < NUM_LED; i++) {
    if (bitRead(ledMap, i)) {
      // Se c'è un led precedente gestiamo la dissolvenza.
      if (i > 0) {
        byte passo = 1; // Inizializziamo a 1 poi in base alla dissolvenza PWM lo spegniamo.
        if (direzione) {
          if (dissolvenza < contaPassi) {
            passo = 0;
          }
        } else {
          if (dissolvenza > contaPassi) {
            passo = 0;
          }
        }
        bitWrite(luminositaLed, i-1, passo);
      }
      bitWrite(luminositaLed, i, 1);
      if (i + 1 < NUM_LED) {
        byte passo = 1; // Inizializziamo a 1 poi in base alla dissolvenza PWM lo spegniamo.
        if (direzione) {
          if (dissolvenza > contaPassi) {
            passo = 0;
          }
        } else {
          if (dissolvenza < contaPassi) {
            passo = 0;
          }
        }
        bitWrite(luminositaLed, i+1, passo);
        i++;
      }
    } else {
      // Non è il led centrale e nemmeno quello prima o dopo, quindi va spento.
      bitWrite(luminositaLed, i, 0);
    }
  }
  contaPassi = (PASSI_DISSOLVENZA + contaPassi + 1) % PASSI_DISSOLVENZA;
}

/*
 * Accende o spegne i led a seconda di quanto calcolato fino a qui.
 * Per ora scriviamo sulla Seriale una X per led acceso e un blank per led spento.
 * Poi si potrà gestire qualunque tipo di collegamento fisico, ad es. con un array di pin
 * si potrebbe fare una digitalWrite per variare le uscite.
 */
void applicaAiLed() {
  for (byte i = NUM_LED -1; i > 0; i--) {
    if (bitRead(luminositaLed, i) == 0) {
      Serial.print("  ");
    } else {
      Serial.print("X");
      Serial.print(" ");
    }
  }
  Serial.println("");
}


E' 'na porcheria vero?
Nessuna buona azione resterà impunita!

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

Datman

#36
Mar 19, 2019, 11:20 pm Last Edit: Mar 20, 2019, 12:13 am by Datman
...e questa è la versione mia di 31 anni fa! :-)




Uh! Vedo ora che non ci sono i condensatori! Chissà se ho un altro schema o se li avevo aggiunti dopo!...
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

maubarzi

#37
Mar 19, 2019, 11:22 pm Last Edit: Mar 20, 2019, 09:08 am by maubarzi
Avevo dichiarato il plagio nella premessa :P ;)

EDIT:
Avevo risposto prima che caricassi le foto e avevo pensato ad una battuta riguardo il mio codice ;)
La tua soluzione oltre a non richiedere librerie non richiede manco l'arduino :P
Nessuna buona azione resterà impunita!

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

Standardoil

#38
Mar 20, 2019, 06:55 am Last Edit: Mar 20, 2019, 06:58 am by Standardoil
per maubarzi, si vede che siamo "fratelli di quadrno a righe della prima"
usiamo tutti e due l'alfabeto latino....
no seriamente, dopo ci guardo, non autogiudicarti, nulla è mai una porcheria assoluta (beh, insomma, alcune delle cose di un certo utente sparito da un paio di mesi....)
comunque come disse un mio ex collega:
"da tutti si puo' imparare qualcosa, anche da un pirla"
e io gli risposi:
"infatti imperero' qualcosa anche da te"
dandogli contemporaneamente due cose: ragione e .....
gran pregio la concisione, non trovi?
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

"infatti imperero' qualcosa anche da te"
E' una frase che uso spesso anche io ;) ma non ne ho mai trovato uno per sparargliela addosso in modo così conciso :P
Anche perchè "quando la stupidità parla, l'intelligenza tace" che mi sega gran parte di queste possibilità ;)
Hai notato la controtendenza? Il loop super enorme?
Nessuna buona azione resterà impunita!

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

manolomao

Alla fine ho ceduto alla tentazione pure io ...
Non ho led, l'output si vede sul serial output sparandolo a 115200, altrimenti è troppo lento e non si vede bene.
Una riga per ogni giro di loop.
Una X per un LED acceso un blank per un LED spento.
Ho un problema sulle librerie, mi da "No call found" forse perchè non ne ho usate? :P :P :P

Maubarzi, questa soluzione la trovo molto interessante....
Appena ho un attimo di tempo la proverò...
Ti chiedevo, se volessi ampliare il controllo a 16 led, come posso fare??
Per la visualizzazione utilizzerò un mcp23017, quindi dovrò dividere in due blocchi e devo introdurre dei controlli...
Vi chiederete, perchè vuoi utilizzare quel device?? L'avevo nel cassetto,comprato tempo fa, e volevo utilizzarlo....
Grazie per l'aiuto.

maubarzi

usi un int invece di un byte e fai lo scorrimento sull'int che è di 2 byte quindi 16 bit ;)
e la logica di interfaccia del tuo dispositivo lo metti nell'ultima funzione, quella che ora stampa su seriale.
Io ne ho usati 8 per due motivi, sono i bit di un byte e guardando i vari filmati di supercar mi pareva che le luci fossero 8.
Nessuna buona azione resterà impunita!

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

Standardoil

Hai notato la controtendenza? Il loop super enorme?
È il primo sintomo della sindrome di gundam: la fase "faso tuto mi"
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

#43
Mar 20, 2019, 09:57 am Last Edit: Mar 20, 2019, 11:44 am by maubarzi
Riposto il mio codice con miglioramenti e bug fix.
Ho reso più dimanica (leggi dinamica o dimanica larga :P mai ammetterò di averlo scritto sbagliato per sbaglio  :smiley-evil:  ) la gestione del numero di led fino a 16, ho quindi cambiato da byte (già unsigned di suo) a unsigned int le mappe per lo scorrimento dei bit e rinominate le variebili per essere un po' più calzanti.
Precisazione: il tempo impostato non è di un giro completo ma di mezzo giro, quindi solo andata o solo ritorno.
C'era anche un errore nell'applicazione ai led, mi sono incasinato con il for che contava a rovescio (a fare funzioni che fanno poche cose si corre il rischio di farle pure sbagliate :P) e mi ero perso l'ultimo led, ho rimesso il for dritto, più intuitivo (almeno per me), e ritrovato il bittarello smarrito.
E risolto anche l'assimmetria che mi disturbava, sull'estremo destro testavo per limite 2 e non 1 (cioè penultimo bit invece dell'ultimo  :smiley-sad-blue: ) come doveva essere per via del bittarello smarrito di cui non mi ero accorto.
Ora dovrebbe andare piumeglio.
E mi sono tolto lo sfizio di usare la funzione bit() di cui, ai miei inizi (cioè qualche mese fa :P), mi domandavo la reale utilità ;)

Code: [Select]

#define NUM_LED 16          // Numero totale di LED della sequenza.
#define TEMPO_SEQUENZA 2    // Misura in secondi del tempo di una singola sequenza avanti o indietro.
#define PASSI_DISSOLVENZA 8 // Passi di dissolvenza per il led in accensione e spegnimento.

unsigned int mappaScorrimentoLed = 2; // Mappa di scorrimento del led di riferimento che scorrerà a destra e sinistra fino agli estremi.
unsigned int mappaAccensioneLed = 0;  // Mappa di accensione dei led, viene centrata sulla mappaScorrimentoLed, aggiunta dei led laterali di dissolvenza e gestito il PWM.

int durataSingoloPasso = TEMPO_SEQUENZA * 1000 / (NUM_LED - 1) / PASSI_DISSOLVENZA; // La calcoliamo dividendo il tempo totale sequenza in millisecondi per il numero di led-1 e per i passi della dissolvenza.
unsigned long millisUltimoPasso = 0;
byte dissolvenza = 0;       // Indice di dissolvenza, va da 0 a PASSI_DISSOLVENZA -1 e indica il tempo di accensione dei LED esterni.
bool direzione = true;      // Indica l'attuale direzione di scorrimento: true = destra, false = sinistra.
byte contaPassi = 0;        // Conta le esecuzioni del loop resettandosi ogni volta che raggiunge PASSI_SEQUENZA. Confrontandolo con dissolvenza simuliamo il PWM.


void setup() {
  Serial.begin(115200);
  millisUltimoPasso = millis();
}

void loop() {
  unsigned long currMillis = millis();
  if (currMillis - millisUltimoPasso > durataSingoloPasso) {
    muovi();
    millisUltimoPasso += durataSingoloPasso;
  }
  simulaPWM();
  applicaAiLed();
}

void muovi() {
  // Facciamo un nuovo passo.
  dissolvenza = (PASSI_DISSOLVENZA + dissolvenza + 1) % PASSI_DISSOLVENZA;
  if (dissolvenza == 0) {
    if (direzione) {
      if (mappaScorrimentoLed == bit(0)) { // L'estremo destro può essere cablato perchè resta fisso a 1, per uniformità usiamo comunque la bit().
        direzione = !direzione;
      } else {
        mappaScorrimentoLed = mappaScorrimentoLed >> 1;
      }
    } else {
      if (mappaScorrimentoLed == bit(NUM_LED - 1)) { // Resa dinamica la valutazione dell'estremo sinistro.
        direzione = !direzione;
      } else {
        mappaScorrimentoLed = mappaScorrimentoLed << 1;
      }
    }
  }
}

/*
 * Richiamato ad ogni giro di loop simula il pwm decidendo se ad ogni giro
 * i led esterni in dissolvenza devono essere accesi o spenti.
 */
void simulaPWM() {
  for (byte i = 0; i < NUM_LED; i++) {
    if (bitRead(mappaScorrimentoLed, i)) {
      // Se c'è un led precedente gestiamo la dissolvenza.
      if (i > 0) {
        byte passo = 1; // Inizializziamo a 1 poi in base alla dissolvenza PWM lo spegniamo.
        if (direzione) {
          if (dissolvenza < contaPassi) {
            passo = 0;
          }
        } else {
          if (dissolvenza > contaPassi) {
            passo = 0;
          }
        }
        bitWrite(mappaAccensioneLed, i-1, passo);
      }
      bitWrite(mappaAccensioneLed, i, 1);
      if (i + 1 < NUM_LED) {
        byte passo = 1; // Inizializziamo a 1 poi in base alla dissolvenza PWM lo spegniamo.
        if (direzione) {
          if (dissolvenza > contaPassi) {
            passo = 0;
          }
        } else {
          if (dissolvenza < contaPassi) {
            passo = 0;
          }
        }
        bitWrite(mappaAccensioneLed, i+1, passo);
        i++;
      }
    } else {
      // Non è il led centrale e nemmeno quello prima o dopo, quindi va spento.
      bitWrite(mappaAccensioneLed, i, 0);
    }
  }
  contaPassi = (PASSI_DISSOLVENZA + contaPassi + 1) % PASSI_DISSOLVENZA;
}

/*
 * Accende o spegne i led a seconda di quanto calcolato fino a qui.
 * Per ora scriviamo sulla Seriale una X per led acceso e un blank per led spento.
 * Poi si potrà gestire qualunque tipo di collegamento fisico, ad es. con un array di pin
 * si potrebbe fare una digitalWrite per variare le uscite.
 */
void applicaAiLed() {
  for (byte i = 1; i <= NUM_LED; i++) {
    if (bitRead(mappaAccensioneLed, NUM_LED - i) == 0) {
      Serial.print("  ");
    } else {
      Serial.print("X");
      Serial.print(" ");
    }
  }
  Serial.println("");
}


Da vero sb..rone ho fatto anche il video

Questa la temporizzazione:
Code: [Select]

#define NUM_LED 8
#define TEMPO_SEQUENZA 2
#define PASSI_DISSOLVENZA 20

e questa la modifica per gestire i led su pin sequenziali a partire dal 2 eliminando l'output su seriale ovviamente:
Code: [Select]

void applicaAiLed() {
  int base = 1;
  for (byte i = 1; i <= NUM_LED; i++) {
    if (bitRead(mappaAccensioneLed, NUM_LED - i) == 0) {
      digitalWrite(base+i, LOW);
    } else {
      digitalWrite(base+i, HIGH);
    }
  }
}
Nessuna buona azione resterà impunita!

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

gpb01

#44
Mar 20, 2019, 02:35 pm Last Edit: Mar 20, 2019, 02:42 pm by gpb01
> docdoc
>Standardoil

Nessuno a copiato alcunché ... ho detto al mio post #34  STOP ... il prossimo che continua su questa frescaccia del "copiare" si becca il BAN di una settimana ... e NON ci sono faccine, se lo becca e se lo tiene !

Spero questa volta di essere stato più chiaro !

Guglielmo

P.S.: I vostro ultimi due post sono stati cancellati ...
Search is Your friend ... or I am Your enemy !

Go Up