Archivo de la etiqueta: IoT

Instalar reconocimiento de voz en Español en Windows 10 IoT Core

Windows 10 IoT core es un sistema operativo que promete. Para mí es una combinación perfecta entre simplicidad y potencia, porque nos ofrece acceso casi total a las API .NET en dispositivos con los mismos lenguajes y entornos que usado para programar en PC y además tiene herramientas para hacer cualquier tipo de interfaz gráfica y interacción de todo tipo con los usuarios.

Entre ellas está el reconocimiento de voz, pero al instalar Windows IoT Core veremos que sólo incluye el idioma Inglés tanto para el reconocimiento como para el Texto-a-Voz. Por suerte es una limitación relativamente fácil de resolver.

Los archivos de reconocimiento de voz y Texto-a-Voz de Windows 10 IoT y su hermano mayor de PC son intercambiables. Se puede copiar los archivos del reconocimiento de voz de un idioma de PC tal cual a Windows IoT Core y funcionarán.

Requisitos:

  • PC con Windows 10 en Español o con language pack Español. Recomiendo que en el PC y en el dispositivo IoT usen la misma versión de Windows. He usado la versión 14393 (Windows 10 Anniversary Update)
  • Dispositivo con Windows IoT Core. He usado una Raspberry Pi 3.
  • Un PC con lector de tarjetas.
  • Live CD o USB de Ubuntu (En serio, más adelante veremos porque)

Procedimiento:

Los pasos los explico para Español de España pero debería servir para cualquier otro idioma, solo hay que sustituir en las rutas ‘es-ES’ por el código de idioma que corresponda.

Desde el PC con Windows 10 conéctate a tu dispositivo Windows IoT Core por compartición de archivos a la carpeta \\[IP_DISPOSITIVO]\C$\. Usa el usuario Administrator, la contraseña por defecto es p@ssw0rd.

Copia las siguientes carpetas desde tu PC Windows 10 a tu dispositivo Windows 10 IoT Core:

  • C:\Windows\Speech_OneCore\Engines\TTS\es-ES a \\[IP_DISPOSITIVO]\C$\Windows\Speech_OneCore\Engines\TTS\
  • C:\Windows\Speech_OneCore\Engines\SR\es-ES-N a \\[IP_DISPOSITIVO]\C$\Windows\Speech_OneCore\Engines\SR\
  • C:\Windows\Speech_OneCore\Engines\Lexicon\es-ES a \\[IP_DISPOSITIVO]\C$\Windows\Speech_OneCore\Engines\Lexicon\
  • C:\Windows\System32\Speech_OneCore\Common\es-ES a \\[IP_DISPOSITIVO]\C$\ Nota: no será la ubicación definitiva de esta carpeta, como veremos más adelante.

Ahora viene la parte complicada: para que Windows detecte el nuevo idioma hemos de copiar algunos archivos a la carpeta System32, pero esa carpeta tiene unos permisos especiales y no se pueden modificar por red.
Tampoco se puede modificar desde el PC conectando la tarjeta SD porque Windows sólo reconoce la primera partición de las unidades flash.

Mi workaround a ese problema ha sido descargar un live cd de Ubuntu porque lee todas las particiones de la tarjeta SD y no respeta los permisos de NTFS, así tenemos control total sobre el sistema de archivos de Windows 10 IoT Core.

El último paso es ejecutar Ubuntu, abrir la unidad etiquetada como ‘MainOS’ que contiene los archivos de Windows 10 IoT Core y mover la carpeta \es-ES (la última que hemos copiado en el paso anterior) a \Windows\System32\Speech_OneCore\Common\

Para verificar que la instalación es correcta descárgate un proyecto de ejemplo de uso de reconocimiento de voz y ejecútalo en Windows 10 Iot Core. Si está todo correcto debería aparecer Español como opción en Text-to-Speech y Speech Recognition.

Intel Edison SmartCar V2.0

intel-edison-smartcar

La versión 1.0 estaba bien para comenzar, pero mi intención era hacer algo diferente a lo que se encuentra en otros tutoriales.

El objetivo que me he marcado para la v2.0 es añadir al coche una webcam para hacer streaming de lo que ve. Para ello he usado una Sony Eye, que es de poca resolución pero tiene una calidad de imagen muy buena y requiere poca energía.

Pero al llevarlo a la práctica me he encontrado con 2 problemas: el primero es que la Intel Edison deshabilita el puerto USB Host cuando es alimentada por USB, y el segundo es que la imagen oficial de Yocto Linux solo soporta cámaras UVC.

El conector redondo de power input del Arduino Breakout acepta 5v así que usé la clavija de un cargador de portátil viejo y la soldé a un conector USB para tener habilitado el puerto USB Host con la batería externa.

IMG_20150830_223327

Hace tiempo en un evento de intel me dieron una placa Intel Galileo con una webcam Sony Eye y esperaba encontrarme los drivers preinstalados en la imagen de Yocto para Edison, pero no ha sido así y he tenido que compilarlos. Como no tengo experiencia me he basado en un tutorial de los foros de intel de alguien que ha hecho algo parecido. He incluído los módulos en el repositorio de Github.

Para terminar he atornillado un tupper al chasis del coche para evitar que los componentes se caigan cuando el coche se mueve.

P1010200

En la parte de código he reutilizado partes de proyectos que he encontrado por Internet. Con ffmpeg capturo el vídeo de la webcam, luego hago streaming por websockets a una página web que reproduce el vídeo usando HTML5, con esto consigo que sea compatible con casi todos los navegadores de internet de ordenadores y móviles.

También, a modo de prueba, he conectado el coche a thethings.io para guardar el log del programa. A largo plazo tendrá aplicaciones potenciales como controlar el coche remotamente desde una página web (lo que me evitaría tener que saber la IP del coche para conectarme y controlarlo), y enviar fotos a Internet.

Los cambios ya están subidos a Github. El proceso de instalación se ha vuelto a complicar porque la instalación de ffmpeg y los módulos se ha de hacer a mano. Me gustaría volver a conseguir que la puesta en marcha sea sólo montar el coche y darle a un botón pero eso será en próximas versiones.

Intel Edison SmartCar V1.1.0

Poco a poco sigo avanzando en la construcción del coche, pero antes de añadirle mejoras he creído necesario revisar el código a fin de hacerlo más simple y fácil de mantener.

Con la V1 el coche funcionaba pero el código estaba dividido en una carpeta para el backend y otra para el frontend y eso complicaba la instalación porque se tenía que hacer por separado. Además estaba el inconveniente de que el puerto del backend de NodeJS es distinto al del frontend y daba problemas de crossdomain cuando se comunicaban entre si mediante AJAX, en ese momento los solucioné de manera cuestionable poniendo la IP de la placa directamente en el código y usando JQuery.

Como soy newbie en NodeJS he investigado hasta encontrar la solución a mis problemas: el Framework Express, que me ha servido para optimizar el código. Ahora tengo el frontend y el backend en el mismo puerto, los problemas de crossdomain desaparecieron, he podido eliminar JQuery y sustituirlo por una única función para AJAX, y además los archivos del frontend se han podido integrar en el proyecto de Intel XDK.

Con estos cambios el código entero se sube simplemente haciendo clic en el botón Upload del Intel XDK, no hay que poner la IP a mano, y además hay menos archivos que mantener.

Lo más importante esta en la nueva función setup_app() del archivo main.js del backend porque es la que me ha permitido hacer las mejoras.

La nueva versión es la V1.1.0. La puedes descargar en Github.

2049eaa2-1578-3fbb-875c-d3ca1c68aa75

Construcción de coche teledirigido con Intel Edison: V1

Vamos a construir la primera versión del coche. Tendrá los componentes y código justos para que funcione. Nos servirá de base, le añadiremos mejoras más adelante.

Usaremos estos componentes:

  • Placa Intel Edison + Arduino breakout.
  • Batería externa USB para alimentar la Intel Edison.
  • Controlador de motores L298N. (Controla 2 motores)
  • Chasis de smart car de 2 ruedas motorizadas.
  • Opcional: Arduino sensor shield V5.0. (Facilita las conexiones)

En la parte de software usaremos nodeJS en el backend para controlar los motores, y HTML y AJAX en el frontend.
NodeJS viene incluido en la imagen de Yocto Linux de Intel Edison.

Conexiones

El controlador de motores L298N tiene conexiones de alimentación, de control, y las de los motores:

  • Las conexiones de alimentación van conectadas a una fuente de alimentación de entre 6 y 12 voltios. El L298N tiene un regulador de tensión que alimenta los motores con 5v.
  • Las conexiones de control reciben la señal para encender y apagar los motores y el sentido de giro. Están numeradas de la IN1 hasta la IN4 y las conectaremos a los pines Arduino de la placa Intel Edison.
  • Las conexiones de los motores están situadas en ambos lados del L298N.

Esquema del controlador de motores L298N

Conecta los cables de la siguiente manera:

  • IN1 — Pin 7 de Arduino
  • IN2 — Pin 6 de Arduino
  • IN3 — Pin 5 de Arduino
  • IN4 — Pin 4 de Arduino
  • Vin — Fuente de alimentación (6 – 12v)
  • GND — Polo negativo de la fuente de alimentación y también al pin GND de Arduino
  • OUT1 — Motor 1
  • OUT2 — Motor 2

Las conexiones quedan de esta forma:
Intel Edison SmartCar V1

Código

Prerequisitos: Intel XDK IoT Edition para compilar y instalar el script de NodeJS, y un cliente de SCP para subir el frontend en HTML y Javascript al servidor web de Intel Edison.

Descarga el código fuente en github.com/Branyac/intel-edison-smartcar, alli tienes las instrucciones para compilarlo y subirlo a la placa, voy a explicar el funcionamiento brevemente:

Backend en NodeJS

Programar para la Intel Edison en NodeJS es un poco más complicado que con Processing (el lenguaje de programación de Arduino), pero es más potente y más fácil añadir funcionalidades. Se usa la librería MRAA para controlar los pines de Arduino.

El programa se compone de un sólo archivo de Javascript llamado main.js que encontrarás dentro de la carpeta SmartCar.
La función main() es la principal y hace lo siguiente:

  1. Primero llama a la función setup_mraa() que crea una nueva instancia de MRAA necesaria para controlar los pines de Arduino.
  2. A continuación llama a setup_arduino_pins() que indica que los pines del 4 al 7 se van a usar en modo salida (equivale a hacer un pinMode (X, OUTPUT); en processing, donde X es el número de pin)
  3. Por último llama a setup_webserver() que crea un servidor web en el puerto 8888 y luego a la función start_motors() con el valor del parámetro motors_action que le llega en una petición HTTP GET. La función start_motors() enciende y apaga los pines de salida de Arduino para indicar al L298N en que sentido se mueve cada motor (equivale a hacer digitalWrite (X, HIGH); en processing), luego espera 1 segundo y para los motores apagando todos los pines.

Frontend en HTML + JS

El frontend simplemente hace llamadas AJAX al puerto 8888 de la placa Edison para mover el coche. El código está en el archivo main.js de la carpeta web/js, según el valor del parámetro motors_action hará estos movimientos:

  • motors_action=F: Hacia delante.
  • motors_action=B: Hacia atrás.
  • motors_action=L: Girar a la izquierda.
  • motors_action=R: Girar a la derecha.

Próximamente publicaré otros posts con las mejoras que iré añadiendo a este coche teledirigido.

intel-edison-smartcar