Hace pocas semanas se lanzó al mercado español y al latinoamericano los altavoces de Google llamados Google Home. Mi motivación era probarlos diciendo por voz lo que quería que hiciese un robot.
Para este artículo voy a utilizar el robot de televigilancia para que ejecute unos comandos sencillos: avanzar o retroceder un número determinado de segundos (al no tener encoders no puedo decirle que avance distancias) y que haga una fotografía para que me la envíe a telegram. En este vídeo se puede ver cuál es el resultado:
Se puede utilizar tanto el altavoz de Google como el asistente de Google del móvil (si no tienes descárgatelo en Android o en IOS). A continuación explico los pasos que he seguido:
APACHE y PHP
Hay que instalar el servidor web apache y php para que la raspberry pueda recibir los comandos desde IFTTT.
1 2 |
sudo apt-get update sudo apt-get install apache2 php libapache2-mod-php -y |
Para crear las imágenes dentro del directorio de la web, hay que dar permisos al grupo www-data de escritura:
1 2 |
sudo chgrp www-data /var/www/html sudo chmod g+w /var/www/html |
NGROK
Ngrok es una utilidad que puede crear un tunel http entre internet y el servidor web de la raspberry que está conectada a nuestro router, sin la necesidad de abrir ningún puerto al exterior.
Hay que darse de alta, pero para lo que se quiere hacer es un servicio gratuito. Después hay que bajarse el ejecutable Linux ARM, descomprimirlo y ejecutar el comando:
1 |
./ngrok authtoken <token> |
Donde token es el texto que se puede recuperar de esta página si ya se está logado en ngrok.
Ahora se procede a crear el tunel http con el comando:
1 |
./ngrok http 80 |
En la ventana se verá qué host público se le ha asignado al tunel, este será el que se añada en las configuraciónes de los applet de IFTTT (y tendrás que hacerlo cada vez que arranques el ngrok de nuevo, puesto que cambia el subdominio).
IFTTT
Lo primero es crear una cuenta gratuita en IFTTT para crear los applets.
Después, se crea el primer applet, el que indica al robot que tiene que avanzar durante varios segundos. En la sección My Applets, seleccionar New Applet y pulsar el botón this.
A continuación elegir el servicio de Google Assistant.
Como aún no estará conectado, pulsar el botón Connect.
Esto abrirá una ventana nueva con las cuentas de google, si hay más de una cuenta, hay que seleccionar la que esté asociada a nuestro asistente de Google. A continuación Google preguntará si se otorga permisos para gestionar la voz del asistene de Google a IFTTT, hay que pulsar el botón Permitir.
Ahora ya se puede empezar a configurar el applet. Para el movimiento de avanzar unos segundos se selecciona el lanzador Say a phrase wih a number.
Ahora se configura la frase o frases que queremos que el asistente de Google reconozca, poniendo una almohadilla que será donde se guarde la variable numérica de los segundos. Procura poner frases que no estén predefinidas en Google assistant, de lo contrario no serán reconocidas. Después se escribe la respuesta que dará el asistente, se selecciona el idioma español y finalmente se pulsa el botón Create trigger.
Pulsar el botón that.
Escoger el servicio de acción Webhooks.
Seleccionar el botón Make a web request.
Rellenar el campo URL con el host dado por Ngrok y el fichero php que será llamado (en mi caso es comando.php) junto con los parámetros que queramos añadir. Pulsar el botón Add ingredient para introducir en la URL el campo numérico que el Google assistant habrá recuperado con los segundos solicitados. Pulsar el botón Create action.
Finalmente pulsar el botón Finish.
Con esto ya se habrá creado el applet para el avance del robot. Hay que hacer otro applet similar cambiando los textos de llamada (como por ejemplo Retrocede el robot # segundos y pasándole en el atributo tipo de la url del web request un 2).
Como último paso de IFTTT se van a crear dos applet más, uno para que se pueda pedir una foto y otro para que se envíe a Telegram. El primero de ellos es muy similar a los anteriores, sólo que el lanzador será Say a simple phrase, el texto será algo así como Toma una instantánea (no he podido hacerlo funcionar con la pabara foto) y la url del web request apuntará al script foto.php, que será el encargado de hacer la foto y luego llamar al siguiente applet desde la propia raspberry.
Para el otro applet hay que seguir los pasos descritos a continuación.
En la sección My Applets, seleccionar New Applet y pulsar el botón this.
A continuación elegir el servicio de Webhooks.
Seleccionar el lanzador Receive a web request.
Escribir el nombre del evento (en mi caso subir_foto) y pulsar el botón Create trigger.
Pulsar el botón that.
Escoger el servicio de acción Telegram.
Como aún no estará conectado, pulsar el botón Connect.
Esto abrirá una ventana nueva de telegram. En mi caso, previamente asocié la web de telegram para poder abrir los chats en el navegador web, por eso ahora puedo autorizarlo pulsando el botón OPEN IN WEB.
Después hay que pulsar el botón INICIAR y a continuación el botón Authorize IFTTT.
A continuación, seleccionar la acción Send photo.
Rellenar el campo Photo URL con el host dado por Ngrok, pulsar el botón Add ingredient y elegir el campo Value1. Pulsar el botón Create action.
Finalmente pulsar el botón Finish.
Así es como deberían quedar los applets en tu cuenta:
SCRIPTS DE PHP Y PYTHON
La implementación depende lo que quiera hacer cada uno con su robot. En mi caso utilizo un script php llamado comando.php, que a su vez lanza un script en python que es el que se comunica por el puerto serie con la placa arduino para enviarle los comandos de los motores.
comando.php
1 2 3 4 5 6 |
<?php if(isset($_GET["tipo"]) && isset($_GET["segundos"])) { echo shell_exec("python /home/pi/comando.py " . $_GET["tipo"] . " " . $_GET["segundos"] . " > /dev/null 2>/dev/null &"); } ?> |
comando.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import sys import serial import time if len(sys.argv) == 3: try: comando = sys.argv[1] segundos = int(sys.argv[2]) ser=serial.Serial('/dev/ttyAMA0', 115200) ser.write(b'@#') # Inicializa ser.write(comando) time.sleep(segundos) ser.write(b'0') ser.close() except Exception as e: print("Error:" + str(e)) |
El otro script, llamado foto.php, es el que toma la foto y llama al webhook de IFTTT con el nombre de la imagen generada. La api key del servicio webhook se puede recuperar de está página de IFTTT si estás logado (el que aparece después del campo use).
foto.php
1 2 3 4 5 6 7 8 |
<?php if($_SERVER['REQUEST_METHOD'] === "GET") { $fichero = time() . ".jpg"; shell_exec("raspistill -vf -hf -n -t 1 -o /var/www/html/" . $fichero); file_get_contents("https://maker.ifttt.com/trigger/subir_foto/with/key/[API KEY SIN CORCHETES]?value1=" . $fichero); } ?> |
Hay que añadir el usuario www-data al grupo dialout y al grupo video y reiniciar la raspberry para que funcionen el acceso al puerto serie y la cámara desde el entorno de apache.
1 |
sudo usermod -a -G video,dialout www-data |
Hola. Estoy impresionado con el sistema que has montado. De hecho el curso que viene tengo que hacer el TFG del grado en ingeniería telemática y he decidido que se va a basar en el artículo que has escrito, aunque el robot no será un cochecito jajajajaja sino un sistema de orientación de antenas terrestres. Supongo que no habrá ningún problema en ello, aunque por supuesto citaré tu artículo como fuente. Gracias.
Me espero al vídeo en el que consigas que el robot recoja la cocina.. =P
S2
Buen trabajo.