Go Down

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

Standardoil

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

manolomao

Vado a memoria, durataSingoloPasso era dell'ordine di qualche decina di millisecondi se non ricordo male, quindi basta che ti scegli due estremi, es. 10mS e 100mS tra cui permettere la variazione e poi convertire la lettura del potenziometro in proporzione su questo intervallo.
Ciao, eccomi di ritorno.... ho provato il tutto e funziona alla grande!!!
Ringrazio tutti davvero per l'aiuto, grazie Maubarzi...
Ho usato anche il IO expander e funziona molto bene...
Mentre "giocavo" e sperimentavo, mi è venuta un'idea malsana di fare un giochino...
Consoderiamo un unsigned int, 2 byte 16 bit; ora accendo il primo bit b0 e contemporaneamente vorrei avvendere l'ultimo, b15; poi accendo b1 e contemporaneamente accendo b14 e così via...come se fosse uno specchio....ho provato diverse soluzioni ma non trovo la chiave...
Come posso fare???

Maurotec

Quote
Come posso fare???
Nascosta nella avrlibc c'è una macro _BV(bit) quando espansa realizza un shift a sinistra di n bit.
L'espansione è qualcosa di simile a: ( 1 << bit )
Code: [Select]

uint16_t data = 0;
data |= _BV(15) | _BV(1);

// data vale 32769 (1000 0000 0000 0001)
data |= _BV(14) | _BV(2);
// data vale 49155 (1100 0000 0000 0011)

// ecc


Per gli indici vedi tu 16-15=1, 16-14=2 ecc

Era quello che volevi fare?

Ciao.

Datman

Oppure:
data |= _BV(x) | _BV(16-x);
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

manolomao

Interessante, molto interessante........
Studierò con attenzione questa macro...
Esiste la macro anche per shiftare nell'altro senso?
Ovvero arrivato da : 000000110000000
                        a: 000001111000000
                            000011111100000
Poi guardando bene io vorrei fare che la parte bassa e meno significativa sia il "master", quello che comanda, mentre la parte alta e più significativa sia specchiato, una cosa tipo:
10000000 00000001
01000000 00000010
00100000 00000100
.........................
Dove però la parte alta sia dipendente dalla parte bassa, e scriva 1 o 0 in modo specchiato.
E' complicato?

manolomao

Ho pensato ad una cosa del genere:
Code: [Select]
for (byte i=0;i<8;i++){if((bitRead(lowByte(X)),i)==0){bitClear((HighByte(X)),(15-i));}
                       else{bitSet((HighByte(X)),(15-i));}
                       }

E' una porcata o può funzionare?
Se si, come si può ottimizzare?
Non riesco per ora a testarla...

Maurotec

Quote
Esiste la macro anche per shiftare nell'altro senso?
No, nel senso che _BV esegue shift a sinistra, ma nella sintassi del C/C++ gli operatori di shift esistono in entrambe le direzioni.

1 << 7 shift a sinistra di 7 posizioni = 1000 0000
128 >> 7 shift a destra di 7 posizioni = 0000 0001

Nota che la macro _BV() la puoi usare in arduino direttamente. Così come gli operatori >> e <<

Quote
Poi guardando bene io vorrei fare che la parte bassa e meno significativa sia il "master", quello che comanda, mentre la parte alta e più significativa sia specchiato, una cosa tipo:
10000000 00000001
01000000 00000010
00100000 00000100
Si ok, te lo mostro con variabile da 8 bit:

uint8_t MSB = 0;
uint8_t LSB = 0;
LSB = _BV(1);
MSB = (256/LSB)/2;

Stampa il valore di MSB, il quale dovrebbe contenere la sequenza di bit invertita rispetto a LSB.

Senza arduino ma in C, sul PC ho eseguito questo ciclo for:
Code: [Select]

    uint8_t MSB = 0;
    uint8_t LSB = 0;
    for (uint8_t bit=0; bit<8; bit++)
    {
        LSB = _BV(bit);
        MSB = (256/LSB)/2;

        printf("MSB LSB %d %d\n", MSB, LSB);
    }

La printf mi stampa i seguenti valori

MSB LSB 128 1
MSB LSB 64 2
MSB LSB 32 4
MSB LSB 16 8
MSB LSB 8 16
MSB LSB 4 32
MSB LSB 2 64
MSB LSB 1 128


Che è quello che volevi fare tu su 16 bit, vedi se riesci a fare la stessa operazione con 16 bit.

Ciao.



 

Datman

#67
Apr 20, 2019, 10:41 am Last Edit: Apr 20, 2019, 06:16 pm by Datman
Ciao a tutti.
Qualche giorno fa mi è arrivata una striscia di 60 APA102 e per provare a scrivere un programma ho scritto questo, che fa un LED che corre avanti e indietro con due LED sfumati prima e due dopo:

Code: [Select]
#include <FastGPIO.h>
#define APA102_USE_FAST_GPIO
#include <APA102.h>

const uint8_t dataPin = 11;
const uint8_t clockPin = 12;

APA102<dataPin, clockPin> ledStrip;

// Numero dei LED della striscia:
const uint16_t ledCount = 60;

// Luminosità (da 1 a 31) dei led di coda (1 e 2) e di quello centrale (3):
const uint8_t brt1=1;
const uint8_t brt2=5;
const uint8_t brt3=20;

void setup() {}

void loop()
{
for(byte n=1; n<=ledCount; n++)
  {
  ledStrip.startFrame();
  for(byte i=1; i<n-2; i++) {ledStrip.sendColor(255,255,255, 0);}
  ledStrip.sendColor(255,255,255,brt1);
  ledStrip.sendColor(255,255,255,brt2);
  ledStrip.sendColor(255,255,255,brt3);
  ledStrip.sendColor(255,255,255,brt2);
  ledStrip.sendColor(255,255,255,brt1);
  for(byte i=n+3; i<=ledCount; i++) {ledStrip.sendColor(255,255,255, 0);}
  ledStrip.endFrame(ledCount);
  delay(20);
  }

for(byte n=ledCount; n>=2; n--)
  {
  ledStrip.startFrame();
  for(byte i=1; i<n; i++) {ledStrip.sendColor(255,255,255, 0);}
  if(n<=ledCount-2) ledStrip.sendColor(255,255,255,brt1);
  if(n<=ledCount-1) ledStrip.sendColor(255,255,255,brt2);
  ledStrip.sendColor(255,255,255,brt3);
  ledStrip.sendColor(255,255,255,brt2);
  ledStrip.sendColor(255,255,255,brt1);
  if(n<=ledCount-2) ledStrip.sendColor(255,255,255,  0);
  if(n<=ledCount-1) ledStrip.sendColor(255,255,255,  0); 
  for(byte i=n+3; i<=ledCount+2; i++) {ledStrip.sendColor(255,255,255, 0);}
  ledStrip.endFrame(ledCount);
  delay(20);
  }
}
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

Datman

#68
Apr 20, 2019, 04:19 pm Last Edit: Apr 20, 2019, 07:58 pm by Datman
...o, più semplicemente, così:
Code: [Select]
#include <FastGPIO.h>
#define APA102_USE_FAST_GPIO
#include <APA102.h>

const uint8_t dataPin = 11;
const uint8_t clockPin = 12;

APA102<dataPin, clockPin> ledStrip;

// Numero dei LED su cui avviene lo scorrimento (la striscia può essere più lunga):
const uint8_t ledCount = 60;

// Luminosità dei led di coda (1 e 2) e di quello centrale (3):
const uint8_t brt1=1;
const uint8_t brt2=5;
const uint8_t brt3=20;
uint8_t m;

void setup() {}

void loop()
{
for(n=1; n<=2*ledCount; n++)
  {
  if(n>ledCount) m=2*ledCount-n;
  else m=n;
  ledStrip.startFrame();
  for(uint8_t i=1; i<m-2; i++) {ledStrip.sendColor(255,255,255, 0);}
  ledStrip.sendColor(255,255,255,brt1);
  ledStrip.sendColor(255,255,255,brt2);
  ledStrip.sendColor(255,255,255,brt3);
  ledStrip.sendColor(255,255,255,brt2);
  ledStrip.sendColor(255,255,255,brt1);
  for(uint8_t i=m+3; i<=ledCount; i++) {ledStrip.sendColor(255,255,255, 0);}
  ledStrip.endFrame(ledCount);
  delay(20);
  }
}

però si vede che quando torna all'inizio si ferma per un attimo. Quello pubblicato sopra non lo fa.
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

Datman

#69
Apr 21, 2019, 01:24 pm Last Edit: Apr 21, 2019, 01:25 pm by Datman
Così funziona bene:
Code: [Select]
#include <FastGPIO.h>
#define APA102_USE_FAST_GPIO
#include <APA102.h>

const uint8_t dataPin = 11;
const uint8_t clockPin = 12;

APA102<dataPin, clockPin> ledStrip;

// Numero dei LED su cui avviene lo scorrimento (la striscia può essere più lunga):
const uint16_t ledCount = 60;

// Luminosità dei led di coda (1 e 2) e di quello centrale (3):
const uint8_t brt1=1;
const uint8_t brt2=5;
const uint8_t brt3=20;
byte m;

void setup() {}

void loop()
{
for(byte n=2; n<2*ledCount; n++) // Per n=2...119 (per 60 LED)
  {
  if(n>ledCount) m=2*ledCount-n; // Se n=61...119 m=59...1
  else m=n; // Se n=2...60, m=2...60
  ledStrip.startFrame();
  for(byte i=1; i<m-2; i++) {ledStrip.sendColor(255,255,255, 0);}
  ledStrip.sendColor(255,255,255,brt1);
  ledStrip.sendColor(255,255,255,brt2);
  ledStrip.sendColor(255,255,255,brt3);
  ledStrip.sendColor(255,255,255,brt2);
  ledStrip.sendColor(255,255,255,brt1);
  for(byte i=m+3; i<=ledCount; i++) {ledStrip.sendColor(255,255,255, 0);}
  ledStrip.endFrame(ledCount);
  delay(20);
  }
}
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

Datman

#70
Apr 21, 2019, 04:18 pm Last Edit: Apr 23, 2019, 11:12 am by Datman
v4, tutto preciso, con rallentamento alle estremità e controllato passo passo alle estremità.
z permette di scegliere se la scia deve uscire fino a far rimanere un solo LED oppure deve rimanere sempre tutta.

Code: [Select]
#include <FastGPIO.h>
#define APA102_USE_FAST_GPIO
#include <APA102.h>

const uint8_t dataPin = 11;
const uint8_t clockPin = 12;
uint8_t z;

APA102<dataPin, clockPin> ledStrip;

// Numero dei LED nella striscia:
uint16_t ledCount = 60;

// Luminosità dei led di coda (1 e 2) e di quello centrale (3):
const uint8_t brt1=1;
const uint8_t brt2=5;
const uint8_t brt3=20;
byte n=1;
byte verso=1;

void setup()
  {
  ledCount+=4; // Serve per farne rimanere acceso solo uno quando arriva alle estremità.
// z=0; // Alle estremità la scia esce e rimane acceso un solo LED.
   z=4; // Alle estremità la scia non esce.
  }

void loop()
{
ledStrip.startFrame();
for(byte i=6; i<=n; i++) {ledStrip.sendColor(255,255,255, 0);} // LED spenti a sinistra (nessuno da n=1 a 5)
if(n>4)         ledStrip.sendColor(255,255,255,brt1); // 1° LED della coda a sinistra (esterno)
if(n>3 && n<64) ledStrip.sendColor(255,255,255,brt2); // 2° LED della coda a sinistra
if(n>2 && n<63) ledStrip.sendColor(255,255,255,brt3); // LED centrale
if(n>1 && n<62) ledStrip.sendColor(255,255,255,brt2); // 1° LED della coda a destra
if       (n<61) ledStrip.sendColor(255,255,255,brt1); // 2° LED della coda a destra (esterno)
for(byte i=n+4; i<ledCount; i++) {ledStrip.sendColor(255,255,255, 0);} // LED spenti a destra (nessuno da n=60 a 64)
ledStrip.endFrame(ledCount);
int x=ledCount/2-n;
delay(18+42*sin(abs(x/20)));
if (n==ledCount-z) verso=0; // 0=decrementa
else   if (n==1+z) verso=1; // 1=incrementa
verso==0 ? n-- : n++;
}
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

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

zoomx


manolomao

Scusate...
Stavo provando anche un'altra combinazione, ma forse sbaglio qualcosa...
Volevo far accendere i led in sequenza:
0000 0000
1000 0000
1100 0000
1110 0000
1111 0000....
Ho provato diverse soluzioni senza capire il perchè
Code: [Select]

x=1
for (byte i=0;i<7;i++){x|=x>>1}

la mia idea era di fare lo shift da lsb a msb di unaposizione e fare l'or al numero precedente, così mi dovrei ritrovare lo schema voluto....
Ma rimane fermo...

maubarzi

1 è il bit meno significativo, quindi quello a destra, a te serve quello più significativo quindi 128
Nessuna buona azione resterà impunita!

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

Go Up