Manual

do

Maker

.

com

Instalar e usar Python na Onion Omega

Instalar e usar Python na Onion Omega

No artigo anterior sobre programação no Onion Omega mostrei como preparar um ambiente de compilação do firmware, que é baseado em OpenWRT. Também mostrei como utilizar uma toolchain para fazer cross-compiling para o Onion Omega a partir de qualquer computador com Linux. Nesse artigo mostrarei como utilizar python na Onion Omega.

A imagem é muito bonita, mas nela estou mostrando a expansão relé. Como estamos falando de PWM, seria melhor ter mostrado a expansão servo, mas a foto não ficou tão bonita. Então, aos haters, explicada está a situação.

Uma prévia sobre o PWM

Para quem é de Arduino, a forma de controlar PWM é bastante simples e de alto nível. Basicamente, o PWM é Pulse Width Modulation ou, modulação da largura de pulso. O parâmetro fundamental é o tempo. Já escrevi alguns artigos sobre PWM com PIC, aqui não será tão baixo nível, mas um entendimento prévio se faz necessário porque também não é igual é feito em Arduino.

O sinal PWM é um sinal digital composto por Ton, Toff e ciclo na linha do tempo. O duty cycle indica a porcentagem de tempo que um sinal está em HIGH. Já a frequência determina o periodo total de um pulso.

pwm-graph.webp

Supondo um LED (que é a forma visual mais simples de exemplificar). Repare no gráfico 3 ciclos, sendo o primeiro ficando em HIGH 50% do tempo do comprimento de pulso. Nesse caso, estaremos no ponto médio de luminosidade do LED. Já o segundo pulso fica em HIGH apenas 10% do tempo de pulso, fazendo assim com que a luminosidade do LED seja bastante baixa. Por fim, o último pulso está a 90%, mantendo o LED iluminando quase em sua totalidade. Isso não significa que o LED está recebendo menos ou mais energia, ele apenas está piscando mais rápido ou mais lento, sendo imperceptível aos nossos olhos.

A primeira coisa que você tem desse sinal é a frequência. A frequência é a quantidade de tempo em milisegundos para cada ciclo. Mudar oper o perido também modificará a frequência do sinal PWM. Para mudar a frequência:

Frequency = \frac{1}{Period}

O Duty Cycle indica a porcentagem de tempo que um sinal estará em HIGH durante o ciclo. Se estiver em 25%, então o sinal estará em LOW 75% do tempo por ciclo, simples assim. O cálculo para o Duty Cycle é simples também:

DutyCycle = \frac{T\_on}{T\_CompleteCycle}100%

Pode ser que você esteja se questionando do porque de tantos detalhes sobre PWM se o artigo é sobre Python no Onion Omega, mas na verdade escreverei alguns artigos sobre controle de servos e se você tiver os conceitos prévios, ajudará bastante no entendimento de uma forma geral.

O expansor de servos

A expansão de servos tem 16 canais para gerar PWM e esses canais estão distribuidos de forma a conectar os servos diretamente nos headers. Por último, essa expansão tem algo fundamental; imagine ter 16 canais para ligar servos. Quanta corrente seria necessária? Pois bem, a expansão conta com um conector jack para que você fornecer alimentação aos servos. Se você pretende utilizar uns 2 servos ligados simultaneamente, pode dispensar a alimentação externa, mas para o robô com 12 servos que apresentarei aqui será fundamental utilizar esse recurso.

A última importante informação sobre PWM é que o chip tem um oscilador com capacidade de gerar frequencias PWM entre 24Hz e 1526Hz. A maioria dos servos operam à 50Hz, sendo essa a frequência padrão. Tendo levantado todos esses conceitos, vamos à instalação do Python.

Instalar Python no Onion Omega

O sistema operacional da Onion Omega é o OpenWRT, como já citado. Ele conta com um gerenciador de pacotes que lembra um pouco o apt. Basicamente, faça o update e a instalação do Python e do módulo de controle PWM:

opkg update
opkg install python-light pyPwmExp

python-instalation.webp

Para usar o módulo instalado em /usr/lib/python2.7/OmegaExpansion/ simplesmente importe-o:

from OmegaExpansion import pwmExp

Funções do módulo

Primeiramente, você deverá inicializar o módulo e pegar seu status. Se for 0, o módulo não foi inicializado. Se for um, tudo certo.

initOk = pwmExp.driverInit()

if not initOk:
    print "Nao inicializado. Saindo..."
    exit(-1)

Para checar o status do expansor e se o oscilador está rodando, uma função especifica pode rodar em um loop ou apenas na inicialização:

isOk = pwmExp.checkInit()

if not isOk:
    print "O expansor nao foi inicializado. Saindo..."
    exit(-1)

print "Inicializado com sucesso. Seguindo..."

Para gerar um sinal PWM, uma função lhe permite fazê-lo sobre um canal específico. Estão disponíveis 16 canais, indo de 0 à 15 e -1 gerará o sinal em todos os canais simultaneamente. O duty especificado é uma porcentagem PWM de 0 à 100. Utilizando com servos comuns, você deverá manter esse valor em 0.

Valores de ponto flutuante são permitidos. Se quiser fazer um duty cycle de 8.76% no canal 9, basta chamar desse modo:

stat = pwmExp.setupDriver(9,8.76,0)

Fácil demais, não? Um sinal mantido em HIGH no canal 10:

stat = pwmExp.setupDriver(10,100,0)

Aqui bagunça o coreto. Se você quiser fazer um delay de 10% com duty de 30.20 em todos os canais:

stat = pwmExp.setupDriver(-1,30.20,10)

Se você estiver mexendo com servos, mais uma vez eu digo; não mude a frequência. Se por alguma razão você precisar fazê-lo:

pwmExp.setfrequency(novaFrequencia)

O parâmetro de frequencia também é ponto flutuante.

Pra finalizar, o oscilador pode ser desabilitado, parando assim todas as gerações de sinal PWM:

stat = pwmExp.disableChip()

Até aqui você já pode observar o funcionamento do PWM e já tem informações suficientes para começar escrever seus programas em Python diretamente no OnionOmega. Acredito que a vantagem de escrevê-los em Python está justamente na otimização do tamanho do programa, uma vez que eles são basicamente arquivos texto, enquanto se programando em C, cada binário deverá ocupar um espaço maior que um arquivo texto pequeno no sistema de arquivos (4KB de vazio à poucas linhas).

Se voê ainda não adquiriu sua Onion Omega, está mais do que na hora de fazê-lo, porque levará um tempo até que ela chegue. Visite o site e conheça mais.

Agora vou escrever outro artigo, que será a segunda parte da movimentação do braço robótico, agora utilizando Python, não deixe de acompanhar inscrevendo-se no newsletter. Não se preocupe, não haverá nenhum tipo de spam, você só receberá os artigos novos de forma automática, sequer sei quem se inscreveu.

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.