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 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();
}
#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