Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MICROCONTROLADORES EN EL RECREO
Curso 2014-15
ndice de prcticas
1. Encender un led con un pulsador
2. Lectura de Entrada analgica
3. Variacin de la luminosidad de un LED por entrada analgica
4.Pantalla LCD
Error en ejemplos de la librera de LCD Liquidcrystal
Hola mundo!
Comandos de la librera <LiquidCrystal_I2C.h>
5. Semforo
6. Arranque estrella-tringulo
Mdulo de rels
7. Funcionamiento de un motor con pulsador de marcha y paro
8. Sensor de aparcamiento por ultrasonidos con zumbador (Angel Reyes Nieto)
9. SENSOR DE APARCAMIENTO CON LEDS ( Jorge Delgado Garca)
RECREOS ARDUINO
1. Encender un led con un pulsador
Encender LED con un pulsador
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
----------------------------------Encender LED con un pulsador
----------------------------------Oprimir un pulsador y mientras este se mantenga accionado
un LED se enciende
Cosas de Mecatrnica y Tienda de Robtica
*/
//-----------------------------------//Declara puertos de entradas y salidas
//-----------------------------------int pulsador=2;
//Pin donde se encuentra el pulsador, entrada
int led=13;
//Pin donde se encuentra el LED, salida
//-----------------------------------//Funcion principal
//-----------------------------------void setup() // Se ejecuta cada vez que el Arduino se inicia
{
pinMode(pulsador, INPUT); //Configurar el pulsador como una entrada
pinMode(led,OUTPUT); //Configurar el LED como una salida
}
//-----------------------------------//Funcion ciclicla
//-----------------------------------void loop() // Esta funcion se mantiene ejecutando
{
// cuando este energizado el Arduino
//Condicional para saber estado del pulsador
if (digitalRead(pulsador)==HIGH)
{
//Pulsador oprimido
digitalWrite(led,HIGH); //Enciende el LED
}
else
{
38
39
40
}
41 }
//Pulsador NO oprimido
digitalWrite(led,LOW); //Apaga el LED
Notas:
Lnea 25, la funcin digitalRead(pin) va a devolver un 0 o 1 segn el nivel presente en
el pin. Los dos signos == significan operador de igualdad, un solo = asigna un valor a
una variable.
Operadores
de
comparacin
==
Comparacin
de
igualdad
!=
Comparacin
de
diferencia
>
Comparacin
de
mayor
que
>=
Comparacin
de
mayor
o
igual
que
<
Comparacin
de
menor
que
<=
Comparacin
de
menor
o
igual
que
La conexin de la entrada digital como se representa en la siguiente figura se llama pulldown y asegura que la tensin de entrada sea 0 cuando el pulsador est abierto.
Lneas 30-39, if (condicin){instrucciones si se cumple} else{instrucciones si no se
cumple}
Ejercicio:
Si la seal de entrada se conecta como la figura anterior (en pull-up), cmo cambiaras el sketch para
que funcione igual?, se te ocurre otra forma?
/*
**** rDuinoStar.com - Comunidad Arduino en Espaol ****
Tutorial 3.- Estradas analgicas
Lectura de un valor de tensin en un pin analgico y escritura en puerto serie del valor recogido.
Uso pblico citando el autor o procedencia, bajo licencia:
Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
*/
// Pin analgico que utilizaremos como entrada de datos
int entradaDatos = A0;
// Variable que recoger las lecturas de A0
int valorDatos = 0;
void setup()
{
// Establecemos la velocidad para transmitir datos en serie a
// 9600 baudios
Serial.begin(9600);
}
void loop()
{
// Leemos el valor en la entrada analgica A0 y se lo asignamos a
// valorDatos
valorDatos = analogRead(entradaDatos);
// Imprimimos el valor por el puerto serie
Serial.println(valorDatos);
}
Notas:
Lnea 25, la funcin analogRead(entradaDatos) va a devolver un nmero entero
comprendido en el rango de valores 0-1023, ambos inclusive.
Como vers, al abrir el monitor serie las medidas pasan muy rpido.
Ejercicio:
Aade un retraso con la funcin delay para que se muestre una medida cada 3 segundos. Cmo y
dnde lo deberas aadir?
En el siguiente sketch reducimos las seales de ruido dando un umbral a la medida para que
no muestre pequeas variaciones
Leer entrada analgica y ver valor por el monitor serie con reduccin de ruido
1 /*
2 ***********************************************************
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Notas:
Lnea 19, los enteros pueden valer entre -32.768 y 32.767 (65.535 valores). Es
necesario inicializar esta variable a un valor distinto de 0.
Lnea 35, if (condicin){instrucciones si se cumple} else{instrucciones si no se cumple}.
abs, devuelve el valor absoluto del nmero que puede ser entero o decimal
Lnea 40, actualiza valorAnterior con la lectura analgica para compararla con la
siguiente
Ejercicio:
http://www.tr3sdland.com/2011/11/tutorial-arduino-0003-entrada-analogica-y-salida-pwm/
4.Pantalla LCD
La librera para usar los LCD 16x2 es la de fmalpartida (https://bitbucket.org/fmalpartida/newliquidcrystal/downloads).
Para usarla hay que descomprimirla en la carpeta libraries del IDE, borrando previamente la
carpeta Liquidcrystal existente.
Para determinar la direccin de la tarjeta IC2 usamos el sketch de la web:
http://playground.arduino.cc/Main/I2cScanner
Arduino
Arduino Mega
VCC
5V
5V
GND
GND
GND
SCL
A5
D21
SDA
A4
D20
Esta pequea tarjeta viene provista de un conector de 4 pines (ver foto), de arriba a abajo:
Nota. Para recordar con facilidad, asocie SDA con el 4, es decir SDA = pin4, el otro pin (pin5)
se corresponde con SCL.
Para configurar nuestra tarjeta y que funcione hay que cambiar la asignacin de los pines en
los sketches. Tenemos dos formas:
1. Sustituir o comentar las lnea de configuracin del LCD que empiezan por
LiquidCrystal_I2C lcd(xxx) por:
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
2. Sustituir o comentar las lnea de configuracin del LCD que empiezan por
LiquidCrystal_I2C lcd(xxx) por el siguiente cdigo:
/*-----(
Declaracin
de
constantes
)-----*/
//
Direccin
I2C
del
LCD
#define
I2C_ADDR
0x27
//
Asignacin
de
pines
para
el
YwRobot
LCM1602
IIC
V1
(PCF8574T)
#define
BACKLIGHT_PIN
3
#define
En_pin
2
#define
Rw_pin
1
#define
Rs_pin
0
#define
D4_pin
4
#define
D5_pin
5
#define
D6_pin
6
#define
D7_pin
7
//
Iluminacin
ON/OFF
#define
LIGHT_OFF
LOW
#define
LIGHT_ON
HIGH
/*-----
Configurar
LCD
-----*/
LiquidCrystal_I2C
lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
Hola mundo!
Siempre es bueno comenzar con un Hola mundo! o Hello world!.
Primero debemos instalar la librera correspondiente LiquidCrystal_I2C.h y posteriormente
buscar en los ejemplos que trae con ella el Hello world! y compilarlo.
10
Bajo coste.
________________________________________________________________
5.
Semforo
Materiales
11
CODIGO DE FUNCIONAMIENTO
void
setup()
{
pinMode(8,OUTPUT);//Declaramos
los
pines
a
usar
y
la
accin
que
realizarn
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
}
void
loop()
{
digitalWrite(10,HIGH);
//Escribimos
en
el
pin
10
"HIGH"
un
uno
lgico
para
encender
LED
VERDE
delay(5000);
//ESPERAMOS
5
SEGUNDOS
digitalWrite(10,LOW);
//ESCRIBIMOS
EN
EL
PIN
10
"BAJO"
para
aapagar
el
LED
VERDE
delay(500);
//Esperamos
medio
segundo
digitalWrite(10,HIGH);
//
ESTE
ES
LA
PARTE
DONDE
SE
EJECUTA
EL
PARPADEO
DEL
LED,ESCRIBIMOS
"HIGH"
delay(500);
//ESPERAMOS
MEDIO
SEGUNDO
digitalWrite(10,LOW);
//
APAGAMOS
EL
LED
delay(500);
//ESPERAMOS
MEDIO
SEGUNDO
digitalWrite(10,HIGH);
//ESTE
PARTE
ES
LA
MISMA
QUE
LA
ANTERIOR,
ESTE
ES
EL
SEGUNDO
PARPADEO
DE
NUESTRO
LED
delay(500);
digitalWrite(10,LOW);
delay(500);
digitalWrite(10,HIGH);
//ESTE
PARTE
ES
LA
MISMA
QUE
LA
ANTERIOR,
ESTE
ES
EL
SEGUNDO
PARPADEO
DE
NUESTRO
LED
delay(500);
digitalWrite(10,LOW);
12
delay(500);
digitalWrite(9,HIGH);
//AHORA
ESCRIBIMOS
UN
"1"
LOGICO
EN
LE
PIN
9,
QUE
CORRESPONDE
A
NUESTRO
LED
AMARILLO
delay(3000);
//ESPERAMOS
3
SEGUNDOS
digitalWrite(9,LOW);
//APAGAMOS
EL
LED
AMARILLO
digitalWrite(9,HIGH);
//
ESTE
ES
LA
PARTE
DONDE
SE
EJECUTA
EL
PARPADEO
DEL
LED,ESCRIBIMOS
"HIGH"
delay(500);
//ESPERAMOS
MEDIO
SEGUNDO
digitalWrite(9,LOW);
//
APAGAMOS
EL
LED
delay(500);
//ESPERAMOS
MEDIO
SEGUNDO
digitalWrite(9,HIGH);
//ESTE
PARTE
ES
LA
MISMA
QUE
LA
ANTERIOR,
ESTE
ES
EL
SEGUNDO
PARPADEO
DE
NUESTRO
LED
delay(500);
digitalWrite(9,LOW);
delay(500);
digitalWrite(9,HIGH);
//ESTE
PARTE
ES
LA
MISMA
QUE
LA
ANTERIOR,
ESTE
ES
EL
SEGUNDO
PARPADEO
DE
NUESTRO
LED
delay(500);
digitalWrite(9,LOW);
delay(500);
digitalWrite(8,HIGH);
//ESCRIBIMOS
UN
"1"
LOGICO
EN
EL
PIN
8,
QUE
CORRESPONDE
AL
LED
ROJO
delay(5000);
//ESPERAMOS
5
SEGUNDOS
digitalWrite(8,LOW);
//ESCRIBIMOS
UN
"0"
LOGICO
EN
EL
PIN
8,
APAGANDO
EL
LED
ROJO
}
//I.E.S
EXTREMADURA
int
ledPin1
=
13;
int
ButtonPin1
=
7;
boolean
primerPulso
=
false;
void
setup()
{
pinMode(ledPin1,
OUTPUT);
pinMode(ButtonPin1,
INPUT);
}
void
loop()
{
13
if
(digitalRead(ButtonPin1)==HIGH)
primerPulso=!primerPulso;
delay
(10);
{
digitalWrite(ledPin1,primerPulso);
}
}
14
6. Arranque estrella-tringulo
Este programa lo he realizado para poder ir visualizndolo por el puerto serie.
Hay otras formas de realizarlo ms simples,
15
//Jos
Cerrato-----------------------------------
//ARRANQUE
ESTRELLA
TRINGULO
int
pulsador=6;
//PULSADOR
DE
MARCHA
Y
PARADA
int
led=12;
//
REL
PARA
CONTACTOR
DE
LINEA
int
led1=11;
//
REL
PARA
CONTACTOR
DE
ESTRELLA
int
led2=10;
//
REL
PARA
CONTACTOR
DE
TRINGULO
int
cnt_etapa=0;
//contador
de
etapas
y
estado//
void
setup(){
pinMode(pulsador,INPUT);
pinMode(led,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
Serial.begin(9600);
}
void
loop(){
if(digitalRead(pulsador)==HIGH&&cnt_etapa==0)
16
{
digitalWrite(led,HIGH);
//
ENTRA
REL
DE
LNEA
{digitalWrite(led1,HIGH);
//
ENTRA
REL
DE
ESTRELLA
delay(1000);
//
TIEMPO
DE
CAMBIO
digitalWrite(led1,LOW);
//
DESCONEXIN
DE
ESTRELLA
delay(100);
//
TIEMPO
DE
SEGURIDAD
digitalWrite(led2,HIGH);
//
ENTRA
EL
REL
DE
TRINGULO
}
cnt_etapa=1;
}
if(digitalRead(pulsador)==LOW&&cnt_etapa==1){
cnt_etapa=2;
//
PARADA
TOTAL
}
if(digitalRead(pulsador)==HIGH
&&
cnt_etapa==2){
digitalWrite(led,LOW);
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
cnt_etapa=3;
}
if(digitalRead(pulsador)==LOW
&&
cnt_etapa==3){
cnt_etapa=0;
}
Serial.println(cnt_etapa);
//puedes
ver
en
qu
etapa
est
el
programa
}
//El
paso
de
Estrella
a
Tringulo
se
realiza
de
modo
temporizado,
es
decir,
tras
pulsar
marcha
entra
K1
y
K3
modo
estrella
y
tras
5
segundos
comienza
la
secuencia
//Tringulo
apagando
K3
y
dejando
encendidos
K1
y
K2.
/*
17
//
//
Definimos
los
numeros
de
pin:
const
int
buttonP1
=
3;
//
Numero
de
Pin
del
pulsador
Marcha
const
int
buttonP2
=
2;
//
Numero
de
Pin
del
pulsador
Paro
const
int
ledPinK1
=
10;
//
Numero
del
pin
de
led
para
K1
const
int
ledPinK2
=
11;
//
Numero
del
pin
de
led
para
K2
const
int
ledPinK3
=
12;
//
Numero
del
pin
de
led
para
K3
//
variables:
int
estrella
=0;
//
Varible
de
apoyo
para
secuencia
estrella
int
triangulo
=0;
//
Varible
de
apoyo
para
la
secuencia
triangulo
int
buttonStateP1
=
0;
//
variable
para
leer
el
estado
del
pulsador
marcha
int
buttonStateP2
=
0;
//
variable
para
leer
el
estado
del
pulsador
Paro
void(*
resetFunc)
(void)
=
0;
//
Funcion
reseteo
18
19
pinMode(buttonP2,
INPUT);
digitalWrite(ledPinK1,
LOW);
digitalWrite(ledPinK2,
LOW);
digitalWrite(ledPinK3,
LOW);
}
void
loop(){
attachInterrupt(0,
paro,
CHANGE);
//
Interrupcin
de
paro.
//
leemos
el
estado
del
pulsador
de
marcha:
buttonStateP1
=
digitalRead(buttonP1);
//
leemos
el
estado
del
pulsador
de
paro:
buttonStateP2
=
digitalRead(buttonP2);
20
//
//
Arranque
estrella-triangulo
//
//
Made
by
pedrovjm
//
License:
CC-BY-SA
3.0
//
Downloaded
from:
http://123d.circuits.io/circuits/69877-arranque-estrella-triangulo
//
Declaracion
de
variables
int
alimentacionPin
=
6;
int
estrellaPin
=
4;
int
trianguloPin
=
2;
int
pmarchaPin
=
12;
int
pparoPin
=
8;
int
lastSTATE
=
LOW;
int
pmarchaSTATE
=
LOW;
int
pparoSTATE
=
LOW;
int
secuenciaArranque
=
LOW;
//
debounce
--
we
are
using
buttons
to
toggle
--
and
this
turns
over
fast
//long
time
=
0;
//
the
last
time
the
output
pin
was
toggled
//long
debounce
=
200;
//
the
debounce
time,
increase
if
the
output
flickers
21
//
el
setup
corre
solo
una
vez
cada
vez
que
se
reinicializa
el
programa
void
setup()
{
//
declaramos
las
variables
como
entradas
o
salidas
pinMode(alimentacionPin,
OUTPUT);
pinMode(estrellaPin,
OUTPUT);
pinMode(trianguloPin,
OUTPUT);
pinMode(pmarchaPin,
INPUT);
pinMode(pparoPin,
INPUT);
}
//
El
loop
se
repite
ciclicamente
void
loop()
{
//
comprobamos
el
estado
de
los
pulsadores
pmarchaSTATE
=
digitalRead(pmarchaPin);
pparoSTATE
=
digitalRead(pparoPin);
//
compruebo
si
se
ha
pulsado
pparo
if(pparoSTATE
==
HIGH){
digitalWrite(alimentacionPin,
LOW);
digitalWrite(estrellaPin,
LOW);
digitalWrite(trianguloPin,
LOW);
}
if(pmarchaSTATE
==
HIGH){
digitalWrite(alimentacionPin,
HIGH);
digitalWrite(estrellaPin,
HIGH);
digitalWrite(trianguloPin,
HIGH);
}
//
digitalWrite(lastSTATE,
LOW);
//
digitalWrite(secuenciaArranque,
LOW);
//}
//
compruebo
si
se
ha
pulsado
pmarcha
//if(pmarchaSTATE
==
HIGH
&&
pparoPin
==
LOW
&&
lastSTATE
==
LOW)
{
//
digitalWrite(lastSTATE,
HIGH);
//}
//
Secuencia
de
arranque
//if(lastSTATE
==
HIGH
&&
secuenciaArranque
==
LOW){
//
digitalWrite(secuenciaArranque,
HIGH);
//
digitalWrite(alimentacionPin,
HIGH);
//
digitalWrite(estrellaPin,
HIGH);
//
hacemos
esperar
al
programa
10s
//
delay(10000);
22
//
digitalWrite(estrellaPin,
LOW);
//
delay(20);
//
digitalWrite(trianguloPin,
HIGH);
//
}
}
Mdulo de rels
El manejo de un mdulo rel o es muy sencillo y nos permite controlar el encendido y apagado
de cualquier aparato que se conecte a una fuente de alimentacin elctrica externa. El rel
hace de interruptor y se activa y desactiva mediante una entrada de datos. Gracias a esto
podemos controlar el encendido de cualquier aparato.
23
24
if
(Estado_Pulsador_S
==
1)
{
digitalWrite(led,
1);
//
Encender
LED
}
if
(Estado_Pulsador_R
==
1)
{
digitalWrite(led,
0);
//
Pagado
LED
}
}
25
26
void
loop()
{
ping.fire();
//
Inicia
el
sensor
distancia
=
ping.centimeters();
//
Devuelve
la
distancia
en
cm
if(distancia
<
100)
{
//
Si
el
objeto
est
a
menos
de
100cm
pausa
=
distancia
*
10;
//
Calculamos
la
distancia
digitalWrite(zumbador,
HIGH);
//
Encendemos
el
zumbador
digitalWrite(led,
HIGH);
//
Encendemos
el
led
delay(pausa);
//
Esperamos
el
tiempo
de
pausa
}
digitalWrite(zumbador,
LOW);
//
Apagamos
el
zumbador
digitalWrite(led,
LOW);
//
Apagamos
el
led
delay(pausa);
//
Esperamos
el
tiempo
de
pausa
}
27
del
pulso
ultrasnico
y
cuando
el
sensor
recibe
el
rebote,
es
decir:
desde
que
el
pin
12
empieza
a
recibir
el
rebote,
HIGH,
hasta
que
deja
de
hacerlo,
LOW,
la
longitud
del
pulso
entrante*/
distancia
=
(((tiempo
/
1000000)
/
2)
*
343)
*
100;
//
Serial.println(distancia);
int
valorLED
=
map(distancia,
2.5,
60,
-1,
NUM_LEDS);
for
(int
led
=
0;
led
<
NUM_LEDS;
led++)
{
if
(led
<
valorLED)
{
digitalWrite(pinsLed[led],
LOW);
}
else
{
digitalWrite(pinsLed[led],
HIGH);
}
}
if
(valorLED
==
-1){
if
(encendidos)
{
for
(byte
n
=
0;
n
<
NUM_LEDS;
n++)
digitalWrite(pinsLed[n],
LOW);
encendidos
=
false;
}
else
{
for
(byte
n
=
0;
n
<
NUM_LEDS;
n++)
digitalWrite(pinsLed[n],
HIGH);
encendidos
=
true;
}
}
delay(80);
}
28