Professional Documents
Culture Documents
1
Índice
Introducción 3
Pulsador «debounce» 3
Solución por hardware 4
Ampliación instrucciones de gestión de tiempo 18
Pull-Up debounce 21
Pull-Down debounce 29
Solución por software (programación) 33
Memorias 34
Memoria EEPROM 34
Tarjetas SD 46
Ampliación entradas analógicas 77
Pin AREF 77
Pin IOREF 79
Señales PPM 79
2
Introducción
Este libro es la continuación de los tomos 1 y 2 de Arduino.
Entendiendo el Mundo, nivel básico. En estos volúmenes se trataron
los aspectos fundamentales de la programación, del hardware y del
IDE de Arduino, junto con la electrónica necesaria.
Pulsador «debounce»
Un problema que no resolvimos en los libros anteriores era el
«rebote» de una señal al pulsar un botón. Como vimos, se describía
una gráfica como la siguiente:
Ilustración 1
3
Solución por hardware
Ilustración 3.
Vpila = I × R1 + I × R2
4
Como la intensidad que circula por ambas resistencias es la misma
podemos sacar la intensidad como factor común:
VR2 = I × R2
Ilustración 4.
5
conseguiremos con un divisor de tensión. A continuación, dividimos la
tensión de la pila por la mitad con el divisor de tensión.
Ilustración 5.
6
0.5 × R1 = (R2) - 0.5 × R2
0.5 × R1 = 0.5 × R2
R1 = R2
Ilustración 6.
7
Ilustración 7.
8
Ilustración 8.
Ilustración 9.
9
Condensador
Ilustración 10.
1 culombio = 1 amperio*segundo
Ilustración 11.
10
Ilustración 12.
Ilustración 13.
11
El hecho de que la carga del condensador sea en forma de curva nos
va a permitir filtrar señales. Antes de tratar este tema, vamos a
analizar los tiempos de carga y descarga de un condensador.
O lo que es lo mismo:
C=Q/V
C = Q / V à Q = V*C
12
Ilustración 14.
Ilustración 15.
Ilustración 16.
13
En la imagen anterior, apreciamos que, al pulsar el botón, empieza a
circular corriente para cargar el condensador y para que la resistencia
alcance el potencial de la pila.
Ilustración 17.
Una vez que el condensador está cargado (al mismo voltaje que la
pila), ya solo circula intensidad de la pila a la resistencia.
Ilustración 18.
𝜏 = 𝐶 ∗ 𝑅𝑙
En la cual 𝜏 es el tiempo de descarga (en segundos), C es la
capacidad del condensador (en faradios) y Rl es el valor de la
resistencia de descarga (en ohmios). Por ejemplo, si el condensador
es de 100 faradios y la resistencia de 100 ohmios, el tiempo de
descarga es de 𝜏 = 100 ∗ 100 = 10000 𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠.
14
No obstante, este tiempo no es el tiempo total, sino el tiempo que
tarda el condensador en descargarse un 63,2 %; por ejemplo, un
condensador de 100 faradios, cargado a 5 voltios, conectado a una
resistencia de descarga de 100 ohmios.
𝜏 = 𝐶 × 𝑅𝑙
La fórmula anterior nos define el tiempo que tarda el condensador en
descargarse un 63,2 %, lo que, en este caso, significaría alcanzar
1,94 voltios.
Ilustración 19.
!!
𝑉! = 𝑉! ! ∗!
×𝑒 !
!
15
Con la fórmula anterior, podemos saber cuánto tiempo tarda el
condensador en alcanzar una determinada tensión. Sin embargo, lo
que nos interesa es el tiempo que tarda en descargarse.
Ilustración 20.
Ilustración 21.
16
No obstante, antes de empezar, vamos a verificar todo esto con
nuestro Arduino. Primeramente, vamos a comprobar si el proceso de
carga es así.
Ilustración 22.
𝜏 = 𝐶 × 𝑅𝑙
17
Ampliación instrucciones de gestión de tiempo
millis();
Ilustración 23.
Ilustración 24.
18
micros();
Ilustración 25.
Ilustración 26.
19
Ilustración 27.
20
Ilustración 28.
Pull-Up debounce
Ilustración 29.
21
Ilustración 30. Botón no pulsado
Ilustración 31.
22
Tal y como observamos en la imagen anterior, en el momento en el
que el condensador alcance 5 V, la diferencia de tensión de la
resistencia es de 0 V. Al ser 0 V, la intensidad que circula por la
resistencia es de 0 A; por lo tanto, el condensador dejaría de
cargarse.
Ilustración 33.
23
En el momento en el que se pulse el botón, el condensador se
empieza a descargar por la resistencia de descarga.
Ilustración 34.
Ilustración 35.
24
Por último, debemos tener en cuenta que, por el modo en el que
quedan conectadas las resistencias, tenemos un divisor de tensión,
que hará que el condensador no se descargue del todo.
Ilustración 36.
Ilustración 37.
25
En consecuencia, el condensador se descargará hasta que alcance un
valor de 1,24 V .
Ilustración 38.
26
Ilustración 40.
Ilustración 41.
Ilustración 42.
27
Ilustración 43.
Ilustración 44.
28
Ilustración 45.
Pull-Down debounce
29
Ilustración 47. Pull-Down debounce no pulsado
30
Ilustración 49. Proceso de carga
Ilustración 51.
31
Ilustración 52.
Ilustración 53.
Ilustración 54.
Con este último caso, acabamos de ver cómo eliminar por hardware
los rebotes de una señal. Tanto las resistencias como el condensador
se escogen en función de la atenuación de la señal que busquemos.
32
Solución por software (programación)
Ilustración 55.
33
Memorias
En el nivel inicial, explicamos tres memorias existentes en el MCU del
Arduino UNO. Para recordar, disponemos de las siguientes memorias:
Memoria EEPROM
34
Ilustración 57. Incluir librería EEPROM
Ilustración 58.
EEPROM.read(parámetro);
35
Ilustración 59. Lectura de datos de una memoria EEPROM
Ilustración 60.
EEPROM.write(parámetro1,parámetro2);
36
Ilustración 61. «Limpiar» memoria EEPROM
Ilustración 62.
37
Vamos a tratar de almacenar en cada posición el valor de esta con
respecto al total; es decir, en la posición 50, almacenaremos el valor
50 o, en la posición 1023, el valor 1023.
Ilustración 63.
.
.
.
.
38
.
.
.
.
.
.
.
.
.
.
.
.
Ilustración 64.
39
EEPROM.put(parámetro1,parámetro2);
Ilustración 65.
.
.
.
40
.
.
.
.
.
.
.
.
.
.
.
.
Ilustración 66.
41
EEPROM.get(parámetro1,parámetro2);
Ilustración 67.
Ilustración 68.
42
Ilustración 69.
Ilustración 70.
43
Por consiguiente, debemos considerar las posiciones que puede
ocupar una variable.
Ilustración 71.
Ilustración 72.
Ilustración 73.
44
Ilustración 74.
Ilustración 75.
45
Tarjetas SD
Al lado de los pines del módulo, aparece una referencia para cada
pin. Al igual que sucede con los pines de nuestro Arduino, los
nombres de estos pines tienen que ver con el protocolo de
comunicaciones (SPI).
46
Ilustración 77. Arduino módulo SD
47
En principio, debemos respetar la tabla de conexiones anterior,
aunque veremos que, según el programa, podemos realizar
modificaciones.
Una vez establecido el esquema anterior, debemos conectar nuestra
tarjeta SD, pero es necesario asegurarse de que el sistema de
ficheros de la tarjeta sea el adecuado (FAT16, FAT32). Para ello y,
con ayuda de nuestro PC, vamos a formatearlas.
Ilustración 78.
Ilustración 79.
48
Ilustración 80.
Ilustración 81.
Ilustración 82.
49
Ilustración 83.
SD.begin(parámetro);
50
Ilustración 84. Programa detección tarjeta
Ilustración 85.
Ilustración 86.
51
Ilustración 87.
Ilustración 88.
Ilustración 89.
52
Ilustración 90.
Ilustración 91.
Ilustración 92.
53
La estructura de esta función se realizará en una ventana que
llamaremos «Funciones_sd», en la que, a partir de ahora, iremos
definiendo todas las funciones que creemos.
Ilustración 93.
Ilustración 94.
Ilustración 95.
Ilustración 96.
SD.mkdir(parámetro);
54
Para crear carpetas debemos seguir las siguientes reglas:
Ilustración 97.
Ilustración 98.
55
Ilustración 99.
Ilustración 100.
56
Ilustración 101.
Podemos crear una ruta con carpetas; es decir, crear carpetas dentro
de otras.
Ilustración 102.
Ilustración 103.
57
SD.exists(parámetro);
Ilustración 104.
Ilustración 105.
Ilustración 106.
58
Ilustración 107.
Ilustración 108.
Con las funciones que hemos visto hasta ahora, podemos crear y
buscar carpetas. Por último, quizás necesitemos borrar carpetas.
SD.rmdir(parámetro);
Ilustración 109.
59
Ilustración 110.
Ilustración 111.
60
La carpeta que indicamos por variable existe, por lo tanto, esto es lo
primero que nos va a indicar y, a continuación, la borramos y nos
muestra el mensaje correspondiente.
Ilustración 112.
Ilustración 113.
Ejercicios propuestos:
61
1. Programa que permita crear carpetas con nombres que
se envíen por el puerto serie desde el monitor serie e
indique si se han creado.
62
2. Programa que permita buscar carpetas con nombres
que se envíen por el puerto serie desde el monitor serie e
indique si existen.
63
3. Programa que permita borrar carpetas con nombres que
se envíen por el puerto serie desde el monitor serie e
indique si ha sido posible borrarlas.
64
Con las funciones anteriormente vistas, podemos realizar cualquier
tipo de operación con carpetas. Sin embargo, lo que realmente nos
interesa, a la hora de trabajar con una tarjeta SD, es crear archivos.
SD.open(parámetro1, parámetro2);
Ilustración 114.
65
Ilustración 115.
Ilustración 116.
Ilustración 117.
66
Ilustración 118.
Ilustración 119.
Ilustración 120.
67
Ilustración 121.
Ilustración 122.
SD.remove(parámetro);
68
Ilustración 123.
Ilustración 124.
Ilustración 125.
69
Con carpetas para poder agrupar archivos y sabiendo crear archivos,
nos encontramos en disposición de almacenar datos en esos archivos.
Nombre_Instancia.print();
Nombre_Instancia.println();
Nombre_Instancia.close();
70
Ilustración 126.
Ilustración 127.
Ilustración 128.
Nombre_Instancia.available();
71
Nombre_Instancia.read();
Ilustración 129.
72
Ilustración 130.
Ejercicios propuestos:
73
4. Programa que permita crear un fichero con cada
encendido, para luego escribir en él un chat entre dos
Arduinos.
74
75
5. Otro programa para recuperar el archivo anterior y
mostrar los mensajes enviados entre dos Arduinos.
76
Ampliación entradas analógicas
Pin AREF
analogReference(parámetro);
77
Ilustración 131.
Ilustración 132.
analogReadResolution(parámetro);
78
analogWriteResolution(parámetro);
Pin IOREF
Este pin se utiliza para indicar a placas supletorias a qué tensión
opera nuestra placa.
Señales PPM
Este tipo de señales se basan en las señales PWM, que permitían
regular los tiempos de activación de las señales. Las señales PWM
permitían «codificar» el valor de una señal analógica a una señal
digital.
Ilustración 133.
79
Ilustración 134.
Ilustración 135.
80
Antes de continuar con las señales PWM, vamos a trabajar con
joysticks.
Ilustración 136.
• 5v: alimentación
• GND: alimentación.
81
Ilustración 137.
Ilustración 138.
82
Ilustración 139.
Ilustración 140.
83
Ilustración 141.
84
• Desplazamiento en diagonal hacia arriba y derecha: se
encenderán, proporcionalmente, los leds amarillo y blanco.
Ilustración 142.
85
De las señales PPM, debemos entender un par de conceptos; el
primero de ellos se refiere a los canales.
Ilustración 143.
Ilustración 144.
86
Sean los canales dos, tres, cuatro, etc., el problema radica en que el
receptor, de la forma en la que enviamos la señal, no sabe distinguir
cuál es cuál. Por lo tanto, vamos a utilizar una señal de
sincronización:
Ilustración 145.
87
Ilustración 146.
Ilustración 147.
88
Por último, es necesario establecer unos tiempos de separación entre
cada una de las señales que intervienen en la PPM; en nuestro caso,
pondremos un tiempo de 300 𝜇segundos.
Ilustración 148.
Ilustración 149.
Tanto el emisor como el receptor deben seguir todas las reglas que
hemos establecido; el emisor es el encargado de tomar la lectura de
las señales generadas por el joystick y encriptar esa información en
una señal PPM.
89
Esa señal PPM será recibida y procesada por el receptor. El procesar
la señal, en este caso, consiste en saber distinguir los canales y la
información que aporta cada uno de ellos, para luego actuar,
proporcionalmente, sobre los leds.
Ilustración 150.
Ilustración 151.
90
Ilustración 152.
Ilustración 153.
91
Ilustración 154.
Ilustración 155.
92
Ilustración 156.
pulseIn(parámetro1,parámetro2,parámetro3);
93
• Parámetro2: el estado de la señal que interesa cuantificar; en
nuestro caso, el tiempo que permanece la señal a nivel alto
(HIGH).
Por ejemplo:
pulseIn(13,HIGH,8000);
94
Ilustración 157.
Ilustración 158.
95
Ilustración 159.
96
Ilustración 160.
Lo primero que vamos hacer es crear unos márgenes entre los cuales
no vamos a encender los leds, puesto que el punto medio del joystick
puede ser crítico si existen pequeñas variaciones.
Ilustración 161.
97
Ilustración 162
98