miércoles, 17 de febrero de 2016

Nodemcu escapar de un Bucle.

Ponte que un día estas probando nuevas ideas con Nodemcu y creas un while do en apariencia inofensivo,

local a = 3
local i = 0

while a < i do
i = i+1
end

Y para rematar lo guardamos y compilamos en el Nodemcu,.. Ya es tarde para resolver la que acabas de liar.

El nodemcu ha quedado "brikeado" ya que al llamar el init.lua ejecuta un while del que jamas saldras, aunque escribas la flash el maldito init.lua continua en la flash.

Solución:

Usando el flashseador del chip tenemos que rescribir las siguientes posiciones de memoria  0x7E000 y 0x7C000. Usando el nodemcu-flasher nos dirigimos a la segunda pestaña y añadimos las lineas

  • INTERNAL://BLANK | 0x7E000
  • INTERNAL://DEFAULT | 0x7C000
Tras flashear estas 2 direcciones el archivo init.lua queda sobrescrito y podemos volver a utilizar nuestra placa.

miércoles, 10 de febrero de 2016

Monitorizar temperatura con Nodemcu + lm35

Hace poco empece a trabajar con Nodemcu por que la relación calidad/precio puede adaptarse mejor a algunos proyectos que Arduino.

Vamos a empezar explicando un proyecto simple sobre Nodemcu: Capturar la temperatura y enviarla a thingspeak.com que podemos adaptar sin problemas a nuestras necesidades

¿Por que thingspeak.com y que es?


thingspeak.com es básicamente en recolector de datos para los IoT con un API accesible y que nos ayuda a ver como realizar acciones mas complejas, El api soporta GET y POST, en este ejemplo nos vamos a realizar las peticiones en POST. Así que para continuar vamos a realizar los siguientes pasos.


  • Registrare en thingspeak.com.
  • Crea un Canal en Channels -> New Channel.
  • En el Field 1 le asignamos un nombre cualquiera.
  • Una vez generado todo entramos al canal y nos dirigimos a API Key -> Write API Key y la copiamos.
Ya tenemos generado nuestro canal que almacenara la información recibida por el sensor, nos podemos centrar en muestro código.

Yo suelo utilizar Atom como IDE ESPlorer para cargarlo al Nodemcu. Recordar que para que el Nodemcu "lea" el archivo al iniciar este tiene que llamarse init.lua


Esquema Fisico


Misterio 0, el lm35 va directo al A0 y alimentado al 3V


Funciones paso a paso


Lo primero es declarar las "variables globales" para que sean fácilmente localizables.Es importante comentar que vamos a describirlas como objetos diferentes ya que cada una se ejecutara como una funcion,Las funciones no te permiten usar libremente variables declaradas aquí o allá, pero sirve para organizar e independizar el código 

Conexión


Vamos a realizar la conexión a la wifi y seria la espina dorsal de nuestro scritp ya que resolución condiciona a el resto.
 function conectar(SSID, PASSWORD, HOST)  
     wifi.setmode(wifi.STATION)  
     wifi.sta.config(SSID, PASSWORD)  
     if wifi.sta.status() == 5 then  
       print("Conectado IP: " .. wifi.sta.getip())  
       tmr.alarm(0, 600000, 1, function()  
         socket = net.createConnection(net.TCP,0)  
         socket:connect(80,HOST)  
         socket:on("connection",function(sck)  
         local post_request = generar_datos(HOST)  
         sck:send(post_request)  
         end)  
       end)  
     else  
       print("Error de Conexion")  
       tmr.alarm(0, 60000, 1, function() conectar(SSID, PASSWORD, HOST) end)  
     end  
 end  

La función conectar trae del gobal el nombre del ssid, la contraseña y el host a que enviaremos el Post.

Una vez iniciado seleccionamos el modo STATION y le pasamos la configuracion de acceso a la red Wifi, Una vez realizado, comprobamos el estado de la conexión.

Si genera algún error, esperamos 1 minutos y volvemos a probar.
En caso de conectar mostramos por el serial la IP asignada y le damos 5 minutos para lanzar el post.

Bien una vez listo abrimos un Socket a la IP de thingspeak al puerto 80, una vez el Socket esta "conectado" llamamos a la cabecera HTML con los datos del POST (mas abaja la explicamos) y lo enviamos por el socket y listo.

Esto lo realizamos para no "bombardear" el servidor con datos ya que el Nodemcu por defecto ejecutara un LOOP de todo el código.

Temperatura


La temperatura temperatura (en celsius) es una formula sobre los registros del puerto (A0)

 function Temperatura()  
   local r = adc.read(0)  
    local c = r * 285 / 1024  
   return c  
 end  

Leemos el Analógico 0, la formula de conversión y devolvemos el resultado, así de simple


Generar POST



Aquí tenemos que preparar la cabecera HTML y preparar la llamada POST

 function generar_datos(HOST)  
   API_KEY = "api_key"  
   temperatura = Temperatura()  
   YO = wifi.sta.getip()  
   print("Temperatura"..temperatura.."C\n")  
 -- Preparamos el POST  
   data_post = "api_key="..API_KEY.."&field1="..temperatura  
 -- Lanzamos el POST  
   cabecera_post = "POST https://"..HOST.."/update HTTP/1.1\r\n"..  
    "Host: "..YO.."\r\n"..  
    "Connection: close\r\n"..  
    "Content-Type: application/x-www-form-urlencoded\r\n"..  
    "Content-Length: "..string.len(data_post).."\r\n"..  
    "\r\n"..data_post  
    return cabecera_post  
 end  

Paso por Paso, declaramos nuestra API KEY creada en thingspeak.

  • Almacenamos temperatura (calculada en su función)
  • Almacenamos nuestra IP para la cabecera HTML
  • Formateamos los datos POST, en este caso enviamos la llave y el campo uno, si por ejemplo fueran 2 campos añadiríamos &field2=DATO
  • Creamos la cabecera HTML lo mas importante a comentar es el Content-Length que lo calculamos con el string.len (por ello formateamos y almacenamos el POST anteriormente)
  • Listo devolvemos la petición ya formateada.

LISTO, con esto ya estamos comunicando los datos correctamente y el servidor realizara la recolección y muestra.

El ejemplo completo lo puedes encontrar Aqui

sábado, 13 de septiembre de 2014

Servidor Nabaztag : Primeros conceptos y ordenes.

Bien, anteriormente montamos a nuestro nucleo y conectamos nuestro conejo .. pero no hace nada. Ahora empezaremos a "hacer" cosas.

Conceptos Base

Aunque me repetiré, lo considero importante.
Nabaztag simplemente consulta cada 30 segundos, al archivo //servidor/vl/p4.php , las consultas las realiza a través de un GET  (ante la duda ... el access.log de apache), vamos a analizar que transporta el GET.

Para orientarnos extraeré una registro del access.log y comentare los campos:



/vl/p4.php?sn=0013d3849772&v=65802&st=1&sd=0&tc=7fffffff&h=4

Bien ahora analizaremos la informacion ofrecida:

  • sn: es el numero de serie de nuestro conejo, es importante ya que es su identificador unico para futuras aplicaciones o acciones.
  • v : es la versión, recordaros que teníamos los V1 y los V2.
  • st : estado , siempre es 1 en los registros que e realizado.
  • sd : registra las acciones externas (orejas y botón) es el mas importante para registrar interacción externa, ya hablaremos con mas profundidad de el.
  • tc : yo lo denomino como estado de respuesta, ya modifica cuando esta en modo sueño , inicia sesión o activo. 
  • h : siempre es 4, no se que es ... XD.
adicionalmente tenemos un parámetro mas que solo apararece cuando lee una tarjeta RFID
  • rf : indica la MAC de la tarjeta RFID
Estos son los datos de transporta las llamadas del conejo y con ellos realizaremos las distintas interacciones.

Ordenes a Nabaztag

Sabemos que nos trae el conejo , ahora hablaremos de lo que "lee" ya que el equipo conecta a la url y esta "si existe acción" indica una respuesta. 

Vamos a indicar las que conozco y como actúan. 
  • BOTTOMCOLOR : determina el color de la base, una vez indicado no cambia hasta nueva orden o reinicio, el nombre de color tiene que ser en minúsculas.
    • ejemplo: BOTTOMCOLOR Red
  • LED1 / LED2 / LED3 / LED4 : inicia el led con el color determinado (por si solo no hace nada necesita un WAIT .. pero ya profundizaremos en ello.). Los nombres tienen que ir en MAYUSCULA.
    • ejemplo : LED1 RED WAIT 1000
  • EARSUP : sube las orejas del conejo. Se aplica tal cual.
  • EARSDOWN : baja las orejas del conejo. Se aplica tal cual.
  • LEFTTWITCH : mueve la oreja izquierda, tenemos que indicar cuanto la mueve.
    • ejemplo : LEFTTWITCH 5
  • RIGHTTWITCH : mueve la oreja derecha, tenemos que indicar cuanto la mueve.
    • ejemplo : RIGHTTWITCH 6
  • DOTAICHI : hace taichi. Se aplica tal cual.
  • WAIT : espera * mili-segundos a la siguiente acción.
    • ejemplo WAIT 1000
  • FINISH : Termina una sentencia este donde este (actúa como un break). Se aplica tal cual.
  • PLAY : reproduce un Mp3 del servidor (es muuuy sibarita con esto ya explicare por que).
    • ejemplo : PLAY ./media/broad/bienvendia.mp3
  • STREAM : repdoruce una radio-online ... pasa como con el PLAY.
    • ejemplo : STREAM http://url_radio_online/stream.mp3
Estas son lar ordenes que comprende el nabaztag y tienen que ir localizadas en p4.php limpias, etiquetas, notas, csv ... hace que no las ejecute.

Por ello si quieres probarlas , el primer ejercicio seria tan simple como :

<?php
echo 'BOTTOMCOLOR Red';
?> 


Con este código cambias la base a color rojo (tambien puedes probar Green, Blue, Yellow, White, Teal, Violet).

Así con un poco que sepas de php puedes empezar a dar vida a tu conejo, pero no os preocupéis, pronto colgare ejemplos de lo que hace el mio y lo simple que es. 

viernes, 12 de septiembre de 2014

Conectando Nabaztag a nuestro Servidor

Ayer hablamos de como crear el "nucleo" del servidor usando los archivos de nabaztaglives y la función de estos , hoy vamos a conectar al conejo a nuestro servidor.

Materiales necesarios.

ademas del conejo propiamente dicho, necesitamos un equipo con Wifi para crear entrar a una red Ad-Hoc y un router Wifi (en WAP o WEP pero no en WAP2).

Una vez listo los material , con el conejo apagado pulsamos el botón superior y lo conectamos a la red eléctrica (sin soltar el botón), las luces centrales quedaran azules indicando que la red Ad-hoc esta lista.

Bien ahora tenemos que buscar la red generada (NabaztagXX), una vez dentro con el DHCP activo nos dirigiremos a la Ip 192.168.0.1

Pantalla de presentación
1. Seleccionamos nuestra red , protocolo de encriptado y clave 
2. Una vez seleccionado al final incluimos la Ip del servidor (los Nombres no les gusta)
Con estos simples pasos tenemos el conejo listo para enlazar con el servidor , ahora hablemos de las luces e referencia según estos pasos.


  1. Creando la red Ad-hoc: se encontrara con los led de color azul.
  2. Configurado : los led serán naranjas y pasaran a verde hasta apagarse.

Cazando errores

Vamos a hablar de los errores que e detectado y como los e solventado (tengo 3 conejos) así explicaremos como hacer frente a los errores típicos.

  • Tras configurar el conejo ese se queda con todos los led naranja : Este error significa que no conecta a la red , comprueba la configuración y si esta bien en muchos foros te dirán que actualices... 
    • Truco: Tengo la mala costumbre de no actualizar las cosas a lo loco, primero busco otra posible solución, en este caso en concreto encontré que la configuración la carga por una petición GET y modificando esta petición es mas seguro que la configuración por menú. así que os dejo la petición con los datos prepararos para una red WAP/WAP2.
    • http://192.168.0.1/b.htm?w=-&k=nombre_de_la_red&m=2&n=clave_de_la_red=Update+and+Start&l=0&f=1&g=0.0.0.0&h=0.0.0.0&i=0.0.0.0&j=0.0.0.0&c=0&d=0.0.0.0&e=0&a=ip_servidor.
    • Pegando esta petición en el navegador, dentro de la red del conejo (modificando los parámetros) siempre me conecta, adicional mente os marco el m=2 que signfica que es WPA (m=1 WEP)
  • Tras configurar el conejo pasan los led a verde y parpadea : es simple conecta la red pero no al servidor, comprueba que la ruta vl esta en el raid y la ip configurada en este y en el local.jsp.
Y con esto el conejo se encontraría en vuestro server , próximamente acciones básicas. 

jueves, 11 de septiembre de 2014

Reviviendo a Nabaztag

Buenos días,

Llevo una temporada con  material que pasar al blog pero por falta de "tiempo & ganas" la verdad es que no e podido.

Pero aprovechando unos días libres quiero subir los "manuales" que estado preparando estos meses sobre los proyectos que e empezado , tanto como referencia personal o para cualquiera que se aventure por los mismos caminos.

Hace años ... pero años compre un Nabaztag que decía la hora, el tiempo y 4 cosas mas, no controlaba nada critico pero hacia compañía, como un reloj de pared, hasta que un día cerraron los servidores y paso a ser un gato de escayola.

Desde entonces esta impasible como un guardia de roca, de vez en cuando buscaba alternativas a los servidores oficiales, pero nada me convencía ... hasta hace unos meses que encontré nabaztaglives.

Ya sea por mi falta de conocimiento en Java (es mas bien escasa) o por el echo de que le no atinaba pie con bola nada me había convencido pero nabaztaglives esta en Php, algo que si entiendo y puedo moverme ... pero antes de seguir aclaremos puntos.

¿Que es Nabaztag?

Nabaztag es un "conejo" fabricado por Violet , una empresa francesa que termino cerrada, aya en el 2011, y como todo servicio apoyado en la red, si muere la empresa, muere el producto,

Centrándonos en el equipo se trata de un conejo-fantasma que se conecta por Wifi y realiza peticiones GET y POST al servidor cada 30 segundos. Ademas cuenta con un botón en la parte superior, orejas que se mueven interactivas y un lector RFID (ISO/IEC 14443 Type B), un led inferior de 7 colores y 4 led centrales de 5 colores, ademas de un altavoz y un micrófono.

El funcionamiento es simple, el equipo ni almacena ni sabe, solo espera ordenes del servidor y las ejecuta dentro de sus posibilidades.

¿Por que nabaztaglives?

Simple y directo, instalado nabaztaglives cuentas con en servidor estándar (contiene las voces originales en varios idiomas) y en 2 pasos lo tienes listo ... pero vamos a ir un poco mas , vamos a usar lo básico para crear nuestro propio servidor y aumentar las posibilidades del equipo, ademas de aprender que siempre viene bien.

Preparando el "núcleo"

Primero lo primero, bajamos el paquete alojado en sourceforge.
Este es el código en el que el autor aun continua trabajando, despacio pero continua (Animo!!).

Este paquete pesa alrededor de los 65 mb y es que contiene todos los sonidos en varios idiomas, como comentamos anteriormente queremos crear uno desde lo mas cercano a 0  así que vamos a quedarnos lo imprescindible para hacer que el conejo enlace y espere ordenes.

Archivos de conexión 

vamos a hablar cronológicamente de los archivos requeridos por el conejo (equipo) para así conocer paso por paso como actúa.

 Una vez configurado en conejo (lo veremos en el próximo articulo) el conejo busca el archivo "locate.jsp" y "bc.jsp" ambos tienen que encontrarse en la misma carpeta , esta la busca el conejo.
  •  locate.jsp : Contiene la IP del equipo servidor , esto puede ser por que se utilizaba un balanceador y según la saturación de la maquina se redirija a uno o otro , tiene que ser la ip de red publica o red local , pero no la ip local (127.0.0.1) , el Ipv6 no lo traga.
  • bc.jsp : Binario no tocar.

Archivos de acción 

Una vez conectado e indicado la maquina que realizara de servidor el conejo empezara su tarea consultiva.

Importante:  El conejo una vez negociado con "localte.jsp" Siempre, siempre buscara la ruta //servidor/vl , nada de sub-rutas que se lía y adiós muy buenas. Aqui dentro solo consultara 2 archivos "p4.php" y "record.jsp".

  • p4.php : Es el cerebro, donde nabaztag siempre va a consultar que pasa ahora y donde vamos a picar todo el código para poder actuar con el , vamos que todos los problemas vienen derivados de este archivo y lo que gestione. 
  • record.jsp : En nabaztaglives ya nos informan que no lo usan, en mi caso solo se que se activa al hablarle y envía una petición POST, poco mas por ahora. No es necesario tenerlo para que funcione pero me parece interesante mencionarlo.

Y con solo estos archivos tendríamos listo al conejo para esperar instrucciones, así de simple.

En breve comentare como conectar a nuestro servidor y los comandos básicos de Nabaztag.

jueves, 27 de marzo de 2014

Game & Watch : Desde 1980 a la actualidad

Hoy , tras 3 meses de espera por fin me ha llegado mi Game & Watch del club Nintendo ,que se suma a mi humilde colección.


Verla y jugarla nos recuerda como fue el inicio del mundo consola , alejándolos de los aparatosos teclados ofrecidos por las computadoras de la época y simplificando al mínimo los controles.

Esta filosofía , que es la base del  videojuego de consola (Nintendo demostrando en 1984 que todo se podría hacer con con 2 botones y Sega en 1991 que lo podía simplificar a 1) se ha ido desvirtuando con en varias ocasiones en la historia pero siempre se manteniendo esta idea que nos desmarca de los juegos de PC.

34 años , si señor , desde que Gumpei Yokoi unos de los verdaderos padres de este mundo , diera a la luz el primer juguete interactivo que con una investigación posterior nos llevo al emblema del mundo portatil la Game boy .... como lamentamos tu perdida.

Pero volviendo al indice que lo que me gustaría comentar sobre el donde venimos y donde vamos , esas cosas es magnifico cuando las ves con retrospectiva.

Y por que digo esto , bueno todos sabemos que la historia del mundo de la electrónica en general es igual que la historia humana pero increíblemente mas rápido y 30 años podría compararse desde el descubrimiento del fuego a la fecha actual. Solo que una sola vida es capaz de observarla.

Mas de una vez hemos odio que la historia es cíclica que los sucesos vuelven a repetirse , ya sea por que no aprendemos o por que olvidamos , siempre que pienso en ello mas bien creo que la historia se recicla intentado mejorar una acción pasada.

Un ejemplo para esta idea la vivo en mi día a día , mi trabajo requiere mucha inventiva y normalmente no tienes tiempo para mirar atrás ,  siempre construyendo algo nuevo para cubrir una necesidad nueva , pero un día te da por frenar y ver que has creado , en ese momento se te cae la cara de vergüenza y te dedicas a sacar la 2.0 del mismo en tus ratos libres , la historia actúa de manera parecida.

Nitendo 3DS(2011) Vs Donkey Kong 2(1983)
Game Boy Micro (2004) Vs Balls (1981)

Entre estos equipos tenemos unos 23 o 28 años de diferencia y pese a que la foto lleve toda mi mala intención afirma que mi teoría de que la historia se recicla esta presente , ya que creamos para avanzar y en algún momento de nuestro avance con nuevas herramientas y conceptos nos da por mirar hacia atrás y encontramos esa idea vieja que de base no andaba mal y solo tenemos que quitarle el polvo y aplicarte todos lo nuevo que aprendimos.

Que "bonico" es el mundo de los videjuegos que nos hace replantearnos temas tan profundos ... voy a intentar conectar mi Game & Watch a la wifi....

miércoles, 19 de marzo de 2014

Ipega PG-9017 , configurado en N64

Hace un momento veíamos como sincronizar el mando , pero para no dejar una configuración inicial en el tintero vamos a ponerlo en practica.

Tenemos multitud de emuladores en la tienda de GooglePlay , me gustaria ir discriminando los que mejor resultado me han ofrecido para crear una lista de los mas útiles , pero eso requiere tiempo y esto no saldría a la luz hasta ufff.

Por ello vamos a echar un vistazo rápido a uno de los emuladores que mas me ha gustado y una de las configuraciones mas tediosas el mando de N64.

¿Por que el mando de N64?
Cuando hablamos de configurar un mando , tenemos que tener claro donde están los botones , pero si alguien lo quiere rebatir es la Jaguar o la N64 (la primera no tiene emulador).

Vamos a usar RetroAch
RetroAch es uno de los mejores emuladores que he tenido en Linux , ahora también lo uso en windows y como no cuando lo vi para android no dude en lanzarme.

RetroAch cuenta con grandes características entre ellas  , que puede emular desde la nes a la N64 (pasando por megadrive y PSX) formidablemente y eso que aun estan trabajando en el.

La configuracion es simple.
Una vez instalado el emulador nos dirigimos a Settings y dentro de este buscamos la pestaña Input

Una vez dentro tendremos la posibilidad de Mapear cualquier boton  , unicamente tenemos que seleccionar el boton deseado (en el emulador no el fisico) , pulsar Detect y pulsar el botón físico. En caso de no querer tener ese botón activo, pulsaremos Unbind.


Con esta simple guía podemos configurar todas las consolas con mandos lógicos pero nos centraremos en N64.

Para ello veamos el mando antes.


Aparte de los botones que se ven , cuenta con un boton Z en la parte de atrás a eso le sumamos que si queremos jugar con el analogico  el pad digital y el boton L quedan excluidos para el uso , es una de las maravillas del mando de N64 , el echo de que usar el analógico o digital condiciona la vida de algunos botones.

Por ello y tras darle unas vueltas os recomiendo la siguiente configuración.

*Los analógicos se auto detectan y el Start y Digital son los mismo en ambos casos
Los botones C se consideran un analógico.

Boton Fisico Boton Emulador Boton en N64
Boton A A button Boton A
Boton B L1 button Gatillo L
Boton X B button Boton B
Boton L L2 button Gatillo Z
Boton R R1 button Gatillo R

¿Por que esta configuración?
Como comentamos antes el analogico hace que el boton L se pierda , asi que gana preferencia el boton Z que al no estar declarado usa la misma llamada digital que el Boton L2 asi que si lo vemos desde el Ipega lso botones principales del personaje son A y X , los gatillos L y R  y por si fuera necesario llamar el Gatillo L original lo tenemos alado del A , puedo jugar cómodamente a todos los juegos de N64.