Como dije en la anterior entrada, existen dos librerías pero para el proyecto utilizaré la Librería ESP8266 para Arduino .
Podéis encontrar también un entrono IDE con el ESP8266 integrado en Arduino IDE for ESP8266, por si a alguno le interesa. Pero para esto no hace falta andar cambiando de IDE.
Como primera prueba voy a controlar un servo a través del ESP8266.
En este caso no voy a conectarme a una router wiffi, Esto es importante para poder controlar el sistema desde internet o para poder desplazar un sistema a lo largo de una red wifi, pero en muchos casos lo que podemos necesitar es controlar el equipo de forma local desde un ordenador o un movil. Bien para mover un robot o para recoger datos puntuales de un sistema.
En este caso, no necesito que el sistema esté unido a un router, sino que el sistema funcione como punto de acceso diréctamente.
Por ello, lo que haré es crear un punto de acceso con el ESP8266, al que se podrá acceder y conectar con un ordenador o un móvil. Crearemos a su vez un servidor en el puerto 23, para trabajar en telnet.
Una vez hecho esto podremos enviar comandos diréctamente al arduino, a nuestro gusto. En este caso usaré una palabra clave "POS:" para enviar el comando de posición del servo. Igualmente a esto podremos construir los comandos que deseemos para nuestras aplicaciones y contestar con los valores que creamos convenientes.
Ahora para no complicar las cosas simplemente usaré el ordenador y un terminal para conectarme y mandar el comando en forma de comando escrito. Más adelante, realizaré una versión para control con el android.
El programa usando la librería dicha anteriormente resultan muy simple:
Configuraré el punto de acceso con el nombre "ESP8266" y la clave "awesomelib".
El proceso es muy simple. Abrimos el ESP como estación AP con setAPConfiguration.
Creamos un Servidor en puerto 23.
Y en el loop, leemos lo recibido, y si comienza por "POS:", convertimos en número el resto de la cadena y lo pasamos como parámetro al write del servo.
Configuraré el punto de acceso con el nombre "ESP8266" y la clave "awesomelib".
El proceso es muy simple. Abrimos el ESP como estación AP con setAPConfiguration.
Creamos un Servidor en puerto 23.
Y en el loop, leemos lo recibido, y si comienza por "POS:", convertimos en número el resto de la cadena y lo pasamos como parámetro al write del servo.
CONTROL SERVO POR ESP8266.ino
/* Copyright (C) 2015 José Ángel Moneo Fernández
Servo controlado por ESP8266
created 03 de abril de 2015
by José Angel Moneo
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <SoftwareSerial.h>
#include "ESP8266.h" #include <Servo.h> Servo myservo; SoftwareSerial esp8266Serial = SoftwareSerial(10, 11); ESP8266 wifi = ESP8266(esp8266Serial); int pos = 0; int ESP_on = 12; //Pin conectado a la habilitación del ESP8266 int Pin_servo=2; void setup() { Serial.begin(9600); // ESP8266 esp8266Serial.begin(9600); pinMode(ESP_on, OUTPUT); //Activo el ESP8266 digitalWrite(ESP_on, HIGH); wifi.begin(); wifi.setTimeout(2000); // getVersion char version[16] = {}; Serial.print("getVersion: "); Serial.print(getStatus(wifi.getVersion(version, 16))); Serial.print(" : "); Serial.println(version); /****************************************/ /****** WiFi commands ******/ /****************************************/ // setWifiMode Serial.print("setWifiMode: "); Serial.println(getStatus(wifi.setMode(ESP8266_WIFI_ACCESSPOINT))); // setAPConfiguration Serial.print("setAPConfiguration: "); Serial.println(getStatus(wifi.setAPConfiguration("ESP8266", "awesomelib", 10, ESP8266_ENCRYPTION_WPA_WPA2_PSK))); wifi.restart(); // setMultipleConnections Serial.print("setMultipleConnections: "); Serial.println(getStatus(wifi.setMultipleConnections(true))); // createServer Serial.print("createServer: "); Serial.println(getStatus(wifi.createServer(23))); myservo.attach(Pin_servo); } void loop() { // read data unsigned int id; int length,pos; int totalRead; char buffer[128] = {}; if ((length = wifi.available()) > 0) { id = wifi.getId(); totalRead = wifi.read(buffer, 127); if (length > 0) { String entrada(buffer); if (entrada.startsWith("Pos:")) { pos=entrada.substring(4).toInt(); myservo.write(pos); } } } } String getStatus(bool status) { if (status) return "OK"; return "KO"; } String getStatus(ESP8266CommandStatus status) { switch (status) { case ESP8266_COMMAND_INVALID: return "INVALID"; break; case ESP8266_COMMAND_TIMEOUT: return "TIMEOUT"; break; case ESP8266_COMMAND_OK: return "OK"; break; case ESP8266_COMMAND_NO_CHANGE: return "NO CHANGE"; break; case ESP8266_COMMAND_ERROR: return "ERROR"; break; case ESP8266_COMMAND_NO_LINK: return "NO LINK"; break; case ESP8266_COMMAND_TOO_LONG: return "TOO LONG"; break; case ESP8266_COMMAND_FAIL: return "FAIL"; break; default: return "UNKNOWN COMMAND STATUS"; break; } } String getRole(ESP8266Role role) { switch (role) { case ESP8266_ROLE_CLIENT: return "CLIENT"; break; case ESP8266_ROLE_SERVER: return "SERVER"; break; default: return "UNKNOWN ROLE"; break; } } String getProtocol(ESP8266Protocol protocol) { switch (protocol) { case ESP8266_PROTOCOL_TCP: return "TCP"; break; case ESP8266_PROTOCOL_UDP: return "UDP"; break; default: return "UNKNOWN PROTOCOL"; break; } }
#include "ESP8266.h" #include <Servo.h> Servo myservo; SoftwareSerial esp8266Serial = SoftwareSerial(10, 11); ESP8266 wifi = ESP8266(esp8266Serial); int pos = 0; int ESP_on = 12; //Pin conectado a la habilitación del ESP8266 int Pin_servo=2; void setup() { Serial.begin(9600); // ESP8266 esp8266Serial.begin(9600); pinMode(ESP_on, OUTPUT); //Activo el ESP8266 digitalWrite(ESP_on, HIGH); wifi.begin(); wifi.setTimeout(2000); // getVersion char version[16] = {}; Serial.print("getVersion: "); Serial.print(getStatus(wifi.getVersion(version, 16))); Serial.print(" : "); Serial.println(version); /****************************************/ /****** WiFi commands ******/ /****************************************/ // setWifiMode Serial.print("setWifiMode: "); Serial.println(getStatus(wifi.setMode(ESP8266_WIFI_ACCESSPOINT))); // setAPConfiguration Serial.print("setAPConfiguration: "); Serial.println(getStatus(wifi.setAPConfiguration("ESP8266", "awesomelib", 10, ESP8266_ENCRYPTION_WPA_WPA2_PSK))); wifi.restart(); // setMultipleConnections Serial.print("setMultipleConnections: "); Serial.println(getStatus(wifi.setMultipleConnections(true))); // createServer Serial.print("createServer: "); Serial.println(getStatus(wifi.createServer(23))); myservo.attach(Pin_servo); } void loop() { // read data unsigned int id; int length,pos; int totalRead; char buffer[128] = {}; if ((length = wifi.available()) > 0) { id = wifi.getId(); totalRead = wifi.read(buffer, 127); if (length > 0) { String entrada(buffer); if (entrada.startsWith("Pos:")) { pos=entrada.substring(4).toInt(); myservo.write(pos); } } } } String getStatus(bool status) { if (status) return "OK"; return "KO"; } String getStatus(ESP8266CommandStatus status) { switch (status) { case ESP8266_COMMAND_INVALID: return "INVALID"; break; case ESP8266_COMMAND_TIMEOUT: return "TIMEOUT"; break; case ESP8266_COMMAND_OK: return "OK"; break; case ESP8266_COMMAND_NO_CHANGE: return "NO CHANGE"; break; case ESP8266_COMMAND_ERROR: return "ERROR"; break; case ESP8266_COMMAND_NO_LINK: return "NO LINK"; break; case ESP8266_COMMAND_TOO_LONG: return "TOO LONG"; break; case ESP8266_COMMAND_FAIL: return "FAIL"; break; default: return "UNKNOWN COMMAND STATUS"; break; } } String getRole(ESP8266Role role) { switch (role) { case ESP8266_ROLE_CLIENT: return "CLIENT"; break; case ESP8266_ROLE_SERVER: return "SERVER"; break; default: return "UNKNOWN ROLE"; break; } } String getProtocol(ESP8266Protocol protocol) { switch (protocol) { case ESP8266_PROTOCOL_TCP: return "TCP"; break; case ESP8266_PROTOCOL_UDP: return "UDP"; break; default: return "UNKNOWN PROTOCOL"; break; } }
No hay comentarios :
Publicar un comentario