Criando Bibliotecas para Arduino

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/

Muito bom. Excelente iniciativa

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...

Acabei agora de ler com mais atençao ao teu blog e vi umas coisas que nao estou a entender,

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:

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:

Led(int *);

Esperas um ponteiro no constructor??

Ótima iniciativa!

Parabéns

HugoPT:
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:

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

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.

Led ledWarning(13);
void setup(){

Aqui passa directamente o valor e nao o endereço

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.

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.

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...

MarceloBoeira:
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.

MarceloBoeira:
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

AlxDroidDev:
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 :wink: rs

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...

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

AlxDroidDev:
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.

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?

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

Sim, mas apenas na universidade, onde fiz Engenharia Mecatronica. Na universidade eu usava microcontroladores (sobretudo os 8051) e protótipos baseados em CPUs Z80 (8-bits) e depois os 68000 (32-bits) , mas tudo isto diretamente com Assembly, e realmente havia uns bons 18 anos que não mexia com eles. Meu background em eletronica era razoavel, embora longe de ser excelente. Quanto a programação, tenho 25 anos de experiência em diversas linguagens.

Como vês, eu fui evangelizado a pensar em microcontroladores como algo onde o tamanho do código é sagrado, onde deve-se racionar instruções e ciclos de clock ao máximo, buscando o máximo de eficiência pelo mínimo de esforço.

Na época, escrevíamos os programas em Assembly em um editor bastante rudimentar, compilávamos para gerar o binário, que por sua vez era gravado em uma EPROM (daquelas que possuem uma abertura em cima para serem apagadas) e então instalados na placa-protótipo onde ficavam os circuitos e o microcontrolador ou CPU. Eles já tinham uma espécie de bootloader preparado para buscar o começo do programa na EPROM que usávamos. Cada aluno tinha seu conjunto de EPROMs.

Eh eh, há já uns bons anos que não uso (ou vejo) uma EPROM. :slight_smile: Eu usava-as com o 8051 há prai uns 10 anos.

Mas o objectivo da pergunta era mesmo para perceber porque tinhas usado o pinMode e/ou digitalWrite/Read sabendo microcontroladores e quão ineficientes essas funções são.
Eu uso essas funções quando (ultimamente não tenho feito nada disso) preciso de escrever algo rápido para testar e mais tarde se precisar então, uso a manipulação de portas com macros para obter o mínimo código possível.

No entanto, devo admitir que para principiantes em electrónica essas funções são excelentes porque evitam muitos problemas para quem pouco sabe de C. Para quem sabe C e microcontroladores, pode evitar usar essas funções e poupar imensa memória e ciclos. Daí eu ter dito anteriormente ao Marcelo que criar bibliotecas para acender ou apagar LEDs não é propriamente algo ideal porque apenas está a criar mais uma camada de código em cima de funções que por si só não são optimizadas. Já se o fizesse de forma optimizada para poupar memória seria excelente.

Neste momento estou a trabalhar numa biblioteca que vai aceder a um servidor para fazer download dos próximos autocarros a parar numa determinada paragem e a maior parte dos problemas que tenho são precisamente por querer poupar a memória flash e ROM ao máximo para que quem quiser usá-la não ter problemas com memória a menos no programa. Isto é algo que a maior parte das bibliotecas não liga puto pelo que tenho visto nas que fiz download.