Archivo de la categoría: Internet of Things

Onion Omega2: LCD con pronóstico del tiempo (en Python)

Omega2 es una placa de desarrollo para construir prototipos de dispositivos IoT. Es extremadamente barata y tiene con un soporte oficial muy bueno en forma de una documentación detallada y actualizaciones frecuentes.

En este tutorial explicaré como usar Python para conectar una Omega2 a la API de Yahoo! Weather para mostrar el tiempo actual y el pronóstico para hoy en una pantalla LCD.

Materiales necesarios:

  • Omega2 Plus
  • Omega2 Expansion Dock
  • Pantalla LCD I2C de 4×20
  • 1 Cable USB para energía y 4 Cables puente para conectar el LCD

Preparación del Software

Lo primero de todo es poner en marcha el entorno. Partimos de una Omega2 con conexión a Internet. Este proyecto se ha hecho con Python 2 y requiere la librería pyOnionI2C y pyOmegaExpansion, conéctate a la Omega2 y ejecuta estos comandos para instalarlo:

opkg update
opkg install python-light pyOnionI2C pyOmegaExpansion python-openssl

El código

Llamadas a la API de Yahoo Weather

Las llamadas a la API de Yahoo requieren un mínimo de 2 parámetros: la URL de la API, y la query en formato YQL, y nos retornará los datos en formato JSON. Para la previsión del tiempo la consulta es la siguiente:

URL de Servicio: https://query.yahooapis.com/v1/public/yql
Consulta YQL: select units,location,atmosphere,item from weather.forecast where woeid=[CÓDIGO DE POBLACIÓN] and u='c'

El [CÓDIGO DE POBLACIÓN] es un id para que Yahoo Weather sepa de que lugar nos tiene que retornar los datos. La manera más fácil de obtenerlo es buscar la ciudad en Yahoo Weather y apuntarse los números que aparecen al final de la URL, por ejemplo para Barcelona de España el código de población sería 753692 como se puede ver aquí:

https://www.yahoo.com/news/weather/spain/catalonia/barcelona-753692/

Para consumirlo desde Python uso los módulos urllib y json, el primero hace la llamada y recupera la respuesta en texto y el segundo transforma la respuesta en un array de clave valor:

#!/usr/bin/env python
import json
import urllib
import urllib.request

woeid = "753692" # Barcelona, Spain
api_url = "https://query.yahooapis.com/v1/public/yql?"
api_query = "select units,location,atmosphere,item from weather.forecast where woeid=" + woeid + " and u='c'"
yql_url = api_url + urllib.parse.urlencode({'q':api_query}) + "&format=json"

result = urllib.request.urlopen(yql_url).read()
data = json.loads(result)
results = data['query']['results']['channel']

Control del LCD por I2C

Lo primero es conseguir la librería para controlar el LCD, hay que ir a la documentación de Omega2 donde explica como controlar una pantalla I2C, creamos un archivo lcdDriver.py en la misma carpeta que el script de antes y copiamos el código de la web. En la misma página están los pasos para conectar la pantalla a la placa.

El siguiente ejemplo muestra como incluir y usar la librería en nuestro código:

#!/usr/bin/env python
import lcdDriver

# setup LCD
lcd = lcdDriver.Lcd(lcdAddress)
lcd.backlightOn()

lcd.lcdDisplayStringList([
location['city'] + ', ' + location['country'],
'Forecast: ' + forecast['text'],
'Now => ' + condition['text']
])

Aplicación práctica

He juntado el código de las llamadas a Yahoo Weather y el del controlador LCD para construir una pantalla que me muestre el tiempo y la he colocado encima de mi despertador, así cuando me levante sabré si tengo que abrigarme o no.

Podéis consultar el código en mi repositorio de Github

Próximos pasos

Hay cosas que se pueden mejorar, pero eso os lo dejo a vosotros. Aquí algunas sugerencias:

  • Traducir los mensajes de la API de Yahoo Weather al Español
  • Añadir control de errores, porque tal y como está ahora no se sabe que pasa cuando la API retorna un valor erróneo o deja de funcionar internet
  • Ejecutar el script automáticamente cuando se enciende la Omega2
  • Construir una caja para el dispositivo

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.