Programação para Arduino
Programação para Arduino
bordar aqui. No final do artigo ns colocamos links que voc pode seguir para aprend
er conceitos mais avanados ou conceitos de software que no so muito utilizados na p
rogramao de sistemas embarcados.
Vamos comear explicando como funciona um computador (lembre-se que o Arduino , no
fundo, um computador).
Computador
Um computador , de forma simplificada, uma mquina que processa instrues. Essas instr
ues so processadas no "crebro" do computador, que se chama microprocessador. Todo co
mputador possui pelo menos um microprocessador. O Arduino, por exemplo, nada mai
s do que um computador muito pequeno, e ele utiliza um microprocessador do model
o ATmega. Alguns microprocessadores, como o ATmega, tambm so chamados de microcont
roladores.
Programa de Computador
Um programa de computador, ou software, uma sequncia de instrues que so enviadas par
a o computador. Cada tipo de microprocessador (crebro) entende um conjunto de ins
trues diferente, ou seja, o seu prprio "idioma". Tambm chamamos esse idioma de lingu
agem de mquina.
As linguagens de mquina so, no fundo, as nicas linguagens que os computadores conse
guem entender, s que elas so muito difceis para os seres humanos entenderem. por is
so ns usamos uma coisa chamada linguagem de programao.
No caso de sistemas como o Arduino (os chamados sistemas embarcados), o software
que roda no microprocessador tambm chamado de firmware.
Linguagem de Programao
Ns seres humanos precisamos converter as nossas idias para uma forma que os comput
adores consigam processar, ou seja, a linguagem de mquina. Os computadores de hoj
e (ainda) no conseguem entender a linguagem natural que ns usamos no dia a dia, en
to precisamos de um outro "idioma" especial para instruir o computador a fazer as
tarefas que desejamos. Esse "idioma" uma linguagem de programao, e na verdade exi
stem muitas delas.
Quando se armazena um valor em uma varivel logo na sua inicializao, chamamos isso d
e inicializao de varivel. Assim, no nosso programa de exemplo temos:
int led = 13;
O objetivo dessa linha de cdigo dizer que o pino 13 do Arduino ser utilizado para
acender o LED, e armazenar essa informao para usar depois ao longo do programa.
Os valores fixos usados no programa, como o valor 13 acima, so chamados de consta
ntes, pois, diferentemente das variveis, o seu valor no muda.
Operador
Um operador um conjunto de um ou mais caracteres que serve para operar sobre uma
ou mais variveis ou constantes. Um exemplo muito simples de operador o operador
de adio, o +. Digamos que queremos somar dois nmeros e atribuir a uma varivel x. Par
a isso, fazemos o seguinte:
x = 2 + 3;
Aps executar o comando acima, a varivel x ir conter o valor 5.
Cada linguagem de programao possui um conjunto de operadores diferente. Alguns dos
operadores mais comuns na linguagem C++ so:
Operadores aritmticos:
+: adio ("mais")
-: subtrao ("menos")
*: multiplicao ("vezes")
/: diviso ("dividido por")
Operadores lgicos:
&&: conjuno ("e")
||: disjuno ("ou")
==: igualdade ("igual a")
!=: desigualdade ("diferente de")
!: negao ("no")
>: "maior que"
<: "menor que"
>=: "maior ou igual a"
<=: "menor ou igual a"
Operadores de atribuio:
=: atribui um valor a uma varivel, como vimos acima.
Ao longo do desenvolvimento dos seus projetos, aos poucos voc se familiarizar com
todos esses operadores. Para uma lista completa, veja essa pgina da Wikipedia.
Funo
Uma funo , em linhas gerais, uma sequncia de comandos que pode ser reutilizada vrias
vezes ao longo de um programa. Para criar uma funo e dizer o que ela faz, ns precis
amos fazer uma declarao de funo. Veja como uma funo declarada no nosso programa de ex
mplo:
void setup() {
pinMode(led, OUTPUT);
}
Aqui estamos declarando uma funo com o nome setup(). O que ela faz executar os com
andos de uma outra funo pinMode(). A ao de executar os comandos de funo previamente de
clarada denominada chamada de funo. Ns no precisamos declarar a funo pinMode() porque
ela j declarada automaticamente no caso do Arduino.
Chamada de Funo
Chamar uma funo significa executar os comandos que foram definidos na sua declarao.
Uma vez declarada, uma funo pode ser chamada vrias vezes no mesmo programa para que
seus comandos sejam executados novamente. Para chamarmos a nossa funo setup(), po
r exemplo, ns usaramos o seguinte comando:
setup();
No entanto, no caso do Arduino, ns no precisamos chamar a funo setup(), porque ela c
hamada automaticamente. Quando compilamos um programa no Arduino IDE, ele chama
a funo setup() uma vez e depois chama a funo loop() repetidamente at que o Arduino se
ja desligado ou reiniciado.
Valor de Retorno
A palavra chave que vem antes do nome da funo na declarao define o tipo do valor de
retorno da funo. Toda vez que uma funo chamada, ela executada e devolve ou retorna u
m determinado valor - esse o valor de retorno, ou simplesmente retorno da funo. O
valor de retorno precisa ter um tipo, que pode ser qualquer um dos tipos de dado
s citados anteriormente. No caso da nossa funo setup(), o tipo de retorno void, o
que significa que a funo no retorna nada.
Para exemplificar, vamos criar uma funo que retorna alguma coisa, por exemplo um nm
ero inteiro. Para retornar um valor, ns utilizamos o comando return:
int f() {
return 1;
}
Quando chamada, a funo f() acima retorna sempre o valor 1. Voc pode usar o valor de
retorno de uma funo para atribu-lo a uma varivel. Por exemplo:
x = f();
Aps declarar a funo f() e chamar o comando de atribuio acima, a varivel x ir conter o
alor 1.
Parmetros
Um outro recurso importante de uma funo so os parmetros. Eles servem para enviar alg
um dado para a funo quando ela chamada. Vamos criar por exemplo uma funo que soma do
is nmeros:
int soma(int a, int b) {
return a + b;
}
Aqui acabamos definir uma funo chamada soma(), que aceita dois nmeros inteiros como
parmetros. Ns precisamos dar um nome para esses parmetros, e nesse caso escolhemos
a e b. Esses parmetros funcionam como varivel que voc pode usar dentro da funo. Semp
re que chamarmos a funo soma(), precisamos fornecer esses dois nmeros. O comando re
turn a + b; simplesmente retorna a funo com a soma dos dois nmeros. Vamos ento somar
2 + 3 e atribuir o resultado para uma varivel x:
x = soma(2, 3);
Aps a chamada acima, a varivel x ir conter o valor 5.
Comentrios
Um comentrio um trecho de texto no seu programa que serve apenas para explicar (d
ocumentar) o cdigo, sem executar nenhum tipo de comando no programa. Muitas vezes
, os comentrios so usados tambm para desabilitar comandos no cdigo. Nesse caso, dize
mos que o cdigo foi comentado.
Na linguagem C++, um comentrio pode ser escrito de duas formas:
Comentrio de linha: inicia-se com os caracteres //, tornando todo o resto da
linha atual um comentrio.
Comentrio de bloco: inicia-se com os caracteres /* e termina com os caractere
s */. Todo o texto entre o incio e o trmino se torna um comentrio, podendo ser comp
osto de vrias linhas.
Para facilitar a visualizao, os ambientes de desenvolvimento geralmente mostram os
comentrios em uma cor diferente. No caso do Arduino IDE, por exemplo, os comentri
os so exibidos na cor cinza. Vamos ento explicar o que o programa de exemplo faz,
inserindo nele vrios comentrios explicativos:
/*
Programao para Arduino - Primeiros Passos
Programa de exemplo: Blink
*/
/*
Declarao da varivel "led"
Indica que o LED est conectado no pino digital 13 do Arduino (D13).
*/
int led = 13;
/*
Declarao da funo setup()
Esta funo chamada apenas uma vez, quando o Arduino ligado ou reiniciado.
*/
void setup() {
// Chama a funo pinMode() que configura um pino como entrada ou sada
pinMode(led, OUTPUT); // Configura o pino do LED como sada
}
/*
Declarao da funo loop()
Aps a funo setup() ser chamada, a funo loop() chamada repetidamente at
o Arduino ser desligado.
*/
void loop() {
// Todas as linhas a seguir so chamadas de funo com passagem de parmetros
// As funes so executadas em sequncia para fazer o LED acender e apagar
digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do LED, acendendo-o
delay(1000);
// Espera 1000 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino do LED, apagando-o
delay(1000);
// Espera 1000 milissegundos (um segundo)
// Aps terminar a funo loop(), ela executada novamente repetidas vezes,
// e assim o LED continua piscando.
}
Estruturas de Controle
Estruturas de controle so blocos de instrues que alteram o fluxo de execuo do cdigo de
um programa. Com elas possvel fazer coisas como executar comandos diferentes de
acordo com uma condio ou repetir uma srie de comandos vrias vezes, por exemplo.
A seguir ns veremos algumas das estruturas de controle mais comuns usadas nas lin
guagens de programao em geral. Vamos tambm modificar o nosso programa de teste para
exemplificar melhor como essas estruturas funcionam.
While
O while uma estrutura que executa um conjunto de comandos repetidas vezes enquan
to uma determinada condio for verdadeira. While em ingls quer dizer "enquanto", e p
ronuncia-se "ui-ou". Ele segue o seguinte formato:
while(condio) {
...
}
Vamos ento fazer uma modificao no nosso programa para exemplificar melhor como o wh
ile funciona. O nosso objetivo agora fazer o LED piscar trs vezes, depois esperar
cinco segundos, piscar mais trs vezes e assim por diante. Ns vamos mudar o contedo
da funo loop() para o seguinte:
// Varivel para contar o nmero de vezes que o LED piscou
int i = 0;
// Pisca o LED trs vezes
while(i < 3) {
digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do LED, acendendoo
delay(1000);
// Espera 1000 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino do LED, apagandoo
delay(1000);
i = i + 1;
}
delay(5000);
Primeiro ns declaramos uma varivel i. Essa varivel vai contar quantas vezes o LED j
piscou desde o incio do programa ou desde a ltima pausa de cinco segundos. Ns vamos
inicializar essa varivel com zero porque no incio da funo loop() o LED ainda no pisc
ou nenhuma vez sob essas condies.
Em seguida ns inserimos o comando while, que deve ser seguido de uma condio definid
a entre parnteses. Enquanto essa condio for verdadeira, todo o bloco de comandos en
tre os caracteres { e } executado repetidamente. No caso do nosso programa, enqu
anto o nmero de "piscadas" do LED (representado pela varivel i) for menor do que t
rs, ns continuamos a executar os comandos que fazem o LED piscar. Isso representad
o pela expresso i < 3 dentro dos parnteses.
Entre os caracteres { e } ns colocamos o cdigo que faz o LED piscar, como anterior
mente, mas no podemos nos esquecer de somar 1 varivel que conta o nmero de "piscada
s". Isso feito na seguinte linha de cdigo:
i = i + 1;
Veja que aps executar todos os comandos entre { e }, sempre teremos na varivel i o
nmero de vezes que o LED piscou desde o incio da funo loop(). Vamos percorrer a seq
uncia de passos executada cada vez que a funo loop() chamada:
Atribumos 0 varivel i: o LED ainda no piscou nenhuma vez.
Comparamos se i < 3: como 0 menor do que 3, executamos os comandos entre { e
}:
Executamos os comandos para acender e apagar o LED.
Somamos 1 varivel i, tornando-a 1: sabemos que o LED piscou uma vez.
}
delay(5000);
A primeira modificao que fizemos foi declarar a varivel i sem inicializ-la com o val
or 0. Ns podemos fazer isso porque o comando for far isso para a gente. Ele segue
o seguinte formato:
for(inicializao; condio; finalizao) {
...
}
Vamos descrever cada item separadamente:
}
Aqui a lgica um pouco diferente: ns vamos manter a funo loop() piscando o LED como n
o programa original, porm vamos inserir uma espera adicional de 5 segundos aps cad
a 3 piscadas. Para isso, criamos uma varivel i fora da funo loop(); ela precisa ser
declarada de fora da funo para poder reter o seu valor entre cada execuo da funo loop
(). Chamamos isso de varivel global. Quando a varivel declarada dentro do corpo da
funo, ela no retm o valor etnre cada execuo, sendo reiniciada a cada vez que a funo
executada. Chamamos isso de varivel local.
Ns usaremos ento essa varivel global i para contar, novamente, o nmero de vezes que
o LED acendeu e apagou. Na declarao da varivel, ns a inicializamos com o valor 0 par
a indicar que o LED no acendeu nenhuma vez ainda. A funo loop() ento comea a ser exec
utada, acendendo e apagando o LED. Para contar o nmero de vezes que o LED piscou,
ns adicionamos a seguinte linha de cdigo:
i++;
rdadeira, isso que dizer que o LED j acendeu 3 vezes, ento inserimos uma pausa adi
cional de 5 segundos com a chamada delay(5000) e reiniciamos a contagem do nmero
de "piscadas" novamente com o seguinte comando:
i = 0;
Aqui o que fazemos , toda vez que vamos acender o LED, verificar se a terceira ve
z que isso acontece, por meio do comando if com a condio i == 2. Se essa expresso f
or verdadeira, isso quer dizer que j acendemos o LED duas vezes e estamos prestes
a acend-lo pela terceira vez; nesse caso mudamos o tempo que o LED fica acaso pa
ra um valor menor, de 0,2 segundo (uma reduo de 0,8 segundo) e o tempo que ele fic
a apagado para um valor maior, de 1,8 segundos (aumento de 0,8 segundo).
Mas e se essa no for a terceira vez que o LED est sendo acionado? a que entra o els
e: se a condio do if for verdadeira, o bloco de comandos entre { e } logo aps o if
executado, caso contrrio, o bloco entre { e } aps o else executado. Isso quer dize
r que para a primeira, segunda e quarta "piscadas" ser usado o tempo padro de um s
egundo.
Bibliotecas
As coisas que aprendemos nas sees anteriores so importantes para implementar a lgica
do seu programa no Arduino, mas normalmente voc vai querer fazer mais coisas alm
de apenas acender um LED. Quando se faz tarefas mais complexas ou se utiliza alg
um outro circuito conectado ao seu Arduino, um recurso muito importante so as bib
liotecas.
Uma biblioteca basicamente composta de cdigo fonte adicional que voc adiciona ao s
eu projeto por meio do comando include. Vejamos como adicionar, por exemplo, uma
biblioteca para controle de um display de cristal liquido (LCD):
#include <LiquidCrystal.h>
Uma biblioteca do Arduino se apresenta normalmente como uma ou mais classes que
possuem funes, os mtodos, para acionar dispositivos, configur-los ou executar alguma
outra tarefa. Continuando com o exemplo do display de cristal lquido, para us-lo
no seu programa, primeiro preciso inicializ-lo. O que fazemos nesse caso criar um
objeto para acessar o LCD (tecnicamente isso se chama instanciar um objeto). Ve
jamos como isso feito:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Quando fazemos isso, lcd se torna um objeto da classe LiquidCrystal. Isso o equi
valente a criar uma varivel do tipo LiquidCrystal. Os parmetros que so passados ent
re parnteses servem para inicializar a configurao desse objeto, e nesse caso corres
pondem aos nmeros dos pinos que foram utilizados para conectar o LCD ao Arduino.
Quase sempre as bibliotecas de Arduino possuem um mtodo begin(), que serve para f
azer a configurao inicial do dispositivo que est sendo controlado. Para chamar a fu
no begin() do objeto lcd que criamos, fazemos o seguinte:
lcd.begin(16, 2);
Normalmente esse mtodo begin() chamado de dentro da funo setup(), ou seja, durante
a inicializao do programa. Os parmetros do mtodo begin(), nesse caso, correspondem a
o nmero de colunas e o nmero de linhas do LCD, respectivamente.
Feitos esses passos, j podemos escrever texto no LCD. Fazemos isso usando o mtodo
print() do objeto lcd, sempre que precisarmos ao longo do programa:
lcd.print("Oi!");
O mtodo print() apenas um dos vrios mtodos disponveis na blblioteca LiquidCrystal. P
ara saber todos os mtodos fornecidos por uma determinada biblioteca, preciso cons
ultar a documentao fornecida com ela.
Este o processo bsico de utilizao de bibliotecas no Arduino. Para mais informaes, lei
a a documentao fornecida com a biblioteca que voc est usando.
Classes, objetos e mtodos so conceitos de programao orientada a objetos. No vamos exp
licar tudo em detalhes aqui, mas se voc quiser aprender mais sobre isso, siga os
links relacionados no final da pgina.
Concluso
Neste tutorial ns vimos os conceitos bsicos de programao necessrios para programar um
Arduino ou mesmo outras plataformas de hardware embarcado. Mas isso s o comeo, e
ainda h muitas coisas a se aprender, tanto na parte de hardware quanto na parte d
e software. Segue ento uma lista para outros artigos e tutoriais interessantes pa
ra que voc possa aprender conceitos mais avanados e expandir as suas possibilidade
s:
Programao em C
Instalando o ambiente de desenvolvimento (PUC-RS)
Introduo programao C (PUC-RS)
Curso de Programao em C (Unicamp)
C Programming (em ingls)
Programao orientada a objetos em C++
C++ como uma linguagem de programao orientada a objetos (Unicamp)
Entendendo C++ - verso original em ingls aqui
Escrevendo bibliotecas para o Arduino (em ingls)