Atualmente, existe no mercado uma vasta quantidade de placas que suportam Linux embarcados. A Orange Pi One se destaca entre elas pelo seu custo benefício, oferecendo boas configurações a um baixo custo, em média $10,00 contra $25,00 a $30,00 da Raspberry Pi.

O principal fator que, provavelmente, desmotiva as pessoas a adquirir a Orange Pi One é sua documentação ou, melhor dizendo, sua falta de documentação, pois é extremamente difícil encontrar exemplos e dados técnicos acerca deste produto. Aliás, muitas vezes é preciso recorrer ao datasheet do processador para encontrar as informações necessárias.

De qualquer modo, como a ideia é apresentar um artigo sobre uma placa diferente da Raspberry Pi, nada melhor do que utilizar uma linguagem diferente de Python e Linguagem C, as quais foram abordadas em artigos anteriores.

Para quem tiver dificuldade de entender os exemplos que vão ser apresentados, recomendo a leitura Introdução ao Shell Script, no qual você vai encontrar os conceitos que serão abordados em exemplos.

Exemplos com Orange Pi One

No primeiro exemplo, temos o pino PA12 configurado como saída e nele temos um led vermelho conectado para ilustrar melhor o funcionamento do script. No código abaixo, foram removidos os comentários, porém, se houver interesse em acessá-los, é possível acessar o código completo no Github.

#!/bin/sh
echo 12 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio12/direction
echo 0 > /sys/class/gpio/gpio12/value

trap "echo 12 > /sys/class/gpio/unexport; exit 0" 1 2 15

while true
do
        echo 1 > /sys/class/gpio/gpio12/value
        sleep 1
        echo 0 > /sys/class/gpio/gpio12/value
        sleep 1
done

Demonstração do exemplo 1

Um detalhe importante, que merece ser ressaltado, é o funcionamento do export das GPIO. Como não temos um mapeamento interno no kernel delas, o export deve ser realizado como base no port e pino. Eis que, desta forma, teremos uma conta que deve ser realizada para descobrirmos o valor correto da GPIO.

echo xx > /sys/class/gpio/export

xx corresponde à conta abaixo:

(Posição da letra no alfabeto – 1) * 32 + número do pino

Ex: PA12

( 1 – 1 ) * 32 + 12 = (0 * 32) + 12 = 12

echo 12 > /sys/class/gpio/export

Ex: PD14

( 4 – 1 ) * 32 + 12 = 3 * 32 + 14 = 110

echo 110 > /sys/class/gpio/export
Distribuição das GPIOs na barra de pinos. da Orange Pi One
Figura 1: Distribuição das GPIOs na barra de pinos da Orange Pi One.

Outro detalhe que precisamos prestar atenção é na corrente máxima de saída que o pino consegue fornecer. Neste caso, o datasheet nos informa que a corrente máxima é de 40 mA, página 607 Allwinner H3. Neste caso, foi utilizado um resistor de 330 Ohms em série com o Led, a fim de limitar sua corrente em 10 mA.

No segundo exemplo, teremos o pino PA06 configurado como saída e o PA11 como entrada. O funcionamento do código consiste em verificar via Poll se o botão (PA11) foi pressionado, e caso seja, o Led amarelo (PA06) será apagado.

#!/bin/sh
echo 11 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio11/direction
echo 6 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio6/direction
echo 0 > /sys/class/gpio/gpio6/value

trap "echo 11 > /sys/class/gpio/unexport; echo 6 > /sys/class/gpio/unexport; exit 0" 1 2 15

while true
do
	botao=$(cat /sys/class/gpio/gpio11/value)
	if [ "$botao" -eq 1 ];
		then
			echo 1 > /sys/class/gpio/gpio6/value
		else
			echo 0 > /sys/class/gpio/gpio6/value
	fi
sleep 0.5
done

Demonstração do exemplo 2

No código do exemplo 2, é necessário realizar duas ressalvas: a primeira é que no caso do pino de entrada (PA11) foi adicionado um resistor de pull-up externamente, com a finalidade de limitar a corrente de entrada.

A segunda, consiste no aspecto que a adição do comando sleep 0.5, que nos traz um atraso de, aproximadamente, 500 ms na leitura do pino. Entretanto, caso não seja inserido, o processador terá seu uso em 100%. Isso porque o código estando num loop infinito, as operações descritas no script serão realizas de forma ininterrupta, ocasionando o uso excessivo do processador.

Destaca-se que outra maneira de executar esse código será a análise da troca de estado do pino por interrupção. Nesse caso, não teríamos atraso na leitura e nem usaríamos em excesso o processador.

Recomendo o artigo Lendo um pino de I/O por interrupção no Linux, do Blog do Sergio Prado, para que você possa obter maiores informações de como é possível utilizar esse método de evento para validar se o botão foi pressionado.

Referências

https://linux-sunxi.org/GPIO
https://linux-sunxi.org/images/4/4b/Allwinner_H3_Datasheet_V1.2.pdf
https://bit.ly/2kmPLJ1
https://www.mhavila.com.br/topicos/unix/shscript.html