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
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
