Arduino Forum

International => Italiano => Software => Topic started by: Spack on Dec 31, 2012, 12:48 am

Title: CUBO 3X3X3 info e consigli
Post by: Spack on Dec 31, 2012, 12:48 am
Ciao a tutti, ho realizzato un "cubo" in 2D in previsione della realizzazione di un cubo 5x5x5

I LED hanno l'anodo in comune per colonne e il catodo in comune per livelli.

I due anodi passando dalle rispettive resistenze vanno ai PIN 6e7
I due catodi passando da transistor BC337 NPN vanno a massa e ai PIN 2e3

So che si può programmare in modi diversi per ottenere lo stesso risultato.

Per fare un gioco di luci "a rotazione" ho scritto questo programma:

Code: [Select]
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);

}

void loop (){
 Serial.println ();
 
 
 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);
 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);
 
 // PRIMA VELOCITÁ CICLO X2 (1200)
 
 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);
  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);
  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);
 
// SECONDA VELOCITÁ CICLO X2,5 (1200)
 
 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);
  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);
  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);
  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);
  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);
  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);
 
 // TERZA VELOCITÁ CICLO X 6 (1200)


}


So per certo che potrei ovviare tutta la pappardella della ripetione del primo gioco mettendo una variabile e facendola arrivare a "0" ma non riesco... ho provato con "if"

Code: [Select]

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);

}

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

if (repeat; repeat=repeat-1);

if (repeat<0);

digitalWrite (seconda velocità) ----//ovviamente questo è quello che vorrei scrivere ma non riesco a tradurlo in C++
 
 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);
}


Consigli?
Title: Re: Sketch per CUBO 2D
Post by: tizio45 on Dec 31, 2012, 01:32 am
io lo sto facendo 3x3x3 o schema e sketc devi solo cambiare le resistenze in base ai led e i transistor che usi
Title: Re: Sketch per CUBO 2D
Post by: uwefed on Dec 31, 2012, 01:43 am
Quote
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
Title: Re: Sketch per CUBO 2D
Post by: Spack on Dec 31, 2012, 03:04 am

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...


Quote
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 :(

Code: [Select]
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...
Title: Re: Sketch per CUBO 2D
Post by: marcello.romani on Dec 31, 2012, 03:35 am
Quote
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.
Title: Re: Sketch per CUBO 2D
Post by: Spack on Dec 31, 2012, 03:43 am
Ritornando all' "if"

Code: [Select]
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
Title: Re: Sketch per CUBO 2D
Post by: Spack on Dec 31, 2012, 03:51 am

Quote
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--

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.


Vorrei fare pratica costruendo un cubo.

Sono partito a zero e ho 4 led saldati su una board che si accendono sequenzialmente come vorrei :P
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!
Title: Re: Sketch per CUBO 2D
Post by: marcello.romani on Dec 31, 2012, 04:05 am
Ok, provo ad essere un po' più costruttivo.

La sintassi del costrutto while() è:

Code: [Select]

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():

Code: [Select]

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 http://www.cplusplus.com/doc/tutorial/  sezione contro structures spiega bene for(), while() e compagnia)
Title: Re: Sketch per CUBO 2D
Post by: Spack on Dec 31, 2012, 04:19 am
Not so easy, but it's ok, I'll try to give a quick read 'about that.

Anyway that's work!!!

Code: [Select]
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 :P

MA GRAZIEEEEEE!!!
Title: Re: Sketch per CUBO 2D
Post by: Spack on Dec 31, 2012, 04:21 am
"Probably the best way to start learning a programming language is by writing a program."

Prima riga del tutorial <3 ehhhhh
Title: Re: Sketch per CUBO 2D
Post by: marcello.romani on Dec 31, 2012, 04:26 am

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

Prima riga del tutorial <3 ehhhhh


:D

writing a program => looking at actual code
Title: Re: Sketch per CUBO 2D
Post by: uwefed on Dec 31, 2012, 08:09 am

Ritornando all' "if"

Code: [Select]
...
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

Title: Re: Sketch per CUBO 2D
Post by: Spack on Dec 31, 2012, 02:44 pm
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!)
Title: Re: CUBO 3X3X3 info e consigli
Post by: Spack on Jan 03, 2013, 02:13 am
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.

Code: [Select]
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.
Title: Re: CUBO 3X3X3 info e consigli
Post by: marcello.romani on Jan 03, 2013, 02:22 am
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.
Title: Re: Sketch per CUBO 2D
Post by: pablos71 on Jan 03, 2013, 09:35 am

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


:D :D :D
Title: Re: CUBO 3X3X3 info e consigli
Post by: superlol on Jan 03, 2013, 01:19 pm
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...
Title: Re: CUBO 3X3X3 info e consigli
Post by: marcello.romani on Jan 03, 2013, 03:05 pm
L'intuizione serve... ma solo se supportata da un minmo di nozioni  8)
Title: Re: CUBO 3X3X3 info e consigli
Post by: Spack on Jan 04, 2013, 05:53 am

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.


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 :)

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.


Title: Re: CUBO 3X3X3 info e consigli
Post by: marcello.romani on Jan 04, 2013, 12:25 pm
:-)

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

In questo frammento:
Code: [Select]
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 :P )
Code: [Select]

// 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... :) Guarda qui, ad esempio: http://www.cplusplus.com/doc/tutorial/arrays/
Title: Re: CUBO 3X3X3 info e consigli
Post by: superlol on Jan 04, 2013, 01:43 pm
il bello è che potresti fare un array nell'array in cui sono contenuti in sequenza i pin da accendere :P

ad esempio
Code: [Select]
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 :P
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ì :P )
Code: [Select]
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 ;)

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 ;) spero tu mi segua
ricorda che gli indici partono da 0
Code: [Select]

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...