WiringPi no Banana Pi

O WiringPi (http://wiringpi.com) é uma biblioteca desenvolvida para o Raspberry Pi que permite a utilização dos pinos GPIO disponiveis no RPI.

O WiringPi original é exclusivo do RPI, no entanto devido às semelhanças entre os RPI e o BPI, o WiringPi foi também portado para o Banana Pi por outras entidades.

Para um sumário da instalação do software necessário para aceder aos pinos  GPIO do Banana Pi, está disponível em:

GPIO no Banana Pi

O software que funcionou foi o seguinte:

  • https://github.com/BPI-SINOVOIP/BPI-WiringPi
    Descrito já de seguida sobre o titulo Instalação do WiringPi no Banana Pi M1 no Debian 9.
  • https://github.com/BPI-SINOVOIP/BPI-WiringPi2-Python
    Descrito mais abaixo sobre o titulo: Wiring Pi no python com BPI-WiringPi2-Python no Banana Pi.

Ambos tem fork no meu repositório do github.

Instalação do WiringPi no Banana Pi M1 no Debian 9

Existem várias versões do WiringPi para o Banana Pi M1, umas da Sinovoip e outra da Lemaker.

Este documento relata a minha experiência com a versão da sinovoip do WiringPi disponivel no seguinte endereço:

https://github.com/BPI-SINOVOIP/BPI-WiringPi

nota: existe também uma nova versão no seguinte endereço:

https://github.com/BPI-SINOVOIP/BPI-WiringPi2

Voltando à instalação que é relativamente simples. No debian 9, bastam os seguintes comandos:

git clone https://github.com/BPI-SINOVOIP/BPI-WiringPi.git -b BPI_M1_M1Plus
cd BPI-WiringPi
chmod +x ./build
./build

Durante a compilação no debian 9 surgem alguns warnings mas a compilação termina sem problemas de maior.

Para desinstalar basta usar o seguinte comando:

./build uninstall

Após a instalação devemos efectuar alguns testes básicos para verificar se a instalação do wiringPi está funcional.

Teste ao WiringPi com o utilitário gpio no Banana Pi M1

Após a instalação terminar pode testar se o WiringPi está funcional com o comando:

gpio readall

Se tudo correr bem são exibidos todos os pinos numa tabela semelhante à seguinte imagem.

Nesta tabela está a identificação dos pinos segundo vários critérios (cpu, wiringpi, name), o modo de operação, o valor do pino e o numero físico do pino.

Os pinos GPIO de uso geral no Banana Pi que são compatíveis com os dos Raspberry Pi de 26 pinos são todos os que no nome têm GEN, são os seguintes, GEN0, 1, 2, 3, 4, 5 e GEN6.

Para além destes, tendo o Banana Pi 40 pinos, também tem os pinos GPIO de uso geral que existem a mais nos Raspberry Pi de 40 pinos, que são os pinos que têm no nome por GPIO.nn com nn igual a: 21, 22, 23, 24, 25, 26, 27, 28, 29, 30.

O próximo teste é acender e apagar LEDs com o WiringPi ligados aos pinos físicos, 12 e 16, correspondentes aos pinos 1 e 4 do WiringPi.

Para levar a cabo o teste é necessário ligar 1 LED em serie com uma resistência de 390 Ohms a cada cada um dos pinos (12 e 16) do banana pi.

Alem dos LEDs também estão ligados ao BPI um IMU e um sensor de distancia laser.

Depois de preparar os LEDs é tempo de experimentar acender e apagar os LEDs na shell do linux.

O controlo do GPIO no WiringPi funciona de forma semelhante ao do Arduino. Antes de usar um pino GPIO deveremos indicar previamente em que modo queremos que o pino esteja.

Para o efeito de controlo do estado de um LED é necessário colocar o pino no modo out, já que por pré definição os pinos de uso geral estão em modo in. Se estivermos na shell usa-se o seguinte comando

gpio mode 1 out

Posteriormente pode-se mudar o nível lógico do pino com o seguinte comando:

gpio write 1 1

Executando de novo o comando gpio readall, verifica-se que o modo e o valor do pino mudaram, e o LED ligado ao pino 12 acendeu.

Repetindo os mesmos dois comandos para o LED ligado pino 16 (wiringpi 4) e ficam os dois ligados.

Para apagar os LEDs troca-se o ultimo argumento do comando de 1 para 0, ou seja executa-se a seguinte linha:

gpio write 1 0

Posta esta experiência está confirmado o bom funcionamento da instalação do WiringPi no Banana Pi M1.

Para saber mais sobre o utilitário gpio consultar a seguinte pagina:

The GPIO utility

Teste a programas compilados com a biblioteca WiringPi no Banana Pi M1

Para testar programas compilados com a biblioteca WiringPi basta executar os exemplos disponíveis.

Existem vários exemplos disponíveis, como quero efectuar um teste rápido vou-me limitar a testar o funcionamento de um dos exemplos: o blink.c.

Estando na pasta principal do wiringPi executar o comando:

cd examples/

Depois editar o ficheiro blink.c e na linha 31 trocar o pino de 0 para 1.

Seguidamente basta compilar e executar com os seguintes comandos.

make blink
sudo ./blink

Caso necessitarmos de compilar um programa em C para aceder ao GPIO via wiringPi deveremos linkar com a respectiva bibloteca, conforme o seguinte exemplo:

gcc -Wall -o blink blink.c -lwiringPi

Programas em Python e WiringPi no Banana Pi M1

Depois de confirmar o bom funcionamento do wiringpi por si mesmo resolvi testar a sua exploração em Python.

Até ao momento testei as seguintes eventuais soluções:

Testei a instalação do wiringpi no python e python3 com o pip e pip3, que não funcionou.

Testei a instalação do BPI-WiringPi2-Python a partir do repositório do github, e não funciona em python3 apenas em python2.

Wiringpi no python e python3 com o pip e pip3 no Banana Pi

Segundo as informações que encontrei na net, existe um wrapper do wiringPi para o python2 para o Raspberry Pi, resolvi testar mas não funcionou, fica aqui o histórico da instalação, já que presumo que seja funcional num Raspberry Pi.

O código WiringPi para o python encontra disponível em:

https://github.com/WiringPi/WiringPi-Python

Para proceder à sua instalação basta executar o seguinte comando:

pip install wiringpi
pip3 install wiringpi

Se o pip e o pip3 não estiver instalado será necessário instalar com o seguintes comandos:

apt install python-pip
apt install python3-pip

Posteriormente podemos testar o funcionamento do python com o wiringpi com os seguintes programas:

 
import wiringpi
import time
 
wiringpi.wiringPiSetup()
 
wiringpi.pinMode(1,1)
 
while True:
    time.sleep(0.5)
    wiringpi.digitalWrite(1,1)
    time.sleep(0.5)
    wiringpi.digitalWrite(1,0)

Esta primeira tentativa de utilizar o python para aceder ao GPIO não correu bem. O LED nunca piscou.

Presumo que o problema reside na instalação que foi feita recorrendo ao pip. Eventualmente instalou algo mais apropriado para o Raspberry Pi. Terei que investigar mais o que é que falhou. Eventualmente experimentar a nova versão do BPI-WiringPi da sinovoip, ou instalar o wrapper compilando localmente.

Wiring Pi no python com BPI-WiringPi2-Python no Banana Pi

Esta solução especifica para os Banana Pi, mas que apenas funciona em python2, está disponível no seguinte endereço:

https://github.com/BPI-SINOVOIP/BPI-WiringPi2-Python

A instalação não é muito complicada. Possivelmente será simples se não aparecerem erros para serem resolvidos pelo caminho.

Segundo as instruções disponíveis no endereço acima, o BPI-WiringPi da sinovoip deve estar préviamente instalado.

Para instalar o BPI-WiringPi da sinovoip consultar as instruções mais acima, ou seguir as instruções disponíveis na página do BPI-WiringPi2-Python.

Também se pode seguir as instruções disponíveis na mesma página para instalar o BPI-WiringPi2-Python.

Caso não dê qualquer tipo de erro, para instalar o wiringpi para o python basta simplesmente os seguintes comandos:

git clone https://github.com/BPI-SINOVOIP/BPI-WiringPi2-Python.git -b BPI_M1_M1Plus
cd BPI-WiringPi2-Python
python setup.py install

No meu caso o ultimo comando dava o seguinte erro sobre a localização da instalação:

root@m5:~/src/BPI-WiringPi2-Python# python3 setup.py install
running install
error: can't create or remove files in install directory

The following error occurred while trying to add or remove files in the
installation directory:

[Errno 2] No such file or directory: '/usr/local/lib/python2.7/dist-packages/test-easy-install-18090.write-test'

The installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

/usr/local/lib/python2.7/dist-packages/

This directory does not currently exist. Please create it and try again, or
choose a different installation directory (using the -d or --install-dir
option).

A solução que encontrei foi criar essa pasta, pois não existia no servidor, com o seguinte comando:

mkdir /usr/local/lib/python2.7/dist-packages/

Seguidamente executei o install repetindo o comando:

python setup.py install

O processo de compilação exibiu alguns warnings mas terminou sem erros.

Efectuei o mesmo procedimento para o python3. Mas neste caso tive de criar mais uma directoria, e por isso executei os seguintes comandos:

mkdir /usr/local/lib/python3.5/
mkdir /usr/local/lib/python3.5/dist-packages/
python3 setup.py install

De novo o processo de compilação exibiu alguns warnings mas terminou sem erros.

Chegou a fase de testar a instalação, e para isso recorri ao ficheiro test.py.

Abri o ficheiro original e verifiquei que o setup do wiringPi estava no modo gpio, e o id do pino não batia certo. Rescrevi o código de modo a que o ficheiro test.py ficasse assim (indentação tem de ser reconstruida):

import wiringpi2 as wiringpi
import time

WIRINGPI_DEBUG = 1

wiringpi.wiringPiSetup()

wiringpi.pinMode(4,1)

while True:
time.sleep(0.5)
wiringpi.digitalWrite(4,1)
time.sleep(0.5)
wiringpi.digitalWrite(4,0)

Executei o test.py com o python3 e deu o seguinte erro:

root@m5:~/src/BPI-WiringPi2-Python# python3 test.py
Traceback (most recent call last):
File "/root/src/BPI-WiringPi2-Python/wiringpi2.py", line 18, in swig_import_helper
fp, pathname, description = imp.find_module('_wiringpi2', [dirname(__file__)])
File "/usr/lib/python3.5/imp.py", line 296, in find_module
raise ImportError(_ERR_MSG.format(name), name=name)
ImportError: No module named '_wiringpi2'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "test.py", line 1, in <module>
import wiringpi2 as wiringpi
File "/root/src/BPI-WiringPi2-Python/wiringpi2.py", line 28, in <module>
_wiringpi2 = swig_import_helper()
File "/root/src/BPI-WiringPi2-Python/wiringpi2.py", line 20, in swig_import_helper
import _wiringpi2
ImportError: /usr/local/lib/python3.5/dist-packages/wiringpi2-1.1.1-py3.5-linux-armv7l.egg/_wiringpi2.cpython-35m-arm-linux-gnueabihf.so: undefined symbol: PyString_FromStringAndSize

Executei o test.py com o python2  com o seguinte comando:

python test.py

E funcionou. Coloquei o wiringPi (em c)  a funcionar noutra sessão e este teste em python ficando os dois LEDs a piscar, conforme o seguinte video.

Postas estas experiências com o wiringpi no Banana Pi M1 ficou apenas por resolver o acesso ao GPIO pelo python3.

A próxima tentativa será instalar o RPi.GPIO para o Banana Pi M1

 

Fontes

Raspberry Pi – first steps to blink a LED with Python