Hacking

Así he hackeado el router ZTE F680 que instala Racctel+

Hace poco terminé la permanencia de mi conexión a internet y decidí cambiar de operador. Racctel+ tiene una oferta de 500 Mb/s muy interesante, pero el router no está a la altura y hay que cambiarlo para poder aprovechar todos los megas. En este post explicaré como conseguir la configuración de la conexión para poder usar otro router.

Disclaimer: En este post sólo uso la marca Racctel+ para identificar el modelo de router que he usado.

Situación inicial

Estoy sorprendido por la cantidad de operadores de Internet nuevos que han empezado a ofrecer sus servicios en Cataluña. Tienen ofertas bonitas y baratas. Ahora bien, hay que ir con cuidado porque si el mantenimiento de su red es deficiente vamos a tener microcortes, velocidades por debajo de lo contratado, routers malos, etc.

Contraté la conexión de 500 Mb/s de Racctel+, pero el primer día me llevé una decepción porque me pusieron un router ZTE F680, que está obsoleto, causa problemas con algunas aplicaciones como juegos online, y además la velocidad del wifi es penosa.

He tenido problemas para jugar a Guild Wars 2 por culpa del firewall del router, y sólo conseguía 60 Mb/s de bajada cuando ponía el portátil conectado por wifi al lado del router. Con mi conexión anterior, que era de 100 Mb/s, llegaba a la máxima velocidad por wifi en toda la casa.

Conseguir la configuración de la conexión de fibra de Racctel+

Para cambiar el router y poder llegar a la velocidad máxima de Internet tienes que conseguir la configuración de la fibra óptica. Yo la pedí al técnico de Racctel+ pero se negó a dármela y he tenido que recurrir a investigar mediante prueba y error hasta conseguirla. A continuación, os explico cómo logré extraer la configuración del router.

Disclaimer: Ten en cuenta que es un proceso muy técnico y si te equivocas puedes romper el router y perder el acceso a Internet.

Vas a necesitar estas herramientas:

  • Un adaptador USB-TTL
  • Un pendrive formateado con Fat32 y 300 MB de espacio libre
  • Un GPON al que se le pueda cambiar el número de serie

El objetivo es conseguir el número de serie del GPON, la contraseña del GPON, y la configuración de la WAN.

Para conseguir el número de serie del GPON del ZTE F680 tienes que entrar en http://192.168.1.1 con el usuario ‘avanzado’ y la contraseña ‘avanzado’ y entrar en la sección Network->PON

Para las configuraciones restantes tienes que abrir el router y conectarlo al PC mediante el puerto de serie de la izquierda, y que es el que queda más lejos del conector del cable de fibra óptica.

Conecta el cable gris a GND, el blanco a TX, y Negro RX. Usa Putty para configurar una conexión de puerto de serie con una velocidad de 115200. Cuando te solicite las credenciales pon en usuario ‘root’ y en contraseña ‘root’.

Para conseguir la configuración de WAN tienes que desbloquear todas las secciones de la interfaz web y eso se hace elevando los permisos del usuario ‘avanzado’. Tienes que ejecutar los comandos:
sendcmd 1 DB set DevAuthInfo 1 Level 1
sendcmd 1 DB save

Después entra en http://192.168.1.1/ con el usuario ‘avanzado’, ves a Network->WAN->WAN Connection y copia los parámetros WAN_Internet para el acceso a Internet y de WAN_Multicast para la TV.

La fibra de Racctel+ usa el ID de VLAN 10 y la prioridad 0.

Por último, te contaré como extraer la contraseña del GPON. Para hacerlo tienes que conectar el pendrive al router y ejecutar el siguiente comando en la consola del puerto de serie:
cat /dev/mem > /mnt/usb11/contenido_ram
Este comando crea en el pendrive el archivo “contenido_ram”, que contiene un volcado de la memoria RAM del router. Abre el archivo con un editor hexadecimal como por ejemplo HxD.

Ahora viene lo más complicado, porque no hay manera de predecir en que parte del volcado de memoria RAM saldrá la contraseña del GPON, y puede que te hagan falta varios volcados de memoria hasta encontrarla.

Yo encontré la contraseña haciendo 4 volcados de memoria en momentos distintos como por ejemplo inmediatamente después de reiniciar el router, después de conectar el cable de fibra, etc., busqué todos los sitios donde aparecía “GPON”. Cerca de esa palabra y entre un montón de símbolos raros encontré una cadena de 9 caracteres formada por letras en mayúscula y números que parecía tener sentido. Los puse en otro GPON y ¡bingo!: era la contraseña correcta.

Conectar otro router a la conexión de Racctel+

Racctel+ comprueba el número de serie y la contraseña del GPON y sólo podrás conectarte si coinciden con los que tienen registrados en su centralita.

Los GPON que sólo permiten cambiar la contraseña no sirven porque, aunque se encienda la luz verde que indica que la configuración es correcta, la centralita se comportará como si tuvieses el cable desconectado y no tendrás una dirección IP para navegar.

Te recomiendo comprar un router HGU Askey porque se le puede cambiar el número de serie del GPON, y además el rendimiento del wifi es espectacular. He alcanzado 500 megas de bajada y de subida por wifi de 5Ghz. Lo puedes comprar a precio de saldo en tiendas de segunda mano y mercadillos.

En otro post os contaré como configurar el HGU Askey para que funcione con cualquier operador de fibra óptica.

Code snippet

Open Powershell command line as Admin from a limited user account

Sometimes at work I have to execute something with admin permissions in user’s machines, but normally the final users are not administrators. For these cases my coworkers tell me to log off and switch to an administrator user, but some computers are slow and this process take me minutes.

I wanted to be efficient so I did a research and I found this simple solution: just execute this command:
runas /noprofile /user:DOMAIN\USERNAME "powershell.exe Start-Process powershell.exe -Verb runAs"
(Remember to change DOMAIN\USERNAME with your credentials, you will be asked for the password after executing this command)

The command explained

runas executes something as other user.

The param /noprofile prevents loading the user profile in order to execute anyhing faster. Read this if you are not sure that you can use this param: About User Profiles, or simply remove this param.

"powershell.exe Start-Process powershell.exe -Verb runAs" is the command to be executed. In this case executes a powershell command line with admin privileges. Take in care that it is not possible to execute the command powershell.exe -Verb runAs directly because the powershell window will close immediately.

Code snippet, Programación

Clone Azure DevOps test plans with Powershell

Imagine the situation: You have a test plan in Azure DevOps that is executed every time you create a new version of your product, but Azure DevOps doesn’t provide an easy way to clone test plans and cloning manually is painful.

Fortunately the Azure DevOps REST API has a Clone Operation for test plans: Clone Operation – Clone Test Plan

I wrote a powershell script to make an API call to Clone operation in an easy way, just follow these steps:

  1. Download the script for cloning Azure DevOps Test Plans.
  2. Change these variables values:
    Image of Powershell script with the values for the variables used in this example

    • $organization: Name of the Azure organization of your project. Marked with a green box.
    • $PAT: Your Azure Personal Access Token (PAT). You must set “Test Management permission” to “Read & write”. For more details about PAT follow instructions at Authenticate access with personal access tokens.
    • $project: Project name that contains the test plan. Marked in yellow.
    • $testPlanId: Id of the test plan you want to clone. Marked in red.
    • $testSuiteId: Id of the test suite you want to clone. Marked in purple.

    Image of Powershell script with the parameters marked with colours

Open powershell and execute script, if succeded it will return OK.
After the execution of the Powershell script it returns ok

Clone operation is asyncronous, if the new test plan is empty just wait a few seconds and reload page.
Result of the Powershell script execution

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
Programación

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

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”.

Internet of Things

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.

Coche teledirigido con Intel Edison

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.

Coche teledirigido con Intel Edison

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

Coche teledirigido con Intel Edison

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