Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ARDUINO
en diseño de Robots
Móviles
GRUPO A
Iván Cantero Mencerreyes Yen Hi Lee Lay
Pedro Quintero
Quintero
ÍNDICE
1.
Introducción .........................................................................................................................................................4
2.
Descripción
Hardware .....................................................................................................................................5
2.1.
Microcontrolador
Atmega168/V .............................................................................................................5
2.1.1.
Características
Generales..................................................................................................................5
2.1.2.
Arquitectura............................................................................................................................................6
2.2
Tipos
de
placas
y
perifericos ................................................................................................................... 20
2.2.1
Duemilanove
Arduino....................................................................................................................... 20
2.2.2
Diecimila
Arduino............................................................................................................................... 26
2.2.3
Nano
Arduino ....................................................................................................................................... 27
2.2.4
Mega
Arduino ....................................................................................................................................... 28
2.2.5
Otras
placas........................................................................................................................................... 31
3.
Librerías
en
Arduino...................................................................................................................................... 33
3.1
Introducción ................................................................................................................................................... 33
3.2
Lenguaje
de
programación
Arduino..................................................................................................... 34
3.2.1
Processing.............................................................................................................................................. 34
3.2.2
Funciones
básicas
y
operadores .................................................................................................. 34
3.2.3
AVR
Libc ................................................................................................................................................. 37
3.2.4
Diferencias
con
Processing............................................................................................................. 40
3.2.5
Ejemplo
práctico:
Hola
Mundo
en
Arduino ............................................................................. 41
3.3
Extendiendo
la
funcionalidad:
Librerías ............................................................................................ 42
3.3.1
Librerías
principales ......................................................................................................................... 42
3.3.2
Creación
de
librerías ......................................................................................................................... 43
4.
SOFTWARE......................................................................................................................................................... 47
4.1
Introducción ................................................................................................................................................... 47
4.2
Instalación
del
Software
Arduino .......................................................................................................... 47
4.2.1
Instalación
del
IDE
en
Windows .................................................................................................. 47
4.2.2
Instalación
del
IDE
en
Mac
OS
X
(v.
10.3.9
o
posterior)..................................................... 51
4.2.3
Instalación
del
IDE
en
GNU/Linux .............................................................................................. 53
4.3
Introducción
al
entorno
Arduino........................................................................................................... 54
4.3.1
Barra
de
Herramientas..................................................................................................................... 54
4.3.2.
Menús ..................................................................................................................................................... 55
5.
Control
de
motores
con
Arduino .............................................................................................................. 56
5.1
Control
de
motores
DC
con
puente
en
H ............................................................................................ 56
5.1.1
Puente
en
H.
………………………………………………………………………………………………….
56
5.1.2
Conexión
del
motor
y
el
puente
en
H ......................................................................................... 57
5.1.3
Programación....................................................................................................................................... 58
5.2
Control
de
motores
con
Motor
Shield
Arduino ........................................................................... 59
5.2.2
Control
de
motores
de
corriente
continua
con
Motor
Shield.......................................... 60
5.2.3
Control
de
servos
con
Motor
Shield ........................................................................................... 61
5.2.4
Control
de
motores
paso
a
paso
con
Motor
Shield............................................................... 62
6.
Aplicaciones
de
Arduino
en
Micro-‐Robots
Móviles.......................................................................... 64
6.1
Introducción ................................................................................................................................................... 64
6.2
Montaje ............................................................................................................................................................. 65
6.2.1
Componentes ......................................................................................................................................... 65
6.2.2
Construcción .......................................................................................................................................... 68
6.2.3
Test
del
Asuro........................................................................................................................................ 69
6.3
ATmega8 .......................................................................................................................................................... 72
6.3.1
Reemplazamiento
del
ATmega8.................................................................................................... 72
6.3.2
Cambiando
los
ficheros
de
Arduino............................................................................................. 72
6.3.3
Conexión
y
programación
de
Asuro
con
Arduino .................................................................. 73
6.4
Funciones..
………………………………………………………………………………………………………….…………..77
1.
Introducción
Éste
trabajo
acerca
de
Arduino
tiene
como
único
objetivo
ilustrar
a
cualquier
persona
que
se
inicie
en
el
conocimiento
y
desarrollo
de
aplicaciones
con
la
placa.
La
elaboración
del
trabajo
se
a
echo
repartiendo
las
secciones
básicas
de
conocimiento
de
la
placa
de
tal
manera
que
se
trata
por
un
lado
el
chip
controlador
Atmega168/V
y
toda
su
estructura
interna
a
nivel
hardware,
y
por
otro
lado
se
habla
sobre
distintos
modelos
de
placas
en
los
que
podemos
encontrarnos
insertado
el
chip,
además
de
sus
principales
características
físicas
y
de
periféricos.
Después
de
ésto
tratamos
de
definir
el
lenguaje
de
programación
y
las
librerías
que
utiliza
Arduino
y
también
su
entorno
de
desarrollo.
Posteriormente
se
explicarán
dos
casos
prácticos
en
los
que
se
muestra
en
su
totalidad
como
llevar
a
cabo
una
aplicación
con
la
placa.
El
primero
de
ellos
trata
sobre
como
se
pueden
controlar
motores
fácilmente
con
una
placa
arduino
2.
Descripción
Hardware
2.1.
Microcontrolador
Atmega168/V
2.1.1.
Características
Generales
Figura
1:
Diagrama
de
Bloques.
2.1.2.
Arquitectura.
A continuación se muestra la arquitectura del núcleo AVR del ATmega168:
Figura
2:
Arquitectura
del
AVR.
El
Atmega168
utiliza
una
arquitectura
Harvard
con
la
memoria
y
el
bus
de
programa
y
de
datos
separados.
Las
instrucciones
en
la
memoria
de
programa
se
ejecutan
en
un
solo
nivel
de
pipeline.
Mientras
una
instrucción
se
ejecuta,
la
siguiente
instrucción
se
carga
en
la
memoria
de
programa.
Esto
permite
que
las
instrucciones
se
ejecuten
en
un
solo
ciclo
de
reloj.
La
mayoría
de
estas
instrucciones
tienen
un
formato
de
16
bits.
Los
32
registros
de
8
bits
de
propósito
general
se
localizan
al
principio
de
la
memoria
SRAM.
En
la
siguiente
figura
se
observa
la
distribución
de
los
registros:
Figura
3:
Registros
de
Propósito
General.
como
tres
punteros
de
16
bits
para
direccionamiento
indirecto
a
memoria
de
datos.
Estos
registros
se
denominan
X,
Y,
Z.
La
ALU
opera
en
conexión
directa
con
los
32
registros
de
propósito
general.
Las
operaciones
aritméticas
entre
los
registros
se
realizan
dentro
de
un
solo
ciclo
de
reloj.
Las
operaciones
soportadas
por
la
ALU
se
dividen
en
tres
categorías
principales:
aritméticas,
lógicas,
y
funciones
a
nivel
de
bit.
Algunas
implementaciones
de
la
arquitectura
proporcionan
un
multiplicador
que
realiza
operaciones
de
multiplicación
con
o
sin
signo.
Figura
4:
Registro
de
Estado.
La
pila
se
usa
principalmente
para
almacenar
datos
temporales,
para
almacenamiento
local
de
variables
y
para
almacenar
direcciones
de
retorno
después
de
interrupciones
y
de
llamadas
a
subrutina.
El
puntero
de
pila
apunta
a
los
datos
de
la
SRAM
que
funciona
como
pila.
El
espacio
de
la
pila
la
define
el
usuario.
El
puntero
de
pila
está
implementado
en
dos
registros
de
8
bits:
Figura
5:
Puntero
de
Pila.
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
7
Memoria.
Figura
6:
Mapa
de
memoria
Flash.
• Memoria
SRAM.
La
memoria
SRAM
del
ATmega168
tiene
una
capacidad
de
1Kbyte
para
datos.
Las
32
primeras
posiciones
direccionan
a
los
registros
de
propósito
general,
los
siguientes
64
localizaciones
para
registros
estándar
de
entrada/salida
(registros
de
los
periféricos),
después
160
posiciones
para
memoria
extendida
de
entrada/salida
y
las
últimas
1024
para
memoria
de
datos
interna.
asociado
a
tres
registros:
un
Registro
de
Direcciones
(EEAR),
un
Registro
de
Datos
(EEDR)
y
un
Registro
de
Control
(EECR).
.
2.1.3.
Puertos
de
Entrada/Salida.
La
figura
2
muestra
la
distribución
de
terminales
del
microcontrolador
para
un
encapsulado
PDIP:
Figura
8:
Encapsulado
PDIP.
A
continuación
se
detallan
los
terminales
del
ATmega168.
• 3
puertos
paralelos
bidireccionales
de
8
bits
(Puerto
B),
7
bits
(Puerto
C)
y
8
bits
(Puerto
D)
con
resistencia
de
pull-‐up
interna
seleccionable.
Además
de
la
función
típica
de
entrada/salida,
estos
puertos
pueden
ser
configurados
para
realizar
otras
funciones
alternativas.
Así,
por
ejemplo:
o
El
Puerto
B
puede
utilizarse
como
entrada
de
señal
de
reloj
del
chip
(XTAL1,
XTAL2),
salida
del
divisor
de
la
señal
de
reloj
(CLKO),
entrada
de
señal
de
reloj
asíncrona
externa
para
los
Temporizadores/Contadores
(TOSCI1,
TOSCI2),
entrada
de
eventos
para
los
Temporizadores/Contadores
(ICP1),
modulación
en
pulso
de
señal
PWM
(OC1A,
OC2A,
OC1B),
fuentes
de
interrupción
externas
(PCINT0..PCINT7),
comunicación
SPI
(SCK,
MISO,
MOSI,
SS).
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
9
Figura
9:
Funciones
Alternativas
Puerto
B.
o El
Puerto
C
tiene
como
funciones
alternativas
las
siguientes:
entrada
de
reset
(RESET),
canales
de
entrada
al
ADC
(ADC0..ADC5),
comunicación
serie
TWI
(SCL,
SDA)
y
también
incorpora
fuentes
de
interrupción
externas
(PCINT8..PCINT14).
Figura
10:
Funciones
Alternativas
Puerto
C.
o Las
funciones
alternativas
del
Puerto
D
son:
canales
de
entrada
al
Comparador
Analógico
(AIN0,
AIN1),
modulación
en
pulso
de
señal
PWM
(OC0A,
OC0B,
OC2B),
entrada
de
señal
de
reloj
síncrona
externa
para
los
Temporizadores/Contadores
(T0,
T1),
comunicación
serie
USART
(XCK,
TXD,
RXD)
y
fuentes
de
interrupción
externas
(INT0,
INT1,
PCINT16..PCINT23).
Figura
11:
Funciones
Alternativas
Puerto
D.
Cada
pin
del
puerto
tiene
asociado
tres
registros
de
8
bits
para
cada
puerto
(x):
Registro
de
Direcciones
(DDRx)
para
configurar
la
dirección
de
los
pines
del
puerto
(entrada/salida),
el
Registro
de
Datos
del
Puerto
(PORTx)
para
escribir
o
leer
en
el
pin
correspondiente
configurado
como
salida
y
para
leer
los
pines
del
puerto
configurados
como
entrada
el
Registro
de
los
Pines
(PINx).
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
10
Figura
12:
Configuración
de
Pines.
Figura
13:
Esquema
de
un
Pin
Genérico
2.1.4.
Interrupciones.
El
ATmega168
dispone
de
26
fuentes
de
interrupción
asociadas
a
los
periféricos
del
microcontrolador
y
a
señales
externas
al
mismo.
En
la
siguiente
tabla
se
muestra
la
dirección
de
memoria
de
programa
asignada
a
cada
interrupción:
Figura
14:
Tabla
de
Vectores
de
Interrupción.
Las
interrupciones
externas
del
microcontrolador
se
controlan
mediante
los
siguientes
registros:
• Registro
de
Control
A
(EICRA):
Este
registro
determina
el
modo
de
activación
de
las
interrupciones
INT0
e
INT1,
por
flanco
de
subida
o
de
bajada
o
por
nivel
alto
o
bajo.
Figura
15:
Registro
de
Control
de
Interrupciones
Externas
INT0
e
INT1.
• Registro
Máscara
(EIMSK):
Con
este
registro
se
habilitan
(1)
o
deshabilitan
(0)
las
fuentes
de
interrupción
externas
INT0
e
INT1,
siempre
y
cuando
el
bit
I
del
Registro
de
Estado
este
activo.
Figura
16:
Registro
Máscara
de
Interrupciones
Externas
INT0
e
INT1.
• Registro
de
Bandera
(EIFR):
Su
función
es
indicar
cuando
las
interrupciones
INT0
e
INT1
se
han
activado
(1)
o
no
(0).
Figura
17:
Registro
de
Bandera
de
Interrupciones
Externas
INT0
e
INT1.
Registro
de
Control
(PCICR),
Registros
Máscara
(PCMSK0..PCMSK2)
y
Registro
de
Bandera
(PCIFR).
2.1.4.
Temporizador/Contador.
Este
microcontrolador
contiene
tres
Temporizadores/Contadores:
un
Temporizadores/Contadores
de
8
bits
(TCNT0
y
TCNT2)
y
un
Temporizador/Contador
de
16
bits
(TCNT1).
Cada
uno
de
los
Temporizadores/Contadores
contiene
dos
unidades
de
comparación
que
permiten
la
generación
de
señales
con
modulación
en
pulso
PWM
(OCR).
Se
explicará
el
primero
de
ellos
(TCNT0)
siendo
análogo
el
funcionamiento
de
los
demás.
Figura
18:
Diagrama
de
Bloques
del
Temporizador/Contador
0.
A
continuación
se
pasan
a
describir
los
principales
registros
asociados
al
Temporizador
Contador
0:
• Registro
de
Control
A
(TCCR0A):
Con
este
registro
se
controla
la
función
alternativa
de
los
pines
de
salida
para
PWM
(OC0A,
OC1A,
OC0B
y
OC1B)
con
los
bits
COM0A0,
COM0A1,
COM0B0
y
COM0B1.
También
permite
elegir
entre
varios
modos
de
funcionamiento
del
generador
de
onda
con
WGM01
y
WGM00.
Figura
19:
Registro
de
Control
A.
• Registro
de
Control
B
(TCCR0B):
Las
funciones
de
este
registro
son
habilitar
los
registros
de
comparación
para
el
generador
de
onda
(FOC0A,
FC0B),
seleccionar
el
modo
de
funcionamiento
(WGM02)
y
seleccionar
la
fuente
de
reloj
(CS00..CS02).
Figura
20:
Registro
de
Control
B.
Figura
21:
Registro
Temporizador/Contador.
• Registros
de
Comparación
(OCR0A,
OCR0B):
Contienen
el
valor
a
comparar
con
el
Registro
Temporizador/Contador
TCNT0.
Figura
22:
Registro
de
Comparación
A
(B,
análogo).
Figura
23:
Registro
Máscara
de
Interrupciones.
• Registro
Bandera
de
Interrupción
(TIFR0):
Sus
bits
se
ponen
a
uno
cuando
las
interrupciones
de
comparación
y
la
de
desborde
se
activan.
Figura
24:
Registro
Bandera
de
Interrupciones.
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
15
Figura
25:
Diagrama
de
Bloques
del
ADC.
registro
ADCSRA
es
el
encargado
de
generar
las
señales
de
control
del
ADC
como
la
señal
de
enable,
la
señal
de
inicio
de
conversión,
el
prescaler
de
conversión
y
las
señales
de
interrupción.
Para
el
control
de
las
distintas
funcionalidades
del
Convertidor
A/D
se
utilizan
los
siguientes
registros:
• Registro
de
Selección
del
Multiplexor
(ADMUX):
Permite
seleccionar
distintos
voltajes
de
referencia
(REFS1,
REFS0)
y
también
el
canal
de
entrada
al
ADC
(MUX0..MUX3).
EL
bit
ADLAR
ajusta
el
resultado
a
la
derecha
o
izquierda
del
registro
de
datos.
Figura
26:
Registro
de
Selección
del
Multiplexor.
Figura
27:
Registro
de
Estado
y
de
Control
A.
• Registros
de
Datos
(ADCH,
ADCL):
Estos
2
registros
de
8
bits
contienen
el
resultado
de
la
conversión.
Figura
28:
Registros
de
Datos.
Figura
29:
Registro
de
Estado
y
de
Control
B.
• Registro
para
Deshabilitar
Entrada
Digital
(DIDR0):
Este
registro
deshabilita
la
función
de
entrada/salida
digital
de
los
canales
de
entrada
al
Convertidor
A/D
para
la
conversión.
Figura
31:
Diagrama
de
Bloques
del
Comparador
Analógico.
Figura
32:
Registro
de
Estado
y
de
Control
B.
Figura
33:
Registro
de
Control
y
de
Estado.
• Registro
para
Deshabilitar
Entrada
Digital
(DIDR1):
Este
registro
deshabilita
la
función
de
entrada/salida
digital
de
los
canales
de
entrada
al
Comparador
Analógico.
Figura
34:
Registro
de
Control
y
de
Estado.
Referencias
[1]Datasheet
ATmega48/68/168/V
AVR
Atmel,
2007-‐2009.
Resumen
-‐Microcontrolador
ATmega168
ó
Atmega328
-‐Tensión
de
funcionamiento:
5V.
-‐Entrada
de
voltaje
(recomendado):
7-‐12V.
-‐Voltaje
de
entrada
(límites):
6-‐20V.
-‐Pins
Digitales
I
/
O:
14
(de
las
cuales
6
proporcionar
una
salida
PWM).
-‐Pins
de
entrada
analógica:
6.
-‐
Corriente
DC
de
pin
I
/
O:
40
mA..
-‐Corriente
DC
para
Pin
de
3.3V:
50
mA.
-‐Memoria
Flash:
16
KB
(ATmega168)
o
de
32
KB
(Atmega328)
de
los
cuales
2
KB
utilizado
por
el
bootloader
(arranque).
-‐Memoria
SRAM:
1
KB
(ATmega168)
o
2
KB
(Atmega328).
-‐Memoria
EEPROM
512
bytes
(ATmega168)
o
1
KB
(Atmega328).
-‐Velocidad
del
reloj
de
16
MHz.
Alimentación
El
Duemilanove
Arduino
puede
ser
alimentado
a
través
de
la
conexión
USB
o
con
una
fuente
de
alimentación
externa.
La
fuente
de
alimentación
se
selecciona
automáticamente.
La
alimentación
externa
(no
USB)
puede
proceder
de
un
adaptador
AC
a
DC
o
una
batería.
El
adaptador
se
puede
conectar
con
una
clavija
2,1
mm
de
centro-‐positivo
en
el
enchufe
de
alimentación
de
la
placa.
Una
batería
puede
ser
insertada
entre
el
GND
y
el
pin
de
alimentación.
La
tarjeta
puede
operar
con
una
fuente
externa
de
6
a
20
voltios.
Si
se
suministra
con
menos
de
7V,
sin
embargo,
el
pin
de
5V
puede
proporcionar
menos
de
estos
cinco
voltios
y
la
placa
puede
ser
inestable.
Si
utiliza
más
de
12V,
el
regulador
de
voltaje
puede
sobrecalentarse
y
dañar
la
placa.
El
rango
recomendado
es
de
7
a
12
voltios.
Los
pines
de
alimentación
son
los
siguientes:
•
VIN.
Se
puede
proporcionar
el
voltaje
de
entrada
a
través
de
este
pin
a
la
placa
Arduino
cuando
está
usando
una
fuente
de
alimentación
externa
(en
lugar
de
5
voltios
de
la
conexión
USB
o
otra
fuente
de
alimentación
regulada).
•
5V.
Se
consiguen
5V
mediante
una
fuente
de
alimentación
reguladora.
Utilizada
para
alimentar
el
microcontrolador
y
otros
componentes
en
la
placa.
•
3V3.
Unos
3,3
voltios
generados
por
el
chip
FTDI
situado
en
la
placa.
Corriente
máxima
de
50
mA.
•
GND.
Conexión
de
tierra.
Memoria
El
ATmega168
tiene
16
KB
de
memoria
flash
para
almacenar
el
código
(de
los
cuales
2
KB
se
utiliza
para
el
gestor
de
arranque),
la
Atmega328
dispone
de
32
KB,
(también
con
2
KB
utilizado
para
el
gestor
de
arranque).
El
ATmega168
tiene
1
MB
de
SRAM
y
512
bytes
de
EEPROM
(que
puede
ser
leído
y
escrito
con
la
biblioteca
de
EEPROM);
la
Atmega328
tiene
2
MB
de
SRAM
y
1
KB
de
memoria
EEPROM.
Entrada
y
Salida
Cada
uno
de
los
14
pines
digitales
en
la
Duemilanove
puede
ser
utilizado
como
una
entrada
o
salida,
utilizando
las
funciones
pinMode
()
digitalWrite
()
y
digitalRead
().
Operan
a
5
voltios.
Cada
pin
puede
proporcionar
o
recibir
un
máximo
de
40
mA
y
tienen
una
resistencia
interna
(desconectado
por
omisión)
de
20-‐50
kOhms.
Además,
algunos
pines
tienen
funciones
especializadas:
•
Serial:
0
(RX)
y
1
(TX).
Se
utiliza
para
recibir
(RX)
y
transmisir
(TX)
datos
TTL
serie.
Estos
pines
están
conectados
a
los
pines
correspondientes
del
chip
serie
USB
FTDI-‐a-‐TTL.
•
Interrupciones:
2
y
3.
Estos
pins
se
pueden
configurar
para
activar
una
interrupción
en
un
valor
bajo,
un
flanco
de
subida
o
bajada.
•
PWM:
3,
5,
6,
9,
10
y
11.
Proporcionar
8-‐bit
con
salida
PWM
mediante
la
función
analogWrite
().
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
22
•
SPI:
10
(SS),
11
(MOSI),
12
(MISO),
13
(SCK).
Estos
son
pines
de
apoyo
a
la
comunicación
SPI,
que
aunque
está
implementada
por
el
hardware
subyacente,
no
está
incluida
actualmente
en
la
lengua
Arduino.
•
LED:
13.
Hay
un
LED
integrado
conectado
al
pin
digital
13.
Cuando
el
pin
esta
en
nivel
alto,
el
LED
está
encendido,
y
cuando
está
a
nivel
bajo
bajo,
el
Led
esá
apagado.
El
Duemilanove
tiene
6
entradas
analógicas,
cada
una
de
las
cuales
ofrecen
10
bits
de
resolución
(es
decir,
1024
valores
diferentes).
Por
defecto,
que
miden
desde
el
masa
hasta
5
voltios,
aunque
es
posible
cambiar
el
extremo
superior
de
su
rango
con
el
pin
AREF
y
la
función
analogReference().
Además,
algunos
pins
se
han
especializado
más
aún
en
cuanto
a
su
funcionalidad:
•
I2C:
4
(SDA)
y
5
(SCL).
Apoyo
I2C
(IST)
de
comunicación
que
utiliza
la
biblioteca
Wire.
Hay
otro
par
de
pines
en
la
placa:
•
Aref.
Voltaje
de
referencia
para
las
entradas
analógicas.
Usado
con
analogReference().
•
Reset.
Llevando
esta
línea
a
nivel
bajo
se
puede
reiniciar
el
microcontrolador.
A
continuación
se
muestra
el
esquema
de
conexión
de
la
placa
Comunicación
El
Duemilanove
Arduino
tiene
una
serie
de
facilidades
para
comunicarse
con
un
ordenador,
con
otro
Arduino,
o
con
otros
microcontroladores.
El
ATmega168
y
Atmega328
proporcionan
una
comunicación
serie
UART
TTL
(5V),
que
está
disponible
en
los
pines
digital
0
(RX)
y
1
(TX).
Un
chip
FT232RL
FTDI
canaliza
las
comunicaciones
en
serie
de
esta
placa
a
través
del
USB
y
los
drivers
de
FTDI
(incluido
con
el
software
Arduino)
proporcionan
un
puerto
virtual
COM
siempre
y
cuando
esté
el
software
correspondiente
instalado
en
el
equipo.
El
software
Arduino
incluye
un
monitor
serie
que
permite
a
que
datos
simples
de
texto
puedan
ser
enviados
hacia
y
desde
la
placa
Arduino.
El
LED
RX
y
TX
en
la
placa
parpadeará
cuando
se
están
transmitiendo
datos
a
través
del
chip
FTDI
y
conexión
USB
con
el
ordenador
(pero
no
para
la
comunicación
de
serie
en
los
pines
0
y
1).
Una
biblioteca
SoftwareSerial
permite
la
comunicación
serie
en
cualquiera
de
los
pines
digital
de
la
Duemilanove's.
El
ATmega168
y
Atmega328
también
soporta
I2C
(IST)
y
comunicación
SPI.
El
software
incluye
una
biblioteca
de
Arduino
Wire
para
simplificar
el
uso
del
bus
I2C.
Para
utilizar
la
comunicación
de
la
SPI,
consultar
las
características
técnicas
del
ATmega168
o
del
Atmega328.
Programación
El
Duemilanove
Arduino
puede
ser
programado
con
el
software
Arduino.
Seleccione
"Arduino
Duemilanove
ATmega168"
o
"W
Arduino
Duemilanove
Atmega328"
desde
el
menú
Herramientas>
Board
(de
acuerdo
con
el
microcontrolador
en
su
tablero).
El
ATmega168
o
Atmega328
en
el
Duemilanove
Arduino
de
serie
viene
con
un
cargador
de
arranque
que
le
permite
cargar
el
nuevo
código,
sin
el
uso
de
un
programador
hardware
externo.
Se
comunica
usando
el
protocolo
original
STK500.
También
puede
omitir
el
gestor
de
arranque
y
el
programa
del
microcontrolador
a
través
de
la
ICSP
(In
Circuito
Serial).
Reset
por
software
En
lugar
de
exigir
apretar
el
botón
de
reinicio
antes
de
una
carga
de
software
en
el
controlador,
el
Duemilanove
Arduino
está
diseñado
de
una
manera
que
le
permite
resetear
el
software
se
ejecuta
desde
un
ordenador
conectado.
Una
de
las
líneas
de
control
de
flujo
por
hardware
(DTR)
de
la
FT232RL
está
conectado
a
la
línea
de
reset
de
la
ATmega168
o
Atmega328
a
través
de
un
condensador
de
100
nanofaradio.
Cuando
se
activa
esta
línea
(tomando
nivel
bajo
de
tensión),
la
línea
de
reseteo
del
chip
permanece
activa
el
tiempo
necesario
para
restablecer
dicho
chip.
El
software
Arduino
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
24
utiliza
esta
capacidad,
ya
que
le
permite
la
carga
de
código
con
tan
sólo
pulsar
el
botón
de
subida
en
el
entorno
Arduino.
La
carga
de
datos
en
el
controlador
puede
llevar
poco
tiempo
ya
que
podemos
coordinar
bien
el
tiempo
en
nivel
bajo
de
DTR,
con
el
inicio
de
la
subida
de
datos.
Esta
configuración
tiene
otras
implicaciones.
Cuando
el
Duemilanove
está
conectado
al
ordenador
ya
sea
un
Mac
OS
X
o
Linux,
se
resetea
cada
vez
que
se
realiza
una
conexión
a
ella
desde
el
software
(a
través
de
USB).
Aproximadamente
durante
medio
segundo,
el
gestor
de
arranque
se
ejecuta
en
el
Duemilanove.
Está
programado
para
ignorar
los
datos
con
formato
incorrecto
(es
decir,
nada,
además
de
una
carga
de
código
nuevo),
y
cuando
los
primeros
bytes
de
datos
enviados
llegan
a
la
placa,
se
interceptan
dichos
datos
y
despuésla
conexión
se
abre.
Si
una
aplicación
se
ejecuta
en
la
placa
y
recibe
del
exterior
cualquier
tipo
de
datos
cuando
se
inicia
por
primera
vez,
asegúrese
de
que
el
software
con
el
que
se
comunica
espera
un
segundo
después
de
la
apertura
de
la
conexión
y
antes
de
enviar
los
datos.
El
Duemilanove
contiene
una
traza
que
se
puede
cortar
para
deshabilitar
la
auto-‐
reset.
Las
almohadillas
a
ambos
lados
de
la
traza
se
pueden
soldar
en
conjunto
para
volver
a
habilitarla.
Es
llamado
"reset-‐en".
También
se
puede
deshabilitar
la
función
auto-‐reset,
conectando
una
resistencia
de
110
ohmios
de
5V
a
la
línea
de
reajuste.
USB
Protección
de
sobreintensidad
El
Duemilanove
Arduino
tiene
un
fusible
reseteable
que
protege
a
los
puertos
USB
de
su
ordenador
de
cortos
y
picos
de
corriente.
Aunque
la
mayoría
de
los
equipos
proporcionan
su
protección
interna,
el
fusible
proporciona
una
capa
adicional
de
protección.
Si
más
de
500
mA
se
aplica
al
puerto
USB,
el
fusible
rompe
automáticamente
la
conexión
hasta
que
se
elimina
el
corto
o
sobrecarga.
Características
físicas
La
longitud
máxima
y
ancho
de
la
placa
Duemilanove
son
2,7
y
2,1
pulgadas
respectivamente,
con
el
conector
USB
y
conector
de
potencia
que
se
extiende
más
allá
de
la
dimensión
anterior.
Tres
orificios
de
los
tornillos
que
la
Junta
pudiera
estar
conectada
a
una
superficie
o
carcasa.
Hay
que
tener
en
cuenta
que
la
distancia
entre
los
pines
digitales
7
y
8
es
de
160
milésimas
de
pulgada
(0,16"),
por
lo
que
no
es
un
múltiplo
de
la
distancia
(de
100
milésimas
de
pulgada)
entre
los
otros
pines.
2.2.2
Diecimila
Arduino
Origen
"Diecimila"
significa
10.000
en
italiano
y
se
llamaba
así
al
marcar
el
hecho
de
que
más
de
10.000
tarjetas
Arduino
se
han
hecho.
Resumen
Microcontrolador
ATmega168
únicamente
por
lo
que
por
ejemplo
en
cuanto
a
memoria
posee
solo
las
características
de
este
controlador.
Memoria
Descripción
general
El
Nano
Arduino
es
una
placa
pequeña,
completa
basada
en
el
Atmega328
(Arduino
Nano
3,0)
o
ATmega168
(Arduino
Nano
2.x).
Tiene
más
o
menos
la
misma
funcionalidad
de
la
Duemilanove
Arduino,
pero
en
un
paquete
diferente.
Le
falta
sólo
el
conector
de
alimentación
DC,
y
trabaja
con
un
mini
cable
USB
en
lugar
de
uno
normal.
El
Nano
fue
diseñado
y
está
siendo
producido
por
Gravitech.
Especificaciones:
Dimensiones
0.73
"x
1.70".
Potencia:
El
Nano
Arduino
puede
ser
alimentado
a
través
de
la
Mini-‐conexión
USB,
con
entre
6-‐20V
mediante
una
fuente
de
alimentación
externa
no
regulada(pin
30),
o
5V
regulados
mediante
fuente
reguladora
(pin
27).
Se
toma
como
fuente
de
energía
la
que
tenga
mayor
tensión
y
se
activa
automáticamente.
Memoria
Podemos
obtener
el
nano
con
el
controlador
ATmega168
que
tiene
16
KB
de
memoria
flash
para
almacenar
el
código
(de
los
cuales
2
KB
se
utiliza
para
el
gestor
de
arranque),
o
con
la
Atmega328
que
dispone
de
32
KB,
(también
con
2
KB
utilizado
para
el
gestor
de
arranque).
El
ATmega168
tiene
1
MB
de
SRAM
y
512
bytes
de
EEPROM
(que
puede
ser
leído
y
escrito
con
la
biblioteca
de
EEPROM);
la
Atmega328
tiene
2
MB
de
SRAM
y
1
KB
de
memoria
EEPROM.
2.2.4 Mega
Arduino
Resumen
Microcontrolador
ATMEGA1280.
SRAM
8
KB.
EEPROM
4
KB.
Alimentación
La
Mega
Arduino
puede
ser
alimentada
a
través
de
la
conexión
USB
o
con
una
fuente
de
alimentación
externa.
La
fuente
de
alimentación
se
selecciona
automáticamente.
La
tarjeta
puede
operar
en
una
fuente
externa
de
6
a
20
voltios.
Si
se
suministra
con
menos
de
7V,
sin
embargo,
el
regulador
de
5V
puede
proporcionar
menos
de
cinco
voltios
y
la
placa
puede
ser
inestable.
Si
utiliza
más
de
12V,
el
regulador
de
voltaje
puede
sobrecalentarse
y
dañar
el
tablero.
El
rango
recomendado
es
de
7
a
12
voltios.
Memoria
El
ATMEGA1280
cuenta
con
128
KB
de
memoria
flash
para
almacenar
el
código
(de
4
KB,
que
se
utiliza
para
el
gestor
de
arranque),
8
MB
de
SRAM
y
4
KB
de
EEPROM
(que
puede
ser
leído
y
reescrito
con
la
biblioteca
de
EEPROM).
Entrada
y
Salida.
Cada
uno
de
los
54
pines
digital
de
la
Mega
se
puede
utilizar
como
una
entrada
o
salida,
utilizando
las
funciones
pinMode
(),
digitalWrite
(),
y
digitalRead
().
Operan
a
5
voltios.
Cada
pin
puede
proporcionar
o
recibir
un
máximo
de
40
mA
y
tiene
una
resistencia
interna
de
20-‐50
kOhms.
Además,
algunos
pines
tienen
funciones
especializadas:
•
Serial:
0
(RX)
y
1
(TX),
1
de
serie:
19
(RX)
y
18
(TX),
2
de
serie:
17
(RX)
y
16
(TX),
3
de
serie:
15
(RX)
y
14
(TX).
Se
utiliza
para
recibir
(RX)
y
transmisión
(TX)
datos
TTL
serie.
Pins
0
y
1
son
también
conectados
a
los
pines
correspondientes
de
la
USB
FTDI-‐a-‐chip
TTL
serie.
•
Factores
externos
Interrupciones:
2
(interrupción
0),
3
(de
interrupción
1),
18
(interrupción
de
5),
19
(de
interrupción
4),
20
(de
interrupción
3),
y
21
(de
interrupción
2).
Estos
pins
se
pueden
configurar
para
que
activen
una
interrupción
cuando
éstos
tenga
un
valor
bajo,
o
haya
un
flanco
de
subida
o
bajada.
• PWM: 0 a 13. Proporciona 8-‐bit de salida PWM con la función analogWrite().
•
LED:
13.
Hay
un
built-‐in
LED
conectado
al
pin
digital
13.
Cuando
el
pin
es
de
alto
valor,
el
LED
está
encendido,
cuando
el
pasador
es
bajo,
es
apagado.
•
I2C:
20
(SDA)
y
21
(SCL).
Pins
de
apoyo
de
comunicación
I2C
(IST)
que
utiliza
la
biblioteca
Wire.
Estos
pines
no
están
en
la
misma
ubicación
que
los
pines
I2C
en
el
Duemilanove
o
Diecimila.
El
Mega
cuenta
con
16
entradas
analógicas,
cada
una
de
las
cuales
ofrecen
10
bits
de
resolución
(es
decir,
1024
valores
diferentes).
Por
defecto,
que
miden
desde
el
masa
a
5
voltios,
aunque
es
posible
cambiar
el
nivel
superior
de
su
rango
con
el
pin
AREF
y
analogReference
()
la
función.
Además
hay
un
par
de
pins
en
la
placa:
•
Aref.
Voltaje
de
referencia
para
las
entradas
analógicas.
Usado
con
analogReference
().
•
Reset.
Llevando
esta
línea
a
nivel
bajo
se
reiniciará
el
microcontrolador.
Comunicación
La
Mega
Arduino
tiene
una
serie
de
facilidades
para
comunicarse
con
un
ordenador,
otro
Arduino,
o
de
otros
microcontroladores.
El
ATMEGA1280
proporciona
cuatro
interfaces
UART
hardware
para
TTL
(5V)
de
comunicaciones
serie.
Un
FT232RL
FTDI
que
canaliza
dicha
comunicación
seriea
través
de
USB
y
los
drivers
de
FTDI
(incluidos
con
el
software
Arduino)
proporcionar
un
puerto
COM
virtual,
siempre
que
se
tenga
instalado
el
software
correspondiente
en
el
equipo.
El
software
Arduino
permite
enviar
datos
simples
de
texto
hacia
y
desde
la
placa
Arduino.
El
LED
RX
y
TX
en
la
placa
parpadeará
cuando
se
están
transmitiendo
datos
a
través
del
chip
FTDI
y
conexión
USB.
2.2.5
Otras
placas
Existen
más
módelos
de
placas
en
el
mercado,
pero
estas
difieren
muy
poco
a
nivel
físico
de
las
ya
explicadas.
Por
ello
vamos
tan
solo
a
mencionar
básicamente
las
placas
y
a
ilustrarlas
con
la
correspondiente
fotografía,
para
saber
cual
elegir
en
función
de
la
aplicación
que
quisieramos
realizar.
Lilypad
-‐>
Es
una
pequeña
placa
diseñada
para
aplicaciones
con
las
que
tuviéramos
que
llevar
encima,
por
ejemplo
ropa
inteligente
que
en
la
aplicación
ya
existe
implementada
con
Arduino.
Mini-‐>
placa
que
se
caracteriza
por
ser
la
más
pequeña
de
las
disponibles
Arduino
serial-‐>
placa
que
implementa
una
comunicación
serie
RS232
como
principal
característica
Pro mini-‐> diseñada para aplicaciones low-‐cost y que requieran un tamaño reducido
Bluetooth
Arduino
-‐-‐
[1] http://arduino.cc/en/Main/Hardware
[2] http://arduino.cc/en/Main/ArduinoBoardDuemilanove
[3] http://arduino.cc/en/Main/ArduinoBoardDiecimila
[4] http://arduino.cc/en/Main/ArduinoBoardMega
[5] http://www.bluegiga.com/WT11_Class_1_Bluetooth_Module
3.
Librerías
en
Arduino
3.1
Introducción
La
plataforma
Arduino
se
programa
mediante
el
uso
de
un
lenguaje
propio
basado
en
el
popular
lenguaje
de
programación
de
alto
nivel
Processing1.
Sin
embargo,
es
posible
utilizar
otros
lenguajes
de
programación
y
aplicaciones
populares
en
Arduino
[1].
Algunos
ejemplos
son:
Java
•
Flash
(mediante
ActionScript)
•
Processing
•
MaxMSP
(entorno
gráfico
de
programación
para
aplicaciones
musicales,
de
•
audio
y
multimedia)
• VVVV
(síntesis
de
vídeo
en
tiempo
real)
• Adobe
Director
• Python
• Ruby
• C
• C++
(mediante
libSerial
o
en
Windows)
• C#
• Cocoa/Objective-‐C
(para
Mac
OS
X)
• Linux
TTY
(terminales
de
Linux)
• 3DVIA
Virtools
(aplicaciones
interactivas
y
de
tiempo
real)
• SuperCollider
(síntesis
de
audio
en
tiempo
real)
• Instant
Reality
(X3D)
• Second
Life
• Liberlab
(software
de
medición
y
experimentación)
• BlitzMax
(con
acceso
restringido)
• Squeak
(implementación
libre
de
Smalltalk)
• Mathematica
• Matlab
• Mono
• Isadora
(Interactividad
audiovisual
en
tiempo
real)
• PERL
• Visual
Basic
.NET
• VBscript
Esto
es
posible
debido
a
que
Arduino
se
comunica
mediante
la
transmisión
de
datos
en
formato
serie
que
es
algo
que
la
mayoría
de
los
lenguajes
anteriormente
citados
soportan.
Para
los
que
no
soportan
el
formato
serie
de
forma
nativa,
es
posible
utilizar
1
En
realidad,
Arduino
está
basado
en
Wiring
que
a
su
vez
se
basa
en
Processing.
software
intermediario
que
traduzca
los
mensajes
enviados
por
ambas
partes
para
permitir
una
comunicación
fluida.
Es
bastante
interesante
tener
la
posibilidad
de
interactuar
Arduino
mediante
esta
gran
variedad
de
sistemas
y
lenguajes
puesto
que
dependiendo
de
cuales
sean
las
necesidades
del
problema
que
vamos
a
resolver
podremos
aprovecharnos
de
la
gran
compatibilidad
de
comunicación
que
ofrece.
No
obstante
en
este
trabajo
nos
centraremos
en
el
lenguaje
que
acepta
por
defecto:
El
lenguaje
de
programación
Arduino.
3.2.1
Processing
Processing
es
un
lenguaje
de
programación
orientado
al
desarrollo
ágil
de
aplicaciones
interactivas
y
multimedia
cuya
sintaxis
está
influenciado
por
Java,
OpenGL,
PostScript
y
C
[2].
Es
un
lenguaje
bastante
moderno
creado
en
2001
por
Casey
Reas
y
Ben
Fry
quienes
lo
desarrollaron
en
el
MIT
Media
Lab.
A
partir
de
Processing
nacieron
varios
proyectos
relacionados
que
siguieron
su
filosofía
y
se
centraban
en
otros
aspectos.
De
estos
proyectos
destacan
Wiring,
Fritzing
y
Arduino.
Sintaxis
• Delimitadores:
;,
{}
• Comentarios:
//,
/*
*/
• Cabeceras:
#define,
#include
Operadores
aritméticos
• Asignación:
=
• Operaciones:
+,
-‐,
*,
/,
%
Operadores
Booleanos
• &&,
||,
!
Operadores
compuestos
• Incremento/decremento
de
variables:
++,
-‐-‐
• Asignación
y
operación:
+=,
-‐=,
*=,
/=,
&=,
|=
• DDR[B/C/D]:
Data
Direction
Register
(o
dirección
del
registro
de
datos)
del
puerto
B,
C
ó
D.
Sirve
para
especificar
que
pines
queremos
usar
como
de
entrada
y
cuales
de
salida.
Variable
de
Lectura/Escritura.
• PORT[B/C/D]:
Data
Register
(o
registro
de
datos)
del
puerto
B,
C
ó
D.
Variable
de
Lectura/Escritura.
• PIN[B/C/D]:
Input
Pins
Register
(o
registro
de
pines
de
entrada)
del
puerto
B,
C
ó
D.
Variable
de
sólo
lectura.
Por
ejemplo,
para
especificar
que
queremos
utilizar
los
pines
1
a
7
como
salidas
y
el
0
como
entrada,
bastaría
utilizar
la
siguiente
asignación:
DDRD = B11111110;
En
cuanto
al
tratamiento
de
las
variables
también
comparte
un
gran
parecido
con
el
lenguaje
C.
Constantes
• HIGH
/
LOW:
niveles
alto
y
bajo
en
pines.
Los
niveles
altos
son
aquellos
de
3
voltios
o
más.
• INPUT
/
OUTPUT
:
entrada
o
salida
• true
/
false
Utilidades
• sizeof()
En
cuanto
a
las
funciones
básicas
del
lenguaje
nos
encontramos
con
las
siguientes:
E/S
Digital
• pinMode(pin,
modo)
• digitalWrite(pin,
valor)
• int
digitalRead(pin)
E/S
Analógica
• analogReference(tipo)
• int
analogRead(pin)
• analogWrite(pin,
valor)
E/S
Avanzada
• shiftOut(dataPin,
clockPin,
bitOrder,
valor)
• unsigned
long
pulseIn(pin,
valor)
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
36
Tiempo
• unsigned
long
millis()
• unsigned
long
micros()
• delay(ms)
• delayMicroseconds(microsegundos)
Matemáticas
min(x,
y),
max(x,
y),
abs(x),
constrain(x,
a,
b),
map(valor,
fromLow,
fromHigh,
•
toLow,
toHigh),
pow(base,
exponente),
sqrt(x)
Trigonometría
• sin(rad),
cos(rad),
tan(rad)
Números
aleatorios
• randomSeed(semilla),
long
random(máx),
long
random(mín,
máx)
Bits
y
Bytes
• lowByte(),
highByte(),
bitRead(),
bitWrite(),
bitSet(),
bitClear(),
bit()
Interrupciones
externas
• attachInterrupt(interrupción,
función,
modo)
• detachInterrupt(interrupción)
Interrupciones
• interrupts(),
noInterrupts()
Comunicación
por
puerto
serie
[5]
Las
funciones
de
manejo
del
puerto
serie
deben
ir
precedidas
de
“Serial.”
aunque
no
necesitan
ninguna
declaración
en
la
cabecera
del
programa.
Por
esto
se
consideran
funciones
base
del
lenguaje.
• begin(),
available(),
read(),
flush(),
print(),
println(),
write()
Como
se
ha
podido
comprobar,
si
conocemos
el
lenguaje
C,
no
tendremos
dificultades
para
programar
en
Arduino
puesto
que
se
parecen
enormemente.
Tan
sólo
debemos
aprender
algunas
funciones
específicas
de
que
dispone
el
lenguaje
para
manejar
los
diferentes
parámetros
de
Arduino.
Se
pueden
construir
aplicaciones
de
cierta
complejidad
sin
necesidad
de
muchos
conceptos
previos.
• avr-‐binutils
• avr-‐gcc
• and
avr-‐libc
La
mayoría
del
lenguaje
de
programación
Arduino
está
escrita
con
constantes
y
funciones
de
AVR
y
ciertas
funcionalidades
sólo
se
pueden
obtener
haciendo
uso
de
AVR
[6].
Interrupciones
Para
desactivar
las
interrupciones:
cli(); // desactiva las interrupciones globales
Para
activarlas:
sei(); // activa las interrupciones
Esto
afectará
al
temporizador
y
a
la
comunicación
serie.
La
función
delayMicroseconds()
desactiva
las
interrupciones
cuando
se
ejecuta.
Temporizadores
La
función
delayMicroseconds()
crea
el
menor
retardo
posible
del
lenguaje
Arduino
que
ronda
los
2μs.
Para
retardos
mas
pequeños
se
debe
utilizar
la
llamada
de
ensamblador
'nop'
(no
operación).
Cada
sentencia
'nop'
se
ejecutará
en
un
ciclo
de
máquina
(16
Mhz):
unos
62.5ns.
Se
haría
de
la
siguiente
manera:
__asm__("nop\n\t");
Para
utilizarlas
hay
que
pasarles
como
argumento
la
variable
PORT
y
un
pin
para
establecerlo
o
limpiarlo.
Gracias
a
estos
pequeños
hacks
tendremos
la
posibilidad
de
mejorar
los
tiempos
de
ejecución
de
ciertas
tareas
críticas
o
de
aquellas
que
se
repitan
muchas
veces
obteniendo
mejores
resultados.
No
obstante
el
código
fuente
que
escribamos
resultará
probablemente
menos
legible
si
los
utilizamos
por
lo
que
habrá
que
sopesarlo
en
función
de
nuestras
necesidades.
3.2.4
Diferencias
con
Processing
La
sintaxis
del
lenguaje
de
programación
Arduino
es
una
versión
simplificada
de
C/C++
y
tiene
algunas
diferencias
respecto
de
Processing
[7][8].
Ya
desde
el
punto
de
que
Arduino
esta
basado
en
C/C++
mientras
que
Processing
se
basa
en
Java.
En
cuanto
a
la
sintaxis
de
ambos
lenguajes
y
el
modo
en
que
se
programan
existen
también
varias
diferencias:
Arrays
Arduino
Processing
int
foo[]
=
{
0,
1,
2
};
int
foo[]
=
{
0,
1,
2
};
o
bien
int[]
foo
=
{
0,
1,
2
};
Bucles
Arduino
Processing
Las
diferencias
son
escasas
por
lo
que
alguien
que
conozca
bien
Processing
tendrá
muy
pocos
problemas
a
la
hora
de
programar
en
Arduino.
3.2.5
Ejemplo
práctico:
Hola
Mundo
en
Arduino
[9]
#define LED_PIN 13
void setup () {
// Bucle infinito
void loop () {
delay (1000);
delay (1000);
El
orden
de
ejecución
será:
Primero
se
hace
una
llamada
a
la
función
init()
que
inicializa
el
programa,
después
se
ejecuta
la
función
setup()
que
configura
diversos
parámetros,
y
por
último
se
ejecuta
un
bucle
while(1)
que
llama
repetidamente
a
la
función
loop.
Todo
ello
se
ejecuta
dentro
de
main()
y
podría
haberse
indicado
explícitamente
(en
el
caso
anterior
se
encarga
el
IDE
de
añadir
el
el
código
que
se
ha
omitido).
Las librerías estándar que ofrece Arduino son las siguientes [10]:
Serial
Lectura
y
escritura
por
el
puerto
serie.
Ya
hemos
hablado
de
ella
anteriormente.
EEPROM
Lectura
y
escritura
en
el
almacenamiento
permanente
[11].
• read(),
write()
Ethernet
Conexión
a
Internet
mediante
“Arduino
Ethernet
Shield“.
Puede
funcionar
como
servidor
que
acepta
peticiones
remotas
o
como
cliente.
Se
permiten
hasta
cuatro
conexiones
simultaneas
[12].
Servidor:
Server(),
begin(),
available(),
write(),
print(),
println()
•
Cliente:
Client(),
connected(),
connect(),
write(),
print(),
println(),
available(),
•
read(),
flush(),
stop()
Firmata
Comuncación
con
aplicaciones
de
ordenador
utilizando
el
protocolo
estándar
del
puerto
serie
[13].
LiquidCrystal
Control
de
LCDs
con
chipset
Hitachi
HD44780
o
compatibles
[14].
La
librería
soporta
los
modos
de
4
y
8
bits.
Servo
Control
de
servo
motores
[15].
A
partir
de
la
versión
0017
de
Arduino
la
librería
soporta
hasta
12
motores
en
la
mayoría
de
placas
Arduino
y
48
en
la
Arduino
Mega.
• attach(),
write(),
writeMicroseconds(),
read(),
attached(),
detach()
El
manejo
de
la
librería
es
bastante
sencillo.
Mediante
attach(numero
de
pin)
añadimos
un
servo
y
mediante
write
podemos
indicar
los
grados
que
queremos
que
tenga
el
motor
(habitualmente
de
0
a
180).
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
42
SoftwareSerial
Comunicación
serie
en
pines
digitales
[16].
Por
defecto
Arduino
incluye
comunicación
sólo
en
los
pines
0
y
1
pero
gracias
a
esta
librería
podemos
realizar
esta
comunicación
con
el
resto
de
pines.
Stepper
Control
de
motores
paso
a
paso
unipolares
o
bipolares
[17].
• Stepper(steps,
pin1,
pin2),
Stepper(steps,
pin1,
pin2,
pin3,
pin4),
setSpeed(rpm),
step(steps)
El
manejo
es
sencillo.
Basta
con
iniciar
el
motor
mediante
Stepper
indicando
los
pasos
que
tiene
y
los
pines
a
los
que
esta
asociado.
Se
indica
la
velocidad
a
la
que
queramos
que
gire
en
revoluciones
por
minuto
con
setSpeed(rpm)
y
se
indican
los
pasos
que
queremos
que
avance
con
step(pasos).
Wire
Envió
y
recepción
de
datos
sobre
una
red
de
dispositivos
o
sensores
mediante
Two
Wire
Interface
(TWI/I2C)
[18].
Además
las
librerías
Matrix
y
Sprite
de
Wiring
son
totalmente
compatibles
con
Arduino
y
sirven
para
manejo
de
matrices
de
leds.
Veamos un ejemplo de la creación de una librería que envía código Morse:
Creamos
el
fichero
Morse.h
que
incluye
la
definición
de
la
clase
Morse
que
tiene
3
funciones:
un
constructor
(Morse()),
una
función
para
enviar
1
punto
(dot())
y
una
función
para
enviar
una
raya
(dash()).
La
variable
_pin
permite
indicar
el
pin
que
vamos
a
utilizar.
/*
Morse.h - Library for flashing Morse code.
*/
#ifndef Morse_h
#define Morse_h
#include "WProgram.h"
class Morse
public:
Morse(int pin);
void dot();
void dash();
private:
int _pin;
};
#endif
/*
Morse.cpp - Library for flashing Morse code.
*/
#include "WProgram.h"
#include "Morse.h"
Morse::Morse(int pin)
pinMode(pin, OUTPUT);
_pin = pin;
void Morse::dot()
digitalWrite(_pin, HIGH);
delay(250);
digitalWrite(_pin, LOW);
delay(250);
void Morse::dash()
digitalWrite(_pin, HIGH);
delay(1000);
digitalWrite(_pin, LOW);
delay(250);
-‐-‐
Referencias
[10] http://arduino.cc/en/Reference/Libraries
4.
SOFTWARE
4.1
Introducción
El
Entorno
de
Desarrollo
de
Arduino
(más
conocido
como
IDE
–
Integrated
Development
Environment)
es
una
herramienta
que
funciona
en
diferentes
plataformas
(Windows,
Macintosh,
Linux)
dedicada
a
la
edición
y
descarga
de
programas
en
la
placa
Arduino.
El
código
que
se
ejecuta
en
las
placas
está
basado
en
las
librerias
de
aplicación
Wiring
API
y
en
las
de
desarrollo
de
los
integrados
AVR.
Para
la
instalación
de
la
placa
Arduino
en
Windows,
conviene
tener
instalado
la
última
versión
de
Java
Runtime
Enviroment
(J2RE)
que
se
puede
descargar
de
la
web
de
Sun[1].
Nota:
Es
recomendable
descomprimir
el
fichero
en
el
directorio
raiz
(c:\)
manteniendo
la
estructura
original.
-‐-‐
[1] http://java.sun.com/javase/downloads/index.jsp
[2] http://www.arduino.cc/en/Main/Software
Entre
todas
las
carpetas
creadas
en
el
directorio
Arduino,
conviene
destacar
las
siguientes:
C:\arduino-‐0017\hardware\bootloader
Ésta
contiene
el
software
necesario
para
cargar
el
firmware
en
el
chip
Atmega168
para
trabajar
con
Arduino.
Sólo
se
utiliza
si
hemos
montado
la
placa
nosotros
mismos,
o
en
el
caso
que
se
haya
estropeado
el
chip
y
se
haya
comprado
uno
nuevo.
C:
\arduino-‐0017\drivers
Contiene
los
drivers
necesarios
para
el
funcionamiento
de
la
placa
Arduino
con
Windows:
FTDI
USB
Drivers.
Como
se
indicó
antes,
los
drivers
para
conectar
la
placa
Arduino
por
USB
se
encuentran
en
la
subcarpeta
“drivers”
de
la
distribución.
Figura 4.1: Conexión del cable USB a la placa Arduino
Se
abrirá
automáticamente
el
asistente
Añadir
Nuevo
Hardware:
Si no ha habido ningún problema, el driver de la placa estará instalado.
Figura 4.2: Selección del puerto donde está conectado la placa en Windows
Así
como
seleccionar
el
modelo
de
tarjeta
apropiado.
Figura 4.3: Selección de la placa Arduino deseada en Windows
4.2.2
Instalación
del
IDE
en
Mac
OS
X
(v.
10.3.9
o
posterior)
Si
se
va
a
usar
un
Arduino
USB,
se
necesitará
instalar
los
drivers
para
el
chip
FTDI
de
la
placa.
Estos
pueden
encontrarse
en
el
directorio
drivers
de
la
distribución
Arduino.
Si
se
posee
un
Mac
más
antiguo
como
un
Powerbook,
iBook,
G4
o
G5,
se
debería
usar
los
drivers
PPC:
FTDIUSBSerialDriver_v2_1_9.dmg.
Si
se
posee
un
Mac
más
nuevo
como
un
MacBook,
Mac-‐Book
Pro
o
Mac
Pro,
se
necesita
los
drivers
de
Intel:
TDIUSBSerialDriver_v2_2_9_Intel.dmg.
Hacer
doble
click
para
montar
la
imagen
del
disco
y
ejecutar
el
FTDIUSBSerialDriver.pkg
incluido.
La
última
versión
de
los
drivers
se
puede
encontrar
en
http://www.ftdichip.com/Drivers/VCP.htm.
Acto
seguido,
instalamos
y
ejecutamos
el
IDE.
Por
defecto
nos
creará
una
carpeta
en
Documentos
donde
se
guardarán
todos
los
programas
que
vayamos
haciendo.
-‐-‐
[1] http://www.arduino.cc/en/Main/Software
Debemos
ahora
especificar
qué
placa
de
Arduino
tenemos:
Figura 4.4: Selección de la placa Arduino deseada en Mac OS X
Figura 4.5: Selección del puerto donde está conectado la placa en Mac OS X
4.2.3
Instalación
del
IDE
en
GNU/Linux
Menús
Menú
Tabulador
Barra
de
Herramientas
Área
de
código
Figura
4.6:
Elementos
del
entorno
de
desarrollo
en
Windows
Tab
Menu
Permite
gestionar
las
rutinas
con
más
de
un
archivo
(cada
uno
de
los
cuales
aparece
en
su
propia
pestaña).
Estos
pueden
ser:
4.3.2. Menús
Sketch
Tools
5.
Control
de
motores
con
Arduino
5.1
Control
de
motores
DC
con
puente
en
H
.
Como
observamos
en
la
imagen
anterior,
si
cerramos
los
interruptores
S1
y
S4,
la
corriente
que
pasa
por
el
motor
será
contraria
a
la
que
pasaría
si
cerramos
S2
y
S3,
lo
que
hará
que
el
motor
gire
en
un
sentido
o
en
otro,
mientras
que
si
cerramos
S1
y
S2
o
S3
y
S4
el
motor
no
girará
ya
que
por
él
no
pasa
corriente
en
ningún
sentido.
En
la
práctica
no
se
implementas
los
puentes
en
H
con
interruptores,
si
no
que
se
utilizan
transistores
que
en
función
de
las
tensiones
que
apliquemos
en
su
puerta,
estará
en
corte
o
en
saturación,
impidiendo
o
dejando
así
pasar
la
corriente
a
través
de
los
mismos
[1].
El
integrado
L293NE,
está
preparado
para
conectarle
hasta
4
motores,
por
lo
que
para
el
diseño
de
un
robot
que
tenga
dos
o
cuatro
ruedas
motrices,
sólo
necesitaremos
un
integrado.
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
56
En
la
figura
2,
podemos
observar
el
patillaje
del
integrado
y
una
tabla
de
verdad
con
las
salidas
que
provoca
cualquier
combinación
de
entradas
al
mismo.
Para
realizar
nuestro
proyecto,
debemos
conectar
correctamente
el
motor
y
el
puente
en
H
con
nuestro
Arduino,
el
esquema
eléctrico
[1]
sería
el
de
la
figura
3.
Utilizaremos
la
alimentación
externa
del
Arduino,
para
lo
que
tendremos
que
cambiar
el
switch
de
alimentación,
ya
que
el
USB
trabaja
a
5V
y
normalmente
los
motores
trabajan
a
tensiones
mayores,
en
nuestro
caso
12V.
Se
ha
colocado
un
condensador
entre
la
alimentación
del
motor
y
tierra
para
evitar
así
los
picos
de
tensión
que
se
producen
al
conectar
y
desconectar
el
motor.
Una
vez
montado
el
circuito
sólo
nos
queda
programar
nuestro
Arduino
para
que
podamos
controlar
nuestro
motor
de
corriente
continua.
5.1.3 Programación
Lo primero será declarar nuestras variables asociadas a los pines del Arduino [1].
A
continuación
configuraremos
los
pines
del
Arduino
como
entrada
o
salida,
también
haremos
que
el
led
parpadee
3
veces,
pero
esto
sólo
debería
pasar
una
sola
vez,
ya
que
si
ocurre
más
veces
es
porque
nuestro
programa
ha
vuelto
a
reiniciarse
a
causa
probablemente
de
un
fallo
en
nuestro
motor,
como
puede
ser
un
corto.
void setup() {
pinMode(switchPin, INPUT);
pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(enablePin, HIGH);
blink(ledPin, 3, 100);
}
Función
para
hacer
que
el
led
parpadee
un
cierto
número
de
veces
cada
cierto
periodo,
que
se
le
pasan
como
parámetros.
Como
hemos
visto
en
el
código
anteriormente,
nuestro
led
parpadeará
3
veces
con
un
intervalo
de
100
milisegundos.
La
función
la
implementaremos
con
un
simple
bucle
for
y
retardos
para
encender
y
apagar
el
led.
digitalWrite(whatPin, LOW);
delay(milliSecs/2);
}
}
Ya
sólo
nos
queda
la
función
principal
de
nuestro
programa,
que
estará
implementada
de
forma
que
lea
el
valor
del
interruptor
para
saber
en
qué
dirección
debe
girar
y
activar
las
salidas
correspondientes
a
la
tabla
de
verdad
de
la
figura
2
vista
en
el
apartado
“puente
en
H”.
void loop() {
if (digitalRead(switchPin) == HIGH) { //dirección 1
digitalWrite(motor1Pin, LOW);
digitalWrite(motor2Pin, HIGH);
}
else { // dirección 2
digitalWrite(motor1Pin, HIGH);
digitalWrite(motor2Pin, LOW);
}
}
La
Motor
Shield
es
una
placa
de
expansión
para
el
Arduino,
la
cual
mediante
librerías
permite
el
control
de
motores
de
hasta
1
A.
Para
conectar
motores
de
mayor
consumo
hace
falta
utilizar
un
integrado
L293.
La
Motor
Shield
contiene
4
puentes
en
H
en
los
que
se
pueden
conectar
hasta
2
servos
de
5V,
4
motores
de
corriente
continua
bidireccionales
u
8
que
giren
en
una
sola
dirección
y
2
motores
paso
a
paso
(unipolares
o
bipolares)
con
bobina
simple,
doble
o
micro
paso
a
paso.
Además
cuenta
con
una
entrada
externa
para
la
alimentación
de
los
motores.
En
la
figura
5
podemos
observar
el
Arduino
con
la
Motor
Shield
y
sus
conectores.
5.2.2 Control
de
motores
de
corriente
continua
con
Motor
Shield
Los
motores
de
corriente
continua
se
colocan
en
los
puertos
M1,
M2,
M3
o
M4,
y
si
son
bidireccionales,
se
podrá
controlar
la
dirección
de
giro
y
la
velocidad
mediante
el
PWM.
Para
poder
realizar
este
control
debemos
incluir
la
librería
AFMotor.h
y
seguir
lo
siguientes
pasos
[2]:
• Crear
el
objeto
AF_DCMotor
con
AF_DCMotor
(motor
#,
frecuencia),
para
configurar
el
puente
en
H.
Motor#
indica
el
puerto
en
el
que
está
conectado
el
motor
que
puede
ser
1,2,3
o
4
y
la
frecuencia
es
la
velocidad
con
la
que
se
llevará
a
cabo
el
control
del
motor.
Para
los
motores
1
y
2
se
puede
elegir
entre
1KHz,
2KHz,
8KHz
o
64Khz,
pero
los
motores
3
y
4
sólo
funcionan
a
1KHz.
• Se
puede
ajustar
la
velocidad
de
giro
del
motor
con
la
función
setSpeed
(velocidad),
a
la
que
le
pasaremos
un
valor
comprendido
entre
0
(parado)
y
255
(velocidad
máxima).
• Para
hacer
funcionar
el
motor
tenemos
que
llamar
a
la
función
run
(dirección),
a
la
que
le
pasaremos
hacia
donde
queremos
que
gire
el
motor,
las
posibilidades
con:
fORDWARE
(hacia
adelante),
BACKWARD
(hacia
atrás)
o
RELEASE
(parado).
#include <AFMotor.h>
AF_DCMotor motor(2, MOTOR12_64KHZ); // Motor #2, 64KHz pwm
void setup() {
motor.setSpeed(200); // velocidad 200 de 255
}
void loop() {
motor.run(FORWARD); // girar hacia adelante
delay(1000);
motor.run(BACKWARD); // girar hacia atrás
delay(1000);
motor.run(RELEASE); // parar
delay(1000);
}
Los
servos
se
conectan
en
los
puertos
serv
y
debido
a
que
este
tipo
de
motores
consume
una
gran
cantidad
de
energía,
se
deberían
alimentar
mediante
la
conexión
de
alimentación
externa.
El
PWM
para
el
control
de
los
servos
es
de
16
bits
y
para
poder
realizar
este
control
debemos
incluir
la
librería
ServoTimer1.h
y
seguir
los
siguientes
pasos
[2]:
• Conectar los servos al pin 9 (servo A) o pin 10 (servo B) usando la función attach().
• Fijar
la
posición
del
servo
con
la
función
write
(ángulo),
donde
el
ángulo
puede
variar
desde
0
a
180.
En
el
siguiente
ejemplo
utilizaremos
dos
servos
que
estará
cada
uno
en
la
posición
opuesta
al
otro
durante
1
segundo.
#include <ServoTimer1.h>
ServoTimer1 servo1;
ServoTimer1 servo2;
void setup() {
servo1.attach(10);
servo2.attach(9);
}
void loop() {
servo1.write(180);
servo2.write(0);
delay(1000);
servo1.write(0);
servo2.write(180);
delay(1000);
}
Podemos
conectar
hasta
2
motores
paso
a
paso
unipolares
o
bipolares
y
las
librerías
son
las
mismas.
La
bobina
1
del
motor
debe
conectarse
a
un
puerto
por
ejemplo
M1
o
M2
y
la
otra
bobina
al
M3
o
M4.
La
única
diferencia
es
que
si
el
motor
es
unipolar
el
cable
del
centro
irá
conectado
a
tierra,
mientras
que
en
los
bipolares
este
cable
no
existe,
pero
el
funcionamiento
es
el
mismo
en
ambos
casos.
Para
poder
realizar
este
tipo
de
control
es
necesario
incluir
la
librería
AFMotor.h
y
seguir
los
siguientes
pasos
[2]:
• Crear el objeto de motor paso a paso con AF_Stepper (pasos, pasos#) para configurar el
puente en H. Pasos indica cuántos pasos por revolución tiene el motor. Con
7.5grados/paso el motor tiene 360/7.5 = 48 pasos. Pasos# es que el puerto al que está
conectado el motor. Si estás utilizando M1 y M2, el puerto será 1y si estás utilizando
M3 y M4 el puerto será el 2.
• Ajuste la veloicdad del motor utilizando la función setSpeed (rpm) donde rpm son las
revoluciones por minuto.
Cada vez que se quiera mover el motor hay que utilizar la función step (#pasos,
•
dirección, tipo_paso), donde #pasos es el número de pasos que quieres dar, dirección
puede tomar los valores FORWARD
o
BACKWARD
para
ir
hacia
adelante
o
hacia
atrás
respectivamente,
y
tipo_paso
puede
tomar
los
valores
SINGLE
(paso
simple),
DOUBLE
(paso
doble),
INTERLEAVE
(paso
simple
y
doble
alternado)
o
MICROSTEP
(pasos
suavizados
con
el
PWM).
• Como
el
servo
por
defecto
suele
mantener
la
posición
dada,
podemos
utilizar
la
función
release()
para
liberarlo.
En el siguiente ejemplo utilizaremos un servo y lo moveremos con los diferentes tipos de
pasos explicados anteriormente.
#include <AFMotor.h>
AF_Stepper motor(48, 2);
void setup() {
motor.setSpeed(10); // 10 rpm
motor.step(100, FORWARD, SINGLE);
motor.release();
delay(1000);
}
void loop() {
motor.step(100, FORWARD, SINGLE);
motor.step(100, BACKWARD, SINGLE);
motor.step(100, FORWARD, DOUBLE);
motor.step(100, BACKWARD, DOUBLE);
motor.step(100, FORWARD, INTERLEAVE);
motor.step(100, BACKWARD, INTERLEAVE);
motor.step(100, FORWARD, MICROSTEP);
motor.step(100, BACKWARD, MICROSTEP);
}
6.
Aplicaciones
de
Arduino
en
Micro-
Robots
Móviles.
6.1
Introducción
ASURO
es
un
pequeño
robot
móvil
desarrollado
por
DLR
(el
centro
aeroespacial
alemán)
para
proyectos
educativos.
Como
se
muestra
a
continuación,
ASURO
viene
con
un
micro
Atmega8,
dos
motores
controlados
de
forma
independiente,
un
seguidor
de
líneas
óptico,
seis
sensores
de
contacto
o
colisión,
dos
odómetros,
tres
LED’s
indicadores
de
estado
y
un
interfaz
IR-‐
para
programación
y
control
remoto
vía
un
PC.
6.2
Montaje
6.2.1
Componentes
El
conjunto
de
pulsadores
de
K1
a
K6,
en
la
parte
delantera
del
ASURO,
se
activan
con
el
pin
PD3
(salida
digital)
y
se
capturan
los
valores
con
un
único
pin
,
el
PC4
(entrada
analógica).
De
esta
forma,
se
obtendrá
un
valor
diferente,
dependiendo
del
pulsador
pulsado
o
de
la
combinación
de
los
mismos.
• LED’s
obtenemos
tres
colores,
un
naranja-‐amarillo
(ambos
activados),
un
rojo
y
un
verde.
Para
obtener
el
color
rojo
hay
que
activar
el
pin
PD2
(salida
digital),
y
para
el
verde,
el
pin
PB0
(salida
digital).
Y
para
el
naranja
amarillo,
pues
ambos.
o El
LED
frontal
(D11)
como
parte
del
sigue
líneas
y
situado
en
la
parte
inferior.
Su
activación
se
encuentra
en
el
pin
PD6
(salida
digital).
• Medidor
del
nivel
de
baterías
o
monitor
de
voltaje
Se
proporcionan
2
discos
con
6
y/o
8
sectores
para
pegar
a
los
engranajes
que
activan
las
ruedas.
De
forma
que
se
puede
recibir
30
y/o
40
pulsos
por
revolución.
El
funcionamiento
es
el
siguiente,
los
discos
o
encoders
son
iluminados
por
los
LEDs
de
infrarrojos
(D13,
D14)
y
los
fototransistores
(T11,
T12)
se
encargan
de
medir
la
luz
reflejada
(negro
no
refleja,
blanco
si).
Entonces
si
se
cuentan
los
cambios
entre
luz
/oscuridad
podemos
evaluar
la
velocidad
o
pasos
del
robot.
Para
ello
el
procesador
debe
activar
el
pin
(salida
digital):
PD7
(D13
y
D14
se
iluminan
simultáneamente)
y
leer
los
Pines
(entradas
analógicas):
PC1
(T11-‐
izquierdo)
y
PC0
(T12-‐derecho).
Para
ello
el
procesador
debe
activar
el
Pin
(salida
digital):
PD6
(D11-‐
frontal)
y
leer
los
Pines
(entradas
analógicas):PC3
(T9-‐izquierdo)
/
PC2
(T10-‐derecho).
• Motores
Para
manejar
cada
uno
de
los
motores
se
utilizan
puentes
H
(H-‐bridge).
Lógica
de
un
Puente
H:
Por
ejemplo,
para
controlar
el
motor
izquierdo
el
procesador
utiliza
pines
PB1,
PD4
y
PD5
(PB2,
PB4
y
PB5
para
motor
derecho).
PB1
(y/o
PB2)
proporcionan
la
señal
PWM
para
el
control
de
la
velocidad.
PD4
y
PD5
(y/o
PB4
y
PB5)
determinan
la
dirección
de
rotación
del
motor
(salidas
digitales).
A continuación se muestra una tabla, donde se resume todo esto:
6.2.2
Construcción
• http://arduino.cc/es/Ensamblado-‐Asuro/Ensamblado-‐Asuro
Unas notas:
Una
vez
montada,
el
Atmega8
que
viene
con
el
Robot,
contiene
un
programa
que
realiza
una
comprobación
o
TEST
de
todos
sus
componentes
y
funcionalidades,
de
forma
que
se
pueda
detectar
si
se
ha
producido
algún
error
durante
el
proceso
de
montaje.
6.2.3
Test
del
Asuro
• Fase 1
Antes
de
insertar
el
chip
IC1
(ATmega8)
y
el
chip
IC3
(puerta
lógica
AND)
en
los
zócalos,
activa
el
interruptor
a
ON.
Los
LEDs
situados
en
la
parte
trasera
(D15,
D16),
deberían
de
brillar
tenuemente
(prueba
en
la
oscuridad!).
• Fase 2
Si
se
pasa
esta
prueba
anterior,
desactiva
el
interruptor
a
OFF
e
inserta
el
chip
ATmega8
(IC1)
y
el
chip
IC3
(puerta
lógica
AND)
en
sus
correspondientes
zócalos.
Las
marcas
de
la
polaridad
de
los
chips
(muescas)
deben
estar
alineadas
con
las
marcas
de
los
zócalos.
También,
las
patas
del
chip
o
IC
deben
ser
dobladas
muy
cuidadosamente
para
que
puedan
quedar
todas
insertadas
en
los
agujeros
de
contacto
del
zócalo.
Para
empezar
la
prueba
o
Test,
debes
insertar
el
Jumper
(J1),
en
el
caso
de
que
utilices
baterías
recargables.
Entonces
activa
el
interruptor
a
On
y
verifica
lo
siguiente:
El
LED
de
estado
(D12)
debe
emitir
una
luz
naranja
(combinación
de
rojo
y
verde)
y
los
LEDs
traseros
(D15,
D16)
deben
estar
activos.
Si
esto
no
pasa,
desactiva
el
interruptor
inmediatamente
y
continúa
leyendo
en
resolución
de
problemas.
o Prueba de LEDs
Todos
los
Led’s
activados
al
mismo
tiempo
Si
todo
va
bien,
los
LEDs
traseros
no
se
apagan
completamente
una
vez
se
dejan
de
iluminar
los
fototransistores.
Si
ocurre
algún
error,
el
Test
no
se
interrumpe,
de
forma
que
el
error
se
puede
evaluar
más
adelante.
Si
se
Pulsa
K1
-‐>
LED
de
estado
(D12)
es
activado
a
verde
Si
se
Pulsa
K2
-‐>LED
de
estado
(D12)
es
activado
a
rojo
Si
se
Pulsa
K3
-‐>
LED
de
la
parte
inferior
D11
activado
Si
se
Pulsa
K4
-‐>
LED
trasero
izquierdo
(D15)
activado
Si
se
Pulsa
K5
-‐>
LED
trasero
derecho
(D16)
activado
Si
se
Pulsa
K6
-‐>
Motor
izquierdo
empieza
a
funcionar
(si
el
motor
no
funciona,
el
test
puede
continuarse).
Los
motores
serán
chequeados
más
adelante.
o Odómetros
A
continuación
el
Led
frontal
(D11)
se
activa.
Lo
que
indica
el
comienzo
del
próximo
Test
(15
segundos),
en
el
cual,
ambos
odómetros
(consistentes
de
un
LED
D13/D14
y
un
fototransistor
T11/T12
respectivamente)
serán
chequeados.
Para
ello
se
situará
un
papel
blanco
en
frente
de
los
fototransistores
(T11,
T12)
lo
que
activará
el
LED
de
estado
(D12).
En
el
momento
que
quitemos
los
papeles,
el
LED
de
estado
se
apagará.
Si
se
realiza
dicha
secuencia,
los
odómetros
están
funcionando
correctamente.
Los
Leds
traseros
(D15,
D16)
se
encenderán,
indicando
el
último
test,
y
durará
15
segundos.
o IR interface
Pero en caso de que se quiera utilizar, se puede chequear su circuito.
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
71
6.3
ATmega8
6.3.1
Reemplazamiento
del
ATmega8
El
ATmega8
que
viene
con
el
robot
usa
un
protocolo
para
la
descarga
de
los
programas
(vía
transmisión
IR)
que
no
está
documentado
o
que
no
es
Standard,
por
lo
que
no
puede
modificarse,
y
de
este
modo,
tampoco
se
puede
utilizar
Arduino
para
dicha
descarga.
Afortunadamente,
en
lugar
de
ello
se
puede
usar
el
ATmega8
de
la
placa
de
Arduino
como
se
indica
a
continuación.
La ubicación de los ficheros depende del sistema operativo que utilices:
6.3.3
Conexión
y
programación
de
Asuro
con
Arduino
Para
poder
programar
el
Asuro
con
Arduino,
también
será
necesario
soldar
algunos
cables
extras
sobre
la
placa
del
Asuro.
Como
se
muestra
en
la
foto,
los
cables
deben
ser
soldados
a
los
pines
2
(RX)
y
3
(TX)
del
ATmega8
que
se
encuentra
en
el
Asuro,
de
forma
que
puedan
ser
conectados
a
los
pines
digital
pin
0
(RX)
y
digital
pin
1
(TX)
de
la
placa
Arduino.
El
otro
cable
saldrá
del
pin
de
tierra
o
GND
(pin
8)
e
irá
al
correspondiente
pin
de
tierra
de
Arduino.
A
continuación
se
muestra
la
relación
de
correspondencia
(Mapping
o
mapeo)
que
hay
entre
los
pines
definidos
en
el
ATmega8
y
los
pines
definidos
en
Arduino
y
Asuro
respectivamente.
De
este
modo,
se
puede
establecer
la
siguiente
correspondencia
entre
los
componentes
del
Asuro
y
los
pines
de
Arduino,
información
necesaria
para
su
posterior
programación
con
Arduino:
Librerías oficiales para controlar el Asuro
• http://www.arexx.com/downloads/asuro/asuro_src.zip
Una
vez
conectados
los
cables
a
los
pines
indicados
en
la
placa
Arduino,
hay
que
conectar
la
placa
Arduino
al
PC,
vía
cable
USB
(u
RS232).
De
esta
forma
se
podrá
descargar
programas
desde
el
entorno
de
Arduino.
Sólo
hay
que
tener
en
cuenta
que
el
ATmega8
está
en
el
Asuro,
no
en
la
placa
Arduino,
así
que
será
necesario
utilizar
el
switch
o
interruptor
de
encendido/apagado
del
robot,
en
lugar
del
pulsador
de
reset
de
la
placa
Arduino.
Para
ello
hay
que
encender
el
robot
Asuro
justo
antes
de
pulsar
el
botón
de
"upload"
en
el
entorno
de
programación
de
Arduino.
Si
no
funciona,
comprueba
la
conexión
de
los
cables
que
van
a
los
pines
0
y
1
sobre
la
placa
Arduino.
Los
comandos
Arduino,
para
la
comunicación
serie,
deberían
de
funcionar
sin
ningún
problema.
6.4
Funciones
En
primer
caso
decir
que
Arduino
no
se
programa
en
C,
tiene
un
lenguaje
propio
llamado
Arduino,
muy
parecido
a
C.
Con
funciones
más
faciles
e
intuitivas.
Setup():
La
función
setup()
es
llamada
justo
en
el
momento
en
que
el
programa
comienza.
Se
utiliza
para
inicializar
variables,
definir
los
modos
de
entrada
o
salida
de
los
pines,
indicar
librerías,
etc.
{
beginSerial(9600);
}
Loop():
la
sección
loop()
hace
precisamente
lo
que
su
nombre
indica
en
inglés(bucle),
y
se
repite
continuamente,
permitiendo
que
tu
programa
mute
y
responda.
Se
usa
para
controlar
de
forma
activa
la
tarjeta
Arduino.
El
tiempo
del
bucle,
varía
según
el
número
de
instrucciones
que
contenga.
Y
se
puede
conocer
y
controlar
con
las
funciones
de
temporización
(millis(),
delay(),
etc).
void loop() {
if (digitalRead(buttonPin) == HIGH)
serialWrite('H');
else
serialWrite('L');
delay(1000);
}
pinMode(pin,
mode)
:
Configura
el
pin
especificado
para
que
se
comporte
como
una
entrada
(input)
o
una
salida
(output).
digitalWrite(pin,
value)
:
Asigna
el
valor
de
salida
HIGH
o
LOW
al
pin
especificado.
digitalRead(pin):
Lee
o
captura
el
valor
de
entrada
del
pin
especificado,
dará
valores
HIGH
o
LOW.
pulseIn(pin,
value):
Lee
un
pulso
(en
estado
HIGH
(1)
o
LOW(0))
sobre
un
pin.
Por
ejemplo,
si
el
valor
es
HIGH,
pulseIn()
espera
hasta
que
el
pin
esté
en
estado
HIGH,
entonces
empieza
a
temporizar,
y
cuando
el
pin
vuelve
al
estado
LOW,
se
para
el
temporizador.
De
este
modo,
se
devuelve
el
ancho
del
pulso
en
microsegundos.
void setup() {
pinMode(pin, INPUT);
void loop() {
analogRead(pin)
:
Lee
o
captura
el
valor
de
entrada
del
especificado
pin
analógico,
la
tarjeta
Arduino
realiza
una
conversión
analógica
a
digital
de
10
bits.
Esto
quiere
decir
que
mapeará
los
valores
de
voltage
de
entrada,
entre
0
y
5
voltios,
a
valores
enteros
comprendidos
entre
0
y
1024.
void setup() {
void loop() {
} else {
analogWrite(pin,
value):
Escribe
o
asigna
un
valor
analógico
(PWM)
al
pin
desado.
Se
puede
usar
para
encender
un
Led
e
ir
variando
la
intensidad
de
su
brillo
o
impulsar
un
motor
a
distintas
velocidades.
Después
de
invocar
o
realizar
una
llamada
a
la
función
analogWrite,
el
pin
generará
una
señal
estable
hasta
la
próxima
invocación
o
llamada
de
la
función
analogWrite
(o
una
llamada
a
digitalRead
o
digitalWrite
sobre
el
mismo
pin).
value:
representa
al
parámetro
"ciclo
de
trabajo"y
puede
tomar
valores
entre
0
y
255.
0
corresponde
a
una
señal
de
salida
de
valor
constante
de
0
v
(LOW)
o
0%
de
"ciclo
de
trabajo";
255
es
una
señal
de
salida
de
valor
constante
de
5
v
(HIGH)
o
100%
de
"ciclo
de
trabajo";
.
Para
valores
intermedios,
el
pin
rápidamente
alterna
entre
0
y
5
voltios
-‐
el
valor
más
alto,
lo
usual
es
que
el
pin
esté
en
high
(5
voltios).
int ledPin = 9; // LED conectado al pin digital 9
void setup() {
void loop() {
Las
funciones
que
se
explican
a
contunuación
son
válidas
para
la
version
0004
e
inferiores:
beginSerial(int
speed)
:
Inicializa
el
puerto
serie
asignándole
una
velocidad
de
transmisión
de
datos
(bits
por
segundo).
Dicha
función
debe
ser
llamada
desde
dentro
de
lasección
setup().
serialWrite(character)
:
Envía
un
byte
(como
caracter
ASCII
que
representa
el
valor
numérico
de
dicho
byte)
al
puerto
serie.
SerialAvailable()
:
Obtiene
un
número
entero
con
el
número
de
bytes
(caracteres)
diponibles
para
leer
desde
el
puerto
serie.
Plataforma
Arduino
en
diseño
de
Robots
Móviles
Página
80
SerialRead():
Lee
un
byte
(un
caracter)
desde
el
puerto
serie.
void loop() {
val = serByte;
printByte(val);
printMode(mode):
Esta
función
determina
si
la
salida
de
la
función
print()
va
hacia
el
puerto
serie
o
a
un
display
LCD
(Liquid
Crystal
Display).
Mode
puede
ser
SERIAL
o
DISPLAY
printByte(b)
:
Vuelca
un
único
byte
al
puerto
serie
(no
como
caracteres
ASCII
que
representan
el
valor
numérico
de
dicho
byte).
printString(str)
:
Vuelca
como
salida
al
puerto
serie
una
cadena
de
caracteres
;
de
esta
forma,
transmite
la
secuencia
ASCII
de
los
caracteres
contenidos
en
la
cadena.
printInteger(num)
:
Vuelca
un
número
entero
codificado
o
en
caracteres
ASCII
en
formato
decimal
al
puerto
serie;
de
esta
forma,
transmite
la
secuencia
de
números
en
ASCII,
de
la
representación
en
base
10
del
número
entero.
printHex(num)
:
Vuelca
un
entero
codificado
o
en
caracteres
ASCII,
en
formato
hexadecimal
al
puerto
serie;
de
esta
forma,
transmite
la
secuencia
de
números
y
letras
en
ASCII,
de
la
representación
en
base
16
del
número
entero.
printBinary(num):
Imprime
o
vuelca
un
entero
codificado
o
en
caracteres
ASCII,
en
formato
binario
(binary
integer)
al
puerto
serie;
de
esta
forma,
transmite
la
secuencia
de
ceros
y
unos
en
ASCII,
de
la
representación
en
base
2
del
número
entero.
PrintNewline()
:
Imprime
o
vuelca
un
carácter
de
salto
de
línea
('\n')
en
el
puerto
serie.
Estas
funciones
son
validas
de
la
versión
0004
en
adelante:
Serial.begin(int
speed)
:
Equivalente
a
la
función
beginSerial().
Serial.available()
:
Equivalente
a
la
función
serialAvailable().
void setup() {
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
Serial.println(incomingByte, DEC);
} void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
Serial.println(incomingByte, DEC);
Serial.print(data,
data
type)
:
Envía
un
número
o
una
cadena
de
caracteres,
al
puerto
serie.
Dicho
comando
puede
tomar
diferentes
formas,
dependiendo
de
los
parámetros
que
utilicemos
para
definir
el
formato
de
volcado
de
los
números.
DEC:
escribe
el
valor
en
decimal,
en
caracteres
ASCII
HEX:
escribe
el
valor
en
hexadecimal,
en
caracteres
ASCII
OCT;
escribe
el
valor
en
octal,
en
caracteres
ASCII
BIN:
escribe
el
valor
en
binario,
en
caracteres
ASCII
BYTE:
escribe
el
carácter
ASCII
asociado
a
dicho
valor
str:
escribe
la
cadena
de
caracteres.
Serial.printnl(data,
data
type)
:
Envía
un
número
o
una
cadena
de
caracteres
al
puerto
serie,
seguido
de
un
carácter
de
retorno
de
carro
"CR"
('\r')y
un
carácter
de
salto
de
línea
"LF"('\n').
Toma
la
misma
forma
que
el
comando
Serial.print()
A
continuación
hablaremos
de
las
funciones
de
tiempo
que
la
plataforma
Arduino
nos
ofrece.
Millis():
Devuelve
el
tiempo
en
milisegundos,
desde
que
la
tarjeta
Arduino
activó
el
programa
que
se
está
ejecutando.
long time;
void setup(){
Serial.begin(9600);
} void loop(){
Serial.print("Time: ");
time = millis();
Serial.println(time);
delay(1000);
delay(ms)
:
Detiene
el
programa
durante
una
cantidad
de
tiempo
(en
milisegundos)
especificado
mediante
parámetro.
int ledPin = 13; // LED conectado a pin digital 13
void setup() {
void loop() {
delayMicroseconds(us)
:
Detiene
el
programa
durante
una
cantidad
de
tiempo
(en
microsegundos)
especificado
mediante
parámetro.
int outPin = 8; // pin digital 8
void setup() {
void loop() {
Aparte
de
todas
estas
funciones,
existen
muchas
más
funciones,
matemáticas,
trigonométricas...
más
complejas,
en
librerías
aparte.
Por
lo
demás
es
todo
igual
que
en
C,
sólo
que
no
existen
los
puertos,
sino
que
son
solo
pines.
El
programa
tiene
tres
funciones
distintas,
tiene
una
matriz
4x4
y
las
coordenadas
del
led
se
controlan
con
el
Pad
L
del
mando
de
la
Play
station.
También
hay
un
servo-‐motor
que
es
controlado
por
el
eje
Y
del
Pad
R
del
mismo
mando,
y
finalmente
tiene
un
led,
cuya
intensidad
se
regula
con
las
flechas
de
hacia
arriba,
y
hacia
abajo
del
mando.
#define pinX 0
#define ctr_srv 1
#define pinY 2
#define servoPin 11
#define ledraise 5
#define ledlower 4
#define led 12
#define time 50
char i, j;
void setup() {
pinMode(17, OUTPUT);
pinMode(18, OUTPUT);
pinMode(19, OUTPUT);
pinMode(20, OUTPUT);
pinMode(28, OUTPUT);
pinMode(30, OUTPUT);
pinMode(32, OUTPUT);
pinMode(34, OUTPUT);
pinMode(servoPin, OUTPUT);
void loop() {
x = analogRead(pinX)/256;
y = analogRead(pinY)/256;
pos= analogRead(ctr_srv);
portx[x]=LOW;
porty[y]=HIGH;
if(millis()-previousMillis>=time){
previousMillis= millis();
servoPulse();
salidas();
void salidas(){
char indice;
analogWrite(led, led_ilu);}
void servoPulse() {
float pulseWidth;
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(servoPin, LOW);
delay(20);