Este juego consiste en acertar en una diana con un puntero láser sujeto a un brazo robótico.
El brazo, que consta de dos miniservos, se controla con el módulo joystick. Si el usuario acierta con el láser en el sensor de luz… ¡Diana! La pantalla LCD muestra el tiempo que ha tardado.
Montaje
Emisor
El montaje del juego es muy sencillo. Comenzamos por introducir uno de los servos en la base, pasando el cable por la ranura.
Se coloca el soporte del segundo servo en posición. Es importante destacar que la pieza está entre el servo y su cabezal, que atornillamos pasando el destornillador por el agujero superior.
Introducimos el segundo servo y le atornillamos el brazo portaláser.
Se le coloca la sujeción del láser, que tiene un agujero para fijar el puntero con un tornillo.
Colocamos la chapa y encima la bq ZUM, y atornillamos el conjunto.
Posicionamos el joystick en su tapa y lo fijamos con tornillos a la chapa anterior.
Finalmente cerramos la caja del joystick con la base del joystick.
¡Ya tenemos el emisor montado!
Receptor
El receptor es mucho más sencillo, solo hay que coger la base e introducir la pantalla en el hueco habilitado para ello, fijándola con tornillos.A continuación atornillamos la bq Zum a la base y hacemos lo mismo con la diana. Finalmente fijamos el sensor de luz al centro de esta.
¡Ya está! Ahora solo nos queda cablear los componentes.
Conexiones
El cableado del juego es muy sencillo:
- En el emisor:
- conectamos el servo de la base al pin 10 y el del brazo al pin 11 de la placa.
- conectamos el eje X del joystick al pin A1 y el eje Y al pin A0.
- En el receptor:
- conectamos el sensor de luz al pin A0.
- conectamos la pantalla uniendo los pines de la siguiente manera:
- SCL -> A5
- SDA -> A4
- VCC -> V
- GND -> G
Código
Para poner la pantalla en funcionamiento hay que descargar la librería SPI_IIC_LCD y descomprimirla en ~/sketchbook/libraries/
Código emisor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <Servo.h> int xJoy, yJoy, xservo, yservo; Servo servo_10; Servo servo_11; void setup(){ servo_10.attach(10); servo_11.attach(11); } void loop(){ xJoy=analogRead(0); yJoy=analogRead(1); xservo= map(xJoy, 1023, 0, 0, 180); yservo= map(yJoy, 1023, 0, 0, 150); servo_10.write(xservo); servo_11.write(yservo); } |
Código receptor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#include <Wire.h> #include <LiquidCrystal.h> LiquidCrystal lcd(0);// default address #0 int intensidadLuz=0, intensidadLuzMedia, intensidad; int intensidadLuz2=0, intensidadLuzMedia2, intensidad2; int botonPulsado=0, primeraLectura=0; unsigned long start, finished, elapsed, current; void setup() { lcd.begin(20, 4); armarSistema(); } void loop() { if (primeraLectura==0){ intensidadLuz=0; intensidadLuzMedia=0; for (int i = 1; i <= 100; i++) { //primera lectura luz ambiente intensidad=analogRead(0); intensidadLuz= intensidadLuz + intensidad; } intensidadLuzMedia = intensidadLuz / 100; primeraLectura=1; start=millis(); } else{ for (int i = 1; i <= 10; i++) { intensidad2=analogRead(0); intensidadLuz2= intensidadLuz2 + intensidad2; } intensidadLuzMedia2 = intensidadLuz2 / 10; if (intensidadLuzMedia2 - intensidadLuzMedia > 30){ finished=millis(); elapsed=(finished-start)/1000; escribirEnPantalla(); primeraLectura=0; } intensidadLuz2 =0; intensidadLuzMedia2=0; } } void escribirEnPantalla(){ lcd.clear(); for(int i=0; i<8; i++){ lcd.setBacklight(LOW); delay(100); lcd.setBacklight(HIGH); delay(100); } lcd.setCursor(0, 0);//col0 row0 lcd.print("Lo has conseguido :)"); lcd.setCursor(0, 1);//col0 row1 lcd.print("Has tardado "); lcd.print(elapsed); lcd.print(" s"); lcd.setCursor(0, 2); delay(1000); lcd.print("Reiniciando el"); lcd.setCursor(0, 3); lcd.print("sistema"); delay(1000); lcd.print("."); delay(1000); lcd.print("."); delay(1000); lcd.print("."); delay(1000); lcd.clear(); lcd.setBacklight(LOW); } void armarSistema(){ lcd.setCursor(0, 0);//col0 row0 lcd.print("Sistema preparado"); lcd.setCursor(0, 1); lcd.print("Apunten"); delay(500); lcd.print("."); delay(500); lcd.print("."); delay(500); lcd.print("."); delay(500); lcd.setCursor(0, 2); lcd.print("FUEGO"); delay(500); lcd.clear(); lcd.setBacklight(LOW); } |
A continuación vemos un vídeo del juego en funcionamiento: