Pages: [1] 2   Go Down
Author Topic: Criando Bibliotecas para Arduino  (Read 1839 times)
0 Members and 1 Guest are viewing this topic.
Bom Princípio - RS
Offline Offline
Sr. Member
****
Karma: 0
Posts: 263
SOFTWARE DEVELOPER, HACKER, RASPBERRY/ARDUINO/QT ENTHUSIAST & METALLICA FAN
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Estou dando um divulgada em tutorial que eu fiz, e gostaria de pedir sugestões e comentários sobre o que pode melhorar no tutorial, o que esta faltando...

Link: http://blog.marceloboeira.com/criando-bibliotecas-para-arduino/
Logged

My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1593
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muito bom. Excelente iniciativa
Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Bom Princípio - RS
Offline Offline
Sr. Member
****
Karma: 0
Posts: 263
SOFTWARE DEVELOPER, HACKER, RASPBERRY/ARDUINO/QT ENTHUSIAST & METALLICA FAN
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado Hubo, eu estava até pensando em criar alguma biblioteca de abstração para arduino, para facilitar ainda mais o uso, como o próprio exemplo ai do led, setar tipos de led com saída analógica, criar efeitos fadeIn, fadeOut, blink... vamos ver se com o tempo evoluo o projeto...

Logged

My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1593
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Acabei agora de ler com mais atençao ao teu blog e vi umas coisas que nao estou a entender,
Quote
Led::Led(int pin = 13) {
     setPin(pin);
}
void Led::setState(bool state = LOW){
    _state = state;
    digitalWrite(_pin, _state);


porque motivo tens no ficheiro cpp estes metodos  hardcoded com o = 13 ???
Depois fazes setPin(pin)
Nao querias antes algo do genero:

Quote
Led::Led(int pin ) {
     setPin(pin);
}
void Led::setState(boolean state ){
    _state = state;
    digitalWrite(_pin, _state);

Outra questao como é que estas a usar o construtor?
Normalmente o construtor é usado para inicializar variaveis da classe com valores iniciais, no teu codigo tens isto:
Code:
Led(int *);
Esperas um ponteiro no constructor??

« Last Edit: March 11, 2013, 04:52:56 pm by HugoPT » Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ótima iniciativa!

Parabéns
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 42
Posts: 3288
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Acabei agora de ler com mais atençao ao teu blog e vi umas coisas que nao estou a entender,
Outra questao como é que estas a usar o construtor?
Normalmente o construtor é usado para inicializar variaveis da classe com valores iniciais, no teu codigo tens isto:
Code:
Led(int *);
Esperas um ponteiro no constructor??

Existe algum problema em usar um ponteiro no construtor? Não leves a mal a questão, C++ é relativamente novo para mim e ainda não domino todos os pequenos pormenorzinhos da linguagem. Na aplicacão em questão, realmente não vejo grande utilidade de ter um ponteiro para um pino (mas também não vejo grande utilidade na libraria em questão)... mas se por exemplo quisésses implementar uma classe que ligaria a um servico web para ir buscar dados e quisesses usar o objecto Ethernet, provavelmente quererias passar um apontador para o Cliente Ethernet em vez de deixares a classe fazer todo esse trabalho, não?

Daqui a uma ou duas semanas espero postar uma classe onde implemento isso... infelizmente, embora toda a gente possa tentar, apenas encontrei outro membro do fórum com utilidade para ela. LOL Mas dará para ver o que falei... se funcionar. LOL
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1593
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Existe algum problema em usar um ponteiro no construtor?
Nao ha problema só que como tu dizes neste exemplo era desnecessario.Como o codigo é meramente de exemplo nao vejo o porque do Marcelo ter aplicado isto no constructor.Tambem fiz esta questao porque depois no exemplo dado quando instancia o objecto nao o faz passando o endereço do pino para o constructor, entao para quem deseja usar isso como base para poder iniciar -se na criaçao de bibliotecas pode ficar a nao entender.
Code:
Led ledWarning(13);
void setup(){
Aqui passa directamente o valor e nao o endereço


Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Bom Princípio - RS
Offline Offline
Sr. Member
****
Karma: 0
Posts: 263
SOFTWARE DEVELOPER, HACKER, RASPBERRY/ARDUINO/QT ENTHUSIAST & METALLICA FAN
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu estava fazendo testes com a biblioteca e coloquei o ponteiro, esqueci de tirar para colocar no exemplo do blog. Ja foi corrigido lá, brigado pelas contribuições.

Logged

My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

BHZ, MG, Brazil
Offline Offline
Sr. Member
****
Karma: 10
Posts: 346
Android developer; Arduino enthusiast
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Permita-me ser o advogado do diabo aqui. Não quero te desanimar: a idéia é boa, mas no mundo dos microcontroladores acho que não é boa idéia termos abstrações demais.

Apesar da linguagem ser OOP, nem sempre usar OOP vale a pena, pois quanto mais OOP se tem, maior e mais lento será o código final. Todas as abstrações de sua classe viram códigos e consomem não apenas bytes importantes na memória flash do uC, mas também ciclos de clock.

Existem uma corrente, um movimento que está até pensando em abolir coisas como "pinMode", afim de fazer a manipulação direta da direção de cada porta (PORTA, PORTB, DDRD, etc). Isto economiza muitos e muitos bytes em uma RAM.

A memória flash de nosso querido Atmega328 não é expansível, e os sketches estão ficando cada vez mais criativos, maiores e mais complexos. Por isto muita gente - eu entre eles - tem tentado achar formas de economizar bytes em um sketch compilado. Eu, recentemente, dei pulos de alegria quando pude ver que meu sketch compilou com 98 bytes a menos devido a algumas alterações como manipulação direta de porta. Tudo que era constante já estava na SRAM.



Logged

Learn to live: Live to learn.
Showing off my work: http://arduino.cc/forum/index.php/topic,126197.0.html

Bom Princípio - RS
Offline Offline
Sr. Member
****
Karma: 0
Posts: 263
SOFTWARE DEVELOPER, HACKER, RASPBERRY/ARDUINO/QT ENTHUSIAST & METALLICA FAN
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Que isso, todo comentário construtivo é bem vindo.

Primeiramente, você esta totalmente correto, quanto a questão de memória, limitação de hardware e tudo mais, tanto que eu cito isso como uma desvantagem. Existem casos, que você tem mais memória, ou tem algum micro com uma grande capacidade e não vai se privar, se o projeto não é ambicioso.    Quanto a o tutorial, exemplifica criação de bibliotecas, assim como você deve usar uma biblioteca para um Componente/Shield, alguém pode criar também alguma biblioteca para Display LCD, talvez mais leve ou mais pesada, se eu fosse criar algum projeto grande, eu acabaria criando algumas libs para abstrair código, se você olhar dentro da LiquidCristal do arudino tem muita coisa lá, como efeitos transições que você nunca vai usar, se você criar a sua própria pode diminuir o tamanho...

Enfim, quero que entenda que minha ideia com o tutorial é levar este conhecimento para quem programa com arduino, acho válido pois nós atualmente temos 4000000 milhões de tutoriais na internet sobre arduino e 99% deles são sobre coisas banais e práticas ruins, levando pessoas a programarem mau, ou não entenderem os conceitos, tipo os tutoriais da net tem um código e te mandam compilar, não explicam de onde vem, como existem e nem informam que estes códigos ja são abstrações...
Logged

My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

BHZ, MG, Brazil
Offline Offline
Sr. Member
****
Karma: 10
Posts: 346
Android developer; Arduino enthusiast
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

acho válido pois nós atualmente temos 4000000 milhões de tutoriais na internet sobre arduino e 99% deles são sobre coisas banais e práticas ruins

Nisto eu concordo!!!

3.999.200 são sobre como acender o LED da porta 13. Os outros 800 ensinam a colocar um led na breadboard e ligá-lo à porta 12!

Como eu disse, Marcelo, acho a idéia boa, e, claro, válida, sobretudo do aspecto pedagógico. Meu receio é que a maioria das pessoas não sabe discernir quando usar uma biblioteca ou quando simplesmente ter uma abordagem mais "pragmática".

Bibliotecas são excelentes no aspecto de reutilização de código, e acho importante que as pessoas aprendam este objetivo de bibliotecas, para que não saiam cometendo ainda mais "más práticas.

De qualquer forma, todo aprendizado é sempre bem vindo e você tem um grande mérito por estar compartilhando seu conhecimento publicamente. Parabéns.
Logged

Learn to live: Live to learn.
Showing off my work: http://arduino.cc/forum/index.php/topic,126197.0.html

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

acho válido pois nós atualmente temos 4000000 milhões de tutoriais na internet sobre arduino e 99% deles são sobre coisas banais e práticas ruins
3.999.200 são sobre como acender o LED da porta 13. Os outros 800 ensinam a colocar um led na breadboard e ligá-lo à porta 12!

Uma questão relacionada ao arduíno é que um número gigante de pessoas que o utilizam são estudantes e ou quase leigos em programação e eletrônica, e quando acendem um LED sentem-se realizados e querem compartilhar com todo mundo, e ai nascem os tutoriais "banais". O pior é quando ensinam errado (por exemplo, ligar um motor DC diretamente na porta digital ou o vin e o gnd do arduino diretamente em uma ponte H) e vemos uma massa de seguidores do errado.

Mas como não podemos privar o mundo de divulgar suas pequenas conquistas, vamos valorizar aquelas que realmente agregam valor, certo?

Lembrando que sou quase leigo em eletrônica smiley-wink rs
Logged

Bom Princípio - RS
Offline Offline
Sr. Member
****
Karma: 0
Posts: 263
SOFTWARE DEVELOPER, HACKER, RASPBERRY/ARDUINO/QT ENTHUSIAST & METALLICA FAN
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu não me diria quase leigo, conheço bastante de eletricidade mas na área física, me considero leigo na parte prática de eletrônica também...

Não estou dizendo que as pessoas devem morrer, todos devemos aprender, por isso quero que tenha  disponível na internet tutoriais para os que querem aprofundar seus conhecimentos.

Sei como é acender um led e se sentir "o programador", e digo, não deixa de ser, a porcentagem de pessoas que chega a acender um led já é mínima sabe, mais pela iniciativa de querer aprender algo, eu acho isso uma ótimo, e estes 99999 milhões de tutoriais são bons para este tipo de pessoas, mas a qualquer momento eles podem querer se aprofundar, se descobrirem, e ter sede de conhecimento sem ter como saciar é horrível, muitas vezes me pego procurando sobre coisas na internet que só tem em russo, ou pior, em japonês/chinês, uns datasheets loucos ai...
Logged

My Toys:
Raspberry Pi (Model B)
Arduino MEGA 1280: ( Shield LCD 16x2, Ethernet, RFID )
Freescale Kinetis KL25Z [/

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Não, de forma alguma eu acusaria as pessoas, afinal existem muitos tipos de limitação e penso que deve-se comemorar as pequenas vitórias. Só que o número de "como acender um led" é assustador rs Assim como os copiar e colar, mas isso não tem jeito...

Eu faço parte do grupo de aventureiros que não possui qualquer formação em eletrônica ou programação, e jamais poderia julgar qualquer outro "aventureiro" ou não, apenas descrevi o cenário, principalmente, para o arduino, que se propões a ser de fácil utilização.

Penso que toda boa intenção deva ser valorizada, mesmo que de boas intenções o inferno esteja cheio kkk
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 42
Posts: 3288
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Permita-me ser o advogado do diabo aqui. Não quero te desanimar: a idéia é boa, mas no mundo dos microcontroladores acho que não é boa idéia termos abstrações demais.

Apesar da linguagem ser OOP, nem sempre usar OOP vale a pena, pois quanto mais OOP se tem, maior e mais lento será o código final. Todas as abstrações de sua classe viram códigos e consomem não apenas bytes importantes na memória flash do uC, mas também ciclos de clock.

Existem uma corrente, um movimento que está até pensando em abolir coisas como "pinMode", afim de fazer a manipulação direta da direção de cada porta (PORTA, PORTB, DDRD, etc). Isto economiza muitos e muitos bytes em uma RAM.

A memória flash de nosso querido Atmega328 não é expansível, e os sketches estão ficando cada vez mais criativos, maiores e mais complexos. Por isto muita gente - eu entre eles - tem tentado achar formas de economizar bytes em um sketch compilado. Eu, recentemente, dei pulos de alegria quando pude ver que meu sketch compilou com 98 bytes a menos devido a algumas alterações como manipulação direta de porta. Tudo que era constante já estava na SRAM.

Apesar de não poder discordar com o que dizes (algures pelo fórum está um post meu dirigido ao Marcelo dizendo mais ou menos o mesmo), algo que tens de perceber é o objectivo da plataforma Arduino.

Quote
Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments.

E olhando a este objectivo, diria que o Arduino faz exactamente isso. Tudo bem que ocupa memória, etc... mas permite que leigos consigam passar ao lado do que não é de todo transparente para eles e atinjam algo.

Tu quando começaste a mexer no Arduino já sabias usar microcontroladores?

Quanto ao pinMode e coisas semelhantes, em tempos usei um compilador de C chamado CodeVisionAVR (podem tirar um demo do site http://hpinfotech.ro/) que tinha o que eles chamavam de codewizard... Basicamente era uma GUI para configurar as portas, UART, I2C, etc... e funcionava bem porque abstraia a pessoa do código para configurar os periféricos e fazía-o da forma mais eficiente possível. Talvez isto fosse melhor?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: [1] 2   Go Up
Jump to: