Como estoy simplemente poniéndome un poco al día para dominar herramientas que me sirvan en futuros proyectos en el departamento de la Universidad, he decidido probar un servo, que más tarde controlaré para mover el ángulo de ataque de un ala en el túnel de viento.
Por ello me convenía ver como funciona el servo, y como controlarlo desde una tablet o movil. Para que sea cómodo el control y m pueda centra en las comunicaciones y en la realización del entorno en Android, sin mucho esfuerzo, he decidido utilizar un Arduino con una Shield Ethernet. Para compilar uso Atmel Studio, ya que el entorno de Arduino no me gusta nada. Para programar la aplicación en Android usaré App Inventor 2.
Aunque seguramente, en la realidad el servo lo controle desde una pequeña pantalla LCD con un PIC.
En este caso el control del servo, ya está implementado en la librería de Arduino, y yo simplemente he cambiado el pin de control al pin 8.
Cuando lo implemente en PIC ya me planteare la implementación del servo, pues no he visto librería en internet.
Para realizar este ejemplo simplemente he juntado el ejemplo de Arduino de servo con el de Server de internet. De esta forma utilizo el servidor para recibir los comandos y mandar la posición al cliente.
Cuando recibo la orden la ejecuto con la librería Servo. He implementado los pasos de 5 grados, de forma que cuando incremento o decremento la posición lo hago de 5 grados en 5 grados.
Como se vé he utilizado una placa de prototipado para crear un conector para el servo y comunicar con el resto de las placas. Debajo esta la shield de ethernet y debajo un arduino Leonardo.
Primero realizo el programa de Arduino, como he dicho sobre ATmel studio, ya que su entorno no es comparable con el de Arduino. Permite tener abierto el terminal al enviar el programa al Leonardo, con lo que no se pierden datos enviados al terminal, y nos permite ir cogiendo las funciones de las clases sin tener que escribirlas.
Declaramos la IP de Ethernet, una variable llamada "POS" para almacenar la posición actual.
Por lo demás es sencillo. Abrimos Ethernet como servidor en el puerto 80, y si recibimos un get, enviamos una página con los botones y el valor actual del servo.
Si recibimos en el GET "?POS=", analizo la orden y reacciono sobre la variable en consonancia.
PAP_MOTOR.ino
/* Copyright (C) 2015 José Ángel Moneo Fernández
COMPILADOR CCS
Servo controlado por web
created 03 de febero 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 <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 90; // variable to store the servo position in central position
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
void setup() {
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
//servo
myservo.attach(8); // attaches the servo on pin 8 to the servo object
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15);
}
void loop() {
int sensorReading;
// listen for incoming clients
EthernetClient client = server.available(); //Creamos un cliente Web
//Cuando detecte un cliente a través de una petición HTTP
if (client) {
boolean currentLineIsBlank = true; //Una petición HTTP acaba con una línea en blanco
String cadena=""; //Creamos una cadena de caracteres vacía
while (client.connected()) {
if (client.available()) {
char c = client.read();//Leemos la petición HTTP carácter por carácter
Serial.write(c);//Visualizamos la petición HTTP por el Monitor Serial
cadena.concat(c);//Unimos el String 'cadena' con la petición HTTP (c). De esta manera convertimos la petición HTTP a un String
//Ya que hemos convertido la petición HTTP a una cadena de caracteres, ahora podremos buscar partes del texto.
int posicion=cadena.indexOf("POS="); //Guardamos la posición de la instancia "POS=" a la variable 'posicion'
if(cadena.substring(posicion)=="POS=MAS")//Si a la posición 'posicion' hay "POS=MAS"
{
if (pos<180) pos+=5;
myservo.write(pos); // tell servo to go to position in variable 'pos'
}
if(cadena.substring(posicion)=="POS=MENOS")//Si a la posición 'posicion' hay "POS=MENOS"
{
if (pos>0) pos-=5;
myservo.write(pos); // tell servo to go to position in variable 'pos'
}
if(cadena.substring(posicion)=="POS=CERO")//Si a la posición 'posicion' hay "POS=CERO"
{
pos=90;
myservo.write(pos); // tell servo to go to position in variable 'pos'
}
//Cuando reciba una línea en blanco, quiere decir que la petición HTTP ha acabado y el servidor Web está listo para enviar una respuesta
if (c == '\n' && currentLineIsBlank) {
// Enviamos al cliente una respuesta HTTP
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//Página web en formato HTML
client.println("<html>");
client.println("<head>");
client.println("</head>");
client.println("<body>");
client.println("<h1 align='center'>I.E.F.</h1><h3 align='center'>Posicionamiento Perfil</h3>");
//Creamos los botones. Para enviar parametres a través de HTML se utiliza el metodo URL encode. Los parámetros se envian a través del símbolo '?'
client.println("<div style='text-align:center;'>");
client.println("<button onClick=location.href='./?POS=MAS\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("+ Gr");
client.println("</button>");
client.println("<button onClick=location.href='./?POS=MENOS\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("- Gr");
client.println("</button>");
client.println("</button>");
client.println("<button onClick=location.href='./?POS=CERO\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("Cero");
client.println("</button>");
client.println("<br /><br />");
client.println("<b>POS = ");
client.print(pos);
client.println(" </b><br />");
client.println("</b></body>");
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}
Con esto simplemente el sistema ya es telecontrolado mediante un explorador, de forma que podemos mover el servo a través de internet o a través de nuestra intranet.
Con esto simplemente el sistema ya es telecontrolado mediante un explorador, de forma que podemos mover el servo a través de internet o a través de nuestra intranet.
Como se ve, el servo puede moverse adelante y atrás o ponerse en posicion central mediante los botones que aparece en el explorador al acceder a su página web.
CONTROL CON ANDROID
Ahora vamos a aprovechar el servidor web para realizar el mismo proceso pero sobre una tablet o un teléfono. Aunque haga lo mismo, el hecho de que lo haga desde un teléfono mediante una aplicación particular le da un cierto caché.
Para desarrollar la aplicación usaré App Inventor 2. Es muy cómodo y facil de programar y probar sobre Android, ya que podemos mantener sincronizada la aplicación del movil con el entorno para ir viendo los resultados de las modificaciones de forma simultanea en el móvil,según las retocamos.
Lo primero es crear la pantalla.
He colocado una pantalla sencilla. La imagen es de adorno. En ella, como en la web, disponemos de tres botones para el mando y una casilla indicadora de la posición actual.
En este caso he colocado un cajín de entrada para poder variar la dirección IP donde se encuentra el Arduino.
En cuanto a la programación, primero realizamos un get al inicializar la pantalla.
Si pulsamos cualquier botón añadimos a la IP el comando ?POS=xxx para enviar la orden correspondiente al servidor web, para después realizar un nuevo get.
Al recibir la respuesta al GET, deberemos tomar el dato de posición que envía el servidor para ponerlo en la etiqueta de posición en la pantalla. Para ello, verificamos que se ha enviado una respuesta correcta y recogemos de esta los caracteres que están después de "POS=". Estos caracteres son recogidos con el comando segmente y convertidos a numero, para guardarlos en la etiqueta "posición".
Y ya está todo
No hay comentarios :
Publicar un comentario