Programmazione cubo led

Ciao a tutti, rieccomi con un nuovo quesito per voi!!!

Ho comprato arduino un po' di tempo fa con l'intento di realizzare il famoso cubo di led... dopo tanto tempo l'ho fatto... Bellissimo... ma vorrei tanto capirci qualcosa nella programmazione... :frowning: ...ovviamente ho copiato tutto il progetto (codice compreso) da un sito... Da quello che ho potuto capire leggendo le righe del programma è tutta una scelta casuale che mi accende i led... Solo che vorrei provare a farmi una sequenza di accensione tutta mia... Scrivere righe di codice non fa per me... non ci capisco nulla di C...

Non so se conoscete Minibloq... E' un software che consente di programmare a blocchi... io mi trovo molto bene... ma per il cubo non so proprio come fare...

se io del livello 1 voglio accendere solo il led centrale... come faccio??? A quali pin devo assegnare il valore HIGH?? Dopo tutta la "fatica" fatta per costruire il cubo vorrei poterlo personalizzare :slight_smile:

Come sempre, so che riuscirete a darmi una risposta soddisfacente, quindi anche stavolta ci spero!! Grazie a tutti voi che sopportate le domande di tutti i principianti!! :wink:

Se vuoi accendere quel LED devi mettere HIGH solo i pin 10 e 5.
Se invece vuoi accendere il 1° LED in alto a destra devi mettere HIGH solo i pin 1 e 12.
In pratica ogni livello comanda 9 LED per "piano" tramite i pin da 10 a 12, ed i 9 LED del piano sono singolarmente comandati dai pin da 1 (occhio che c'è il TX della seriale) a 9 così puoi accendere quanti LED vuoi per ogni piano.

Ciao
QP

Si vede chiaramente dal progetto, come ti ha detto anche QuercusPetraea, hai il seguente schema:
Livello 1 (pin 10): da pin 9 a pin 1 regoli ogni singolo led
Livello 2 (pin 11): da pin 9 a pin 1 regoli ogni singolo led
Livello 3 (pin 12): da pin 9 a pin 1 regoli ogni singolo led

Ciao,
Biagio.

@maggio93 sono interessato anche io a questo progetto, non è sapresti indicarmi i link da dove hai preso tutto il materiale per realizzarlo ?? grazie :smiley:

Scusate se mi intrometto...
Così com'è indicato nello schema postato da @maggio93 i transistor in questo caso vengono usati come semplici interruttori giusto?
Cioè servono solo per aprire\chiudere il collegamento col gnd? Quindi la corrente per alimentare i led viene direttamente dai pin dell'arduino?
Ma così non si rischia di rovinare la scheda se vengono accesi tutti insieme?

Scusate la miriade di domande ma sono curioso di capire, non ho mai usato i transistor fin'ora :stuck_out_tongue:

dancol90:
...
Così com'è indicato nello schema postato da @maggio93 i transistor in questo caso vengono usati come semplici interruttori giusto?
Cioè servono solo per aprire\chiudere il collegamento col gnd? Quindi la corrente per alimentare i led viene direttamente dai pin dell'arduino?

Ma così non si rischia di rovinare la scheda se vengono accesi tutti insieme?
...

Si. Viste le correnti in gioco il rischio è reale. Una soluzione è pilotare i catodi con un ULN2803 o 2804, ma ne servono 2 perchè ogni chip ha 8 I/O.

Ciao
QP

AH ricordo, quello che TUTTI ti avevano sconsigliato di seguire come progetto iniziale! Hai voluto la bici? ORA...

Dopo tutto questo tempo sul forum pero' potevi imparare a scrivere il titolo del topic, no?
Dai!

F

Urca ma per curiosità ho dato un occhio a minibloq e mi pare più complesso che imparare a scrivere il codice... Sei sicuro della strada che stai prendendo?

ps. se butti, dimmi dove :smiley:

dancol90:
Scusate se mi intrometto...
Così com'è indicato nello schema postato da @maggio93 i transistor in questo caso vengono usati come semplici interruttori giusto?
Cioè servono solo per aprire\chiudere il collegamento col gnd? Quindi la corrente per alimentare i led viene direttamente dai pin dell'arduino?
Ma così non si rischia di rovinare la scheda se vengono accesi tutti insieme?

Scusate la miriade di domande ma sono curioso di capire, non ho mai usato i transistor fin'ora :stuck_out_tongue:

il tuo ragionamento è corretto, infatti di solito per pilotare il cubo si utilizza il multiplexing per piani.

QuercusPetraea:

dancol90:
...
Così com'è indicato nello schema postato da @maggio93 i transistor in questo caso vengono usati come semplici interruttori giusto?
Cioè servono solo per aprire\chiudere il collegamento col gnd? Quindi la corrente per alimentare i led viene direttamente dai pin dell'arduino?

Ma così non si rischia di rovinare la scheda se vengono accesi tutti insieme?
...

Si. Viste le correnti in gioco il rischio è reale. Una soluzione è pilotare i catodi con un ULN2803 o 2804, ma ne servono 2 perchè ogni chip ha 8 I/O.

Ciao
QP

Mi permetto di aggiungere un semplice calcolo: una R da 270ohm (questo è il valore che mostra fritzing) limita la corrente a circa 18-19mA, corrente che sarà utilizzata per alimentare un solo LED; se il firmware prevede un piano per volta, come mi auguro, il micro erogherà circa 160-170mA, valore molto prossimo al suo limite; se malauguratamente si dovesssero accendere due o, peggio, tre livelli, il micro salta di sicuro; chi ha progettato questa cosa, sapendo che il firmware è libero e manipolabile da gente inesperta (senza offesa, ma lo afferma lui stesso) come maggio93 o come altri che in questo Topic manifestano dei dubbi di conoscenza, sappia che è un potenziale assassino di micro, una sorta di MCU Serial Killer ]:smiley:
La soluzione più economica probabilmente è quella di montare altri 9 transistor NPN (qualsiasi tipo, tanto al massimo devono sopportare 60mA), oppure un paio di ULN2004 (7 darlington), eliminando così anche i tre transistor interruttori. Naturalmente vanno benissimo i 2803/04 anche se, viste le bassissime correnti in gioco forse sono un po' sprecati.

Vi capisco, il titolo fa schifo ma vi assicuro che non volevo creare effetti di alcun tipo... Il mio titolo voleva essere "ironico"... insomma, vi chiedo scusa e prometto di impegnarmi per le prossime volte.. per adesso, va bene questo nuovo??

maggio93:
Vi capisco, il titolo fa schifo ma vi assicuro che non volevo creare effetti di alcun tipo... Il mio titolo voleva essere "ironico"... insomma, vi chiedo scusa e prometto di impegnarmi per le prossime volte.. per adesso, va bene questo nuovo??

sei un grande :wink: ora però leggiti le risposte che ti abbiamo dato, quello strumento è potenzialmente pericoloso per il micro di Arduino...

Bhe se non lo butta perché non ci capisce niente, lo butta perché si è sciolto, "simpre in ta munnezza finisce" lol

Se si volesse tenere la parte hardware così com'è, non si potrebbe accendere al max un paio di led alla volta per pochi ms, dal primo all'ultimo nel cubo, sfruttando l'effetto POV? La corrente consumata sarebbe limitata (20ma per pin, come diceva @menniti poco sopra) e per brevi periodi...quindi si potrebbe evitare di bruciare tutto...
Ora capisco che è un approccio parecchio più complesso e magari per @maggio93 non è la cosa più semplice, ma come idea potrebbe andare? Quanti ms dovrebbe rimanere acceso ogni led per avere un effetto decente e non vedere sfarfallii?

dancol90:
Se si volesse tenere la parte hardware così com'è, non si potrebbe accendere al max un paio di led alla volta per pochi ms, dal primo all'ultimo nel cubo, sfruttando l'effetto POV? La corrente consumata sarebbe limitata (20ma per pin, come diceva @menniti poco sopra) e per brevi periodi...quindi si potrebbe evitare di bruciare tutto...
Ora capisco che è un approccio parecchio più complesso e magari per @maggio93 non è la cosa più semplice, ma come idea potrebbe andare? Quanti ms dovrebbe rimanere acceso ogni led per avere un effetto decente e non vedere sfarfallii?

a mio parere il problema non è quanto stanno accesi ma quanto stanno spenti, infatti il problema è "vederli accesi" quando "sono spenti", e questo dipende dalla persistenza ottica dei nostri occhi, io credo che si possano accendere contemporaneamente i 9 led, la corrente è alta ma comunque rientra nell'erogabile dell'ATmega, quindi realizzare un multiplexer sui tre transistor di livello è una cosa fattibile, penso che un delay di 10ms tra un livello e l'altro garantisca un buon effetto visivo senza che esploda tutto, ovviamente roba da guardare per qualche minuto, non certo da lasciare tutto il giorno acceso in salotto :grin:

Quindi volendo usare questo metodo, con 9 led (al max, dipende dalla "figura" che si vuole mostrare sul cubo, no?) accesi insieme, si potrebbero sfruttare i 500ma max della usb senza avere sovraccarichi o condizioni quasi "al limite", giusto?

Non so se con 10ms hai gia' la persisenza...
Sul mio ultimo lavoro POV, coi NIXIE, gia' a 4 sfarfallavano...

Federico:
Non so se con 10ms hai gia' la persisenza...
Sul mio ultimo lavoro POV, coi NIXIE, gia' a 4 sfarfallavano...

le Nixie però hanno un tempo di accensione molto lento rispetto ai led, in ogni caso lui parla di effetto gradevole, non penso voglia "vederli" tutti accesi, quindi ciò che io intendevo è avere un effetto "vibrante" che non dia la sensazione che si spengano, ovvio che va provato, io onestamente non ho il tempo di mettere in piedi quella torre per fare una prova, lui ce l'ha già pronta, qualche riga di sketch e ci fa sapere :wink:

@ dancol 90: come detto ogni led acceso con quelle R di limitazione assorbe circa 18mA, il problema non sono i 500mA dell'USB (attenzione che molte porte USB, per non parlare degli hub, erogano al massino 250mA!) ma i 200mA del micro, quindi oltre 9 led in contemporanea NON puoi e NON devi andare.

Sisi lo so che il micro più di quello non eroga, io intendevo cambiare il circuito alimentando i led dalla usb, e controllarli attraverso dei transistor collegati ai pin. In questo modo la corrente che terrà acceso un led non dovrebbe essere erogata dal pin, giusto?

PS: io il cubo non l'ho ancora costruito...mi sono "intromesso" nel topic di @maggio93 per poter imparare qualcosa su transistor&co., visto che sono materia nuova per me :stuck_out_tongue:

QuercusPetraea:
Se vuoi accendere quel LED devi mettere HIGH solo i pin 10 e 5.

Con minibloq faccio così ma mi si accendono due led il 5 e il 10... '-.-

#include "stdlib.h"
#include "IRremote.h"
#include "pitches.h"
#include "Minibloq.h"


void setup()
{
	initBoard();

	DigitalWrite(D10, true);
	DigitalWrite(D5, true);
}

void loop()
{
}