LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: ailtonfacanha em 29 de Setembro de 2009, 17:22

Título: Bibliotecas para o Arduino (lib)
Enviado por: ailtonfacanha em 29 de Setembro de 2009, 17:22
Olá

Quem se habilita escrever um tutorial com um método para ensinar, passo-a- passo, como se escreve bibliotecas (lib) para o Arduino?

Um forte abraço

Ailton
Título: Re: Bibliotecas para o Arduino (lib)
Enviado por: GnGz em 30 de Setembro de 2009, 11:01
Tambem gostava de saber um pouco como se cria Bibliotecas.
Título: Re: Bibliotecas para o Arduino (lib)
Enviado por: TigPT em 30 de Setembro de 2009, 14:11
Já pedi ao amgcgoncalves que está com mais disponibilidade para o fazer.

Nos próximos dias devem de ter novidades da parte dele com um texto simples a explicar  tudo.
Título: Re: Bibliotecas para o Arduino (lib)
Enviado por: GnGz em 30 de Setembro de 2009, 16:58
Já pedi ao amgcgoncalves que está com mais disponibilidade para o fazer.

Nos próximos dias devem de ter novidades da parte dele com um texto simples a explicar  tudo.

Tanks
Título: Como fazer uma biblioteca Arduino
Enviado por: amgcgoncalves em 01 de Outubro de 2009, 23:37
Começo a minha explicação por dizer que não é muito bom nem correcto estar a ensinar isto sem que primeiro vos mande aprender C++, mas de qualquer forma, vou tentar ser muito claro, de forma a fazer-me entender mesmo que vocês não possuam esses conhecimentos, deixando de qualquer forma a sugestão de que passeiem um pouco pela net e explorem a bonita linguagem que é o C++.

Uma biblioteca (ou lib, library, o que quiserem chamar-lhe) é composta por duas partes: um ficheiro de cabeçalhos que contem os cabeçalhos das funções que queremos que constem na nossa biblioteca; e um ficheiro de implementações, onde realmente vai constar o código referente a essas funções.
Na linguagem C, os compiladores precisam de ter o conhecimento dos cabeçalhos das funções que invocamos antes destas serem utilizadas, daí a necessidade de um ficheiro de headers (.h). Para se dar conhecimento de uma biblioteca ao nosso código, utilizamos a directiva de pré-processamento #include <nome_da_biblioteca.h>. Estou a começar a cair em explicações de C e C++, que era o que eu já suponha que ia acontecer. Não me alongo mais nestes aspectos. Perguntem-me mais coisas por PM aqueles q   ue tiverem mais curiosidades de raiz.

O pequeno exemplo que vos vou dar é uma biblioteca idiota que associa um Pin a uma instância que terá métodos (funções de classe) que façam esse Pin dar um pulso quadrado de duração de um segundo e duty cycle de 50% (ou seja, passa meio segundo em valor lógico 1 e outro meio segundo em valor lógico 0. Óptimo para pôr um led a piscar de segundo a segundo ou para gerar um sinal de clock de 1Hz) bem como um método para fazer o led piscar “SOS” em código morse. Tentei deixar o código intuitivo em vez de optimizá-lo, para não parecer “chinês”. De qualquer forma, quem tiver questões, sinta-se à vontade para “chatear-me”.

Ponto número 1: O ficheiro .h

Código: [Seleccione]
#ifndef led_utils_h
#define led_utils_h

#include "WProgram.h"

class led_utils
{
private:
int pin;
void piscar(int t);

public:
led_utils(int p);
void piscar1Hz();
void sosMorse();
};

#endif

As directivas #ifndef e #endif servem para condicionar o import de um ficheiro.h. Caso, por distracção ou redundância importemos o mesmo header file, se tivermos estas directivas, o ficheiro só será realmente importado uma vez. É uma protecção. Opcional, mas recomendo.
O #include "WProgram.h" é para que a nossa biblioteca tome conhecimento das constantes e das funções disponíveis na biblioteca standard do Arduino. Para depois podermos usar, na nossa biblioteca, funções como delay() ou constantes como OUTPUT, HIGH, LOW, etc..
Class é a palavra reservada que se destina à definição de propriedades comuns a um objecto (http://pt.wikipedia.org/wiki/Objeto). A lista de métodos ou variáveis private são as que não têm visibilidade externa. Não podem ser chamadas externamente sobre um objecto. Os atributos public têm visibilidade exterior e normalmente são aqueles que queremos tornar disponíveis para utilização (por exemplo, numa biblioteca de comunicações, metodos send() ou receive() seriam public, enquanto que métodos para fazer tratamentos de sinais, cálculos e outras coisas intermédias que um utilizador não precisa de usar seriam private).
Declarei no meu header file todas as funções que a minha biblioteca terá.

Ponto número 2: O ficheiro .cpp

Código: [Seleccione]
#include "WProgram.h"
#include "led_utils.h"

led_utils::led_utils(int p)
{
pin = p;
pinMode(pin, OUTPUT);
}

void led_utils::piscar(int t)
{
digitalWrite(pin, HIGH);
delay(t>>1);
digitalWrite(pin, LOW);
delay(t>>1);
}

void led_utils::piscar1Hz()
{
led_utils::piscar(1000);
}

void led_utils::sosMorse()
{
for (int i = 0; i < 3; ++i)
{
piscar(200);
}
for (int i = 0; i < 3; ++i)
{
piscar(400);
}
for (int i = 0; i < 3; ++i)
{
piscar(200);
}
delay(1000);
}

Este é o código. É o trabalho propriamente dito.
Temos que incluir o nosso ficheiro header, de forma a sabermos que é a ele que o estamos a implementar no nosso ficheiro .cpp. Bem como voltamos a necessitar de incluir a biblioteca standard do Arduino.
Para se implementar as funções, deve-se começar por assinalar o seu tipo de retorno, posteriormente a Class à qual pertencem, seguida de duplos dois-pontos e do nome do método em si. Sintaxe pura, não tenho mais a acrescentar aqui.

Posto isto, para podermos utilizar esta nossa biblioteca, teremos que criar uma pasta onde armazenaremos estes dois ficheiros. Esta pasta tem de ficar obrigatoriamente na pasta das bibliotecas, que em Windows deve ser algo do género <pasta do arduino>\java\hardware\libraries (como uso Mac OS X, não faço mesmo ideia. Caso não seja, peço que me corrijam). No nosso sketch que iremos compilar e enviar para o Arduino, temos que fazer #include <nome_da_biblioteca.h>, para que o nosso código tome conhecimento da nossa biblioteca. Deixo um código Arduino exemplo para verem a utilização desta minha biblioteca (que não é uma biblioteca mas sim um punhado de métodos que não servem para nada. Mas era só para ser um exemplo simples):

Código: [Seleccione]
#include <led_utils.h>

#define LED_PIN 13

led_utils led(LED_PIN);

void setup() {
}

void loop() {
  led.piscar1Hz();
}

Espero ter sido claro e ter ajudado. Perguntem tudo o que quiserem. Tentarei responder de forma concisa e objectiva. Boas programações! =)
Título: Re: Bibliotecas para o Arduino (lib)
Enviado por: msr em 01 de Outubro de 2009, 23:49
Deixo aqui mais um exemplo que encontrei pela net:
http://blog.bsoares.com.br/arduino/cpp-class-for-controlling-7-segments-led-display

Espero que ajude ;)
Título: Re: Bibliotecas para o Arduino (lib)
Enviado por: TigPT em 01 de Outubro de 2009, 23:59
Muito bom amgcgoncalves, duvido que alguém fique com questões depois desta explicação.
Título: Re: Bibliotecas para o Arduino (lib)
Enviado por: ailtonfacanha em 05 de Outubro de 2009, 01:46
Olá

Permitam-me PARABENIZAR o companheiro amgcgoncalves!

EXECELENTE trabalho = COMPETÊNCIA + EFICIÊNCIA

Agora, só falta o TigPT publicar esse precioso trabalho lá nos tutoriais.

Não sei se vcs já perceberam a excelente qualidade dos Tutoriais disponíveis na LUSOROBOTICA. A diferença é quem faz a diferença!

PARABÉNS amgcgoncalves! Conitinue sempre assim... que a vida vai te proporcionar boas surpresas e excelentes resultados!

Ailton