Go com Intel Edison lendo um botão.

Continuação do post sobre Go no Intel Edison

Continuando com a diversão com o Intel Edison e a linguagem Go, esse é um pequeno exemplo de como ler o estado de um botão e usar esse estado para exibir uma mensagem na tela e para acender um LED.

Para facilitar o entendimento vamos ver duas formas de implementação, uma com tudo em um único arquivo e outra com um código mais organizado.

Primeiro exemplo

Crie um arquivo com o nome button.go e entre com o código abaixo.

package main

/*
#cgo LDFLAGS: -lmraa
#include <mraa.h>

#define LED_PIN    5       // Terminal do LED
#define BTN_PIN    6       // Terminal do botão

mraa_gpio_context ledPin;  // guarda o contexto do led
mraa_gpio_context btnPin;  // guarda o contexto do botão

void config(void) {
    mraa_init();    // Inicia a biblioteca MRAA
    ledPin = mraa_gpio_init(LED_PIN);
    btnPin = mraa_gpio_init(BTN_PIN);

    // Define que o terminal do LED é de saída
    mraa_gpio_dir(ledPin, MRAA_GPIO_OUT);

    // Ajusta o estado do LED para iniciar apagado
    mraa_gpio_write(ledPin, 0);
}

int readButton(void) {
    return (mraa_gpio_read(btnPin));
}

void writeLED(int v) {
    mraa_gpio_write(ledPin, v);
}

*/
import "C"
import "fmt"

func main() {
	C.config()

	for {
		if C.readButton() == 1 {
			C.writeLED(1)
			fmt.Println("Botão pressionado.")
		} else {
			C.writeLED(0)
			fmt.Println("Botão liberado.")
		}
	}
}

Basicamente o que o código faz é criar três funções em C, uma para configurar o ambiente que chamei de config() outra para ler o estado da porta do botão que chamei de readButton() e por fim uma função para escrever na porta do LED que chamei de writeLED(). Como a MRAA é escrita em C poderíamos ter usado as chamadas das funções direto do código Go, mas eu acredito que dessa forma fica muito confuso, o ideal é escrever pequenas funções em C que escondem a complexidade da biblioteca que estamos tentando usar, assim também deixamos a pegada de código C menor possível dentro do nosso fonte em Go.

Compilando

Para compilar esse exemplo basta rodar o seguinte comando.

go build botao.go

E para executar basta chamar o programa com o comando:

./button

Organizando o código

Vai funcionar mas não esta bonito, principalmente se nosso programa crescer e começarmos a adicionar outros acessos ao hardware, o melhor a fazer nesse caso é dividir o código em múltiplos arquivos, dessa forma o código em C fica separado do código em Go e muito mais legível. Outra boa pratica é compilar o seu código em C em uma biblioteca estática “.a”.

button.h

Primeiro vamos criar o arquivo button.h que vai conter as declarações das funções que vamos usar.

#ifndef __BUTTON_H__
#define __BUTTON_H__

void config(void);
int readButton(void);
void writeLED(int v);

#endif

Limpando o fonte original

Agora vamos mover as funções C do arquivo button.go para o arquivo button.c

#include <mraa.h>
#include "button.h"

#define LED_PIN    5       // Terminal do LED
#define BTN_PIN    6       // Terminal do botão

mraa_gpio_context ledPin;  // guarda o contexto do led
mraa_gpio_context btnPin;  // guarda o contexto do botão

void config(void) {
    mraa_init();    // Inicia a biblioteca MRAA
    ledPin = mraa_gpio_init(LED_PIN);
    btnPin = mraa_gpio_init(BTN_PIN);

    // Define que o terminal do LED é de saída
    mraa_gpio_dir(ledPin, MRAA_GPIO_OUT);

    // Ajusta o estado do LED para iniciar apagado
    mraa_gpio_write(ledPin, 0);
}

int readButton(void) {
    return (mraa_gpio_read(btnPin));
}

void writeLED(int v) {
    mraa_gpio_write(ledPin, v);
}

E também vamos modificar o arquivo button.go para ter apenas uma chamada para o nosso arquivo de inclusão button.h e uma chamada para a biblioteca button.a que vamos gerar no Makefile.

package main

/*
#cgo LDFLAGS: -lmraa button.a
#include "button.h"
*/
import "C"
import "fmt"

func main() {
	C.config()

	for {
		if C.readButton() == 1 {
			C.writeLED(1)
			fmt.Println("Botão pressionado.")
		} else {
			C.writeLED(0)
			fmt.Println("Botão liberado.")
		}
	}
}

Note como o código Go ficou bem mais claro sem todo aquele código C.

Makefile

Por fim vamos criar um Makefile que vai compilar o nosso programa já gerando a biblioteca button.a que o nosso código Go vai usar.

all:
	gcc -c -Wall -O2 -lmraa button.c
	ar rvs button.a button.o
	go build button.go

clean:
	rm -f button.o button.a button

Compilando com make

Para compilar é só usar o comando make:

make

E para ver funcionando basta chamar o programa da mesma maneira que fizemos antes:

./button
comments powered by Disqus