Usted está aquí: Inicio
En este tutorial montaremos un servidor web con nuestro arduino y utilizaremos en este caso nuestra sd card donde le pondremos nuestro archivo index.html en la raíz de nuestra sd.
crearemos el index.html con el siguiente código.
<!DOCTYPE html>
<html>
<head>
<title>Arduino SD Card Web</title>
</head>
<body>
<h1>Hola desde Arduino SD Card!</h1>
<p>Pagina web alojada en Arduino SD card server.</p>
</body>
</html>
Ahora este es el código de nuestro arduino.
/*--------------------------------------------------------------
servercanary.sytes.net
--------------------------------------------------------------*/
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC address from Ethernet shield sticker under board
IPAddress ip(192,168,1,100); // Asignamo una ip
EthernetServer server(80); // Creamos el server con el 80
File webFile;
void setup()
{
Ethernet.begin(mac, ip); // iniciamos ethernet
server.begin(); // iniciamos la escucha de clientes
Serial.begin(9600); // puerto serial
// configuracion SD card
Serial.println("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("ERROR - SD card initialization failed!");
return; // init failed
}
Serial.println("SUCCESS - SD card initialized.");
// check for index.htm file
if (!SD.exists("index.htm")) {
Serial.println("ERROR - Can't find index.htm file!");
return; // can't find index file
}
Serial.println("SUCCESS - Found index.htm file.");
}
void loop()
{
EthernetClient client = server.available(); // try to get client
if (client) { // got client?
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) { // client data available to read
char c = client.read(); // read 1 byte (character) from client
// last line of client request is blank and ends with \n
// respond to client only after last line received
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// send web page
webFile = SD.open("index.htm"); // open web page file
if (webFile) {
while(webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
break;
}
// every line of text received from the client ends with \r\n
if (c == '\n') {
// last character on line of received text
// starting new line with next character read
currentLineIsBlank = true;
}
else if (c != '\r') {
// a text character was received from client
currentLineIsBlank = false;
}
} // end if (client.available())
} // end while (client.connected())
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection
} // end if (client)
}
En este tutorial vamos a usar el Arduino como servidor Web utilizando el Arduino Ethernet Shield y controlaremos un Led conectado al pin 6 a través de Internet.
-Arduino Uno Rev 3
-Arduino Ethernet Shield
-Cable Red Ethernet
-Led
El Arduino Ethernet Shield permite conectar el Arduino a Internet. Está basado en el chip Wiznet W5100 con un buffer interno de 16k que es el encargado de dar una dirección IP al Arduino. Tiene un conector ethernet RJ-45 con una velocidad de 10/100Mb. Se usa la librería <Ethernet.h> para escribir el programa. También tiene un slot de tarjetas micro-SD para almacenar datos para servir a la red. Para esto, se usa la librería <SD.h>. Para comunicarse con la placa Arduino, utiliza el puerto SPI (pins 10, 11 ,12 y 13) con la librería <SPI.h>, y el pin 4 si trabaja con una tarjeta micro-SD. Estos pins no pueden ser usados como entradas o salidas digitales. También tiene un botón de Reset que resetea tanto la placa Arduino como el W5100. Gracias a la Ethernet Shield podemos usar el Arduino como servidor web o como cliente web.
/*
Crear servidor Web con Arduino
*/
#include <SPI.h> //Importamos librería comunicación SPI
#include <Ethernet.h> //Importamos librería Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//Ponemos la dirección MAC de la Ethernet Shield que está con una etiqueta debajo la placa
IPAddress ip(192,168,1,100); //Asingamos la IP al Arduino
EthernetServer server(80); //Creamos un servidor Web con el puerto 80 que es el puerto HTTP por defecto
int led=6; //Pin del led
String estado="OFF"; //Estado del Led inicialmente "OFF"
void setup()
{
Serial.begin(9600);
// Inicializamos la comunicación Ethernet y el servidor
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
pinMode(led,OUTPUT);
}
void loop()
{
EthernetClient client = server.available(); //Creamos un cliente Web
//Cuando detecte un cliente a través de una petición HTTP
if (client) {
Serial.println("new 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("LED="); //Guardamos la posición de la instancia "LED=" a la variable 'posicion'
if(cadena.substring(posicion)=="LED=ON")//Si a la posición 'posicion' hay "LED=ON"
{
digitalWrite(led,HIGH);
estado="ON";
}
if(cadena.substring(posicion)=="LED=OFF")//Si a la posición 'posicion' hay "LED=OFF"
{
digitalWrite(led,LOW);
estado="OFF";
}
//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'>servercanary.sytes.net</h1><h3 align='center'>LED controlado por Servidor Web con Arduino</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='./?LED=ON\' style='margin:auto;background-color: #FE2E2E;color: snow;padding: 10px;border: 1px solid ##FE2E2E;width:65px;'>");
client.println("ON");
client.println("</button>");
client.println("<button onClick=location.href='./?LED=OFF\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:65px;'>");
client.println("OFF");
client.println("</button>");
client.println("<br /><br />");
client.println("<b>LED = ");
client.print(estado);
client.println("</b><br />");
client.println("</b></body>");
client.println("</html>");
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
//Dar tiempo al navegador para recibir los datos
delay(1);
client.stop();// Cierra la conexión
}
}
En este tutorial mostraré como con un sensor de ultrasonido podemos hacer una alarma cuando su distancia sea inferior a 10 cm y enviar una señal al pin 13 para indicarnos de la alarma, las utilidades para este ejemplo pueden ser muy diversas, como evitar colisiones para nuestros robot etc.
/*
Sensor de proximidad y al ser inferior a 10cm
envia un pulso de alarma por el pin 13
HC-SR04 conexiones:
VCC al arduino 5v
GND al arduino GND
Echo al Arduino pin 6
Trig al Arduino pin 7
*/
#define echo 6
#define trig 7
long duracion, distancia;
void setup() {
Serial.begin (9600); // inicializa el puerto seria a 9600 baudios
pinMode(echo, INPUT); // define el pin 6 como entrada (echo)
pinMode(trig, OUTPUT); // define el pin 7 como salida (triger)
pinMode(13, 1); // Define el pin 13 como salida
}
void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH); // genera el pulso de triger por 10ms
delayMicroseconds(10);
digitalWrite(trig, LOW);
duracion = pulseIn(echo, HIGH);
distancia = (duracion/2) / 29; // calcula la distancia en centimetros
if (distancia >= 500 || distancia <= 0){ // si la distancia es mayor a 500cm o menor a 0cm
Serial.println("---"); // no mide nada
}
else {
Serial.print(distancia); // envia el valor de la distancia por el puerto serial
Serial.println("cm"); // le coloca a la distancia los centimetros "cm"
digitalWrite(13, 0); // en bajo el pin 13
}
if (distancia <= 10 && distancia >= 1){
digitalWrite(13, 1); // en alto el pin 13 si la distancia es menor a 10cm
Serial.println("Alarma......."); // envia la palabra Alarma por el puerto serial
}
delay(400); // espera 400ms para que se logre ver la distancia en la consola
}
Construcción de una mini cnc
Para la construcción de esta mini cnc utilizaremos los siguientes materiales:
Arduino uno
2 driver pololu A4988
2 cd o dvd viejos
1 protoboard
Tornillos, cables, soldador, etc
Para esta CNC solo vamos a utilizar dos ejes X,Y el eje Z no lo utilizaremos ya que está pensada para ponerle un laser, por lo tanto utilizaremos 2 soportes que tienen los CD-DVD uno para el eje X y otro para el eje Y.
Teniendo ya los dos CD listos los colocamos de la siguiente forma.
A los motores hay que soldarle 4 cables para poderlos conectar al arduino, yo he utilizado los de un antiguo cable IDE ya que son idóneos para este cometido.
Los motores de estas unidades de CD-DvD son motores paso a paso bipolares, y eso quiere decir que son motores de 2 bobinas, por lo tanto utilizan 4 cables, para identificar las bobinas utilizaremos un polímetro y poniéndolo en continuidad testearemos 2 contactos del motor si pita el polímetro esa es una de las bobinas, sino probamos con otro contacto hasta tener las dos bobinas identificados.
Conectaremos los motores a los drivers como indica el siguiente esquema, teniendo en cuenta que necesitaremos una fuente externa para alimentar nuestros motores, ya que el arduino no proporciona la suficiente potencia, se recomienda poner el condensador de 100 para evitar perdidas de pasos.
Aquí dejo el esquema de conexionado de los pines step y dir, estos pines corresponden al firmware del GRBL y con esto terminamos el aparatado del hardware.
Ahora toca todo lo que a software se refiere, y lo primero que vamos a hacer es descargar las siguientes cosas haciendo click aquí.
firmware grbl V0.8 (firmware para arduino que hace posible todo esto)
Xloader (programa para subir al arduino el grbl V0.8)
Grbl controller (programa para controlar nuestra cnc)
Una vez descargado todo, lo primero que tenemos que hacer es abrir el Xloader y configurarlo como indico abajo, luego pulsamos el botón de UPLOAD y esperamos a que termine de subir el firmware al arduino.
Hex file añadimos el firmware
Device seleccionamos Uno(ATmega328)
COM port pondremos el de nuestro arduino
Baut rate 115200
Subido todo ya no utilizaremos mas ni el Xloader ni el firmware, a partir de ahora lo único que utilizaremos será el GRBL Controller.
Abrimos el GRBL Controller y le indicamos el puerto del arduino, en baud rate le pondremos 9600 y pulsamos el botón Open, si todo va bien obtendremos una respuesta del arduino con OK.
Para configurar la CNC ponemos en command $$ y pulsamos enter y nos mostrara toda la configuración, lo más importante son:
$0 (pasos por mm del eje X)
$1 (Pasos por mm del eje Y)
$8 (Aceleración por mm) poner a 100
$17 poner a 1
Para modificar cualquier parámetro pondremos $0= valor y pulsamos Enter luego volvemos a poner $$ y enter para ver los cambios reflejados.
El valor de $0 y $1 dependerá tanto de tu motor como de la varilla roscada, por ejemplo los motores de las unidades de CD-DVD son motores de 20 pasos y un giro completo del motor avanza 3,333 mm, otro ejemplo seria si tenemos un motor nema 17 con 200 pasos y una varilla roscada de 1 mm nuestro motor giraría 200 pasos por mm.
Configurado todo los valores pondremos X10 Y10 y la CNC tendrá que ir a su posición, también podemos trastear con los botones de grbl controller para mover la CNC y si es necesario podemos invertir los ejes, por si no van para el sentido que tienen que ir, aquí les dejo un video del primer dibujo que hizo el cacharro :D.