Vistas de página en total

viernes, 3 de abril de 2015

UTILIZACIÓN PRACTICA DEL ESP8266 (CONTROL SERVO DESDE TERMINAL)



   Una vez probado en la entrada anterior el ESP8266, ahora toca intentar sacarle provecho utilizándolo para alguna opción práctica.
    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.









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; } }




No hay comentarios :

Publicar un comentario