Tiro al Blanco (T1:E6)

     Este proyecto consiste en que al apuntar a Darth Vader con un láser, este se detiene y aparece rugiendo Chewbacca. Este juego realmente no es entretenido, solo es una humorada para mostrar de que manera podemos agregar sonido, amplificarlo, mover servos y detectar un rayo láser con una LDR (resistencia sensible a la luz), o sea poder mezclar varios elementos en Arduino y hacerlo en forma coordinada.
(al final de la página programa con el capítulo #6)
     El Arduino Nano lo montamos en un soporte (NANO TERMINAL ADAPTER V1.0) que permite conectar cables a sus pines mediante tornillos, el resto de los componentes electrónicos están en placa impresa. Además los servos soportan a los dos personajes moviéndolos constantemente. En la frente Vader lleva el LDR y 2 leds rojos.

El soporte de Arduino va atornillado a la placa MDF

A la izquierda vemos el Amplificador Pam 8403  y un reproductor Catalex MP3.

La lista de componentes es la siguiente:

1.- Arduino (NANO o UNO)
2.- Servos
3.- Parlantes
4.- Amplificador Pam 8403, similar o cualquier otro que sirva
5.- Reproductor Catalex MP3
6.- Potenciómetros 20 k
7.- Leds
8.- Resistencia de 220 ohms
9.- Resistencia de 1,5 k




A continuación el Software Arduino

//--------------------------------------- LIBRERÍAS DE TARJETA MP3 SERIAL Y SERVOS
#include <SoftwareSerial.h>
#include <Servo.h>
//--------------------------------------- PONEMOS NOMBRES A LOS SERVOS
Servo Motor1;
Servo Motor2;
//--------------------------------------- VARIABLES ENTERAS DONDE PONDREMOS INFORMACIÓN
int i;
int atari;
int angulo_1;
int angulo_2;
int favor = 0;
int contra = 0;
//---------------------- PONEMOS NOMBRES A LOS PINES DE ARDUINO PARA IDENTIFICARLOS FÁCILMENTE
int pin_led1 = 7;
int pin_led2 = 8;
//------------------------------------- RUTINAS MP3 SERIAL
#define ARDUINO_RX 4//should connect to TX of the Serial MP3 Player module
#define ARDUINO_TX 5//connect to RX of the module
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);//init the serial protocol, tell to myserial wich                                                                                                                            //pins are TX and RX

#define CMD_PLAY_WITHVOLUME 0X22 //data is needed  0x7E 06 22 00 xx yy EF;(xx volume)(yy                                                                                                       //number of song)
#define CMD_SEL_DEV 0X09 //SELECT STORAGE DEVICE, DATA IS REQUIRED
#define DEV_TF 0X02 //HELLO, IM THE DATA REQUIRED

static int8_t Send_buf[8] = {0} ;//The MP3 player undestands orders in a 8 int string
                                                               //0X7E FF 06 command 00 00 00 EF;(if command =01 next song order)

//------------------------------------------------------------- REALIZAMOS LOS AJUSTES DEL PROGRAMA
void setup()
{
  mySerial.begin(9600);//-------------------------------------- Inicio serial para MP3
  sendCommand(CMD_SEL_DEV, DEV_TF);//-------------------------- select the TF card
  delay(200);
  sendCommand(CMD_PLAY_WITHVOLUME, 0X1E01);//-------------- sonido 1 (DISQUETERA ATARI)
  Serial.begin(9600);//---------------------------------------- Inicio serial para pantalla PC
            //----------------------------------------------------------- Inicio LÍNEAS EN PANTALLA
  while (i < 9) {
    Serial.println ("");
    for (int atari = 0; atari <= 50; atari++) {
      Serial.print ("-");
      delay(10);
    }
    i++;
    Serial.print(i);
  }
  //--------------------------------------------------------- TÍTULOS BIENVENIDA
  sendCommand(CMD_PLAY_WITHVOLUME, 0X1E0A);//---------------------sonido 5 Juego de fondo
  Serial.println ("");
  Serial.println ("     Estamos listos...");
  Serial.println(" ");
  Serial.println ("           Apunte al blanco ");
  Serial.println("     ______________________________________________________");
  Motor1.attach(2);//---------------------------------- INDICAMOS POR DONDE ENVIAREMOS INFO A SERVOS
  Motor2.attach(3);
  Motor1.write(0); delay (20);//----------------------- AMBOS SERVOS A 0°
  Motor2.write(0); delay (20);
                                               //--------------------------------------------------- pines COMO SALIDA (7 y 8)
  pinMode(pin_led1, OUTPUT);
  pinMode(pin_led2, OUTPUT);
  digitalWrite(pin_led1, LOW);//----------------------- APAGAMOS AMBOS LED
  digitalWrite(pin_led2, LOW);
}

void loop()
{
  for (angulo_1 = 0; angulo_1 < 179; angulo_1++) {//----------------- LOOP DE 0 A 179 (GRADOS)
   Serial.println(analogRead(A1));//-------------------------------- PONEMOS EN PANTALLA VALOR GRADOS
    if ( analogRead(A1) < 300) {} else if ( analogRead(A1) > 500) {//-----------SI A1 <500 SIGA EL                                                                                                                                                //LOOP,  SI NO "blanco()"
      blanco();//-------------------------------- va a subrutina de felicitaciones
    } Motor1.write(angulo_1);//------------- SERVO SE POSICIONA EN VALOR ALMACENADO EN (angulo_1)
    digitalWrite(pin_led1, HIGH);//-------------- enciende leds
    digitalWrite(pin_led2, HIGH);
    delay (20);
    digitalWrite(pin_led1, LOW);//--------------- apaga leds
    digitalWrite(pin_led2, LOW);
    delay(20);
    {
    }
  }
  for (angulo_1 = 179; angulo_1 > 0; angulo_1--) {//----------------LOOP DE 179 A 0 (GRADOS)
    Serial.println(analogRead(A1));
    if ( analogRead(A1) < 300) {} else if ( analogRead(A1) > 500) { blanco();
    } Motor1.write(angulo_1);
    digitalWrite(pin_led1, HIGH);
    digitalWrite(pin_led2, HIGH);
    delay (20);
    digitalWrite(pin_led1, LOW);
    digitalWrite(pin_led2, LOW);
    delay(20);
    {
    }
  }
}

void blanco() {
  Serial.println("");
  Serial.println ("Excelente puntería ¡¡¡blanco perfecto!!!");
  Serial.println("");
  favor++;//-------------------------------------------------- PUNTOS A FAVOR
  Serial.print("Puntos a favor = ");
  Serial.print(favor);
  Serial.print(" / Puntos en contra = ");
  Serial.println(contra);

  for (i = 0; i < 15; i++) {//-------------------------------- ON - OFF RÁPIDAMENT LOS LEDS
    digitalWrite(pin_led1, HIGH);
    delay (20);
    digitalWrite(pin_led1, LOW);
    delay(20);
    digitalWrite(pin_led2, HIGH);
    delay (20);
    digitalWrite(pin_led2, LOW);
    delay(20);
  }
  felicitaciones();//---------------------------------------- SALTO A SUBRUTINA DE FELICITACIONES
}

void felicitaciones() {
  Serial.println("blanco");
  sendCommand(CMD_PLAY_WITHVOLUME, 0X1E03);//-------- sonido 3 (HOMENAJE Chewbacca)
  for (angulo_2 = 0; angulo_2 < 180; angulo_2++) {//----------- MUEVE SERVO 2 DE 0 A 180 GRADOS
    Motor2.write(angulo_2);
    delay (10);
  } for (angulo_2 = 180; angulo_2 > 0; angulo_2--) {//--------- MUEVE SERVO 2 DE 180 A 0 GRADOS
    Motor2.write(angulo_2);
    delay (10);
  }
  sendCommand(CMD_PLAY_WITHVOLUME, 0X1E0A);//------------------ juego de fondo
}



//---------------------------------------------- Comando iniciar MP3
void sendCommand(int8_t command, int16_t dat)
{
  delay(2000);
  Send_buf[0] = 0x7e; //starting byte
  Send_buf[1] = 0xff; //version
  Send_buf[2] = 0x06; //the number of bytes of the command without starting byte and ending byte
  Send_buf[3] = command; //
  Send_buf[4] = 0x00;//0x00 = no feedback, 0x01 = feedback
  Send_buf[5] = (int8_t)(dat >> 8);//datah
  Send_buf[6] = (int8_t)(dat); //datal
  Send_buf[7] = 0xef; //ending byte
  for (uint8_t i = 0; i < 8; i++) //
  {
    mySerial.write(Send_buf[i]) ;//send bit to serial mp3
    Serial.println(Send_buf[i],HEX);//send bit to serial monitor in pc
  }
  Serial.println();
}

A continuación el video con el capítulo #6 de la temporada #1