Usando GPIO e PWM no Linux Embarcado

Este artigo tem como objetivo mostrar a configuração e uso das funções GPIO e PWM no Linux Embarcado. Ambos são funções amplamente utilizadas em projetos de eletrônica, tradicionalmente em sistemas microcontrolados – e, portanto, aprender como fazer uso delas em sistemas Linux embarcado é muito interessante.

 

 

Acessando GPIO através de Linux embarcado

 

Os pinos de entrada e saída de uso geral, do inglês General Purpose Input/Output – GPIO, são portas utilizadas para prover uma interface entre variados periféricos e o microcontrolador/microprocessador. Leitura de botões e sensores digitais (bit banging), o controle de um atuador e até mesmo o uso para debug são exemplos de utilização desse recurso. Este artigo tem como objetivo apresentar o uso da GPIO do módulo Colibri iMX6 com a placa de desenvolvimento Aster Carrier Board, ambos da Toradex.

 

Antes de iniciarmos a configuração de I/O, é necessário conhecer os pinos disponíveis para manipulação. Embora a escolha dos pinos seja similar para diferentes plataformas embarcadas disponíveis no mercado, cada uma delas tem suas particularidades. O módulo Colibri iMX6, escolhido para emprego neste artigo, tem prontamente disponível 32 GPIOs, e na placa Aster Carrier Board,  8 pinos de GPIO já estão presentes no conector padrão Arduino. Alguns outros pinos estão disponíveis no header padrão Raspberry Pi, e suas funções podem ser encontradas com mais detalhes no datasheet da Aster.

 

É importante descrever como é formatado o mapeamento e nomenclatura dos pinos de GPIO do módulo iMX6. A maioria dos pinos no SoC podem ser configurados com diferentes funções (multiplexados), e uma delas é GPIO.

 

O padrão SODIMM 200 possui duzentos pinos para conexão e muitas das vezes o número do pino no conector não corresponde ao número usado para GPIO. Como o processador i.MX6 possui controladores que podem atuar em até 32 GPIOs, a expressão abaixo descreve a correspondência entre os valores do controlador, GPIO correspondente e a o valor numérico simbólico.

 

32 x (controller - 1) + gpio

 

Exemplo: GPIO1_IO00 = 0, GPIO2_IO04 = 36

 

O kernel do Linux utiliza somente representação numérica para o seu subsistema de GPIO e também na interface sysfs, e por isso a fórmula acima é importante. A tabela das funções padrão e alternativas dos 200 pinos do módulo podem ser encontrados no seu datasheet.

 

Com relação à Aster, neste artigo serão utilizados os pinos do header Arduino. Vamos focar nos conectores X17 e X18, que possuem pinos de GPIO e PWM por padrão. O modo como são configurados está apresentado nas tabelas a seguir:

 

Conector X17:

 

Conector X18:

 

A maneira mais simples de acesso a pinos de I/O no Linux é feita usando o sysfs, através de arquivos exportados no diretório /sys/class/gpio/. Para acessar um pino de I/O é necessário primeiramente exportá-lo para torná-lo controlável. Depois é preciso configurar a direção do pino no arquivo /direction  e por último o estado do pino no arquivo /value.

 

Por exemplo, para utilizar o GPIO 8 como saída em nível alto deve-se fazer:

 

De forma semelhante, para utlizar o GPIO 7 como pino de entrada e realizar sua leitura, deve-se fazer: 

 

Para exemplificar o uso de GPIO foram escritos dois códigos simples em linguagem C que manipulam os GPIOs como nos comando anteriores.

 

 

E para leitura do pino:

 

 

E a seguir um simples blink led em Python:

 

 

Para ilustrar o uso de GPIO, o vídeo abaixo demonstra o controle liga/desliga de um LED:

 

 

 

Configurando sinal PWM em Linux embarcado

 

A técnica de PWM é empregada em diversas áreas da eletrônica, talvez a mais comum seja a utilização em fontes chaveadas mas também pode ser utilizada para controle de velocidade de motores, controle de luminosidade, controle de servo motores e diversas outras aplicações. PWM significa "Pulse Width Modulation" ou Modulação de Largura de Pulso, ou seja, através da largura do pulso de uma onda quadrada é possível o controle de potência ou velocidade.

 

Nesta seção do artigo iremos utilizar o módulo Colibri iMX6 com a Aster Carrier Board da empresa Toradex. Para utilizar o pinos de PWM do módúlo Colibri iMX6 usa-se o mesmo princípio aplicado na seção de GPIO, a manipualção de arquivos.

 

Módulo Colibri iMX6:

 

Toradex Name

NXP/Freescale Name

sysfs path

Note

PWM_A

PWM3

/sys/class/backlight/backlight.15/

Used for backlight control

PWM_B

PWM1

/sys/class/pwm/pwmchip0/

-

PWM_C

PWM4

/sys/class/pwm/pwmchip3/

-

PWM_D

PWM2

/sys/class/pwm/pwmchip1/

-

 

Para este artigo vamos utilizar o PWM_B, então primeiro deve-se exportar o PWM dentro do diretório /sys/class/pwm/pwmchip0, configurar o período e duty cycle em nanosegundos, e por fim habilitar a saída.

 

O exemplo em Shell Script abaixo apresenta a configuração  de um sinal PWM de 1kHz a 25% de duty cycle.

 

 

O exemplo em C a seguir executa a mesma configuração de PWM:

 

 

Obtendo como resultado o sinal PWM apresentado nas imagens seguintes:

 

 

 

Para ilustrar o uso do PWM, o vídeo abaixo apresenta o controle de luminosidade de um LED:

 

 

E com isso chegamos ao final deste artigo, aplicando as informações que recebemos para demonstrar na prática seu funcionamento. Até logo!

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Pedro Henrique Pereira
Engenheiro eletrônico pela Universidade de São Paulo. Começou no mundo de embarcados programando microcontroladores de 8 bits em curso técnico, passou pelo mundo do linux embarcado e hoje trabalha com projetos de Machine Learning. Interesse em complexidade de algoritmos de IA em edge-devices.

Deixe um comentário

avatar
 
  Notificações  
Notificar