1,2,3,...Pajarito Ingles-Proyecto Arduino
by DaniDi9 in Circuits > Arduino
3316 Views, 22 Favorites, 0 Comments
1,2,3,...Pajarito Ingles-Proyecto Arduino
Este instructable esta dedicado a todos aquellos que de pequeños nos pasábamos horas y horas jugando en la calle, inventándonos miles de diferentes juegos y miles de extrañas y controvertidas reglas.
En este post, vamos a jugar a uno de los mas famosos juegos de niños, que todo el mundo conoce y al que todos hemos jugado: 1,2,3...Pajarito Ingles!
El juego consistía en que una persona se ponía contra una pared y contaba " 1,2,3...Pajarito ingles". En ese momento se daba la vuelta. Los demás jugadores, debían llegar desde un punto unos metros detrás de el, hasta el, sin que el otro les viera moverse, por lo que cada vez que el que contaba se daba la vuelta, debían quedarse totalmente quietos hasta que volviera a contar de nuevo.
Lo difícil de este juego mas que llegar hasta el que contaba, era que hubiera un acuerdo entre el que contaba y un jugador al que este "había visto moverse", pues mientras uno decía que se había movido, el otro le respondía que no.
Pero a Arduino bien combinado con los sensores adecuados....no hay quien le engañe.
(Os dejo un vídeo demostración del programa.Al principio, hago un pequeñoi movimiento para mostrarlo entero: el ganar, y el perder.)
El Juego Y El Material
Explicacion del juego
Como ya he dicho, se trata de jugar a "1,2,3,...Pajarito Ingles" con arduino. Lo que nuestro controlador va ha hacer va a ser lo siguiente:
Primero, para poder empezar, tendremos que pulsar el boton, y en cuanto lo pulsemos, en la pantalla LCD, arduino nos indicara que el juego comienza, y que tendremos que posicionarnos a una distancia minima anteriormente fijada. La distancia a la que nos encontraremos sera dada por el sensor de ultrasonidos, y hasta que no nos pongamos a esa mínima distancia, el juego no comenzara.
En cuanto estemos a esa mínima distancia, veremos en la pantalla LCD como arduino empezara a contar el ya famoso "1,2,3,...Pajarito Ingles". Mientras este contando sera cuando podemos movernos, pues despues de esto un pequeño cronometro ( de 8 segundos ) en mi caso se activara, y arduino,mediante el sensor de movimiento PIR, estara continuamente leyendo si nos movemos o no.
Si resulta que nos movemos ( el sensor PIR es muy sensible al movimiento y hay que estar muy quieto jajaja), en la pantalla se podra leer que nos hemos movido y que volvamos al principio, mientras en un LED RGB se enciende una luz roja. Por lo que tendremos que pulsar el boton y volver a empezar.
Si en cambio no nos hemos movido en esos 8 segundos ( este tiempo se puede cambiar) , arduino volvera a contar "1,2,3...Pajarito Ingles" y podremos acercarnos un poco mas. Para ganar, tendremos que pulsar un boton y en la pantalla se leera que hemos ganado mientras una luz verde se enciende en nuestro LED RGB.
El material
Para poder llevar a cabo este proyecto, este es el material que vamos a utilizar:
-Arduino Uno ( o cualquier otro microcontrolador parecido, sea Arduino o clon)
-Protoboard y cables
-Pantalla LCD
-Sensor de ultrasonido HC-SR04
-Sensor de movimiento
-LED RGB
-Potenciometro
-1Resistencia (330 Ohm por ejemplo)
-Push-Button o pulsador
-Cable conexión hembra-hembra
Pantalla LCD
Que es?
Las pantallas LCD son un tipo de pantallas muy usadas en el mundo de la electrónica, que sirven para que podamos escribir lo que queramos en ellas. Ya las explique un poco mas a fondo en mi otro Instructable titulado " Alarma/Despertador con Arduino", así que en este instructable haré un pequeño resumen con lo mas importante antes de empezar las conexiones.
Como funciona?
Como he dicho, estas pantallas son muy usadas en el mundo de la electrónica. Son pantallas hechas con un material llamado cristal liquido, y sirven para poder escribir ( o leer en caso del usuario ) lo que queramos en ellas. Muy comunes, como en mi caso, son las de 16 pixeles y dos filas ( 16x2 ). Cada letra que queramos escribir, ocupara un pixel de estos, e incluso, cada uno de ellos esta dividido en 40 pixels mas pequeños que también podríamos editar.
Las pantallas LCD tienen una luz blanca de fondo, y cuando queremos escribir una letra en un pixel, se le va dando tensión a los necesarios de esos 40 "mini-pixels" que se vuelven opacos y dejan pasar la luz blanca, para formar esa letra elegida.
Conexiones
Para este proyecto, estas son las conexiones que he echo entre la pantalla LCD y Arduino:
Pantalla Arduino ///// Pantalla Arduino
Vss -----> GND ///// D4 ----> Pin 5
Vdd -----> +5V ///// D5 ----> Pin 4
Vo -----> Contraste (mas abajo explicado) ///// D6 -----> Pin 3
Rs -----> Pin 7 ///// D7 -----> Pin 2
Rw -----> GND ///// A ------> +5V
E -----> Pin 6 ///// K -----> GND
Importante.El pin Vo de la pantalla, sirve para fijar el contraste. A este pin se le aplica un voltaje entre 0 y 5V y según ese voltaje, el contraste sera mayor o menor. Esto se puede hacer conectándolo a un pin PWM de arduino y aplicándole el voltaje deseado mediante "analogWrite" durante todo el programa. Lo mas cómodo es hacerlo mediante un potenciometro. Solamente seria conectar un lado del potenciometro a +5V, el otro a GND y finalmente la pata del medio a Vo (pantalla). Así, moviendo el potenciometro cambiaríamos el contraste de la pantalla.
Sensor De Ultrasonidos HC-SR04
Que es?
El sensor de ultrasonidos, es otro de los elementos muy usados en electrónica. Es un sensor que se usa mucho en el ámbito de la robótica, en coches tele dirigidos y demás. Este sensor, nos dice que distancia hay entre el robot que lleva el sensor y el objeto mas cercano que esta enfrente. Por lo tanto, se usa para detectar objetos y poder,por ejemplo, esquivarlos.
Explicacion
Estos sensores, lo que hacen, es enviar un pulso de frecuencias muy altas, inaudibles para el ser humano. Este pulso, rebota en el objeto cercano y el sensor lo vuelve a interceptar con un micrófono apto para ello. Calculando el tiempo que ha pasado la onda en ir y volver, calculamos la distancia a la que se encuentra el objeto.
La velocidad del ultrsonido en el aire es de 340 m/s, o lo que es lo mismo 0.034 cm/ microseg. Sabiendo por la física que "distancia=velocidad/tiempo(microseg)", podemos saber la distancia a la que se encuentra el objeto. Tendremos que dividir ese resultado entre 2, pues ese seria el tiempo que tarda el ultrasonido en ir y en volver.
El sensor ultrasondos usado, HC-SR04, tiene un rango de entre 2 cm a 300 cm con una resolucion de 3 mm.
Conexiones
El sensor, tiene 4 patas, cada una con diferente nombre y diferente función. La pata Vcc y GND son para alimentación del sensor. La de "Trigger" es por donde se envía el pulso, también llamada "Disparo". La pata de "Echo" es por donde vamos a recibir el ultrasonido después de haber rebotado en el objeto.Las conexiones usadas son las siguientes:
Sensor Arduino
Vcc -----> +5V
GND ----> GND
Trig ----> Pin 8
Echo ----> Pin 9
Podemos probar el sensor antes de usarlo en el programa principal con el programa que os he dejado arriba y que se enseña en la imagen. En este programa, se presenta la funcion "medirDistancia" que despues he usado en el programa principal.
Esta función, lo primero que hace por cuestión de estabilizacion del sensor, es poner Trigger "LOW" durante 4 micro-segundos. Después generamos el pulso que tiene que ser mínimo de 10 micro-segundos. Con la función "PulseIn()" calculamos el tiempo del ultrasonido en ir y en volver. Para entender esta función, debemos saber que el sensor cuando empieza a recibir el ultrasonido de vuelta, pone el pin ECHO en modo HIGH, hasta que acaba el ultrasonido y lo vuelve a poner en modo LOW. Lo que hace la función "Pulseln()" es calcular el tiempo de el pulso HIGH (Aunque también se podría configurar para un pulso LOW), y devuelve ese tiempo en micro-segundos. Finalmente, solamente tenemos que aplicar la ecuación usada ( 10/292=0.034) y ya tendríamos la distancia.
Downloads
Sensor De Movimiento PIR
Que es?
El sensor PIR es un sensor de radiación infrarroja muy utilizado para captar la presencia de alguna persona o animal o para captar movimiento. Son muy comunes por ejemplo, y seguro que habréis visto, en baños públicos o portales, para que por ejemplo se encienda una luz cuando haya alguien. La forma de los sensores PIR, son como los de la imagen de arriba,con ese encapsulado blanco que los cubre.
Como Funciona?
Los sensores PIR, como he dicho, son sensores basados en radiación infrarroja. Se puede comprar el sensor solo ( como en una de las imagenes de arriba), o acompañado de un circuito que nos ayuda a controlarlo y nos facilita su uso ( como el encapsulado de arriba). Todos los cuerpos, vivos o no, emiten una cantidad de dicha radiación infrarroja, que es más grande cuanto más temperatura tenga el cuerpo. Los sensores PIR se dividen en dos partes, y cada una de ellas recibe una cantidad de radiación. Si esa cantidad es igual en los dos lados, la resultante es nula, pero por ejemplo cuando alguien pasa por delante, uno de los lados recibe mas radiación y el resultante ya no es nulo. En la imagen de arriba lo podeis ver bastante bien.
Podemos ver que en el sensor hay dos potenciometros (delay y sensibilidad en la imagen de arriba). Supongamos que uno de estos sensores percibe el movimiento de una persona y enciende un LED. Aunque la persona se pare al momento de percibirla, el LED seguirá encendido durante unos mínimos instantes, esto es, no se encenderá solamente cuando alguien se este moviendo, sino que cuando percibe alguien moviéndose, necesita un pequeño tiempo antes de volver a empezar de nuevo a percibir (leer) movimiento. Este tiempo, es ajustable mediante uno de los potenciometros que esta en el sensor. Si lo ponemos al mínimo (sentido contrario alas agujas del reloj), cuando detecte movimiento el LED se encenderá y estará un pequeño tiempo encendido y pronto volverá a leer. A este modo se le llama "No-Retriggering". Si lo ponemos al máximo, al detectar movimiento el LED se encenderá y estará mas tiempo encendido. Este modo sera "Retriggering", y suele ser mas utilizado.
El otro potenciometro, sirve para ajustar la sensibilidad del sensor a la hora de percibir movimiento.
Otra cosa interesante de este sensor, es que cuando detecta movimiento, los pulsos que da son suficientes para activar una alarma o un LED, sin tener que programar nada ni usar un micro-controlador. Podríamos usar una pequeña fuente de alimentación para alimentar el sensor y conectar el "Output" del sensor a un LED para que lo encendiera al detectar movimiento.
Conexiones
El sensor PIR tiene 3 patas de conexiones. Estas son:
Sensor PIR Arduino
Vcc -----> +5V
GND -----> GND
Output -----> Pin 13
Puede que para conectar el sensor PIR a la placa board, necesitéis usar el cable hembra-hembra, como se puede ver en la imagen entera de el proyecto.
Os dejo un pequeño programa por si queréis probar el sensor antes de utilizarlo en el programa principal. Las conexiones son iguales y no necesitamos ninguna librería. Lo que hace este programa basicamente, es encender el LED RGB que usamos en el programa principal cuando se detecte movimiento.
En el proyecto, estoy usando el potenciometro de la sensibilidad del sensor en la mitad, y el otro en modo "No-Retriggering", pero esto se puede cambiar al gusto de cada uno.
Downloads
LED RGB
Que es?
El LED RGB es un tipo de LED, formado por tres LEDs mas pequeños de tres diferentes colores, Rojo, Verde y Azul (Red, Green, Blue). Dependiendo de el voltaje que le demos a cada uno de estos tres LEDs, cada uno de ellos brillara con mas o menos fuerza, y dependiendo de ello, se creara un color u otro, pues se mezclaran los 3 colores con diferentes intensidades. Los colores de estos tres LEDs no son casualidad, son los tres colores primarios que combinándolos podremos crear todo tipo de colores.
Como Funciona?
Un LED RGB tiene normalmente 4 patas. Algunos de ellos vienen integrados en un pequeño circuito y solo tienen 3 patas, una correspondiente a cada color. Los de 4 patas, como en el de la imagen, tienen las tres correspondientes a los colores, y una que suele ser la pata común. Esta pata común, suele ser una pata común para los 3 LEDs de colores, o ánodo, o cátodo. Dependiendo de si es ánodo o cátodo, el LED RGB es de ánodo común o de cátodo común, y esta es una de las cosas mas importantes ( si no la mas ) que debemos saber sobre estos LEDs.
En la imagen de arriba, podemos ver la diferencia entre los RGB de ánodo y cátodo común. Aunque sean muy parecidos, y a la hora de programar la mecánica sea casi idéntica, es una diferencia notable y que hay que saber, pues si pensamos que es de ánodo común cuando es de cátodo común, no nos funcionara.
EL LED RGB, es idéntico de forma física tanto de ánodo como de cátodo común. Como se ve en una de las imágenes arriba, la pata mas larga es la común. A un lado de esta quedara una sola pata, que suele ser la Roja ( R ), y al otro lado quedaran dos, que serán el LED verde (G) y el azul (B) (R-G-B).
El LED RGB esta hecho basicamente para trabajar con diferentes voltajes, esto es, con las salidas PWM de arduino, para darle a cada pata, y por lo tanto a cada color, diferente brillo, y asi conseguir todo tipo de colores. Si es de ánodo común, los LEDs de colores tendrán el ánodo unido, por lo que tendremos que conectar el ánodo a +5V y los cátodos a diferentes pines PWM. Si a una pata le damos 5V ( analogWrite(ROJO, 255);) en este tipo de LED, la diferencia de voltaje entre ánodo y cátodo sera nula, por lo que el rojo ( por ejemplo) no emitirá ninguna luz. Si le damos en cambio 0 V ( analogWrite(ROJO,0);), la diferencia de voltaje sera máxima y el LED se encenderá con su brillo máximo. Si en cambio es de cátodo común, los cátodos de los LEDs serán los que estén conectados entre si. El común ira a GND y los demás a un pin PWM. Al contrario que en los de ánodo común, cuando le demos a una pata 5V ( analogWrite(ROJO, 255);), el LED brillara al máximo, y estará apagado si le damos 0V ( analogWrite(ROJO,0);).
Conexiones
Mi LED RGB es de ánodo común, por lo que las conexiones que he echo son debido a esta configuración. Repito que es muy importante que comprobéis si el LED RGB es de ánodo o cátodo común, para las conexiones y a la hora de programar. Para ello, basta con conectar el LED de la manera que se ve en la penúltima de las imágenes. Colocaríamos la pata común a GND y después cualquiera de las otras 3 al pin 13. Con el programa que se ve en la ultima imagen, probaríamos si hace luz o no. Si hace luz, seria de cátodo común, y si no, seria de ánodo común, que conectando el común al pin 13 y una pata a GND haría luz).
LED RGB Arduino
Rojo ----> Pin 11
Comun ----> +5V
Verde -----> Pin 10
El azul lo he dejado sin conectar pues no lonecesitaba, ya que para este proyecto solo necesitaba crear los colores rojo y verde. Sepodia perfectamente con dos LEDs diferentes, pero me aprecia interesante usar este tipo de LED
Ultimas Conexiones Y Programa
En las siguientes lineas, explicare un poco el funcionamiento del programa y de algunas instrucciones. Admito que es largo y puedo parecer un pesado, pero me parece super interesante saber y aprender estas pequeñas cosas, que pueden ser muy utiles. Si aun asi no quereis, podeis bajar a la parte de resumen y consejos y saltaros todo esto para saber las ultimas conexiones del proyecto y algun pequeño consejo. Aun asi repito que me parece algo muy interesante de saber, pero es vuestra eleccion jaja.
Explicacion del programa
Ya hemos conectado y sabemos como funcionan casi todos los elementos de nuestro proyecto. Solo nos falta ver el programa, entenderlo, y acabar de conectar unas pocas cosas mas para ejecutarlo.
El programa funciona de la siguiente manera:
Primero,como siempre, le decimos a arduino las librerias que vamos a necesitar, en este caso la de la pantalla LCD y la librería time.h, para controlar el tiempo (luego veréis por que). Wire.h es una pequeña librería dentro de la librería time.h, por lo que solamente descargaremos las de time.h ,pues la de la pantalla LCD viene ya con el IDE y la reconoce sin descargar nada, que os la dejo aquí arriba.
Después, al conectar arduino a la corriente, el programa entero se queda en espera hasta que pulsemos el botón que nos permitirá empezar. Esta espera se hace con la ya conocida instrucción de "While();". Pero si os fijáis bien, este "While()" tiene un pequeña diferencia, pues no tiene corchetes y tiene un "punto y coma". Si después de un "While" ponemos punto y coma sin corchetes,significa que el While no hará nada mientras la condición de dentro sea verdad, esta simplemente esperando. En este caso. a que se pulse el botón. Como haremos para que detecte el botón pulsado? Conectaremos el boton en modo "Pull-Down" que ya usamos en mi anterior proyecto de "alarma/despertador con arduino". Estaremos todo el rato leyendo el estado del pin 11 de arduino, hasta que sea HIGH, pues mientra sea LOW, estaremos dentro de el "while();" esperando.
Cuando pulsemos el botón, escribiremos en la pantalla LCD que comenzamos, y le pediremos al jugador que se coloque a una mínima distancia, ya elegida en la variable "mínimo", en mi caso 130 cm. En la pantalla nos aparecerá todo el rato la distancia mínima, y la distancia a la que nos encontramos, hasta que nos posicionemos suficientemente alejados. Esto se hará con la instrucción "Do{ordenes} While(condicion);". Un "Do-While" funciona igual que un While, pero la condición se evalúa al final, por lo que como mínimo las ordenes se ejecutan una vez. Es valido en este caso, así, mínimo una vez nos aparece en la pantalla la distancia a la que nos encontramos. Si nos encontramos a mas distancia de la mínima, lo escribirá una vez en la pantalla, y el programa seguirá. La distancia, sera medida con la función "medirDistancia", explicada anteriormente.
Al colocarnos a la distancia requerida en la pantalla veremos un aviso de que nos movamos, y la cuenta de "1,2,3.... Pajarito Ingles". En este tiempo sera cuando podamos movernos, porque al acabarse este tiempo, tendremos que quedarnos quietos. Después, viene la parte complicada del programa.
Ahora, mediante un "While()" leeremos el sensor para ver si hay movimiento. Si hay movimiento, el jugador perderá, y tendremos que salir del While. Pero no solo si hay movimiento, también podremos salir si el jugador ha pasado un tiempo mínimo quieto, y arduino deba empezar de nuevo a contar para que este se mueva de nuevo. Aparte, si se ha pulsado el botón, significara que el jugador ha llegado, y ha ganado. Como hacemos esto?
Bueno, mi idea ha sido, crear 2 variables booleanas , a y b, que sean las condiciones de el movimiento y de el botón. Si alguien se mueve mientras debe estar parado, 'a' se pondrá HIGH, y como podemos ver en la condicion del while(), saldremos, y el jugador habrá perdido. Si en cambio, el botón ha sido anteriormente pulsado ( mientras arduino contaba ), 'b' se pone HIGH y no entramos en el while(). Y la parte difícil ha sido esta: como creamos un cronometro en arduino para contar si el tiempo mínimo ya ha pasado a la vez que seguimos ejecutando el programa? Arduino tiene varias funciones para contar el tiempo, delay() y millis() por ejemplo. delay() para cualquier otra cosa que este haciendo el micro-controlador y no se ejecuta nada mas mientras este activo. millis() es un contador que empieza a contar desde que arduino ha sido conectado a la corriente. Esto no nos vale pues nosotros queremos que mientras contemos el tiempo leamos por el sensor si alguien se mueve. Para ello, se me ocurrió esta idea( que puede que haya mas soluciones,y mas fáciles, pero solo se me ocurrió esta,que me parece bastante buena, y me gustaría saber si alguien sabe de otra manera ). Con la librería time.h (acompañada de wire.h), podemos llevar la cuenta de la horay la fecha en nuestro arduino mientras este esté conectado a la corriente. Lo que he echo, ha sido fijarle una fecha cualquiera a arduino en la variable t con ( setTime(....)), pues la fecha y la hora nos dan igual, solo nos interesa que los segundos sean 00. Cada segundo leeremos con "segundos=second(t)" los segundos que han pasado desde que "seteamos" el tiempo (justo cuando el jugador debe empezar a estar quieto), así sabremos todo el rato cuanto tiempo ha pasado desde entonces, y podremos seguir ejecutando el programa de mientras. Cuando ese tiempo sea mas que el tiempo mínimo impuesto para estar parado (Variable "Parado", 8 seg en mi caso), saldremos de el while(); y el programa se seguirá ejecutando.
De aquí en adelante hay 3 opciones. Si el jugador se ha movido, mediante la función "teHasMovido();" le indicaremos que se ha movido y se encenderá la luz roja del RGB. Para empezar de nuevo habra que pulsar el botón. Si no se ha movido, arduino empezara de nuevo a contar"1,2,3...Pajarito Ingles". Y si por ultimo estaba pulsando el botón, se encenderá la luz verde del RGB y le indicaremos que ha ganado con la función "hasGanado();"
Resumen y consejos
Para acabar por tanto, nos falta conectar el botón en modo "Pull-Down" (o Pull-up, pero habría que cambiar el programa en la parte de lectura del botón) y conectar el pin 11 para leerlo.
El sensor PIR, esta leyendo si hay movimiento o no cuando arduino esta contando "1,2,3,...pajarito ingles". Esto es inevitable porque el sensor da pulsos y no hace falta que este conectado a arduino, como hemos dicho, por lo que si cuando esta contando 3, nos movemos, a la hora de que leamos con el pin 12 si alguien se ha movido, nos dara HIGH, debido al tiempo que el sensor esta en HIGH y puede empezar de nuevo a leer, y perderemos. Por lo tanto, recomiendo dejar de moverse ya en 2 o incluso en 1. Aun así, podemos arreglar esto poniendo un pequeño delay() despues de "1,2,3,..Pajarito Ingles", así mientras esta ese delay() (que no sera muy largo), el sensor podrá volver a leer de nuevo,aunque yo lo prefiero así.
Si llegamos sin que nos vea movernos hasta arduino mientras esta contando "1,2,3...,Pajarito Ingles", tenemos que pulsar el botón para ganar. Es recomendable dejarlo pulsado un rato para que lea bien que el botón ha sido pulsado.
Cuando estas cerca, el sensor PIR puede llegar a ser muy sensible, por lo que hay que estar muy quietos.
Finalmente espero que os haya gustado este proyecto, que aun siendo largo es muy muy interesante y la verdad que muy muy divertido. Gracias y Buena suerte contra Arduino, pues es un muy buen jugador de "1,2,3,...Pajarito Ingles".
Es difícil, pero no es invencible! ;)