Practicas Arduino 3T
Practicas Arduino 3T
1
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
1. Intermitente
2. Alarma-1
3. Secuencia Básica de 3 LEDs
4. Lectura de un pulsador
5. Lectura de un sensor de inclinación
6. Potenciómetro: Lectura de señal Analógica
7. El coche fantástico
8. Estrella fugaz
9. Contador
10. Contador de 0 a 10
11. Entrada Analógica
12. Simulación de la luz de una vela
13. Construcción de un indicador de nivel (vumetro con diodos led)
14. Encendido y apagado de una luz de manera analógica
15. Control de la iluminación de una lámpara.
16. Sensor de Luz o LDR (Light Dependent Resistor):
17. Sensor de temperatura o NTC
18. Sensor de Fuerza.
19. Generador de notas musicales
20. Toca tonos desde el puerto serial
2
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Este trabajo está bajo licencia Creative Commons Attribution 3.0 Unported
License
3
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
1. Intermitente
Se trata de realizar un ejercicio básico que consiste en encender y a pagar un led que
conectamos en el PIN 13 de Arduino que lo configuramos como salida. El tiempo de
encendido y apagado es de 1 segundo.
Organigrama y Esquema
Obsérvese que se ha colocado el diodo led sin resistencia en serie dado que el PIN13
de Arduino ya lleva incorporada una resistencia interior, en el caso de colocar el diodo
LED en otra salida deberíamos colocar una resistencia de al entre 220 y 500 ohmios
dependiendo del consumo de corriente del diodo
4
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa
/*
* Intermitente
*
* Ejemplo básico con Arduino. Encendido y apagado de un led
* con una cadencia de 1 sg. usando el PIN 13 como salida
* no es necesario usar una resistencia para el led
* la salida 13 de Arduino la lleva incorporada.
*
* http://www.arduino.cc/en/Tutorial/Blink
*/
int ledPin = 13; // Definición de la salida en el PIN 13
void setup() //Configuración
{
pinMode(ledPin, OUTPUT); // designa la salida digital al PIN 13
}
5
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
2. Alarma-1
Cuando se pulsa el pulsador (entrada5 a “0”) se enciende y se apaga de
forma intermitente la salida 13
Intermitente
LED
Configuración E/S
SD PIN13 PIN 13 220 ohm
ED PIN 5
Boleana val=0
10K
+5V
Leer
val=PIN 5 PIN5
si
val=HIGH
no
Desactivar Salida
PIN13=LOW
Funcionamiento:
6
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa:
7
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa
8
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin1, LOW); // Apaga los LEDs
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW); }
9
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
4. Lectura de un pulsador
Descripción del ejercicio
Para generar una señal de tensión con el pulsador, se necesita un divisor de tensión.
Ejemplo:
Elementos necesarios:
Un resistencia de 1K Ohmios.
Un pulsador.
Un diodo LED
Cables para realizar las conexiones.
10
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Se utiliza una resistencia pull-dowm, junto con un pulsador, para conectarla a un pin de
entrada digital, y de esta forma, poder saber cuando el pulsador es presionado. Si el
pulsador está presionado, el valor del pin 10 será de 0 voltios (LOW) en caso contrario
será de + 5 voltios (HIGH).
En una placa protoboard debe haber una resistencia de 10K conectada entre el pin
de entrada y tierra como se ve el esquema y foto inferiores.
Lectura
Pulsador LED
PIN 13
Configuración E/S
SD PIN 13 LED
Botón 10K
ED PIN 10 Pulsador
value=0 (estado Pulsador) +5V
PIN10
Hacer que
value=Pulsador
Hacer que
LED=valor
Esquema
11
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Código fuente
/* Pulsador
* --------
*
* Detecta si el botón ha sido presionado o no
* y enciende el LED en consecuencia.
*
*
*
*/
int ledPin = 13; // PIN del LED
int inPin = 10; // PIN del pulsador
int value = 0; // Valor del pulsador
void setup() {
pinMode(ledPin, OUTPUT); // Inicializa el pin 13 como salida digital
pinMode(inPin, INPUT); // Inicializa el pin 10 como entrada digital
}
void loop() {
value = digitalRead(inPin); // Lee el valor de la entrada digital
digitalWrite(ledPin, value);
}
12
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Lectura
Sensor LED
PIN 13
Configuración E/S
SD PIN 13 LED
ED PIN 7 Sensor Posiciónr 10K
value=0 (estado Sensor)
+5V Sensor
10 K
Hacer que
value=Sensor PIN7
Hacer que
LED=valor
El código de ejemplo es el mismo que se empleó para el ejemplo del pulsador, pero
sustituyendo este último por el sensor de inclinación. Usamos una resistencia de pull-up
(de esta manera usamos la "activación a nivel bajo" para activar los pines) y
conectamos el sensor al pin de entrada digital que leeremos cuando lo necesitemos.
Elementos necesarios:
13
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Código fuente
/* Sensor de Inclinación
* -----------
* Detecta si el sensor ha sido inclinado o no y
* enciende la luz en consecuencia. Ten en cuenta que
* al utilizar la "activación a nivel bajo" (mediante
* una resistencia de pulls-up) la entrada se encuentra
* a nivel bajo cuando el sensor se activa.
*
*
*/
int ledPin = 13; // PIN del LED
int inPin = 7; // PIN del pulsador
int value = 0; // Valor del pulsador
void setup() {
pinMode(ledPin, OUTPUT); // Inicializa el pin 13 como salida digital
pinMode(inPin, INPUT); // Inicializa el pin 7 como entrada digital
}
void loop() {
value = digitalRead(inPin); // Lee el valor de la entrada digital
digitalWrite(ledPin, value);
14
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Un potenciómetro también puede ser usado como una resistencia variable (o reóstato)
de dos terminales, en ese caso, se cortocircuitan dos de las tres patas del potenciómetro.
Ejemplo:
15
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Listado de componentes:
1 Potenciómetro de 10kΩ
1 Diodo LED
Varios cables
Circuito:
16
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Código:
/* Potenciómetro
* ------------------
*
* enciende y apaga un LED conectado al pin digital #13;
* La cantidad de tiempo que el LED parpadeará depende del
* valor obtenido mediante analogRead(). En este caso al pin 2 *
*
*
*/
int potPin = 2; // seleccionar el pin de entrada analógico para el potenciómetro
int ledPin = 13; // seleccionar el pin de salida digital para el LED
int val = 0; // variable para almacenar el valor capturado desde el
sensor void setup() {
pinMode(ledPin, OUTPUT); // declara el ledPin en modo salida
}
void loop() {
val = analogRead(potPin); // lee el valor del sensor
digitalWrite(ledPin, HIGH); // enciende LED
delay(val); // detiene el programa por un tiempo “val”
digitalWrite(ledPin, LOW); // apaga el LED
delay(val); // detiene el programa por un tiempo “val”
}
17
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
7. El coche fantástico
Descripción del ejercicio
Hemos denominado este ejemplo como "El coche fantástico" en memoria de la serie de
TV de los años 80 en la que el famoso David Hasselhoff tenía una máquina de IA
conduciendo su Pontiac. El coche estaba equipado con gran cantidad de LED-s de todos
los tamaños posibles que realizaban efectos parpadeantes.
Este ejemplo hace uso de 6 LED-s conectados a los PIN 2 a 7 de la placa mediante
resistencias de 220 Ohmios. El primer código de ejemplo hace parpadear a los LED en
secuencia de uno en uno, utilizando sólo las funciones
digitalWrite(pinNum,HIGH/LOW) y delay(time). El segundo ejemplo muestra como
usar una secuencia de control for(;;;) para hacer lo mismo, pero en menos líneas de
código. El tercer y último ejemplo se centra en el efecto visual de apagar y encender los
LED-s de una forma más suave.
Elementos necesarios:
6 LED-s.
6 resistencias de 220 Ohmios.
Una placa protoboard.
Cables para realizar las conexiones
Esquema.
18
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Ejemplo 1
Coche Fantástico 1
Configurar E/S
SD PIN2 = pin2
SD PIN3 = pin3
SD PIN4 = pin4
SD PIN5 = pin5
SD PIN6 = pin6
SD PIN7 =pin7
timer=100
Activa pin2 Activa pin3 Activa pin4 Activa pin5 Activa pin6 Activa pin7
PIN2=HIGH
PIN3=HIGH PIN4=HIGH PIN5=HIGH PIN6=HIGH PIN7=HIGH
Delay (timer) Delay (timer) Delay (timer) Delay (timer) Delay (timer) Delay (timer)
Desactivar pin2 Desactivar pin3 Desactivar pin4 Desactivar pin5 Desactivar pin6 Desactivar pin7
PIN2=LOW
PIN3=LOW PIN4=LOW PIN5=LOW PIN6=LOW PIN7=LOW
Delay (timer) Delay (timer) Delay (timer) Delay (timer) Delay (timer) Delay (timer)
Código fuente
/* El coche fantástico 1
* ---------------------
*
* Básicamente una extensión del LED parpadeante.
*
*
int pin2 = 2;// PIN-es de los LED
19
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
void setup(){
void loop() {
digitalWrite(pin2, HIGH); // Enciende y apaga secuencialmente LED-
s delay(timer);
digitalWrite(pin2, LOW);
delay(timer);
digitalWrite(pin3, HIGH);
delay(timer);
digitalWrite(pin3, LOW);
delay(timer);
digitalWrite(pin4, HIGH);
delay(timer);
digitalWrite(pin4, LOW);
delay(timer);
digitalWrite(pin5, HIGH);
delay(timer);
digitalWrite(pin5, LOW);
delay(timer);
digitalWrite(pin6, HIGH);
delay(timer);
digitalWrite(pin6, LOW);
delay(timer);
digitalWrite(pin7, HIGH);
delay(timer);
digitalWrite(pin7, LOW);
delay(timer);
digitalWrite(pin6, HIGH);
20
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
delay(timer);
digitalWrite(pin6, LOW);
delay(timer);
digitalWrite(pin5, HIGH);
delay(timer);
digitalWrite(pin5, LOW);
delay(timer);
digitalWrite(pin4, HIGH);
delay(timer);
digitalWrite(pin4, LOW);
delay(timer);
digitalWrite(pin3, HIGH);
delay(timer);
digitalWrite(pin3, LOW);
delay(timer);
}
Ejemplo 2
Coche Fantástico 2
Configurar E/S
Utilizando Sentencia for..
Array pinArray {2,3,4,5,6,7}
Configura el pinArray como
SALIDAS
count=0 puntero contador count++ Incementa contador +1
timer=100 count-- decrementa contador -1
for count=0 , count < 6, count++ for count=5 , count < 0, count--
21
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
En este caso las luces se encenderán y apagaran todas en un sentido y luego , acabada
la secuencia en sentido contrario.
/* El coche fantástico 2
* ---------------------
*
* Reduciendo las líneas de código usando un for(;;).
*
*
int pinArray[] = {2, 3, 4, 5, 6, 7}; // Define el array de pines
int count = 0; // Contador
int timer = 100; // Temporizador
void setup(){
for (count=0;count<6;count++){ // Configuramos todos los PIN-
es pinMode(pinArray[count], OUTPUT);
}
}
void loop() { // Enciende y apaga secuencialmente los LED-s
for (count=0;count<6;count++) { // utilizando la secuencia de control for(;;)
digitalWrite(pinArray[count], HIGH); // Recorrido de ida delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer);
}
for (count=5;count>=0;count--) {
digitalWrite(pinArray[count], HIGH); // Recorrido de vuelta
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer);
}
}
22
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Ejemplo 3
En este caso el efecto que se crea es una estela visual muy vistosa.
Coche Fantástico 2
Configurar E/S
Utilizando Sentencia for..
Array pinArray {2,3,4,5,6,7}
Configura el pinArray como
SALIDAS
count=0 puntero contador count++ Incementa contador +1
timer=100 count-- decrementa contador -1
for count=0 , count < 6, count++ for count=5 , count < 0, count--
/* El coche fantástico 3
* ---------------------
*
* Este ejemplo se centra en el efecto visual.
*
23
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
*
int pinArray[] = {2, 3, 4, 5, 6, 7}; // PIN-es
int count = 0; // Contador
int timer = 30; // Temporizador
void setup(){
void loop() {
for (count=0;count<5;count++) { // Enciende los LED creando una estela visual
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count + 1], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer*2);
}
for (count=5;count>0;count--) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count - 1], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer*2);
}
24
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
8. Estrella fugaz
Descripción del ejercicio
Este ejercicio muestra como realizar un rayo de luz, o más poéticamente, una estrella
fugaz, moviéndose a través de una línea de LED-s. Podremos configurar tanto la
velocidad de de la estrella, así como la longitud de la cola. No es muy elegante porque
la cola brilla con la misma intensidad que la estrella, y al final, parecerá como si un
rayo sólido cruzase la línea de LED-s.
Elementos necesarios:
11 LED-s.
11 resistencias de 220 Ohmios.
Una placa protoboard.
Cables para realizar las conexiones.
Esquema
¿Cómo funciona?
Hay que conectar 11 LED-s a los pines digitales de la placa a través de resistencias de
220 Ohmios tal y como se muestra en la imagen superior.
25
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Código fuente
/* Estrella fugaz
*--------------
* Este programa es una variante del ejemplo del coche fantástico. Muestra mediante
* un loop una estrella fugaz que es dibujada en una línea de LED-s
* directamente conectados a la placa Arduino. Puedes controlar la velocidad a la que
* la estrella se mueve gracias a una variable llamada "waitNextLed". También
* puedes controlar la longitud de la cola de la estrella a través de la variable "tail
* length"
*/
// Variable declaración
// Declaración de los PIN-es mediante un array
int pinArray [] = { 2,3,4,5,6,7,8,9,10,11,12 };
int controlLed = 13; // LED de control
int waitNextLed = 100; // Tiempo antes de encender el siguiente LED
// Número de LED-s que permanecen encendidos antes de empezar a apagarlos para
//formar la cola
int tailLength = 4;
// Número de LED-s conectados (que es también el tamaño del array)
int lineSize = 11;
26
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
void loop()
{
int i;
// Se establece la longitud de la cola en un contador
int tailCounter = tailLength;
// Se enciende el LED de control para indicar el inicio del
loop digitalWrite(controlLed, HIGH);
for (i=0; i<lineSize; i++)
{
digitalWrite(pinArray[i],HIGH); // Se encienden consecutivamente los LED
// Esta variable de tiempo controla la velocidad a la que se mueve la
estrella delay(waitNextLed);
if (tailCounter == 0)
{
// Se apagan los LED-s en función de la longitud de la cola.
digitalWrite(pinArray[i-tailLength],LOW);
}
else
if (tailCounter > 0)
tailCounter--;
}
for (i=(lineSize-tailLength); i<lineSize; i++)
{
digitalWrite(pinArray[i],LOW); // Se apagan los LED
// Esta variable de tiempo controla la velocidad a la que se mueve la
estrella delay(waitNextLed);
}
}
27
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
9. Contador
Se trata de contar las veces que se pulsa un botón conectado en la entrada 7 de Arduino
a la vez que cada vez que contamos encendemos el led conectado en la salida 13. El
valor de la variable que almacena el número de impulsos generados se envía al PC para
que se visualice en la pantalla.
LED
CONTADOR
Hacer que
valor=Boton
no
Hacer que
valor=1
LED=valor
si
Haz que
si
valor <> contador=contador+1
estadoanteriorboton
Imprime
contador
no
Haz que
estadoanteriorboton=valor
28
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Esquema
/* Programa Contador
* -----------
*
* Detecta si el botón conectado a la entrada 7 ha sido presionado y enciende el LED
* Envía al PC el valor de la variable de cuenta ""Contador" vía puerto serie.
*
*
*
*/
void setup()
{
beginSerial(9600); // Configura velocidad de transmisión a 9600
29
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
void loop()
{
valor = digitalRead(Boton); // lee el valor de la entrada digital pin 7
digitalWrite(LED, valor);
if(valor != estadoanteriorboton){
if(valor == 1){
contador++;
printInteger(contador);
serialWrite(10);
serialWrite(13);
}
}
estadoanteriorboton = valor;
}
30
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
El programa en este caso seria muy parecido al anterior. Observese que ahora al pulsar
el boton introducimos un “=” en el PIN7 por lo tanto si quiero que se encienda la salida
PIN13 debo escribir en ella el valor leido del pulsador negado es decir “!valor”
*/
void setup()
{
beginSerial(9600); // Configura velocidad de transmisión a 9600
pinMode(LED, OUTPUT); // inicializa como salida digital el pin 13
pinMode(Boton, INPUT); // inicializa como entrada digital el 7
digitalWrite(Boton,HIGH); // Habilitamos la resitencia interna Pull-up del PIN7
}
void loop()
{
valor = digitalRead(Boton); // lee el valor de la entrada digital pin 7
digitalWrite(LED, !valor); // Escribimos en la salida el bvlaor leido negado
if(valor != estadoanteriorboton){
if(valor == 1){
contador++;
printInteger(contador);
serialWrite(10);
serialWrite(13);
}
}
estadoanteriorboton = valor;
}
31
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Contador de 0 a 10
Se trata de realizar una variación sobre el ejemplo anterior de tal manera que cuando el
valor del contador llegue a 10 se ponga a cero y comience de nuevo.
LED
CONTADOR DE 0 A 10
Hacer que
valor=Boton
no
Hacer que
valor=1
LED=valor
si
Haz que
si
valor <> contador=contador+1
estadoanteriorboton
Imprime
contador
no
si
contador=10
Haz que
no
contador=0
Haz que
estadoanteriorboton=valor
32
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Esquema
/* Programa Contador de 0 a 10
* -----------
* Detecta si el botón conectado a la entrada 7 ha sido presionado y enciende el LED
* Envía al PC el valor de la variable de cuenta ""Contador" vía puerto serie.
*
*/
void setup()
{
beginSerial(9600); // Configura velocidad de transmisión a 9600
33
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
void loop()
{
valor = digitalRead(Boton); // lee el valor de la entrad digital pin 7
digitalWrite(LED, valor);
if(valor != estadoanteriorboton){
if(valor == 1){
contador++;
printInteger(contador);
serialWrite(10);
serialWrite(13);
if (contador==10) { // Limita la cuenta al valor 10
contador=0;
}
}
}
estadoanteriorboton = valor;
}
34
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Organigrama Esquema
Programa
/* Entrada Analógica */
void setup() {
beginSerial(9600);
}
void loop() {
35
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Esquema
Programa
/*
* Simula luz de vela
* Saca por una de las salidas del puerto PWM un valor aleatorio que activa un LED
*
* 2007 Tod E. Kurt <[email protected]>
* http://todbot.com/
36
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
*
*/
void setup() {
randomSeed(0); // inicializa el generador de números aleatorios
pinMode(ledPin, OUTPUT); // declara el pin de SALIDA pin 9
}
void loop() {
val = random(100,255); // genera un número aleatorio entre 100 y 255 que asigna
a la variable val
analogWrite(ledPin, val); // envía ese valor a la salida pin 9
37
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Se trata de construir u indicador de nivel que sea capaz de medir el valor de una señal
de entrada generada por un potenciómetro desde una entrada analógica.
Se establecerán 3 diodos Led conectados a las salidas PIN6, PIN7 y PIN8. La entrada
la conectaremos en la entrada analógica PIN 1 (analog IN1)
38
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
39
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Esquema
40
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa
// Salida Analógica Cíclica
// <http://people.interaction.it/h.barragan>
void setup()
{
// nothing for setup
}
void loop()
{
for(value = 0 ; value <= 255; value+=5) // Variación de la variable se salida
ente el MIN yMAX
{
analogWrite(ledpin, value); // Enviar valor a la salida (entre 0 y 255)
delay(30); // Esperar 30 ms para ver el efecto de variación
}
for(value = 255; value >=0; value-=5) // Variación de la variable de salida
entre MAX y MIN
{
analogWrite(ledpin, value);
delay(30);
}
}
41
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Funcionamiento:
Esquema
Programa
42
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
int fadeval = 0;
void setup() {
pinMode(ledPin, OUTPUT); // designación de salida Analógica //
pinMode(inputPin, INPUT); designación de pulsador de entrada
}
void loop(){
val = digitalRead(inputPin); // leer valor de entrada
if (val == HIGH) { // Botón pulsado
digitalWrite(ledPin, LOW); // puesta a "0" de la salida
delay(50);
}
}
43
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Un sensor de luz se compone de una LDR como parte de un divisor de tensión resistivo.
Ejemplo:
Vout=((Rbotton/(Rbottom+Rtop))*Vin
Si la LDR es usada como Rtop, como en el primer circuito, da tensión alta (HIGH) en
la salida cuando la LDR está en la luz, y una tensión baja (LOW) en la salida cuando
la LDR está en la sombra.
La acción del divisor de tensión es inversa cuando la LDR es usada como R bottom en
lugar de Rtop, como en el segundo circuito. El circuito da tensión Baja (LOW) en la
salida cuando la LDR está en la luz, y una tensión alta (HIGH) en la salida cuando la
LDR está en la sombra. El circuito divisor de tensión dará una tensión de la salida que
cambia con la iluminación, de forma inversamente proporcional a la cantidad de luz
que reciba (sensor de oscuridad).
44
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Listado de componentes:
1 LDR
1 Resistencia de 5kΩ
Un par de cables
1 Diodo LED
Código:
45
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
46
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Un NTC o termistor NTC es una resistencia variable, que varia su valor dependiendo de
la temperatura ambiente. Cuanta mas temperatura menor será su resistencia y cuanto
menos temperatura mayor será la resistencia. Suelen ser utilizados en alarmas.
Ejemplo
Como alarma de incendio o sensor de calor, utilizaremos un circuito que entregue una
tensión alta cuando se detecten las condiciones de temperatura caliente. Necesitamos
poner un divisor de tensión con un termistor NTC en la posición que ocupa Rarriba:
Como alarma de frío o sensor de frío, usaremos un circuito que dé una tensión alta en
condiciones frías. Necesitamos un divisor de voltaje con el termistor NTC en lugar de
Rbajo:
Listado de componentes:
47
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Código:
int led=13;
int ntc=3;
int medida=0;
48
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
}
else{ // si la señal está por debajo del nivel marcado
digitalWrite(led,LOW);
}
}
49
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Esquema
Programa
/* Sensor piezoelectrico
* -----------
* Convertir un zumbador piezoelectrico en un sensor de de fuerza
*
* Created 24 October 2006
* copyleft 2006 Tod E. Kurt <[email protected]
* http://todbot.com/
*/
int ledPin = 13;
50
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
int piezoPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(19200);
Serial.println("ready"); // indicador de espera
}
void loop() {
digitalWrite(ledPin,LOW); // indicador de reposo (esperando)
51
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Se debe crear un array (vector) de datos compuesto por los valores correspondientes
a las 8 notas que se pretende sacar:
int notas[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956};
Se deben definir también el tiempo de pausa entre nota y nota y el tiempo de pausa
de fin de secuencia de notas:
int tnota=100;
int pausa=100;
Las iteraciones para el recorrido de las 8 notas se realizan con una instrucción de
tipo for:
for(n=0;n<8;n++)
for(m=0;m<=tnota;m++){
Esquema/Organigrama
52
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa
int piezo=10;
int notas[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956}; //cadena con los
tiempos que corresponden a las distintas notas
int n=0;
int m= 0;
int tnota=100; //nº de repeticiones del pulso. Nos da la duración de la nota int
pausa=100;
void setup() {
pinMode(piezo,OUTPUT);
}
void loop(){
for(n=0;n<8;n++){ //iteración que recorre la lista con las duraciones de los pulsos
de cada nota
for(m=0;m<=tnota;m++){
digitalWrite(piezo,HIGH);
delayMicroseconds(notas[n]); //Tiempo en microsegundos que está a 5V la
salida del piezoeléctrico
digitalWrite(piezo,LOW);
delayMicroseconds(notas[n]); //Tiempo en microsegundos que está a 0V la
salida del piezoeléctrico
}
delay(pausa); //tiempo en silencio entre escalas
}
}
53
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Un piezo eléctrico no es más que un dispositivo que puede ser usado tanto para
reproducir o detectar tonos. En nuestro ejemplo estamos conectando el piezo en el pin
número 9, que permite enviar una señal PWN .
Los tonos pueden ser generados a partir de cualquier programa capaz de enviar valores
ASCII a través del puerto serial. Programas de Terminal, Processing, Pure Data o
Director, pueden ser usados para generar los tonos. En nuestro caso los caracteres
ASCII los enviaremos por la ventana de dialogo del IDE Arduino.
54
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Aspecto del IDE Arduino enviando caracteres ASCII a la tarjeta para que estos
se conviertan en tonos
Código:
/* Teclado Serial
* ----------------
*
* Programa para reproducir tonos dependiendo de los datos que vengan del Puerto
* serie. El cálculo de los tonos se realiza de acuerdo a la siguiente operación:
*
* pulsoAlto = 1/(2 * frecuenciaTono) = periodo / 2
*
* Donde los tonos son descritos como en la siguiente tabla:
*
* tecla frecuencia periodo PW (pulsoAlto)
*c 261 Hz 3830 1915
*d 294 Hz 3400 1700
*e 329 Hz 3038 1519
55
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(speakerOut, OUTPUT);
beginSerial(9600);
}
void loop() {
digitalWrite(speakerOut, LOW);
serByte = serialRead();
if (serByte != -1) {
val = serByte;
printByte(val);
statePin = !statePin;
digitalWrite(ledPin, statePin);
}
for (count=0;count<=8;count++) {
if (names[count] == val) {
digitalWrite(speakerOut, HIGH);
delayMicroseconds(tones[count]);
digitalWrite(speakerOut, LOW);
delayMicroseconds(tones[count]);
}
else
digitalWrite(speakerOut, LOW);
}
}
56
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
int notas[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956};
tono0=1915 tono6=1014
Esquema/organigrama
57
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa
//Timbre de llamada
int notas[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956}; //definición de matriz
de 8 notas
int puls=5; // designación del pulsador de llamada
int zumb=10; // designación de la salida hacia el zumbador
int tnota=150;
int n=0;
int m=0;
void setup (){
for(n=0;n<4;n++){
pinMode(zumb,OUTPUT);
pinMode(puls,INPUT);
}
}
void nota(){ // rutina que genera los tonos de llamada
for(m=0;m<=tnota;m++){
digitalWrite(zumb,HIGH);
delayMicroseconds(notas[n]);
digitalWrite(zumb,LOW);
delayMicroseconds(notas[n]);
}
}
void loop(){
if(digitalRead(puls)==HIGH){
n=0; //elegimos la primera nota del timbre nota(); //que
aquí es la primera de la cadena delay(200);
58
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
59
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Montaje en la tarjeta
60
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Aspecto del terminal del IDE Arduino una vez generados los 3 impulsos por el
terminal PIN13
Solución:
/*
* Impulsos programados
* -----------------
* Cambia de estado ON Off un lED conectado en el una salida digital
* pin 13. El se encenderá y apagará tantas veces como se indique mediante un digito
* ASCII leído desde el puerto serie.
*
* Created 18 October 2006
* copyleft 2006 Tod
* based on "serial_read_advanced" example
*/
void setup() {
pinMode(ledPin,OUTPUT); // declara el PIN del LED como salida
Serial.begin(19200); // conecta con el puerto serie a la velocidad de 19200
Serial.println("Bienvenido al Generador de Impulsos Programados");
}
void loop () {
val = Serial.read(); // lee el numero del puerto (una sola cifra)
61
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
62
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Téngase en cuenta que el motor debe ser de bajo consumo por dos motivos: primero
porque si alimentamos en las pruebas desde el conector USB no debemos sacar
demasiada corriente del ordenador y segundo porque el transistor es de una
corriente limitada.
El diodo 1N4001 se coloca como protección para evitar que las corrientes
inversas creadas en el bobinado del motor puedan dañar el transistor.
63
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa:
int valor = 0; // variable que contiene el valor a sacar por el terminal analógico
int motor = 10; // motor conectado al PIN 10 void setup() { } // No es necesario
void loop() {
for(valor = 0 ; valor <= 255; valor +=5) {
64
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa:
int valor = 0; // variable que contiene el valor a sacar por el terminal analógico
int motor = 10; // motor conectado al PIN 10
int potenciometro=0; // Se define la entrada analógica
void loop() {
valor = analogRead(potenciometro); // se lee el valor de la entrada
analógica y se asigna a val
analogWrite(motor, valor); // Se manda a la salida analógica 0 el valor
leído delay(30); // espera 30 ms para que el efecto sea visible
}
Esquema
65
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Como ventana en este montaje podremos mover el motor en los dos sentido de giro
cosa que con el anterior montaje no podíamos.
El funcionamiento será como el primer montaje del motor anterior es decir vamos a
crear una rampa de subida de tensión y una de bajada con el fin de que el motor
modifique su velocidad de modo automático.
Aquí hay algunos gráficos donde se muestra la relación entre la señal de pulsos (PWM)
y el voltaje efectivo:
Cuando el tiempo que el pulso está activo es la mitad del periodo de la señal o el
parámetro duty cycle está al 50%, el voltaje efectivo es la mitad del voltaje total de
entrada.
66
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Cuando el duty cycle es reducido al 25%, el voltaje efectivo es un cuarto del voltaje
total de entrada. Entonces la velocidad del motor disminuye.
De esta forma controlando el duty cycle o el tiempo que el pulso está activo
(frecuencia), podemos controlar la velocidad del motor de continua.
Una forma de realizar dicho control en Arduino, es utilizando la salida analógica PWM.
Hay que recordar que la señal de salida PWM (pines 9,10) es una señal de frecuencia
constante (30769 Hz) y que sólo nos permite cambiar el "duty cycle" o el tiempo que el
pulso está activo (on) o inactivo (off), utilizando la función analogWrite().
Es un circuito integrado o chip, que puede ser utilizado para controlar simultáneamente
la velocidad y dirección de dos motores de continua (contiene dos puentes H). La
diferencia entre el modelo L393D y L293B, es que el primero viene con diodos de
protección que evita los daños producidos por los picos de voltaje que puede producir
el motor.
Contiene 4 pines digitales (2,7,10, 15) para controlar la dirección de los motores.
67
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Los pines "enable" (1,9) admiten como entrada una señal PWM, y se utiliza para
controlar la velocidad de los motores con la técnica de modulación de ancho de pulso.
Los motores van conectados entre uno de los pines 3, 6, 11, o 14.
68
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Programa
void loop() {
analogWrite(motorRetroceso, 0); // Motor hacia delante ... sube la velocidad
for(valor = 0 ; valor <= 255; valor+=5) {
analogWrite(motorAvance, valor);
delay(30);
}
for(valor = 255; valor >=0; valor-=5) { // Motor hacia delante ... baja la
velocidad
analogWrite(motorAvance, valor);
delay(30);
}
analogWrite(motorAvance, 0); // Motor hacia detrás ... sube la velocidad
for(valor = 0 ; valor <= 255; valor+=5) {
analogWrite(motorRetroceso, valor);
delay(30);
}
for(valor = 255; valor >=0; valor-=5) { // Motor hacia detrás ... baja la velocidad
analogWrite(motorRetroceso, valor);
delay(30);
}
}
69
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
70
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
void loop() {
if (directionB) {
digitalWrite(dirpinB,HIGH);
} else {
digitalWrite(dirpinB,LOW);
}
directionB = !directionB;
// varia velocidad de mínimo a máximo
for(value = 0 ; value <= 255; value+=5) {
// envía al pin del salida del motor A el valor de velocidad de 0 a
255 analogWrite(pwmpinA, value);
// envía al pin del salida del motor B el valor de velocidad de 0 a 255
analogWrite(pwmpinB, value);
delay(30); // espera 30 ms
}
// varia velocidad de máximo a mínimo
for(value = 255; value >=0; value-=5) {
analogWrite(pwmpinA, value);
analogWrite(pwmpinB, value);
delay(30);
}
}
71
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
¿Qué es un relé?
De aquí extraemos una información muy importante: Podemos separar dos circuitos
de forma que funcionen con voltajes diferentes. Uno a 5V (Arduino) y otro a 220V (la
bombilla).
72
INSTITUTO PADRE ELIZALDE
LIC. PROF. ANDRÉS VALZURA
Código fuente
/*
Enciende y apaga una bombilla de 220V, cada 2 segundos,
mediante un relé conectado al PIN 8 de Arduino */
73