Data Arduino
Data Arduino
Data Arduino
2. SENSOR DTH 11
En la sesion Sensor de temperatura TMP36, vimos cmo medir la temperatura con un sensor
TMP36. Es bastante sencillo y no presenta especiales problemas, ms all de tener cuidado con
las operacin con nmeros float.
Pero en muchas ocasiones, y especialmente en la industria alimentaria, no basta con medir la
temperatura, sino que la humedad relativa es tambin un factor importante a tener en cuenta.
Por eso se desarrollaron los sensores de la familia DHT. Nos proporcionan de forma digital
la temperatura y la humedad, con diferente precisin segn el modelo.
Bsicamente hay dos variantes DHT11 y DHT22
Las caractersticas del DHT11 son:
En cuanto al DHT22:
Barato, entre 4 y 5
Funciona con 3,3 y %V de alimentacin
Rango de temperatura: de -40 a 125 0.5C
Rango de humedad: de 0% al 100% con 5% de precisin.
Lee 2 veces por segundo.
Bajo consumo.
Devuelva la medida en C
#include <DHT11.h>
Y definimos una instancia del sensor donde declaramos el pin al que esta conectado.
int pin=2;
DHT11 dht11(pin);
int error ;
float temp, humi;
error = dht11.read(humi, temp)
Basta con hacer dht11.read pasandole las variables donde queremos el resultado, y comprobamos
que no haya errors (Siempre es buena idea comprobar que no hay error cuando hacemos una
llamda). El programa completo seria ms o menos algo as
#include <DHT11.h>
int pin=2;
DHT11 dht11(pin);
void setup()
{
Serial.begin(9600);
}
void loop()
{
int err;
float temp, hum;
if((err = dht11.read(hum, temp)) == 0) // Si devuelve 0 es que ha leido bien
{
Serial.print("Temperatura: ");
Serial.print(temp);
Serial.print(" Humedad: ");
Serial.print(hum);
Serial.println();
}
else
{
Serial.println();
Serial.print("Error Num :");
Serial.print(err);
Serial.println();
}
delay(1000); //Recordad que solo lee una vez por segundo
}
En este artculo te voy a ensear cmo utilizar un servomotor con Arduino. Antes de continuar es
importante saber qu es un servomotor o servo. Es un motor elctrico pero con
dos caractersticas especiales.
Por un lado, nos permite mantener una posicin que indiquemos, siempre que est dentro del
rango de operacin del propio dispositivo. Por otro lado nos permite controlar la velocidad de
giro, podemos hacer que antes de que se mueva a la siguiente posicin espere un tiempo.
Indice de contenidos
El ejemplo ms tpico es un coche teledirigido, esos que utilizan los nios y no tan nios. Estos
juguetes suelen tener un mando a distancia donde podemos controlar la velocidad y el giro del
coche. Precisamente el giro se suele hacer con un servomotor donde indicamos, en cada
momento, la posicin o el ngulo de giro que queremos que tenga en un preciso momento.
Caractersticas tcnicas de un servomotor con Arduino
Hay varios modelos de servomotor con Arduino. En este caso vamos a utilizar un Micro Servo 9g
SG90 de Tower Pro. Como siempre digo, hay que mirar la ficha tcnica del producto. Todos
tienen un funcionamiento muy parecido y la programacin puede variar muy poco.
Cosas a tener en cuenta con este dispositivo. Lo primero, el ngulo de giro, en este caso nos
permite hacer un barrido entre -90 y 90. Lo que viene a ser un ngulo de giro de 180. Tiene
una precisin de un grado es decir, podemos mover de grado en grado.
Estos motores funcionan con una seal PWM, con un pulso de trabajo entre 1 ms y 2 ms y con un
periodo de 20 ms (50 Hz). Qu quiere decir todo esto? Este dato nos indica la velocidad
mxima a la que podemos mover el servomotor con Arduino. Solo podremos cambiar de posicin
cada 20 ms. Esto depender del tipo y marca de nuestro servo.
El elegir una salida PWM u otra da lo mismo, todas las salidas de este tipo funcionan igual.
Conexionado con Arduino
Las conexiones dependern del tipo de servomotor con Arduino que estemos utilizando.
Todos deben tener 3 cables. Uno ir a tierra, otro a la alimentacin de 5 Voltios y el tercero a un
pin PWM. Tambin puedes utilizar un shield para controlar servomotores, como el de Adafruit.
Ahora vamos a ir a lo interesante, la programacin. Para ello tenemos que hacer uso de una
librera externa para poder controlar el servo desde Arduino. Para incorporar la librera tenemos
que ir a Programa/Include Library/Servo.
Esta accin ya nos ha hecho un include en nuestro cdigo que nos permite controlar el servo. Os
dejo a continuacin un cdigo bsico para posicionar el servo en los ngulos 0, 90 y 180.
De la librera Servo.h hemos declarado un objeto o variable servoMotor y hacemos uso de dos
mtodos. Por un lado el attach, que nos permite indicar en que pin tenemos conectado nuestro
servo, y por otro lado el write, donde indicamos en qu ngulo queremos posicionar nuestro
servomotor.
Girando grado a grado el servomotor
Vamos a realizar otro ejemplo un poco ms complicado, en este caso queremos que el servo haga
un barrido desde el 0 al 180 y luego en sentido contrario. Vamos a utilizar los mismos mtodos
pero incorporamos dos bucles for, uno para cada sentido.
Los displays LEDs de 7 segmentos, que vimos en las sesiones anteriores, estn muy bien, son
baratos y prcticos, pero tienen el inconveniente de que no pueden mostrar mensajes de texto,
sino solo nmeros.
Se echa de menos algn sistema para mostrar mensajes de texto sencillos, y por eso se
comercializan los displays LCD. Son faciles de encontrar en diversos formatos : 162 (16
caracteres x 2 lneas) o LCD 164 (16 caracteres x4 lunes).
LCD viene del ingls Liquid Crystal Display, o sea Pantalla de cristal liquido.
Son una opcin muy sencilla de usar, y adems, dan un toque muy pro a vuestros proyectos, y por
eso, en los ltimos aos los displays LCD han ganado mucha aceptacin en productos comerciales
de todo tipo.
Bsicamente porque:
Son baratos.
Estn disponibles en varios tamaos y configuraciones.
Son de bajo consumo.
Muy prcticos si te basta con mostrar solo texto (y algunos caracteres especiales).
En esta sesin veremos cmo conectarlos a vuestros Duinos y cmo usarlos para sacar mensajes
al exterior.
ANTES DE EMPEZAR
Aunque, ltimamente, estos displays suelen venir con los pines soldados, todava hay muchos
sitios que cuando compras uno de estos, te lo envan en kit, con los pines aparte para que los
sueldes
En algn momento tendremos que hablar de cmo soldar componentes, pero ese da, an no ha
llegado.
Lo primero que tienes que saber, es que tienes que soldarlos, y que no vale sujetar los pines de
algn modo ms o menos extravagante. Los sueldas y punto. Hazte a la idea. Cualquier otra
solucin acabara funcionando mal, o directoramente con el display quemado.
Cuando lo tengas listo, pincha el display en la protoboard, dejando sitio para el resto de
componentes y cables, recuerda que habr muchos, as que se generoso con el espacio que
dejas.
DIAGRAMA DE CONEXIN
Vamos ahora a a conectar la alimentacin el panel LCD. Conecta el pin16 del LCD a Ground y el
15 a 5V
Si conectas ahora el cable USB a tu Duino, el LCD debera iluminarse, si no, revisa tus cables
antes de seguir.
Vamos a conectar ahora, el potencimetro de ajuste. Para ello conecta uno de los extremos del pot
a GND y el otro a 5V. El centro al pin 3 del LCD.
Aprovechemos tambin para dar tensin al panel LCD, El pin 1 va a GND y el 2 a tensin:
Si todo ha ido bien, ya podemos encender el dispay y probarlo. Conecta el USB a tu Arduino y
veamos. Si vas girando el potencimetro, en algn momento tienes que ver unos cuadraditos en la
pantalla, en caso contrario revisa las conexiones. No sigas, si no ves esto.
Vamos a usar una librera de control del panel LCD, que viene incluida en nuestro Arduino.
Pinchad en:
\\Programa\Importar Libreria\LiquidCrystal
Y ahora podemos importar uno de los ejemplos o escribir el nuestro, comentando el cdigo.Lo
primero es que al importar la librera nos ha escrito esto:
#include <LiquidCrystal.h>
Despues, hay que inicializar la librera. Creamos una instancia llamada lcd, de la clase
Tened cuidado porque los pines que hemos usado, no corresponden a los ejemplos de Arduino,
as que podis cargarlos, peroaseguraros de cambiar la lnea de definicin de los pines, o no
corrern.
El resto es sencillo
void setup()
{
lcd.begin(16, 2); // Fijar el numero de caracteres y de filas
lcd.print("Prometec.net"); // Enviar el mensaje
}
void loop()
{
lcd.setCursor(0, 8); // set the cursor to column 0, line 1
lcd.print(millis() / 1000); // print the number of seconds since reset:
}
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup()
{
lcd.begin(16, 2); // Fijamos el numero de caracteres y filas
lcd.print("Prometec.net"); // Aqi va el mensaje
}
void loop()
{
lcd.setCursor(6, 1); // Ponte en la line 1, posicion 6
String s = reloj() ;
lcd.print(s) ;
}
String reloj()
{
int n = millis() / 1000 ; // Lo pasamos a segundos
int segundos = n % 60 ;
int minutos = n / 60 ;
Merece la pena, comentar algunas cosas de este cdigo. En primer lugar en la funcin reloj,
calculamos los minutos y segundos a partir del reloj interno de Arduino en milisegundos, no hay
nada nuevo en esto. Pero fijaros que hemos definido reloj como String:
String reloj()
Eso significa que vamos a devolver un parmetro tipo String a quien nos haya llamado. En algn
punto de la funcin habr que hacer un return( String).
Fijaros que definimos dentro de la funcin un string llamado s:
String S = String(minutos) + ":" + String(segundos);
En esta lnea no hay que confundir (aunque se escriben exactamente igual), el tipo String para
definir S, con la funcin String(n) que convierte un numero n en un string de texto para que pueda
mezclar el nmero de los minutos y los segundos separados por un smbolo de :.
Al final le aadimos un par de espacios en blanco, para evitar arrastrar fantasmas en la pantalla
Quita los espacios y miro lo que pasa en el cambio de minuto. Cmo lo arreglaras, sin el truco de
poner esos espacios al final? Piensalo.
lcd.print(s) ;
Para sacar el mensaje de texto. Todo lo que ya sabis de Serial.print() se usa exactamente igual
con esta instruccin. Y por ltimo, tenemos una lnea como esta:
lcd.setCursor(6, 1); // Ponte en la line 1, posicion 6
Que lo que hace es posicionar el cursor del panel, en la posicin 6 de la segunda lnea, para
escribir la hora centrada. Aqu os dejo un mini video con el resultado.
La librera LCD, viene con varios ejemplos muy interesantes, que os conviene probar. Recordad,
simplemente, que tenis que cambiar las definiciones de los pines para que corran.
Un ejemplo particularmente interesante, es el de CustomCharacter, en el que define una serie de
smbolos especiales y los mueve por la pantalla en funcin de los valores que lee de un
potencimetro.
Sin llegar a tanta sofisticacin, es muy interesante que veamos cmo definir algunos caracteres
especiales, porque en la tabla base del LCD, no estn incluidas , acentos, grados, o . As que
dependiendo del uso que le deis pude seros de inters saber cmo definir tus propios smbolos.
Vamos a definir un carcter propio, para digamos, el smbolo de grados centgrados, por ejemplo.
Lo primero que tenis que saber, es que los caracteres se definen con un array ( si, de nuevo) de
88, como si los dibujarais en una cuadricula de ese tamao, y rellenando el cuadradito completo.
As por ejemplo para el smbolo del grado seria:
byte grado[8] =
{
0b00001100, // Los definimos como binarios 0bxxxxxxx
0b00010010,
0b00010010,
0b00001100,
0b00000000,
0b00000000,
0b00000000,
0b00000000
};
lcd.createChar(0, euro);
lcd.createChar(1, grado);
Y ahora ya estan disponibles. Tened en cuenta que solo podemos definir 8 caracteres especiales
en un momento dado ( Aunque podemos definir 30 arrays, de caracteres y crearlos y matarlos
sobre la marcha).
Aqui tenemos un ejemplo del programa:
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
byte grado[8] =
{
0b00001100,
0b00010010,
0b00010010,
0b00001100,
0b00000000,
0b00000000,
0b00000000,
0b00000000
};
void setup()
{
lcd.begin(16, 2); // Hay que inicializar el LCD
lcd.createChar(1, grado);
lcd.setCursor(0, 0);
lcd.print("Estamos a 25");
lcd.write(1);
}
void loop()
{
}
Por ltimo, y para cerrar ya la sesin (Todo llega en la vida), Deciros que de nuevo, hemos
montado este display a la brava, conectando un buen nmero de cables.
Esto solo se puede justificar, porque en su da piqu y me compre un display de estos ( en
realidad, dos. Tengo otro de 164), pero si vais a compraros un LCD, por Dios, compraros uno que
sea I2C o algo as, vuestra salud mental mejorar mucho y solo usa 4 cables.
En la prxima sesin montaremos uno para que veis la diferencia.
Hemos visto, en los documentales, que los murcilagos son capaces de volar en completa
oscuridad y sin embargo, sortear obstculos o atrapar insectos en vuelo. Sabemos que lo hacen,
pero rara vez pensamos como.
Tenemos una vaga idea de que se llama ecolocalizacin y que ms o menos tiene que ver con
unos sonidos agudos que emiten y que despus recogen con esas enormes orejas que Dios les ha
dado, pero rara vez nos planteamos cmo es esto posible.
Delfines y ballenas utilizan un sistema similar para atrapar a sus presas, y hasta hemos visto que,
en cualquier pelcula de submarinos, en el momento lgido el capitn ordena emitir un pulso nico
de sonar para localizar al enemigo.
El concepto bsico, es siempre el mismo, sabiendo a qu velocidad viaja el sonido, si emitimos un
pulso snico corto y escuchamos cuanto tiempo tarda en regresar el eco podemos calcular la
distancia a la que se encuentra el objeto en el que ha rebotado la seal.
El radar funciona de modo similar aunque usando ondas de radio frecuencia muy cortasy con una
problemtica propia descomunal. Un pulso de radiofrecuencia se emite desde la antena y se
recoge el eco que vuelve a la velocidad de la luz.
Lo que haremos en esta sesin es utilizar un sensor de distancia sencillo HC-SR04 (y muy
parecido a los sensores de aparcamiento de los coches modernos), que nos permite enviar
estos pulsos ultrasnicos y escuchar el eco de retorno. Midiendo este tiempo, podemos calcular
la distancia hasta el obstculo.
El odo humano no percibe sonidos por encima de 20kHz. Por eso, a las ondas de mayor
frecuencia las llamamos ultrasonidos ( mas all del sonido). Los sensores de ultrasonidos
funcionan sobre los 40 kHz.
No son perfectos, les influye la temperatura ambiente, la humedad y los materiales en los que
reflejan, lo que genera una cierta incertidumbre. Pero a cambio son baratos y efectivos hasta un
poco ms de 3 metros en condiciones normales si la precisin no es un problema determinante
DIAGRAMA DE CONEXIN
Veamos como conectar uno de esto detectores a nuestros Duinos. Aqu est el esquema elctrico
y de protoboard por cortesa de Fritzing:
Y de nuevo, el diagrama de conexin de la protoboard
EL PROGRAMA DE CONTROL
#define trigPin 13
#define echoPin 12
#define led 2
Hasta ahora habamos visto que podamos definir una variable como int, por ejemplo, y tambin
como una constante (const int pin). Aqu utilizamos otro mtodo, el #define que es una directiva
para el compilador.
Esto solo significa que el compilador (en rigor el pre procesador) cambiar todas las ocurrencias de
estos #define en nuestro programa por su valor antes de compilar. Esta es la forma clsica de C de
hacer esto y tiene la virtud de que no ocupa memoria definiendo una variable (y con un Arduino
UNO, que va muy corto de memoria, esto puede ser crtico en ocasiones).
void setup()
{
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
}
Ya estamos ms que habituados a la funcin delay(milis), pero el reloj interno de Arduino mide en
microsegundos y tenemos otra funcin parecida delayMicroseconds(s) que simplemente congela
Arduino el nmero especificado de microsegundos.
Para dar un pulso ultrasnico lo que hacemos es activar el pin Trigger durante unos
microsegundos y para ello lo ponemos en HIGH, antes de escuchar el eco:
Para escuchar el pulso vamos a usar otra funcin, pulseIn() ( Oh s, hay muchas,
muchsimas). Para leer el manual de pulseIn() buscad en google Arduino pulseIn y vereis que
pronto lo encontrais.
Bsicamente lo que hace es escuchar el pin que le pasamos, buscando una seal que pase de
LOW a HIGH ( si le pasamos HIGH como parmetro) y cuenta el tiempo que tarda en volver a bajar
desde que sube.
Ahora ya sabemos el tiempo que tarda en volver el eco en s. Como la velocidad del sonido es de
343 metros / segundo, Necesitamos 1/343 = 0,00291 segundos para recorrer un metro.
Para usar una medida ms cmoda podemos pasar esto a microsegundos por centmetro:
Como nuestro eco mide el tiempo que tarda el pulso en ir y venir la distancia recorrida ser la
mitad:
#define trigPin 13
#define echoPin 12
#define led 2
void setup()
{ Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
}
void loop()
{ long duracion, distancia ;
digitalWrite(trigPin, LOW); // Nos aseguramos de que el trigger est desactivado
delayMicroseconds(2); // Para asegurarnos de que el trigger esta LOW
digitalWrite(trigPin, HIGH); // Activamos el pulso de salida
delayMicroseconds(10); // Esperamos 10s. El pulso sigue active este tiempo
digitalWrite(trigPin, LOW); // Cortamos el pulso y a esperar el echo
duracion = pulseIn(echoPin, HIGH) ;
distancia = duracion / 2 / 29.1 ;
Serial.println(String(distancia) + " cm.") ;
int Limite = 200 ; // Medida en vaco del sensor
if ( distancia < Limite)
digitalWrite ( led , HIGH) ;
else
digitalWrite( led , LOW) ;
delay (500) ; // Para limitar el nmero de mediciones
}
Para convertir esto en un detector de movimiento hemos creado una variable un poco menor de la
medida que el sensor recibe en vacio (en mi caso unos 200 cm). Si la distancia medida cae por
debajo este valor es que algo se ha interpuesto y por tanto encendemos una alarma, en nuestro
caso un humilde LED.
Despus de este ejercicio de fsica y matemticas, que sin duda causar furor entre los estudiantes
aplicados, vamos a hacer el mismo programa pero usando una librera externa, que alguien se ha
molestado en escribir, paras esas pocas personas que no disfrutan de los problemas de ciencias y
que as, podamos ver la diferencia.
Podes descargar la librera de aqu, Descargar, o bien de la web del autor
en code.google.com/p/arduino-new-ping.
Para instalar una librera externa no incluida en el IDE de Arduino tenemos que importarla con el
men Programa \ Importar librera\Aadir librera:
#include <NewPing.h>
#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 11 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200
void setup()
{
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
}
void loop()
{
delay(50);
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS)
Serial.print("Ping: ");
Serial.print(uS / US_ROUNDTRIP_CM);
Serial.println("cm");
}
Como veis la librera se encarga de inicializar los pines necesarios, enviar los pulsos, escuchar el
eco de retorno y de hacer los clculos. No est mal.
Fijaros, que el ejemplo, utiliza diferentes pines a los que nosotros hemos usado,as que tendres
que modificarlos. Igualmente, el ejemplo inicializa la puerta serie a 115.200. Es imprescindible
igualar esta velocidad con la que recibe la consola o veris muchas cosas raras en pantalla.
Los alumnos avispados se habrn dado cuenta de que Arduino viene forrado de ejemplos que
pueden cargar y usar. Os invito a que investiguis y juguis con estos ejemplos cuanto queris.
PRECIO
El emisor LED infrarrojo emite un haz de luz pulsada infrarroja con una longitud de onda de 850nm
+/-70nm. Se enva una luz pulsada para minimizar la influencia de la luz ambiente y del color del
objeto en la medicin.
El detector de posicin PSD (position sensitive detection) es en realidad es un pequeo sensor
CCD lineal que recibe la luz reflejada en cualquier objeto en la trayectoria del rayo. El sensor
emplea triangulacin para determinar la distancia del sensor a los objetos ubicados frente al rayo.
La salida analgica tienen un valor de 2.5V a 20 cm, y de 0.4 a 150cm. Sin embargo, como hemos
mencionado, la respuesta es no lineal por lo que es necesario interpolar el valor para obtener un
nivel de precisin adecuado.
ESQUEMA DE MONTAJE
El esquema de montaje es sencillo. Por un lado, alimentamos el sensor mediante Vcc y GND
conectndolos, respectivamente, a 5V y GND de Arduino.
EJEMPLOS DE CDIGO
El siguiente cdigo realiza la medicin de la salida del sensor empleando las entradas
analgicas de Arduino. A continuacin, realiza la interpolacin para obtener la distancia en
centmetros.
Finalmente, muestra los valores por pantalla empleando el puerto serie. En un montaje real,
usaramos esta zona para hacer las acciones necesarias, como detener un robot o activar un
mecanismo.
En las sesiones previas hemos visto cmo manejar los motores de corriente continua tpicos.
Hemos visto cmo hacerlos girar y como modificar esta velocidad de giro, as como la forma de
invertir el sentido de rotacin mediante un H bridge integrado como el L293D.
Y qu hace un hombre normal, cuando consigue controlar un motor (y ms uno que est leyendo
esto)? Pues naturalmente, probar a manejar varios motores a la vez, digamos 4, y empezar a
pensar en hacer un pequeo cochecito con traccin a las 4 ruedas y control remoto inalmbrico
y. Quieto parado!
Vayamos por partes. De momento solo hemos gobernado un motor, aunque sabemos que
el L293D dispone de capacidad para manejar un segundo motor. Podramos disear un circuito
con dos L293D para mover 4 motores y quizs hacer un Shield para montar todo en la chepa de
nuestro Arduino.
Pero como siempre os digo, si existe una necesidad en este mundo electrnico, siempre hay
alguien presto a vendernos la solucin de forma conveniente. Y como podris imaginar, ni somos
los primeros que hemos tenido esta idea (Ni seremos los ltimos) ni es precisamente una novedad
la solucin, el mercado nos ofrece toda una variedad de Shields para controlar motores muy
interesantes, dependiendo del tamao de los motores, su consumo, la tensin y cualquier otra cosa
que podis imaginaros.
Como en esta humilde casa pensamos que para aprender hay que trastear y preferiblemente por
poca pasta, vamos a presentar un sencillo Motor Shield que fue diseado por nuestros amigos de
Adafruit y luego abandonado en favor de un controlador de motores ms avanzado (y caro) y cuyo
relevo ha sido tomado por la nube de fabricantes chinos, proporcionndonos un Arduino motor
shield V1.0, por muy poco dinero, que nos permite iniciarnos gastando lo justo.
Veamos sus caractersticas.
Aqu tenis una foto del Motor Shield V1.0, que podis encontrar fcilmente en cualquier
proveedor:
En resumen, es un Shield barato y prctico para manejar pequeos motores de 5V, pero que se
quedar corto si necesitas una cierta potencia en los motores, ya que la intensidad que estos
demandaran superar con facilidad los 0,6A que tiene como lmite este Shield.
Es ideal para construir robots autnomos con pequeos motores y sin peso y sobre todo como
elemento de aprendizaje antes de invertir una pasta gansa en otras opciones mas sofisticadas.
Hay conexiones para los bornes de 4 motores, marcados como M1, M2, M3 y M4 y conviene que al
conectar sigas el mismo criterio en los bornes y en el Shield porque de lo contrario conseguirs
que alguno de los motores gire al revs de lo que pretendes. Lo que no es muy grave porque se
arregla con facilidad.
Una cosa interesante de este shield es que nos permite separar la alimentacin de los motores de
la alimentacin de Arduino y es de agradecer porque los motores generan mucha interferencia
electromagntica que puede hacer que nuestro Arduino se comporte de forma errtica.
Por eso siempre que sea posible conviene que separis la alimentacin de uno y otro (Aunque en
un robot autnomo va a ser difcil). Para ello basta con que quites el power jumper y la
alimentacin estar separada. Esto ser imprescindible si tus motores son de digamos 9 0 12V
porque tu Arduino solo funciona con 5V (So pena de hacer barbacoa de Arduino).
Vamos a conectar un primer motor al Shield para probar. Lo primero montad el Shield a
vuestro Arduino. Yo os recomiendo un MEGA para que podamos seguir haciendo cosas en el
futuro, pero tambin vale cualquier otro.
Conectad los bornes del motor a los tornillos A y B del Motor Shield, dejando libre el pin central
marcado como GND.
No es importante que borne a que pin, porque lo nico que ocurrir si lo inverts es que el motor
girar al revs. Lo que s es recomendable es que mantengis el mismo criterio para todos los
motores, porque os ahorrar dolores de cabeza.
Como en este primer ejemplo vamos a alimentar el motor desde Arduino y el USB, no olvidis
conectar el power jumper, para que alimentemos los motores directamente desde Arduino.
Seria sencillo manejar el motor a travs del Shield directamente, recurriendo a los pines de control,
y os lo propongo como ejercicio si os parece, pero aqu vamos a descargar ahora una librera de
Adafruit para manejar el Shield directamente, que nos permitir abstraernos del detalle de pines.
La librera que necesitamos es esta adafruit-Adafruit-Motor-Shield-library-8119eec, y para instalarla
seguimos el procedimiento habitual.
Para usarla, lo primero que tenemos que hacer es este par de instrucciones:
#include <AFMotor.h>
AF_DCMotor Motor1(1);
La primera lnea, incluye la librera de AdaFruit en nuestro programa, y la segunda crea una
instancia de un motor conectado a la puerta M1, y le iniciamos con el parmetro que le pasamos
que puede ir del 1, M1 al 4, M4.
Para establecer la velocidad del motor hacemos:
La primera lnea pone el motor a 200 / 255 del tope de revoluciones, y la segunda lnea indica que
queremos dejar el motor en punto muerto.
Si queremos que el motor avance usamos:
Motor1.run(FORDWARD);
Motor1.run(BACKWARD);
Y eso es todo lo necesario para controlar un motor. Si queremos hacer un primer programa sencillo
que haga avanzar el motor unos segundos y despus retroceda, podemos escribir un programa
similar a este
#include <AFMotor1.h>
AF_DCMotor1 Motor1(1);
void setup()
{ Motor1.run(RELEASE); }
void loop()
{ Motor1.run(FORWARD);
delay (2000);
Motor1.setSpeed(180);
Motor1.run(BACKWARD);
delay (2000);
}
#include <AFMotor.h>
AF_DCMotor Motor1(1);
AF_DCMotor Motor2(2);
AF_DCMotor Motor3(3);
AF_DCMotor Motor4(4);
Definimos la velociodad de los 4 motores en el setup:
void setup()
{ Serial.begin(9600); // set up Serial library at 9600 bps
Motor1.setSpeed(255);
Motor2.setSpeed(255);
Motor3.setSpeed(255);
Motor4.setSpeed(255);
}
Y por ultimo vamos a mandar moverse adelante y atrs y para los 4 motores simultneamente:
Motor1.run(RELEASE);
Motor2.run(RELEASE);
Motor3.run(RELEASE);
Motor4.run(RELEASE);
delay (1000) ;
Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
delay (2000);
Motor1.run(BACKWARD);
Motor2.run(BACKWARD);
Motor3.run(BACKWARD);
Motor4.run(BACKWARD);
delay (2000);
Como veis no es diferente de mover un solo motor, solo mas pesado. Aqu tenis el programa
Es conveniente que comprobis en vuestro montaje que todas las ruedas giran en la misma
direccin y que no hay ninguna rotando al revs, porque cuando queramos avanzar seria un
problema.
Aqu os dejo un pequeo video con el trest de giro
Con esto, confo en que con esto hayamos dejado listo el hardware de nuestro robot para empezar
a programarlo en serio. Pero parece mas conveniente cortar aqui esta sesin y dejar algo para la
prxima sesin, en la que veremos como mover el robot y hacerlo girar adems de variar la
velocidad de crucero.
ARDUIN
FUNCIN
O
Pin 1 Disponible
Pin 2 Disponible
A0,A1,A
Disponibles. Recuerda que pueden usarse como
2,A3,A4,
digitales
A5
Tened presente que no hay ningun pin de Arduino conectado a los motores directamente. La
gestin de los motores se realiza a traves del shift register para ahorra pines y por eso tenis
necesariamente que usar la libreria para manejarlos.