Primeros pasos con Raspberry Pi 4 Model B

Última revisión en marzo del 2022.
Primeros pasos con la Raspberry PI 4 Model B que se va a convertir en el nuevo centro de control de mi casa. Cómo instalar programas, cómo trabajar remotamente, cómo montar un entorno de desarrollo en C, C++ y Java, y cómo controlar sus GPIO.

Un pequeño ordenador

La caja de la Raspberry PI

Se trata de un ARM v8 de 64 bits a 1.5 GHz, con dos puertos HDMI (doble monitor) y muy buenas comunicaciones (Gigabit Ethernet, 2.4/5.0 GHz WiFi y Bluetooth 5.0).

El decodificador hardware H.265 permite 4K con 60 fps (3840×2160 pixels, 60 frames per second).

Y lo que hace realmente diferente la Raspberry Pi de un ordenador convencional son sus 40 pins GPIO (General Purpose Input Output) que nos permiten interactuar con sensores y actuadores.

Si la queremos usar como mini ordenador necesitamos además un teclado, un mouse, una caja, un microSD, una fuente de alimentación con interruptor y una pantalla.

MicroSD - Sistema Operativo

Para arrancar la placa tenemos que copiar una imagen de Sistema Operativo en una tarjeta microSD (32GB, mínimo Class 10).

En función del uso que queramos darle tenemos tres imágenes del Raspberry Pi OS de 32 bits, que está basado en Debian 9. La Lite no tiene entorno gráfico, sólo terminal de línea de comandos (Headless Server) y la Minimal y la Full.

Se recomienda empezar con la Minimal, que viene con PIXEL Desktop, Chromium Browser, VLC Player y Python, y después modificar según el uso que queramos darle.

Hay otros Sistemas Operativos disponibles como el Kali Linux de 64 bits, que ya nos viene con GCC, GNU Make, GNU Debugger, más adecuados para desarrolladores, pero menos estables y con menos aplicaciones.

Sólo cambiando la microSD, donde está la imagen del Sistema Operativo, podemos conseguir funcionalidades totalmente distintas de nuestra Raspberry Pi

Primer Arranque

Una vez insertada la microSD con la imagen del SO elegido, conectamos un teclado y un mouse Bluetooth (lógicamente pueden ser USB), un cable Ethernet y un monitor en la conexión HDMI 0. Finalmente, conectamos una alimentación adecuada de 5V 3A.

El primer arranque nos pide donde estamos localizados. En el caso de España nos da 6 posibilidades de idioma desde Aragonese a European Spanish. Una vez le has dado el password de la WIFI, hace todos los updates que cree oportunos, vuelve arrancar y ya tenemos un ordenador funcional.

Ahora podemos instalar GIMP (GNU Image Manipulation Program) y LibreOffice (Free Office Suite) para tener todos los básicos de un ordenador.
RPi Desktop
Navegando con el Chrome se nota un poco el rendering de las páginas pero todo es bastante fluido.

Cómo instalar más programas

APT (Advanced Packaging Tool) es el programa de gestión de paquetes de Debian que nos permite instalar y desinstalar software en la RPi.

Como ejemplo vamos a instalar los entornos de desarrollo de programas Java y C/C++ desde la terminal de línea de comandos.

Java

sudo apt install default-jdk

Una vez instalada podemos saber la versión con el comando

java -version

Herramientas de desarrollo C/C++

sudo apt install cmake cppcheck global build-essential gdb git gpiod libgpiod-dev
build-essential GNU C/C++ compilers
cmake Build script generator - CMakeList.txt
gdb GNU Debugger
git Source Control Management
gpiod Librería acceso GPIO
libgpiod-dev gpiod lib headers
Herramientas de desarrollo

Conexión automática a nuestra WiFi

Editamos el archivo wpa_supplicant.conf con nano

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

y ponemos al final

  
network={
  ssid="Nuestra WiFi"
  psk="PassWord de la WiFi"
}
  

Salvamos y rearrancamos la RPi.

Conexión Remota

IP estática

Configurar el router para que asocie siempre la misma IP a la Raspberry nos facilitará las conexiones remotas con VNC (Virtual Network Computing), SHH (Secure Shell), FTP (File Transfer Protocol).

Habilitar VNC y SSH

Podemos habilitar VNC y SSH en las Raspberry  en

"Preferences" > "Rasberry Pi Configuration"

Desenchufamos la pantalla, el teclado y el mouse y reiniciamos la RPi. Esperamos almenos hasta que el led verde, indica accesos a la microSD, deje de parpadear en la RPi, y podemos hacer una conexión remota como sigue.

VNC

VCN nos permite usar el entorno gráfico del SO de la RPi remotamente desde nuestro ordenador.

Hay muchos clientes VNC para Windows 10, como el que podemos encontrar www.realvnc.com.

SSH

Es un terminal de comandos en línea que podemos usar remotamente para controlar RPi.

El SSH, ya viene con Windows 10, lo podemos habilitar en

"Settings" > "Apps" > "Optional Features" > "OpenSSH Client"

En la terminal del Windows PowerShell ejecutamos

ssh pi@IP
donde pi es el usuario por defecto de la Raspberry y la IP es nuestra IP privada.

FTP

Bitwise SSH client, que podemos encontrar en www.bitvise.com, tiene un FTP gráfico que nos permite mover archivos entre nuestro ordenador y la RPi muy fácilmente.

Visual Studio Code

Personalmente, instalo el Raspberry PI OS Lite con el programa Raspberry PI Imager, que permite configurar usuario, password, SSH, wifi ... y después al arrancar lo conecto al VS Code en modo remoto.

Visual Studio Code es el editor Open Source de moda. Se puede instalar en la RPi pero mucho mejor si lo usamos desde nuestro ordenador habitual añadiendo una extensión que nos permite la conexión remota a la RPi. O sea, estamos editando el código en nuestro ordenador pero realmente los archivos están en la RPi. Cuando los ejecutamos también lo hacen en la RPi.

VS Code nos enlaza con RPi a través del SSH. La ventaja que nos proporciona es que actúa como un buen explorador de archivos remoto de la RPi.

VS Code - RPi - conexión remota
Se tiene que configurar en el VS Code que la conexión remota con RPi es del tipo Linux, sino no funciona.

Cómo controlamos las GPIO

Desde la línea de comandos

Imprimir el pinout

pinout
Comando pinout

raspi-gpio

El raspi-gpio actúa directamente en los registros sin pasar por el SO.

Por ejemplo, podemos configurar el pin 15 de la GPIO como salida

raspi-gpio set 15 op

ponerlo a nivel alto de tensión (3V3)

raspi-gpio set 15 dh

y bajarlo (0V)

raspi-gpio set 15 dl

Si queremos que el mismo pin sea una entrada

raspi-gpio set 15 ip

que podemos leer

raspi-gpio get 15
GPIO 15: level=0 fsel=0 func=INPUT pull=DOWN

Desde C/C++

Tenemos Gpiod que tiene varios comandos en línea y la librería libgpiod en C, con bindings para C++ y Python, que nos permiten interactuar con las GPIO a través del SO.

Ejemplo

Como ejemplo implementamos un pulsador que alterna el encendido y el apagado de un led. Si en 10 segundos no hay pulsaciones, se apaga el led y se finaliza el programa. 

Esquema pulsador - led

En el pulsador hemos puesto una resistencia de pull-down (Rpd) para evitar que la entrada de alta impedancia haga de antena y cree falsas pulsaciones.

Realmente las GPIO ya incluyen pull-ups y pull-downs programables. De la GPIO 9 a la 27 tiene por defecto un pull-down sinó nuestro código no funcionaría sin especificar en el código que la resistencia interior tiene que funcionar como pull-down.

También hemos puesto en serie una resistencia de protección (Rp) para limitar la corriente en caso de que por error esta entrada sea programada como salida.

En el caso de led hemos puesto una resistencia en serie para limitar el paso de corriente.

Podemos coger 16 mA como el máximo de corriente que puede dar una GPIO y 78 mA entre todas las GPIOs.

El comando de línea gpioinfo nos puede ser útil para saber a que línea corresponde cada GPIO y el estado en que está.

Sólo mencionar que no se han tenido en cuenta los posibles rebotes (bounces) del pulsador que se tendrían que filtrar a nivel software.


#include <gpiod.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  const char *chipname = "gpiochip0";
  struct gpiod_chip *chip;
  struct gpiod_line *led;    
  struct gpiod_line *button; 
  struct timespec ts = { 10, 0 };
  int ret;
  bool bOn = true;

  // Open GPIO chip
  chip = gpiod_chip_open_by_name(chipname);

  // Open GPIO lines
  led = gpiod_chip_get_line(chip, 21);
  button = gpiod_chip_get_line(chip, 26);

  // output
  gpiod_line_request_output(led, "test", GPIOD_LINE_ACTIVE_STATE_HIGH);
  // input
  gpiod_line_request_rising_edge_events(button, "test");
   
  for(;;) 
  {
    // turn on / off the led
    gpiod_line_set_value(led, bOn);
      
    // wait for 10 seconds for the button to change
    ret = gpiod_line_event_wait(button, &ts);           
    if (ret == 1) 
    {
      struct gpiod_line_event event;
      // gets event
      gpiod_line_event_read(button, &event);
      // changes led state
      bOn = !bOn;        
    }    
    else
    {
      // when timeout ends
      break;
    }    
  }

  // turn off led;
  gpiod_line_set_value(led, 0);
  // Release lines and chip
  gpiod_line_release(led);
  gpiod_line_release(button);
  gpiod_chip_close(chip);
  //
  return 0;
}
  
Implementación en una breadboard

Desde Java

Java usa la librería Pi4J. Como la versión 2, incompatible con la 1, es aun experimental no vamos a poner ningún ejemplo

Además la versión 2 se apoya en la librería pigpio en lugar de la libgpiod que es la recomendada en las plataformas para empotrados basadas en Linux.

Para finalizar

Me parece una máquina tan potente y amigable que me sabe mal dejarla en un rincón para que haga de interfaz entre la Cloud y los dispositivos que puedan ir apareciendo por mi casa.

He elegido la RPi 4B sobretodo por la capacidad y facilidad que me da en el procesado de imágenes. Hay alternativas como Asus Tinker Board 2 y NVIDIA Jetson pero a un precio bastante superior.

Más información

El código

Puedes encontrar el código de este post en el repositorio de github: Consolidando.

Qué más

Comentarios