Archivo de la categoría: GPIO

Manejar GPIO Raspberry Pi

En este punto https://aprendiendoarduino.wordpress.com/2020/03/01/gpio-raspberry-pi/ ya hemos visto las características físicas del GPIO de Raspberry Pi

Para controlar GPIO con Python, primero debes importar una librería de código escrito previamente. El más común y difundido es el Rpi.GPIO, utilizado para crear miles de proyectos desde los primeros días de la Raspberry Pi.

Ben Croston creó una biblioteca de Python llamada RPi.GPIO, que utilizó como parte de su proceso de elaboración de cerveza. Esto permitió a las personas controlar los pines GPIO desde sus programas Python, y se convirtió en un éxito tanto en educación como en proyectos personales. Lo usamos en muchos de nuestros recursos de aprendizaje gratuitos.

Web:

GPIO en Python: https://www.raspberrypi.com/documentation/computers/os.html#gpio-in-python 

Más recientemente, se ha introducido otra biblioteca, llamada GPIO Zero, que ofrece una experiencia más fácil para aquellos que son nuevos en Python y en la electrónica básica. GPIO Zero es una librería creada por Raspberry Pi para que sea más accesible y fácil de usar que RPi.GPIO

Web: https://pypi.org/project/gpiozero/

Documentación: https://gpiozero.readthedocs.io/en/stable/

Versión 1.5: https://www.raspberrypi.org/blog/gpio-zero-v1-5/

GPIO Zero creada por Raspberry Pi: https://www.raspberrypi.org/blog/gpio-zero-a-friendly-python-api-for-physical-computing/

Migrar de GPIO Zero desde RPi.GPIO https://gpiozero.readthedocs.io/en/stable/migrating_from_rpigpio.html

Linea de comandos gpiozero: https://gpiozero.readthedocs.io/en/stable/cli_tools.html

El módulo gpiozero siempre usa la numeración Broadcom GPIO para identificar un GPIO.

El módulo RPi.GPIO puede usar la numeración física de pin (BOARD) o la numeración Broadcom GPIO (BCM).

Ambas bibliotecas están preinstaladas en el sistema operativo Raspbian. En cuanto a la nomenclatura de los pines GPIO, hay varias maneras de identificarlos; el método más simple y obvio es definitivamente el que se refiere a su ubicación física. Empezando por la parte superior izquierda del GPIO, y con esto nos referimos al pin más cercano a la ranura de la micro SD, tenemos el pin físico 1 que proporciona alimentación 3v3. A la derecha de ese pin se encuentra el pin físico de 2 que proporciona 5v de potencia. El número de pines seguirá creciendo a medida que desciendas por las columnas, como habrás entendido a la izquierda encontraremos todos los pines con números impares y a la derecha los pares. 

Hay otro método utilizado, y es la numeración de pines de Broadcom (BCM) (numeración de pines GPIO) que, sin embargo, para el usuario medio puede parecer caótica, con GPIO17, 22 y 27 siguiéndole unos a otros con lo que parecería una pequeña reflexión sobre la numeración lógica. En realidad, el mapeo de pines BCM se refiere a los pines GPIO que estaban conectados directamente al SoC del Raspberry Pi.

La mayoría de los tutoriales de Raspberry Pi que verás utilizan este esquema de numeración, también porque es el que cuenta con el apoyo oficial de la Fundación Raspberry Pi. También ten en cuenta que los números de pin BCM y GPIO se refieren al mismo esquema. Por ejemplo, GPIO17 es lo mismo que BCM17. Por último, algunos pines GPIO también tienen funciones secundarias que les permiten interactuar con diferentes tipos de dispositivos que utilizan los protocolos I2C, SPI o UART; por ejemplo, los pines GPIO3 y GPIO4 también son pines SDA y SCL I2C utilizados para conectar dispositivos a través del protocolo I2C

Más información: https://descubrearduino.com/pines-gpio-de-la-raspberry-pi-4/

Pines GPIO Zero

Uso de los pines:

PWM con RPi: http://www.instructables.com/id/RaspberryPi-Pulse-Width-Modulation-Demonstration/?ALLSTEPS

Ejemplos de Uso

Blink Led

Antes de empezar recordar comprobar la posición de los pines porque en caso de error podemos dañar la Raspberry Pi ya que los GPIO no tienen ninguna protección.

  • Cuando conectes cables a los GPIO procura no equivocarte y fíjate bien.
  • Usa cables con recubrimiento del tipo Dupont Macho-hembra por ejemplo, y no acerques cables sin proteger a tus GPIO (Y mucho menos un destornillador) porque puedes hacer un corto con facilidad.
cables M-F
  • Una vez que conectes un cable hembra protegido, vuelve a mirar y asegúrate de que lo has conectado al pin que querías y no al de al lado.
  • Especial cuidado con los pines que uses para sacar 3V o 5V de tu Raspi. No dejes el otro extremo al aire: Asegúrate de conectarlo a algún sitio.
  • NO CONECTES NADA DE 5V si no estás seguro. Tu Raspberry funciona a 3.3V y meterle 5V en un pin puede suponer quemar el procesador central. 

Instalar las librerías para el uso de los pines GPIO desde Python, asegurandonos de tener actualizado Raspbian:

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get install python3-dev
  • sudo apt-get install pyton3-rpi.gpio

Tened en cuenta que en esta ocasión vamos a alimentar el LED con 3.3V (Que es lo que proporciona un pin de la Raspi) y que la intensidad que obtendremos será: 3.3 / 220 Ω = 15 mA.

Esquema de GPIO:

Conectamos GND al pin 6 de la Raspberry y vamos a usar el pin 12 (GPIO 18) como control del encendido mediante una resistencia intermedia. El esquema de conexión es:

Abrir el IDLE de Python 3 para empezar nuestro programa:

Y copiar código:

import RPi.GPIO as gpio
import time

gpio.setmode(gpio.BOARD)
gpio.setup(12, gpio.OUT)

for  x in range ( 0, 10):

    gpio.output(12, True)
    time.sleep(0.5)
    gpio.output(12, False)
    time.sleep(0.5)

print "Ejecución finalizada"

Guardar el fichero con el nombre blink.py en /home/pi y ejecutarlo pulsando F5

Bucle infinito: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio01-Blink/rpi_led.py

Más información:

Botón

Leer estado de un pulsador:

Código: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio04-Pulsador/rpi_pushbutton_test.py

Código con detección de flanco: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio04-Pulsador/rpi_pushbutton_block.py

GPIO.cleanup() – limpia el estado de in out y pull up down para que no se quede.

GPIO.setwarnings(false) – deshabilita warnings

Con eventos https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio04-Pulsador/rpi_pushbutton_detect.py

Multithread mucho más eficiente si uso con más procesamiento: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio04-Pulsador/rpi_pushbutton_threaded.py

En un hilo de ejecución ejecuto el script que lo pone a dormir y en otro hilo ejecuta la función de callback.

PWM

Cambio de intensidad LED.

Código: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio05-PWM/rpi_led_pwm.py

Tutoriales GPIO Oficiales

Inicio GPIO: https://projects.raspberrypi.org/en/projects/physical-computing/0

Recetas básicas: https://gpiozero.readthedocs.io/en/stable/recipes.html

Más información

Tutorial Adafruit: https://learn.adafruit.com/playing-sounds-and-using-buttons-with-raspberry-pi/overview

Remote GPIO

Remote gpio: Se agregó para permitir el acceso remoto a los pines GPIO desde otro Pi en la red, usando el demonio pigpio, ya que esto es posible usando la biblioteca Python GPIO Zero.

Ver con más detalle: http://bennuttall.com/whats-new-gpio-zero-v1-3/ 

GPIO con Node-RED

Otra forma de manejar el GPIO de Raspberry Pi es usando Node-RED con el nodo https://flows.nodered.org/node/node-red-node-pi-gpio que es el módulo que viene instalado por defecto

Aunque hay más nodos para manejar el GPIO:

Más información: https://nodered.org/docs/faq/interacting-with-pi-gpio

Node-Red no viene instalado en Raspberry Pi pero se puede hacer desde add/remove software.

La forma recomendada es desde Menú – Preferencias – Software Recomendado. Si se instala de esta manera, se puede actualizar usando sudo apt-get upgrade.

Luego se puede ejecutar manualmente con el comando “node-red-star” o :

Para iniciar Node-RED en el arranque de Raspberry Pi de forma automática usar:

  • sudo systemctl enable nodered.service

Más información https://nodered.org/docs/hardware/raspberrypi

Para comprobar que funciona abrir en un navegador http://ip-raspberry:1880

pantalla node-red

Documentación del nodo: https://flows.nodered.org/node/node-red-node-pi-gpio

Tutoriales básicos Node-RED:

Getting started con Node-RED: https://projects.raspberrypi.org/en/projects/getting-started-with-node-red

Anuncio publicitario

GPIO Raspberry Pi

Del mismo modo que Arduino dispone de una serie de pines que podíamos conectar al mundo exterior para leer o escribir, Raspberry dispone de otra serie de pines homólogos que en la jerga habitual de la RPI se llaman GPIO (General Purpose Input Output).

GPIO:

La cantidad de pines disponibles en el GPIO ha variado de unas versiones a otras, manteniendo la compatibilidad con las versiones anteriores para evitar problemas, y a grandes rasgos ha habido dos versiones de GPIO. La gran variación fue de la Raspi 1 a la Raspi 2 que aumentó el número de pines disponibles y que básicamente se pueden ver aquí:

A esta forma de numerar se le suele conocer como modo GPIO, Pero surgió otra forma de numerar, no de acuerdo a la posición de los pines en la salida, sino a la posición de los pines correspondientes en el chip Broadcom que es la CPU de la Raspberry, y a esta segunda manera se la llama modo BCM.

Nos encontramos con dos formas distintas de referirse a los pines, GPIO según los números del conector externo o BCM según los pines del chip que revuelven las posiciones. No tiene por qué ser mejor una que otra pero es importante asegurarse de cuál de las dos se está usando.

Disposición de los pines en la placa:

En Raspberry Pi Zero:

Pinout: https://pinout.xyz/ 

Más información:

Especificaciones eléctricas GPIO

Los pines trabajan con una tensión de 3,3 V y un consumo máximo de corriente de 16 mA. Esto significa que podemos suministrar energía de forma segura desde un solo pin GPIO a través de una resistencia, uno o dos LEDs.

IMPORTANTE:Todos los IO ports son de 3.3V, así que se debe tener cuidado.

Para alimentar cualquier otra cosa que requiera más corriente, como un motor de corriente continua, es necesario utilizar componentes externos para evitar dañar el GPIO.

Salidas: Un pin GPIO designado como pin de salida puede ajustarse a alta (3V3) o baja (0V).

Entradas: Un PIN GPIO designado como PIN de entrada puede ser leída como alta (3V3) o baja (0V). Esto es más fácil con el uso de resistencias internas de pull-up o pull-down. Los pines GPIO2 y GPIO3 tienen resistencias pull-up fijas, pero para otros pines esto puede ser configurado en el software.

Especificaciones eléctricas del GPIO: http://www.mosaic-industries.com/embedded-systems/microcontroller-projects/raspberry-pi/gpio-pin-electrical-specifications

Plantilla GPIO: http://rasp.io/portsplus/

Iconos de alerta de firmware: https://www.raspberrypi.org/documentation/configuration/warning-icons.md 

Accesorio expansión GPIO:

Comprar: https://www.amazon.es/ASHATA-Accesorios-Expansion-Raspberry-Breadboard/dp/B07J1SBD6G/

Advertencia: aunque la conexión de componentes simples a los pines GPIO es perfectamente segura, es importante tener cuidado en la forma de cablear las cosas. Los LEDs deben tener resistencias para limitar la corriente que pasa a través de ellos. No use 5V para los componentes de 3V3. No conecte los motores directamente a los pines GPIO, en su lugar utilice un circuito de puente H o una placa controladora de motores.

Manejar GPIO

Se puede acceder a una referencia práctica de los GPIO abriendo una ventana de terminal y ejecutando el comando pinout. Esta herramienta es proporcionada por la librería GPIO Zero Python, que se instala por defecto en la imagen de escritorio de Raspbian, pero no en Raspbian Lite.

Para manejar los pines de GPIO la mejor manera de usarlos es en Python mediante el uso de librerías. Veremos más adelante cómo usarlo en el apartado de programación y manejo.

Pueden tener una dirección para recibir o enviar corriente (entrada, salida respectivamente) y todo esto es totalmente controlable por lenguajes de programación como Python, JavaScript, Node-RED y otros.

Librería GPIOZero: https://gpiozero.readthedocs.io/en/stable/

Es posible controlar los pines de la GPIO usando un número de lenguajes y herramientas de programación. Vea las siguientes guías para empezar:

Para probar los pines del GPIO mediante línea de comandos: https://geekytheory.com/tutorial-raspberry-pi-gpio-parte-1-control-de-un-led

Simulador Raspberry Pi

Además puedes montar una máquina virtual con Raspbian. Puede crear un live disk, ejecutarlo en una máquina virtual o incluso instalarlo en el equipo. Descargar en https://www.raspberrypi.org/downloads/raspberry-pi-desktop/

Tutoriales instalar Raspbian en Virtualbox:

Instalación Software Raspberry Pi

Instalar servidor LAMP

El acrónimo LAMP está compuesto por las iniciales de sus cuatro componentes: Linux, Apache, MySQL y PHP. Estos forman la infraestructura en el servidor, que hace posible la creación y el alojamiento de páginas web dinámicas. Los componentes individuales se acumulan unos sobre otros, por lo que esta plataforma también recibe el nombre de LAMP stack (del inglés “apilar”).

Su funcionamiento es muy simple. Linux sirve como sistema operativo base para ejecutar el servidor web Apache. Este último no puede interpretar contenidos dinámicos, pero es aquí donde PHP entra a ejercer sus funciones de programación del lado del servidor. El proceso funciona entonces de la siguiente manera: Apache le envía un código fuente al intérprete PHP, incluyendo la información correspondiente sobre las acciones del visitante de la web, y permite el acceso a la base de datos MySQL. El resultado es devuelto a Apache y este se muestra finalmente en el navegador web del visitante.

El lenguaje de programación PHP es uno de los más extendidos para el desarrollo de páginas web. La ventaja de utilizar PHP para el desarrollo de páginas web es que nos permite crear páginas web dinámicas, es decir, que se generan cuando un usuario visita la página.

MySQL es un sistema de gestión de bases de datos relacional desarrollado bajo licencia dual: Licencia pública general/Licencia comercial por Oracle Corporation y está considerada como la base datos de código abierto más popular del mundo, y una de las más populares en general junto a Oracle y Microsoft SQL Server, sobre todo para entornos de desarrollo web.

La alternativa libre es mariaDB: https://mariadb.org/

Este proyecto monta un pequeño servidor web Apache con lo que podrías por ejemplo alojar tu propia página web entre otras cosas. Además, si despliegas alrededor de tu casa, por ejemplo, varios sensores y actuadores (temperatura, humedad, luces, etc…) comandados por Arduino, podrías utilizar la Raspberry Pi 3como centro de envío y recepción de datos a través de su red. Y por supuesto utilizar la página Web para mostrar y controlar los datos a través de Internet.

Instrucciones para su instalación:

#Update system

  • sudo apt-get update
  • sudo apt-get upgrade

#Install Apache2

  • sudo apt-get install apache2

Comprobar que accedemos entrando a la IP de la Raspberry Pi desde un navegador

La página web por defecto está en /var/www/html

Crear un fichero prueba.html en el directorio /var/www/html que contenga el texto: “HOLA MUNDO”

Para comprobar que funciona entrar desde un navegador a la dirección: http://ip_raspberry/prueba.html y ver que aparece el texto “HOLA MUNDO”

También podemos comprobar que funciona conectando un Arduino a la red de la Raspberry Pi y cargar este sketch: https://github.com/jecrespo/Curso-IoT-Open-Source/blob/master/Conecta_Raspberry/Conecta_Raspberry.ino

#Install PHP

  • sudo apt-get install php libapache2-mod-php

La versión que se instala es la 7.

Para comprobar el funcionamiento crear un fichero llamado info.php y en su interior el código: <?php phpinfo(); ?>

Luego en un navegador ir a http://IP-raspberry/info.php

#Install MySQL

  • sudo apt-get install mysql-server php-mysql
  • sudo mysql_secure_installation
  • sudo service apache2 restart

Durante el proceso de instalación se pedirá el password de root de MySQL, poner el mismo que tiene el usuario pi de la Raspberry Pi y poner a Yes todas las opciones de mysql_secure_installation

Estos comando instalan una BBDD MariaDB

Para comprobar que todo funciona ejecutar sudo mysql -u root -p y poner la contraseña, saldrá:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 61
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

#Install PhpMyAdmin

  • sudo apt-get install phpmyadmin

Durante el proceso pide la contraseña del usuario phpmyadmin de MySQL y el servidor a instalar el apache y poner yes en dbconfig-common

phpMyAdmin es una herramienta escrita en PHP con la intención de manejar la administración de MySQL a través de páginas web, utilizando Internet. Actualmente puede crear y eliminar Bases de Datos, crear, eliminar y alterar tablas, borrar, editar y añadir campos, ejecutar cualquier sentencia SQL, administrar claves en campos, administrar privilegios, exportar datos en varios formatos y está disponible en 72 idiomas. Se encuentra disponible bajo la licencia GPL Versión 2.

Para probar que funciona ver en un navegador: http://IP-raspberry/phpmyadmin con el usuario phpmyadmin y la contraseña usada.

El usuario phpmyadmin no tiene privilegios. Para crear un usuario “pi” con privilegios ejecutar:

  • sudo mysql -u root -p
  • CREATE USER ‘pi’@’localhost’ IDENTIFIED BY ‘tu_contrasena‘;
  • GRANT ALL PRIVILEGES ON * . * TO ‘pi’@’localhost’;
  • FLUSH PRIVILEGES;

#Install servidor ftp (VSFTPD)

  • sudo apt-get install vsftpd

Una vez instalado, configurar con: sudo nano /etc/vsftpd.conf

Comentar estas dos opciones:

#local_enable=YES
#ssl_enable=NO

Y añadir al final del fichero:

# CUSTOM
ssl_enable=YES
local_enable=YES
chroot_local_user=YES
local_root=/var/www
user_sub_token=pi
write_enable=YES
local_umask=002
allow_writeable_chroot=YES
ftpd_banner=Welcome to my Raspberry Pi FTP service.

También necesitamos añadir el usuario pi al grupo www-data, dar la propiedad de la carpeta /var/www al usuario y al grupo www-data, cambiar la carpeta de inicio del usuario pi a la misma, y aflojar algunos permisos en la carpeta /var/www:

  • sudo usermod -a -G www-data pi
  • sudo usermod -m -d /var/www pi
  • sudo chown -R www-data:www-data /var/www
  • sudo chmod -R 775 /var/www

Y reiniciar el servicio: sudo service vsftpd restart

Para comprobar que funciona usar un cliente ftp con https://filezilla-project.org/ y hacer una conexión con la siguiente configuración:

  • Host – 192.xxx.x.xxx (IP address)
  • Port – 21
  • Protocol – FTP (File Transfer Protocol)
  • Encryption – Use explicit FTP over TLS if available
  • Logon Type – Normal (username & password)
  • Username – pi
  • Password – [enter password]

Más información:

Y si quisieramos instalar un wordpress: https://www.raspberrypi.org/learning/lamp-web-server-with-wordpress/

Con esto ya tenemos listo un servidor para recibir conexiones de arduino y guardar datos y mostrarlos

Recordar cada vez que se haga una modificación grande en Raspberry Pi hacer una copia de seguridad de la tarjeta SD con Win32DiskImager.

Descarga https://sourceforge.net/projects/win32diskimager/

Escribir el nombre de la imagen en la ruta donde los guardemos.

Y luego pulsar read. Una vez hecho esto, esperar a que el proceso finalice.

Probar LAMP con Arduino

Para probar el servidor LAMP que acabamos de instalar en nuestra Raspberry Pi vamos a usar Arduino y mandar datos de luminosidad de la sala usando un LDR.

Una fotorresistencia o LDR (por sus siglas en inglés “light-dependent resistor”) es un componente electrónico cuya resistencia varía en función de la luz.

Se trata de un sensor que actúa como una resistencia variable en función de la luz que capta. A mayor intensidad de luz, menor resistencia: el sensor ofrece una resistencia de 1M ohm en la oscuridad, alrededor de 10k ohm en exposición de luz ambiente, hasta menos de 1k ohm expuesto a la luz del sol. Aunque estos valores pueden depender del modelo de LDR.

El LDR actúa como una resistencia variable. Para conocer la cantidad de luz que el sensor capta en cierto ambiente, necesitamos medir la tensión de salida del mismo. Para ello utilizaremos un divisor de tensión, colocando el punto de lectura para Vout entre ambas resistencias. De esta forma:

Dónde Vout es el voltaje leído por el PIN analógico del Arduino y será convertido a un valor digital, Vin es el voltaje de entrada (5v), R2 será el valor de la resistencia fija colocada (10k ohm generalmente) y R1 es el valor resistivo del sensor LDR. A medida que el valor del sensor LDR varía, obtendremos una fracción mayor o menor del voltaje de entrada Vin.

Instalación:

Más información https://www.luisllamas.es/medir-nivel-luz-con-arduino-y-fotoresistencia-ldr/

Crear una base de datos llamada “DatosArduino” con una tabla llamada “luminosidad” que tenga 4 campos: “id” auto incremental y sea el campo clave, “fecha” de  tipo timestamp y que se actualice al actualizar, un campo “arduino” de tipo entero y un campo “IntensidadLuminosa” que sea de tipo entero.

O con la query:

 

CREATE TABLE `luminosidad` (
 `id` int(11) NOT NULL,
 `fecha` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
 `arduino` int(11) NOT NULL,
 `IntensidadLuminosa` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `luminosidad`
 ADD PRIMARY KEY (`id`);

ALTER TABLE `luminosidad`
 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Subir por FTP seguro los ficheros Graba_GET.php y Graba_POST.php a Raspberry Pi al directorio /var/www/html

Ejecutar en Arduino estos sketches para GET o POST para mandar cada 5 segundos el dato de luminosidad:

Ver en la web de phpmyadmin los datos que se están subiendo y descargar en formato csv los datos guardados en unos minutos.

NOTA: Para ver los errores de PHP activar en /etc/php/7.0/apache2/php.ini la línea:

  • Development Value: E_ALL

Instalar Webmin

Webmin es una herramienta de configuración de sistemas accesible vía web para sistemas Unix, como GNU/Linux y OpenSolaris. Con él se pueden configurar aspectos internos de muchos sistemas operativos, como usuarios, cuotas de espacio, servicios, archivos de configuración, apagado del equipo, etcétera, así como modificar y controlar muchas aplicaciones libres, como el servidor web Apache, PHP, MySQL, DNS, Samba, DHCP, entre otros.

Web: http://www.webmin.com/

Instalación:

Es posible que haya que instalar algunas dependencias con:

  • sudo apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python

Para comprobar que se ha instalado acceder desde un navegador a https://ip_address:10000

Más información:

Instalar Mosquitto en Raspberry Pi

Mosquitto está disponible en el repositorio principal de Raspberry Pi. También hay repositorios Debian proporcionados por el proyecto mosquitto, tal y como se describe en  https://mosquitto.org/blog/2013/01/mosquitto-debian-repository/

Lo primero es descargar la signing key o clave de firma utilizando el comando wget. Este comando descarga el fichero indicado como parámetro en el directorio en el que te encuentras.

Añadimos la clave para a una lista para autenticar el paquete que vamos a descargar más tarde.

  • sudo apt-key add mosquitto-repo.gpg.key

Después descargamos la lista de repositorios de Mosquitto con wget en la carpeta adecuada.

Actualizamos la lista de paquetes disponibles y sus versiones

  • sudo apt-get update

Y finalmente instalamos Mosquitto y los clientes

  • sudo apt-get install mosquitto
  • sudo apt-get install mosquitto-clients

Si va a utilizar MQTTT en un proyecto de Python, tendrá que instalar paho-mqtt, que reemplaza al antiguo módulo de Mosquitto Python. Si python-pip no está instalado tendrá que instalarlo primero:

  • sudo apt-get install python-pip
  • sudo pip install paho-mqtt

Más información:

Configurar mosquito

La configuración de mosquitto está el fichero /etc/mosquitto/mosquitto.conf. Recordar hacer copia del fichero antes de hacer alguna modificación

Para añadir todos los mensajes de log en el fichero de log añadir las líneas:

# Save all log in file
log_dest file /var/log/mosquitto/mosquitto.log
log_type all
log_timestamp true

Para más información sobre las opciones del fichero mosquitto.conf ver /usr/share/doc/mosquitto/examples/mosquitto.conf

Para reiniciar el servicio de mosquito usar:

  • sudo systemctl restart mosquitto

En Linux puede recargar los archivos de configuración sin reiniciar el broker enviando la señal HUP de la siguiente manera:

  • kill -HUP PID # where PID is the process ID

Más información:

Comprobar Funcionamiento de Mosquitto

El último paso es probar nuestra instalación. Vamos a usar dos terminales. Uno se suscribirá al tema «test-mosquitto», y el otro publicará un mensaje sobre este tema. La prueba tendrá éxito si el mensaje enviado por el editor se registra en el terminal de abonado.

Abrir un terminal en el ordenador con PuTTY y para suscribirse al topic “test-mosquitto” poner el comando:

  • mosquitto_sub -d -t ‘test-mosquitto’ (d = debug mode, t = topic)

Las opciones del comando mosquitto_sub son: https://mosquitto.org/man/mosquitto_sub-1.html

Si quisiéramos conectarnos a otro mosquitto y no el de nuestra raspberry usar:

  • mosquitto_sub -d -h IP_BROKER -t ‘test-mosquitto’ (d = debug mode, t = topic, h = host)

Abrir otro terminal y para publicar en el topic “test-mosquitto” poner el comando:

  • mosquitto_pub -d -t ‘test-mosquitto’ -m ‘This is a test message’

Y recibiremos el mensaje en la consola donde nos hemos suscrito:

Probar a suscribirse o publicar a otros mosquitto. También puedes hacerlo instalando el cliente MQTT.fx de: https://mqttfx.jensd.de/

Más información:

Securizar Mosquitto

Tenemos un servidor Mosquitto instalado y funcionando, pero cualquiera que pueda acceder al puerto 1883 de nuestra Raspberry Pi o servidor podrá publicar y suscribirse a topics y además los mensajes no están cifrados.

El objetivo es configurar un broker MQTT con autentificación para securizar un poco el acceso al mismo de forma que podamos exponerlo en un servidor público y aún así tengamos zonas privadas.

Vamos a configurar Mosquitto para que use contraseñas. Mosquitto incluye una utilidad para generar un archivo de contraseña especial llamado mosquitto_passwd. Este comando le pedirá que introduzca una contraseña para el nombre de usuario especificado y coloque los resultados en /etc/mosquitto/passwd. Ejecutar este comando y poner la contraseña.

  • sudo mosquitto_passwd -c /etc/mosquitto/passwd curso_iot

Ahora abriremos un nuevo archivo de configuración para Mosquitto y le diremos que use este archivo de contraseñas para requerir inicios de sesión para todas las conexiones:

  • sudo nano /etc/mosquitto/conf.d/default.conf

Y escribir en el fichero:

password_file /etc/mosquitto/passwd
allow_anonymous false

allow_anonymous false deshabilitará todas las conexiones no autenticadas, y la línea del archivo password_file le indica a Mosquitto dónde buscar información de usuario y contraseña.

Una vez modificado el fichero reiniciar mosquitto:

  • sudo systemctl restart mosquitto

En el directorio /etc/mosquitto/conf.d se guardan los ficheros de configuración adicionales.

Para publicar y suscribirse con usuario y contraseña usar:

  • mosquitto_pub -d -t «test» -m «hola_mundo» -u «curso_iot» -P «password»
  • mosquitto_sub -d -t «test» -u «curso_iot» -P «password»

Desafortunadamente, estamos enviando contraseñas sin encriptar a través de Internet. Lo arreglaremos añadiendo cifrado SSL a Mosquitto.

Para hacerlo seguir estos tutoriales:

Manejar GPIO Raspberry Pi

Blink Led

Antes de empezar recordar comprobar la posición de los pines porque en caso de error podemos dañar la Raspberry Pi ya que los GPIO no tienen ninguna protección.

  • Cuando conectes cables a los GPIO procura no equivocarte y fíjate bien.
  • Usa cables con recubrimiento del tipo Dupont Macho-hembra por ejemplo, y no acerques cables sin proteger a tus GPIO (Y mucho menos un destornillador) porque puedes hacer un corto con facilidad.

  • Una vez que conectes un cable hembra protegido, vuelve a mirar y asegúrate de que lo has conectado al pin que querías y no al de al lado.
  • Especial cuidado con los pines que uses para sacar 3V o 5V de tu Raspi. No dejes el otro extremo al aire: Asegúrate de conectarlo a algún sitio.
  • NO CONECTES NADA DE 5V si no estás seguro. Tu Raspberry funciona a 3.3V y meterle 5V en un pin puede suponer quemar el procesador central.

Instalar las librerías para el uso de los pines GPIO desde Python, asegurandonos de tener actualizado Raspbian:

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get install python-dev
  • sudo apt-get install pyton-rpi.gpio

Tened en cuenta que en esta ocasión vamos a alimentar el LED con 3.3V (Que es lo que proporciona un pin de la Raspi) y que la intensidad que obtendremos será: 3.3 / 1K Ω = 3 mA, que no es mucho para iluminar un LED pero suficiente.

Esquema de GPIO:

Conectamos GND al pin 6 de la Raspberry y vamos a usar el pin 12 (GPIO 18) como control del encendido mediante una resistencia intermedia. El esquema de conexión es:

Abrir el IDLE de Python 3 para empezar nuestro programa:

Y copiar código:

 
import RPi.GPIO as gpio

import time

gpio.setmode(gpio.BOARD)
gpio.setup(12, gpio.OUT)

for  x in range ( 0, 10):

   gpio.output(12, True)
   time.sleep(0.5)

   gpio.output(12, False)
   time.sleep(0.5)

print "Ejecución finalizada"

Guardar el fichero con el nombre blink.py en /home/pi y ejecutarlo pulsando F5

Más información: