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/
Comparação da performance das várias bibliotecas
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