Uma biblioteca construída para facilitar o acesso à GPIO da BeagleBone Black, desenvolvida em C++.
Em placas de desenvolvimento microcontroladas, especialmente as voltadas para iniciantes ou para o público maker (como o Arduino), o acesso a GPIO - seja para receber ou emitir sinais - é simplificado por meio de funções tais como: digitalWrite, pinMode, analogRead, entre outras.
No entanto, quanto se passa para ambientes microprocessados (isto é, baseados em um sistema operacional), tal processo fica bem mais complicado, pois é necessário acessar os drivers de dispositivo do sistema.
No caso do Linux, tais drivers se acessam como se acessa um arquivo (com o FILE em C, por exemplo). Ainda assim, é necessário que o desenvolvedor organize grandes blocos de código em funções, para manter o código limpo; gastando tempo.
Por conta disso, resolvi criar uma biblioteca, em C++, que facilita a o acesso à GPIO de uma placa microprocessada, baseada em Linux. Nesse caso, a placa é a BeagleBone Black e a biblioteca foi baseada no padrão do Arduino: procurei adaptar o nome das funções de modo que o desenvolvedor se sinta familiarizado.
Esse projeto também é um desafio pessoal, e um exercício do uso da linguagem C++ em Linux embarcado, visando a manipulação de drivers de dispositivo.
Essa é uma biblioteca simples, como poucas funções. Pretendo, no futuro, adicionar mais funcionalidades, como PWM, SPI, I2C e outros recursos.
- Placa de desenvolvimento BeagleBone Black
- SDK Texas Instruments
Aqui foi usada a versão 06_00_00_07.
- Sistema de arquivos Arago-base instalado na placa
Pois foi onde os testes foram realizados.
Para se certificar sobre quais pinos podem ser usados para quais funções (digitais, analógicos, etc.), consulte a pinagem oficial, logo abaixo.
//pinMode: habilita o pino e define o seu sentido (entrada/saída)
pinMode(50, OUTPUT);
//digitalWrite: escreve no pino o sinal requerido (ligado/desligado)
digitalWrite(50, 1);
//unexport_gpio: após o término da aplicação, os drivers dos GPIOs ainda continuam habilitados. Para desligá-los, é necessário desativá-los.
unexport_gpio(50);
//analogRead: lê um sinal analógico (de 0 a 4096)
int value = analogRead(0);
>> 726
//delay: função delay do arduino, em segundos (aceita valores decimais também)
delay(1);
delay(0.5);
//defining_sigaction: função específica para lidar com a captura de interrupções (como o Ctrl+C). Necessária para o exemplo a seguir.
defining_sigaction();
Para demonstrar a utilização dessa biblioteca, foi desenvolvido um exemplo, que consiste em um circuito de pisca leds alternados.
O funcionamento da aplicação é o seguinte: separou-se o programa em duas threads, de modo que uma é responsável pelo loop da piscagem dos leds, e a outra é responsável pela captura do sinal de interrupção (SIGINT). Se isso acontecer, um código é executado, desativando a GPIO e encerrando o programa.
Abaixo consta uma porção do código main.cpp (confira-o para mais detalhes).
int main(){
int led1 = 50;
int led2 = 51;
thread t1(main_loop, led1, led2);
thread t2(sigint_handler, led1, led2);
t1.join();
t2.join();
return 0;
}
O esquemático do circuito é apresentado abaixo:
Funcionamento do circuito:
Console
Se você quiser saber mais sobre a área de Linux embarcado, confira este trabalho, do mesmo autor, acerca do processo de desenvolvimento de um sistema embarcado baseado em Linux (em português brasileiro).
MIT