Cómo usar raspberry pi pico con PlatformIO

Hace tiempo que trasteo con varias placas de desarrollo que intento integrar en distintos proyectos de IoT, la mayoría relacionados con nomorekeys, el caso es que generalmente he utilizado arduino (el pro micro es mi favorito) o el ESP32 cuando necesito wifi (antes el ESP8266). Hay muchos otros por ahi, como el seeeduino xiao y muchos de Nordic.

Raspberry pi pico pinout

El caso es que tengo mucho código escrito en C/C++ para el entorno Arduino y, resulta, que puedo reutilizarlo en distintos procesadores utilizando un plugin para visual studio code llamado PlatformIO, lo que he ido haciendo para los distintos arduino, ESP y Seeeduino, Hace relativamente poco tiempo me decidí a probar el nuevo MCU de Raspberry, el Raspberry Pi Pico, pero me centre en usarlo con CircuitPython, teniendo unos resultados excelentes y que os recomiendo probar.

Llegado el caso necesité más memoria para un proyecto que inicialmente estaba codificado para arduino pro micro ya que este solo posee 2,5k de memoria RAM y se quedaba muy corta. Revisando lo que tenía por casa me di cuenta que tenía un par de rpi pico por ahí de las pruebas con python y me di cuenta que tenían 264k de memoria (x100 lo que tiene un arduino), tampoco andan mal de precio y tienen todos los pines de entrada salida que necesitaba, así que, manos a la obra… Vamos a ver si podemos adaptar el código de arduino a la pico… Usando PlatformIO.

No voy a entrar ahora mismo ni en cómo instalar platformio ni en como crear un proyecto, eso os lo dejo para vosotros o si me lo pedís lo esccribo más adelante, por ahora partiremos de que eso ya lo has hecho.

Si ya tienes un proyecto hecho con platformio, enhorabuena, todos los cambios que tendrás que hacer es incluir esto en tu platformio.ini:

[env:pico]
platform = raspberrypi
board = pico
framework = arduino

Recuerda poner el #include <Arduino.h> si estás importando un sketch del ide de arduino y ya estaría…

La primera vez que quieras subir el código a la placa tendrás que copiar el archivo firmware.uf2 después de haber puesto en modo boot la placa (enchufala al ordenador pulsando el botón de la misma), yo lo hago con este comando (uso linux)

cp .pio/build/pico/firmware.uf2 /media/$USER/RPI-RP2/

Las siguientes veces ya no hará falta, puedes dar al botón upload directamente y el código compilado se subirá a la placa.

Happy coding!

Cómo dar de alta tu propia librería en el gestor de librerías de Arduino

De un tiempo a esta parte he estado haciendo cositas con microcontroladores y Ardunio (ultimamente con platformio), y el caso es que he querido dejar como librerías libres algunos de los códigos que he generado (o mejorado), como por ejemplo la librería para generar códigos QR en displays OLED o TFT (https://github.com/yoprogramo/QRcodeDisplay). La gestión de librerías en Arduino es una de las cosas que hacen el entorno interesante (en platformio mejor todavía) y es muy interesante tener disponible tu librería en el gestor de librerías de arduino.

Hasta hace poco el hacer que tu librería estuviese disponible para todo el mundo en el gestor de librerías de Arduino IDE era una tarea muy «manual», básicamente poner un mensaje en los foros de soporte de Arduino y esperar por la respuesta… Esto ha cambiado un poquito y podemos encontrar un nuevo método aquí:

https://github.com/arduino/library-registry#readme

Os lo resumo para los que seais impacientes. Los pasos una vez que tengáis el código de la librería en github son los siguientes:

  • Crear una release en github y darle un número
  • Crear un archivo llamado library.properties con el número de versión y los datos correspondientes de las plataformas y dependencias
  • Abrir este enlace para hacer un fork del repositorio: https://github.com/arduino/library-registry/edit/main/repositories.txt
  • Hacer fork del repositorio
  • Editar el archivo repositories.txt añadiendo la url de github del repositorio
  • Hacer click en «Proponer cambios»
  • Crear un pull request

El pull request genera una petición para que un bot revise los cambios, si todo está ok la librería aparecerá al día siguiente en el gestor de arduino, si hay algún problema se puede poner un comentario mencionando a @ArduinoBot o hacer un commit con las modificaciones en el archivo (en la rama de nuestro fork).

Nuestra librería en el gestor de librerías de Arduino

Cómo hacer que tu casa te reconozca

A ver, en realidad esto ha sonado mejor de lo que realmente es, pero, ¿te gustaría poder decirle a tu casa que estás dentro para que sepa si hay que lanzas una alarma o simplemente saludarte? Pues algo muy similar vamos a poder hacer con home assistant, por lo que te recomiendo que te leas la entrada anterior si quieres continuar con ésta.

Si tienes home assistant ya instalado hay un concepto que puede parecer extraño al principio, pero que es fundamental para lo que queremos hacer, el concepto de «persona». Puedes acceder al menú de personas desde Configuración -> Personas:

Este menú te dará opción a crear todas las personas relevantes para tu casa y te permitirá hacerles seguimiento… Básicamente lo que queremos es saber si están dentro o fuera de la casa para tener esa información disponible para nuestras automatizaciones (o para saberlo cuando nos llega un paquete de Amazon y queremos saber si hay alguien en la casa, por ejemplo).

¿Seguimiento?

Para poder hacer el seguimiento de una persona necesitamos que ésta nos informe de una manera o de otra de su situación con respecto a la casa, eso en home assistant se hace con os device.trackers que son, ni más ni menos, que la parte de código que recibe la información de la situación de un dispositivo. Hay un montón de trackers que os invito a explorar para ver cual es el más adecuado para vosotros. Como mi objetivo es que el seguimiento sea transparente y consuma la menor cantidad posible de datos y energía os voy a proponer dos tackers que, además, son muy sencillos de configurar:

1. Aplicación de home assistant

Tenéis disponible en vuestra tienda favorita la aplicación home assistant que os da acceso remoto a vuestra instalación (bueno, lo de remoto lo veremos en otra entrada, que tiene su miga) y que, además, permite al móvil comunicarse con home assistant para darle datos sobre la localización del dispositivo (y otras cosas como si está cargando o no y la cantidad de carga restante que tiene).

Una vez instalada la aplicación veremos que aparecen entidades nuevas en home assistant y que podremos ponerlas en e interfaz o, como es el caso, utilizarla como sistema de seguimiento para una persona… Para ello solo tenemos que acceder al menú personas, crear la persona si todavía no existe y editarla, lo que nos llevará a una pantalla como esta:

En la parte de «Rastrear dispositivo» veremos que en el desplegable nos aparece un device_tracker con el nombre del móvil donde hemos instalado la aplicación. Lo seleccionamos, grabamos y, a partir de este momento la casa nos tendrá localizados.

2. Usando un tracker bluetooth

Esto está bien, pero igual no queremos que todos los miembros de la familia tengan que instalarse la aplicación móvil, así que buscando otro método para saber si están o no en casa me encontré con que todos en la familia tenemos activo el bluetooth del teléfono (para conectar con los altavoces, los cascos, el coche, o lo que sea…) si eso es así podríamos hacer que la raspberry (que tiene bluetooth integrado) nos localice siempre que estemos a una distancia que permita llegar al bluetooth de nuestro teléfono. Dicho y hecho, para configurar este comportamiento solo hay que usar el bluetooth tracker y poner lo siguiente en el archivo configuration.yml:

device_tracker:
  - platform: bluetooth_tracker

Luego solo tenemos que reiniciar el sistema y automáticamente nos creará un archivo known_devices.yml que contendrá todos los dispositivos bluettoth que ha detectado y permite ponerles nombre y decidir si vamos a seguirlos o no (por defecto sigue a todos los nuevos, por lo que es recomendable cambiar ese comportamiento cuando ya estén detectados todos los dispositivos). Si no aparece vuestro móvil en un rato lo mejor es que pongas el móvil a buscar dispositivos bluetoot para tenerlo activo mientras reinicias home assistant y así te aseguras de que lo detecta.

Una vez detectados los móviles que nos interesa solo tenemos que volver a personas y repetir el mismo procedimiento… A partir de ese momento podremos saber si están en casa o no (o al menos los móviles) y verlo en el interfaz:

Automatiza tu casa

Creí, francamente, que ya había escrito sobre el tema de la domótica en mi blog, pero revisando me he encontrado que no he escrito casi nada sobre el tema, así que comienzo ahora a desvelaros, muy poco a poco, qué es esto de la automatización y cómo puedes controlar tu casa y hacerla más inteligente con un coste ridículo (y aprendiendo un montón).

domótica

Como resumen, la domótica aglutina todo lo que podemos controlar de manera remota 8o programar localmente) en nuestro hogar. Son esas cosas que nos permiten encender la calefacción horas antes de que lleguemos de un viaje, abrir y cerrar persianas sin que estemos o apagar y encender luces cuando se detecta nuestra presencia. Dado que esto es un campo muy amplio, os recomiendo que visitéis webs más especializadas para descubrir el montón de cosas que se pueden hacer. Yo, por mi parte, iré recopilando las cosas interesantes que voy haciendo por si os sirve de algo.

Lo primero…

Para poder «jugar» un poco con la domótica necesitamos algún controlador en el que centralizar todas estas opciones. En mi caso me he decidido por home assistant, que tiene un montón de información en internet y del que disponéis de plugins y librerías para cadsi todo. La instalación es tremendamente sencilla si vamos a utilizar una raspberry pi (recomiendo que sea la 4, pero la 3 también nos serviría igualmente). La guía de instalación para raspberry pi está bastante bien y la podéis encontrar en este enlace.

El proceso consiste, básicamente, en descargarte la imagen de internet, grabar con esa imagen una tarjeta SD y si tenéis conexión por cable simplemente meter la sd en la rasperry, enchufar el cable de red y esperar a que arranque, tendréis el sistema de configuracion en la url http://homeassistant.local:8123/. Si vais a usar wifi desde el primer momento el proceso es un poco más complicado, básicamente consiste en copiar este archivo (modifica a tu gusto el SSID y contraseña) en la particion de boot del SD que acabáis de grabar (en CONFIG/network/) y llámalo my-network:

[connection]
id=my-network
uuid=72111c67-4a5d-4d5c-925e-f8ee26efb3c3
type=802-11-wireless

[802-11-wireless]
mode=infrastructure
ssid=MI_SSID
# Uncomment below if your SSID is not broadcasted
#hidden=true

[802-11-wireless-security]
auth-alg=open
key-mgmt=wpa-psk
psk=MI_CONTRASEÑA_WIFI

[ipv4]
method=auto

[ipv6]
addr-gen-mode=stable-privacy
method=auto

En fin, una vez que tengáis home assistant instalado toca poner los datos tuyos y los del domicilio donde vas a instalarlo y el sistema se encargará de buscar por red las integraciones a las que pueda acceder directamente.

En siguientes entradas veremos aspectos interesantes sobre cómo configurarlo para tener acceso a dispositivos zigbee, a detectar presencia propia o a hacer automatizaciones… Por ahora intentad tener el controlador preparado e id buscando dispositivos para hacer de vuestra casa una casa inteligente.

Medidor de temperatura casero

Dado que tengo unos cuantos arduino pro micro que he usado para otras cosas, creí bastante conveniente diseñarle una placa para poder ponerle un display oled de 0,96 pulgadas (ssd1306 que ya utilicé en otras entradas) para poder hacer proyectos rápido (en principio pensando en conectarlo a un ordenador y que actúe como teclado, ratón y/o puerto serie). El esquema es el siguiente:

Y la placa resultante quedó así:

Podéis encontrar el proyecto, por si queréis mejorarlo en https://easyeda.com/biblioeteca/promicro-oled

El caso es que, lo primero que se me ocurrió para probarlo, una vez recibidas las placas, fue utilizar otro componente que tenía desde hace tiempo (un sensor de temperatura) y convertirlo en un termómetro… Una pena que no pensara en ello al hacer la placa, por lo que tendré que hacer alguna soldadura de más para conectar el sensor. En concreto quedaría así:

Que visto después de aplicar el soldador se vería así (he aprovechado las pistas de GND y VCC que llegaban al display):

Visto por el otro lado:

La parte de programar la temperatura es un poco más «liosa», básicamente habría que leer la hoja de especificaciones del termistor y resolver la ecuación de Steinhart-hart.

En mi caso, con el valor de 10KOhm en la resistencia y el modelo de termistor que tenía (aquí su hoja de especificaciones) el código resultante para leer la temperatura quedó así:

const int Rc = 10000; //valor de la resistencia
const int Vcc = 5;
const int SensorPIN = A0;
 
float A = 1.11492089e-3;
float B = 2.372075385e-4;
float C = 6.954079529e-8;
 
float K = 2.5; //factor de disipacion en mW/C

void loop() {
  float raw = analogRead(SensorPIN);
  float V =  raw / 1024 * Vcc;
  float R = (Rc * V ) / (Vcc - V);
  float logR  = log(R);
  float R_th = 1.0 / (A + B * logR + C * logR * logR * logR );
  float kelvin = R_th - V*V/(K * R)*1000;
  float celsius = kelvin - 273.15;
  delay(2000);
  // Imprimir la temperatura...
}

Para sacar en el display la temperatura he utilizado la librería Adafruit_SSD1306 que depende de Adafruit_GFX y permite hacer bastantes cosas… Eso sí, dado que mi arduino era lento (estoy usando el de 3.3v) he tenido que inicializar el display cambiando la velocidad del I2C a 400Mhz para que no se note demasiado lag (este display hay que limpiar la zona en la que escribes antes y eso quita ciclos).

Finalmente, una vez probado que funciona, mi intención es hacerlo portable, por lo que le he añadido una pila de 6v conectada a los pines «raw» y «gnd» (el pro micro tiene una entrada regulada en el pin raw) y le he montado una carcasa… Quedando de esta manera (si queréis más detalles me los pedís):