Categorias

Raspberry Pi, construa aplicações para seu cotidiano

Os avanços tecnológicos habilitaram novas plataformas para desenvolvimento de produtos de software e hardware. Projetistas podem optar em desenvolver softwares para computadores de mesa (Desktop), celulares e Smartphones e equipamentos de monitoração (microcontroladores). É possível encontrar outras plataformas inferiores mas que também são consideradas pequenos computadores.

Ao desenvolver um software, necessitamos que ele seja portável para outras plataformas e rode nos mais diversos dispositivos independente de suas diferenças de hardware. Como exemplo as aplicações Android, existem centenas de celulares com utilizam o sistema operacional Android e todos eles podem possuir hardwares diferentes, no entanto, o desenvolvedor apenas especifica a partir de qual sistema operacional deve operar e se possui alguma restrição de periférico de hardware (bússola, GPS, etc). No caso de aplicações que rodam em sistemas operacionais diferentes, como exemplo Android e iOS, os códigos e as abstrações do hardware são diferentes, neste caso há necessidade de desenvolver para ambas plataformas e utilizar as linguagens especificas de cada uma. Quanto mais portável for seu código melhor.

Neste artigo, o foco principal é o Raspberry Pi, considerado o menor computador do mundo, possui o tamanho de um cartão de crédito, conexões USB para conectar o teclado e mouse utilizado em computadores de mesa, você pode conectá-lo a TVs com saída RCA ou HDMI. O melhor disso tudo é o baixo custo.

A fundação RASPBERRY PI FOUNDATION desenvolveu este computador com o intuito de capacitar pessoas de todas as idades a explorar a computação e aprender a programar em linguagens como Python e Scratch. Você pode fazer tudo que faria em seu computador de mesa, acessar a internet, abrir arquivos de texto e planilhas, tocar vídeos de alta definição e rodar alguns jogos.

As vantagens não param por ai, você pode interagir com o mundo externo utilizando chaves (Switch), realizar atuações emitindo sons ou luz (led), realizar monitoramento com câmeras RGB ou câmeras infravermelho.

O sistema operacional utilizado pelo Raspberry Pi é uma distribuição Linux baseado na versão Debian, muitas bibliotecas estão disponíveis o que aumenta seu poder de desenvolvimento. Ao desenvolver aplicações com a linguagem C/C++, ela é facilmente portável para qualquer distribuição Linux e com um pouco mais de esforço gera-se uma distribuição para plataforma Windows.

Os pinos disponíveis para programação contém entradas digitais e saídas digitais (GPIOs), este é o ponto fraco do Raspberry Pi pois em algumas aplicações são utilizados sensores analógicos. Para suprir esta necessidade são encontrados módulos que fornecem conversores AD que são facilmente conectados a seu hardware e habilitam o trabalho com sensores analógicos.

Para prover comunicação entre computadores é possível conectá-lo em rede utilizando o padrão Ethernet, ou através de um dongle Wi-fi ou realizar comunicação serial que utiliza a porta serial (UART).

Para programá-lo devemos optar por uma linguagem suportada, entre elas estão C/C++, Ruby, Perl, Python, Scratch, Java. Shell script, Lazarus e/ou Basic.

Agora que já conhecemos boa parte das características deste pequeno e poderoso computador, vamos deixar esta experiência um pouco mais excitante apresentando um código escrito em linguagem C que utiliza a biblioteca wiringPi.

O exemplo seguinte apresenta como configurar a porta GPIO 22 como saída e a porta GPIO 17 como entrada. É necessário um diodo emissor de luz, uma chave (Switch) e 2 resistores de 330 Ohms. A montagem é simples e deve seguir a figura 1.

raspberry-pi-montagem-de-led

O código gerado tem como objetivo monitorar a chave, o led deve alternar entre aceso e apagado em cada instante que a chave for pressionada. Segue abaixo o código gerado.

main.cpp

#include 

int main (void){
    int ligado=0, chave=0; // variáveis de controle
    wiringPiSetup () ;   // configuração da biblioteca WiringPi
    pinMode (0, INPUT) ; // configuração do pino GPIO 17 como entrada
    pinMode (3, OUTPUT) ; // configuração do pino GPIO 22 como saída
    for (;;) // Laço infinito
    {
        chave=digitalRead(0); // Verifica o status da chave
        if(chave==HIGH){
           if(!ligado){  
               digitalWrite (3, HIGH) ; // escreve "1" na porta GPIO 22
               delay (500) ; // pausa para ligar
               ligado=1;
           }
           else{
               digitalWrite (3, LOW) ; // escreve "0" na porta GPIO
               delay (500) ; // pausa para desligar
               ligado=0;
           }
       }  
    }
    return 0 ;
}

CMakeLists.txt

SET(sampleName exemplo1)
SET(PRJ_NAME "EXAMPLE_${sampleName}")

# ---------------------------------------
# Declare a new CMake Project:
# ---------------------------------------
PROJECT(${PRJ_NAME})

# Configura a versão mínima do CMake:
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
if(COMMAND cmake_policy)
      cmake_policy(SET CMP0003 NEW)  # Required by CMake 2.7+
endif(COMMAND cmake_policy)

# ---------------------------------------------------------------------------
# Configura o diretório de saida 
# ---------------------------------------------------------------------------
SET(EXECUTABLE_OUTPUT_PATH ".")

SET(main.cpp)


#configura diretório do WiringPi
SET(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR})
SET(CMAKE_CXX_FLAGS "-o3 -w")
SET(CMAKE_CXX_LINK_FLAGS "-pg")
SET(CMAKE_CXX_FLAGS "-pthread -I/usr/local/include -L/usr/local/lib -lwiringPi")
SET(wiringPi_LIBRARIES wiringPi wiringPiDev) 


SET_TARGET_PROPERTIES(
	${sampleName} 
	PROPERTIES 
	PROJECT_LABEL "(EXAMPLE) ${sampleName}")

# Add special defines needed by this example, if any:
SET(MY_DEFS )
IF(MY_DEFS) # If not empty
	ADD_DEFINITIONS("-D${MY_DEFS}")
ENDIF(MY_DEFS)

# Adiciona bibliotecas necessárias para linkar:
TARGET_LINK_LIBRARIES(${sampleName} 
        
	"rt"  # Optional extra libs...
	)


# Configura construção otimizada:
IF(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_BUILD_TYPE MATCHES "Debug")
	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -fpermissive ")
ENDIF(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_BUILD_TYPE MATCHES "Debug")

Para compilar o exemplo 1 você deve primeiro verificar as dependências de compilação declaradas no arquivo CMakeLists.txt, se concluído com sucesso realizar o processo de Linkage.

$ cmake .
$ make

Para executar o exemplo 1 você precisa baixar e instalar a biblioteca wiringPi, é possível baixar e encontrar informações de instalação e configuração no site wiringPi, as aplicações geradas necessitam ser executadas como super-usuário (administrador).

$ sudo exemplo1

Neste artigo foi apresentada uma solução simples, no entanto, com estes conceitos já é possível desenvolver aplicações mais avançadas. Entre as propostas que podem ser desenvolvidas estão ativação de luz em ambientes, ativação de bombas hidráulicas para irrigação, ativação de motores elétricos, monitoramento de presença em ambientes (sensores infravermelho digitais). Para construção de alguns destes projetos basta adicionar um relê de acordo com a tensão de trabalho do sistema.

É valido ressaltar que a capacidade do Raspberry Pi não está restrita apenas a este tipo de aplicação, ele conta com uma GPU poderosa, desta forma é possível processar imagens. Esta característica faz dele uma boa opção para aplicações que envolvam robótica e automação.

Ao considerar um sistema interativo é possível criar painéis montados com TVs para apresentar imagens de alta definição que demonstrem um produto ou apresente chamadas de promoções. Estas soluções podem ser encontradas em agências de comunicação e marketing de países europeus.

Para desenvolver algumas dessas aplicações você pode utilizar o banco de dados mySQL e suas bibliotecas de desenvolvimento, utilizar o framework QT para aplicações portáveis entre sistemas operacionais e apresentação de dados processados, é possível também utilizar outras bibliotecas e frameworks encontrados no ambiente Linux.