Empezando con la Raspberry Pi Zero 2 W – Configuración inicial

Después de estar pelándome para montar y programar un scanner de presencia Bluetooth en modo clásico con el Wemos D1 y los módulos BT HC-05 , no había forma de que me respondiera al comando AT+INQ? , tras perder unas cuantas horas vi en un articulo que a partir del firmware 2.0 solo funcionaban en modo esclavo , este modo por desgracia no permite el comando inquiry , mas información aqui , lo intente con el ESP32 que teóricamente tiene BLE y Bluetooth clásico , pero en los firmwares habituales solo viene activado el BLE por lo que tras unas pruebas quedo descartado.

Empecé a mirar diferentes opciones para hacer el scanner bluetooth y tras investigar me decidí por comprar un par de las nuevas PI Zero 2 W y ver si lo conseguía de esa forma , el problema es el inexistente stock actual , los precios en aliexpress estan a cuatro veces el precio oficial , y en wallapop lo mismo , al final directamente en la zona de partners de la pagina de rapsberry encontre uno en España que tenia a 15€ cada una, aunque las tuve que comprar de una en una , supongo que para evitar la especulación ,

Raspberry Pi Zero 2 W: el mismo tamaño compacto con hasta cinco veces más potencia

Estas son las especificaciones técnicas de la Raspberry Pi Zero 2 W

RASPBERRY PI ZERO 2 W
DIMENSIONES Y PESO65 x 30 mm16 gramos
PROCESADORBroadcom BCM2710A1Cuatro núcleos ARM Cortex-A53 a 1 GHz
MEMORIA RAM512 MB LPDDR2
CONECTIVIDADWi-fi 2,4 GHz 802.11b/g/nBluetooth 4.2 (BLE)1x Micro USB 2.0 (OTG)1x Mini HDMI1x Micro USB para la alimentaciónToma de E/S GPIO de 40 pinesRanura para tarjetas microSDConector de cámara CSI-2
MULTIMEDIADescodificación H.264, MPEG-4 (1080p30)Codificación H.264 (1080p30)Gráficos OpenGL ES 1.1, 2.0
OTROSPines de vídeo compuesto y reset mediante puntos de soldadura de texto
PRECIO16,50 euros

El factor forma es exactamente el mismo que la Zero W , por lo que se pueden aprovechar todos los accesorios de la versión precia de Pi zero

Una vez desembalado y con una uSD de 32Gb procedemos a su configuración previa

Instale Ubuntu 20.04 pero no se lleva bien con la parte Bluetooth de la placa no reconociéndolo, por ello al final monte Raspian

Lo primero instalar Raspbian en la tarjeta uSD pondremos en la raíz un fichero llamado ssh sin extensión con el contenido en blanco y pondremos un fichero llamado wpa_supplicant.conf donde configuraremos las opciones de conexión de nuestra pi , el contenido tiene que ser similar a este , adaptándolo a las necesidades de cada uno

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=ES
network={
        ssid="Wifi_1"
        psk="Contraseña_1"
        key_mgmt=WPA-PSK
        priority=100
}

network={
        ssid="Wifi_2"
        psk="Contraseña_2"
        key_mgmt=WPA-PSK
        priority=0
}

network={
        ssid="Wifi_3"
        psk="Contraseña_3"
        key_mgmt=WPA-PSK
        priority=50
}

Una vez arrancado y localizada la ip del dispositivo entraremos por ssh con usuario pi y contraseña raspberry

Crearemos un nuevo usuario y le daremos permisos de acceso

sudo useradd antonio 
sudo passwd antonio
sudo usermod antonio -a -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio

Acto seguido cambiaremos la contraseña del usuario pi

sudo passwd pi

Actualizaremos los paquetes del sistema a la ultima version

sudo apt-get update
sudo apt-get upgrade -y

Cambiaremos el nombre del equipo (hostname) con raspi-config

sudo raspi-config 
sudo reboot

Instalaremos unas aplicaciones que son siempre utiles

sudo apt install net-tools
sudo apt install nano
sudo apt install htop

Instalaremos Samba y crearemos las carpetas a compartir

sudo apt-get install samba

mkdir /home/antonio
mkdir /home/antonio/Containers
mkdir /home/antonio/Containers/dockercompose

chmod -R 777 /home/antonio/Containers

Haremos una copia de la configuración de samba y lo modificaremos según nuestras necesidades añadiendo esto a smb.conf

cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo nano /etc/samba/smb.conf


[global]
ntlm auth = true

[Containers]
   comment = directorio compartido Containers
   path = /home/antonio/Containers
   valid users = antonio
   public = no
   writable = yes
   vfs objects = recycle
   recycle:repository = Recycle Bin
   create mask=0777
   directory mask=0777

Pondremos la contraseña al usuario de Samba y reiniciamos el servicio , entonces deberíamos poder conectarnos sin problemas a la carpeta compartida

sudo smbpasswd -a antonio
    
sudo service smbd restart
sudo service smbd start
sudo service smbd status

\\192.168.1.XXX\Containers

Instalaremos docker , luego ya jugaremos con docker y le iremos sacando partido

sudo apt install docker.io
sudo apt install docker-compose

sudo systemctl status docker

service docker restart

Como monitor para dockers a mi personalmente me gusta CTOP , lo instalaremos de esta manera

sudo wget https://github.com/bcicen/ctop/releases/download/0.7.6/ctop-0.7.6-linux-amd64 -O /usr/local/bin/ctop
sudo chmod +x /usr/local/bin/ctop

Crearemos una tarea en cron para que se reincie de forma automatica cada semana

sudo crontab -e

#Reinicio semanal
0 5  *  *  1  /sbin/shutdown -r now

Al tener poca memoria optimizaremos creando un mayor espacio de swap

sudo dphys-swapfile swapoff
sudo nano /etc/dphys-swapfile

CONF_SWAPSIZE=2048

sudo dphys-swapfile setup
sudo dphys-swapfile swapon

Instalaremos un watchdog para reiniciar si no hay conectividad

sudo apt-get install watchdog
sudo cp /etc/watchdog.conf /etc/watchdog.conf.backup
sudo nano /etc/watchdog.conf

Añadir

# Watchdog ping: if unresponsive, reboot:
interface = wlan0    # use interface wlan0
ping-count = 5       # ping 5 times
ping = 192.168.1.1   # ping test destination IP address
# Change default interval from 1 second to 20:
interval = 300        # perform watchdog checks every 300 seconds

Para aumentar algo la justa potencia de esta pi evitaremos que entre en modo ahorro energia , podemos consultar el estado actual con :

sudo iw dev wlan0 get power_save
power_save: on

Para deshabilitarlo insertermos en /etc/rc.local la siguiente linea

/sbin/iw dev wlan0 set power_save off

Una de las cosas que lleva muy mal la Pi Zero es lo de apagar a las bravas , por ello me gusta poner un pulsador de apagado entre los pines 37 y 39 , GPIO 26 y GND para que así el apagado sea el correcto

RPI Zero 2W Board Layout: GPIO Pinout, Specs, Schematic in detail

Crearemos un fichero que se llame piShutdown.py que contendrá este código , usaremos este mismo modulo para hacer otras cosas , pero eso será mas adelante

from gpiozero import Button #import button from the Pi GPIO library
import time # import time functions
import os #imports OS library for Shutdown control

stopButton = Button(26) # defines the button as an object and chooses GPIO 26

while True: #infinite loop
     if stopButton.is_pressed: #Check to see if button is pressed
        time.sleep(1) # wait for the hold time we want. 
        if stopButton.is_pressed: #check if the user let go of the button
            os.system("shutdown now -h") #shut down the Pi -h is or -r will reset
    time.sleep(1) # wait to loop again so we don't use the processor too much.

comprobaremos que funciona correctamente ejecutándolo y cerrado contacto entre ambos pines

sudo python /home/antonio/piShutdown.py

Para que se cargue al inicio lo incluiremos en el fichero /etc/rc.local

sudo nano /etc/rc.local

Añadiremos la llamada antes de la linea exit 0

sudo python /home/antonio/piShutdown.py &
exit 0

Ahora instalaremos ZRAM que comprime los datos de la swap y los almacena en la RAM, no utilizando la tarjeta SD de la Raspberry ganando mayor velocidad ,esto lo haremos siguiendo estos pasos.

sudo wget -O /usr/bin/zram.sh https://raw.githubusercontent.com/Bash-Projects/rpi_zram/master/zram.sh
sudo chmod +x /usr/bin/zram.sh
mkdir ~/scripts

Crear el fichero con nano

nano /home/antonio/scripts/zram.sh

E insertar este contenido

#!/bin/bash
/usr/bin/zram.sh &

Lo añadimos al crontab

sudo crontab -e

Añadir esta linea

@reboot ( sleep 60 ; sudo /home/antonio/scripts/zram.sh )

Y solo queda reiniciar para ver los cambios

sudo reboot now

Bonus tip , para poner a cero todo el espacio libre , esto nos ira muy bien a la hora de sacar copias de nuestra uSD , yo suelo usar Win32DiskImager , y a la hora de comprimir esta imagen se nota muchísimo en el espacio total , tarda un rato pero vale la pena

#Poner a cero espacio en blanco
sudo cat /dev/zero > zero.file
sync
sudo rm zero.file

Problemas

No vemos el uso de memoria y de CPU en el monitor de dockers , tenemos que modificar /boot/cmdline.txt y con nano añadir al final esto

cgroup_enable=memory cgroup_memory=1 swapaccount=1

Pendiente

Tengo pendiente de que me llegue e instalarle este shield para alimentarla directamente en una toma USB , lo pads de la version 1 y 2 son compatible

Waveshare Pi Zero USB adapter

Situación de los pads en la pi zero 2 w

Back side pad diagram of RPI Zero 2W

En futuras entradas veremos como sacarle todo el partido a esta maravilla creando nuestros dockers y dandole mas partido , son los mejores 15€ gastados

A pesar de solo tener 512Mb de RAM y parecer unas prestaciones justas la verdad es que no deja de sorprenderme , para muestra el consumo de CPU y ram