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

Feature Switch o como acabar de golpe con los merge monstruosos y errores críticos

Probablemente cuando estudiaste y te enseñaron las virtudes de los sistemas de control de versiones te explicaron como usar branches para separar las nuevas funcionalidades del resto del programa para no tener cosas a medias en el trunk.

A la hora de la verdad esa metodología sólo funciona con pequeños proyectos y al entrar en el mercado laboral chocamos con la realidad que es que la mayoría de proyectos de software son enormes y hay que dedicar muchísimo tiempo a hacer merge de las nuevas funcionalidades, y si a eso le sumas las metodologías Agile en las que el tiempo es limitado tenemos la tormenta perfecta del desarrollo de software.

Pero por suerte alguien pensó en la solución y inventó los Feature Switch que como su nombre indica vienen a ser interruptores lógicos con los que podemos activar y desactivar funcionalidades a nuestro gusto de manera que podemos trabajar sin crear branches adicionales, de forma que nos ahorramos merges y además también sirven para volver a desactivar una funcionalidad rápidamente en caso que detectemos un error crítico en producción.

La forma de activar y desactivar los Feature Switch está en manos de la creatividad y necesidades de cada proyecto. En algunas aplicaciones será un archivo de texto indicando el estado de cada funcionalidad, en otros según la fecha o región donde se ejecuta la aplicación, otras veces será mediante un pago, etc. Tiene un potencial muy grande de usos y utilidades.

¿Cómo implementar un Feature Switch?

En Google encontrarás librerías y ejemplos de Feature Switch para aburrir y por eso no voy a entrar en detalle. Sólo comentar mi preferida para C# que es la librería FeatureToggle de Jason Roberts y que el me gusta por lo siguiente:

using System;
using FeatureToggle;

namespace ConsoleApp1
{

public class Printing : SimpleFeatureToggle { }
public class Saving : EnabledOnOrAfterDateFeatureToggle { }
public class Tweeting : EnabledOnOrAfterAssemblyVersionWhereToggleIsDefinedToggle { }

class Program
{
static void Main(string[] args)
{
var p = new Printing();
var s = new Saving();
var t = new Tweeting();

Console.WriteLine($"Printing is {(p.FeatureEnabled ? "on" : "off")}");
Console.WriteLine($"Saving is {(s.FeatureEnabled ? "on" : "off")}");
Console.WriteLine($"Tweeting is {(t.FeatureEnabled ? "on" : "off")}");

Console.ReadLine();
}
}
}

(Copiado de dontcodetired.com/blog/post/FeatureToggle-v4-RC1-with-NET-Core-Support)

La sencillez y de elegancia de uso de la librería de Jason Roberts es sublime. Con unas pocas líneas tenemos configurado todos los switches y los nombre son muy claros de manera que no hace falta estudiar el código de las clases de este Feature Switch para darse cuenta que por ejemplo EnabledOnOrAfterDateFeatureToggle activará la funcionalidad llegada una fecha indicada. Además es una librería actualizada muy a menudo. Por esas razones la recomiendo.

El Feature Switch es un concepto simple, fácil de implementar, y sirve tanto para proyectos grandes como para pequeños. Usadlo siempre que podáis porque os ahorrará muchos dolores de cabeza.

Hacking Físico: Cómo extraer la contraseña del ONT ZTE F601 de Jazztel y de Orange

Las conexiones a Internet por Fibra Óptica son cada vez más frecuentes. Con el ADSL se podía cambiar de router fácilmente porque los operadores daban el usuario y contraseña de la configuración de PPPoE, pero en las conexiones de fibra óptica han dado un paso atrás y no proporcionan la contraseña para sustituir el ONT.

Veremos como extraer la contraseña del ONT ZTE F601 de Jazztel y de Orange. Es posible que este tutorial sirva para otros modelos de ONT de ZTE y otras marcas que tienen diseños parecidos.

Cultura General

La mayoría de electrodomésticos se programan a través de puertos de serie. Algunos de ellos están accesibles como por ejemplo en algunos modelos de televisores, reproductores Bluray, etc. pero en otros hay que abrir el aparato para verlo.

El puerto de serie da control total sobre el dispositivo. Cada aparato es un mundo, en algunos casos nos permitirá subir un firmware nuevo y en otros también interactuar a través de consola. En este caso el ONT ejecuta una distribución de Linux ligera y el puerto de serie nos permite entrar en la consola como root y ver parámetros que no se muestran en la interfaz web del dispositivo como por ejemplo la contraseña que usa el ONT para conectar a la fibra óptica.

Manos a la obra

Herramientas necesarias

  • Puerto de Serie tipo JY-MCU USB o similar
  • Cables puente terminados en punta
  • Destornillador de estrella
  • Software: Putty
  • Opcional: Herramientas de plástico para abrir aparatos sin dejar marca (Busca en Google “cell phone opening tools”)

Conecta el puerto de Serie USB al ordenador y configura Putty con los parámetros que se muestran en la imagen:

Saca el tornillo de la parte inferior del ONT para retirar el soporte que mantiene el dispositivo en vertical. Luego haz palanca con el destornillador o con las herramientas de plástico en las juntas de los lados del ONT para desenganchar los soportes que hacen presión para mantener cerrado el ONT. Prueba primero por el lado donde están los conectores del ONT porque es el que está menos sujeto. La carcasa quedará suelta y tendremos acceso a la placa base.

En la siguiente imagen tienes la posición del puerto de serie interno del ONT ZTE F601. Conecta los cables con el dispositivo apagado como indico en el esquema.

Enciende el ONT. En Putty verás el log de arranque. Espera un par de minutos a que termine de arrancar.

Busca la línea que se muestra en la imagen, donde aparece el Número de Serie del ONT y la contraseña de la conexión de fibra óptica.

Con esto es suficiente pero si quieres interactuar en la consola (aunque recomiendo no hacerlo porque podrías romper el aparato) ves a Putty, aprieta enter y entra con el usuario “root” y contraseña “root”.

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

Construcción de coche teledirigido con Intel Edison: Introducción

Me encanta el movimiento Maker, leo mucho sobre ello y cuando puedo voy a eventos porque me apasiona ver los gadgets que contruyen otros, ya sea para resolver algún problema de la vida diaria o solo por diversión.

Como programador intento dar solución a problemas y inquietudes de todo tipo, pero cada vez es más difícil porque hay muchas personas trabajando en lo mismo. Puedes tener un software con un valor añadido, pero es complicado promocionarlo porque las tiendas de aplicaciones están saturadas de programas similares y la gente va a lo seguro y escoge la más popular, aunque no tenga aquello que has hecho y que les podría ayudar a hacer una tarea de forma más eficiente. Es frustrante y en ocasiones desanima a seguir trabajando en ello.

En cambio en materia de hardware hay mucho por hacer. Antes hacía falta mucho capital para producir algo, pero hoy se puede montar casi cualquier cosa en tu casa y en ocasiones es más barato y de mejor calidad y prestaciones que los productos comerciales. Dejar volar tu imaginación y crear cualquier trasto que necesites es posible gracias a los chips baratos y las impresoras 3D.

Además desde hace unos años está empezando a desarrollarse el llamado “Internet de las cosas” que en estos momentos está siendo impulsado por gente apasionada por la tecnología y esto en mi opinión es así porque ellos son los que tienen las ideas más creativas y poco que perder. Son raros los casos en que grandes empresas se arriesgan en crear productos nuevos, mientras que en Internet puedes encontrar tutoriales caseros de cosas variadas: desde conectar un sensor de temperatura a Internet, hasta dispensadores de cerveza controlados vía Twitter, y la mayoría están escritos por personas normales, sin estudios avanzados.

En enero fui a una encuentro de makers organizado por IoTBCN en el MOB de Barcelona. Son unas quedadas que recomiendo y en las que se ven cosas que no dejan indiferente, algún día hablaré de ellas. El caso es que me dieron una placa Intel Edison con el breakout de Arduino, un regalazo en toda regla, para contruir un coche teledirigido, y además me he propuesto hacerlo con alguna sorpresa que lo haga diferente.

De eso va a tratar esta serie de posts en los que compartiré las motivaciones, ideas, y como va avanzando el proyecto.

Ya que la Intel Edison me la regalaron creo que lo justo es que este coche teledirigido sea público y por eso colgaré toda la documentación y código fuente en Github a medida que vaya tomando forma para otros puedan montarlo y mejorarlo.

Creo que los próximos posts serán interesantes y divertidos y ayudarán a otras personas a introducirse en el mundo maker y construir sus propios artilugios ya que hay partes que se pueden reutilizar en otros proyectos.

Espero que disfrutéis leyéndolos tanto o más como yo escribiéndolos.