En esta post vamos a ver como hacer un dado electrónico o Generador de números aleatorios, esto lo vamos a hacer utilizando el circuito del post anterior ” Display de 7 Segmentos con Arduino “, y vamos a hacer algunas modificaciones al código fuente, y también vamos a agregar un botón o pulsador para disparar el generador, y para hacerlo un poco mas interesante le vamos a poner también un poco de sonido (estilo retro game) con un buzzer. 

A continuación se muestra el esquema de armado en protoboard y el circuito esquemático de nuestro generador.

Para este proyecto vamos a utilizar:

1 x arduino uno

8 x resistencias de 330 ohms

Algunos Cables macho macho

1 x protoboard

1 x buzzer

1 x pulsador

 

Al circuito del post anterior le vamos a agregar un buzzer que va a ir conectado entre gnd y el pin A5 de nuestro arduino, con el vamos a generar un par de sonidos que serán disparados cada vez que presionemos el botón y cada vez que nos entregue un nuevo numero. 

Ademas tendremos que agregar un pulsador con una resistencia pull-Down que ira conectado en el pin A4 de nuestro Arduino. 

Con eso ya tendremos listo nuestro circuito del dado electrónico.

 

 

 

Para poder generar los números aleatorios que luego serán mostrados por medio de un display de 7 segmentos, vamos a hacer uso de la función random() y randomSeed().

Esta función es utilizada para crear números aleatorios y se usa de la siguiente manera: 

randomSeed(millis());  

La función randomSeed() establece un valor Semilla como punto de partida de la función random, para que esta nos de un numero aleatorio y que la secuencia nunca se repita tenemos que pasarle a esta función una fuente de números que sean cambiantes. 

Se suele utilizar la función millis() que le entrega a la función randomSeed el numero de milisegundos de ejecución del programa. 

También se puede usar una entrada analógica, como analogRead(A0), que lo que hace es tomar el ruido o la interferencia del ambiente y le pasa el valor leído a la función randomSeed.

valor = random(0,9);  

Random devuelve un valor aleatorio de entre 0 y 9, y este número se guardara en la variable valor. 

Ademas de esta modificación agregaremos una pequeña animación a los leds del display para hacerlo un poco mas interesante. 

Les dejo el programa para nuestro dado: 

int buzzerPin = A5;


int valor = 0;
int tiempo = 500;
#define pulsador A4
#define a 2
#define b 3
#define c 4
#define d 5
#define e 6
#define f 7
#define g 8
#define pt 9

void apagado(){
  
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  

}

void uno(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,1);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(500);
  for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  }
}

void dos(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,0);
  digitalWrite(b,0);
  digitalWrite(c,1);
  digitalWrite(d,0);
  digitalWrite(e,0);
  digitalWrite(f,1);
  digitalWrite(g,0);
  digitalWrite(pt,1);
  delay(500);
 for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  } 

}

void tres(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,0);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,0);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,0);
  digitalWrite(pt,1);
  delay(500);
  for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  } 

}

void cuatro(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,1);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,0);
  digitalWrite(g,0);
  digitalWrite(pt,1);
   delay(500);
 for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  }

}
void cinco(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,0);
  digitalWrite(b,1);
  digitalWrite(c,0);
  digitalWrite(d,0);
  digitalWrite(e,1);
  digitalWrite(f,0);
  digitalWrite(g,0);
  digitalWrite(pt,1);
   delay(500);
 for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  }

}

void seis(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,0);
  digitalWrite(b,1);
  digitalWrite(c,0);
  digitalWrite(d,0);
  digitalWrite(e,0);
  digitalWrite(f,0);
  digitalWrite(g,0);
  digitalWrite(pt,1);
   delay(500);
  for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  }

}

void siete(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,0);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
   delay(500);
  for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  }

}

void ocho(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,0);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,0);
  digitalWrite(e,0);
  digitalWrite(f,0);
  digitalWrite(g,0);
  digitalWrite(pt,1);
   delay(500);
  for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  }

}

void nueve(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
   for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,0);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,0);
  digitalWrite(e,1);
  digitalWrite(f,0);
  digitalWrite(g,0);
  digitalWrite(pt,1);
   delay(500);
   for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
 
  }

}

void cero(){
  for(int contador = 0; contador < 4; contador++){
  apagado();
  delay(500);
    for (int i=1000; i<2000; i=i*1.10) {
    beep(buzzerPin,i,10);
  }
  digitalWrite(a,0);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,0);
  digitalWrite(e,0);
  digitalWrite(f,0);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(500);
  for (int i=1000; i>500; i=i*.90) {
    beep(buzzerPin,i,10);
  }
  
  }
}

void punto(){
  
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,0);
  

}


void girar(){
  int contador;
  for(contador = 0; contador < 10; contador++){
  digitalWrite(a,0);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  digitalWrite(a,1);
  digitalWrite(b,0);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,0);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,0);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,0);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,0);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  }
  
apagado();
}

void rebotarV(){
  int contador;
  for(contador = 0; contador < 10; contador++){
  digitalWrite(a,0);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/5);
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,0);
  digitalWrite(pt,1);
  delay(tiempo/5);
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,0);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/5);
  
 
  }
  
apagado();
}

void rebotarH(){
  int contador;
  for(contador = 0; contador < 10; contador++){
  digitalWrite(a,1);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,0);
  digitalWrite(f,0);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  digitalWrite(a,1);
  digitalWrite(b,0);
  digitalWrite(c,0);
  digitalWrite(d,1);
  digitalWrite(e,1);
  digitalWrite(f,1);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  digitalWrite(a,1);
  digitalWrite(b,1);
  digitalWrite(c,1);
  digitalWrite(d,1);
  digitalWrite(e,0);
  digitalWrite(f,0);
  digitalWrite(g,1);
  digitalWrite(pt,1);
  delay(tiempo/10);
  }
  
apagado();
}


void dado(){
  girar();
  switch(valor){
  case 0:{ cero();}
  break;
  case 1: {uno();}
  break;
  case 2:{ dos();}
  break;
  case 3:{ tres();}
  break;
  case 4:{ cuatro();}
  break;
  case 5:{ cinco();}
  break;
  case 6:{ seis();}
  break;
  case 7:{ siete();}
  break;
  case 8:{ ocho();}
  break;
  case 9:{ nueve();}
  break;
  }
  }


  void beep (int buzzerPin, float noteFrequency, long noteDuration)
{    
  int x;
  // Convert the frequency to microseconds
  float microsecondsPerWave = 1000000/noteFrequency;
  // Calculate how many HIGH/LOW cycles there are per millisecond
  float millisecondsPerCycle = 1000/(microsecondsPerWave * 2);
  // Multiply noteDuration * number or cycles per millisecond
  float loopTime = noteDuration * millisecondsPerCycle;
  // Play the note for the calculated loopTime.
  for (x=0;x<loopTime;x++)   
          {   
              digitalWrite(buzzerPin,HIGH); 
              delayMicroseconds(microsecondsPerWave); 
              digitalWrite(buzzerPin,LOW); 
              delayMicroseconds(microsecondsPerWave); 
          } 
}     
     

void squeak() {
  for (int i=100; i<5000; i=i*1.45) {
    beep(buzzerPin,i,60);
  }
  delay(10);
  for (int i=100; i<6000; i=i*1.5) {
    beep(buzzerPin,i,20);
  }
}

 



void setup() {
  pinMode(buzzerPin, OUTPUT);
  pinMode(pulsador, INPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(pt, OUTPUT);
  squeak();
  girar();
  rebotarH();
  rebotarV();

}



void loop() {

if(digitalRead(pulsador) == 1){squeak();dado();}
randomSeed(analogRead(A0));
valor = random(0,9);
}

Una vez montado todo el circuito y subido el sketch con arduino ide podemos probar nuestro generador de numeros aleatorios. 

A continuación dejo un video del dado electrónico en funcionamiento. 

 

One Reply to “Como hacer un dado Electrónico con Arduino (generador de numero aleatorios)”

Deja una respuesta