aiuto con M5450(o 5451)per luci zaino protonico!!!!

Salve a tutti!!! Sono qui per chiedere aiuto a chiunque abbia esperienza con questo chip, trattasi di un led display driver seriale, utile x comandare fino a 34 led (o qualsiasi altra cosa, adeguatamente collegata in fatto di potenza!) con i classici 2 fili per l'i2c. Il mio intento è di realizzare una sequenza di 13 led in modo che a partire dal primo si illuminino in crescendo fino all'ultimo per poi spegnersi tutti e così via. Per adesso sono riuscito a fare una cosa simile, ma senza che quelli già accesi restino tali... praticamente si illuminano soltanto in sequenza, uno dietro l'altro. Posto il codice sulla quale sto lavorando e sarò onesto, non è scritto di mio pugno ma ho soltanto ripulito il codice di esempio per usare l'integrato in questione:

/*

  • M5451 LED driver chip
  • Author: G. Andrew Stone
  • Public Domain
    */

int myClockPin = 3; // Arduino pin that goes to M5451 clock
int mySerDataPin = 4; // Arduino pin that goes to M5451 data

void setup() // run once, when the sketch starts
{
}

#define M5451_NUMOUTS 35
#define M5451_CLK 0
class M5451
{
public:
byte clockPin;
byte brightPin;
byte serDataPin;
M5451(byte clockPin,byte serDataPin,byte brightPin);

void set(unsigned long int a, byte b=0);
void setBrightness(byte b);

private:
void mydelay(int clk);
};

void M5451::setBrightness(byte b)
{
if (brightPin < 0xff)
analogWrite(brightPin,b);
}

#define MaxBrightness 4096 //256
class FlickerBrightness:public M5451
{
public:
FlickerBrightness(byte clkPin, byte dataPin, byte brightnessPin);

void shift(int amt=1)
{
offset+=amt;
if (offset>=M5451_NUMOUTS) offset -=M5451_NUMOUTS;
else if (offset< 0) offset +=M5451_NUMOUTS;
}
void loop(void);

int brightness[M5451_NUMOUTS];
int bresenham[M5451_NUMOUTS];
int iteration;
int offset;
};

FlickerBrightness::FlickerBrightness(byte clkPin, byte dataPin,byte brightnessPin):M5451(clkPin,dataPin,brightnessPin)
{
for (int i=0;i < M5451_NUMOUTS;i++)
{
brightness = 0;
_ bresenham * = 0;_
_
}*_

* iteration = 0;*
* offset = 0;*
}
void FlickerBrightness::loop(void)
{
* int i;*
* byte pos;*
* unsigned long int a=0;*
* byte b=0;*
* boolean lvl=false;*

* for (i=0,pos=offset;i < M5451_NUMOUTS;i++,pos++)
_
{_
if (pos>=M5451_NUMOUTS) pos=0;
_ bresenham += brightness[pos];
if (bresenham>=MaxBrightness)
{
bresenham -= MaxBrightness;
lvl = true;
}
else lvl = false;*_

* if (i<32) a = (a<<1)|lvl;*
* else b = (b<<1)|lvl;*
* }*
* iteration++;*
* if (iteration > MaxBrightness) iteration = 0;*

* set(a,b);*
}
M5451::M5451(byte clkPin, byte dataPin, byte brightnessPin)
{
* int i;*

* clockPin = clkPin;*
* serDataPin = dataPin;*
* brightPin = brightnessPin;*

* pinMode(clkPin, OUTPUT); // sets the digital pin as output*
* pinMode(serDataPin, OUTPUT); // sets the digital pin as output*
* pinMode(brightPin,OUTPUT);*
* // Clear out the device so we can clock in items*
* digitalWrite(serDataPin,LOW);*
* for (i=0;i< M5451_NUMOUTS+2;i++)
_ {_
mydelay(M5451_CLK);
_ digitalWrite(clockPin,HIGH);_
mydelay(M5451_CLK);
_ digitalWrite(clockPin,LOW);
}
}
void M5451::mydelay(int clk)
{
int i;
for (i=0;i< clk;i++);
//delay(clk);
}
void M5451::set(unsigned long int a, byte b)
{
int i;
// Write the initial "start" signal*

* digitalWrite(clockPin,LOW);
digitalWrite(serDataPin,LOW);_

mydelay(M5451_CLK);
_ digitalWrite(clockPin,HIGH);_
mydelay(M5451_CLK);
_ digitalWrite(clockPin,LOW);_
mydelay(M5451_CLK/2);
_ digitalWrite(serDataPin,HIGH);_
mydelay(M5451_CLK/2);
_ digitalWrite(clockPin,HIGH);_
mydelay(M5451_CLK);
_ digitalWrite(clockPin,LOW);*_

* // Write the bits*
* for (i=0;i< M5451_NUMOUTS;i++)
_ {
int serDataVal;
if (i<32) { serDataVal = (a&1); a >>=1;}
else { serDataVal = (b&1); b>>=1;}_

mydelay(M5451_CLK/2);
_ digitalWrite(serDataPin,serDataVal);_
mydelay(M5451_CLK/2);
_ digitalWrite(clockPin,HIGH);_
mydelay(M5451_CLK);
_ digitalWrite(clockPin,LOW);
}
}
void loop() // run over and over again
{
unsigned long int j;
int i;
FlickerBrightness leds(myClockPin,mySerDataPin,9);*_

* leds.setBrightness(255);*
* for (i=3;i>=0;i--)*
* {*
* for (j=0;j<15;j++)*
* {*
* leds.set(1L<< j,(j>=32) ? 1L<<(j-32):0);*
* delay(70);*
* }*
* }*
}
Lo scopo finale è quello di realizzare (tutto) l'impianto luci per una riproduzione del mitico zaino protonico dei ghostbusters.... posto un link di esempio, e grazie a tutti per la (sperata!!) collaborazione!!!
Ghost Busters Proton Pack - Arduino + wave shield - YouTube
Nel video sono stati utilizzati dei 74HC595 e 74HC4017B, ma speravo si potesse usare questo simpatico integrato che ho... il 5450 o 5451 appunto... a presto!

Sui LED blu-bianchi a sinistra hai messo delle resistenze?
Ciao Uwe

..che brividi quando sposta i contatti "a mano" :astonished:

...e occhio a NON incrociare i flussi!

Vedo che non sono l'unico fan dei ghostbusters!!! Ciao uwe!!!! Il video non è mio, l'ho trovato in rete e lo sto usando come spunto... già che ci sentiamo, sono quello dell'orologio!!! Hai + messo mano al codice?!!?! :wink:

ciao nytro81
Se non sei quello che ha costruito il circuito sulla breadbord del filmato allora mi scuso perché la raccomandazione non é rivolto a Te.

Col mio orologio TIX sono in pausa perché sono in attesa di un panello per montare i pulsanti e la scheda. Sono stato il finesettimana a Torino al Fablab e mi hanno fatto un panello. Adesso posso continuare.
Ciao Uwe

ma io stavo riferendomi a quello che stavo facendo io!!! ricordi mi hai dato un grandissimo aiuto col mio codice?!!

Nessuna anima pia che abbia usato questo integrato quindi!?!?! Sigh&sob... :slight_smile: