Arduino - Conceitos Basicos
Arduino - Conceitos Basicos
INTRODUO
O objetivo deste manual apresentar, de uma forma simples e rpida, o bsico
de programao, sendo assim iremos focar apenas nos conceitos que so
importantes para Arduino e sistemas embarcados em geral.
COMPUTADOR
Um computador , de forma simplificada, uma mquina que processa
instrues. Essas instrues so processadas no "crebro" do computador,
que se chama microprocessador. Todo computador possui pelo menos um
microprocessador. O Arduino, por exemplo, nada mais do que um
computador muito pequeno, e ele utiliza um microprocessador do modelo
ATmega. Alguns microprocessadores, como o ATmega, tambm so
chamados de microcontroladores.
PROGRAMA DE COMPUTADOR
Um programa de computador, ou software, uma seqncia de instrues que
so enviadas para o computador. Cada tipo de microprocessador (crebro)
entende um conjunto de instrues diferente, ou seja, o seu prprio "idioma".
Tambm chamamos esse idioma de linguagem de mquina.
As linguagens de mquina so, no fundo, as nicas linguagens que os
computadores conseguem entender, s que elas so muito difceis para os
seres humanos entenderem. por isso 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 computadores consigam processar, ou seja, a linguagem de mquina.
Os computadores de hoje (ainda) no conseguem entender a linguagem
natural que ns usamos no dia a dia, ento 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 existem muitas
delas.
Essas linguagens de programao tambm so chamadas de linguagens de
programao de alto nvel. A linguagem de programao utilizada no Arduino
a linguagem C++ (com pequenas modificaes), que uma linguagem muito
tradicional e conhecida.
www.meccomeletronica.com
Pgina 1
www.meccomeletronica.com
Pgina 2
TIPO DE DADO
O tipo de dado de uma varivel significa, como o prprio nome diz, o tipo de
informao que se pode armazenar naquela varivel. Em muitas linguagens de
programao, como C++, obrigatrio definir o tipo de dado no momento da
declarao da varivel, como vimos na declarao da varivel led acima. No
caso dos Arduino que usam processador ATmega, os tipos mais comuns de
dados que utilizamos so:
char: um caracter
ATRIBUIO
Atribuir um valor a uma varivel significa armazenar o valor nela para usar
posteriormente. O comando de atribuio em C++ o =. Para atribuirmos o
valor 13 varivel led que criamos acima, fazemos assim:
LED = 13;
Quando se armazena um valor em uma varivel logo na sua inicializao,
chamamos isso de 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.
www.meccomeletronica.com
Pgina 3
www.meccomeletronica.com
Pgina 4
www.meccomeletronica.com
Pgina 5
Para exemplificar, vamos criar uma funo que retorna alguma coisa, por
exemplo um nmero 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 valor 1.
PARMETROS
Um outro recurso importante de uma funo so os parmetros. Eles servem
para enviar algum dado para a funo quando ela chamada. Vamos criar por
exemplo uma funo que soma dois 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. Sempre que chamarmos a
funo soma(), precisamos fornecer esses dois nmeros. O comando return 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 (documentar) o cdigo, sem executar nenhum tipo de comando no
programa. Muitas vezes, os comentrios so usados tambm para desabilitar
comandos no cdigo. Nesse caso, dizemos que o cdigo foi comentado.
www.meccomeletronica.com
Pgina 6
/*
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
}
www.meccomeletronica.com
Pgina 7
/*
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 seqncia para fazer o LED acender e
apagar
digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do LED, acendendoo
delay(1000);
www.meccomeletronica.com
Pgina 8
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 linguagens 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 enquanto uma determinada condio for verdadeira. While em ingls
quer dizer "enquanto", e pronuncia-se "ui-ou". Ele segue o seguinte formato:
while(condio) {
...
}
Vamos ento fazer uma modificao no nosso programa para exemplificar
melhor como owhile 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;
digitalWrite(led, LOW);
apagando-o
delay(1000);
i = i + 1;
}
www.meccomeletronica.com
Pgina 9
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 piscou nenhuma vez sob essas condies.
Em seguida ns inserimos o comando while, que deve ser seguido de uma
condio definida entre parnteses. Enquanto essa condio for verdadeira,
todo o bloco de comandos entre os caracteres { e } executado repetidamente.
No caso do nosso programa, enquanto o nmero de "piscadas" do LED
(representado pela varivel i) for menor do que trs, ns continuamos a
executar os comandos que fazem o LED piscar. Isso representado pela
expresso i < 3 dentro dos parnteses.
Entre os caracteres { e } ns colocamos o cdigo que faz o LED piscar, como
anteriormente, mas no podemos nos esquecer de somar 1 varivel que
conta o nmero de "piscadas". Isso feito na seguinte linha de cdigo:
i = i + 1;
2.
Comparamos se i < 3: como 0 menor do que 3, executamos os
comandos entre{ e }:
1.
2.
vez.
3.
Voltamos ao incio do while e comparamos se i < 3: como 1 menor do
que 3, executamos os comandos entre { e } novamente:
1.
2.
Somamos 1 varivel i, tornando-a 2: sabemos que o LED piscou duas
vezes.
4.
Voltamos ao incio do while e comparamos se i < 3: como 2 menor do
que 3, executamos os comandos entre { e } novamente:
1.
www.meccomeletronica.com
Pgina 10
2.
Somamos 1 varivel i, tornando-a 3: sabemos que o LED piscou trs
vezes.
5.
Voltamos ao incio do while e comparamos se i < 3: como 3 no menor
do que3, no executamos mais os comandos entre { e } e prosseguimos
prxima instruo.
6.
digitalWrite(led, LOW);
apagando-o
delay(1000);
}
delay(5000);
www.meccomeletronica.com
Pgina 11
...
}
IF
uma das estruturas mais bsicas de programao em geral. If significa "se"
em ingls, e exatamente isso que ele faz: ele verifica uma expresso e,
apenas se ela for verdadeira, executa um conjunto de comandos. Em
linguagem natural, ele executa uma lgica do tipo: "se isso for verdadeiro,
ento faa aquilo"
Para ilustrar, vamos modificar o nosso programa de exemplo para que ele faa
a mesma coisa que fizemos com o while e o for acima, porm vamos fazer isso
usando um if, que segue o seguinte formato:
if(condio) {
...
}
A lgica muito simples: sempre que a condio vor verdadeira, os comandos
entre { e }so executados, caso contrrio o programa prossegue sem executlos. Vamos ver ento como fica a funo loop():
// Varivel para contar o nmero de vezes que o LED piscou
int i = 0;
void loop() {
digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do LED, acendendoo
delay(1000);
www.meccomeletronica.com
Pgina 12
i++;
if(i == 3) {
delay(5000);
i = 0;
}
}
Aqui a lgica um pouco diferente: ns vamos manter a funo loop() piscando
o LED como no programa original, porm vamos inserir uma espera adicional
de 5 segundos aps cada 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 entre cada execuo, sendo reiniciada a cada vez que a funo
re-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 0para indicar que o LED no acendeu nenhuma vez
ainda. A funo loop() ento comea a ser executada, acendendo e apagando
o LED. Para contar o nmero de vezes que o LED piscou, ns adicionamos a
seguinte linha de cdigo:
i++;
www.meccomeletronica.com
Pgina 13
IF-ELSE
O if-else, tambm conhecido como if-then-else, pode ser visto como uma
extenso do comando if. Else em ingls significa "caso contrrio", e ele faz
exatamente o que o nome diz: "se isso for verdadeiro, ento faa aquilo, caso
contrrio, faa outra coisa". Ele segue o seguinte formato:
if(condio) {
...
} else {
...
}
Para exemplificar, vamos usar o programa do for que mostramos acima, mas
vamos dessa vez fazer o LED acender e apagar quatro vezes antes de dar
uma pausa de cinco segundos. Depois vamos fazer com que na terceira de
cada uma dessas quatro "piscadas", o LED acenda por um perodo mais curto.
Dentro da funo loop(), teremos o seguinte:
// Varivel para contar o nmero de vezes que o LED piscou
int i;
digitalWrite(led, LOW);
apagando-o
delay(1800);
} else {
digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do LED,
acendendo-o
delay(1000);
www.meccomeletronica.com
Pgina 14
digitalWrite(led, LOW);
apagando-o
delay(1000);
}
}
delay(5000);
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 algum outro circuito conectado ao seu
Arduino, um recurso muito importante so as bibliotecas.
Uma biblioteca basicamente composta de cdigo fonte adicional que voc
adiciona ao seu 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). Vejamos como isso feito:
LIQUIDCRYSTAL LCD(12, 11, 5, 4, 3, 2);
Quando fazemos isso, lcd se torna um objeto da classe LiquidCrystal. Isso o
equivalente a criar uma varivel do tipo LiquidCrystal. Os parmetros que so
passados entre parnteses servem para inicializar a configurao esse objeto,
e nesse caso correspondem 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 fazer a configurao inicial do dispositivo que est sendo
controlado. Para chamar a funobegin() do objeto lcd que criamos, fazemos o
seguinte:
www.meccomeletronica.com
Pgina 15
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 ao nmero de colunas e o nmero de linhas do
LCD, respectivamente.
Feitos esses passos, j podemos escrever texto no LCD. Fazemos isso usando
o mtodoprint() do objeto lcd, sempre que precisarmos ao longo do programa:
lcd.print("Oi!");
O mtodo print() apenas um dos vrios mtodos disponveis na
blbliotecaLiquidCrystal. Para saber todos os mtodos fornecidos por uma
determinada biblioteca, preciso consultar a documentao fornecida com ela.
Este o processo bsico de utilizao de bibliotecas no Arduino.
www.meccomeletronica.com
Pgina 16
O QUE O ARDUINO?
Arduino uma plataforma de prototipagem eletrnica criado com o objetivo de
permitir o desenvolvimento de controle de sistemas interativos, de baixo custo
e acessvel a todos. Alm disso, todo material (software, bibliotecas, hardware)
open-source, ou seja,
eja, pode ser reproduzido e usado por todos sem a
necessidade de pagamento de direitos autorais. Sua plataforma composta
essencialmente de duas partes: O Hardware e o Software.
www.meccomeletronica.com
Pgina 17
2. O Hardware
Arquitetura do Arduino
www.meccomeletronica.com
Pgina 18
Pinos digitais
0 ou 1, low ou high
Pinos analgicos
(0,1,2,3.....1021,1022,1023)
www.meccomeletronica.com
Pgina 19
www.meccomeletronica.com
Pgina 20
www.meccomeletronica.com
Pgina 21
www.meccomeletronica.com
Pgina 22
Porta SPI: um padro de comunicao serial Sncrono, bem mais rpido que
a USART. nessa porta que conectamos cartes de memria (SD) e muitas
outras coisas. Pinos 10 (SS), 11 (MOSI), 12 (MISO) e 13 (SCK).
2.5 Firmware
simplesmente um software que carregado dentro da memria do micro
controlador. Tecnicamente o firmware a combinao de uma memria ROM,
somente para leitura, e um programa que fica gravado neste tipo de memria.
E esse o caso do micro controlador que a placa Arduino usa.
3. O Software
Quando tratamos de software na plataforma do Arduino, podemos referir-nos:
ao ambiente de desenvolvimento integrado do Arduino e ao software
desenvolvido por ns para enviar para a nossa placa. O ambiente de
desenvolvimento do Arduino um compilador gcc (C e C++) que usa uma
interface grfica construda em Java.
Basicamente se resume a um programa IDE muito simples de se utilizar e de
estender com bibliotecas que podem ser facilmente encontradas. As funes
da IDE do Arduino so basicamente duas: Permitir o desenvolvimento de um
software e envi-lo placa para que possa ser executado.
Para realizar o download do software basta ir at a pgina oficial do Arduino
(http://www.arduino.cc/), escolher o seu SO (existe pra Linux, Mac e Windows)
e baixa-lo. Obviamente, por ser open source, gratuito. Depois de baixado no
necessita de nenhuma instalao, s abrir o IDE e comear a utilizar.
www.meccomeletronica.com
Pgina 23
www.meccomeletronica.com
Pgina 24
www.meccomeletronica.com
Pgina 25
www.meccomeletronica.com
Pgina 26
www.meccomeletronica.com
Pgina 27
www.meccomeletronica.com
Pgina 28
4. UTILIZANDO UM PROTOBOARD
Sabemos que a porta digital escreve HIGH (5v) ou LOW (0v). Logo, se
colocarmos 5v o Led ir queimar. Portanto devemos colocar um resistor em
srie com o Led para limitarmos a corrente que passa por ele. Essa corrente
deve ser de algo em torno de 20mA. Assim, utilizando um pouquinho de teoria
de circuitos temos:
www.meccomeletronica.com
Pgina 29
www.meccomeletronica.com
Pgina 30
5. Utilizando o PWM
PWM significa modulao por largura de pulso (Pulse Width modulation) e
basicamente uma tcnica para obtermos resultados analgicos em com meios
digitais. O controle digital usado para criar uma onda quadrada, um sinal
alternado entre ligado e desligado. Assim a tcnica consiste em manipularmos
a razo cclica de um sinal, o duty cycle afim de transportar informao ou
controlar a potncia de algum outro circuito. Com isso, teremos um sinal digital
que oscila entre 0v e 5v com determinada freqncia (o Arduino trabalha com
um padro prximo a 500Hz). O duty cycle a razo do tempo em que o sinal
permanece em 5v sobre o tempo total de oscilao, como est ilustrado na
figura abaixo:
www.meccomeletronica.com
Pgina 31
www.meccomeletronica.com
Pgina 32
6. SHIELDS
O Arduino possui o que chamamos de Shields, que so nada mais, nada
menos do que outras plaquinhas que se acoplam placa original, agregando
diversas outras funcionalidades.
Existe diversos Shields, com diversas
funes. Alguns servem como entrada, como sada e outros como entradas e
sada. Com eles conseguimos, por exemplo, fazer com que o Arduino se
comunique numa rede Ethernet ou via USB com um celular Android.
Funcionalidades de alto nvel
Encaixados em cima do Arduino
Utilizam alguns pinos encaminham os outros
www.meccomeletronica.com
Pgina 33
7. CONTROLANDO UM ULTRASSOM
O Arduino possui muitos sensores. Aqui vamos aprender a controlar o
Ultrassom. Primeiramente vamos entender como o ultrassom funciona. Este
sensor emite um sinal na faixa de freqncia do ultrassom (por volta de 30kHz).
Este sinal se propaga pelo ar at encontrar
encontrar um obstculo. Ao colidir com o
obstculo uma parte do sinal refletida e captada pelo sensor. Portanto, um
nico sensor de ultrassom, possui um receptor e um emissor.
www.meccomeletronica.com
Pgina 34
Pgina 35
para que o resultado saia em centmetros, temos que dividir o tempo (duration)
por 29. Por fim o resultado impresso no serial monitor.
Para ligarmos o sensor precisaremos de auxlio de um protoboard. Observe
que no sensor vem especificado, trigger, echo, vcc e gnd. Agora s ligar cada
pino em seu correspondente e testar o seu programa.
www.meccomeletronica.com
Pgina 36
8. Utilizando a interrupo
Uma interrupo de entrada e sada (IO) uma funo que executada
quando existe uma mudana estado no pino correspondente, independente do
ponto em que se encontra a execuo do programa. O Arduino UNO possui
dois pinos que podem ser ligados como interrupo, os pinos 2 e 3 (no Arduino
mega temos 6 interrupes).
A funo attachInterrupt (interrupcao,funcao,modo) permite configurar uma
funo para ser executada caso haja uma mudana no pino de IO
correspondente. Os parmetros da funo so utilizados da seguinte forma:
1 - Interrupo: um inteiro que informa o nmero da interrupo, sabendo que
a interrupo 0 est associada ao pino 2 e a interrupo 1 est associada ao
pino 3.
2 - Funo: a funo a ser chamada caso ocorra a interrupo. Essa funo
no deve ter parmetros e nem retornar nada. conhecida como rotina de
servio de interrupo.
3 - Modo: Define quando a interrupo deve ser acionada. Quatro constantes
so pr-definidas como valores vlidos: LOW para acionar a interrupo
sempre que o pino for baixo, CHANGE para chamar uma interrupo sempre
que o pino sofrer alguma alterao de valor, RISING para acionar quando o
pino vai LOW para HIGH e por fim FALLING para acionar quando o pino vai de
HIGH para LOW.
Segue o exemplo abaixo em que um Led acendido ou apagado quando
ocorre alguma alterao no pino 13:
www.meccomeletronica.com
Pgina 37
www.meccomeletronica.com
Pgina 38
www.meccomeletronica.com
Pgina 39
1 - Para comear declaramos uma varivel do tipo Servo: Servo motor1; por
exemplo. No nosso caso de Arduino UNO podemos criar no mximo 8 servos.
2 - Temos que associar a varivel ao pino que ligamos anteriormente, e isso
feito da seguinte forma: motor1.attach(pino);
3 - Temos que escrever o ngulo para o qual o servo dever girar (entre 0 e
180): motor1.write(ngulo);
4 - Podemos tambm desejar saber o ngulo que o meu servo se encontra,
para isso: ang = motor1.read ();
5 - Podemos utilizar tambm as funes motor1.attached() para checar se o
servo est associado a algum pino e tambm a motor1.detach() para
desassociar o servo ao seu pino declarado do item 2 acima.
www.meccomeletronica.com
Pgina 40
www.meccomeletronica.com
Pgina 41
www.meccomeletronica.com
Pgina 42
www.meccomeletronica.com
Pgina 43
www.meccomeletronica.com
Pgina 44
www.meccomeletronica.com
Pgina 45
www.meccomeletronica.com
Pgina 46
www.meccomeletronica.com
Pgina 47