Para aprender como programar arduino e desenvolver a sua aplicação, e colocar as suas ideias em prática com o Arduino, não há como escapar da programação. A escrita do software, mas bem chamado nesse caso de “firmware”, isto é, um programa que será embarcado em microcontrolador, é a etapa mais importante da execução do projeto.
Depois de feito a arquitetura e elaborado os layouts de ligação de todo hardware que fará interface com o Arduino, a próxima etapa é por a mão na massa e escrever o código que irá rodar na sua placa. Vamos entender nesse post como é a estrutura e como é feito um firmware para o Arduino. Vamos relembrar quais os conceitos básicos das linguagens estruturadas que são importantes e vamos te dar as condições de desenvolver as suas primeiras aplicações e andar com as próprias pernas. Vamos lá!
O primeiro passo para começar a programar o Arduíno é fazer o download e instalar a IDE usada para escrever e gravar os códigos na placa. Essa IDE é open-source e está disponível para Windows, MAC e Linux. O download pode ser feito diretamente na página oficial.
Após instalar a IDE, é necessário fazer as configurações iniciais. São passos simples e também já foram abordados em nosso post “Desenvolvendo com Arduino: Primeiros Passos”.
Basicamente, devemos executar as três etapas abaixo:
Feitos esses três passos o Arduino a IDE está pronta para ser usada e para gravar os códigos na sua placa.
A linguagem de programação do Arduino é baseada nas famosas linguagens C e C++ e também na linguagem Wiring.
A linguagem C é dita uma linguagem de baixo nível, isto é, uma linguagem que é próxima da linguagem dos microcontroladores e processadores, na qual temos que programar registradores de bits, manipular a memória e executar instruções do processador. C++ já é uma linguagem de alto nível, ou seja, seu nível de abstração é maior e ela está mais próxima da linguagem humana do que da dos computadores. Em linguagens de alto nível nós não manipulamos a memória e os recursos de hardware diretamente, mas sim por meio de bibliotecas e recursos previamente disponíveis que deixam a linguagem mais transparente para o programador.
A linguagem Arduino utiliza uma série de bibliotecas e recursos para que o usuário não tenha que manipular bits e registradores do microcontrolador. Do ponto de vista do usuário, apenas é utilizado chamadas de funções e escrita de procedimentos lógicos.
Se você já programou alguma dessas linguagens, Arduino não será um problema para você. Se você nunca programou em C/C++, ou mesmo em linguagem nenhuma, também não há problemas! O Arduino é muito intuitivo e toda a parte complexa está encapsulada em bibliotecas e funções.
Compilar e gravar um programa no Arduino é muito tranquilo. Primeiro vamos entender o que é compilar um programa de computador.
Compilar, no contexto da programação, significa verificar toda a sintaxe do código e, caso esteja tudo escrito dentro das regras da linguagem, criar o chamado código objeto, que é um outro programa, semanticamente idêntico o que você escreveu, mas que está escrito na linguagem do microcontrolador. O arquivo gerado pelo processo de compilação é exatamente o arquivo carregado no Arduino na hora de gravá-lo.
Para compilar um programa na IDE do Arduino basta utilizar o atalho ctrl+R, ou então, acessar o comando de compilar na aba Sketch -> Verify/Compile.
Agora, depois de compilar um programa, precisamos de gravá-lo em nossa placa. Para fazer isso, certifique-se de que a placa está devidamente conectada na entrada USB do PC e que a mesma foi reconhecida pela IDE.
Se assim for, basta utilizar o atalho Ctrl+U e será feito o upload do código para a placa. Ou então, acesse o comando de fazer upload na aba File -> Upload.
Um programa de computador possui vários componentes diferentes. Assim como programar Arduino que não o torna diferente. Tal como outras linguagens de programação, ele possui variáveis, funções e rotinas, estruturas de controle lógico e por aí vai. Vamos entender os principais componentes de um como programar Arduino nessa sessão.
Uma variável de um programa é um espaço de memória com tamanho pré-definido associado ao tipo da variável criada. Por exemplo, se você precisa fazer uma conta aritmética simples em seu programa, você pode criar uma variável do tipo Inteiro com o nome de X. Assim você pode escrever a seguinte linha de código:
X = 2+ 3;
O espaço de memória associado à variável X será preenchido com o valor 5.
As variáveis podem ter tipos diferentes. No Arduino, as variáveis podem ser dos seguintes tipos:
Dessa forma, dependendo das necessidades matemáticas e características da lógica do seu programa, você vai precisar de declarar variáveis de um tipo ou de outro.
Atribuição de valor é o ato de atribuir a uma variável que foi criada um determinado valor para ser armazenado por ela. Isso é feito em Arduino através do sinal de “ =”.
Veja os exemplos abaixo:
int x; float y; void setup(){ x = 5; y = 1.3; } void loop(){ }
No exemplo acima, foi criada uma variável inteira de nome X, e uma variável do tipo float de nome Y. Utilizando o sinal de atribuição, nos armazenamos o valor 5 em X, e 1.3 em Y.
Funções e rotinas são trechos de código separados da estrutura principal do programa que realizam uma determinada tarefa e podem ou não retornar um resultado. Na definição clássica, funções são trechos de código que retornam um valor e rotinas são funções que não retornam nada. No entanto esses dois nomes são usadas de forma intercambiável no dia a dia.
Por exemplo, se você está escrevendo um programa e precisa fazer um cálculo de somar algumas variáveis várias vezes no decorrer do código. Ao invés de escrever esse cálculo várias vezes no decorrer do código, você pode criar uma função com o nome somaVar(x,y,z) e chamar essa função cada vez que quiser fazer a conta.
As funções tem a seguinte sintaxe:
int x; float y; void setup(){ } void loop(){ } int somaVar(int x, int y, int z){ return x+y+z; }
Veja que uma função é composta de:
No decorrer do seu código você sempre precisará tomar decisões, direcionar o fluxo do algoritmo e suas tarefas e cálculos, fazer loops para preencher vetores ou implementar uma tarefa lógica e várias outras possibilidades.
Tudo isso é feito através das estruturas de controle de fluxo. Vamos destacar as cinco principais delas, dividindo-as em dois grupos: Tomada de decisão e controle de fluxo.
A estrutura básica para tomada de decisão é o if..else. Como o próprio nome sugere, ele toma uma decisão baseada numa avaliação lógica. Se o resultado dessa avaliação for verdadeira, a estrutura executa o código subsequente ao if, se o resultado for falso, é executado o código subsequente ao else.
A sintaxe é a seguinte:
If ( expressão lógica )
….
Else
…..
Exemplo:
int x; float y; void setup(){ } void loop(){ if (5 > 2) x = 5; else x = 2; }
No exemplo acima, a variável X receberá o valor 5, pois o resultado da expressão lógica entre parênteses no if é verdadeiro. Caso ela fosse falso, o valor de X seria 2.
Existem algumas variações, como o if…elseif….else, e também algumas formas abreviadas de escrever a estrutura. No entanto, se você entendeu o if..else básico, todas as demais variações serão naturais para você.
O switch é uma estrutura de tomada de decisão que avalia o valor de uma variável de controle e direciona o código para um caso específico. Vejamos como é a sintaxe para entender melhor.
int x; float y; void setup(){ } void loop(){ switch(x){ case 1: break; case 2: break; default: break; } }
Na estrutura mostrada acima, a variável x é que controla a tomada de decisão. Se o valor de x for igual a 1, o código vai para linha Case 1. Se x for igual a 2, Case 1 é ignorado e o código executado é o que se segue em Case 2. O número de casos é indefinido, mas recomenda-se que não seja mais de uma dezena e não menos que três.
Na eventualidade de não existir nenhum Case correspondente ao valor da variável de controle, o código executado é o Default, geralmente escrito ao final do Switch.
Os breaks no meio do switch dizem para o compilador para e sair do switch, continuando o código que vem logo abaixo do fechamento das chaves que delimitam o switch. São colocados depois de cada Case para evitar que avaliações desnecessárias sejam feitas.
As estruturas de controle de fluxo são os famosos Loops usados para fazer iterações e executar tarefas. Os dois principais deles são o for e o while.
A sintaxe do for é a seguinte:
int x; void setup(){ } void loop(){ for(int i = 0; i < 15; i++){ //instruções } }
Essa estrutura significa que o código inserido entre as chaves que se seguem ao for será executado x vezes. Ou seja, se x for igual a 5, o loop rodará 5 iterações. A cada iteração o valor da variável de controle i é iterada também. Assim, na primeira iteração o valor de i é zero, na segunda é um, na terceira é dois, e assim por diante até que i seja igual ou maior a x.
O while também é uma estrutura em loop muito utilizada. O trecho de código inserido entre as chaves que se seguem ao while é executado sempre, desde que a expressão lógica seja verdadeira. No momento em que a expressão ĺógica do while for falsa, o loop não será executado mais.
Exemplo:
int x; int i; void setup(){ } void loop(){ while(i < 15){ x = x + 15; i++; } }
No exemplo acima, o loop será iterado quinze vezes. Veja que ao começar o While a variável de controle é igual a zero. E dentro do while há uma linha: i++. O operador ++ faz com que a variável seja somada em 1 unidade. Ou seja, a cada iteração do while, a variável i é somada de 1 unidade. Assim, na primeira iteração, i começa com zero,mas é somada de 1 unidade e vira um. Na segunda iteração i começa igual a um, é iterada e vira dois. E assim por diante até que i seja igual a quinze. Nesse momento a expressão lógica do while se torna falsa e o corpo do while não é mais executado.
Em todo código do Arduino você encontrará sempre duas funções: a void setup() e void loop(). Além deles, você comumente verá linhas com a diretiva #include, usada para incluir bibliotecas no código.
Bibliotecas são coleções de funções e definições de parâmetros e variáveis que ao invés de serem incluídas no programa principal, são salvas em um arquivo separado e incluídas no programa principal por meio de uma linha de código. Assim, todas as funções e definições dentro dessas bibliotecas ficam disponíveis em seu código. Bibliotecas são muito úteis pois permitem dividir um programa complexo em mais de um arquivo. Os arquivos de biblioteca em geral possuem a extensão .h.
A função void setup() é onde são feitas as inicializações e configurações do microcontrolador do Arduino. A função void Loop() é onde vamos escrever o nosso código em si. Trata-se do loop infinito que vai rodar enquanto o Arduino estiver ligado. Todas as ações do nosso código deverão estar nesse loop.
Veja na figura abaixo um exemplo em que são incluídas duas bibliotecas, uma para trabalhar com strings e outra para controlar displays LCD:
#include <LiquidCrystal.h> #include <string.h> void setup(){ } void loop(){ }
Essa estrutura padrão em conjunto com os outros conceitos que você acabou de conhecer serão as ferramentas de código principais de todos os seus programas em Arduino.
Continua a aprender com a leitura da parte 2 desse post. Lá falaremos sobre as interfaces de hardware do placa Arduino e como controlar e utilizá-las em suas aplicações. Bons estudos e qualquer dúvida deixe o seu comentário!
Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!