Paso 11: Electrónica-izquierda lado esquemático y código
Aquí es el esquema para el sistema de control del lado izquierdo.
Hay algunas notas en el diagrama pero es bastante sencillo. Cuando las piezas fueron compradas para el juego el lector ID12 sólo estaba disponible en una versión de 5V, que es alimentada por el Arduino. Puesto que los servos son accionados por una batería de 6V, era más fácil simplemente utilizar una batería de 9V para los paquetes de Arduinos y 6V para los servos porque necesita aislar la fuente de alimentación para el Arduino debido al ruido eléctrico generado por los servos.
Ahora que la ID12 está disponible en una versión de bajo voltaje que sería más simple de todo, desde una batería de 6V de alimentación y utilice un 3.3V Arduino Pro Mini y usar un 3.3V convertidor DC/DC fuente de alimentación aislada el Arduino. Sin embargo el protector de la onda sólo funciona a 5V.
En el código, verá que se muestran todas las etiquetas RFID cuatro dedos pero sólo dos identificadores de etiqueta son reconocidos en el código. Acabo de encontrarlo más fácil a la lista de todas las etiquetas que se utilizaba para el juego de construcción y entonces unívocamente la etiqueta individual IDs para funciones específicas. Tenga en cuenta que por supuesto tienes que ingresar tus propios códigos de ID de etiqueta. Para obtener más información sobre etiquetas RFID lectores y códigos de ID de etiqueta identificación echen un vistazo a este gran artículo de Bildr.
Tenga en cuenta que se necesita cambiar el nombre del archivo de audio de la llamarada de cadera pod a "Sonido1. WAV"para el protector de la onda jugarlo. También necesitará invertir el sentido de giro del servo para tres de los servos de pod de cadera ya que se agrupan en pares que reciben una señal idéntica.
Aquí está el código-
#include
#include "Servo.h" / / incluye la librería servo
Servo podServo; servo para mover cadera vainas
Servo leverServo; servo para mover las palancas de cadera pod
Servo rotateServo; servo para girar cadera vainas
Servo leftflapServo; servo para mover la aleta trasera izquierda
Servo rightflapServo; servo para mover hacia atrás la aleta
NewSoftSerial mySerial = NewSoftSerial (2, 3);
int RFIDResetPin = 13;
ledPin1 int = 6; pin de control de pod de cadera izquierda LED
int ledPin2 = 5; pin de control para LEDs de vaina derecha cadera
int servoPin1 = 10; pin de control de servo de la solapa izquierda
int servoPin2 = 11; pin de control de servo de aleta derecha
int servoPin3 = 9; pin de control de servo de pod
int servoPin4 = 8; pin de control de servo de palanca
int servoPin5 = 7; pin de control de servo gire
int soundPin = 12; pin de control de sonido de la llamarada
Registre aquí sus etiquetas RFID
char tag1 [13] = "440085E77452"; usted necesitará cambiar su propia etiqueta de
char la etiqueta2 [13] = "440085FC330E";
char tag3 [13] = "440085F97840";
char tag4 [13] = "4400863914EF";
void setup() {}
Serial.Begin(9600);
mySerial.begin(9600);
podServo.attach(servoPin3); se fija el servo en el pin 9 al objeto servo
leverServo.attach(servoPin4); se fija el servo en el pin 8 al objeto servo
rotateServo.attach(servoPin5); se fija el servo en el pin 7 al objeto servo
leftflapServo.attach(servoPin1); attches el servo en el pin 10 al objeto servo
rightflapServo.attach(servoPin2); se fija el servo en el pin 11 al objeto servo
podServo.write(155); girar el servo pod a 135 grados
leverServo.write(145); girar el servo palanca a 135 grados
rotateServo.write(165); girar el servo de rotación pod a 170 grados
leftflapServo.write(170); girar el servo de la solapa izquierda a 170 grados
rightflapServo.write(10); girar el servo derecho aleta a 10 grados
pinMode (ledPin1, salida); establece el pin LED como salida
pinMode (ledPin2, salida); establece el pin LED como salida
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
pinMode (soundPin, salida); establece el sonido pin como salida
digitalWrite (soundPin, bajo); Apague sonido pin
pinMode (RFIDResetPin, salida);
digitalWrite (RFIDResetPin, alto);
}
void loop() {}
char tagString [13];
Índice de int = 0;
lectura boolean = false;
{while(serial.Available())}
readByte int = Serial.read(); Lee el siguiente byte disponible
if(readByte == 2) de lectura = true; Inicio de etiqueta
if(readByte == 3) de lectura = false; final de la etiqueta
Si (lectura & & readByte! = 2 & & readByte! = 10 & & readByte! = 13) {}
Guarde la etiqueta
tagString [index] = readByte;
Índice ++;
}
}
checkTag(tagString); comprobar si es un partido
clearTag(tagString); claro al char de todo valor
resetReader(); reiniciar el lector de RFID
}
void checkTag (char tag[]) {}
///////////////////////////////////
Compruebe la etiqueta leída contra conocidas etiquetas
///////////////////////////////////
if(strlen(TAG) == 0) volver; vacío, no hay necesidad de seguir
Si (compareTag (etiqueta, tag1)) {/ / si tag1, ello
mySerial.print('A'); envía etiquetas leer sobre XBee
} else if (compareTag (etiqueta, etiqueta2)) {/ / si tag2, ello
podServo.write(90); girar el servo pod a 90 grados
Delay(500); esperar medio segundo
leverServo.write(95); girar el servo palanca a 90 grados
Delay(1000);
rotateServo.write(5); girar el servo de rotación pod a 10 grados
Delay(1500);
leverServo.write(145);
Delay(500);
digitalWrite (soundPin, HIGH); desactivar sonido en
Delay(10); Espere diez milisegundos
digitalWrite (soundPin, bajo); Activar sonido
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50); esperar 50 milisegundos
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); Apagar LED
digitalWrite (ledPin2, HIGH); Apagar LED
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, HIGH); Apagar LED
digitalWrite (ledPin2, HIGH); Apagar LED
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, HIGH); Apagar LED
digitalWrite (ledPin2, HIGH); Apagar LED
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, HIGH); Apagar LED
digitalWrite (ledPin2, HIGH); Apagar LED
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
Delay(50);
digitalWrite (ledPin1, HIGH); encender LEDs
digitalWrite (ledPin2, HIGH); encender LEDs
Delay(50);
digitalWrite (ledPin1, LOW); Apagar LED
digitalWrite (ledPin2, LOW); Apagar LED
leverServo.write(95); girar el servo palanca a 90 grados
Delay(1500);
rotateServo.write(165); girar el servo pod a 135 grados
Delay(1000);
leverServo.write(145);
Delay(500);
podServo.write(155); girar el servo pod a 135 grados
Delay(2000);
leftflapServo.write(125); girar el servo de la solapa izquierda a 125 grados máximo
rightflapServo.write(55); girar el servo derecho aleta a 55 grados máximo
Delay(500);
leftflapServo.write(170); girar el servo de la solapa izquierda a 170 grados - completo abajo
rightflapServo.write(10); girar el servo derecho aleta a 10 grados - completo abajo
Delay(500);
leftflapServo.write(125); solapa izquierda completa hasta
Delay(500);
leftflapServo.write(170); solapa a la izquierda completo abajo
Delay(500);
rightflapServo.write(55); aleta derecha completa hasta
Delay(500);
rightflapServo.write(10); a la derecha aleta completo abajo
} else {}
Serial.println(TAG); leer cualquier etiqueta desconocido
}
}
void lightLED (int pin) {}
///////////////////////////////////
Enciende LED en pin "pin" de 250ms
///////////////////////////////////
Serial.println(PIN);
digitalWrite (pin, HIGH);
Delay(250);
digitalWrite (pin, LOW);
}
void resetReader() {}
///////////////////////////////////
Reiniciar el lector de RFID para leer otra vez.
///////////////////////////////////
digitalWrite (RFIDResetPin, bajo);
digitalWrite (RFIDResetPin, alto);
Delay(150);
}
void clearTag (char one[]) {}
///////////////////////////////////
claro el array de char por relleno de null - ASCII 0
Pensará la misma etiqueta ha sido leer de otra manera
///////////////////////////////////
para (int i = 0; i < strlen(one); i ++) {}
uno [i] = 0;
}
}
Boolean compareTag (char uno [], char two[]) {}
///////////////////////////////////
comparar dos valor a si mismo,
strcmp no funcionando al 100% por lo que lo hacemos
///////////////////////////////////
if(strlen(One) == 0) devuelven el valor false; vacío
para (int i = 0; i < 12; i ++) {}
Si (una [i]! = false return two[i]);
}
verdaderas; no hay desajustes
}
Aquí está el código para el WaveShield, cortesía de Adafruit-
#include
#include
#include
#include "WaveUtil.h"
#include "WaveHC.h"
Tarjeta SdReader; Este objeto contiene la información de la tarjeta
FatVolume vol; Contiene la información de la partición en la tarjeta
FatReader raíz; Esto contiene la información para el sistema de archivos en la tarjeta
FatReader f; Esto contiene la información del archivo estamos jugamos
Ola WaveHC; Este es el único objeto (audio) de la onda, puesto que sólo jugaremos uno a la vez
#define DEBOUNCE 100 / botón debouncer
Esta práctica función devolverá el número de bytes actualmente libres en RAM, ideal para depuración!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
Si ((int) __brkval == 0) {}
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
Else {}
free_memory = ((int) & free_memory)-((int) __brkval);
}
volver free_memory;
}
void sdErrorCheck(void)
{
Si (! card.errorCode()) retorno;
putstring ("\n\rSD I/O error:");
Serial.Print(Card.ErrorCode(), hexagonal);
putstring (",");
Serial.println(Card.errorData(), hexagonal);
while(1);
}
void setup() {}
Configurar puerto serie
Serial.Begin(9600);
putstring_nl ("WaveHC con 6 botones");
putstring ("memoria RAM libre:"); Esto puede ayudar con la depuración, es malo quedarse sin RAM
Serial.println(freeRam()); Si es menor de 150 bytes escribe con problemas!
Configurar los pines de salida para el control de la DAC. Este los pernos se definen en la biblioteca
pinMode (2, salida);
pinMode (3, salida);
pinMode (4, salida);
pinMode (5, salida);
pin13 LED
pinMode (13, salida);
habilitar las resistencias pull-up en las patillas del interruptor (entradas analógicas)
digitalWrite (14, alto);
digitalWrite (15, alto);
digitalWrite (16, alto);
digitalWrite (17, HIGH);
digitalWrite (18, alta);
digitalWrite (19, alto);
Si (! card.init(true)) {//play con spi de 4 MHz si 8MHz no funciona para usted
Si (! card.init()) {//play con spi de 8 MHz (por defecto más rápido!)
putstring_nl ("tarjeta init. no se pudo!"); Algo salió mal, permite imprimir por qué
sdErrorCheck();
while(1); entonces 'detener': ¡ no!
}
permiten optimizar la lectura - algunas tarjetas pueden tiempo de espera. Desactivar si tienes problemas
card.partialBlockRead(true);
Ahora buscaremos una partición FAT!
parte de uint8_t;
para (parte = 0; parte < 5; parte ++) {/ / tenemos hasta 5 ranuras en
Si (vol.init (tarjeta, parte))
rotura; encontró uno, permite la libertad bajo fianza
}
Si (parte == 5) {/ / si terminamos por no encontrar uno :(
putstring_nl ("No válida partición FAT!");
sdErrorCheck(); Algo salió mal, permite imprimir por qué
while(1); entonces 'detener': ¡ no!
}
Permite decir que el usuario lo que encontramos
putstring ("partición de uso");
Serial.Print (parte, DEC);
putstring (", el tipo es grasa");
Serial.println(Vol.fatType(),DEC); ¿FAT16 o FAT32?
Intente abrir el directorio raíz
Si (! {root.openRoot(vol))}
putstring_nl ("no se puede abrir raíz dir!"); Algo salió mal,
while(1); entonces 'detener': ¡ no!
}
¡ UF! Llegamos pasado las partes difíciles.
putstring_nl("Ready!");
}
void loop() {}
putstring("."); Sin comentarios para ver si no está ejecutando el bucle
interruptor (check_switches()) {}
caso 1:
playcomplete ("Sonido1. WAV");
rotura;
caso 2:
playcomplete ("Sonido2. WAV");
rotura;
caso 3:
playcomplete "(SOUND3. WAV");
rotura;
caso 4:
playcomplete ("SOUND4. WAV");
rotura;
caso 5:
playcomplete ("SOUND5. WAV");
rotura;
caso 6:
playcomplete "(SOUND6. WAV");
}
}
check_switches() bytes
{
Static byte anterior [6];
estática mucho tiempo [6];
byte de lectura;
byte que presiona;
Índice de bytes;
presiona = 0;
para (índice byte = 0; índice < 6; ++ índice) {}
lectura = digitalRead (14 + índice);
Si (leer == baja & & anterior [índice] == alto & & millis() - tiempo [índice] > DEBOUNCE)
{
interruptor presionado
tiempo [índice] = millis();
presiona = index + 1;
rotura;
}
anterior [índice] = lectura;
}
devolver el número de conmutador (1-6)
retorno (presionado);
}
Reproduce un archivo completo de principio a fin sin pausa.
void playcomplete(char *name) {}
llamar a nuestro ayudante para buscar y reproducir este nombre
playfile(Name);
mientras (wave.isplaying) {}
no hacer nada durante la reproducción de su
}
su hecho reproduciendo
}
void playfile(char *name) {}
ver si el objeto ola está haciendo algo
Si (wave.isplaying) {/ / así que ya está reproduciendo algo, stop!
Wave.STOP(); Basta
}
Buscar en el directorio raíz y abre el archivo
Si (! f.open (raíz, nombre)) {}
putstring ("no puede abrir archivo"); Serial.Print(Name); retorno;
}
Leer bien el archivo y convertirlo en un objeto de onda
Si (! {wave.create(f))}
putstring_nl ("no un válido WAV"); retorno;
}
OK el tiempo para jugar! iniciar la reproducción
Wave.Play();
}