Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PorGiselaFarace
Mayo2015
1
ndice
1.QuesunArduino?
2.ElrobotDreamster
2.1.Sealesanalgicasydigitales
2.2.Conexionado
2.2.1.Losmotores
2.2.2.Sensoresdeultrasonido
3.Qunecesitamosinstalar?
4.Antesdeempezar
4.1.Estructuradelcdigo
4.2Referenciasimportantes
5.Aprendiendoaprogramar
5.1.LED
5.1.1.QuesunLED?
5.1.2.ComoprenderunLED?
5.2.ElPuertoSerie
5.3.Sensoresdeultrasonido
5.3.1.Cmofuncionanlossensoresdeultrasonido?
5.3.2.Cmomedirdistanciasconsensoresdeultrasonido?
5.4.Sensoresinfrarrojos
5.4.1.Cmofuncionanlossensoresinfrarrojos?
5.4.2.Cmodistinguirblancoynegroconsensoresinfrarrojos?
5.5.Motores
5.5.1.PuenteH
5.5.2.PWM
5.5.3.Cmosecontrolanlosmotores?
6.Desafos
6.1.Seguidordelneas
6.2.Resolvedordelaberintos
6.3.Empujandodecajitas
6.Anexo
6.1.pinMode()
6.2.digitalWrite()
6.3.analogWrite()
2
6.4.analogRead()
6.5.delay()
6.6.delayMicroseconds()
6.7.Serial.begin()
6.8.Serial.print(),Serial.println()
6.9.pulseIn()
6.10.map()
6.11.ifelse
6.12.for
6.13.while
7.Pginasdereferencia
1. Qu es un Arduino?
ParaconocermssobreArduino:
www.arduino.cc
2. El robot Dreamster
Figura1.AspectodelArduinoLeonardo
Existen dos tipos de seales: analgicas y digitales. Analgica quiere decir que la
seal, para ir de un valor aotro,pasa por todos los valores intermedios. La seal digital,
encambio,vaasaltos,pasadeunvaloralsiguientesinpodertomarvaloresintermedios.
En otras palabras, una seal analgica es continua y puede tomar infinitos valores
mientras que unaseal digital es discontinua y slopuedetomardosvaloresoestados:0
y 1, que pueden ser impulsos elctricos de baja y alta tensin, interruptores abiertos o
cerrados,etc.
Figura2.Sealanalgicaydigital.
5
2.2. Conexionado
Funcin
PinName
Funcin
PinName
MotorIzquierdaP
InfrarrojoIzquierda
A0
MotorIzquierdaN
10
InfrarrojoDerecha
A1
MotorDerechaP
SensorUSATrigger
A3
MotorDerechaN
SensorUSAEcho
LedVerde
11
SensorUSBTrigger
A4
LedRojo
12
SensorUSBEcho
LedAzul
13
SensorUSCTrigger
A5
SensorUSCEcho
Tabla1.ConexionesdelDreamsterenlaplacaArduinoLeonardo
Figura3.Ubicacindelossensoresdeultrasonidoenelrobot
3. Qu necesitamos instalar?
Unavezinstalado,abrirelprograma.Severdeunaformaparecidaalasiguiente.
Figura4.EstructuradelaIDE
1. Verificar:
Compilaypruebaelcdigo.Tenotificasiencuentraerrores.
2. Cargar: Enva tu cdigo a la placa de Arduino.Cuandolehacesclickdeberasver
parpadearlaslucesdetuplaca.
3. Nuevo:
Abreunanuevaventanadecdigo.
4. Abrir:
Abrelosdiferentescdigosexistentes.
5. Guardar:
Guardaloscambiosdetucdigo.
6. Monitor Serie: Abre una ventana que muestra la informacin queenvalaplacaa
travsdelpuertoserie.Estemonitoresmuytilparadepurarelcdigo.
7. NombredelSketch:
Muestraelnombredelarchivoenelqueeststrabajando.
8. readecdigo:
Enestaseccinseescribeelcdigo.
LuegodebemosconfigurarelmodelodeArduinoquesevaautilizar
Figura5.ConfiguracindelArduinoLeonardoenlaIDE
Figura6.ConfiguracindelpuertoserialenlaIDE
4. Antes de empezar
4.1. Estructura del cdigo
Elcdigoseestructuradelasiguienteforma:
Figura7.Estructuradelcdigo
Lasestructurasprincipalesdelprogramason:
voidsetup()
Es la primera funcin que se ejecuta en el programa. Se usa para inicializar las
variables, el modo de los pines, etc. Se ejecuta una sola vez al empezar el programa o
luegodepresionarelbotnderesetdelaplaca.
voidloop()
Esta funcin es precisamente un ciclo infinito. Dentro se encuentra nuestro programa
principal.Sedebedeclararluegodeconfiguradalafuncinsetup().
10
Declaracindevariables
Antes de la funcin de setup se deben declarar las variables a utilizar. Sirve para
asociarunaetiquetaaunnmerodepinoconfigurarotrotipodevariablesauxiliares.
A continuacin se explican las funciones y variables que vamos autilizar durante este
tutorial.EnelAnexoseexplicalasntesisdelasfunciones.
Variables
int:
variabledetipoenterode16bits.(Rango32767a+32767)
char:
variabledetipocaracter.
long:
variabledetipoenterode32bits(Rango2147483647a+2147483647)
Modificadoresdevariables
const:
dejaconstanteelvalordelavariable.Seescribeantesdeltipodevariable.
Estadosdealgunasvariables
HIGH, LOW: constantes que definen el estado del pin en alto (HIGH) o en bajo
(LOW).
INPUT,OUTPUT:
configuraelpincomoentrada(INPUT)ocomosalida(OUTPUT)
Funciones
pinMode( ) :
configura un pin especfico para que se comporte como entrada o
salida.
digitalWrite():
escribeelvalorHIGHoLOWaunpindigital.
analogWrite( ): escribe un valor analgico al pin. Puede ser usado para variar el
brillodeunLEDocambiarlavelocidaddeunmotor.
analogRead():
leeelvalordeunpinespecfico.
delay():
pausaelprogramaporunacantidaddetiempomedidaenmilisegundos.
delayMicroseconds( ):
pausa el programa por una cantidad de tiempo medida en
microsegundos.
Serial.begin( ): configura la tasa de transferencia de bits
por segundo para la
transmisinporpuertoserie.
Serial.print( ), Serial.println( ):
imprimen la informacin que se enva por el puerto
serie.Enelcasodelprintlnluegodeimprimircomienzaenunanuevalnea.
pulseIn():
leeelestadodelpin,yaseaHIGHoLOW.
map():
transformaunrangoaotro.
Estructuras
ifelse:
esquemadedecisinapartirdeunacondicinysucomplemento:
[Sicondicin]
sentencia1
[sinocondicin]
sentencia2
.
for:
seutilizapararepetirunbloquedesentenciasencerradasentrellaves.
while:
mientras la condicin es verdadera se comporta como un ciclo continuo.
Cuandolaexpresindentrodelacondicinseafalsaysaledelciclowhile.
11
Comentarios
//
Comentaunalnea
/*
Comentatodolocontenidoentrelasbarras,
puedenserprrafosconvariaslneas
*/
12
5. Aprendiendo a programar
5.1. LED
5.1.1. Qu es un LED?
Figura8.PolaridaddelLED
LedVerde:pin11
LedRojo:pin12
LedAzul:pin13
13
Ejemplo1
//
Enelsiguienteejemploelledazulparpadeaconunafrecuenciadeunsegundo
int
led_azul=13//
Usamoslaetiquetadeled_azulparareferirnosalpin13
voidsetup
(){
pinMode
(led_azul,OUTPUT)//
Configuramoselledcomopindesalida
}
voidloop
(){
digitalWrite
(led_azul,HIGH)//
Seprendeelled
delay
(1000)//
Espera1segundo
digitalWrite
(led_azul,LOW)//
Seapagaelled
delay
(1000)//
Espera1segundo
}
Ejercicio:
Escribir un programa con la siguientesecuencia:prenderledazul,esperarunsegundo,
penderledrojo,esperarunsegundo,prenderledverde,esperarunsegundo.Repetir.
Ayuda. ElledubicadoenelShield(placa verdeubicadasobreelArduino)tienedentro 3
pequeos leds con los diferentes colores. Para poder observar los colores antes de
prenderunledhayqueapagarelanteriorqueestabaprendido.
14
Ejemplo2
/*
En este ejemplo, se habilita la opcin de comunicacin serie. Se generan
nmeros aleatorios entre 0 y 299. Luego se imprime en el monitor serie los
nmeros mayores a 100. Para inicializar el puerto serie se usa un baud rate de
9600, que corresponde al nmero de bits por segundo (bps) mximo que puede
transmitirelcanal.
*/
int
aleatorio=0//
Declarounavariableparaguardarnmerosaleatorios
voidsetup
(){
Serial.begin
(9600)//
Configuroelbaudrateen9600
}
voidloop
(){
aleatorio=
random
(300)//
Nmerosaleatoriosentre0y299
//
Sielnmeroesmayora100
if
(aleatorio>100){
Serial.print
("Numeroaleatorio:")
Serial.println
(aleatorio)//
Imprimeelnmeroaleatorio
}
}
Elejemploanteriorenelmonitorserie:
Figura9.Muestradenmerosaleatoriosenviadosatravsdelpuertoserie.
15
Figura10.Diagramadetiemposdelsensordeultrasonido.
Delatabla1,lospinesquecorrespondenacadasensorson:
Trigger
pinA3
pinA4
pinA5
Echo
pin8
pin2
pin7
Tabla2.Ubicacindelospinesparalossensoresdeultrasonido.
16
Ejemplo3
/*
Ejemplo de lectura del sensor A a travs del puerto serie. Indica la distancia en
mm a la que se encuentra el objeto. El pin de Trigger se define como salida
mientrasqueelpindeEchocomoentrada.
*/
constint
Trigger_A=A3
constint
Echo_A=8
long
Duracion=0//
VariableauxiliarquemideladuracindelpulsoEcho
long
Distancia_mm=0//
Variableauxiliarparacambiarlasunidadesamm
voidsetup
(){
pinMode
(Trigger_A,OUTPUT)//
Seconfiguracomosalida
pinMode
(Echo_A,INPUT)//
Seconfiguracomoentrada
Serial.begin
(9600)//
Configuroelbaudrateen9600
}
voidloop
(){
digitalWrite
(Trigger_A,LOW)//
Nosaseguramosqueeltriggerestencero
delayMicroseconds
(2)
digitalWrite
(Trigger_A,HIGH)//
Activamoseltrigger
delayMicroseconds
(10)
digitalWrite
(Trigger_A,LOW)//
Desactivamoseltrigger
Duracion=
pulseIn
(Echo_A,HIGH)//
MedimosladuracindelpulsoEcho
Distancia_mm=((Duracion/2.9)/2)//
Convertimosladuracinendistancia
Serial.print
("Distancia=")
Serial.print
(Distancia_mm)//
Imprimimosporpantallaladistanciaenmm
Serial.println
("mm")
delay
(1000)
}
Ejercicio:
Armar un cdigo dondesemuestreenelmonitorserieladistanciadelos3sensoresde
ultrasonidodelaforma:DistanciaA:
valorA
//DistanciaB:
valorB
//DistanciaC:
valorC
17
Para verificar que los sensores estn prendidos se puede utilizar la cmara de un
celular. Si se la enfoca hacia los sensores se puede ver queunodelospuntosdel sensor
seencuentraconunaluzvioleta.Estoquieredecirqueelsensorestprendido.
Figura11.Visindelinfrarrojoatravsdeunacmaradecelular.
Arriba:sensoresapagados.Abajo:sensoresprendidos.
Segnlatabla1,lossensoresinfrarrojosseencuentranconectadosen:
SensorInfrarrojoIzquierda:pinA0
SensorInfrarrojoDerecha:pinA1
18
Ejemplo4
/*
En el siguiente ejemplo se utiliza el led azul como indicador de lo que ve el
sensor infrarrojo. El led va cambiando la intensidad de la luz dependiendo de la
superficie en laquese encuentra el sensor. En una superficieblanca el led est
completamente prendido mientras que en una superficie negra el led se apaga.
Ademsenvaporpuertoserieelvalordelsensor.
*/
constint
sensor=A0
constint
led=13
int
medicion
char
out
voidsetup
(){
pinMode
(sensor,INPUT)//
Configuroelsensorcomoentrada
pinMode
(led,OUTPUT)//
Configuroelledcomosalida
Serial.begin
(9600)//
Configuroelbaudrateen9600
}
voidloop
(){
medicion=
analogRead
(sensor)//
Leeelvalordelsensor
out=
map
(medicion,0,1023,0,255)//
Ajustaelbrillodelled
analogWrite
(led,out)//
Escribeelvalorenelled
Serial.println
(out,DEC)//
Imprimeelvalorenelmonitorserieenformadecimal
}
Ejercicio:
Hacer un cdigo con los dos sensores infrarrojos del robot donde cambie laintensidad
del led segn loquemida el sensor y se indique el led azulparaunodelossensores yel
ledverdeparaelotrosensoralmismotiempo.
19
5.5. Motores
5.5.1. Puente H
Figura12.DosestadosposiblesdelpuenteH.
5.5.2. PWM
Adems del puente H tambin necesitamos regular la velocidad a la que giran los
motores. Esto se hace mediante una modulacin del ancho de pulsos, o ms conocido
como PWM (Pulse Width Modulation)queconsiste en modificar el ciclo de trabajodeuna
seal peridica para controlarlacantidaddeenergaqueseenvaaunacarga,ennuestro
caso el motor. En sencillas palabras, el PWM regula la energa controlando la tensin
mediaquerecibeelmotoryporlotantolavelocidadalaqueva.
Figura13.EjemplosdelamodulacindelanchodepulsoPWM
20
pinP
pinN
Motor
PWM
Adelante,frenadorpido
PWM
Atrs,frenadorpido
PWM
Adelante,frenadolento
PWM
Atrs,frenadolento
Tabla3.Dosparesdeopcionesparacambiarelsentidodelmotor
yregularlavelocidadmedianteelPWM
Delatabla1,lospinesdelosmotoresseencuentranubicadosenlossiguientespines.
Positivo Negativo
MotorIzquierda
pin9
pin10
MotorDerecha
pin5
pin6
Tabla4.Ubicacindelospinesparalosmotoresdelrobot
21
Ejemplo5
/*
Ejemplo del movimiento incremental del motor izquierdo hacia adelante yluego
haciaatrs.
*/
int
MotorIzqP=9
int
MotorIzqN=10
voidsetup
(){
//
Configuramoslospinesenceroparaapagarelmotor
digitalWrite
(MotorIzqP,LOW)
digitalWrite
(MotorIzqN,LOW)
}
voidloop
(){
//
Incrementamoslavelocidadprogresivamentehaciaadelante
digitalWrite
(MotorIzqN,LOW)
for
(inti=0i<255i++){
analogWrite
(MotorIzqP,i)
delay
(100)
}
//
Incrementamoslavelocidadprogresivamentehaciaatrs
digitalWrite
(MotorIzqP,LOW)
for
(inti=0i<255i++){
analogWrite
(MotorIzqN,i)
delay
(100)
}
//
Detenemoselmotorparacomenzarnuevamente
digitalWrite
(MotorIzqP,LOW)
digitalWrite
(MotorIzqN,LOW)
delay
(1000)
}
Ejercicio:
Hacer que el robot describa un un cuadrado, es decir, que avancederecho durante 1
segundo, luego que gire a la derecha y avance por otro segundo, gire de nuevo a la
derecha hasta completar la vuelta. Hacer lo mismo pero que el robot gire hacia la
izquierda.
22
6. Desafos
Ahora es tiempo deintegrar todo lo que aprendimos en el tutorial! Para eso te damos
algunas ideas para empezar a jugar con el robot. Tambin pods inventar tu propia
modalidad.Ajugar!
23
6. Anexo
Todaslasfuncionesexistentes:
http://www.arduino.cc/en/Reference/HomePage
6.1. pinMode( )
Sintaxis:
pinMode(
pin,modo
)
Parmetros:
pin:nmerodepinalquesequiereconfigurar
modo:INPUToOUTPUT
Devuelve:
Nada
6.2. digitalWrite( )
Sintaxis:
digitalWrite(
pin,valor
)
Parmetros:
pin:nmerodepin
valor:HIGHoLOW
Devuelve:
Nada
6.3. analogWrite( )
Sintaxis:
analogWrite(
pin,valor
)
Parmetros:
pin:elpinalqueselequiereescribir.
valor:ciclodetrabajo,entre0(siempreapagado)a255(siempreprendido).
Devuelve:
Nada
6.4. analogRead( )
Sintaxis:
analogRead(
pin
)
Parmetros:
pin:elnmerodelpinanalgicodeentradaaleer.
Devuelve:
int(0a1023)
24
6.5. delay( )
Sintaxis:
delay(
ms
)
Parmetros:
ms:elnmerodemilisegundosapausar.1000milisegundoses1segundo.
Devuelve:
Nada
6.6. delayMicroseconds( )
Sintaxis:
delayMicroseconds(
us
)
Parmetros:
us:elnmerodemicrosegundosapausar.
Devuelve:
Nada
6.7. Serial.begin( )
Sintaxis:
Serial.begin(
velocidad
)
Parmetros:
velocidad:enbitsporsegundo
Devuelve:
Nada
6.9. pulseIn( )
Sintaxis:
pulseIn(
pin,valor
)
Parmetros:
pin:nmerodepindelcualsequiereleerelpulso.
valor:tipodepulsoledo,HIGHoLOW.
25
Devuelve:
lalongituddelpulsoenmicrosegundos
6.10. map( )
Sintaxis:
map(
valor,desdeLow,desdeHigh,haciaLow,haciaHigh
)
Parmetros:
valor:elnmeroareasignar
desdeLow:ellmiteinferiordelrangoactual
desdeHigh:ellmitesuperiordelrangoactual
haciaLow:ellmiteinferiordelrangoobjetivo
haciaHigh:ellmitesuperiordelrangoobjetivo
Devuelve:
elvalorreasignadoenelnuevorango
6.11. if else
Estructura:
if(
condicin
){
//
AccinA
}
else{
//
AccinB
}
6.12. for
Estructura:
for(
inicializacincondicinincremento
){
//
Sentencias
6.13. while
Estructura:
while(
expresin
){
//
Sentencias
26
7. Pginas de referencia
Dreamster
www.dreamsterbot.org/es
Arduino
www.arduino.cc
Sensoresdeultrasonido:HCSR04
www.micropik.com/PDF/HCSR04.pdf
Sensoresinfrarrojos:TCRT1000
www.vishay.com/docs/83752/tcrt1000.pdf
PuenteH:DRV8833
www.ti.com/lit/ds/symlink/drv8833.pdf
27