You are on page 1of 39

MANUAL DE ARDUINOS

2016

QU MODELO DE ARDUINO COMPRAR?


Existen multitud de modelos Arduino disponibles, lo que puede ser
un poco confuso para los nuevos usuarios. A la hora de elegir lo normal
es que nos fijemos en la cantidad de entradas y salidas que tiene,
especialmente las analgicas dado que son las que habitualmente
restringen nuestro proyecto. En la siguiente tabla podis ver los modelos
de Arduino ms habituales, con sus caractersticas ms importantes y un
precio
de
referencia
comprndolas
en
Ebay
desde
proveedores chinos internacionales.
I/O

Entrad
as

Salid

UAR

Memo

ria

32kb

7,5

12

32kb

10

54

16

14

256kb

12,5

14

32kb

2,5

Modelo

digital
es

Uno r3

16

Leonardo

20

Mega r3
Mini 05

analgi
cas

as
PWR

Precio

Lo ms normal es que para empezar empleis una Arduino UNO


r3. Este es el modelo ms estndar y es la placa que utilizaris de forma
habitual. Para ciertos proyectos grandes, que requieran manejar un
nmero importante de motores o serve motores(robots, mquinas de
CNC, impresoras 3D) puede ser necesario pasar a un modelo con mayor
nmero de salidas, especialmente analgicas. En ese caso lo normal es
emplear una Arduino MEGA r3.
Por su parte, el modelo Mini 05 es un modelo para usuarios
avanzados. Es una placa de apenas 2,5 y un tamao realmente

pequeo, pensado para aplicaciones finales, es decir, cuando vas a dejar


la placa permanentemente conectada (y por tanto la vas a perder).
Viene sin terminales de conexin, hay que soldarlos, y para programarla
se requiere un adaptador USB FTDI que cuesta 3,5. En niveles expertos
esta es prcticamente el nico modelo de placa que usaris dado que,
en caso de requerir una gran cantidad de entradas o salidas, es ms
econmico formar una red de 3 o 4 placas mini, y obtienes una
capacidad superior a una MEGA.
Por tanto, recomendacin final. Comprar una Arduino UNO, que
ser vuestra placa estndar de desarrollo. Cuando seis avanzados,
comprar una o dos Arduino Mini, junto con el programador. Y slo para
proyectos especficos donde la UNO se quede pequea, y si no queris
complicaros la vida haciendo redes de Arduinos Mini, o si necesitis usar
los puertos de serie adicionales, podis usar una MEGA.

FRITZING
Fritzing es el programa por excelencia para la realizacin de
esquemas elctricos en proyectos con Arduino. Dispone bibliotecas con
la mayora de componentes, incluido por supuesto los propios Arduino,
placas de conexiones, led, motores, displays etc. Adems permite hacer
esquemas elctricos, cambiar el color de los cables, disear nuestro PCB
final un sin fin de opciones que convierten a este programa en una
herramienta muy til.

PREPARAR LA CONEXIN
En primer lugar, conectamos nuestra placa Arduino mediante un
cable USB A-B, del tipo que se emplean habitualmente para conectar
impresoras. De momento no hace falta la conexin de alimentacin o
cable adicional, para realizar la programacin es suficiente nicamente
con el USB.

A continuacin abrimos el entorno IDE de Arduino.

Seleccionamos el modelo de placa que estemos empleando.

Seleccionamos el puerto de comunicacin al que esta conectado.

En Windows ser algo tipo COM1, COM3

En Linux ser del estilo /dev/ttyACM0

Ya tenemos la conexin configurada y lista para realizar la carga de


nuestro primer programa.

ESTRUCTURA BSICA DE PROGRAMA


En el IDE de Arduino estandard los programas tienen siempre la
siguiente estructura
1 //Zona DECLARACIONES
2
3 void setup() {
4 // Zona funcion SETUP
5}
6
7 void loop() {

8 // Zona funcion LOOP


9}

Donde cada parte tiene la siguiente funcin:

Zona declaraciones: En esta parte se declaran variables, funciones, objetos, y


estructuras.

Funcion setup: Esta funcin se ejecuta cada vez que se enciende la placa de
Arduino, o se pulsa la tecla Reset. Realiza funciones de inicializacin de
perifricos, comunicaciones, variables, etc.

Funcion loop: Esta funcin se ejecuta contnuamente. Realiza el grueso de


tareas del autmata.

Esta configuracin (una funcin de setup y un bucle que se ejecuta


contnuamente) es habitual en la programacin de automatismos,
siendo la nica que permite el IDE estandard de Arduino. Otras
configuraciones son posibles mediante el empleo de otros IDE.

CARGANDO UN EJEMPLO
Para probar el funcionamiento de nuestro montaje vamos a emplear
uno de los ejemplos incluidos en el IDE de Arduino.

Se puede aprender mucho leyendo los ejemplos, es muy recomendable echar un


vistazo a todos.

Seleccionamos el ejemplo Basics/Blink, y aparecer un cdigo similar al


siguiente.
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2

int led = 13;


void setup() {
pinMode(led, OUTPUT);
}

//asignar variable led como 13


//definir pin 13 como salida

void loop() {
digitalWrite(led, HIGH); // encender LED
delay(1000);
// esperar un segundo
digitalWrite(led, LOW); // apagar LED
delay(1000);
// esperar un segundo
}

Este ejemplo enciende y apaga un LED cada segundo. La funcin de


cada linea est comentada a la derecha, pero por ahora no nos vamos a
preocupar ahora del significado, ya veremos estos aspectos ms
adelante. El LED empleado est integrado en muchas de las placas de
Arduino (UNO, MEGA, etc) conectado fsicamente al PIN 13.
No os olvidis del PIN 13 a la hora de realizar vuestros programas. Resulta de gran
ayuda a la hora de debugear de vuestros programas.

Finalmente, pulsamos en el botn remarcado para compilar y enviar


la programacin a nuestra placa Arduino. Tras unos segundos, el IDE
compilar el programa y la pantalla debera ser similar a la siguiente.

Tras unos parpadeos, la placa empezar a ejecutar el programa,


encendiendo y apagando el LED. Estamos de acuerdo en que no es muy
espectacular que digamos, pero lo importante es que si habis llegado

hasta aqu significa que todo funciona y est bien configurado, y a


partir de aqu estis listos para empezar a jugar.

ALIMENTACIN EXTERNA
Una vez hemos programado nuestra placa es momento de quitar el
cable USB y realizar una alimentacin externa. Arduino UNO y
MEGA pueden ser alimentados mediante dos medios. El origen de la
alimentacin se selecciona automticamente.

Alimentacin regulada a 5V mediante el puerto USB. Podemos conectar un


transformador, una batera exterior de 5V, o cualquier otra fuente 5V mediante
un conector USB. Esta entrada debe estar regulada en alimentacin, es
decir, debe ser estable, constante y fija a 5V, ya que Arduino no realiza la
supervisin del voltaje introducido a travs de esta entrada.

Alimentacin mediante el conector Vin, con un voltaje de entre 6 a 20


voltios, aunque lo ideal es entre 7 a 12 voltios. Por ejemplo, podemos
conectar un transformador, una o varias batera, una pila de 9V, o una
agrupacin de 4 o 6 pilas de 1.5V, para alimentar nuestros proyectos.

/* Parpadeo sin delay()


Enciende y apaga un LED conectado a un pin digital sin utilizar la funcin delay().
Esto significa que otro cdigo se puede ejecutar al mismo tiempo sin ser
interrumpido por el cdigo que controla el parpadeo del LED
Circuito: Un LED conectado entre el pin 13 y el pin GND.
Nota: en muchos Arduinos hay un LED en la placa conectado al pin 13, por lo que no
sera necesario un LED externo para este ejemplo.
Creado en 2005 por David A. Mellis, modificado el 8/2/2010 por Paul Stoffregen.
Este ejemplo es de dominio pblico*/
// las constantes no cambian. Las usamos aqu para establecer los nmeros de los
pines.
int ledPin = 13; // el nmero del pin conectado al LED
// variables que cambiarn de valor.
int ledState = LOW; // ledState se usar para establecer el estado del LED
long previousMillis = 0; // almacenar la ltima vez que el estado del LED
//se actualiz
// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rpidamente al nmero que puede ser almacenado en una
// variable del tipo int
long interval = 1000; // intervalo del parpadeo (en milisegundos)
void setup()

{
// establece el pin digital como salida:
pinMode(ledPin, OUTPUT);
}
void loop()
{
// Aqu es donde pondramos el cdigo que debe ejecutarse durante todo el
// tiempo.
//
//
//
//

Se comprobar si es el momento de parpadear el LED, esto es, si la


diferencia entre el tiempo transcurrido y el tiempo en que parpade
por ltima vez el LED es mayor que el intervalo que establecimos en
la declaracin de variables.

unsigned long currentMillis = millis();

// Se toma el tiempo actual

// se comprueba si el tiempo actual menos el tiempo en que el LED cambi


// de estado por ltima vez es mayor que el intervalo.
if (currentMillis - previousMillis > interval){
// Si se cumple la condicin se guarda el nuevo tiempo
// en el que el LED cambia de estado
previousMillis = currentMillis;
// Y ahora cambiamos de estado el LED, si est encendido a
// apagado o viceversa.
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// Hacemos que el contenido de la variable llegue al LED
digitalWrite(ledPin, ledState);
}
}

CONDICIONAL ABREVIADO
1
2
3
4
5
6
7
8
9
1
0

if (variable < 10)


{
// accion A
}
if (variable < 10)
{
// accion A
}
else

1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8

{
// accion B
}
if (variable < 10)
{
// accion A
}
else if (variable >= 100)
{
// accion B
}
else
{
// accion C
}

CONDICIONAL SWITCH / CASE OF


1
switch (variable) {
2
case 1:
3
// accion A
4
break;
5
case 2:
6
// accion B
7
break;
8
default:
9
// caso por defecto (opcional)
1
}
0

BUCLE FOR

1 for (int i=0; i <= 100; i++){


2
// accion
3}

BUCLE WHILE
1 variable = 0;
2
3 while(variable < 100){
4
// accion
5
variable++;
6}

BUCLE DO WHILE
1 do
2{
3
//accion
4
variable++;
5 } while (variable < 100);

QU ES EL PUERTO DE SERIE?
Un puerto es el nombre genrico con que denominamos a los
interfaces, fsicos o virtuales, quepermiten la comunicacin entre dos
ordenadores o dispositivos.
Un puerto serie enva la informacin mediante una secuencia de
bits. Para ello se necesitan al menos dos conectores para realizar la
comunicacin de datos, RX (recepcin) y TX (transmisin). No obstante,
pueden existir otros conductores para referencia de tensin,
sincronismo de reloj, etc.
Por el contrario, un puerto paralelo enva la informacin mediante
mltiples canales de forma simultnea. Para ello necesita un nmero
superior de conductores de comunicacin, que varan en funcin del tipo
de puerto. Igualmente existe la posibilidad de conductores adicionales
adems de los de comunicacin.

Histricamente ambos tipos de puertos han convivido en los


ordenadores, emplendose los puertos paralelos en aquellas
aplicaciones que requeran la transmisin de mayores volmenes de
datos. Sin embargo, a medida que los procesadores se hicieron ms
rpidos los puertos de serie fueron desplazando progresivamente a
los puertos paralelos en la mayora de aplicaciones.
Un ordenador convencional dispone de varios puertos de serie. Los
ms conocidos son el popular USB (universal serial port) y el ya casi
olvidado RS-232 (el de los antiguos ratones). Sin embargo, dentro del
mbito de la informtica y automatizacin existen una gran cantidad
adicional de tipos de puertos serie, como por ejemplo el RS-485, I2C,
SPI, Serial Ata, Pcie Express, Ethernet o FireWire, entre otros.
En ocasiones veris referirse a los puertos de serie como UART.
La UART (universally asynchronous receiver/transmitter) es una unidad
que incorporan ciertos procesadores, encargada de realiza la conversin
de los datos a una secuencia de bits y transmitirlos o recibirlos a una
velocidad determinada.
Por otro lado, tambin podis or el trmino TTL (transistortransistor logic). Esto significa que la comunicacin se realiza mediante
variaciones en la seal entre 0V y Vcc (donde Vcc suele ser 3.3V o 5V).
Por el contrario, otros sistemas de transmisin emplean variaciones de
voltaje de -Vcc a +Vcc (por ejemplo, los puertos RS-232 tpicamente
varan entre -13V a 13V).

Antes de conectar dos sistemas debemos comprobar que los voltajes


empleados son compatibles. En caso de no serlo, necesitaremos un
subsistema que adapte los niveles de la seal, o podemos daar alguno de los
dispositivos.

ARDUINO Y EL PUERTO DE SERIE


Prcticamente todas las placas Arduino disponen al menos de
una unidad UART. Las placas Arduino UNO y Mini Pro disponen de una
unidad UART que operan a nivel TTL 0V / 5V, por lo que son
directamente compatibles con la conexin USB. Por su parte, Arduino
Mega y Arduino Due disponen de 4 unidades UART TTL 0V / 5V.
Los puertos serie estn fsicamente unidos a distintos pines de
la placa Arduino. Lgicamente, mientras usamos los puertos de serie no
podemos usar como entradas o salidas digitales los pines asociados con
el puerto de serie en uso.
En Arduino UNO y Mini Pro los pines empleados son 0 (RX) y 1 (TX).
En el caso de Arduino Mega y Arduino Due el puerto de serie 1 est
conectado a los pines 0 (RX) y 1 (TX), el puerto de serie 1 a los pines 19
(RX) y 18 (TX) el puerto de serie 2 a los pines 17 (RX) y 16 (TX), y el puerto
serie 3 a los pines 15 (RX) y 14 (TX).
Muchos modelos de placas Arduino disponen de un conector
USB o Micro USB conectado a uno de los puertos de serie, lo que
simplifica el proceso de conexin con un ordenador. Sin embargo
algunas placas, como por ejemplo la Mini Pro, prescinden de este
conector por lo que la nica forma de conectarse a las mismas es
directamente a travs de los pines correspondientes.

CONEXIN DEL ARDUINO CON UN


ORDENADOR
Para realizar la conexin mediante puerto serie uncamente es
necesario conectar nuestra placa Arduinoempleando el mismo
interface que empleamos para programarlo. A continuacin

abrimos el IDE Standard de Arduino y hacemos click en el Monitor


Serial como se indica en al imagen.

El monitor de puerto serie es una pequea utilidad integrada dentro


de IDE Standard que nos permite enviar y recibir fcilmente
informacin a travs del puerto serie. Su uso es muy sencillo, y
dispone de dos zonas, una que muestra los datos recibidos, y otra para
enviarlos. Estas zonas se muestran en la siguiente imagen.

Pese a su sencillez este monitor de puerto serie es suficiente para


los ejemplos de esta entrada, y resulta muy til para realizar test o
experimentos rpidos.

CDIGOS DE EJEMPLO
RECIBIR INFORMACIN DESDE EL
ARDUINO
En este primer cdigo vamos a recibir el valor de un contador enviado
desde la placa Arduino. Este valor se incrementa cada segundo.
Podemos observar como se reciben los valores desde del monitor serial.
1
2
3
4
5
6
7
8
9
1
0
1
1

int cont=0;
void setup(){
//iniciamos el puerto de serie
Serial.begin(9600);
}
void loop(){
//Imprimimos el valor del contador
Serial.print("Contador: ");
Serial.println(cont);
//incrementamos el contador y esperamos un segundo

1
2
1
3
cont++;
1
delay(1000);
4
}
1
5
1
6

ENVIAR INFORMACIN AL
ARDUINO
En este ejemplo empleamos el puerto de serie para encender o apagar
el LED integrado en la placa Arduino. Para ello enviamos un carcter a la
placa Arduino, empleando el monitor serial. En caso de enviar a la placa
Arduino apaga el LED, y en caso de enviar b lo enciende.
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3

int option;
int led = 13;
void setup(){
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop(){
//si existe datos disponibles los leemos
if (Serial.available()>0){
//leemos la opcion enviada
option=Serial.read();
if(option=='a') {
digitalWrite(led, LOW);
Serial.println("OFF");
}
if(option=='b') {
digitalWrite(led, HIGH);
Serial.println("ON");
}
}
}

ENVIAR VALORES NUMRICOS

Por ltimo, en este ejemplo enviamos un nmero entre 1 a 9 a travs del


monitor serial, y la placa Ardunino hace parpadear el LED integrado el
nmero de veces indicado. El cdigo es similar al anterior, pero se hace
notar que al enviarse los datos caracteres ASCII, debemos restar el valor
0 al dato recibido para recuperar el valor numrico enviado.
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7

int option;
int led = 13;
void setup(){
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop(){
//si existe informacin pendiente
if (Serial.available()>0){
//leeemos la opcion
char option = Serial.read();
//si la opcion esta entre '1' y '9'
if (option >= '1' && option <= '9')
{
//restamos el valor '0' para obtener el numeroenviado
option -= '0';
for(int i=0;i<option;i++){
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(200);
}
}
}
}

Hasta aqu los ejemplos bsicos. En prximas entradas veremos


ejemplos ms complicados para realizar interfaces completas, y cmo
poder transmitir o recibir datos mediante Java, C#, Python, a travs del
entorno Processiong, o directamente desde la consola en Windows o
Linux.

MEDIR NIVEL DE LUZ CON ARDUINO Y


FOTORESISTENCIA LDR (GL55)

MONTAJE
Por su parte, el montaje elctrico en una protoboard quedara de la
siguiente manera.

EJEMPLOS DE CDIGO
A continuacin tenis algunos ejemplos de cdigo. En el siguiente,
usamos las entradas digitales para hacer parpadear el LED integrado en
la placa mientras el LDR recibe luz suficiente.
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2

const int LEDPin = 13;


const int LDRPin = 2;
void setup()
{
pinMode(LEDPin, OUTPUT);
pinMode(LDRPin, INPUT);
}
void loop()
{
int value = digitalRead(LDRPin);
if (value == HIGH)
{
digitalWrite(LEDPin, HIGH);
delay(50);
digitalWrite(LEDPin, LOW);
delay(50);
}
}

El siguiente ejemplo emplea una entrada analgica para activar el LED


integrado en la placa si supera un cierto umbral (threshold).
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8

const int LEDPin = 13;


const int LDRPin = A0;
const int threshold = 100;
void setup() {
pinMode(LEDPin, OUTPUT);
pinMode(LDRPin, INPUT);
}
void loop() {
int input = analogRead(LDRPin);
if (input > threshold) {
digitalWrite(LEDPin, HIGH);
}
else {
digitalWrite(LEDPin, LOW);
}
}

El siguiente cdigo proporciona una lectura del nivel de iluminacin


recibido. Observar que los clculos se realizan con aritmtica de enteros,
evitando emplear nmeros de coma flotante, dado que ralentizan
mucho la ejecucin del cdigo.
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7

const
const
const
const

long A = 1000;
//Resistencia en oscuridad KO
int B = 15;
//Resistencia a la luz (10 Lux) KO
int Rc = 10;
//Resistencia calibracion KO
int LDRPin = A0; //Pin del LDR

int V;
int ilum;
void setup()
{
Serial.begin(115200);
}
void loop()
{
V = analogRead(LDRPin);
//ilum = ((long)(1024-V)*A*10)/((long)B*Rc*V); //usar si
ilum = ((long)V*A*10)/((long)B*Rc*(1024-V)); //usar si
Serial.println(ilum);
delay(1000);
}

1
8
1
9
2
0
2
1
2
2
2
3

MEDIR TEMPERATURA CON ARDUINO Y


TERMISTOR (MF52)

ESQUEMA ELCTRICO
El esquema elctrico sera el siguiente.

MONTAJE
Por su parte, el montaje elctrico en una protoboard quedara de la
siguiente manera.

EJEMPLOS DE CDIGO
A continuacin un ejemplo de cdigo. El siguiente cdigo realiza la
lectura de la resistencia del termistor, y emplea la ecuacin de SteinhartHart para calcular la temperatura y mostrarla por puerto de serie.
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6

#include <math.h>
const int Rc = 10000; //valor de la resistencia
const int Vcc = 5;
const int SensorPIN = A0;
float A = 1.11492089e-3;
float B = 2.372075385e-4;
float C = 6.954079529e-8;
float K = 2.5; //factor de disipacion en mW/C
void setup()
{
Serial.begin(9600);
}
void loop()
{
float raw = analogRead(SensorPIN);
float V = raw / 1024 * Vcc;
float R = (Rc * V ) / (Vcc - V);

1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
float logR = log(R);
2
float R_th = 1.0 / (A + B * logR + C * logR * logR * logR );
5
2
float kelvin = R_th - V*V/(K * R)*1000;
6
float celsius = kelvin - 273.15;
2
7
Serial.print("T = ");
2
Serial.print(celsius);
8
Serial.print("C\n");
2
delay(2500);
9
}
3
0
3
1
3
2
3
3
3
4
3
5
3
6

Los valores A, B y C empleados estn calibrados para una resistencia


MF52 10kOhm, y debern ser cambiados para otro tipo de termistores.
En ocasiones, podemos obtener estos valores directamente del
Datasheet del componente. Sin embargo, resulta frecuente que
nicamente se proporcione un valor Beta, correspondiente con un
modelo de menor precisin que Steinhart-Hart. En estos casos, debemos
obtener los valores A, B y C por ajuste de la tabla de resistencias y
temperaturas del sensor.

QUE ES UN SENSOR DE ULTRASONIDOS?


Un sensor de ultra sonidos es un dispositivo para medir
distancias. Su funcionamiento se base en el envo de un pulso de alta
frecuencia, no audible por el ser humano. Este pulso rebota en los

objetos cercanos y es reflejado hacia el sensor, que dispone de un


micrfono adecuado para esa frecuencia.
Midiendo el tiempo entre pulsos, conociendo la velocidad del
sonido, podemos estimar la distancia del objeto contra cuya superficie
impacto el impulso de ultrasonidos
Los sensores de ultrasonidos son sensores baratos, y sencillos de
usar. El rango de medicin terico del sensor HC-SR04 es de 2cm a 400
cm, con una resolucin de 0.3cm. En la prctica, sin embargo, el rango
de medicin real es mucho ms limitado, en torno a 20cm a 2 metros.
Los sensores de ultrasonidos son sensores de baja precisin. La
orientacin de la superficie a medir puede provocar que la onda se
refleje, falseando la medicin. Adems, no resultan adecuados en
entornos con gran nmero de objetos, dado que el sonido rebota en las
superficies generando ecos y falsas mediciones. Tampoco son
apropiados para el funcionamiento en el exterior y al aire libre.
Pese a esta baja precisin, que impide conocer con precisin la
distancia a un objeto, los sensores de ultrasonidos son ampliamente
empleados. En robtica es habitual montar uno o varios de estos
sensiores, por ejemplo, para deteccin de obstculos, determinar la
posicin del robot, crear mapas de entorno, o resolver laberintos. En
aplicaciones en que se requiera una precisin superior en la medicin de
la distancia, suelen acompaarse de medidores de distancia por
infrarrojos.

PRECIO
El sensor de ultrasonidos HC-SR04 es un sensor barato. Podemos
encontrar unidades por 0,65 en AliExpress.

CMO FUNCIONA UN SENSOR DE ULTRASONIDOS?


El sensor se basa simplemente en medir el tiempo entre el envo y
la recepcin de un pulso sonoro. Sabemos que la velocidad del sonido
es 343 m/s en condiciones de temperatura 20 C, 50% de humedad,
presin atmosfrica a nivel del mar. Transformando unidades resulta

Es decir, el sonido tarda 29,2 microsegundos en recorrer un


centmetro. Por tanto, podemos obtener la distancia a partir del tiempo
entre la emisin y recepcin del pulso mediante la siguiente ecuacin.

El motivo de divir por dos el tiempo (adems de la velociad del


sonido en las unidades apropiadas, que hemos calculado antes) es
porque hemos medido el tiempo que tarda el pulso en ir y volver, por lo
que la distancia recorrida por el pulso es el doble de la que queremos
medir.

ESQUEMA ELCTRICO
El esquema elctrico que necesitamos es el siguiente.

MONTAJE
Mientras que el montaje en una protoboard sera el siguiente.

EJEMPLO DE CDIGO
Para activar el sensor necesitamos generar un pulso elctrico en el
pin Trigger (disparador) de al menos 2ms. Nosotros generaremos un
pulso de 5ms. Previamente, pondremos el pin a Low durante 2ms para
asegurar un disparo limpio.
Posteriormente usamos la funcin pulseIn para obtener el tiempo
requerido por el pulso para volver al sensor. Finalmente, convertirmos el
tiempo en distancia mediante la ecuacin correspondiente.
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1

const int EchoPin = 5;


const int TriggerPin = 6;
const int LedPin = 13;
void setup() {
Serial.begin(9600);
pinMode(LedPin, OUTPUT);
pinMode(TriggerPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop() {
int cm = ping(TriggerPin, EchoPin);
Serial.print("Distancia: ");
Serial.println(cm);
delay(1000);
}
int ping(int TriggerPin, int EchoPin) {
long duration, distanceCm;

5
1
6
1
7
1
8
1
9
2
0
2
digitalWrite(TriggerPin, LOW); //para generar un pulso limpio
1
delayMicroseconds(2);
2
digitalWrite(TriggerPin, HIGH); //generamos Trigger (disparo) de 5ms
2
delayMicroseconds(5);
2
digitalWrite(TriggerPin, LOW);
3
2
4
duration = pulseIn(EchoPin, HIGH); //medimos el tiempo entre pulsos, en
2 microseg
5
2
distanceCm = duration * 10 / 292/ 2; //convertimos a distancia, en cm
6
return distanceCm;
2 }
7
2
8
2
9
3
0
3
1
3
2

Un optointerruptor infrarrojo
-

En este proyecto usaremos un optointerruptor infrarrojo como sensor. Este


optointerruptor infrarrojo est formado por dos componentes. Un led emisor
de luz infrarroja y un fototransitor sensible a esta luz. Los dos estan
montados en una pequea estructura plstica, que les da soporte y permite
el paso de la luz infrarroja entre ambos componentes, protegiendolos de
otras emisiones de luz.
Para hacer funcionar el sensor, introducimos un cartn o una tarjeta en la
ranura y de esta manera impedimos el paso de la luz infrarroja entre ambos
componentes. Con esto cambiamos el estado de la salida del sensor.
Cuando pasa la luz, el fototransitor se activa y cierra el circuito, con lo que
tendremos 5 Volts a la salida. Cuando interrumpimos el paso de luz, se
desactiva y se abre el circuito, quedando en 0 Volts la salida.

Componentes

arduino

protoboard

un led

un optointerruptor infrarrojo ITR8102

2 resistencias de 220 oms (rojo, rojo, caf)

1 resistencia de 10 Koms (caf, negro, naranja)

Circuito
El sensor tiene dos componentes que tenemos que conectar. Un led emisor de luz
infrarroja y un fototransitor sensible a esta luz.
En la parte superior del sensor, cada lado esta marcado con una letra: E para el
emisor y D para el detector. Y en ambos lados, tiene tambin un simbolo + que marca
la pata del nodo, el positivo, de cada componente.
El led emisor lo tenemos que conectar como hemos conectado los otros leds. La pata
del nodo, el positivo, a 5 Volts. La pata del ctodo, el negativo, a tierra, a travs de
una resistencia de 220 Oms.
Del fototransitor, tenemos que conectar el colector, el positivo, a 5 Volts y el emisor, a
travs de una resistencia pulldown de 10 KOms a tierra. Es en este mismo punto, la
salida del emisor, donde conectaremos el pin de entrada del Arduino para sensar. Si el
fototransitor est recibiendo la luz infrarroja, estar cerrado y entonces este punto
estar a 5 Volts. Si el paso de la luz infrarroja est interrumpido, el fototransistor estar
abierto y entonces tendremos los 0 Volts de la resistencia pulldown.
Como en el caso del botn, instalaremos tambin otro circuito con un led, para
prenderlo y apagarlo segn el estado del sensor.

al inicio

Cdigo

El funcionamiento de este circuito es practicamente el mismo que


el de un botn con un led. Por lo que usaremos el mismo skectch.
/*
Un optointerruptor infrarrojo como sensor
Enciende y apaga un led cuando se interrumpe el paso de
luz entre el emisor y el receptor del sensor
El funcionamiento es similar al de sensando un boton
*/
// constantes para definir los pines del sensor y del led
const int pinSensor = 12;
// el numero de pin del sensor
const int pinLed
= 9;
// el numero de pin del led
// variables para guardar los valores de los sensores
int estadoSensor = 0;
// para leer y guardar el
estado del sensor
void setup() {
// inicializa el pin del led como de salida
pinMode(pinLed, OUTPUT);
// inicializa el pin del sensor como de entrada
pinMode(pinSensor, INPUT);
}
void loop(){
// lee el valor del estado del sensor y lo guarda en la
variable estadoSensor
estadoSensor = digitalRead(pinSensor);
// checa el estado del sensor con un if
if (estadoSensor == HIGH) {
// si es HIGH, el sensor esta activado por el paso de la
luz y se prende el led
digitalWrite(pinLed, HIGH);
}
else {
// entonces es LOW, el sensor esta desactivado, cortado el
paso de luz y se apaga el led
digitalWrite(pinLed, LOW);
}
}

Variantes
En lugar de un slo led, podemos usar un led bicolor, que se prenda en
verde cuando el sensor este libre y en rojo cuando interrumpamos la seal
con algun objeto.

Ejercicio 3: servos

Vamos a empezar a hacer ejercicios con un nivel de dificultad algo mayor y


vamos a empezar a utilizar la protoboard para ir pinchando en ella algunos
componentes y cables para hacer conexiones. Todos los materiales necesarios
para este ejercicio estn contenidos en el Kit WorkShop.
Primero haremos un mando para un servo de radio control.
Utilizaremos un potencimetro para controlar el movimiento de giro del eje de
un servomotor.
Circuito:

Imagen generada con Fritzing.

Los servomotores tienes tres cables: alimentacin (rojo), GND (que puede ser
negro o marrn) y seal (que puede ser blanco o naranja). El cable de
alimentacin debe ser conectado al pin 5V de la placa Arduino. El cable GND
debe ser conectado al pin GND de la placa Arduino. El pin de seal se conecta
al pin 9 de la placa Arduino UNO para este ejercicio.
AVISO: En este ejercicio vamos a utilizar un micro servo de 9g cuyo
consumo es tolerado por la placa, para otros montajes en los que el servo

utilizado sea mayor NO se pueden conectar la tierra y la alimentacin del


servo a la placa Arduino si no directamente a la fuente de alimentacin o
a una batera.
El potencimetro debe ser conectado de manera que los dos pines exteriores
estn conectado a alimentacin (+5V) y a GND, el pin central lo conectaremos a
la entrada analgica 0 en el Arduino UNO.
En este ejercicio vamos a ver como se incluye una librera para hacernos ms
fcil el interactuar con un dispositivo, en este caso el servo.
/ Controlando la posicin de un servo usando un potencimetro (resistencia
variable)
// Por Michal Rinott
#include <Servo.h> // Carga la librera Servo.h que contiene mtodos para trabajar
con servos
Servo myservo; // Crea un objeto servo para controlar el servomotor
int potpin = 0; // Pin analgico usado para conectar el potencimetro
int val;
// variable para leer el valor del pin analgico
void setup()
{
myservo.attach(9); // asocia el servo al pin 9
}
void loop()
{
val = analogRead(potpin); // lee el valor del potencimetro (valor
//entre 0 y 1023)
val = map(val, 0, 1023, 0, 179); // escala el valor para usarlo con el
//servo (valor entre 0 y 180)
myservo.write(val);
// fija la posicin del servo de acuerdo
//al valor escalado
delay(15);
// espera a que el servo se posicione
}

Con un cdigo tan sencillo haremos que el servo se mueva segn movamos el
potencimetro de modo que al estar el potencimetro en el lmite inferior de
su recorrido el servo estar en la posicin de 0, si centramos el potencimetro
el servo estar en la posicin de 90 y si llevamos el potencimetro a su lmite
superior el servo alcanzar la posicin de 180.

Vamos a aprovechar este ejercicio para introducir un mtodo que puede ser
utilizado tanto para el de depurado de cdigo como el calibrado de un
actuador o un sensor.
Imaginemos que tenemos hecho nuestro Sketch, lo subimos a la placa y, a
pesar de estar correctamente escrito (no da errores el compilador), no hace lo
que nosotros queremos. El error puede estar en la forma en que trabajamos
con los valores de forma interna y eso no lo podemos ver a menos que los
mostremos por el monitor serie.
Otro caso puede ser que, una vez realizado nuestro montaje, queramos que el
servo comience su recorrido desde una posicin determinada y no sabemos
cual es. Entonces podemos utilizar el monitor serie para calibrar nuestro servo
y su recorrido.
Para ello activaremos el puerto serie incluyendo en el setup() la lnea:
1 Serial.begin(9600);

Esta instruccin inicializar la comunicacin con el ordenador a travs del


puerto serie.
Luego iremos al final del Sketch, justo a la ltima lnea, donde est el comando
delay(15) y antes de ella insertaremos el comando que dar salida a los datos
que veremos en el monitor serie:
1 Serial.println(val);

Por ltimo, y para darle tiempo al monitor serie a mostrar los datos sin que
estos bailen a toda velocidad cambiaremos el valor del comando delay() a
500ms. De esta forma nuestro Sketch mover el servo y nos mostrar la
posicin en la que se encuentra cada medio segundo, as podemos dejar el
servo en la posicin exacta que queramos viendo el nmero contenido dentro
de la variable val.
Subiremos el Sketch a la placa y activaremos el monitor serie. No pongo el
ejercicio resuelto para que os esforcis un poquito.
El tipo de seal que se le enva al servo desde la placa Arduino UNO es la seal
de control que se utiliza en todos los mecanismos de radio control (servos,

receptores, variadores, etc). Es tipo de seal muy concreto que aunque se


pueda etiquetar con unas siglas que aqu no voy a utilizar tiene unas
caractersticas que me impiden etiquetarla como tal, en breve publicar el
apndice de este ejercicio en el que explicar y definir con todo lujo de
detalles y ejemplos como son las seales de control de RC.

MOTOR DC CAMBIO DE GIRO CON POTENCIOMETRO

You might also like