Ejercicio 16: Ruleta musical aleatoria
Se encienden los Leds y suenan notas en dos secuencias aleatorias superpuestas.
| Novedades hardware | Novedades software |
| | Recuperación del valor de una función con un argumento de variable real. |
Requisitos:
- 4 LEDs, 4 resistencias de 220 ohmios
- 4 pulsadores, 4 resistencias de 1Kohmio.
- Un zumbador piezoeléctrico
Planteamiento: La belleza del azar en luz y color.
Presentación: Generación de series de números pseudoaleatorios.
Lo nuevo de este ejercicio es una función de argumento entero:
- randomize(int data) que genera un número psudoaleatorio a partir de otro número efectuando unas operaciones aritméticas.
También hay dos elementos nuevos en la programación:
- abs, que devuelve el valor absoluto de un número
- %, que devuelve el resto de la división, lo que llamamos módulo.
Veamos cómo los usamos.
En el void setup( ) del programa hay un while que se ejecuta sólo una vez.
¿Qué hace?. Proporciona un nº, guardado en la variable ini, que depende del tiempo que tardemos en presionar un pulsador, porque cada ciclo de iteración del while aumenta ini en una unidad.
Ese número, que se produce más o menos al azar, lo necesitamos para iniciar la generación de números pseudoaleatorios.
A continuación usamos el primer número aleatorio para conseguir otros:
Primero actualizamos la variable que lo guarda usando la función sobre sí mismo, esto nos da un nuevo número en cada ciclo.
Luego lo reducimos con la operación módulo (cuidando de hallar primero el valor absoluto por si nos había salido negativo) a valores entre 0 y 7 que guardamos en n.
Los valores de n corresponden a las 7 notas y el séptimo al silencio, con lo que tenemos una nota o un silencio al azar.
Hacemos lo mismo pero con módulo4 para obtener valores entre 0 y 3 que nos permiten seleccionar uno de los LEDs al azar a partir de su posición en la cadena.
Variantes:
- Disminuye el nº de notas a 4 y asocia una nota a cada color
VIDEO DEL EJERCICIO 16
VIDEO DEL EJERCICIO 16 (versión para el montaje del SIMON)
CODIGO FUENTE
Copyright (C) 2006 Juan Carlos Alonso de Mena
This program is free software; you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation;
See the GNU General Public License for more details?
int zumb=10;
int cadenaLeds[]={6,7,8,9};
int cadenaPuls[]={2,3,4,5};
int notas[]={1915, 1700, 1519, 1432, 1275, 1136, 1014};
int color=0;
int tiempo=100;
int tnota=100; //duración de la nota
int n=0;
int m=0;
int ini=0;
int psrnum=0;
void flash(){
for(n=0;n<4;n++){
digitalWrite(cadenaLeds[n],HIGH);
}
delay(tiempo);
for(n=0;n<4;n++){
digitalWrite(cadenaLeds[n],LOW);
}
delay(tiempo);
}
void luz(){
digitalWrite(cadenaLeds[color],HIGH);
delay(tiempo);
digitalWrite(cadenaLeds[color],LOW);
}
void nota(){
for(m=0;m<=tnota;m++){
digitalWrite(zumb,HIGH);
delayMicroseconds(notas[n]);
digitalWrite(zumb,LOW);
delayMicroseconds(notas[n]);
}
}
randomize(int data){ //Función del generador de números pseudoaleatorios
return ((1664525*data)%1023); //al introducir un nº devuelve el resto de dividir
} //ese nº multiplicado por 1664525 entre 1021
void setup (){
for(n=0;n<4;n++){
pinMode(cadenaLeds[n],OUTPUT);
}
for(n=0;n<4;n++){
pinMode(cadenaPuls[n],INPUT);
}
pinMode(zumb,OUTPUT);
while(digitalRead(2)==LOW&&digitalRead(3)==LOW&&digitalRead(4)==LOW&&digitalRead(5)==LOW){ //mientras no se pulse nada:
ini=ini+1; // la variable ini aumenta
psrnum= randomize(ini); // Obtenemos el primer nº pseudoaleatorio usando el valor de ini como
flash(); // argumento de la función que lo produce parpadean los LEDs
}
}
void loop(){
psrnum= randomize(psrnum); //Obtenemos sucesivos números psudoaleatorios a partir de los anteriores
n=abs(psrnum)%7; //Obtenemos la posición en la cadena de una nota (del 0 al 6) o de un silencio, si sale el 7
color=abs(psrnum)%4; //Obtenemos una posición en la cadena de LEDs (del 0 al 4)
luz();
nota();
}
Volver?
Copyright (c) 2006 Juan Carlos Alonso de Mena
Permission is granted to copy, distribute and/or modify this document under the terms of
the GNU Free Documentation License, Version 1.2 or any later version published by the
Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
Back-Cover Texts. A copy of the license is included in the section entitled
GNU Free Documentation License?.