domingo, 27 de noviembre de 2016

Hola Mundo en Python con el Witty ESP8266


Arduino no es el único entorno en el que podemos programar nuestro Witty y en general el ESP8266. También podemos utilizar otros entornos, incluso otros lenguajes. Hoy vamos a realizar el mismo ejemplo de "Hola Mundo" que ya hicimos en Arduino, pero esta vez lo haremos utilizando el lenguaje Python. El programa que vamos a escribir, hará parpadear el led rojo del led RGB montado en el Witty. 
Utilizar Python para programar, en lugar de C, tiene bastantes ventajas y algún inconveniente. Como ventajas podemos citar que Python es uno de los lenguajes más fáciles de aprender y por ello está recomendado para iniciarse en la programación en general. Utilizarlo para iniciarnos en la programación de microcontroladores puede ser una buena manera de empezar en este mundillo. También es un lenguaje que nos permite prototipar más rápido que C y es más fácil de leer y de entender. Como puntos en contra podemos destacar que es más lento, menos eficiente, y permite menos control del hardware que estamos programando.
Para el ejemplo que vamos a realizar, debemos tener una versión de Python instalada en nuestra máquina. Como vamos a utilizar Ubuntu tendrás seguramente ya una en nuestro sistema, si no es así debes instalarla.

Primeramente descarga el último firmware para el ESP8266 de la página de micropython.

Instala esptool.

sudo pip install esptool

Borra el firmware del dispositivo.

esptool.py --port /dev/ttyUSB0 erase_flash

Instala el firmware descargado.

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dio 0 esp8266-20161110-v1.8.6.bin

Ahora ya tienes un intérprete de Python en el Witty. Conecta con la consola.

minicom -b 115200 -D /dev/ttyUSB0

Accederás a la consola de Python del dispositivo y podrás realizar las operaciones habituales. Desde la consola podrías programar directamente el microcontrolador. Nosotros vamos a escribir el programa en un fichero en el PC y luego lo subiremos al Witty.


Ahora instala la herramienta de Adafruit Ampy. Esta herramienta sirve para interactuar con micropython a través del puerto de comunicaciones y nos permitirá subir archivos desde el ordenador al microcontrolador.

sudo pip install adafruit-ampy

Escribe el siguiente programa y guárdalo en un fichero llamado holamundo.py

from machine import Pin
import time
pinR = Pin(15, Pin.OUT)
pinG = Pin(12, Pin.OUT)
pinB = Pin(13, Pin.OUT)
pinG.low()
pinR.low()
while True:
 pinR.high()
 time.sleep(0.5)
 pinR.low()
 time.sleep(0.5)

Sube el programa desde el PC al Witty escribiendo la siguiente línea en el terminal:

ampy --port /dev/ttyUSB0  --baud  115200 put holamundo.py /main.py

Si has seguido todos los pasos sin problemas, resetea el Witty y verás parpadear en rojo el led del RGB.


domingo, 20 de noviembre de 2016

Depuración gráfica en arduino con ESP8266 Witty Linux y SciDavis

Programar en Arduino es sencillo,  depurar los programas que hacemos en busca de errores ya no lo es tanto. Al contrario que en otros entornos de programación no disponemos de herramientas de depuración paso a paso ni de puntos de ruptura. En muchas ocasiones es complicado saber qué está pasando exactamente dentro de ese pequeño objeto al que tenemos un acceso bastante limitado.
La única herramienta que tenemos para visualizar como se está comportando nuestro programa es la escritura en el puerto de comunicaciones. Con la clase Serial podemos escribir la información que nos parezca significativa y ver esa información en la consola del IDE de Arduino. El problema es que esa información a veces es muy difícil de interpretar , sea porque varía muy rápido  en el tiempo y no podemos leerla sea porque el valor que queremos examinar depende a su vez de otro sensor  u otros y no es fácil ver como se relacionan. Esto ocurre sobre todo cuando hemos cometido un error a la hora de conectar, diseñar el circuito o programar el sketch.
Sin embargo, hay una manera de depurar gráficamente los valores de nuestros sensores y variables de una manera relativamente sencilla. Lo vamos a ver con un ejemplo muy simple y bastante tonto, pero que servirá para el caso. Usaremos, como no, nuestro pequeño Witty que trae de serie incorporados ya una fotoresistencia y un botón los cuales vamos a utilizar para el ejemplo.

A continuación vemos un programa que utiliza el puerto serie para volcar los valores significativos y poder visualizar desde la consola qué es lo que está ocurriendo dentro del microcontrolador.


int PHOTO_R = A0;
int BUTTON = 4;

void setup(){
  Serial.begin(115200);

  pinMode(PHOTO_R,INPUT);
  pinMode(BUTTON,INPUT);
   
}

void loop(){
  
    //Photoresistence read and print
    int photoResistence = analogRead(PHOTO_R);
    Serial.print(photoResistence);
    Serial.print("-");

    //Button read and print
    int buttonVal = digitalRead(BUTTON);
    Serial.print(buttonVal);
    Serial.print("-");

    //Calculated value and print
    int calc = photoResistence / ((buttonVal + 1) * 2);
    Serial.printĺn(calc);
    
    delay(100);
    
}

El programa lee el valor de la fotoresistencia, (posibles valores entre 0 y 1024) y lo envía al puerto serie.  Posteriormente envía también un guión con objeto de separar este dato del siguiente. A continuación se realiza la lectura del botón (posibles valores entre 0 y 1, pulsado y sin pulsar respectivamente) El valor se envía al puerto serie e inmediatamente se envía también un guión separador. Por último se realiza un cálculo cuyo valor dependerá del valor de la fotoresistencia y si se encuentra o no pulsado el botón. Al igual que los anteriores se envía al puerto serie. Este programa producirá la siguiente salida ( He tapado la fotoresistencia y pulsado el botón durante la ejecución para hacer variar los valores).

1024-1-256
1024-1-256
1024-1-256
1024-1-256
1024-1-256
1024-1-256
1024-1-256
1024-1-256
1024-1-256
574-1-143
364-1-91
350-1-87
354-1-88
435-1-108
947-1-236
906-1-226
388-1-97
367-1-91
557-1-139
779-1-194
940-1-235
934-1-233
738-1-184
509-1-127
458-1-114
435-1-108
428-1-107
421-1-105
422-1-105
430-1-107
1024-1-256
1024-1-256
909-1-227
649-1-162
618-1-154
881-1-220
629-0-314
797-0-398
910-0-455
635-0-317
1024-0-512
752-0-376

Gracias a que hemos puesto un retardo al final del loop, podemos leer la salida, de lo contrario veríamos pasar los numeros a toda velocidad y sin posibilidad de leerlos. Aún así tampoco es fácil interpretar lo que está pasando. Vamos a intentar mejorarlo realizando unas modificaciones en el programa.

Modifica el separador (aunque podríamos dejarlo, como está, la verdad) y añade los milisegundos de ejecución a la salida por el puerto serie. También disminuye el tiempo de retardo para aumentar el número de muestras. Se podría eliminar el retardo si queremos la máxima resolución. El valor del botón lo multiplicamos por 1024 para que pueda tomar dos valores 0 y 1024 que serán más fáciles de observar después.

int PHOTO_R = A0;
int BUTTON = 4;

void setup(){
  Serial.begin(115200);

  pinMode(PHOTO_R,INPUT);
  pinMode(BUTTON,INPUT);
   
}

void loop(){
  
    //Photoresistence read and print
    int photoResistence = analogRead(PHOTO_R);
    Serial.print(photoResistence);
    Serial.print(";");

    //Button read and print
    int buttonVal = digitalRead(BUTTON);
    Serial.print(buttonVal * 1024);
    Serial.print(";");

    //Calculated value and print
    int calc = photoResistence / ((buttonVal + 1) * 2);
    Serial.print(calc);
    Serial.print(";");

    //Time in milliseconds
    Serial.println(millis());

    delay(10);
    
}

Instala el programa cu si no lo tienes instalado. En Debian / Ubuntu sería:

apt-get install cu

Ahora crea este script con el nombre dump0.sh y  dale permisos de ejecución:

#!/bin/bash
cu -l /dev/ttyUSB0 -s 115200
cat </dev/ttyUSB0

Con el squetch subido al Witty y en ejecución, desde una consola en linux ejecuta:

./dump0.sh > data.csv

Pulsa el botón, pasa la mano por delante de la fotoresistencia, es decir prueba el circuito durante unos segundos. Para finalizar cierra el terminal. Habrás generado el fichero data.csv con todos los datos de la ejecución.

Instala el programa SciDavis. Si lo quieres instalar desde los repositorios de Debian / Ubuntu sería:

sudo apt-get install scidavis

Arranca el programa y ejecuta la opción Archivo -> Importar ASCII



Selecciona el fichero data.csv desde el sistema de ficheros y elige el punto y coma como separador.



Se importarán los datos en una tabla. Haz  click con el botón derecho del ratón en las columnas y sustituye los números por nombres significativos desde la opción editar. Asegúrate que las columnas 1,2 y 3 tienen asignado en la gráfica el eje Y de ordenadas y la columna 4 el eje X de abcisas.



Pulsando en la tecla control, pincha en las cabeceras de las cuatro columnas. Deberían que dar todas seleccionadas. Hecho esto seleccionar la opción de menú Gráfica -> Línea.


Deberíamos ver una gráfica similar a esta:


Ahora podemos entender mejor como están evolucionando los valores de nuestro circuito en el tiempo. También es posible realizar un zoom muy rápido y detallado en la zona de la gráfica que nos interese así como saber exactamente qué valores está tomando un punto de la gráfica si utilizamos la herramienta correspondiente. Evidentemente podríamos utilizar cualquier otro programa para representar la gráfica, una hoja de cálculo, por ejemplo, que importan directamente los ficheros con formato csv. El motivo de usar este programa es que está pensado específicamente para el análisis de datos, es muy rápido, maneja bien volúmenes altos de datos, de código abierto, permite realizar zoom sobre áreas muy pequeñas, etc.
Pues esto es todo, espero que os haya servido, y vosotros ¿cómo depuráis? Si tenéis alguna manera diferente de hacerlo por favor, dejadlo en los comentarios.

Acceso al código y ficheros en GitHub:

domingo, 13 de noviembre de 2016

IoT con Witty ESP8266 y Blynk

Vamos a seguir intentando sacar partido a la  placa de desarrollo Witty. Esta vez construiremos un sistema de IoT utilizando esta pequeña placa de prototipado que nos va a permitir controlar todos los elementos que monta utilizando un smartphone conectado a internet. Lo más increible  es que lo vamos a hacer utilizando dos líneas de código y con un resultado espectacular. Para ello vamos a utilizar nuestro Witty y un móvil con Android con la aplicación Blynk.

Primeramente instala la aplicación en tu móvil desde Google Play (o bien desde la App Store si tienes un iPhone). Te pedirá un usuario y una password para darte de alta. Una vez hecho esto accede a la opción de añadir proyecto:



Elige el nombre del proyecto y el tipo de tarjeta que quieres utilizar, en nuestro caso NodeMCU. La pantalla nos informa del token de autorización (en azul). Este token debes conservarlo a buen recaudo y no compartirlo con nadie, ya que con el se podrá acceder por completo a tu proyecto. Para no tener que copiar a mano el token, la aplicación  permite enviarlo a tu correo pulsando el botón E-Mail. Una vez introducidos los datos pulsa el botón Create. Aparecerá una pantalla vacía donde podremos colocar nuestros componentes.



Antes de continuar creando nuestro proyecto en la aplicación, vamos a flashear en el Witty el programa necesario para poder controlarlo desde la aplicación. Para ello, primeramente tienes que instalar en el IDE de arduino la librería correspondiente. Ve a la opción de menú Programas -> Incluir librerías -> Gestionar librerías y busca la librería Blynk.


Instala la librería y a continuación escribe este sketch en el IDE. Modifica las variables de esta manera: asigna a la variable auth el valor del token que ha generado Blynk para tu proyecto y las variables WifiNetwork  y WifiPassword con el nombre de tu wifi y la clave del mismo respectivamente.


#include <BlynkSimpleEsp8266.h>


char auth[] = "valorDelToken";
char WiFiNetwork[] = "miSSID";
char WiFiPassword[] = "miContraseña";


void setup() {
  Blynk.begin(auth, WiFiNetwork, WiFiPassword);
}

void loop() {
  Blynk.run(); 
}

Compila el código y súbelo al Witty desde el IDE. Ten en cuenta que debes configurarlo para utilizar la placa NodeMCU antes de flashearlo.


Una vez hecho esto vuelve a la aplicación Blynk en el móvil y desde la paleta de componentes (se presenta deslizando la pantalla de derecha a izquierda) coloca el componente zeRGBa




Toca encima del componente y aparecerá la pantalla para configurar sus propiedades. Informa los valores igual que en la captura inferior. Para informar los valores, simplemente pulsa sobre las cajas correspondientes.


Regresa a la pantalla y añade el componente Gauge a la misma debajo de la cebra.


Establece sus propiedades de la misma manera que en la captura inferior.



Esto es todo. Ahora pulsa el botón play y tendrás funcionando tu proyecto. Puedes ver el funcionamiento en el vídeo. Los cambios de color no se aprecian demasiado, pero espero que os sirva para haceros una idea.




Acceso al código en GitHub:

domingo, 6 de noviembre de 2016

Hola Mundo en Witty ESP8266

Como es tradición, lo primero que hay que hacer cuando se aprende un lenguaje de programación es el Hola Mundo, que consiste en pintar en alguna parte, la pantalla habitualmente, la frase "Hola Mundo" . En el caso del mundillo Arduino, lo tradicional es hacer parpadear un led (led blinking) El parpadeo de un led es lo más básico que se puede hacer al programar un microcontrolador. En este caso lo vamos a utilizar para probar que todo funciona correctamente en la placa Witty (mini nodemcu) Esta placa incluye un led RGB que podemos utilizar para esta prueba. Lo cierto es que también podríamos haber utilizado el led interno del ESP8266 que está en el pin 2, pero , es muy pequeño, y queda mejor hacerlo con el RGB.


int LED_R = 15;

void setup() {
  
   pinMode(LED_R, OUTPUT);

 }

void loop() {
  
  analogWrite(LED_R, 255);
  delay(500);
  analogWrite(LED_R, 0);
  delay(500);
  
}

El programa es sencillo:
   En el setup se establece el pin asignado al led rojo como pin de salida. En el loop se establece el led al máximo valor,  se espera medio segundo y se apaga el led se vuelve a esperar medio segundo y se repite indefinidamente.

Para flashear el programa utilizaremos el IDE Arduino con la placa NodeMCU 1.0 seleccionada.


El cable USB debe conectarse al puerto micro usb de la placa inferior. Luego desde el IDE, compilar, subir y listo.