CUBO 3X3X3 info e consigli

Consigli?

Sí, impara a usare il if.

if (repeat<0);
Non esegue niente dopo perché lo hai concluso con il puntovirgola.

if (repeat; repeat=repeat-1);
se vuoi controllare se repeat é vero (diverso da 0) devi chiudere la parentesi dopo il repeat e lasciar via il puntovirgola
if (repeat) repeat=repeat-1;

Devi separare il multiplexing della matrice e l’ aggiornamento della memoria “video”.
Il multiplexing serve per accendere regolamente tutti i LED accesi. Deve avvenire almeno 30 volte al secondo in modo che non si veder farfallare i LED. I dati dei LED accesi vengono presi da un array di variabili che fungono da “memoria video”.

L’ aggionamento del immagine da visualizzare avviene caricando i dati nell’array di variabili che fungono da “memoria video”.
I dati da visualizzare vengono presi dalla memoria oppure calcolato in funzione del tempo e dell’immagine che si vuole visualizzare.
Ciao Uwe

tizio45:
io lo sto facendo 3x3x3 o schema e sketc devi solo cambiare le resistenze in base ai led e i transistor che usi

Grazie mille ma vorrei lavorare a un mio programma, così da poter apportare modifiche a ciò che conosco.

Io non ho studiato elettronica, ci arrivo per intuizione…

uwefed:

Consigli?

Si impara a usare il if.

if (repeat<0);
Non esegue niente dopo perché lo hai concluso con il puntovirgola.

if (repeat; repeat=repeat-1);
se vuoi controllare se repeat é vero (diverso da 0) devi chiudere la parentesi dopo il repeat e lasciar via il puntovirgola
if (repeat) repeat=repeat-1;
[…]

In quest’ultima funzione trova un errore e non carica. Ho ovviato con un while che comunque non vuole funzionare :frowning:

void loop (){
  Serial.println ();
  
int repeat=5;

  while(repeat<=0);
{

  digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
   digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  delay (150);
   digitalWrite (LED1, LOW);
  digitalWrite (LED2, HIGH);
   digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  delay (150);
   digitalWrite (LED1, LOW);
  digitalWrite (LED2, HIGH);
   digitalWrite (TRA2, LOW);
      digitalWrite (TRA1, HIGH);
  delay (150);
    digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
   digitalWrite (TRA2, LOW);
      digitalWrite (TRA1, HIGH);
  delay (150);
  
  repeat=repeat-1;
}

Per fargli ripeter il ciclo 5 volte…

while(repeat<=0);

Non vorrei sembrarti troppo “ruvido”, ma prima di imbarcarti in un impresa come un cubo led devi imparare due cose:

  1. la sintassi del C

  2. come si usano gli array

Inoltre è molto importante per la leggibilità del codice che presti attenzione all’indentazione. CTRL-T nell’IDE ti dà una mano.

Ritornando all’ “if”

int LED1 = 7;
int LED2 = 6;
int LED3 = 5;
int LED4 = 4;
int TRA1 = 3;
int TRA2 = 2;

void setup (){
pinMode (LED1, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode (LED3, OUTPUT);
pinMode (LED4, OUTPUT);
pinMode(TRA1, OUTPUT);
pinMode(TRA1, OUTPUT);

Serial.begin (9600);

}
int repeat=20;
void loop (){
  
  
if (repeat) repeat=repeat-1;
 {digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
   digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  delay (150);
   digitalWrite (LED1, LOW);
  digitalWrite (LED2, HIGH);
   digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  delay (150);
   digitalWrite (LED1, LOW);
  digitalWrite (LED2, HIGH);
   digitalWrite (TRA2, LOW);
      digitalWrite (TRA1, HIGH);
  delay (150);
    digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
   digitalWrite (TRA2, LOW);
      digitalWrite (TRA1, HIGH);
  delay (150);  
}

Serial.println (repeat);
  
  if (repeat) repeat<10; {
  digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
   digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  delay (100);
   digitalWrite (LED1, LOW);
  digitalWrite (LED2, HIGH);
   digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  delay (100);
   digitalWrite (LED1, LOW);
  digitalWrite (LED2, HIGH);
   digitalWrite (TRA2, LOW);
      digitalWrite (TRA1, HIGH);
  delay (100);
    digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
   digitalWrite (TRA2, LOW);
      digitalWrite (TRA1, HIGH);
  delay (100);
  }


if (repeat) repeat<0; 
  
  digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
   digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  delay (50);
   digitalWrite (LED1, LOW);
  digitalWrite (LED2, HIGH);
   digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  delay (50);
   digitalWrite (LED1, LOW);
  digitalWrite (LED2, HIGH);
   digitalWrite (TRA2, LOW);
      digitalWrite (TRA1, HIGH);
  delay (50);
    digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
   digitalWrite (TRA2, LOW);
      digitalWrite (TRA1, HIGH);
  delay (50);
}

Vorrei che da 20 a 10 eseguisse la prima.
Da 10 a 0 eseguisse la seconda.
Da 0 o minore eseguisse la terza.

Invece le fa tutte una volta sola e riparte il loop

tuxduino:

while(repeat<=0);

– repeat minore o uguale a 0 –

Non vorrei sembrarti troppo “ruvido”, ma prima di imbarcarti in un impresa come un cubo led devi imparare due cose:

  1. la sintassi del C

–ha funzioni simili html ma vengono definite diversamente–

  1. come si usano gli array

Inoltre è molto importante per la leggibilità del codice che presti attenzione all’indentazione. CTRL-T nell’IDE ti dà una mano.

Vorrei fare pratica costruendo un cubo.

Sono partito a zero e ho 4 led saldati su una board che si accendono sequenzialmente come vorrei :stuck_out_tongue:
Questo in un paio di giorni, ora, io riesco ad accendere i LED che voglio e gestirne i tempi ma vorrei sintetizzare il programma, perchè come hai notato per fare un solo gioco ho utilizzato quasi 300 righe.

Già il capire come poter associare una sequenza a un numero X di ripetizioni abbatterebbe il 50% del lavoro. devo capire “solo” come eseguire un repeat!

Ok, provo ad essere un po’ più costruttivo.

La sintassi del costrutto while() è:

while (condizione) {
    ... codice da eseguire più volte...
}

Se scrivi while(qualcosa); (nota il ; alla fine) il codice seguente tra graffe non è parte del ciclo.

Se vuoi eseguire un gruppo di istruzioni per un numero di volte prefissato usi invece for():

int numeroDiVolte = 5;

for (int i = 0; i < numeroDiVolte; i++) {
    .... codice da esegure numeroDiVolte volte
}

Poi una volta compresi gli array si riesce a scrivere codice molto meno ripetitivo.

(Cmq ripeto: lo studio del C/C++ (delle basi, intendo) è imprescindibile per concludere qualcosa con Arduino. Ad esempio C++ Language - C++ Tutorials sezione contro structures spiega bene for(), while() e compagnia)

Not so easy, but it’s ok, I’ll try to give a quick read 'about that.

Anyway that’s work!!!

 for(int repeat=0;repeat<5;repeat++)  {
    digitalWrite (LED1, HIGH);
    digitalWrite (LED2, LOW);
    digitalWrite (TRA2, HIGH);
    digitalWrite (TRA1, LOW);
    delay (150);
    digitalWrite (LED1, LOW);
    digitalWrite (LED2, HIGH);
    digitalWrite (TRA2, HIGH);
    digitalWrite (TRA1, LOW);
    delay (150);
    digitalWrite (LED1, LOW);
    digitalWrite (LED2, HIGH);
    digitalWrite (TRA2, LOW);
    digitalWrite (TRA1, HIGH);
    delay (150);
    digitalWrite (LED1, HIGH);
    digitalWrite (LED2, LOW);
    digitalWrite (TRA2, LOW);
    digitalWrite (TRA1, HIGH);
    delay (150);

adesso dovrò capire come ripetere l’array senza che mi dica che ci sono troppe graffe aperte :stuck_out_tongue:

MA GRAZIEEEEEE!!!

“Probably the best way to start learning a programming language is by writing a program.”

Prima riga del tutorial <3 ehhhhh

Spack:
“Probably the best way to start learning a programming language is by writing a program.”

Prima riga del tutorial <3 ehhhhh

:smiley:

writing a program => looking at actual code

Spack:
Ritornando all’ “if”

...

if (repeat) repeat<0;
 
  digitalWrite (LED1, HIGH);
  digitalWrite (LED2, LOW);
  digitalWrite (TRA2, HIGH);
      digitalWrite (TRA1, LOW);
  …

Se vuoi che tutto il codice dopo il if venga eseguito devi metterlo nelle parentesi graffe. Cosí come hai scritto esegue solo repeat<0; che inoltre non fa niente a causa di un errore.
Per ripetere delle cose n-volte usa il for e non il while.

http://arduino.cc/en/Reference/If
http://arduino.cc/en/Reference/For

Ciao Uwe

Yeah, il "for" funziona bene :)

Oggi ho costruito il mio primo cubo 3x3x3 e solo ora che ho finito di saldare e testare tutto mi rendo conto della complessità del progetto. È un lavoro molto lungo e adesso mi dedicherò alla parte software.

(c'è un solo LED che è più fiacco degli altri, è al primo livello, non so proprio cos'abbia, tutti gli altri funzionano perfettamente. Comunque non lo smonterò...un solo LED non è abbastanza per farmi smontare quella diavoleria!)

Costruito il cubo 3x3x3 con queste caratteristiche:


LED:

5 mm ad alta luminosità blu

Vf = 3,2-3,8 V

Corrente assorbita: 20mA

Luminosità: 8.000 mcd

Lunghezza d’onda: 465-470 nm

Angolo: 20-25°

TRANSISTOR:

BC337 NPN

RESISTENZE:

220 ?


Mi sono reso conto che i transistor hanno qualche problema e credo derivi dalla corrente. In particolare i livelli non sono controllati, si accendono a prescindere dal comando.

int led9=51;
int led6=50;
int led8=49;
int led7=48;
int led1=47;
int led4=46;
int led3=43;
int led2=42;
int led5=39;
int lvl1=30;
int lvl2=29;
int lvl3=28;


void setup (){

  for(int pluripin=28; pluripin<=51; pluripin++)
    pinMode (pluripin,OUTPUT);

}

void loop (){

  for(int repeat=0; repeat<=5; repeat++) {
    digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
    digitalWrite (led5, HIGH);
    digitalWrite (lvl2, LOW);
delay (200);
    digitalWrite (led5, LOW);
    digitalWrite (lvl2, LOW);
    digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
   digitalWrite (led5, HIGH);
    digitalWrite (lvl2, HIGH);
    digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
    digitalWrite (led5, LOW);
    digitalWrite (lvl2, LOW);
    digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
   digitalWrite (led5, HIGH);
    digitalWrite (lvl2, HIGH);
    digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
    digitalWrite (led5, LOW);
    digitalWrite (lvl2, LOW);
    digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
 digitalWrite (led5, HIGH);
    digitalWrite (lvl2, HIGH);
    digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
    digitalWrite (led5, LOW);
    digitalWrite (lvl2, LOW);
    digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led5, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (1500);
digitalWrite (led5, LOW);
digitalWrite (led4, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led4, LOW);
digitalWrite (led3, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led3, LOW);
digitalWrite (led2, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led2, LOW);
digitalWrite (led1, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led6, HIGH);
digitalWrite (led1, LOW);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
    delay (200);
    digitalWrite (led6, LOW);
digitalWrite (led7, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
    delay (200);
    digitalWrite (led8, HIGH);
digitalWrite (led7, LOW);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
    delay (200);
    digitalWrite (led9, HIGH);
digitalWrite (led8, LOW);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
    delay (200);
    digitalWrite (led4, HIGH);
digitalWrite (led9, LOW);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
    digitalWrite (led4, LOW);
digitalWrite (led3, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led3, LOW);
digitalWrite (led2, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led2, LOW);
digitalWrite (led1, HIGH);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl1, LOW);
    digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led1, HIGH);
digitalWrite (led2, HIGH);
digitalWrite (led3, HIGH);
digitalWrite (led4, HIGH);
digitalWrite (led5, HIGH);
digitalWrite (led6, HIGH);
digitalWrite (led7, HIGH);
digitalWrite (led8, HIGH);
digitalWrite (led9, HIGH);
digitalWrite (lvl1, LOW);
digitalWrite (lvl2, HIGH);
digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led1, HIGH);
digitalWrite (led2, HIGH);
digitalWrite (led3, HIGH);
digitalWrite (led4, HIGH);
digitalWrite (led5, HIGH);
digitalWrite (led6, HIGH);
digitalWrite (led7, HIGH);
digitalWrite (led8, HIGH);
digitalWrite (led9, HIGH);
digitalWrite (lvl1, HIGH);
digitalWrite (lvl2, LOW);
digitalWrite (lvl3, LOW);
delay (500);
digitalWrite (led1, HIGH);
digitalWrite (led2, LOW);
digitalWrite (led3, LOW);
digitalWrite (led4, LOW);
digitalWrite (led5, LOW);
digitalWrite (led6, LOW);
digitalWrite (led7, LOW);
digitalWrite (led8, LOW);
digitalWrite (led9, LOW);
digitalWrite (lvl1, HIGH);
digitalWrite (lvl2, LOW);
digitalWrite (lvl3, LOW);
delay (200);
digitalWrite (led2, HIGH);
digitalWrite (lvl1, HIGH);
delay (200);
digitalWrite (led3, HIGH);
digitalWrite (lvl1, HIGH);
delay (200);
digitalWrite (led4, HIGH);
digitalWrite (lvl1, HIGH);
delay (200);
digitalWrite (led9, HIGH);
digitalWrite (lvl1, HIGH);
delay (200);
digitalWrite (led8, HIGH);
digitalWrite (lvl1, HIGH);
delay (200);
digitalWrite (led7, HIGH);
digitalWrite (lvl1, HIGH);
delay (200);
digitalWrite (led6, HIGH);
digitalWrite (lvl1, HIGH);
delay (200);
digitalWrite (led6, HIGH);
digitalWrite (lvl1, HIGH);
delay (200);
digitalWrite (led1, HIGH);
digitalWrite (lvl2, HIGH);
delay (500);
digitalWrite (led1, HIGH);
digitalWrite (lvl3, HIGH);
delay (500);
digitalWrite (led2, HIGH);
digitalWrite (lvl3, HIGH);
delay (500);
digitalWrite (led3, HIGH);
digitalWrite (lvl3, HIGH);
delay (500);



  }


}

Per cui ho deciso di provare a sostituire i 3 BC337 con un ULN2803 che dovrebbe poter gestire meglio la corrente.

Come hai collegato i pin dell'arduino alla base dei transistor ? Immagino con una resistenza...

Per quanto riguarda il programma, beh direi che è il momento di imparare ad usare gli array :P

Nel frattempo potresti dichiarare una variabile d, assegnarle 200 e sostituire delay(200) con delay(d). In questo modo puoi variare la velocità della sequenza semplicemente modificando il valore assegnato a d (una sola volta invece di n) e ricaricare lo sketch.

Spack: Io non ho studiato elettronica, ci arrivo per intuizione...

:D :D :D

impara bene gli array e con 5 righe ne scrivi 50 ;)

sinceramente se memorizzassi le sequenze in array potresti aver qualche problema di ram :P però poi tutto verrà gestito con 2-3 cicli di for conenuti uno nell'altro, un delay e in totale il loop() ti verrebbe di circa... 10 righe ma avresti infinite possibilità.

ricorda che puoi mettere degli array come singolo valore degli array, quindi esistono array di array :P ed anche array di array di array e così via fino alla saturazione della ram...

L'intuizione serve... ma solo se supportata da un minmo di nozioni 8)

tuxduino:
Come hai collegato i pin dell’arduino alla base dei transistor ? Immagino con una resistenza…

Per quanto riguarda il programma, beh direi che è il momento di imparare ad usare gli array :stuck_out_tongue:

Nel frattempo potresti dichiarare una variabile d, assegnarle 200 e sostituire delay(200) con delay(d). In questo modo puoi variare la velocità della sequenza semplicemente modificando il valore assegnato a d (una sola volta invece di n) e ricaricare lo sketch.

Genius! Lo faccio appena arrivo a casa.

Si, i transistor arrivano ai pin dell’Arduino passando da una resistenza ma come anticipato sostituirò i transistor con un ULN2803 perchè i livelli (piani o chiamali come vuoi) mi si accendono a random. Farò un video per postarvelo :slight_smile:

Questa cosa degli array ci piace, questa sera do una bella sbirciata alla guida di c.

for(int pluripin=28; pluripin<=51; pluripin++)
pinMode (pluripin,OUTPUT);

Questo per ora è il miglior riuscito, quello per il lampeggio non funziona, sarà dovuto sicuramente a qualche errore post mmm

Una volta finito con la programmazione ci sarà da trasferire tutto su un microcontrollore dedicato che salderò sulla millefori, così che il cubo possa essere autonomo senza l’Arduino. Ho già 4 micro tra cui scegliere.

Ah e ovviamente qualcosa per la corrente, anche se credo che le batterie siano meno dispendiose e più semplici da “introdurre” a livello di componenti e codice.

Io non sapevo neanche accendere un led prima di imbarcamenarmi in quest’impresa e aver fatto un cubo, ora che l’ho quasi portato a termine è una vera soddisfazione, lo consiglio a tutti a prescindere.

:slight_smile:

Solo una precisazione (mi scuso in anticipo se ho capito male).

In questo frammento:

 for(int pluripin=28; pluripin<=51; pluripin++)
    pinMode (pluripin,OUTPUT);

gli array non c’entrano.
Ti faccio un esempio con un array… Il vantaggio è che l’indice del ciclo for() è slegato dal numero dei pin, quindi puoi modificare i numeri di pin senza toccare il codice del for() e senza che debbano essere per forza consecutivi.
(ps: ho scritto solo alcuni pin per far prima :stuck_out_tongue: )

// questa è una macro che calcola il numero di elementi in un array
#define ARY_LEN(a) (sizeof(a)/sizeof(a[0]))
// dichiarazione e inizializzazione di un array contenente il numero di ogni pin utilizzato
byte pins[] = { 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42 };
// calcolo automatico di quanti pin sono contenuti nell'array; da usare nei cicli for(); si aggiorna automaticamente se aggiungiamo elementi all'array qui sopra
const byte NUM_PIN = ARY_LEN(pins);

// pinMode di cascun pin:
for (byte i = 0; i < NUM_PIN; i++) {
    pinMode(pins[i], OUTPUT);
}

Se per ora non ti è chiaro, lo sarà di sicuro tra poco… :slight_smile: Guarda qui, ad esempio: Arrays - C++ Tutorials

il bello è che potresti fare un array nell’array in cui sono contenuti in sequenza i pin da accendere :stuck_out_tongue:

ad esempio

byte pins[][] = {
  {20, 30, 40},
  {20, 30, 50},
  {10, 20, 30, 50},
  {10, 20, 30, 40, 50}
  }

è un array che contiene altri array. viene chiamato multidimensionale (in questo caso bidimensionale)
ho scritto dei pin alla cavolo non so nemmeno se esistono devo ammette ma ora ti faccio capire il trucchetto :stuck_out_tongue:
riprendo la macro scritta da tuxduino e la trasformo in funzione, la differenza è che la funzione è calcolata durante lo svolgimento del programma mentre la macro durante la compilazione (o almeno io la sapevo così :stuck_out_tongue: )

void array_length(byte a) { 
  return (sizeof(a)/sizeof(a[0]));
  }

ok fatto questo puoi sapere ogni volta quanti valori hai in ogni array

ora pensiamo al ciclo :wink:

quando vuoi richiamare il valore di un array multidimensionale hai necessità di 2 indici. gli indici sono dei numeri che vanno a “selezionare” il valore, vedile come le righe di un programma.
però noi abbiamo delle righe e delle colonne quindi abbiamo 2 indici per poter leggere 1 solo valore :wink: spero tu mi segua
ricorda che gli indici partono da 0

for (byte i = 0; i < array_lenght(pins); i++) {
  for (byte z = 0; z < array_lenght(pins[i]); z++) {
    Serial.print(pins[i][z]);
    Serial.print(" ");
  }
  Serial.println();
}

se aprirai il monitor seriale con questo codice nel setup (o stamperà all’infinito) vedrai che dovrebbe riportarti il tuo array

unico dubbio che mi è sorto:
noi calcoliamo il numero di elementi dell’array come un rapporto tra grandezza dell’array e grandezza del primo valore, ma in un array dimensionale i cui “sotto-array” sono di grandezza variabile è attendibile come sistema? quindi ogni sotto-array è grande (in questo caso) un byte o ogni suo valore all’interno è un byte?
perchè in tal caso sballerebbe la lunghezza sull’intero array…