Conectando Arduino a la WiFi (II)

En el post anterior me quedé en el conexionado del prototipo de lo que va a ser mi futura estación remota. Una vez completada la parte de conexión le toca el turno al software. Voy a empezar con un sketch muy sencillo que adapté mínimamemte de uno obtenido de Internet. La idea es ir probando los comandos AT.

El sketch es el siguiente:

image

Inicialmente establezco la velocidad de comunicación con la consola y con el módulo ESP8266 a 115200 baudios, inicializo la consola serie y el módulo. El proceso es sencillo, si hay caracteres disponibles en uno de los dispositivos (consola o módulo WiFi) los leo y los escribo en el otro módulo.

Lo primero que hago es buscar la documentación del módulo y veo que se encuentra disponible online en GitHub, en concreto aquí.

Conecto el arduino con el cable USB

Imagen3

Aparecen caracteres extraños, los comandos AT funcionan (aparentemente) pero la salida que se ve en la consola, en algunos casos, no se entiende.

Investigo un poco más y encuentro varias pistas para resolver el problema. Al parecer hay dos problemas:

  1. El módulo ESP8266 utiliza niveles de 3,3V y el Arduino los niveles lógicos que emplea son de 5V por lo que es necesario adaptarlos. Probé poniendo un potenciómetro de 10K Ohmios en la línea de transmisión de Arduino al ESP para reducir la tensión a 3,3V y, aparentemente funciona pero, lo que no se puede hacer con resistencias es aumentar la tensión de 3,3 a 5V. Al final, lo que hice fue comprar un convertidor de niveles lógicos (menos de 3€) y me quito el problema de encima.
  2. La segunda parte del problema tiene que ver con el módulo SoftwareSerial de Arduino. Al parecer, no soporta velocidades de transmisión elevadas así que lo que voy a hacer es reducir la velocidad de transferencia hasta que funcione correctamente.

Aprovechando que me acerqué a la tienda de electrónica para comprar el convertidor de niveles lógicos, me compré un Arduino Nano. El esquema del nuevo circuito es:

ESP8266-2_bb

ESP8266-2_schem

Y el aspecto que tiene en la realidad es:

image

Una vez verificadas las conexiones estoy listo para comenzar a tirar comandos AT para probar las capacidades del módulo ESP. La documentación del ESP8266 se encuentra aquí y el manual con el conjunto de comandos AT soportados se puede descargar de aquí (documento pdf).

Tras repasar someramente el manual (leerme el índice) voy a empezar a probar algunos comandos AT. Lo primero que voy a hacer es restaurar la unidad a los parámetros de fábrica (comando AT+RESTORE). El resultado es, obviamente, que deja de funcionar. Probablemente, al restaurar los parámetros de fábrica la velocidad de comunicación se resetea a 115.200 baudios. Por lo tanto, lo que hago es retocar el sketch de Arduino y volverlo a arrancar.

Aparecen caracteres raros en el display así que voy a reducir la velocidad de transmisión a 57.600 baudios. Para ello, lanzo el comando:

AT+UART_DEF=57600,8,1,0,0

Los parámetros son 57.600 baudios, 8 bits de datos, 1 bit de parada, sin paridad (0) y sin control de flujo (0). Tengo que volver a cambiar el sketch para la nueva velocidad.

image

Cargo el nuevo sketch, y una vez descargado al Nano desconecto y conecto la fuente de alimentación a la que tengo conectado el ESP. El resultado es el siguiente:

image

Lo que voy a hacer a continuación es comprobar la versión, conectarme a la WIFI doméstica y verificar que estoy conectado:

  • AT+CWMODE=1. Para establecer el modo estación.
  • AT+CWJAP=”essid”,”passwd” para conectarme a la WiFi doméstica.
  • AT+CIFSR para averiguar la dirección IP asignada.

imageimageImagen8

Al parecer estoy conectado. Voy a comprobar si hay ping tanto dentro de mi red doméstica como en Internet:

image

Parece que hay ping, vamos a ver si responde a ping …

image

Hasta ahora todo correcto, en el siguiente post seguiré avanzando en el setup de comunicaciones.

Anuncios

Conectando Arduino a la WiFi (I)

Una vez decidido a arrancar mi proyecto IoT y, habiendo decidido que la interconexión entre los distintos dispositivos va a implementarse sobre WiFi, necesito ver la forma de conectar los microcontroladores Arduino a la red inalámbrica.

Explorando un poco por Internet descubro que uno de los módulos WiFi más empleados y con más referencias es el ESP8266. El ESP8266 es un sistema en chip (SOC) que tiene integrada la pila de protocolos TCP/IP y que proporciona acceso a la WiFi a los controladores. Este módulo permite, al microcontrolador, externalizar toda la carga de la comunicación. Sin más investigación previa, me decidí a comprar una unidad en mi proveedor habitual (Amazon) su precio (8€ puesto en casa) me pareció adecuado y su funcionalidad, de acuerdo a lo leído, más que apropiada.

image

Lo que más me sorprendió al recibirlo fue su pequeño tamaño. Quitando el espacio dedicado a las conexiones, no es más grande que la uña del dedo pulgar:

image

Una vez recibido, me propongo conectarlo para empezar a hacer pruebas pero, leyendo más en internet, descubro que recomiendan que la unidad no se alimente desde el pin del Arduino UNO ya que, al parecer, si se hace de este modo, se producen cortes en la comunicación con el microcontrolador. Por lo tanto, decido comprar una placa para una fuente de alimentación externa. En este caso se trata de una WINGONEER MB102 3.3V/5V (6,99€ puesta en casa en Amazon).

image

Configuro los jumpers para que dé una salida de 3,3V, la conecto a una fuente de alimentación y compruebo la salida con un polímetro verificando que el voltaje de salida es adecuado. Todo está OK y tengo los materiales necesarios para montar la placa del prototipo. Aquí están en una foto de familia:

image

Voy a proceder a realizar las conexiones. El esquema de pines del módulo ESP8266 es como sigue:

image

Las conexiones a realizar son:

ESP8266 Breadboard/Arduino
GND GND
TXD Pin 3 Arduino
CH_PD 3,3V
VCC 3,3V
RXD Pin 2 Arduino

En algunos sitios recomiendan no conectar directamente TXD y RXD a los correspondientes pines de Arduino. Las salidas de Arduino son de 5V y el ESP8266 funciona a 3,3V. Inicialmente, voy a emplear dos potenciómetros de 10KOhmios para hacer de divisores de tensión. La prueba no funciona y la unidad, como funciona es conectada directamente a los pines del Arduino.

Lo que sí es importante es que todas las masas estén conectadas para tener una referencia común del voltaje.

El esquema queda como sigue:

ESP8266_bb

ESP8266_schem

Reviso las conexiones una vez más y procedo a conectar un cable USB al Arduino y la fuente de alimentación a la placa de alimentación de la placa del prototipo.

image

En el siguiente post entraré con el software.

Mini estación meteorológica

Después del éxito del termómetro me he venido arriba y he decidido montar una mini estación meteorológica que me de lecturas de temperatura, presión barométrica y humedad relativa.

Además quiero que me dé las máximas y mínimas de estos parámetros y que presente la información en un display LED de 16 columnas y 2 filas (casi ná).

En principio, parece sencillo, conectar el display y los sensores, leer los valores de los sensores y presentar esos valores, con el formato apropiado, en el display.

Adicionalmente, por medio de un botón, mi  estación deberá poder ir cambiando la presentación de valores actuales a valores máximos y de aquí a valores mínimos.

Empecemos por la lista de materiales:

  • Un Arduino UNO.
  • Una placa de prototipo.
  • Un display LED de 16 columnas y dos filas (TC1602A-09T):

Imagen1

  • Un potenciómetro de 10K Ohmios para controlar el contraste del display:

potentiometer-10k-chiosz-robots-3

  • Un sensor de temperatura y presión barométrica BMP180:

bmp180-barometric-pressure-temperaturealtitude-sensor

  • Un sensor de humedad DHT11:

DHT11

  • Un botón para el cambio de modo de display:

00097-03-L

  • Cables, etc.

La siguiente tabla recoge las conexiones realizadas:

Origen

Destino

VSS display GND
VDD display +5V
V0 display Pin central potenciómetro
RS display Pin 7 Arduino
RW display GND
E display Pin 8 Arduino
D4 display Pin 9 Arduino
D5 display Pin 10 Arduino
D6 display Pin 11 Arduino
D7 display Pin 12 Arduino
A display +5V
K display GND
Pin izda. potenciómetro GND
Pin dcha. potenciómetro +5V
Botón +5V
Botón Pin 4 Arduino
SCL BMP180 Pin A5 Arduino
SDA BMP180 Pin A4 Arduino
VCC BMP180 +3.3V
GND BMP180 GND
SIG DHT11 Pin 5 Arduino
VCC DHT11 +3.3V
GND DHT11 GND

El esquema de conexionado es como se representa en los siguientes diagramas:

meteo_bb

meteo_schem

Y el aspecto que tiene es el de la imagen siguiente:

SL270261

El código está en GitHub junto con las hojas de especificaciones de los componentes empleados.

Un termómetro

Llevaba un cierto tiempo sin publicar nada pero no estaba parado. Estaba explorando las posibilidades de un Arduino UNO. Lo cierto es que es divertido pasar un rato conectando cables y programando el cacharrito.

Ayer me puse y construí un termómetro digital. Desde luego, no es un prodigio de la tecnología y no supone ningún avance rompedor para la humanidad pero le hago un hueco aquí, más que nada, porque parte de la información necesaria no fue fácil de conseguir.

El objetivo a cubrir era sencillo: leer la temperatura ambiente a través de un sensor de temperatura y presentarla en un display LCD. Los materiales que he empleado son:

  • En primer lugar, he empleado una placa Arduino UNO de Kuman que venía en un kit que compré en Amazon.
  • He usado una placa de pruebas (breadboard) que venía en el mismo kit que el Arduino.
  • Para obtener la temperatura he empleado un sensor de temperatura LM35 (hoja de especificaciones en pdf), como el de la imagen siguiente:

LM35TempSensor

  • Para presentar la temperatura he empleado un display LED de cuatro dígitos con ocho segmentos cada uno 3641BS (hoja de especificaciones en pdf), como el de la imagen siguiente (bueno, el que yo tengo es de ánodo común en lugar del de la imagen que es de cátodo común):

7seg-pinout-annotated_1500

  • Cuatro resistencias de 220 Ohmios para proteger el display LED.
  • Cables y otra parafernalia para conectarlo todo.

El esquema de conexionado es el siguiente:

temp_sensor_2_bb

temp_sensor_2_schem

La identificación de los distintos segmentos de cada uno de los dígitos del display es como se ve en la imagen siguiente:

digitos

En la tabla siguiente detallo las conexiones realizadas:

Pin Arduino

Pin 3641BS

Descripción

2 11 Segmento A del dígito.
3 7 Segmento B del dígito
4 4 Segmento C del dígito
5 2 Segmento D del dígito
6 1 Segmento E del dígito
7 10 Segmento F del dígito.
8 5 Segmento G del dígito.
9 3 Segmento de punto decimal (DP) del dígito.
10 12 Dígito 1 del display.
11 9 Dígito 2 del display.
12 8 Dígito 3 del display.
13 6 Dígito 4 del display.

Finalmente, la pata de voltaje de salida del sensor de temperatura la conecté al Pin A0 del Arduino. El lío montado es el siguiente:

Imagen3

Ahora llega el momento de tirar código, voy a ir pegando las porciones de código (como imágenes) para irlas comentando. El código actualizado del sketch está aquí.

En primer lugar, declaro una serie de constantes:

code_1

code_2

Señalar que la constante SYMBOLS empareja el estado de los segmentos de los dígitos del display (de la A a la G) con los símbolos que se van a representar en ese display (los 10 números y la letra C). Ojo, el valor 0 indica que el segmento debe estar encendido y el 1 que el segmento debe estar apagado (cosas de trabajar con ánodo común).

La función setup, que realiza la inicialización del Arduino es sencilla, se inicializan los pins para los segmentos y los dígitos del display LED.

code_3

La función loop, característica de los sketches de Arduino, hace dos cosas:

  1. Obtiene la temperatura.
  2. Presenta la lectura de la temperatura.

code_4

getTemperature lee el sensor y convierte la lectura (un valor entre 0 y 1023) en voltios (en un rango de 0 a 5). La tensión de salida es, de acuerdo a las especificaciones del sensor, una función lineal de la temperatura (en concreto 10mv por ºC). La función devuelve el valor de la temperatura como un valor float:

code_5

displayTemperature presenta la lectura de la temperatura en el display LCD.

En el display voy a emplear los tres primeros dígitos para presentar, respectivamente, decenas de grados, unidades de grados y décimas de grados separadas de las unidades por un punto decimal. El cuarto dígito lo voy a emplear para presentar la letra C. Por ejemplo, la lectura de temperatura se presentaría como 25.4C.

El proceso para presentar la temperatura es el siguiente:

  • Determino los tres dígitos de la temperatura. Para ello tengo que convertir el número en coma flotante a dos enteros (uno para la parte entera y otro para los dos primeros dígitos de la parte decimal). A continuación aproximo si fuera necesario.
  • Una vez que tengo los tres dígitos a presentar voy activando los dígitos del display LED en secuencia introduciendo un delay entre cada dígito. Esto lo hago en un bucle. Los dígitos deben presentarse en secuencia porque las líneas de los segmentos están multiplexados. Si no lo hiciera así todos los dígitos del LED presentarían un mismo número.
  • Este bucle se ejecuta en aproximadamente en un segundo y una vez finalizado se vuelve a leer la temperatura.

code_6

code_7

Por último vamos a ver la función displaySymbol que presenta un símbolo (número o letra C) en un determinado dígito del display. La función displaySymbol admite tres argumentos, el primero es el dígito en el que vamos a presentar el número (0 a 3), el segundo es el símbolo a presentar y el tercero indica si se va a presentar el punto decimal que está a la derecha del dígito.

Tras unas comprobaciones de rango, lo que hacemos es poner a LOW todos los pines de dígitos (apagando los LEDs) de los dígitos que no son el que queremos presentar. El dígito que se va a presentar se establece a HIGH. A continuación encendemos los segmentos correspondientes al número a presentar de acuerdo a la plantilla establecida en la variable global SYMBOLS. Por último, encendemos o apagamos el punto decimal.

code_8

code_9

El resultado final es: