Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
Raspberry Pi OS:
Entradas y Salidas
POR STELLA HERAS, JAVI PALANCA,
JOAQUÍN TAVERNER Y JESÚS TOMÁS
Objetivos:
• Repasar algunos conceptos de electrónica usados en la unidad.
• Conocer las conexiones GPIO disponibles en Raspberry Pi
• Aprender a generar entradas/salidas usando GPIO
1
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
1. Algunos conceptos de electrónica
A lo largo de este capítulo vamos a tener que montar pequeños circuitos elec-
trónicos para conectar sensores y actuadores. Es posible que tus conocimientos
de electrónica sean limitados, si es así, esta sección puede ayudarte a
comprender algunos aspectos clave.
1.1 Voltaje y fuente de alimentación
Los circuitos electrónicos manipulan la información representándola por medio de
señales eléctricas. Normalmente es el voltaje o tensión eléctrica la magnitud
utilizada para este propósito.
Para conseguir este voltaje vamos a necesitar una fuente de alimentación, por
ejemplo, la Raspberry Pi utiliza un cargador USB. Veamos algunos voltajes
utilizados en casi todos los circuitos:
• VIN: Voltaje de la fuente de alimentación conectado a la placa. En la
Raspberry Pi 9V.
• VCC (o VDD): Voltaje de corriente continua regulado interno que alimenta los
com- ponentes de la placa. Los voltajes comunes son + 5V, + 3.3V y +
1.8V.
• GND: (Ground): Punto de referencia utilizado para indicar los 0V de la
placa. Todos los voltajes se miden respecto a este. Se conoce también
como masa.
1.2. Señales analógicas y digitales
Según como puede variar el voltaje de la señal podemos diferenciar dos tipos de
señales.
Analógicas: El voltaje de la señal es proporcional a la información que
representa. Por ejemplo, si un sensor de temperatura nos da un voltaje entre 0V y
5V, que representa una temperatura entre 0º y 100º.
Digitales: El voltaje que puede tomar la señal se limita a un número finito de
valores. Si estos valores son 2, se conocen como señales binarias. Cuando el
valor está cercano a VCC, se conoce como “1”. Cuando el valor está cercano a
GND, se conoce como “0”. Para representar una magnitud como la temperatura
se necesitan varias señales binarias, por ejemplo, de 8 bits, 00101100.
2
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
1.3. Resistencia pull-up / pull-down.
En los ejercicios de esta práctica vamos a conectar una resistencia entre la en-
trada GPIO y Vcc, tal y como se muestra en el esquema siguiente. Veamos por
qué́ esta resistencia es necesaria. Si eliminaras esta resistencia y el pulsador que
aparece en el esquema estuviera abierto, tendríamos un cable desde la entrada,
sin conectar a ningún sitio. Realmente no estaría conectado a masa, ni a Vcc, por
lo que no podríamos decir que es ni 0 ni 1. A este tercer estado se le conoce
como alta impedancia.
Resistencia pull-up
Puede ser peligroso dejar una entrada en alta impedancia. Un cable sin conectar,
puede actuar como una antena. Si hay señales radio eléctricas cerca (producidas
por un motor, antena...) se podría inducir una corriente eléctrica en este cable,
que podría engañar al GPIO provocando su activación. Para evitar dejar la
entrada en alta impedancia, la conectamos a Vcc. Pero, cuando se cierre el
pulsador la corriente pasará de masa a Vcc directamente, provocando un
cortocircuito. Al colocar esta resistencia, la corriente entra en la entrada, siguiendo
el camino más fácil.
Si queremos que cuando el pulsador esté abierto el valor de la entrada sea 0, y al
pulsarlo pase a 1, utilizaríamos una resistencia de pull-down.
3
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
El valor habitual para una resistencia de pull-up es de 10K y de pull-down es de
1K.
Resistencia pull-down
1.4. LED y cálculo de resistencia de ajuste
Se trata de un diodo emisor de luz (Light Emitting Diode). Como
en todo diodo la corriente solo puede pasar del ánodo (pata más
larga) al cátodo (pata más corta). Por lo tanto, para que emita
luz es imprescindible que conectes el ánodo a tensión alta y el
cátodo a masa.
IMPORTANTE: nunca conectes un LED directamente con
un pin a 3,3/5V y el otro a GND. La corriente sería
demasiado alta y el LED se fundirá. Has de limitar el paso
de corriente utilizando una resistencia.
Para calcular el valor de la resistencia podemos utilizar la ley de Ohm: V = I·R. El
valor máximo de corriente que puede pasar por un LED es de 20mA (un valor de
17mA es suficiente, si es menor brillará algo menos). También has de tener en
cuenta que un led provoca una caída de voltaje entre 1,8V - 2,1V si es rojo,
amarillo o verde y entre 3V - 3,8V si es azul, violeta o blanco.
Un ejemplo: tenemos un LED rojo, con una caída de 1,8V y queremos que pase
una corriente de 17mA.
4
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
Si la fuente de alimentación es de 9V la resistencia necesaria sería:
V=I·R à R=V/I = (9V–1,8V) / 17mA = 423,5Ω ≈ 470Ω
Para una alimentación de 3,3V con LED rojo o verde, con caída de 1,8V:
R = (3,3V – 1,8V) / 17mA = 88,2Ω ≈ 100Ω
Para una alimentación de 3,3V con LED azul, con caída de 3,1V:
R = (3,3V – 3,1V) / 17mA = 11,8Ω ≈ 10Ω
1.5. Adatar señales de 3,3V a 5V
La forma clásica de trabajar consiste en utilizar 5V como nivel alto y 0V como nivel
bajo. No obstante, se ha popularizado utilizar una lógica diferente donde el nivel
alto está representado por 3,3V.
Como veremos cuando trabajemos con Arduino como esclavo de la Raspberry, es
frecuente que tengamos que interconectar elementos que trabajan con una lógica
y con o la otra. Existen convertidores de voltaje que podemos comprar para
resolver este problema. También existen soluciones más sofisticadas1. En este
apartado lo resolveremos de una forma muy sencilla. Hay que destacar que esta
solución trabaja solo para líneas unidireccionales, en las que en la línea siempre
transmite el mismo dispositivo. Para una solución bidireccional, consultar el link.
Salida a 3,3V y entrada a 5V
Aunque se suele trabajar con un valor de voltaje como referencia, a la hora de
interpretar una entrada se utilizan un rango bastante amplio. Este rango se
muestra en la siguiente gráfica:
1
[Link]
5
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
Como puedes verificar en caso de que la salida sea a 3,3V un circuito con lógica
de 5V va a interpretarlo como nivel alto sin problemas. Tampoco hay problemas
con la salida a nivel bajo.
Salida a 5V y entrada a 3,3V
Es en este caso cuando podemos tener problemas. Una salida a 5V podría dañar
un circuito preparado para recibir un máximo de entrada de 3,3V. Algunos
dispositivos que trabajan a 3,3V permiten entradas a 5V. En caso de duda
podemos consultar las especificaciones técnicas en el datasheet.
Para resolver el problema queremos que un voltaje de 5V baje a 3,3V mientras
que uno de 0V no cambie. Para ello podemos usar un simple divisor de tensión
usando dos resistencias, tal y como se muestra en el siguiente esquema:
Donde VIN = 5V y Vout = 3,3V. Para calcular R1 y R2 aplicando la ley de Ohm.
V = I·R
que nos dice que la caída de voltaje es proporcional a la resistencia. Dado que
Vout es 2/3 VIN, R2 ha de ser el doble que R1. De esta forma en R1 caerá 1/3 del
voltaje y en R2 los 2/3 restantes.
Existen infinitas resistencias que cumplen esta relación. Si estas tienen un valor
muy pequeño, pasará mucha intensidad por el circuito, y si sus valores son
grandes pasará poca. Un valor adecuado puede ser de 1mA, con lo que podemos
calcular:
V=I·R à R=V/I à R2=Vout /I =3,3 / 0,001 = 3,3K
R1 = (Vin - Vout) / I = (5-3,3) / 0,001 = 1,7K
Seguramente no dispongas de resistencias con exactamente estos valores, pero
no hay problema en que utilices unas similares. Si el voltaje está por encima de
2V seguirá interpretándose como nivel alto.
6
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
2. Entradas / Salidas en Raspberry Pi OS
Con la Raspberry Pi instalada con Raspberry Pi OS podremos conectar hardware
de entrada salida y controlarlo directamente desde nuestra la aplicación.
Las entradas/salidas de propósito general se controlan por una serie de registros
del chip BCM2837. Estos registros son mapeados en direcciones de memoria
para su acceso. Cuando trabajas con un sistema operativo el acceso a estas
posiciones está prohibido (excepto root) y tienes que utilizar los servicios ofrecidos
por el sistema operativo.
Las conexiones a las entradas/salidas se realizan a través de 40 pines, tal y como
se muestra a continuación ([Link]
7
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
Una opción interesante puede ser utilizar un cable que permite llevar estos 40
pines a la placa de prototipos. De esta forma protegemos el desgaste de la placa
original.
GND Ground (8 terminales) – Toma de tierra. Se utiliza como referencia
para el resto de voltajes.
5V (2 terminales) – Conectados a la alimentación. Se utiliza un fusible para
evitar problemas en caso de cortocircuito. Podemos consumir hasta 1A desde
estos pines.
3,3V (2 terminales) – Podemos consumir hasta 1A.
GPIO General Purpose Input Output (24 terminales) – Cada pin puede
configurarse para trabajar como entrada o como salida. Como entrada hay que
usar una tensión entre 0 y 3,3V. Las salidas no tienen que tener un consumo
superior a 50mA.
8
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
PWM Pulse-Width Modulation (2 terminales): la modulación por ancho de
pulsos de una señal o fuente de energía es una técnica en la que se modifica el
ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por
ejemplo), ya sea para transmitir información a través de un canal de
comunicaciones o para controlar la cantidad de energía que se envía a una carga.
UART Universal Asynchronous Receiver-Transmitter (2 terminales, 1 bus):
el Transmisor-Receptor Asíncrono Universal, es el dispositivo que controla los
puertos y dispositivos serie.
I2C Inter-Integrated Circuit (4 terminales, 2 buses): el Circuito Inter-
Integrado es un puerto y protocolo de comunicación serie, que define la trama de
datos y las conexiones físicas para transferir bits entre 2 dispositivos digitales.
SPI Serial Peripheral Interface (5 terminales, 2 buses): el bus de Interfaz
de Periféricos Serie o bus SPI es un estándar para controlar casi cualquier
dispositivo electrónico digital que acepte un flujo de bits serie regulado por un reloj
(comunicación síncrona).
2.1. Conexiones GPIO
GPIO es el acrónimo de General Purpose Input/Output, en castellano
Entrada/Salida de Propósito General. Corresponde a un pin de un chip que puede
utilizarse para realizar una entrada o salida binaria, normalmente para interactuar
con algún dispositivo exterior.
Si lo programamos como salida e indicamos nivel bajo en este pin tendremos 0V,
y si indicamos nivel alto tendremos un voltaje de 3,3V. Hay que tener la
precaución de no conectar a esta salida un dispositivo con consumo superior a
16mA. El máximo que puede proporcionar todas las salidas simultáneamente es
50mA.
Si por el contrario lo programamos como entrada, leeremos un 0 si la tensión es
menos de 0,8V y leeremos un 1 si la tensión está entre 1,3 y 3,3V. Nunca hay
que superar este voltaje, dado que podríamos destruir el bloque GPIO.
Podemos tener hasta 24 entradas/salidas GPIO, pero algunos de los pines
pueden compartir otras funciones como I2C, UART o PWM.
Hay que destacar que en Raspberry Pi no hay entradas analógicas como en otros
controladores (como muchos compatibles Arduino). Si queremos leer un valor
analógico tendremos que utilizar un conversor Analógico/Digital (A/D).
9
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
3. La libreríaPi4J
El proyecto Pi4J pretende proporcionar una API de E/S orientada a objetos y
librerías de implementación para que los programadores de Java puedan acceder
a todas las capacidades de E/S de la Raspberry Pi. Como se muestra en la
siguiente imagen, este proyecto abstrae la integración nativa de bajo nivel y la
monitorización de interrupciones para permitir a los programadores de Java
centrarse en la implementación de la lógica de negocio de su aplicación.
Para la realización de estas prácticas, vamos a utilizar la librería Pi4J, que nos
permitirá crear nuestros proyectos Java para interaccionar con la Raspberbby Pi a
través de sus conectores GPIO.
NOTA: para trabajar con los ejercicios de esta práctica, es necesario
tener configurado Gradle JDK a la versión 11 de Java.
Para ello accede a Android Studio – Preferences – Build, Execution,
Deployment – Build Tools – Gradle y selecciona la version 11 en
Gradle JDK.
Además, puede que os de errores referentes a “Module settings” y
“Language Level”. Sigue las recomendaciones de Android Studio
para cambiar a JDK 11 y Language level 10.
10
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
Ejercicio: Entrada GPIO en Raspberry Pi OS
En este ejercicio aprenderás a comunicarte con el hardware del dispositivo. En
concreto, leer la entrada de un simple botón. Material necesario:
• un pulsador: Si utilizas un pulsador de 4 pines, ten en
cuenta que los pines marcados están interconectados. Al
pulsar, los 4 pines estarían unidos.
• una resistencia de pull-up de 10 KΩ (color: café,
negro, naranja). Se explica en el siguiente apartado.
• tablero de prototipos y cables.
1. Monta los sensores y actuadores sobre la placa de prototipos y conectalos
a la Raspberry Pi. El siguiente esquema te muestra cómo hacerlo:
- Conecta una conexión del botón al pin de entrada GPIO elegido (en este
ejemplo BCM21).
- Conecta el otro extremo del botón a tierra y el mismo pin de entrada GPIO a
+3.3V a través de una resistencia pull-up de 10 KΩ.
11
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
2. Crea un proyecto en Android Studio llamado RPiButton.
3. Crea un módulo llamado rpi (paquete [Link]).
4. Crea la clase ButtonControl dentro del módulo.
5. Crea el fichero [Link] con la siguiente configuración:
12
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
6. Completa la clase ButtonControl con el siguiente código:
Para conseguir reaccionar ante el cambio de una entrada GPIO hemos
seguido los siguientes pasos:
1. Definimos el Pin del botón.
2. Configuramos el botón como un DigitalInput, especificando sus
parámetros de configuración con DigitalInputConfigBuilder.
13
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
3. Creamos un “escuchador” para capturar los eventos del botón.
4. En el escuchador, escribimos un mensaje en la consola de Pi4J con el
estado del botón.
7. Crea una nueva Run Configuration de Gradle para generar los JARs
necesarios para ejecutar el proyecto (como en la práctica anterior).
8. Copia el archivo jar generado a la Raspberry Pi con el comando:
scp build/libs/[Link] pi@IP_RASPBERRY:
9. Conéctate a la Raspberry por SSH con el comando:
ssh pi@IP_RASPBERRY
10. Ejecuta el proyecto con el comando:
java -jar [Link]
Verás que cada vez que pulsas el botón se escribe un mensaje por pantalla
con el estado del botón.
Ejercicio: Salida GPIO en Raspberry Pi OS
En este ejercicio aprenderás a comunicarte con una salida GPIO. En concreto
un simple LED. Programaremos que se ejecute cada 3 segundos para
conseguir un efecto de parpadeo en el LED.
NOTA: En este ejercicio, asumimos que se ha realizado el ejercicio anterior
“Entrada GPIO en Raspberry Pi”.
Material adicional:
• un LED: de color rojo o verde.
• Resistencia de 100 Ω (color: marrón, negro, marrón)
14
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
1. Monta los sensores y actuadores sobre la placa de prototipos y
conectarlos a la Raspberry Pi. El siguiente esquema te muestra cómo
hacerlo:
• Conecta el pin de salida GPIO elegido (BCM17) a un extremo de una
resistencia en serie (Fíjate que el botón está ahora conectado a BCM18).
• Conecta el otro extremo de la resistencia al ánodo del LED (pata más
larga).
• Conecta el cátodo del LED (pata más corta) a tierra.
15
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
2. Crea la clase ButtonLEDControl y complétala con el siguiente código:
16
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
3. Actualiza el fichero [Link] con la nueva clase:
17
Proyecto IoT y aplicaciones móviles
Grado en Tecnologías Interactivas (2A)
4. Ejecuta de nuevo la configuración del Gradle creada en el ejercicio anterior
y sigue los pasos para copiar los JAR en la Raspberry.
5. Al ejecutar el proyecto en la Raspberry, verás que cada vez que pulsas el
botón se enciende el LED. Si el botón no está pulsado el LED estará
apagado..
Práctica: Controlar parpadeo mediante el botón.
Tras realizar los dos ejercicios anteriores, modifica el proyecto para que el LED
parpadee cada medio segundo y deje de parpadear cuando el botón está pulsado.
18