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
-
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
-
Tambem gostava de saber um pouco como se cria Bibliotecas.
-
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.
-
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
-
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
#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
#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):
#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! =)
-
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 ;)
-
Muito bom amgcgoncalves, duvido que alguém fique com questões depois desta explicação.
-
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