Dado Binario.

Vi chiedo scusa in anticipo per la mia incompetenza ma è davvero pochissimo che ho Arduino e non sono riuscito a capirci poi tanto.. Mi sono comprato il libro di Maik Schimdt "Il Manuale di Arduino" ma per quanto possa essere semplice per alcuni di voi, per me è alquanto impossibile capirci qualcosa..

Non riesco a capire per nulla il seguente codice:

const unsigned int LED_BIT0 = 12;
const unsigned int LED_BIT1 = 11;
const unsigned int LED_BIT2 = 10;

void setup() {
pinMode(LED_BIT0, OUTPUT);
pinMode(LED_BIT1, OUTPUT);
pinMode(LED_BIT2, OUTPUT);

randomSeed(analogRead(A0));
long result = random(1, 7);
output_result(result);
}

void loop() {
}

void output_result(const long result) {
digitalWrite(LED_BIT0, result & B001);
digitalWrite(LED_BIT1, result & B010);
digitalWrite(LED_BIT2, result & B100);

La parte della dichiarazioni delle variabili è chiara, ma il resto è arabo..
Se volete darmi una mano ve ne sarei davvero grato.. :wink:
}

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Genera un numero casuale tra 1 e 7 con la random()
In binario tali numeri sono 3 bit nelle varie combinazioni 000 fino a 111
Quindi 3 bit => 3 led e li accende a seconda della combinazione.
Se esce ad esempio il numero 5 avrai il numero binario 101 e quindi accende 2 led su 3

Il trucco stà qui nelle 3 istruzioni della output: result & B001 , questo verifica se il primo bit è a 1, si chiama mascheramento. & - Arduino Reference
Una operazione AND, dove c'e' 0 avrai sempre 0 (quindi non ti preoccupi dei primi due bit) dove c'e' 1, otterrai 0 o 1 a seconda del primo bit di "result"
Quindi result & B010 serve per "testare" se è a 1 o 0 il secondo bit

Non un esempio molto semplice. Se usava la bitRead() era più leggibile:

digitalWrite(LED_BIT0, bitRead(result,0));
digitalWrite(LED_BIT1, bitRead(result,1));
digitalWrite(LED_BIT2, bitRead(result,2));

nid69ita oggi non é la giornata giusta per Te.

Il "random(1, 7);" genera numeri ta 1 e 6
http://www.arduino.cc/en/Reference/Random

"Se esce ad esempio il numero 5 avrai il numero binario 101 e quindi accende 2 led su 3"
secondo me si illuminano i LED 1 e 3 colegati ai pin 12 e 10

:wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink: :wink:

Ciao Uwe

Vero tra 1 e 6, secondo me però voleva ottenere tra 1 e 7 quindi è da correggere quel codice:

 long result = random(1, 8);  // random tra 1 e 7

P.S. ma poi che usa a fare un long per un numeretto tra 1 e 7 !?!

La seconda, abbiam detto la stessa cosa, non ho specificato quali dei due bit accende, solo 2 su 3 (ovvero non ho scritto che accende il led 2 e 3) ;D

Vi ringrazio infinitamente per le risposte, da ciò che è scritto sul libro però si deduce che 3 led contemporaneamente non vengono accesi mai..
In maniera "terra terra" mi potete spiegare il perchè?

perche un dado va dal numero uno al numero sei, sette sarebbe 111 e quindi accenderebbe tutti i led ma non avresti più un dado.
random restituisce un long compreso tra min e max-1 scrivendo 1,7 avrai un numero tra 1 e 6, prova a scrivere 1,8.
se vuoi vedere i numeri collegaci un BCD con display 7 segmenti.

nid69ita:
Vero tra 1 e 6, secondo me però voleva ottenere tra 1 e 7

i dadi vanno da 1 a 6. Se vuole simularne uno ...

Hai ragione. Non ho letto con attenzione.
Ciao Uwe

Se io mettessi 6 Led potrei riscrivere lo stesso codice con B000001, B000002 ecc..?

B000002 non esiste. Un numero binario ha come cifre solo ilo 0 e il 1.

La soluzione piú semplice é che crei un array con i pin dove sono collegati i LED con la loro resistenza.

Poi per accendere uno usi il numero casuale come indice del array.

Ciao Uwe

devi cambiare il codice circa cosi:

//PIN DOVE SONO COLLEGATI I LED
const byte PIN_LED[6] = { 2,3,4,5,6,7 };

void clearDado()
{
    int i = 0;
    for ( i = 0; i < 6; ++i )
        digitalWrite(PIN_LED[i],LOW);
}

void displayDado(byte val)
{
    int i;
    for ( i = 0; i < 6; ++i )
        digitalWrite(PIN_LED[i],HIGH);
}

void setup() 
{
    byte i,ani,e;
    
    for ( i = 0; i < 6; ++i )  
        pinMode(PIN_LED[i], OUTPUT);
  
    randomSeed(analogRead(A0)); 
    
    ani = random(10,20);
    for ( i = 0; i < ani; ++i)
    {
        clearDado();
        e = random(1,7);
        displayDado(e);
        delay(250);
    }
}

void loop() {
}

ora hai 6 led collegati e i pin sono scritti nel vettore PIN_LED, in questo caso avrai i led collegati ai pin 2,3,4,5,6,7.
Poi ho creato due funzioni, la prima "clearDado()" scorre il vettore abbassando le uscite e spegnendo di conseguenza tutti i led.
La seconda "displayDado()" invece alza il pin del vettore fino ad arrivare al numero passato come argomento.
Ho usato sempre il vettore per mettere tutti i pin in modalità output.
Ho aggiunto anche la classica animazione da dado, ovvero viene estrato un numero nell'intervallo tra 10 e 20 e inizio un ciclo entro 0 ed il numero estratto, a questo punto spengo i led e visualizzo il nuovo numero, aspetto un pochino e ripeto il ciclo fino ad arrivare a "ani" e allora esco lasciando visualizzato l'ultimo numero estratto.

@ vbextreme
Non dare la pappa pronta.

Lascia egeondundee pensare un po da solo. se non capisce richiederá.

Ciao Uwe

Chi lo dice che un dado deve avere per forza i numeri da 1 a 6 ?
Evidentemente non avete mai giocato a Dungeons & Dragons :slight_smile:

@uwe sono una persona molto "Free Software" :slight_smile:
e poi non era il problema ma solo una sua curiosità, non penso abbia ancora le capacità tecniche necessarie.

@paulus ci sono dadi di ogni sorta, con le lettere, coi disegni e quant'altro ma parlando di dado generico si intende quello a 6 facce e 6 numeri da 1-6.in caso diverso bisogna specificarlo. :stuck_out_tongue:

vbextreme:
... parlando di dado generico ...

Be', allora bisognerebbe anche specificare "tridimensionale" ... perche' ad esempio un dado quadrimensionale ha 24 facce ... :stuck_out_tongue: :smiley: :smiley: :smiley:

La questione del dado binario è già stata da me sollevata e mi hanno cortesemente risposto Nidita69 e il moderator. Ho capito che devo studiare C per Arduino per capire meglio la programmazione del micro Arduino. Nel caso specifico le funzioni come output_result(result) che viene introdotta da Schimisdt come segue.

  randomSeed(analogRead(A0)); 
  long result = random(1, 7);
  output_result(result);
}

void loop() {
}

void output_result(const long result) {
  digitalWrite(LED_BIT0, result & B001);
  digitalWrite(LED_BIT1, result & B010);
  digitalWrite(LED_BIT2, result & B100

Il punto è proprio quando si introduce, fuori dal loop, output_result (result) per poi utilizzarla come bitwise per confrontare i bit.

Dove è il body e la signature della funzione creata da Schmidt?
Cosa fa? Non vedo parentesi graffe quando è stata invocata, cioè qui:

randomSeed(analogRead(A0)); 
long result = random(1, 7);
 output_result(result);

Se è già in una libreria perchè non è richiamata all'inizio, tale libreria, con un include? O è nella libreria standard di Arduino?

Sto cercando di capire leggendo e studiando Beginning C for Arduino ma non riesco a trovare la soluzione. Se io mi creo una funzione devo mettere la signature, nevvero? Cito ad esempio VBextreme che per fare il dado a sei LED ha creato le seguenti funzioni clearDad e display Dad con tanto di loro signature. E output_result, perchè no?

Grazie e saluti.

perché Arduino fa qualcosa che non dovrebbe fare nessuno, mette mano al tuo codice! e quindi puoi omettere i prototipi perché lo fa lui.....

Ma allora come faccio a testare e sapere cosa fa, ad esempio, output_result se non ho il prototipo del suo body o come si chiama?

Grazie in anticipo, Vextreme, dele tue spiegazioni e ne approfitto per chiederti se c'è qualche altro manuale C per Arduino, magari in italiano, oltre quello consigliato da bp01 cioè Beginniong c for Arduino.

Thanks

output_result() è una funzione, ed è subito dopo la funzione loop(), il c/c++ però vogliono sapere dove sta questa funzione prima di poterla chiamare e pertanto se la chiami prima di dichiararla dovresti avere errore ma Arduino crea lui i prototipi e quindi puoi evitarli di creare anche se io per buona abitudine lo faccio sempre.

Quello che voi state scrivendo per me è aramaico, per capirci qualcosa mi potete consigliare una guida in .pdf?