Paso 5: codificación
Arduino:
Lanzamiento de Arduino y abrir un dibujo nuevo. Lamentablemente no tengo tiempo suficiente para enseñarle los conceptos básicos de Arduino. Usted puede ver algunos tutoriales si te apetece. Así que esto es lo que vamos a hacer, una vez que usted abre un bosquejo nuevo: archivo >> nuevo o Ctrl + N.
Copiar pegar el código siguiente (o descargar el archivo adjunto). Debo Oddbot otra vez por haberme ayudado con la parte de movimiento de la código muuucho muuuucho detrás.
El código:
/* Title: Speech Controlled Quadropod Author: Adith Jagadish Boloor Comments: This code is free for you to use, modify or simply stare at when you are really bored. */ #include <Servo.h> // Servo Library // Starting positions of the servos #define FLHcenter 1500 #define FRHcenter 1500 #define RLHcenter 1520 #define RRHcenter 1450 #define FLKcenter 1150 #define FRKcenter 1220 #define RLKcenter 1220 #define RRKcenter 1210 // Here you can change servo pin numbers corresponding // to your specific connections #define FLHpin 46 // Front Left Hip servo pin #define FRHpin 52 // Front Right Hip servo pin #define RLHpin 28 // Rear Left Hip servo pin #define RRHpin 13 // Rear Right Hip servo pin #define FLKpin 47 // Front Left Knee servo pin #define FRKpin 53 // Front Right Knee servo pin #define RLKpin 29 // Rear Left Knee servo pin #define RRKpin 12 // Rear Right Knee servo pin // Buffer for the speech message char INBYTE; // LEDs!!!!! If you choose to use 'em int led1 = 27; int led2 = 11; int led3 = 45; int led4 = 26; // Some constants for the bot's motions, yes you may // play with them to get the best performance int Time = 90; int LShift = 280; int RShift = 280; int Raise = 550; // Define servos Servo FLHservo; Servo FRHservo; Servo RLHservo; Servo RRHservo; Servo FLKservo; Servo FRKservo; Servo RLKservo; Servo RRKservo; void setup() { // Attach servos (digitally) FLHservo.attach(FLHpin); FRHservo.attach(FRHpin); RLHservo.attach(RLHpin); RRHservo.attach(RRHpin); FLKservo.attach(FLKpin); FRKservo.attach(FRKpin); RLKservo.attach(RLKpin); RRKservo.attach(RRKpin); // Attach LEDs (digitally) pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); Serial.begin(9600); // Center servos FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter); RRHservo.writeMicroseconds(RRHcenter); FLKservo.writeMicroseconds(FLKcenter+700); FRKservo.writeMicroseconds(FRKcenter+700); RLKservo.writeMicroseconds(RLKcenter+700); RRKservo.writeMicroseconds(RRKcenter+700); delay(500); // Prints out the controls mapped to different letters Serial.println("wasd - movement"); Serial.println("z - sleep"); Serial.println("x - play dead"); Serial.println("i - sit"); Serial.println("u - stand"); Serial.println("q - wake up"); } void loop() { Serial.println("Ready to accept command"); while (!Serial.available()); // stay here so long as COM port is empty INBYTE = Serial.read(); // read next available byte delay(50); if (INBYTE == 'q') // wake up - flashes LEDs if you used them { digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); } else if (INBYTE == 'z') //Sleeps { FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter); RRHservo.writeMicroseconds(RRHcenter); FLKservo.writeMicroseconds(FLKcenter+700); FRKservo.writeMicroseconds(FRKcenter+700); RLKservo.writeMicroseconds(RLKcenter+700); RRKservo.writeMicroseconds(RRKcenter+700); delay(1000); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); } else if (INBYTE == 'u') // stand Up { // Center servos FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter); RRHservo.writeMicroseconds(RRHcenter); FLKservo.writeMicroseconds(FLKcenter); FRKservo.writeMicroseconds(FRKcenter); RLKservo.writeMicroseconds(RLKcenter); RRKservo.writeMicroseconds(RRKcenter); delay(1000); } else if (INBYTE == 'x') // plays dead X { FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter); RRHservo.writeMicroseconds(RRHcenter); FLKservo.writeMicroseconds(FLKcenter+700); FRKservo.writeMicroseconds(FRKcenter+700); RLKservo.writeMicroseconds(RLKcenter+700); RRKservo.writeMicroseconds(RRKcenter+700); delay(1000); } else if (INBYTE == 'i') //sits { FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter-600); RRHservo.writeMicroseconds(RRHcenter+600); FLKservo.writeMicroseconds(FLKcenter); FRKservo.writeMicroseconds(FRKcenter); RLKservo.writeMicroseconds(RLKcenter+700); RRKservo.writeMicroseconds(RRKcenter+700); } else if (INBYTE == 'h') //shake Hands { FLHservo.writeMicroseconds(FLHcenter-600); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter-600); RRHservo.writeMicroseconds(RRHcenter+600); FLKservo.writeMicroseconds(FLKcenter+600); FRKservo.writeMicroseconds(FRKcenter); RLKservo.writeMicroseconds(RLKcenter-700); RRKservo.writeMicroseconds(RRKcenter+700); delay(1000); FLKservo.writeMicroseconds(FLKcenter+300); delay(200); FLKservo.writeMicroseconds(FLKcenter+600); delay(200); FLKservo.writeMicroseconds(FLKcenter+300); delay(200); FLKservo.writeMicroseconds(FLKcenter+600); delay(200); } else if(INBYTE == 'w') // run forward { LShift=300; RShift=300; for(int i=0;i<5;i++) { Run(); } } else if(INBYTE == 'a') // turn left { LShift=-300; RShift=300; for(int i=0;i<3;i++) { Run(); } } else if(INBYTE == 'd') // turn right { LShift=300; RShift=-300; for(int i=0;i<3;i++) { Run(); } } else if(INBYTE == 's') // run back { LShift=-300; RShift=-300; for(int i=0;i<5;i++) { Run(); } } } void Run() { FRKservo.writeMicroseconds(FRKcenter+Raise); // raise front right leg RLKservo.writeMicroseconds(RLKcenter+Raise-10); // raise rear left leg FLHservo.writeMicroseconds(FLHcenter+LShift); // move front left leg backward RRHservo.writeMicroseconds(RRHcenter-RShift); // move rear right leg backward delay(Time/2); FRHservo.writeMicroseconds(FRHcenter+RShift); // move front right leg forward RLHservo.writeMicroseconds(RLHcenter-LShift); // move rear left leg forward delay(Time); FRKservo.writeMicroseconds(FRKcenter); // lower front right leg RLKservo.writeMicroseconds(RLKcenter); // lower rear left leg delay(Time); FLKservo.writeMicroseconds(FLKcenter+Raise); // raise front left leg RRKservo.writeMicroseconds(RRKcenter+Raise); // raise rear right leg FRHservo.writeMicroseconds(FRHcenter-RShift); // move front right leg backward RLHservo.writeMicroseconds(RLHcenter+LShift); // move rear left leg backward delay(Time/2); FLHservo.writeMicroseconds(FLHcenter-LShift); // move front left leg forward RRHservo.writeMicroseconds(RRHcenter+RShift); // move rear right leg forward delay(Time); FLKservo.writeMicroseconds(FLKcenter); // lower front left leg RRKservo.writeMicroseconds(RRKcenter); // lower rear right leg delay(Time); }
Justo antes de que usted puede cargar el código, haga lo siguiente:
Abra el administrador de dispositivos y buscar puertos (COM & LPT).
Herramientas de >> Junta >> Arduino Mega o Mega 2560 (imagen 2)
Herramientas >> procesador >> ATMega 1280 (imagen 3)
Herramientas >> Puerto >> puerto COM3 (3 para mi caso sólo!!!!) (imagen 4)
Ahora puedes pulsar el botón de upload y si todo va suave, debe subir con éxito y el robot debe estar en su vientre con cuatro piernas estiradas hacia fuera simétricamente con un constante parpadeo de los LED de la HC 06.
Si recibe este error durante la carga:
AVRDUDE: stk500_getsync(): no sincronizado: resp = 0xe0
Sólo Desconecte el módulo HC06, cargar el código y gancho nuevo.
OK me di cuenta de algo mientras estaba de prueba y escribir este tutorial. No es necesario BitVoicer y Python, basta que cualquiera de ellos. BitVoicer lo hace todo por usted y su motor de reconocimiento de voz es muy potente pero que cuesta $5 mientras que el reconocimiento de voz de python utiliza la API de voz de Google por lo que a veces puede dar unos resultados realmente extraños y tiene algunas más código, por lo que la elección es suya.
Bluetooth
Muy bien justo antes de que nos movemos en el bit de reconocimiento de voz mediante BitVoicer o Python, permite enlazar el bluetooth de tu PC al 06 HC de tu bot. Asegúrese de que funciona el bluetooth en tu PC antes de proceder porque me tardé 5 horas para darse cuenta de que mi laptop no viene con un bluetooth incorporado y tuve que pedir un módulo.
Ahora enciende tu bot a través de USB o la batería. OMG cuando hace este tutorial final!!!!!! Paciencia! Estás casi allí.
- Click derecho en el icono dispositivos Bluetooth en la barra de la bandeja y haga clic en Agregar nuevo dispositivo.
- Que buscar y buscar y buscar hasta HC - 06 aparece
Si no demuestran para arriba después de probar en algún momento comprobar si usted puede encontrar el dispositivo usando su teléfono móvil (todos excepto los teléfonos de Apple deben ser capaces de detectarlo). Si no sabe que hay algo mal con su HC-06 y que necesita solucionarlo por comprobación de las conexiones. - Haga doble clic.
- En el siguiente diálogo cuadro Seleccione Enter el dispositivo sincronización código y tipo en 1234. Luego debe instalar el HC 06 al ordenador.
- Ahora esta parte es importante abrir el administrador de dispositivos (Inicio >> Administrador de dispositivos)
- Ir a puertos (COM & LPT) y anote los puertos COM utilizados por el Bluetooth.
COM10 y COM21 para mi caso.
BitVoicer (opción 1)
Puede descargar BitVoicer de aquí.
Lo primero es lo primero, si no eres un hablante de inglés americano puede cambiar el idioma/acento que BitVoicer intentará reconocer. Para hacer esto, vaya al archivo >> idiomas adicionales y van a instalan su idioma/acento preferido.
Ahora estamos listos para añadir algunos comandos. Para que vamos a agregar dos comandos a saber levantarse y sentarse. Puede editar o añadir más comandos más adelante. Los pasos son los siguientes:
- Ir a archivo para crear un nuevo esquema >> nueva.
- Cambiar el tipo de datos de comando predeterminado a char.
- Haga clic en Agregar nueva frase
- Escriba en "stand up" (sin comillas)
- Haga clic en Agregar nueva frase
- Escriba en "sentarse" (nuevamente sin comillas)
- Ahora abajo en oración anagramas, cambiar los tipos de datos de ambos comandos a char si no ya char.
- Stand tipo comando como usted y para sentarse tipo i.
- Su pantalla debe parecerse a imagen 5.
- Guardar el esquema en un directorio que es conveniente para usted.
- Ahora abrir preferencias de archivo >> Preferencias y relleno en el material.
Las tres cosas que serán diferentes para ti será la carpeta por defecto, idioma de reconocimiento de voz y el nombre del puerto. - Su nombre del puerto se corresponden a su puerto de COM que su Bluetooth utiliza que encontraste en el paso 6 en Bluetooth. Pruebe primero el número menor.
- Guardar de golpe.
- Ir al siguiente paso.
Python (opción 2)
Descargar Python (para este tutorial voy a usar la versión 3.4) que puede descargarse de https://www.python.org/download/releases/3.4.1/ 3.4 ¿por qué y no la versión 2.7? Así el reconocimiento de discurso que estamos utilizando sólo funciona en la versión 3.4 de python (ya sé que es una mierda pero bueno 3,4 > 2.7 derecho?)
Lo instala en C:\Python34 por conveniencia. Lo siguiente que tienes que hacer es descargar e instalar eclipse que es una interfaz para escribir su código a través de Python. Se puede descargar desde http://www.eclipse.org/downloads/ instale en C:\eclipse
Si recibe este error durante la ejecución de lo...
Un Java Runtime Environment (JRE) o Java Development Kit (JDK) deben estar disponibles para ejecutar Eclipse. Ninguna máquina virtual de Java fue encontrada después de buscar en las ubicaciones siguientes:
C:\eclipse\jre\bin\javaw.exe
javaw.exe en su ruta actual
Ir a la primera respuesta en http://stackoverflow.com/questions/2030434/eclipse-no-java-jre-jdk-no-virtual-machine
www.stackoverflow.com es el mejor lugar para encontrar ayuda para cualquier problema en python
Use este tutorial para instalar python en eclipse excepto en lugar de python 2.6 que debe elegir python 3.4. Como alternativa utilizar este tutorial para instalar python en Geany si usted decidió usar Geany que oigo es mucho mejor que eclipse pero no he tenido tiempo suficiente para migrar a él. Hay algo que llama 'bibliotecas' que usted necesita para acceder a la diferente funcionalidad de python. Ahora seguir adelante e instala algunas librerías que necesitamos para este proyecto. Para aquellos de ustedes que ya saben cómo instalar bibliotecas ir adelante instalar los mencionados y seguir el código.
Librerías:
- PyBluez 0.20 - Bluetooth (configuración)
- PyAudio 0.2.8 - proporciona enlaces para reconocimiento de voz (configuración)
- SpeechRecognition 1.1.0 - reconocimiento de voz (Descargar)
PyBluez y PyAudio pueden instalarse mediante la descarga de la "... win32 py3.4.exe" versiones del enlace y simplemente ejecutar el archivo ejecutable (setup).
SpeechRecognition biblioteca es un poco complicado si eres nuevo en python. Abrir el enlace de 'download' arriba y haga clic en descargas. Descargar "SpeechRecognition-1.1.0.tar.gz (md5)". Extraer el contenido (no la carpeta que dice SpeechRecognition 1.1.0 pero cuál es en él) de la carpeta descargada (vía winRAR o cualquier extractor te apetece usar) en el directorio de python 3.4 (C:\Python34). Si aparece un cuadro de diálogo preguntando si desea reemplazar los archivos existentes, haga clic en sí a todos. Ahora vaya a la unidad C: y manteniendo Shift, click derecho sobre la carpeta que dice Python34 y haga clic en "ventana de comandos abierta aquí". Escriba "python setup.py install" sin las comillas y pulse Enter. Ahora usted debe tener todas las bibliotecas necesarias instaladas. ¡ Yay!
Abierto eclipse.
En la carpeta PythonTest del tutorial de crear un nuevo archivo llamado Speech_Controlled_Quadrapod.py similar a cómo se crea el pytest.py archivo que creó en el tutorial. Ahora pegar o descargar...
El código:
# Title: Speech Controlled Quadrapod # Author: Adith Jagadish # Description: Uses Google's Speech Recognition API and python bluetooth library to control a quadrapod # How to: Say "stand up" to make bot stand up and say "sit down" to make it sit. # Say "stop listening to terminate the program" import bluetooth import speech_recognition as sr port = 1 bd_addr = "xx:xx:xx:xx:xx:xx" sock = bluetooth.BluetoothSocket( bluetooth.RFCOMM ) sock.connect((bd_addr, port)) r = sr.Recognizer() r.pause_threshold = 0.6 r.energy_threshold = 400 MESSAGE = "continue" print("Ready to accept command...\n") while (MESSAGE != "stop listening"): while (MESSAGE == "continue"): try: # use the default microphone as the audio source with sr.Microphone() as source: # listen for the first phrase and extract it into audio data audio = r.listen(source,timeout = None) # recognize speech using Google Speech Recognition print("Me: " + r.recognize(audio)) MESSAGE = str(r.recognize(audio)) except LookupError: # speech is unintelligible MESSAGE = "continue" print("Could not understand audio") if(MESSAGE == "sit down"): sock.send("i") elif(MESSAGE == "stand up"): sock.send("u") elif(MESSAGE == "stop listening"): break; MESSAGE = "continue" sock.close() print("\nProgram terminated.")
El único cambio que necesita hacer es en la línea:
bd_addr = "xx:xx:xx:xx:xx:xx"
Haga clic derecho sobre el icono de bluetooth en la bandeja y haga clic en "Mostrar dispositivos de Bluetooth". Haga clic derecho sobre HC-06 y haga clic en propiedades. Ir a la pestaña Bluetooth y copiar el número de identificador único y pegue en el lugar de XX.
Que son buenos ir a la prueba.