jueves, 27 de octubre de 2016

Enviando y Recibiendo Órdenes del WIFI ESP8266

En la entrada anterior no recibíamos información de nuestro arduino, solamente le mandábamos órdenes por web y leíamos la información por el puerto serie del arduino que estaba conectado a nuestro pc por USB.
En este caso usaremos el putty. Un terminal archiconocido por todos, para enviar y recibir información de nuestra placa mediante el ESP.


Así que sin más dilaciones empezamos.

NOTA: El cable del Arduino Uno al PC por USB mantenerlo conectado para poder ver los mensajes que se reciben en el puerto serie del Arduino y además porque es el que alimenta nuestra arduino. Aunque funcionaría sin él, pero no podríamos ver los mensajes del puerto Serie y tendríamos que alimentar de forma externa nuestro arduino Uno.
Más adelante desconectaremos el USB y alimentaremos el arduino de manera externa.

(No hagais como yo, que no me di cuenta del pequeño detalle de que desconectando el USB el arduino quedaba sin corriente y por eso no funcionaba).

Abrimos putty y establecemos la conexión con el ESP


















Dependiendo de la versión de firmware de vuestro módulo al abrir la conexión desde putty en la ventana serie del arduino puede apareceros la palabra link, connect, etc... a mi el putty se me queda en negro a la espera de introducir comandos y en el arduino me aparece CONNECT.
El 0 que se ve es que es un número de conexión automático. Para responder, como veremos más adelante es necesario darle este número de conexión para que responda a la conexión adecuada.






Si mandamos desde el putty cualquier comando... ejemplo "123456", aparecerá en la ventana serie del arduino.





Estos mensajes son mensajes que podemos reconocer con nuestro programa de recepción y se puede usar para activar acciones en Arduino.

Para establecer una conexión desde Arduino deberemos usar el comando:

AT+CIPSTART=0,"TCP","192.168.0.61",80

Que le indica a nuestro módulo WIFI que inicie una sesión TCPIP por el puerto 80 con la IP especificada que corresponde a mi Putty, vosotros deberéis poner la dirección de vuestro PC o tableta.

EN REALIDAD la conexión se inició automáticamente, cuando Putty se conectó al servidor y por eso nos podríamos haber ahorrado este comando, pero si somos nosotros quienes iniciamos la conexión debemos darlo irrevocablemente.

Realmente, lo que se necesita para mandar mensajes desde el terminal serie hacia putty es el comando, siempre y cuando esté abierta la conexión es:

AT+CIPSEND=0, N

Donde 0 es la sesión abierta en automático y N es la longitud del mensaje a enviar, y después podemos enviar el mensaje: "MENSAJE". Y como una imagen vale más que mil palabras...










Al introducir el comando AT+CIPSEND=0,10 el terminal se queda esperando que se introduzca el mensaje, y como está definido en 10 caracteres, a partir de ahí se corta y solo se envían los 10 primeros como se ve de respuesta en el arduino.





Enviando órdenes a nuestro ESP8266

En entradas anteriores dejamos lista la parte web para poder interactuar contra nuestro servidor en la raspberry. Se preparó una interfaz web en django y se servía con Apache para poder interactuar con nuestras arduino.
Para hacer las pruebas posteriores, en django, en un template cualquiera de prueba simulé un botón de prueba con un link, por ahora suficiente para comprobar que el sistema base funciona bien. Debajo teneis un par de imágenes con la página y la URL que tiene añadida.










Principalmente hay que recordar dos ideas básicas muy importantes de estos pequeños módulos y es que primeramente estos módulos son capaces de albergar un pequeño servidor web, por lo que son capaces de recibir órdenes desde cualquier punto de la red local en forma de petición web, del estilo htttp://ip_wifi_esp012/parametrosAenviar

De ahí que en el href pusiera href="http://192.168.0.207/P13"
El párametro /P13 lo entenderá el Arduino Uno pues lo tendrá incluído en su código para activar y desactivar el Led de pruebas de la placa.

Es muy importante esta cuestión y lo que simplifica mucho las cosas, ya que son capaces de lo que reciben transmitirlo al puerto serie y pasárselo al arduino el cuál tomará decisiones en función del código.

Otra idea importante que sale a la luz es que al estar conectada a nuestra wifi particular es muy simple enviarle órdenes desde cualquier dispositivo, incluso pudiendo enviarlos sin estar en casa, mediante una vpn, etc. pero este capítulo por ahora no nos concierne.



La imagen anterior corresponde a un ESP07 soldado a pelo, y la imagen de debajo una pequeña mejora con una placa conversora para poder pincharla en una protoboard.



Voy a recordar las conexiones que tenemos hechas de entradas anteriores, y voy a volver a explicar un poco lo que tengo montado por si hay algún rezagado o da pereza mirar entradas anteriores. 

Lo que se ve en la imagen anterior es un conversor de 220v a 5v, y a la salida de este un regulador de tensión regulable puesto a 3,3v porque es el voltaje que deben recibir los módulos ESP012. En realidad lo he puesto a 3,4v por si oscila para que no baje de 3,3v, ya que si baja de 3,3v (lo sé por experiencia haciendo pruebas), los módulos juegan malas pasadas, se desconectan, etc, etc, etc. 
El regulador a 3,3v lo tengo conectado a la protoboard donde tengo pinchado en ESP de la siguiente manera:

GPIO015 a GND.
GPIO00, GPIO02, CH_PD a Vcc(3,3v).
TX a Tx del módulo Arduino Uno. (Lo modificaremos después por software).
RX a Rx del módulo Arduino Uno. (Lo modificaremos después por software).
GND Esp a GND protoboard.
Vcc ESP a Vcc protoboard(3,3v). 

No es necesario pero recomendable ir conectando los cables en el orden que los he descrito. Si no funciona al final de conectar todo, teneis un pin de reset en el arduino que lo debereis pinchar a masa y luego soltarlo para resetear el ESP. 

Otro detalle importante es puentear el GND de la placa de arduino con el GND del ESP. Para esto cruzar un cable como se ve en la fotografía en negro de la protoboard al arduino. Si no se hace puede ser perjudicial para la salud de los aparatos.

Como vemos el ESP y el Arduino se comunican a través del puerto serie, son las únicas conexiones que los une directamente. 

Otra opción podría ser dejar libre el puerto serie por hardware del arduino y conectar a otros pines digitales diferentes el Tx y Rx del ESP para dejar libres los hardware del arduino, que es como lo haremos. 
Tx del ESP al pin 3
Rx del ESP al pin 2

El Arduino Uno está conectado por USB al ordenador y hay un par de cosas que deberemos hacer para poder ver lo que está haciendo el ESP.

Primeramete subimos al arduino Uno el siguiente sketch:



Luego abrís la consola del puerto serie y configurarla de la siguiente manera:
Ajuste de Línea ponerlo como "Both NL & CR". IMPORTANTE! Sino no funcionará.

Baud en principio ponerlo a 11520, y si no funciona probar 9600 u otras, cada módulo es un mundo.

Si todo ha salido bien, el módulo debe devolver un "READY" tal y como muestro en la imagen de a continuación. Si hay problemas, el módulo devuelve basurilla u otra cosa diferente probar a pinchar el RST del ESP a GND durante un segundo y soltarlo para que reinicie el módulo. Si el problema persiste probad a diferentes velocidades.


Ya estamos en disposición de empezar a jugar con el módulo, conectarlo a la WIFI, mandarle comandos, ver información, etc.

Haré una breve lista ordenada de los comandos que nos interesan a nosotros para nuestra tarea.
  • Reiniciar el módulo: AT+RST
  • Confirmar que el módulo está operativo: AT
  • Modo trabajo como cliente: AT+CWMODE=1
  • Escanear redes al alcance: AT+CWLAP
  • Acceder a una red inalámbrica: AT+CWJAP="SSID","Password"
  • Consultar la IP del módulo: AT+CIFSR
  • Permitir múltiples conexiones: AT+CIPMUX=1
  • Arrancar el servidor web en el puerto 80: AT+CIPSERVER=1,80
Sabiendo estos comandos ya podemos trabajar. Podeis consultar más en la página del módulo.

 El servidor web de cada módulo, recordemos que tiene sentido para enviarle las peticiones desde nuestro proyecto web y que se las pase al arduino por puerto serie, con el fin de que arduino interactúe con diferentes sensores o actuadores. 

En este momento, si abrimos un navegador o desde nuestro proyecto de django presionamos en el botón ON/OFF, vemos como se ilumina el led del Arduino Uno y se apaga.




Si lo queremos hacer desde el navegador.

Y esta es la respuesta que obtenemos en la consola serie del arduino. Cada vez que se produce una petición el códido del arduino identifica el parámetro "P13" que le enviamos y lo enciende o lo apaga, sacando por la consola el mensaje "Invirtiendo pin 13".
Mientras no se cierra la conexión, no aparece el mensaje de CLOSED, pero si se pasa el timeout o se detiene la conexión en el navegador lanza el mensaje de CLOSED.



Si quisiéramos manejar más señales que P13 bastaría con añadir al código del arduino fragmentos de este estilo: