Arduino UNO (o superior). Protoboard y 3 cables para realizar las conexiones. Potencimetro (resistencia variable). Diodo LED.
Que qu es un potencimetro? Muy sencillo: es exactamente igual a una resistencia, pero podemos modificar el valor de la misma simplemente girando una ruleta. Las resistencias (y por lo tanto, tambin los potencimetros) no tienen polaridad. En el esquema de la imagen inferior se ha colocado una sugerencia de montaje, pero funcionara de forma idntica cambiando la tierra por el positivo de 5 voltios. El terminal que queda en medio (analog pin) servir para leer el valor de tensin desde Arduino.
2) BREVE EXPLICACIN DEL PROGRAMA A grandes rasgos, la idea es crear un programa para Arduino que permita manejar el valor de tensin ledo en el potencimetro. Al girar la ruleta, regularemos ese valor de tensin desde el mnimo (resistencia mxima) hasta el mximo (resistencia cero). El programa sabr en todo momento cunto hemos girado la ruleta, y esa posicin de giro ser un nmero de 0 a 9. Al mismo tiempo, el monitor serial de Arduino servir como interfaz entre el usuario y el propio programa. Podremos guiar a la persona que trata de adivinar el nmero secreto, dndole las instrucciones necesarias, que se imprimirn por pantalla.
3) ESQUEMTICO DEL MONTAJE
Colocaremos adems un LED con la patilla ms corta a GND (tierra) y la otra al pin digital 13 (estn al lado uno de otro). Para el potencimetro: 5V a un lado, tierra al otro, y cable desde el terminal central hasta el pin analgico nmero 2 de Arduino (o cualquier otro, siempre que modifiques el cdigo). 4) CDIGO
Puedes consultar y utilizar mi cdigo, que est a disposicin de cualquiera en este link de GitHub. Adems, lo incluyo aqu, a continuacin (recomiendo hacer scroll lateral para ver las explicaciones que quedan ocultas): /* --Estructura: 1) El usuario introduce el nmero secreto de 5 cifras por teclado. 2) El programa guarda dicho nmero (de uno en uno, como componentes de un vector) 3) Estructuras for para iterar entre todas las componentes del vector (de 0 a 4, las posiciones, total 5 iteraciones). 4) El programa lee el valor analgico del potencimetro (de 0 a 1023). 5) Funcin matemtica map para cambiar rango: ahora el mximo es 9 en lugar de 1023. 6) Imprimir mensajes por pantalla con Serial.print para guiar al usuario a travs del programa. 7) Objetivo: girar la ruleta hasta adivinar todos los nmeros. */ //Declaracin de variables antes del setup:
int led=13; //El led est conectado al pin digital 13. int potenciometro=2; //El potencimetro est conectado al pin ANALGICO 2.
int leer=0; //Variable en la que se almacenar el valor ledo en el potencimetro. //se trata de un valor analgico (de 0 a 1023).
int convert=0; //Variable que contendr el valor ledo, convertido con funcin map() [rango de 0 a 9] int convert_anterior=0; //Variable que almacena el nmero correspondiente a la anterior conversin.
int secreto0; //Nmero secreto en la posicin 0 int secreto1; //Nmero secreto en la posicin 1 int secreto2; //etc... int secreto3; int secreto4;
int secreto_leer=0; //Variable para guardar cada uno de los 5 nmeros secretos que introducimos por TECLADO.
int secreto[]={secreto0, secreto1, secreto2, secreto3, secreto4}; //Vector que contiene el nmero secreto //que se compone de 5 cifras.
void setup() { pinMode(led,OUTPUT); //El led es una salida. pinMode(potenciometro,INPUT); //El potencimetro es una entrada.
Serial.begin(9600); //Se inicializa el puerto serial.
Serial.println("Por favor, introduce tu numero secreto (5 cifras)."); //Pedimos que se introduzca el nmero secreto (5 cifras): for (int a=0; a<5; a++){ secreto_leer= Serial.read(); while(secreto_leer<0){ secreto_leer= Serial.read(); } secreto[a]=secreto_leer-48; //El dato que introducimos por teclado est codificado en ASCII. 0=48, 1=49, 2=50... Restamos 48 para obtener el nmero en entero. Serial.print(secreto[a]); }
//Ocultar nmero secreto: Serial.println(); //Salto de lnea con texto vaco.
for (int a=0; a<40; a++){ Serial.println("..."); }
Serial.println("Gira la ruleta de la caja fuerte para adivinar el numero secreto"); }
void loop(){ for (int b=0;b<5;b++){ Serial.print("Adivina el numero secreto de la posicion "); Serial.print(b+1); Serial.println(); leer=analogRead(potenciometro); convert=map(leer, 0 , 1023 , 0 , 9);
while(convert!=secreto[b]){ leer=analogRead(potenciometro); //Funcin matemtica map() --> map(value, fromLow, fromHigh, toLow, toHigh) convert=map(leer, 0 , 1023 , 0 , 9); //Se cambia el rango. Ahora el mximo es 9.
if(convert!=convert_anterior && convert!=secreto[b]){ Serial.print(convert); Serial.println(" no es el numero correcto"); delay(1000); } else { //no hacer nada } convert_anterior=convert;
}
//Cuando sale del bucle anterior es porque hemos adivinado un nmero.
digitalWrite(led,HIGH); //Para celebrarlo, encenderemos el led. Serial.println(); Serial.print("Bien hecho! Has adivinado el numero de la posicion "); Serial.print(b+1); Serial.print(", que era el numero "); Serial.print(convert); Serial.println();
delay(3000); //Lo mantenemos encendido durante 3 segundos. digitalWrite(led,LOW);
}
//Cuando salimos del ltimo bucle es porque hemos acertado los 5 nmeros secretos.
Serial.println("____________________________________________"); Serial.println("Enhorabuena, has adivinado el numero secreto!"); Serial.println("____________________________________________");
//Para celebrarlo, ahora que somos ricos, haremos parpadear el LED infinitamente.
Entrada de datos por teclado con Serial.read( ) Cuando pedimos al usuario que introduzca el nmero secreto de 5 cifras por teclado, debemos tener en cuenta que Arduino manejar esos nmeros de uno en uno. Durante todo el programa utilizaremos ciclos for, con una variable que tomar los valores de posicin del vector en el que almacenaremos las componentes del nmero secreto. Por defecto, cuando esperamos que el usuario introduzca algo por teclado pero este todava no lo ha hecho, el valor que lee Arduino con Serial.read( ) es igual a -1. Este es un hecho a tener en cuenta, ya que en el programa nos aseguraremos de que los 5 nmeros que se introducen por teclado se guarden, obligando a leer datos mientras el valor ledo sea menor que cero (que es el caso por defecto, -1). Con seguiremos esto fcilmente con un while que fuerce a leer siempre que no se introduzca un nmero mayor o igual que cero. Uso de variable vector para almacenar el nmero secreto y ciclos for para pasar por todas sus componentes Por ejemplo, si el nmero secreto es el 65248, nuestro vector tendr en la posicin 0 guardado el nmero 6, en la posicin 1 el nmero 5, en la posicin 4 guardar el nmero 8, etctera. Cuando la variable que utilicemos en el ciclo for tome un valor superior al de nmero de posiciones del vector (0,1,2,3,4), saldremos del ciclo y el programa continuar. Por qu utilizar un vector para guardar el nmero? Muy sencillo: podremos acceder a cualquier componente del mismo indicando su posicin. Por ejemplo, para hacer referencia a la primera cifra del nmero secreto, basta con acceder al valor de la variable secreto[0]. La segunda cifra, secreto[1]. Y as hasta la quinta, secreto[4]. Funcin map para cambiar el rango de lectura del potencimetro Al utilizar analogRead(pin) recibiremos como resultado el valor de tensin que lee Arduino en el potencimetro (al tratarse de un valor analgico, tomar valores desde un mnimo de 0 hasta un mximo de 1023). En total, 1024 valores. La precisin del valor ledo es muy baja, sucede que sin ni siquiera mover la ruleta del potencimetro podemos ver cmo oscilan los valores de tensin ledos. Para solucionar este problema vamos a realizar un cambio de rango. Conseguiremos un cambio de rango de forma sencilla utilizando la funcin matemtica map. Esta funcin necesita como argumentos la variable a transformar, el mnimo anterior, el mximo anterior, el mnimo nuevo y el mximo nuevo. Los mnimos no los transformaremos, solo tocaremos el nuevo mximo. En vez de 1023, el mximo ahora ser 9. Cuando giremos la ruleta, obtendremos en un extremo el valor 0 y en el otro extremo el valor 9.