GPIO no Raspberry Pi

Os pinos disponíveis para o utilizador no Raspberry Pi usar nos programas variam conforme a versão do raspberry pi.

Alguns pinos gpio do Raspberry Pi têm funções especiais que permitem aceder a métodos de comunicação padrão:

  • serial
  • i2c
  • spi

Para além das comunicações, pelo menos um pino gera sinais PWM por hardware.

O utilizador pode fazer uso deles recorrendo a várias linguagem de programação. No seguinte endereço está disponível uma extensa lista de linguagens em que é possivel explorar os pinos GPIO no Raspberry pi, incluindo exemplos de programação:

  • https://elinux.org/RPi_GPIO_Code_Samples

O meu interesse foca-se essencialmente no C/C++ e python.

Em C podemos explorar o GPIO recorrendo aos seguintes métodos:

  • Acesso directo aos registos (Direct register access)
  • Acesso pelo sistema de ficheiros (sysfs)
  • Biblioteca WiringPi
  • Biblioteca bcm2835
  • Biblioteca pigpio

Em python podemos recorrer ás seguintes bibliotecas:

  • WiringPi2-python
  • RPi.GPIO
  • pigpio
  • RPIO

 

Pinos GPIO do Raspberry Pi

Os pinos GPIO disponíveis variam com a versão. As versões principais são de 26 e 40 pinos. Os primeiros 26 pinos são iguais entre as duas versões.

Um aspecto importante é respeitar os 3.3v, pois os pinos do raspberry não são tolerantes a 5v. Deste modo, dispositivos com lógica de 5v, como o caso dos arduinos, devem ter um conversor de nível lógico, ou um divisor de tensão, pelo meio.

Comunicação serial com o Raspberry Pi

A comunicação serial com o Raspberry Pi é efectuada fisicamente por 3 fios. Com ligação do tx (pino x), do rx (pino y) aos seus contrapartes no outro dispositivo, assim com a ligação entre terras (GND).

Comunicação serial entre Raspberry Pi e Arduino.

Comunicação  I2C no Raspberry Pi

Tanto quanto percebi existem alguns detalhes importantes na comunicação por i2c no Raspberry Pi.

Raspberry Pi master

Raspberry Pi slave

https://www.raspberrypi.org/forums/viewtopic.php?t=235740

 

Comunicação  Raspberry Pi com arduino por i2c

A comunicação entre o Raspberry Pi e o arduino por i2c é

ep

Ligação Raspberry Pi com stm32 por i2c

Ligação Raspberry Pi com esp8266 por i2c

a experimentar

Ligação Raspberry Pi com esp32 por i2c

a experimentar

Acesso directo aos registos

A exploração do GPIO por acesso directo aos registos não requer a instalação de nenhuma biblioteca.

https://elinux.org/RPi_GPIO_Code_Samples#Direct_register_access

Sysfs

A exploração do GPIO pelo sysfs não requer a instalação de nenhuma biblioteca.

https://elinux.org/RPi_GPIO_Code_Samples#sysfs

Biblioteca bcm2835

https://elinux.org/RPi_GPIO_Code_Samples#bcm2835_library

http://www.airspayce.com/mikem/bcm2835/

Biblioteca WiringPi

 

Controlar servos com o Wiringpi em C

Existem funções para efectuar o controlo de servos que não fazem parte da biblioteca do Wiringpi em C, mas que existem disponíveis no respectivo código fonte.

Descobri isso quando experimentei controlar um servo sg90 e a compilação terminou com erro.

gcc -o sg90_m1_v1 sg90_m1_v1.c -lwiringPi -lpthread -lcrypt -lm -lrt
/tmp/ccuuqfNq.o: In function `main':
sg90_m1_v1.c:(.text+0x58): undefined reference to `softServoSetup'
sg90_m1_v1.c:(.text+0x62): undefined reference to `softServoWrite'
collect2: error: ld returned 1 exit status

Como achei estranho existir o ficheiro softServo.h, e as funções não existirem na biblioteca resolvi investigar e conclui que existe um ficheiro softServo.c correspondente, e que é possível compilar uma solução para controlo de servos com o wiringPi em C.

Para o efeito basta localizar e copiar o ficheiro softServo.c para a pasta do projecto e inclui-lo na compilação.

locate softServo
/home/ubuntu/src/wiringPi/wiringPi/softServo.c
/home/ubuntu/src/wiringPi/wiringPi/softServo.h
/usr/local/include/softServo.h


cp /home/ubuntu/src/wiringPi/wiringPi/softServo.c .

gcc -o sg90_m1_v1 sg90_m1_v1.c softServo.c -lwiringPi -lpthread -lcrypt -lm -lrt

 

Biblioteca RPi.GPIO

Fontes a explorar

https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/

Biblioteca pigpio

Instalação descrita no seguinte link

http://abyz.me.uk/rpi/pigpio/download.html

Os números usados pelo pigpio para identificar os pinos são os BCM.

Para executar programas que requerem sudo para ser executados, que são uma situação vulgar quando se explora os pinos GPIO no raspberry pi, podemos proceder da seguinte forma:

sudo chown root:root nome_programa
sudo chmod 4755 nome_programa

 

Comparação das bibliotecas para GPIO

https://gist.github.com/jperkin/e1f0ce996c83ccf2bca9

 

Fontes a explorar

https://www.bigmessowires.com/2018/05/26/raspberry-pi-gpio-programming-in-c/

SPRITE

 

 

Special Pin Functions

Comparação da performance das várias bibliotecas

Raspberry Pi 2 vs. 1 GPIO Benchmark

https://github.com/perimeno/LIO

How to use WiringPi2 for Python with pull-ups or pull-downs and PWM – pt 2

How to use WiringPi2 for Python on the Raspberry Pi in Raspbian part 1

How to install WiringPi2 for Python on the Raspberry Pi