Archivo de la categoría: Electrónica

Eliminar el led de las cámaras Blink Indoor

Las cámaras Blink son una opción muy buena para la videovigilancia y permiten colocarlas en cualquier sitio gracias a su tecnología inalámbrica y su reducido consumo. Existen dos modelos: el XT2, que es de color negro y permite colocarla en el exterior a la intemperie; y el Indoor, que es de color blanco y se coloca en el interior de edificios/viviendas.

Cuando van a hacer una fotografía o un vídeo, se enciende un led de color azul que está situado a un lado del sensor de movimiento. Las XT2 tienen un pequeño interruptor en la parte trasera para desactivar esta opción, sin embargo las Indoor no lo tienen. Para mi es un craso error que no puedas desactivar ese led en el modelo Indoor y por eso en este artículo explico cómo removerlo permanentemente.

Aclarar que el proceso aquí explicado puede dañarte a ti o a tu cámara si no lo realizas con cuidado; también este proceso invalida la garantía debido a la manipulación indebida de la cámara. Todo lo que hagas será bajo tu propia responsabilidad y no me hago responsable de absolutamente nada relacionado con ello.

Para abrir la cámara, debes extraer la carcasa que protege la electrónica. Con un destornillador plano puedes ir separando la pieza interna de la externa simplemente haciendo un poco de palanca para ir separando las pestañas:

A continuación hay que desatornillar los 4 tornillos:

Después hay que extraer hacia afuera la pestaña que une las masas de las dos placas de electrónica:

Las dos placas están conectadas por una tira de pines. Sólo tienes que tirar hacia arriba en vertical de la primer placa para separarlas. Después quita los dos tornillos de la segunda placa:

Ahora ya puedes sacar la segunda placa y darle la vuelta. Verás que tiene un diodo llamado D5, este es el diodo que hay que remover, por ejemplo rascando con la uña del dedo pulgar:

Y ya está, ya no molestará más ese led. Ahora hay que hacer el proceso inverso para montarlo todo de nuevo y probar a ver si ya no sale la luz azul del led:

Mantener tus proyectos en hora

Hay muchas veces que necesitas que tu proyecto haga alguna acción determinada en un momento concreto. Lo habitual es hacerlo a través de temporizadores, pero en ocasiones surge la necesidad de hacerlo con respecto a una fecha y hora determinadas. Por eso mismo, en este artículo voy a comentar 4 opciones conocidas y que no hay que pagar por su uso para mantener tus proyectos en hora.

GPS

Los módulos GPS reciben las señales de los 24 satélites que hay en orbita alrededor de la Tierra. La inmensa mayoría de estos módulos tienen una interfaz serie donde se envían comandos NMEA. El comando NMEA más común es el RMC, que entre otras cosas contiene la fecha y hora en UTC, por lo que tendrás que aplicar tu zona horaria.

Cualquier módulo GPS que tenga una interfaz serie sirve, por ejemplo este.

Con Arduino puedes usar la librería tyniGPS++.

Ventajas:

Está disponible en casi todo el planeta.

Desventajas:

La antena del módulo tiene que tener visión directa con el cielo.

RDS

La mayoría de estaciones de radio que emiten en FM envían, mediante RDS, información  de su programación para que pueda ser visualizada en las radios que lo reciben. Hay algunas que también envían información de tráfico y la fecha y hora. Radio Nacional de España tiene en todas sus emisoras un servicio de sincronización horario.

Puedes usar este módulo de Sparkfun para recoger la información horaria. También puedes montarte una placa con un chip TDA7330

Ventajas:

Puede funcionar tanto en exteriores como en interiores.

Desventajas:

Está supeditado a que haya cobertura de radio y que haya emisoras que emitan información horaria en RDS.

DFC77

Es una señal horaria que se envía desde cerca de Frankfurt, Alemania; y cuyo alcance es de 2000 kilómetros, por lo que da cobertura a casi toda Europa:

Puedes usar el módulo de Conrad para poder captar la señal.

Con Arduino puedes seguir estos pasos para utilizarlo.

Ventajas:

Funciona tanto en interiores como en exteriores.

Desventajas:

Sólo funciona en Europa.

NTP

La última opción sólo es posible si nuestro sistema tiene la posibilidad de conectarse a Internet. Existen multitud de servidores NTP, por ejemplo en España está hora.roa.es del Real Observatorio de la Armada.

Puedes usar una shield Wifi, una shield Ethernet o una shield GSM para conectarte a Internet y solicitar la hora a un servidor NTP.

Para programar el Arduino puedes usar como referencia el cliente NTP.

Ventajas:

Obtener la hora de cualquier parte de mundo.

Desventajas:

Tiene que poder conectarse de algún modo a Internet.

Por último, para no estar constantemente preguntando la hora por estos medios, podéis obtenerla cada cierto tiempo y luego almacenarla en un chip auxiliar como el DS1337, el cual, además de guardar y consultar la hora, se le pueden configurar hasta dos alarmas.

Programar el chip wifi ESP8266 como si fuera un microcontrolador (2/2)

En el anterior artículo explicaba cómo generar el toolchain para poder compilar programas y subirlos a nuestro módulo ESP8266. En este artículo explicaré cómo hacer un programa en C. Para ello me voy a poner un reto: un firmware que cuando pulse un botón o la tecla p, haga una llamada a una página web que muestre la acción realizada. Con este ejemplo vamos a trabajar con el gpio, puerto serie, wifi, temporizadores y eventos. No hay mucha documentación sobre cómo programar el chip esp8266 más allá de los ejemplos de código, foros y páginas web con artículos dedicados al chip y de la SDK de Espressif que en el momento de escribir este artículo es la 1.0.1.

Empezaré por mostrar un vídeo de lo que he hecho para tener claro desde el principio lo que explicaré aquí.

Lo que veis en el vídeo es que primero programo el esp8266 con el firmware de este artículo. Luego abro una terminal al puerto serie del ESP8266. Pulso 3 veces el botón físico y otras 3 veces la tecla p en la terminal para que se envíe por el puerto serie. Estas acciones provocan en el esp8266 la llamada a una página web que lo registra, mientras en otra página web se visualiza casi en tiempo real lo que he hecho. Cuando compiléis vosotros el ejemplo podéis usar la misma página para hacer vuestras pruebas.

Este es el esquema del circuito para el botón (he obviado las conexiones al puerto serie para simplificarlo):

placa

Vamos a ver cómo lo hecho. Lo primero es crear una carpeta llamada proyectos-esp8266 en nuestra carpeta personal, entra dentro de esta y crear otra llamada reto. Dentro de esta copiaremos el fichero Makefile que modificamos en el anterior artículo. Después crearemos una carpeta llamada user y dentro de esta compiaremos los ficheros uart.h y uart_register.h del ejemplo de IoT que trae la SDK:

Dentro de la carpeta user crearemos dos ficheros.

user_config.h

user_main.c

Lo primero que salta a la vista es que no existe una función main eso es porque este chip se programa con una función de inicialización y el resto con eventos/interrupciones.

La función de inicialización es user_init (al final del código), como decía esta función es llamada cuando el módulo se enciende y se encarga de inicializar todo en el esp8266. El modificador de función ICACHE_FLASH_ATTR significa que la función se guarde en la flash en vez de en la RAM y que cuando se vaya a usar sea cacheada en esta última, ahorrando así espacio para poder tener más datos en la memoria. Dentro de esta función hay que destacar:

  • system_init_done_cb: Esta función tiene un parámetro que es la función callback que será llamada cuando termine la inicialización.
  • system_os_task: Esta función define la ejecución, como tarea, de la función callback pasada como primer parámetro. Podemos tener hasta 4 tareas (cada una con una prioridad distinta). Más adelante hablaré de ello.

La función inicializado es llamada cuando ha terminado la inicialización como comentába antes. Dentro de esta función hay que destacar:

  • os_printf: Es como el printf de toda la vida, pero su salida es enviada al puerto serie 0 (el esp8266 tiene un puerto serie con tx y rx y otro con tx sólo para hacer debug).

La función inicializa_uart configura el puerto serie. Dentro de esta función hay que destacar:

  • ETS_UART_INTR_ATTACH: Esta función configura a qué función callback se llamará cuando se reciba un caracter por el puerto serie. El segundo parámetro es una estructura que existe por defecto con información del puerto serie y el buffer de recepción, pero yo no lo usaré.
  • PIN_PULLUP_DIS: Desactiva la configuración de pull-up del pin indicado (La lista de pines está en el fichero eagle_soc.h de la sdk), en este caso del pin TX.
  • PIN_FUNC_SELECT: Configura el pin indicado para comportarse de una manera determinada, en este caso para funcionar como TX del puerto serie.
  • uart_div_modify: Configura la velocidad del puerto serie
  • WRITE_PERI_REG(UART_CONF0(0), (STICK_PARITY_DIS)|(ONE_STOP_BIT << UART_STOP_BIT_NUM_S)| (EIGHT_BITS << UART_BIT_NUM_S)): Configura la comunicación como 8 bits, sin paridad y un bit de stop.
  • SET_PERI_REG_MASK(UART_CONF0(0), UART_RXFIFO_RST|UART_TXFIFO_RST) y CLEAR_PERI_REG_MASK(UART_CONF0(0), UART_RXFIFO_RST|UART_TXFIFO_RST): Limpia la FIFO de TX y RX.
  • WRITE_PERI_REG(UART_CONF1(0), (UartDev.rcv_buff.TrigLvl & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S): Configura el disparador FIFO de RX.
  • WRITE_PERI_REG(UART_INT_CLR(0), 0xffff): Borrar el flag de todas las interrupciones del puerto serie.
  • SET_PERI_REG_MASK(UART_INT_ENA(0), UART_RXFIFO_FULL_INT_ENA): Configura la interrupción de recepción del pin RX.
  • ETS_UART_INTR_ENABLE: Activa las interrupciones del puerto serie.

La función inicializa_gpio configura el pin GPIO 2 (el único disponible en el ESP-01, pero en otros módulos hay más pines gpio usables). Dentro de esta función hay que destacar:

  • ETS_GPIO_INTR_DISABLE: Desactiva la interrupción de los pines GPIO.
  • ETS_GPIO_INTR_ATTACH: Esta función configura a que función callback se llamará cuando haya una interrpción en el pin gpio indicado.
  • PIN_PULLUP_EN: Activa la configuración de pull-up del pin indicado.
  • gpio_output_set: Configura el pin gpio 2 como entrada.
  • GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(2)): Borrar el flag de la interrupcion del pin gpio 2.
  • gpio_pin_intr_state_set: Indica que en el pin gpio 2 sólo debe activarse la interrupción cuando detecta un flanco de bajada (conecta con masa/GND).
  • ETS_GPIO_INTR_ENABLE: Activa las interrupciones gpio.

La función inicializa_wifi configura la conexión a la wifi. Dentro de esta función hay que destacar:

  • wifi_set_opmode: Configura el módulo como estación cliente.
  • wifi_station_set_auto_connect: Indica que cuando se encienda el módulo se conecte automáticamente a la wifi establecida.
  • wifi_station_set_reconnect_policy: Indica que si se pierde la conexión con el punto de acceso, la vuelva a restablecer.
  • os_memcpy(&configuracion.ssid, ssid, 32) y os_memcpy(&configuracion.password, password, 64): Copia el nombre de la red wifi y la contraseña a la estructura del tipo station_config. Sirve para copiar datos de una posición de memoria a otra, sería equiparable al memcpy del C.
  • configuracion.bssid_set = 0: Para que conecte a cualquier wifi que tenga el nombre proporcionado anteriormente. Si hay varias wifis con el mismo nombre (SSID) puedes indicar a qué punto de acceso quieres acceder poniendo aquí su BSSID (su dirección MAC).
  • wifi_station_set_config: Inicializa la wifi con los valores proporcionados en la estructura del tipo station_config.
  • wifi_set_event_handler_cb: Esta función configura a que función callback se llamará cuando haya cambios en la wifi (conexión, desconexión, ip recibida…).

La función callback interrupcion_wifi es llamada por el chip cuando un evento en la wifi es generado. Quizá el más importante es cuando recibimos una IP de nuestro router. En el ejemplo pongo una variable a TRUE para indicar que tiene libertad para procesar las pulsaciones del teclado o del botón.

La función callback interrupcion_gpio es llamada por el chip cuando se ha detectado un evento en los pines GPIO. Dentro de esta función hay que destacar:

  • GPIO_REG_READ(GPIO_STATUS_ADDRESS): Devuelve el estado de los pones gpio y cual ha sido el que ha causado el evento.
  • os_timer_disarm: desactiva un temporizador si este estuviese activo.
  • os_timer_setfn: configura un temporizador indicando a qué función callback llamará cuando expire. Se le puede pasar un parámetro (en este caso NULL).
  • os_timer_arm: Activa el temporizador indicando cuanto tiempo dura en milisegundos y si debe o no repetirse. La idea de usarlo es para evitar los rebotes físicos cuando el botón es pulsado.
  • system_os_post: Indica al chip que, cuando pueda, ejecute la tarea de prioridad 0 que predefinimos en la función user_init con los parámetros 0,0.

La función callback boton_pulsado establece una variable a FALSE para indicar que el tiempo dado para mitigar los rebotes físicos del botón ya ha pasado y de nuevo permite reconocer la pulsación de éste.

La función callback caracter_recibido es llamada por el chip cuando se ha detectado un evento en el puerto serie. Dentro de esta función hay que destacar:

  • READ_PERI_REG(UART_INT_ST(UART0): Lee cual ha sido el motivo de la interrupción.
  • WRITE_PERI_REG(UART_INT_CLR(UART0): UART_RXFIFO_FULL_INT_CLR): Borra el bit de la interrupción correspondiente a carácter recibido.
  • READ_PERI_REG(UART_STATUS(UART0)): Lee el estado del puerto serie.
  • READ_PERI_REG(UART_FIFO(UART0)): Lee el caracter propiamente dicho. El chip ya tiene un buffer donde se pueden almacenar los carácteres recibidos, yo no lo he usado pero puede ser interesante.

La función callback conecta es llamada por el chip como una tarea. Inicia el proceso de envío de datos. Dentro de esta función hay que destacar:

  • os_zalloc: Sirve para reservar memoria, sería equiparable al malloc del C.
  • espconn_gethostbyname: Esta función hace una consulta dns para obtener la ip de un host dado y llamará a una función callback. Usa una estructura del tipo espconn donde se rellenarán todos los datos referentes a la conexión TCP

La función callback encontrado es llamada cuando se ha resuelto un nombre de host. Dentro de esta función hay que destacar:

  • espconn_port: Crea un puerto local para poder enganchar el socket con el puerto remoto 80 (http).
  • espconn_regist_connectcb: Esta función indica al chip que cuando se establece una conexión TCP, debe llamar a la función callback definida.
  • espconn_regist_disconcb: Esta función indica al chip que cuando hay una desconexión, debe llamar a la función callback definida.
  • espconn_regist_recvcb: Esta función indica al chip que cuando se reciben datos desde una conexión TCP, debe llamar a la función callback definida.

La función callback conectado es llamada por el chip cuando se establece una conexión TCP. Dentro de esta función hay que destacar:

  • os_sprintf: Sirve para rellenar un buffer con datos formateados, sería equiparable al sprintf del C.
  • espconn_sent: Envía los datos indicados a través del socket TCP.
  • os_strlen: Devuelve la longitud de una cadena, sería equiparable al strlen del C.

La función callback recibido es llamada por el chip cuando se reciben datos de una conexión TCP. En el ejemplo sólo los muestro directamente. Dentro de esta función hay que destacar:

  • os_free: Sirve para liberar memoria, sería equiparable al free del C.

La función callback desconectado es llamada por el chip cuando se desconecta la conexión TCP. En el ejemplo libero los buffers de memoria reservados previamente.

Quiero comentar es que no soy un experto en el esp8266, por lo que si que me preguntáis algo puede que no lo sepa responder, por ello os recomiendo ir a la página www.esp8266.com donde hay mucha gente que trabaja con el esp8266 y os podrán resolver vuestras dudas mejor que yo. Todo lo que he juntado aquí ha sido fruto de búsquedas por internet, mil y una pruebas con código fuente, etc. Sin embargo lo que aquí he explicado, aún siendo de las partes más importantes de la programación de un ESP8266, no cubre todo lo que se puede hacer con este chip, por lo que una vez te encuentres cómodo con lo aquí expuesto, te animo a que busques por tu cuenta más funcionalidades.

Programar el chip wifi ESP8266 como si fuera un microcontrolador (1/2)

IMG_20150504_230102

En esta tanda de dos artículos explicaré cómo olvidarse de los comandos AT del módulo ESP8266 ESP-01 (aunque lo escrito vale para toda la familia ESP) y poder programarlo como un chip independiente: conectando la wifi, manejando el puerto serie, usando los pines GPIO, etc. La gran ventaja es que tenemos un microprocesador más potente, más versátil, más rápido y además en muchos casos es más barato que si usáramos los microcontroladores PIC o AVR (como contrapartida tiene menos pines de E/S).

CONSTRUYENDO EL TOOLCHAIN

El primer paso que tenemos que hacer para programarlo es construir el toolchain para poder compilar los programas para este chip con el compilador cruzado. Para ello recomiendo tener un linux donde construirlo (ya sea físico o virtualizado), no recomiendo usar windows y cygwin. Yo estoy usando el ubuntu 14.04 LTS.

Lo primero es instalar las herramientas necesarias, para ello ejecutar:

Vamos a usar el toolchain de https://github.com/pfalcon/esp-open-sdk, con el que el proceso de creación es bastante sencillo (ejecútalo en la raíz de tu directorio personal):

Esto habrá creado una carpeta esp-open-sdk. Entra dentro de está y haz un make (con el parámetro STANDALONE=y) para crear todo el toolchain (puede tardar un rato dependiendo de tu ordenador):

Ahora vamos a poner en la variable de entorno PATH la ruta a los binarios, ya que el esptool no funciona si no se pone (cambia oscar por tu usuario):

COMPILANDO PROGRAMAS

Vamos a descargarnos unos ejemplos ya hechos:

Esto creará una carpeta llamada source-code-examples. Entra dentro de esta carpeta y edita el fichero example.Makefile.

Modifica las siguientes lineas (recuerda cambiar oscar por tu usuario):

POR

POR

POR

El campo ESPPORT debes cambiarlo si no coincide con la ruta al dispositivo asociado a tu dongle usb a serie.
Ahora entra dentro del direcotrio blinky, copia el fichero anteriormente editado como Makefile y haz un make para compilar el firmware:

Si todo ha ido bien habremos compilado el firmware para nuestro ESP8266:
shell1

PROGRAMANDO EL ESP8266

Para poder programar nuestro módulo ESP8266 necesitamos un dongle usb a serie (USB2TTL) como este:
IMG_20150501_165235
Después es necesario añadir al usuario que estemos utilizando (en el ejemplo, oscar) en el grupo dialout para poder acceder al dongle:

Ahora sólo queda subir el programa al módulo ESP8266, para ello debes cablear el módulo de la siguiente forma (estando éste sin alimentación):
conexiones
Las líneas rojas van a VCC (3,3V) y las negras a GND (masa). Ahora alimenta el módulo.

Si es la primera vez que vas a programar el módulo wifi, debes borrar las configuraciones por defecto, esto se consigue ejecutando el siguiente comando:

shell2
Las siguientes veces ya no será necesario repetir este paso. Si has hecho este paso vuelve a apagar y encender el módulo.

Finalmente para programar el firmware creado, ejecuta el comando:

shell3
Enhorabuena, acabas de programar por primera vez tu módulo ESP8266. Ahora desconecta el cable que va al pin de programacion (así el módulo no estará en modo de programación), conecta un led entre el GPIO 2 (el que no aparece conectado a ningún sitio en la fila de GND de la foto anterior de las conexiones) y masa. Así es como luce el «hola mundo» del chip ESP8266:

En el siguiente artículo explicaré cómo hacer tus propios programas en C para el esp8266.

Elecrab: una startup española

eleCrab

Hay gente que, a pesar de la situación actual, son valientes y se atreven a lanzan startups que marquen una diferencia. En el artículo de hoy voy a comentar el caso de Elecrab. Una empresa muy pequeña cuyo fundador, Jorge M., tiene como objetivo crear algo parecido a Pololu, Sparkfun o Adafruit desde cero.

Jorge, Ingeniero Industrial, tiene una dilatada experiencia en el mundo del hardware abierto, no en vano es uno de los creadores de la placa VinciDuino, escritor de blog del cire y jmnlab,

En su primera incursión en el desarrollo de productos de hardware libre ha creado 4 placas para que, quien quiera adentrarse en el mundo de la electrónica, pueda empezar a experimentar por un precio irrisorio.

Estas placas que a continuación detallaré, están a la venta en tindie, un portal donde la gente que quiera vender sus creaciones lo puede hacer sin tener que crear desde cero un tienda online y donde los compradores pueden buscar productos novedosos de forma sencilla y centralizada.

IMG_20150222_230541

De izquierda a derecha tenemos:

attiny

Una placa con un microcontrolador ATtiny841, cuya principal carácterística es que tiene dos puertos serie por hardware.

 

 

 

ecswicthecSwitch: placa con botón pulsador, y cuya electrónica está diseñada para evitar los famosos rebotes cuando es pulsado.

 

 

 

ecledsecLeds: placa con 4 diodos led.

 

 

 

 

ecpowerecPower: placa para alimentar una protoboard y que puede enchufarse a un puerto micro usb (como los cargadores de los móviles) y que se puede seleccionar si la salida es de 5V. o de 3,3V gracias a un regulador de tensión.

 

 

Estas placas tiene un nivel muy avanzado en cuanto a su producción, ya que por un lado es una empresa china la que fabrica las placas en lotes, y por otro los componentes son soldados usando técnicas empresariales como plantillas (stencils) y soldadura por horno. El acabado es totalmente profesional.

1502222322131455598

Tener un hardware así para iniciarse en la electrónica está bien, pero si no sabemos por donde empezar a utilizarlo de poco nos servirá, por ello en la misma página de Elecrab tenemos unos detallados tutoriales donde se explica desde un principio cómo sacarle provecho a estas placas. Y si nos interesa cómo han sido diseñadas y los motivos por los cuales se han tomado algunas decisiones, puedes verlo más detenidamente en la sección de productos.

Si tienes curiosidad por la electrónica pero no te atreves a adentrarte por su complejidad o tus conocimientos son bajos, esta es una excelente oportunidad de hacerte con hardware libre, barato y completamente funcional para que te sirva como punto de partida en el apasionante mundo de la electrónica.

Programando un Arduino remotamente con el módulo ESP8266

IMG_20141108_002938

Una de mis viejas aspiraciones cuando construyo robots es poder programarlos sin tener que recogerlos, enchufarles un cable usb o un programador ICSP y volverlos a dejar en su sitio.

En este artículo explicaré cómo con un Arduino UNO y un módulo ESP8266 (llamado WI07C) se puede programar un sketch de Arduino en la placa sin tener que estar cerca de esta, todo mediante wifi y sockets tcp/ip.

Descripción general

Como se puede ver en el vídeo tenemos un Arduino UNO conectado a un display HD44780 y a un módulo wifi ESP8266. Arduino envía cadenas hello world al servidor sockettest que está escuchando por el puerto 49000. Se modifica el código Arduino en el IDE poniendo hello folks, se compila y el fichero .hex generado (se puede ver donde está activandolo en Archivo/Preferencias/compilación) se copia a la carpeta del programa en python. Cuando Arduino recibe un comando reboot se conecta al servidor python por el puerto 50000 entrando en modo de datos, acto seguido se reinicia y empieza la programación remota de Arduino. El proceso se reliza dos veces en el vídeo.

Lo que se aprovecha es el método que tiene Arduino para programarse, ya que usando el puerto serie después de un reset se puede programar un Arduino si se sigue el protocolo STK500 implementado en el bootloader.

Esquema de conexiones

esquema

El Arduino y el display HD44780 se alimentan a 5 voltios, el módulo ESP8266 se alimenta a 3,3 voltios. Como el pin rx del módulo wifi sólo puede funcionar a 3,3V se usa un diodo zener de 3,3 voltios junto con una resistencia de 100 Ω.

En las placas Arduino, el pin de reset del microcontrolador está conectado a una resistencia y esta a su vez está conectada a VCC, con lo que para el microcontrolador el pin está a nivel alto. Cuando se pulsa el botón de reset lo que se hace es derivar la corriente hacia masa (ya que el bóton está conectado a esta) y el microcontrolador, al estar a nivel bajo el pin de reset, realiza un reseteo. Cuando el microcontrolador arranca, todos los pines están configurados como entradas (alta impedancia) y por eso no le afecta que el pin de reset esté conectado directamente al pin 12. Si se configura el pin 12 como salida y luego se conecta a masa (nivel bajo o LOW) se provoca el mismo efecto que si se pulsase el botón de reset, además, al existir la resistencia anteriormente mencionada, no hay que preocuparse de que se produzca un cortocircuito al unir VCC con masa (GND).

Sketch de Arduino

Lo que hace el skecth de Arduino es:

  • Inicializa el puerto serie a 115200 bps.
  • Elimina los caracteres que hubiera en el buffer de entrada del puerto serie.
  • Inicializa el módulo wifi en modo estación, lo resetea, se conecta al punto de acceso normal, configura las conexiones como simples en modo normal y se conecta al servidor normal por el puerto 49000. Si hubiese algún fallo en algún punto pararía la ejecución y lo indicaría en el display.
  • Envia una cadena de texto y un número consecutivo tanto al servidor como al display. Si hubiese algún fallo en algún punto pararía la ejecución y lo indicaría en el display.
  • Si entre el envío de las cadenas de texto se recibe una cadena reboot entonces resetea el módulo, se conecta al punto de acceso bootloader, configura las conexiones como simples en modo normal y se conecta al servidor de programación por el puerto 50000. Acto seguido envía una cadena hello y espera a recibir una cadena welcome, si ha sido así, entonces envía el nombre del fichero .hex con el que quiere ser programado el Arduino y espera a recibir una cadena ok, momento en el cual configura el pin 12 como salida y lo pone a nivel bajo, conectándolo a masa y provocando un reset en el Arduino. Si hubiese algún fallo en algún punto pararía la ejecución y lo indicaría en el display.

Aquí cabe destacar cómo funciona el sistema de reseteo: Justo después del reseteo, el pin de TX de Arduino está a nivel bajo durante un tiempo, lo que provoca que el módulo wifi vea eso como un byte 0, que enviará a través de la conexión TCP/IP. El servidor de programación aprovechará esta circunstancia para saber cuando ha empezado el reseteo e iniciar el protocolo STK500. El bootloader de Arduino entra en acción después del reseteo y espera a recibir ordenes del protocolo STK500, si las recibe actúa en consecuencia, si no, ejecuta el programa principal.

Servidor de programación

Lo que hace el servidor de programación es:

  • Crea un socket que escuche por el puerto 50000
  • Cuando un cliente de conecta espera a la cadena hello, si la recibe reponde con una cadena welcome.
  • Espera a que el cliente le envíe un nombre de fichero .hex. Trata de abrir el fichero en el mismo directorio y lo lee interpretando todas las líneas para guardar los datos del programa en memoria. Si todo va bien envía una cadena ok.
  • Espera a recibir el byte 0, y cuando lo recibe empieza el protocolo STK500 para comunicarse con el bootloader de Arduino y programarlo. Básicamente lo que hace es entrar en modo de programación, indicarle a que páginas quiere acceder y enviar los datos de cada página, así hasta que ha enviado todos los datos del programa, después sale del modo de programación cerrando la conexión

Aquí cabe destacar que cuando se cierra la conexión TCP/IP con el cliente (ya sea por un error o porque el proceso de programación ya ha terminado), el módulo ESP8266 sale del modo de datos automáticamente y no es necesario que el nuevo sketch tenga que enviarle la cadena de escape +++ para poder entrar otra vez en modo de comandos.

Conclusiones

Espero que esto os sirva para que en vuestros proyectos podais programar remotamente vuestros Arduinos a través de una red local o Internet.

Habría que tener en cuenta que el proceso de actualización puede quedarse a medias si la conexión a la red wifi es lenta y provocaría que el programa no se ejecutara correctamente. Así que que una mejora sería acoplar un chip aparte que reprogramase el Arduino por ICSP con un programa preestablecido en caso de que detectase que la programación no fue finalizada correctamente.

Comentar que la versión de firmware del módulo ESP8266 que he usado es la 0019000902 y el Arduino es un UNO. Ambos funcionan a 115200 bps, pero si quisierais utilizar otras velocidades (en otros Arduinos el bootloader configura el puerto serie a 19200 o 57600 bps) habría que cargar un firmware que lo permitiese, como por ejemplo la versión 0.922 de electrodragon y su comando AT+CIOBAUD.

Probando el módulo wifi ESP8266

Últimamente en el mundo DIY se está hablando de un módulo wifi barato y potente que está basado en el chip ESP8266.

esp8266

El precio de cada unidad está en alrededor de 5$ y es capaz de comunicarse más allá de los 300 metros usando la antena que viene incorporada en la placa.

Yo he comprado una pareja por menos de 10$ en aliexpress, y en este artículo voy a comentar cómo hacerlo funcionar.

Lo primero que hay que indicar es que funciona a 3,3V. y lo segundo es que se comunica mediante el puerto serie que tiene el módulo. Por ello no se puede conectar directamente a un Arduino que funciona a 5 voltios, así que necesitareis convertir las líneas TX, RX y la alimentción a 3,3V.

El módulo tiene 8 pines repartidos en 2 filas. El esquema de conexiones es este:

conexiones
Hay varias versiones del módulo. En las más recientes será necesario que el pin activar esté puesto a VCC (o una salida digital a 1) para hacerlo funcionar.

Para probar el módulo he usado un conversor usb a serie que funciona a 3,3V. Sin embargo el módulo puede llegar de consumir unos 200mA en algunos momentos por lo que lo he alimentado aparte con un regulador, eso si, uniendo siempre las masas.

montaje

Me he conectado por putty a 115200 bps al puerto serie de conversor y acto seguido he dado alimentación al módulo, con lo que sale el primer mensaje indicándonos que está preparado:

putty1

Todo el comportamiento del módulo se basa en comandos AT, por lo que vamos a inicializarlo con:

putty2El siguiente paso es configurar el tipo de wifi. Para este ejemplo lo configuraré como estación (que es como está por defecto):

Lo siguiente será mostrar una lista de las wifis disponibles:

putty3

Me conectaré a SISTEMASORP con la clave que tengo:

Ahora comprobamos qué IP me ha dado el router:

putty4Eso significa que hemos conectado con éxito y que ya tenemos una IP.

Mi siguiente paso ha sido crear un script php muy simple en mi servidor web que muestra la cadena Hola seguida de la fecha actual. El objetivo es hacer una llamada al servidor web, hacerle una petición http y que este nos devuelva la cadena mencionada.

Para ello debemos configurar el módulo para que haga una sola conexión (aunque se pueden hacer hasta 5 simultáneas):

Conectamos al servidor web mediante un socket TCP por el puerto 80:

Le indicamos cuántos caracteres le vamos a enviar:

Esto nos mostrará un símbolo >, donde le meteremos la cadena a enviar. Para el ejemplo seguiremos los siguientes pasos en el putty:

  • Copiamos y pegamos GET /prueba.php HTTP/1.0
  • Pulsamos CTRL+M y CTRL+J
  • Copiamos y pegamos Host: sistemasorp.es
  • Pulsamos CTRL+M y CTRL+J y otra vez CTRL+M y CTRL+J

Si todo ha ido bien recibiremos una respuesta +IPD con el número de bytes recibidos, la cabecera http del servidor y la cadena esperada:

putty5

El protocolo http especifica que el socket debe ser cerrado después de enviar la respuesta, por eso vemos un Unlink, si en otro caso queremos cerrar nosotros la conexión, debemos usar el comando:

Hay más funcionalidades que se pueden usar con los comandos AT, aquí una lista de ellos.

Espero que con este ejemplo os sirva para empezar a dar uso a estos módulos wifi tan baratos y funcionales.

Actualización 09/10/2014:

Si se desea enviar y recibir datos en bruto, es decir, sin tener que mediar con la cantidad de bytes del comando AT+CIPSEND y la respuesta IPD, podemos activar el modo de datos con el siguiente comando:

Y cuando queramos enviar y recibir datos, lo hacemos con CIPSEND sin poner los bytes a enviar:

Así entramos en el modo de datos y todo lo que recibe el módulo por el pin RX lo envía por wifi y todo lo que recibe el módulo por wifi lo envía por el pin TX. Para salir de este modo hay que esperar 1 segundo sin enviar nada, enviar la secuencia de escape formada por 3 símbolos más +++ y esperar otro segundo sin enviar nada, momento en el cual volvemos a entrar en el modo de comandos. Este vídeo que he grabado muestra esa funcionalidad:

En el vídeo por un lado tengo el putty conectado al módulo y por el otro creo un servidor con netcat en el puerto 9000. Cuando entro en modo de datos escribo en la ventana putty Hello, cosa que se ve reflejada en la ventana de netcat. Acto seguido escribo Welcome to ESP8266 en la ventana de netcat y pulso enter (si no netcat no envía nada), para a continuación mostrarse en la ventana de putty. Finalmente copio y pego la secuencia de escape +++ para salir del modo datos al modo comandos (hay que hacerlo rápido, ya que escribiéndolo directamente no me ha salido).

Encender petardos y cohetes con Arduino y Android

Creo que a estas alturas todos hemos visto cómo se encienden petardos y cohetes: simplemente acercando la llama de un mechero a la mecha de estos y la magia de la pólvora hace el resto.

En este artículo voy a explicar cómo hacer el mismo proceso pero de una forma más segura, y por supuesto más tecnológica.

1402682187170

Pero antes unas reglas básicas:

  • Los petardos y los cohetes son peligrosos, por eso se cauteloso cuando los manejes.
  • No enciendas un petardo o un cohete en la mano ni cerca de ti, de otras personas o animales.
  • No molestes a la gente encendiéndolos en zonas residenciales ni en horarios intempestivos.
  • Muchos municipios tienen prohibido el uso de material pirotécnico en toda su zona metropolitana.
  • El hilo de nicrom alcanza temperaturas elevadas, cerciorate que no pasa corriente por él cuando lo estés manejando.
  • Las baterías de litio son peligrosas, sigue las instrucciones de seguridad que las acompañan.
  • Usa cableado que permita un valor de corriente en amperios mucho mayor que lo que va a consumir el sistema.

Este artículo es meramente divulgativo y no me hago responsable de cualquier incidencia que pudiera ocurrir si lo pones en práctica, por tanto si lo llevas a cabo será bajo tu propia responsabilidad.

La idea es encender la mecha de petardos o cohetes desde un móvil Android, tal y como se puede ver en el siguiente vídeo que grabé para la demostración:

El esquema de los componentes es el siguiente:

esquema

Empezamos por una batería LiPo de 3 celdas (11,1 V.) que será la encargada de la alimentación del conjunto. Todo el cableado está pensado para corrientes de 10 A, pero puede diferir según tus necesidades.

Seguimos con un fusible de 10A, que será el que corte la corriente si se produce un cortocircuito (por ejemplo en el caso de que debido a la explosión de un petardo se unieran directamente los terminales VCC y GND que sujetan el hilo de nicrom).

A continuación está el hilo de nicrom. Este cable, que tiene muy poca resistencia (2,2 Ω en mi caso), se pone al rojo vivo cuando pasa una corriente a través de el. La velocidad a la que se calienta depende del voltaje que se aplique, lo normal suele ser alrededor de los 12 voltios. Este hará las veces de encendedor de la mecha, ya que puede llegar a los 300º C. Se puede adquirir en cualquier tienda de electrónica o reciclarse de un secador de pelo o de una tostadora.

Después viene un transistor mosfet de canal N, que será el interruptor que hará que el hilo de nicrom se encienda o se apague. Hay muchos tipos de mosfet de canal N, por lo que nos interesa uno que pueda ser usado con microcontroladores con lógica TTL (como el de la placa Arduino). Yo he usado el STP55NF06L con encapsulamiento TO-220 ¿por qué?, pues en la hoja de características podemos verlo:

El Vds es de 60 V. Como voy a usar 12 V. Tengo más que de sobra.

El Id es de 55 A. Según la ley de Ohm, La fuente de alimentación de 12 V. partido por la resistencia del hilo de nicrom con 2,2 Ω nos dá que se consumen unos 5 A. Igualmente tengo mucho margen.

El Vgs(th) minima es de 1V. Eso significa que cuando el voltaje es menor que 1V el circuito está abierto y que por encima de esto cerrará el circuito dejando pasar la corriente. Ideal para el Arduino que trabaja con 5 V.

La Rds(on) máxima es muy baja: 0,020 Ω. Esto significa que prácticamente el mosfet no se calentará con la corriente con la que le hagamos trabajar (5 A. * 5 A. * 0,020 Ω = 0,5 Watios)

La gráfica Id/Vds indica que con 5 V en el pin Gate del mosfet, podemos conducir una tensión de 12 V. con una carga de mucho más de 120 A. Como sólo tenemos unos 5 A. tenemos más que suficiente.

idvds

Como se trata de un mosfet de canal N, el pin Source (3) tiene que ir a masa y el pin Drain (2) tiene que estar conectado a la carga. El pin Gate (1) tiene que estar conectado a Arduino, que será quien le dirá si tiene que estar abierto o no. Además entre la conexión del Arduino y Gate hay una resistencia de 10K que va a masa directamente, esto es para que:

  • La puerta lógica no quede flotante y su estado esté indeterminado (pudiendo activar el nicrom antes de tiempo), por lo que si el pin de Arduino esta puesto configurado como entrada (al arrancar siempre está asi) el Gate esté conectado a masa (0 V. o LOW).
  • Debido al caso anterior, cuando el pin de Arduino está configurado como salida y pone la entrada a 5 V. (o HIGH), la resistencia de 10K hace que no haya cortocircuito con masa.

Proseguimos con la placa Arduino, cuyo programa se puede descargar de aquí. La placa está alimentada también desde la batería LiPo, ya sea directamente a los pines Vin y GND o a través del conector de alimentación. Unido a Arduino está un módulo Bluetooth HC-06 que será el encargado de comunicarse con el móvil.

Finalmente en el móvil, que tiene que tener el sistema operativo Android, hay que instalar la aplicación ArduDroid desde la Play Store, que con su interfaz sencilla podemos manejar los pines de Arduino directamente.

Screenshot_2014-06-16-13-37-04

Probando mOwayduino

Esta semana he recibido el robot mOwayduino. Este robot se financió en una campaña de indiegogo, y aunque no alcanzó su objetivo, si se comprometieron a enviar lo pedido. La empresa española Bizintek Innova es la que está detrás del desarrollo y producción de este producto. El objetivo de este robot es el de enseñar robótica en colegios e institutos, pero también hace las delicias de cualquier aficionado.

IMG_0827IMG_0828

El microcontrolador que tiene es un ATmega 32u4 (el que usa por ejemplo Arduino Leonardo)  y tiene una lista de sensores y actuadores interesante:

  • 2 motores con encoder
  • 4 sensores infrarrojos anticolisión
  • 1 sensor de luz direccional
  • 2 sensores optoreflectivos infrarrojos para el suelo
  • LED superior RGB
  • LED frontal
  • LEDs rojos traseros
  • Acelerómetro de 3 ejes
  • Micrófono
  • Altavoz
  • Módulo de Radio Frecuencia para comunicación inalámbrica basado en nRF24L01+ (se pueden comunicar entre ellos)
  • Batería LIPO recargable por USB

Además tiene una ranura de expasión para ampliar funcionalidades mediante bus SPI. Se venden módulos por separado para usar esta ranura con una cámara o WiFi.

Se puede programar con el IDE de Arduino o con Scracth (y Python, aunque no he encontrado su librería para este).

La caja que envían contiene el propio robot y un cable USB para cargarlo y para enviarle los programas. El robot ya viene precargado con un programa que detecta obstáculos y los evita haciendo sonar su pequeño altavoz y encendiendo sus leds.

Para cargar nuestros programas voy a comentar qué pasos hay que seguir:

Lo primero es decargarse el IDE de Arduino (en el momento de escribir este artículo la última versión es la 1.0.5).

Después hay que irse a la página de moway-robot para descargar el software.

A continuación en la instalación de éste nos preguntará en qué carpeta está Arduino para instalar los drivers, librerías y ejemplos.

instalacion

 

Una vez finalizada la instalación ya podemos enchufar el robot mOwayduino en el puerto USB. Nos lo detectará como USB IO board y nos pedirá los drivers. Estos están ubicados dentro de la carpeta drivers de Arduino. Si todo ha ido bien nos saldrá un dispositivo llamado Mowayduinoi bootloader. Fijarse en qué puerto COM le ha asignado Windows.

driver

Ahora arrancamos el entorno de Arduino y abrimos cualquiera de los ejemplos que trae en el menú Archivo/Ejemplos/Mowayduino.

Para subir el programa a nuestro robot, primero hay que irse al menú Herramientas/Tarjeta y seleccionar Mowayduino, después hay que irse al menú Herramientas/Puerto Serial y elegir el puerto COM que nos ha dado antes en la instalación del driver, finalmente ir al menú Archivo y seleccionar la opción Cargar para subir el programa al robot.

Por ejemplo vamos a modificar ligeramente el programa para que el robot se mueva por un recinto cerrado y que empiece cuando oiga un chasquido de dedos. El resultado es este:

Y este es el programa:

La documentación con todas las funcionalidades está en la carpeta mOwayduino que instala el programa en Archivos de Programa.

123D de Circuits.io

Si quieres hacer diseños de pcb sin tener que instalarte ningún software en tu máquina, en la empresa belga Circuits.io puedes hacerlo a través de tu navegador. Los circuitos que hagas serán públicos para que otras personas puedan usarlo como hardware libre (pagando puedes tener tus circuitos privados para ti). Incluso puedes importar tu diseños de Eagle. También puedes adquirir las placas hechas de tus circuitos o los de otras personas.

Pero quizá la parte más interesante es que se han aliado con Autodesk para traer 123D. (a continuación…)

Se trata de una nueva forma de diseñar circuitos con una protoboard y poder simular su funcionamiento, de hecho también puedes incluir en esos diseños un arduino y programarla online para ver qué resultado obtienes cuando simules el circuito. Los circuitos pueden ser diseñados en colaboración con otras personas a la vez. En el propio diseño también puedes acceder a la lista de materiales que has usado para poder comprarlos en digikey, mouser, newark o element14.

Sólo tienes que darte de alta en su web y empezar a crear tus circuitos, simularlos y si todo va bien hacer que los fabriquen.

Creo que es un método interesante para probar y crear tus propias PCB sin tener que tener nada de hardware al alcance de tu mano.