Control de Arduino por reconocimiento de voz

Allá, vamos, ¡HABLAREMOS Y LAS COSAS NOS OBEDECERÁN!

No se trata de dar palmadas y que se enciendan o apaguen luces, de reaccionar al volumen, sino de reconocer PALABRAS CONCRETAS y responder según cuáles sean.

EL DETECTOR

La madre del cordero es, claro, el cacharrito que te escucha y reconoce lo que dices. Podéis acceder a sus características aquí.

Y esto es lo primero que quería contaros, LA GENTE HACE COSAS, hacen cacharros que detectan, gases, presencia, distancia, luz… o que incluso me reconocen el habla. Y no hace falta que sepáis el detalle de la construcción del aparato para poder usarlo. Si no tienes tiempo/ganas/capacidad de adentrarte en el detalle, puedes tomarlo como una caja negra.

Si lo tratamos con una caja negra necesitamos saber dos cosas:

  1. ¿Cómo conectarlo?
  2. ¿Como hacer que funcione?

Para ambas cosas tenemos que consultar documentación o los mil tutoriales que hoy en día hay en Internet.

1. ¿Cómo conectarlo?

           a) Alimentación

Generalmente necesitará alimentación, así que habrá alguna manera de darle energía. Lo más habitual es que encuentres unos pines que pongan Vcc y GND, que corresponden al “polo positivo” y al “polo negativo” (ground = tierra).

Estos cacharrines normalmente trabajan a 5V o a 3,3V que pueden tomarse de una fuente exterior o de la propia placa controladora que usamos (Arduino).

La alimentación la tenemos a la izquierda, los pines de la derecha son para conectar un micrófono si no se quiere usar la típica conexión jack.

          b) Datos

Ya tiene “chicha” para funcionar, pero ¿cómo me va a llegar la información del sensor?

Es muy habitual que haya un pin y que por ahí llegue un valor binario (0,1), “analógico” (0-255, p.ej.), un carácter (una “letra”), etc.

En este caso hay dos pines y se puede establecer una comunicación BIDIRECCIONAL con el sensor. Podemos mandarle órdenes en TIEMPO DE EJECUCIÓN y variar su comportamiento. TX y RX representación transmisión y recepción.

Si te fijas, esta estructura de alimentación-datos es común a muchos aparatos, aunque en los últimos años nos estamos acostumbrando a usar un sólo cable porque el conector USB hace “trampa” y además de transmitir datos es capaz de alimentar pequeños dispositivos.

2. ¿Cómo hacer que funcione?

EL CONTROLADOR

Hace años cuando queríamos que un circuito hiciera una función, teníamos que diseñar el circuito específicamente para eso, y podía ser terriblemente difícil según lo complejo de la función. Hoy en día, tenemos un controlador programable, así que tenemos TODO EL PODER de programar las barbaridades más enrevesadas que queramos: Cuando la entrada1 sea menor que 200 pero mayor que 125 y siempre que sea jueves por la tarde y que en la entrada2 se detecte que hay una persona cerca queremos que… Este disparate es tan sencillo de implementar como escribir el programa.

En nuestro caso vamos a usar una variante de Arduino que compramos en Elecfreaks.

Como podéis ver es un Arduino con algún apañín majo, como tener tomas de Vcc y GND para cada puerto y posibilidad de conectar como macho o hembra, un botón de encendido y selección de voltaje y otras cosillas, pero para lo que vamos a usar valdría cualquier Arduino que tengáis.

Para programarlo usaremos el IDE, no me detendré en el detalle de la programación general de Arduino, pero tenéis los comentarios para vuestras dudas.

Puede que en este momento tengáis una sensación de horror: ¿Cómo lidiar con el sensor en concreto que estamos usando? NO IMPORTA (Demasiado…)

Quiero decir la dificultad se la ha zampado el fabricante y los programadores por ti, o bien, la circuitería interna del cacharro ya te da un valor manejable (binario, analógico, etc.), o bien tendrás LIBRERÍAS, conjunto de funciones que sólo tendrás que usar para tener tus resultados.

En nuestro caso en particular no necesitaremos una librería, pero recuerda, que en sensores complejos sí las tendrás. Búscalas, instálalas… y, normalmente, tendrás programas añadidos en la sección ejemplos del IDE para aprender cómo funcionan. FACILÍSIMO.

Aquí veis, por ejemplo, que para usar la pantalla de cristal líquido tengo ya unos ejemplos hechos para ver cómo se baja de manera automática, parpadea, etc.

Así que, el sensor (por complejo que sea) o bien me da un valor fácil de usar, o bien vendrá acompañado de librerías con funciones que podré usar de manera sencilla.

PROGRAMACIÓN DE LOS COMANDOS DE VOZ

Ya hemos dicho que nuestro cacharrillo quiere comunicarse de manera bidireccional con la tarjeta controladora, igual que ella también lo hace con el ordenador cuando la conectamos con el cable USB, Bluetooth o WIFI.

En Arduino hay dos pines con los que se puede uno comunicar con la tarjeta o acceder a la comunicación con el ordenador a través de ella. Están identificados con T y R.

Para poder acceder al sensor desde el ordenador, vía la placa controladora, pondremos el cable TX al T y el RX al R para que lo que “oiga” la placa, lo pueda “oír” el sensor. (Esto podría hacerse con otro dispositivo, pero ya que tenemos la tarjeta, podemos usarla).

En este modelo de tarjeta tenemos la facilidad de poder usar Vcc y GND en cualquiera de los pines rojos y negros, respectivamente. En un Arduino corriente, tendríamos que ir a los pines 5V y GND o conectarlos a una protoboard y cablear allí.

Bien, ahora conectamos con el cable USB de la placa al ordenador, y así podremos acceder a la configuración del sensor para los comandos que deseemos.

Mirando el manual podemos ver cuáles son. Aquí tenéis algunos.

La cuestión es que necesitamos un programa para poder enviar estos comandos. Yo he usado este que se recomendaba en algunos tutoriales http://www.sudt.com/en/ap/index.html

IMPORTANTE: En la controladora no puede estar cargado un programa que “estorbe” a las comunicaciones. Así que asegúrate cuando vas a programar los primeros comandos, como cuando luego vayas a programar más (que ahí va a ser cuando se te olvide) de que has subido un programa en blanco antes de conectarte con AccessPort.

Es importante la configuración adecuada. Resalto que pongáis el puerto en el que se haya configurado la tarjeta controladora al conectarla, la velocidad de conexión y que los comandos se enviarán en hexadecimal.

Los comandos se han elegido de una manera bastante amigable, en mi opinión.

Mirad, este aparato es capaz de almacenar tres grupos de cinco comandos, pudiendo tener activo sólo un grupo a la vez (cinco comandos), aunque el grupo activo puede cambiarse mediante comandos si lo programas adecuadamente.

Los comandos se escriben AA 0x..

Para borrar empiezan por 0, así que 01 borra el primer grupo, 02 el segundo, 03 el tercero y 04 todos.

Para escribir empiezan por 1, así que 11 graba el primer grupo, etc.

Para activar empiezan por 2, así que 21 activa el primer grupo, etc.


En los dos botones de arriba tenéis, la configuración y el botón para activar y desactivar la conexión.

Abajo deberéis escribir los códigos y a la derecha tenéis el botón de enviar (imagen penosa, I know).

Si queréis, por limpieza, podemos empezar por borrar todos los grupos, así que pondremos AA 04, damos a enviar y esperamos la confirmación en pantalla.

Ahora grabemos un grupo de cinco instrucciones. En el manual podéis leer que nos pedirá confirmación de cada comando de voz, que debemos esperar a que diga START para hablar y que hay que grabar el grupo seguido.

Me dice START para que diga el comando, AGAIN para prevenirme de que va a pedirme que lo repita y START para que lo repita. Si todo va bien, me dice Finish one, que quiere decir que ha grabado el comando con éxito. Si no hay sonido, es demasiado alto, la repetición no concuerda, etc. te da mensajes y te pide de nuevo que lo hagas. Cuando terminas de grabar el grupo, recibes el mensaje Group1 finishi!. Todas estas acciones y los diferentes estados del sensor se acompañan con señales luminosas que podéis leer descritas en el manual.

Ahora se trataría de probar que efectivamente reconoce los comandos si se los decimos, y eso se puede hacer desde aquí mismo, algo muy conveniente. Recordad que cuando probamos algo debemos acotar las fuentes de error y separarlas lo más posible para poder identificarlas. Si espero a que esté todo montado y no funciona, ¿qué es lo que ha fallado?

Para probarlo, insisto, desde la misma aplicación, debemos cargar ese grupo de comandos, para eso usamos la instrucción AA 21 (recuerda, empieza por cero para borrar, por 1 para grabar y por 2 para cargar).

He repetido los comandos en orden (he dicho los números del uno al cinco, por simplicidad) y los distingue sin problemas unos de otros. Aunque si digo otras cosas a veces las reconoce como instrucciones, por ejemplo, SEIS lo reconoce como TRES, CIRCO como CINCO… quizá esto pueda mejorarse con comandos más largos (para ver el límite, consultar manual). Se supone que, como es de esperar, entornos poco ruidosos, buenos micrófonos, líneas cortas hasta el micro, etc., son favorables.

PROGRAMACIÓN

En los diversos tutoriales que podéis encontrar por ahí hay ejemplos de código, yo os pondré el que he usado para probar con mi placa, una modificación de ellos.

/*Este es un programa para controlar un LED y un zumbador
* medicante el módulo de reconocedor de voz de geetech.
* Javier Fernández Panadero feb 2019
* @javierfpanadero htttp://lacienciaparatodos.wordpress.com
*/
byte com = 0; //variable que recoge la respuesta del sensor
int LED =10; //pin en el que conectaremos el LED
int zumbador =11; //pin en el que conectaremos el zumbador

void setup() {

Serial.begin(9600); //inicia la comunicación a esa velocidad
pinMode(LED, OUTPUT); //configura el pin del LED como salida
pinMode(zumbador, OUTPUT); //configura el pin del zumbador como salida

delay(1000);
Serial.write(0xAA);
Serial.write(0x00); //pone el sensor en espera

delay(1000);
Serial.write(0xAA);
Serial.write(0x37); //las respuestas del sensor “compactas”, 11 en lugar de Result:11

delay(1000);
Serial.write(0xAA);
Serial.write(0x21); //carga el primer grupo de cinco comandos
}

//aquí el bucle de arduino que se repite constantemente

void loop() {

//este while se activa cuando haya alguna respuesta del sensor

while(Serial.available()){

com = Serial.read(); //toma la respuesa y la mete en com

/*según sea la respuesta hará una y sólo una de las acciones
* saldrá del while y volverá a quedar mirándolo una y otra vez
* hasta que haya otra respuesta disponible desde el sensor
*/

switch(com){
case 0x11:
digitalWrite(10,HIGH); //enciende el LED
break;
case 0x12:
digitalWrite(10,LOW); //apaga el LED
break;
case 0x13:
analogWrite(11,440); //hace sonar el zumbador
break;
case 0x14:
analogWrite(11,0); //silencia el zumbador
break;
case 0x15:
analogWrite(11,0); //silencia el zumbador
digitalWrite(10,LOW); //apaga el LED
break;
}
}

}

Ahora tendríamos que subir el programa… pero esto de las comunicaciones es bastante delicado para el principiante. Fíjate que hay mucha gente enviando y recibiendo información: el ordenador, la placa y el sensor.

De momento, para poder cargar el programa, necesitamos que el programa con el que estábamos grabando los comandos “suelte el puerto” y lo deje libre para que enviemos el programa desde el IDE a la placa. Así que vamos al programa y le damos al botón de desactivar la conexión que está en la parte superior izquierda de la ventana. Si no lo hicierais así el IDE os dará un error al intentar subirlo. Insisto que esto es frecuente entre principiantes, así que si estáis con estas cosas y os da un error de comunicación, mirad a ver si tenéis tomado el puerto en el AccessPort, con el Monitor Serie de Arduino, no está bien seleccionado el puerto en alguna de las dos aplicaciones, etc.

Como he tenido varios percances, probablemente no le haga daño a nadie que desconectéis el sensor mientras subís el programa… Si queréis ser precavidos, apagad la placa antes de estas conexiones y desconexiones.

Si habéis llegado hasta aquí no deberíais haber tenido problema en subirlo.

FUNCIONAMIENTO

Ya sabéis que una vez que el programa está cargado en la placa podéis desconectaros del ordenador y alimentar la placa a través de una batería, pilas, etc. El sensor toma su energía de la placa, a través de Vcc y GND, así que tampoco habrá problema. Para mis pruebas no la voy a desconectar, pero el cable USB estará funcionando sólo como alimentación.

Importante. CABLEADO

Apago la placa y voy a conectar el sensor… pero… ATENCIÓN… porque este error me ha tenido parado durante horas. Prestemos atención a quién se comunica con quién.

Antes queríamos que el sensor se conectase con el ordenador a través de Arduino, por lo que poníamos sus cables de transmisión TX y recepción RX directamente a los de la placa, para que lo que el ordenador le dijera a la placa (y fuera recibido por RX de la placa) le llegase también al sensor, y lo que el sensor quisiera decir, fuera del cable TX del sensor al pin TX de la placa y el ordenador lo escuchara como si lo dijera Arduino.

Pero ahora queremos que lo que diga el sensor lo escuche Arduino y lo que diga Arduino lo escuche el sensor. Por lo tanto TENEMOS QUE CAMBIAR EL CABLEADO, poniendo el TX de uno con el RX del otro y viceversa.

Así que, cambiamos el cableado, volvemos a conectar y encendemos la placa.

Ya podemos probar nuestros comandos y deberían funcionar correctamente. Probad con otras palabras, hablando más lento o más rápido… aunque todo esto lo podíais hacer mejor directamente en el paso anterior, donde no teníais el resto de fuentes de error.

Aquí tenéis un cutre-vídeo del asunto .Veis que le cuesta reconocer el CINCO, aunque también entiende CINCO cuando le digo CIRCO…

¿Y TO’ ESTO PA’ QUÉ?

Tienen ustedes toda la razón. Si la cosa es que me pongo a dar voces y se encienden lucecitas y se oyen pitidos desagradables… no podemos decir que haya sido un gran paso para la humanidad.

Es cierto que tiene su sentido como “ejercicio”, pero de una manera muy sencilla podíais aplicarlo para AUTOMATIZAR VUESTRA CASA, la tan repetida DOMÓTICA.

Para esto necesitamos a un cacharrito que os va a encantar. El relé.

Relay principle horizontal new

Como podéis ver en este magnífico gif, cuando le aplicamos un voltaje a la bobina se convierte en un imán, que mueve esa pieza grande de metal (la armadura) y hace que los contactos amarillos se muevan. De manera que si conecto OTRO circuito a través de los contactos puedo hacer que este se abra o cierre según le pase corriente o no a la bobina. Así que mediante UN circuito, controlo OTRO circuito.

Este sería el símbolo

Rele 1c
Lo de la izquierda es la bobina y lo de la derecha los contactos. La línea discontinua simboliza esa acción magnética, NO es un cable. Por lo tanto esos dos circuitos están aislados eléctricamente y podrían funcionar a voltajes diferentes.

Lo que vamos a hacer es controlar la bobina con la baja tensión de 5V de nuestra placa, pero poner en los contactos un circuito enchufado a la electricidad de casa, a 220V.

Así, cuando con nuestra voz activemos el relé, este activará o desactivará a su vez un dispositivo doméstico cualquiera: una luz, el aire acondicionado, la lavadora, etc.

Ojo, que esto es muy sencillo, lo único que haremos será DARLE CORRIENTE a ese aparato, así que no podremos configurar sus funciones ni nada. Para la bombilla será suficiente, pero en el caso de la lavadora por ejemplo, sólo será útil si, al recibir la corriente, empezase directamente a funcionar.

De los tres contactos, usaremos sólo dos, porque queremos que esté desactivado cuando el relé está desactivado y viceversa, así que los contactos que debemos usar son el “común” y el “normalmente abierto (NO)” que en la animación serían el central y el de la derecha.

Aunque hay módulos que agrupan muchos relés para poder controlar varios aparatos a la vez y ahí habría que ver cómo se hace la comunicación con ese módulo y cómo se mandan las instrucciones para que se active un réle en particular, nosotros usaremos uno sólo que sirve para ilustrar lo que queremos contar.

Así que procedo a cambiar el LED por un relé, y compruebo que funciona. Por un lado se enciende un indicador rojo y por otro se oye un “click” (el choque de la armadura con la bobina).

Ahora sería el momento de conectar el aparato que quisiera, pero sin eliminar el control manual. Para eso tenemos que usar conexiones en paralelo. Así se hacía antiguamente la lógica con interruptores, si ponías dos en serie simbolizaba la función AND (Y), si los ponías en paralelo, la función OR (o).

Hecho con CircuitLab (no me hagáis caso a los valores, es sólo para que veáis las conexiones).

Esta sería la configuración de una lámpara normal.

Para poder seguir usando el interruptor normal y el controlado por voz, debemos poner los interruptores en paralelo, para que la corriente pueda llega a la bombilla POR UNO O POR EL OTRO.

RLY1 sería el relé que tenemos conectado con nuestra placa.

La activación de uno es independiente de la del otro, ambos sirven por separado para alimentar la bombilla, ninguno impide que el otro le dé corriente, y en caso de estar activados los dos, serán simplemente redundantes.

Os he abierto un interruptor de esos que venden con un cable para poner a una lámpara sencilla.

Se aprecia con dificultad en la foto pero, aunque los dos cables pasan por el interruptor, hay una chapa continua que conecta los dos cables azules, de forma que el único que se interrumpe es el marrón. (Si se interrumpieran los dos habría que proceder de otra manera).

Así que sería en los marrones donde habría que poner los cables que llevaremos al relé.

OJO QUE LA FOTO ES SÓLO INDICATIVA, NI ESTÁN CONECTADOS, NI SOLDADOS, NI ASEGURADOS…

Ahora nos llevaríamos esos cables al relé, como dijimos en los contactos común y normalmente abierto (NO)

Y ya estaría… como dicen los chavales.

Os preguntaréis que por qué no lo monto todo y os hago otro vídeo, dos razones.

  1. Con todo esto ya está suficientemente claro…
  2. No tengo muchas ganas…
  3. NO DEBO…

Y, ¿¿por qué no debo??

Pues porque hay que mirarse las características de los cacharrines, queridos lectores. Si miramos la parte superior de la “cajita negra” que es mi relé, vemos que, como está comprado fuera, lo han diseñado para 120V, así que paso de quemarlo para daros a vosotros un gusto 😉

CONCLUSIÓN Y RESUMEN

Hemos visto que:

Podemos usar sensores para responder a las situaciones del mundo real con facilidad porque, o bien me darán salidas sencillas para programar, o tendrán sus propias librerías.

Podemos programar con toda libertad el comportamiento que deseemos gracias a la potencialidad de los controladores, como Arduino.

Podemos activar aparatos sencillos como LEDs o zumbadores, pero que, a través de relés podemos acceder al control de sistemas de potencia en nuestra propia casa. Con la salvedad que sólo les estamos dando o quitando corriente (encendido o apagado).

Por lo tanto, tenéis la domótica a un paso y por muy poco precio, si tenéis el tiempo y las ganas…

QUEDA PENDIENTE…

Si en lugar de activarlo con voz, conectamos la placa Arduino por Bluetooth o WIFI a un móvil, por ejemplo, o a una web… ya tenéis el famoso Internet de las cosas (IoT) “up and running” para vuestro disfrute. Una plataforma sencilla de programación por bloques es MQTT, por si queréis cotillear.

AHORA, SINCERÉMONOS

Estas cosas pueden ser más o menos divertidas según el carácter o las inclinaciones de cada uno, en mi caso tienen más interés docente y divulgativo que para aplicaciones en mi vida diaria.

Todos los que trabajan con “cacharritos” ya sabéis lo jorobada que es la robótica porque junta todas las fuentes de error de muchas disciplinas:  te puede fallar la electrónica, te puede fallar la interacción de la electrónica con el MundoReal, te puede fallar la programación.

En mi caso, para este asunto, perdí tiempo porque un Arduino Nano no me funcionaba, lo descarté sin llegar a saber por qué, perdí tiempo porque no me di cuenta de que tenía que cambiar los cables para ponerlo a funcionar y, para colmo, a medio post, me dejó de funcionar el sensor sin que haya sido capaz de arreglarlo, así que, gracias a que había comprado dos, he podido terminar este artículo para vosotros.

Ays… me duele la vida.

Así que recordamos a Fernando de la Cuadra, cuando dijo “La informática no es fácil”, para decir… La robótica, tampoco.

Espero que os sirva.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: