You are on page 1of 6

1) MATERIAL NECESARIO

Para llevar a cabo este tutorial, necesitars:


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.

for(int contador = 0 ; contador >= 0 ; contador=contador+1)
{
digitalWrite(led,HIGH);
delay(600);
digitalWrite(led,LOW);
delay(600);
}
}


5) NOTAS SOBRE EL PROGRAMA

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.

You might also like