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








Olá Rodrigo, boa tarde.
A referente de PA como entrada é com GND ou 3,3V? qual valor do resistor de Pull up que utilizou?
Obrigado,
Fabricio
Que legal cara! Tu vai ver que a plaquinha apesar de bem simples é bem poderosa. E claro, me mantem informado. Se tiver interesse, não precisa nem divulgar só para mim, pode fazer um post aqui no Embarcados. Garanto que devem ter mais pessoal além de nós que tem interesse em criar uma distro para essa placa.
Rodrigo Arnhold, você já fez alguma compilação com o yocto para a orange pi?
Não fiz ainda, mas está na minha lista de prioridades.
Eu tô querendo comprar uma para brincar com o yocto, mas ainda to com receio, pq não achei ninguém utilizando com ela.
É, esse é o detalhe ruim dessa placa, não tem muita documentação e exemplos de projetos na internet. Mas vou tentar agilizar os testes com o Yocto e se tiver sucesso posto aqui no Embarcados.
É, esse é o detalhe ruim dessa placa, não tem muita documentação e exemplos de projetos na internet. Mas vou tentar agilizar os testes com o Yocto e se tiver sucesso posto aqui no Embarcados.
Rodrigo, chegou minha orange pi novinha direto da china kkk, vou começar a brincar com ela daqui uns dias, vou tentar compilar o yocto para ela, qualquer novidade te mando.
Que legal cara! Tu vai ver que a plaquinha apesar de bem simples é bem poderosa. E claro, me mantem informado. Se tiver interesse, não precisa nem divulgar só para mim, pode fazer um post aqui no Embarcados. Garanto que devem ter mais pessoal além de nós que tem interesse em criar uma distro para essa placa.
Tenho só que esperar o semestre na faculdade, mas vou fazer sim.