COMO CONSTRUIR UMA BIBLIOTECA PROFISSIONAL PARA ARDUINO

Fala galera maker, tudo bem com vocês? Hoje vamos dar continuidade ao aprendizado de como construir uma biblioteca para Arduino! Nós já tivemos um primeiro tutorial, onde aprendemos como construir uma biblioteca básica! Dessa vez vamos partir para algo mais aprofundado, então é essencial que você tenha lido o primeiro tutorial!

Agora vamos construir uma biblioteca profissional para o controle da Ponte H 293D, e  para isso, iremos avançar mais ainda nos conceitos de programação orientada a objetos e registrador de bits, caso queira se aprofundar em escrita de código para microcontrolador, sugira a leitura do livro “AVR e ARDUINO Técnicas de Projetos”, este livro está publicado no site Arduino Ceará no link LIVRO AVR E ARDUINO  para leitura online pelo Google Livros.

Apresentando a biblioteca

Essa biblioteca foi escrita pelo professor Eduardo Morais, na Escola Pixels (Pixels – Escola de Design e Tecnologia (pixelsescola.com)), escola onde sou professor de Robótica com Arduino, neste post iremos apresentá-la, e assim você terá a oportunidade em desenvolver uma biblioteca que lhe atenda para o controle da Ponte H L293D, ou outra ponte H, e até mesmo contribuir com a comunidade atualizando e sugerindo modificações! Bora lá?!

Mas você pode pensar: já não existe uma biblioteca para controlar esta Ponte H? Sim existe, mas eu particularmente acho que ela é confusa e de difícil uso, a biblioteca que irei apresentar hoje é bem mais prática e fácil de usar!A biblioteca deste tutorial controla 02 servos-motores e 04 motores CC que podem ser conectados nessa Shield Ponte H L293, vamos explicar primeiro o funcionamento da biblioteca para depois explicar como desenvolvê-la.

Analisando o arquivo de exemplo

Então vamos começar a prática! Desde já peço que leia todo o tutorial com bastante atenção, este é um tópico um mais complexo, construir uma biblioteca para Arduino não é algo trivial, mas é algo extremamente recompensador, no fim desta jornada você vai sentir que seus conhecimentos sobre Arduino e programação aumentaram de nível!

Primeiro baixe todo o conteúdo que disponibilizamos para o tutorial de hoje neste link. Ao extrair todo o conteúdo do arquivo zip, dentro da pasta raiz terá uma outra pasta chamada L293D_PIXELS, é nesta pasta que está todo o conteúdo da nossa biblioteca, importe esta pasta para a IDE do Arduino, do mesmo jeito que você faria com qualquer outra biblioteca que você encontra na internet.

Após a importação vamos abrir o arquivo de exemplo:

Neste arquivo de exemplo podemos ver que para importar a biblioteca usamos o nome que ela foi criada “<L293D_PIXELS.h>”, como fazemos com qualquer outra, por padrão a classe construtora leva o mesmo nome da biblioteca e na linha 27 instanciamos um objeto, que no nosso exemplo escolhemos ser “pixels_1” mas poderia ser qualquer outro nome que faça sentido pra você, lembre-se, orientação a objeto é uma abstração do código para tornar legível a leitura do mesmo.

Não se preocupe em copiar o código, todo o conteúdo desse tutorial pode ser baixo neste link.

Olha que lindo o “void setup( )”, você não faz nada!

O void loop( ) pode ser visto abaixo, neste arquivo de exemplo mostro as funções principais da biblioteca que desenvolvemos. Para ligar o motor basta chamar a função giraMotor( ) e nela se passa 3 parâmetros: qual motor devo ligar, qual o estado do motor e qual a velocidade.

Na nossa ponte H L293 podemos acionar 4 motores, logo o primeiro parâmetro pode receber as constantes MOTOR_UM, MOTOR_DOIS, MOTOR_TRES, MOTOR_QUATRO, já o segundo parâmetro adota 03 estados do motor sendo eles SENTIDO_INVERSO, SENTIDO_DIRETO e PARADO,  e por último, no terceiro parâmetro temos a velocidade do motor, onde ela pode variar de 0 a 255. A Ponte H também pode controlar 02 servos-motores, sendo possível através da função controleServo( ) passando como parâmetro a posição do servo e qual deles está sendo usado, SERVO_UM ou SERVO_DOIS.

Mergulhando no código da biblioteca

Agora vem toda a mágica de nosso tutorial! A partir de agora pode entraremo a fundo no processo de como construir uma biblioteca para Arduino.

Agora que já entendemos como funciona a nossa biblioteca vamos entender como construímos ela para que você possa melhorá-la ou até mesmo desenvolver uma para seu projeto específico.

Agora abra o arquivo L293D_PIXELS.h, este arquivo está dentro da pasta L293D_PIXELS.

Na linhas 1 podemos ver a  diretiva #ifndef, que pertence a linguagem de programação C e ela tem a função de ajudar a permitir a compilação condicional do código e ela sempre vem acompanhado da diretiva #define.

No caso acima o #ifndef, verifica se a MACRO específica, que no nosso caso é _L293D_, não foi definida no código do usuário da biblioteca, se essa condição for verdadeira, ou seja TRUE, o que neste caso quer dizer que não tem nenhuma variável definida, o código será compilado normalmente, e será definido com auxílio da diretiva #define _L293D_ para garantir que esta não seja usada 2x.

Esta outra parte do código, que pode ser visto mais abaixo, tem por função definir as variáveis de sentido de rotação do motor que usamos como parâmetro na função giraMotor, nela já é setado os bits referentes que irão acionar as portas específicas do shiftRegister 74HC595 responsável pelo deslocamento dos bits.

Este bloco abaixo já é bem conhecido dos leitores, ele define as portas do Arduino com suas respectivas variáveis dos motores, servos e pinos de controle do registrador de deslocamento 74HC595.

Nas linhas 38 e 39 incluímos em nossa biblioteca outras duas bibliotecas, sendo elas a Arduino.h e a Servo.h, neste caso da biblioteca Servo.h estamos praticamente reescrevendo a sua função básica de uma forma mais simples e intuitiva, chamando-a de controleServo e com a mesma função podendo controlar tanto o servo 01 ou 02, basta passar a instrução SERVO_UM ou SERVO_DOIS no segundo parâmetro.

Da linha 41 a 50 está a construção da classe L293_PIXELS, aquela que você chamou no código exemplo, na linha 27, atribuindo o objeto pixels_1 a ela, caso tenha esquecido volte um pouco a leitura e confere lá.

Na linha 42 temos o modificador public:, ele garante que os atributos dentro dele podem ser acessados de fora da classe L293_PIXELS, ou seja, justamente as funções giraMotor( ) e controleServo( ) que usamos no código exemplo dentro do void loop (), agora está entendendo por que apresentei primeiro o código exemplo? Assim você consegue ir associando como foi construída a lógica da biblioteca.

Já na linha 46 o modificador é private: ou seja, privado, o acesso a ele é somente dentro deste código da extensão .h e na linha 52 fechamos o código com #endif.

Aprofundado na lógica da biblioteca

Segura o fôlego ai que ainda não acabou! Como eu disse antes, construir uma biblioteca para Arduino exige paciência e esforço! Bora lá!

Agora abra o arquivo L293D_PIXELS.cpp, é neste arquivo que está o código lógico da biblioteca, a extensão dele é .cpp, o que significa C Plus Plus ou C++, que é uma das mais famosas linguagens de programação!

Observe que na primeira linha, já há a inclusão de uma biblioteca, justamente a que criamos no passo anterior, importamos para este código o arquivo L293D_PIXELS.h que por sua vez, dentro dele já tem duas outras bibliotecas que virão juntas, lembra? A Arduino.h e Servo.h.

Na linha 03 temos o bloco da classe construtora que configura os pinos do Arduino como saída através do laço ‘for’ e na linha 6 temos a função digitalWrite( ) que habilita o shift-register 74HC595.

Da linha 09 até a 68 está a lógica de quando a função giraMotor( ) é usada no código escrito pelo usuário da biblioteca, lembra que ela assume algumas possibilidades? Pois são justamente os parâmetros que ela espera receber, sendo eles:

  • Qual motor você quer controlar
  • Qual o sentido de rotação desse motor
  • Qual a velocidade também do motor

Cada bloco a partir da linha 9, são a  checagem de qual parâmetro foi recebido, para que a condicional if execute a lógica referente ao parâmetro, por exemplo, pegando esse primeiro bloco acima da linha 10 a 23.

Neste trecho do código a condicional “if” testa se o parâmetro numeroMotor recebeu o valor 1, ou seja, se o usuário da biblioteca escolheu o motor 01, se isso for verdadeiro o código entra no if e já escreve no pino_pwmMotor_1 o valor da velocidade que também deve ter sido passado na função, caso o usuário da biblioteca não escreva a velocidade a biblioteca irá adotar por defaut o valor 255, ou seja velocidade máxima.

Pronto, o próximo passo agora é só definir o sentido de rotação, se o valor recebido for 0, o motor gira no sentido horário, se for 1 gira no sentido anti-horário e se for 2 o motor para, como pode ser visto abaixo.

Quando o motor escolhido for o 2, o processo é análogo ao anterior, mudando apenas o pino do Arduino que será controlado, mas você observou um ~ antes das variáveis que fazem referência ao sentido de rotação do motor, por exemplo ~motor2_Sentido_0?

Esse TIL é o operador NÃO bit-a-bit, diferentemente de & e |, o operador bitwise NÃO é aplicado a um único operando a sua direita. O NÃO Bitwise muda cada bit para seu valor oposto: 0 se torna 1, e 1 se torna 0.

Em outras palavras:

0  1    operando1

1  0   ~operando1

Pronto, não existe mais nenhum mistério, repita o processo para o motor três e quatro, como pode ser visto abaixo.

O próximo bloco é referente ao controle do servo-motor, muito simples e fácil de entender, observe o primeiro bloco abaixo.

Neste, mais uma vez através da classe L293D_PIXELS, a função controleServo( ), recebe dois parâmetros, o valor do servo, ou seja para qual posição você deseja que ele vá, e qual servo você deseja controlar, Servo 01 o Servo 02.

Já esta última função da Classe L293D_PIXELS é de controle interno da biblioteca para acionar e habilitar o registrador da ponte H L293.

Conclusão

Construir uma biblioteca para Arduino é realmente um tópico mais complexo, em nosso tutorial anterior construímos um biblioteca básica para piscar LED, dessa vez fizemos algo mais elaborado e com aplicação real, um biblioteca para controlar a Ponte H 293, e vimos que os conceitos de orientação a objetos e registradores começaram a aparecer com mais frequência!

Apesar disso, vimos que criar uma biblioteca não é um bicho de sete cabeças, e com paciência e dedicação aos estudos, é possível que qualquer maker crie a sua própria biblioteca de forma profissional!

E aí? Gostou de avançar um pouco mais no mundo do Arduino?

Aos poucos estamos inserindo aqui no blog conteúdos mais avançadas e gostaríamos que vocês comentassem abaixo dizendo o que estão achando,  se estamos abordando assuntos que são interessantes para a comunidade, se deseja que expliquemos de forma mais detalhada esse assunto tão complexo de registrador por exemplo, ou se tá de boa, tá dando pra entender.

Sua contribuição para o blog é de extrema importância pois irá nos nortear para os próximos posts!

E se você quiser publicar o seu artigo/tutorial aqui no blog, e assim contribuir com a comunidade maker, nos envie um e-mail: contato@arduinoomega.com! Todos os nossos colaboradores são recompensados! A comunidade sempre ganha com compartilhamento de conhecimento! 


Qualquer dúvida estou a disposição, pode comentar abaixo ou me chamar no meu instagram @profsandromesquita.

Sobre Sandro Mesquita 20 artigos
Prof. Sandro Mesquita, Msc. Eng de Software, CREA - 44680 .

2 Trackbacks / Pingbacks

  1. Construindo um veículo autônomo de 4 motores com Arduino
  2. Arduino SEM Delay com Waiting Time - Blog Arduino Ômega

Deixe uma resposta

O seu endereço de email não será publicado.


*