¡Haga un vehículo controlado por voz !: 3 pasos

¡Haga un vehículo controlado por voz !: 3 pasos

Tabla de contenido:

Anonim

Para hacer este vehículo controlado por voz, necesita una plataforma robótica, una placa Arduino y algunos módulos de mp3.

Suministros:

Paso 1: Hacer una plataforma

La plataforma que utilicé para construir este robot fue la plataforma Cherokey 4WD. El primer paso fue hacer que el robot se moviera, esta era la parte fácil.

Lo mejor de este kit es que incluye todo lo que necesita para ponerlo en movimiento: tiene su propio conjunto de motores y controladores de motor y un microcontrolador Romeo V2, por lo que todo lo que necesita hacer es agregar módulos adicionales para que haga lo que usted necesita. quiero que lo haga. Para unir la plataforma, deberá soldar algunos cables a cada motor y luego conectarlos a los terminales de tornillo de la placa de control del motor (M1, M2, M3 y M4). Para conectar el microcontrolador al kit, debe conectar los pines D4, D5, D6, D7 de la plataforma Cherokey a los pines 4, 5, 6, 7 del microcontrolador con cables de puente (o puede soldarlos si lo prefiere) para una solución permanente). ¡Ya está listo para programar el microcontrolador para que se mueva! Hay un código de muestra incluido en la página de DFRobot Wiki, que se puede encontrar aquí.

En el código de muestra hay cuatro funciones básicas controladas por entradas clave en el monitor en serie. Presione “w” para avanzar, presione “a” para girar a la izquierda, presione “d” para girar a la derecha, presione “x” para detener y presione “z” para imprimir “hola” en el monitor en serie. Esta es una buena prueba para ver si la plataforma funciona como lo necesita, y todas las direcciones del motor son correctas. Si tiene problemas con la dirección de un motor, puede intentar cambiar los pines de dirección a ALTO o BAJO en el código, o para una solución de baja tecnología, simplemente puede invertir la polaridad del cableado en los postes de enlace del motor en la plataforma Cherokey.

El código que utilicé es el siguiente:

int E1 = 5; // Control de velocidad M1

int E2 = 6; // M2 Speed ​​Control int M1 = 4; // M1 Direction Control int M2 = 7; // Control de dirección M1 void stop (void) // Stop {digitalWrite (E1,0); escritura digital (M1, BAJA); escritura digital (E2,0); escritura digital (M2, BAJA); } void advance (char a, char b) // Mover hacia adelante {analogWrite (E1, a); // Control de velocidad PWM digitalWrite (M1, ALTO); escritura analógica (E2, b); escritura digital (M2, ALTA); } void back_off (char a, char b) // Retroceder {analogWrite (E1, a); escritura digital (M1, BAJA); escritura analógica (E2, b); escritura digital (M2, BAJA); } void turn_L (char a, char b) // Gire a la izquierda {analogWrite (E1, a); escritura digital (M1, BAJA); escritura analógica (E2, b); escritura digital (M2, ALTA); } void turn_R (char a, char b) // Gire a la derecha {analogWrite (E1, a); escritura digital (M1, ALTA); escritura analógica (E2, b); escritura digital (M2, BAJA); } void setup (void) {int i; para (i = 4; i <= 7; i ++) pinMode (i, SALIDA); Serial.begin (19200); // Set Baud Rate Serial.println ("Ejecutar control del teclado"); escritura digital (E1, BAJA); escritura digital (E2, BAJA); } void loop (void) {if (Serial.available ()) {char val = Serial.read (); if (val! = -1) {switch (val) {case 'w': // Move Forward advance (255,255); // avanzar en la velocidad máxima de corte; case 's': // Move Backward back_off (255,255); // retroceder en la velocidad máxima de corte; caso 'a': // Girar a la izquierda turno_L (100,100); descanso; caso 'd': // Girar a la derecha turn_R (100,100); descanso; caso 'z': Serial.println ("Hola"); descanso; caso 'x': detener (); descanso; }} else else (); }}

Paso 2: Agregar control de voz

Usé una placa de reconocimiento de voz DFRobot para esto. El SKU es DFR0177, ¡pero solo está disponible en China en este momento!

Desafortunadamente al intentar agregar la funcionalidad de control de voz, experimenté problemas. Después de ponerse en contacto con uno de los ingenieros de DFRobot, me dijeron que la placa Romeo V2 se basaba en un chip ATmega32u4, que no era compatible con mi módulo de reconocimiento de voz. Esto fue irritante, pero no dejé que eso me detuviera. Cambié mi tarjeta Romeo V2 por una DFRduino UNO R3 y luego lo intenté de nuevo.

Aquí hay un código que utilicé:

#incluir

#define SUM 2 // variable no mayor que 50 uint8 nAsrStatus = 0; char sRecog SUM 80 = {"encender luces", "apagar luces"}; // variable no mayor que 79, el usuario puede modificar el estado int = 7; // indicador de estado int led = 8; // controlar el puerto digital, anular finalmente (sin signo) {switch (n) // el número de serie de la palabra clave del arreglo, como los arrays reconocen que la primera palabra clave es "encender las luces" y el número de secuencia correspondiente es 0; {caso 0: Serial.println ("encender luces"); Serial.println (""); escritura digital (led, LOW); descanso; caso 1: Serial.println ("apagar luces"); escritura digital (led, ALTO); descanso; por defecto: Serial.println ("error"); Serial.println (""); descanso; }} void ExtInt0Handler () {Voice.ProcessInt0 (); // enviar una señal de interrupción} void setup () {Serial.begin (9600); Voice.Initialise (MIC, VoiceRecognitionV1); // Inicializar el modo MIC o MONO, el valor predeterminado es MIC // VoiceRecognitionV1 es VoiceRecognitionV1.0 shield // VoiceRecognitionV2 es VoiceRecognitionV2.1 module attachInterrupt (0, ExtInt0Handler, LOW); pinMode (led, SALIDA); pinMode (estado, SALIDA); escritura digital (estado, ALTO); escritura digital (led, ALTO); } void loop () {uint8 nAsrRes; nAsrStatus = LD_ASR_NONE; while (1) {switch (nAsrStatus) {case LD_ASR_RUNING: case LD_ASR_ERROR: break; caso LD_ASR_NONE: {nAsrStatus = LD_ASR_RUNING; if (Voice.RunASR (SUM, 80, sRecog) == 0) // identificación incorrecta {nAsrStatus = LD_ASR_ERROR; Serial.println ("ASR_ERROR"); } digitalWrite (estado, LOW); Serial.println ("ASR_RUNING ….."); descanso; } caso LD_ASR_FOUNDOK: {digitalWrite (estado, ALTO); nAsrRes = Voz.LD_GetResult (); // una vez que finaliza el proceso de reconocimiento asr, recoja finalmente los resultados del reconocimiento asr (nAsrRes); nAsrStatus = LD_ASR_NONE; descanso; } caso LD_ASR_FOUNDZERO: predeterminado: {nAsrStatus = LD_ASR_NONE; descanso; }} // cambiar retardo (500); }// mientras }

char sRecog SUM 80 = {"encender las luces", "apagar las luces"} se puede usar para dar a las funciones de control de voz del vehículo. Podemos cambiar esta sección para agregar las funciones que deseamos, como "avanzar", "volver", "girar a la izquierda", "girar a la derecha", "detener", etc. También necesitaremos modificar el "vacío finalmente () Función. En el caso 0, el primer comando es avance, por lo que podemos mostrar "avanzar" desde "Serial.println ()" y llamar a la función "avanzar" al mismo tiempo. Cuando el módulo de reconocimiento de voz detecte la función de "avance", saldrá adelante y el vehículo avanzará. Lo mismo se aplica para las otras direcciones.

Una de las limitaciones de este proyecto es que el módulo de reconocimiento de voz no siempre es preciso, debido a las diferentes voces de los usuarios, el ruido ambiental y otros factores. Esto será mejorado en ejemplos futuros.

El código es el siguiente:

#incluir

// # include // ruan chuankou #define SUM 5 // SUM uint8 nAsrStatus = 0; // SoftwareSerial mySerial (10, 11); // RX, TX char sRecog SUM 80 = {"qian jin", "hou tui", "zuo zhuan", "you zhuan", "ting zhi"}; // int E1 = 5; // M1 Speed ​​Control int E2 = 6; // M2 Speed ​​Control int M1 = 4; // M1 Direction Control int M2 = 7; // Control de dirección M1 void stop (void) // Stop {digitalWrite (E1,0); escritura digital (E2,0); } void advance (char a, char b) // Mover hacia adelante {analogWrite (E1, a); // Control de velocidad PWM digitalWrite (M1, ALTO); escritura analógica (E2, b); escritura digital (M2, ALTA); } void back_off (char a, char b) // Retroceder {analogWrite (E1, a); escritura digital (M1, BAJA); escritura analógica (E2, b); escritura digital (M2, BAJA); } void turn_L (char a, char b) // Gire a la izquierda {analogWrite (E1, a); escritura digital (M1, BAJA); escritura analógica (E2, b); escritura digital (M2, ALTA); } void turn_R (char a, char b) // Gire a la derecha {analogWrite (E1, a); escritura digital (M1, ALTA); escritura analógica (E2, b); escritura digital (M2, BAJA); } void finally (unsigned char n) {switch (n) // {case 0: Serial.println ("qian jin"); Serial.println (""); avance (255,255); descanso; caso 1: Serial.println ("hou tui"); retroceso (255,255); descanso; caso 2: Serial.println ("zuo zhuan"); turn_L (100,100); descanso; caso 3: Serial.println ("you zhuan"); turn_R (100,100); descanso; caso 4: Serial.println ("ting zhi"); detener(); descanso; por defecto: Serial.println ("error"); Serial.println (""); descanso; }} void ExtInt0Handler () {Voice.ProcessInt0 (); //} configuración de vacío (void) {int i; para (i = 4; i <= 7; i ++) pinMode (i, SALIDA); Serial.begin (19200); // Configurar Baud Rate Voice.Initialise (MIC, VoiceRecognitionV1); // Inicializar el modo MIC o MONO, el valor predeterminado es MIC // VoiceRecognitionV1 es VoiceRecognitionV1.0 shield // VoiceRecognitionV2 es VoiceRecognitionV2.1 module attachInterrupt (0, ExtInt0Handler, LOW); } void loop () {uint8 nAsrRes; nAsrStatus = LD_ASR_NONE; while (1) {switch (nAsrStatus) {case LD_ASR_RUNING: case LD_ASR_ERROR: break; caso LD_ASR_NONE: {nAsrStatus = LD_ASR_RUNING; if (Voice.RunASR (SUM, 80, sRecog) == 0) // {nAsrStatus = LD_ASR_ERROR; Serial.println ("ASR_ERROR"); } Serial.println ("ASR_RUNING ….."); descanso; } caso LD_ASR_FOUNDOK: {nAsrRes = Voz. LD_GetResult (); // finally (nAsrRes); nAsrStatus = LD_ASR_NONE; descanso; } caso LD_ASR_FOUNDZERO: predeterminado: {nAsrStatus = LD_ASR_NONE; descanso; }} // cambiar retardo (500); }// mientras }

Realice la función. Descargue el programa en la tarjeta de la tarjeta para realizar la prueba. Cuando decimos "avanzar", el vehículo llamará a la función "avanzar" () y luego avanzará. Es lo mismo con otros movimientos. Cuando funciona satisfactoriamente, podemos desconectar el cable USB e instalar una batería de litio para que el vehículo sea más móvil.

Paso 3: Combina el reconocimiento de voz con el módulo MP3

Incluso con un control de voz exitoso, parece que falta algo. ¿Qué pasa si el vehículo nos puede responder? Al agregar un módulo de mp3 a la configuración, esto será posible. Usé un módulo de reproductor de mp3 - el módulo de reproductor DFRDuino.

Una cosa que vale la pena notar es que es mejor que coloque una cinta en la parte posterior del módulo para evitar un cortocircuito mientras lo usa. En cuanto al cableado, el módulo mp3 tiene un puerto pin serie, que proporciona cinco pines, incluidos 5V, GND, RX, TX, OUT.

Conecte los pines, excepto el de SALIDA, al puerto de cableado de mp3 del módulo de reconocimiento de voz como en la Imagen 2.

5V corresponde a 5V. GND corresponde a GND. RX debe estar conectado con TX y TX debe estar conectado con RX como se muestra en la Imagen 3.

Añadimos un pequeño altavoz aquí.

Paso 2: Programación

Necesitamos programarlo después de terminar el cableado. El código del reproductor de MP3 se agregará según el programa anterior. Los archivos de audio se almacenan en una tarjeta micro SD, puede usar cualquiera que desee que se corresponda con cada respuesta. Quizás puedas grabar tus propias respuestas para que parezca que puedes chatear con el robot). Tenga en cuenta que estamos utilizando la comunicación de puerto serie, por lo que el botón en el módulo de reconocimiento de voz debe apuntar a UART en lugar de a 12C.

El código que utilicé es el siguiente:

nulo finalmente (carácter sin firma n)

{switch (n) // {caso 0: Serial.println ("qian jin"); Serial.println (" qian"); avance (255,255); descanso; caso 1: Serial.println ("hou tui"); Serial.println (" hou"); retroceso (255,255); descanso; caso 2: Serial.println ("zuo zhuan"); Serial.println (" zuo"); turn_L (100,100); descanso; caso 3: Serial.println ("you zhuan"); Serial.println (" you"); turn_R (100,100); descanso; caso 4: Serial.println ("ting zhi"); Serial.println (" zhi"); detener(); descanso; caso 5: Serial.println ("chang ge"); Serial.println (" bo"); Serial.println (" 2"); descanso; caso 6: Serial.println ("zan ting bo"); Serial.println (": p"); descanso; caso 7: Serial.println ("ji xu bo"); Serial.println (": s"); descanso; caso 8: Serial.println ("xia yi shou"); Serial.println (": n"); descanso; caso 9: Serial.println ("shang yi shou"); Serial.println (": u"); descanso; por defecto: Serial.println ("error"); Serial.println (""); descanso; }}

Paso 3: Realiza la función

Me gustaría explicar los códigos clave listados arriba. Agregar Serial.println (" qian") al caso 0 es hacer que MP3 reproduzca un audio llamado 【qian】 en la tarjeta SD. De manera similar, agregar Serial.println (" hou") al caso 1 es hacer que MP3 reproduzca un audio llamado 【hou】. Serial.println (": p") significa "detener" y Serial.println (": s") significa "continuar". Serial.println (": n") significa reproducir el siguiente. La introducción detallada de estos pedidos está disponible en la tienda en línea.

Descargue el programa y luego podrá controlar este vehículo con voz de una manera integral. Cuando enviamos la orden de "avance", el mp3 reproducirá "ejecutar la orden de avance". Es lo mismo con otras órdenes. Una cosa que vale la pena notar es que agregamos la función de "reproducir música" para este vehículo y puede reconocer varias órdenes como "reproducir", "pausar", "continuar", la anterior "y" la siguiente ".