Você está na página 1de 18

Tutorial bsico de arduino

* para programadores
Jos de Figueiredo (autor)
Sulen Camargo (reviso)
Apresentao
Este tutorial est sendo desenvolvido para orientar, de forma
introdutria, o uso do arduino. Nosso pblico-alvo so profissionais de TI,
que j tenham alguma experincia com a linguagem de programao C/C++.
O que o arduino?
um kit de prototipagem rpida, uma placa de circuitos eletrnicos,
que foca na automao de dispositivos e sistemas. Para isto a placa possui
um microcontrolador programvel com diversos pinos de entrada e sada,
digitais e analgicas.
Com o arduino, pode-se automatizar uma variedade de atividades
eletro/mecnica desde que o arduino esteja devidamente preparado e
equipado para tal. Como por exemplo, pode-se automatizar a abertura e
fechamento de cortinas conforme determinadas condies ditadas de acordo
com as preferncias do usurios.
A figura 1 mostra a placa da ltima verso do arduino, a Arduino UNO.
Figura 1
Para os profissionais da computao, esta ferramenta se revela de
grande valia, uma vez que uma das formas de implementar de forma
prtica e rpida, a Internet das Coisas e tambm a computao
1
ubqua/pervasiva, conceitos estes relacionados a computao distribuda, um
fator de alta relevncia na atualidade.
O arduino tambm contribui para reduo de custos e o desperdcio de
tempo em projetos de automao.
1
Tambm chamada de IoT Internet of Things
Verses do arduino
O arduino fornecido em diversos formatos que so escolhidos
conforme as necessidades especficas do usurio. Apresentamos aqui 3 dos
modelos mais comuns:
Arduino UNO: a placa mais recente fornecida pelos desenvolvedores
(dez/2012). sobre esta placa que este tutorial est sendo baseado;
Arduino MEGA: uma verso mais robusta, tem mais velocidade e
mais portas de interfaceamento;
Arduino NANO: Verso compacta, com caractersticas parecidas com as
do UNO.
Outras verses e variaes podem ser encontradas no mercado. Por ser
uma tecnologia de hardware livre diferentes verses podem ser criadas por
2
diferentes desenvolvedores. Expandindo assim as capacidades desta
tecnologia.
Caractersticas tcnicas do arduino UNO
Alimentao: A placa do circuito pode ser energizada com tenses de
7v a 12v. Isto pode ser feito com baterias, pilhas ou fontes externas usando
o pluge de alimentao disponibilizado na placa, assim como via USB. Em
aplicaes simples usamos alimentao via USB, porm esta no poder ser
usada quando precisarmos da comunicao serial do aparelho.
Alimentao: A placa trabalha com alimentao entre 7v e 12v.
Tenso de operao: A placa trabalha, considerando o uso das sadas
PWM , com tenses de 0 a 5V.
3
Corrente nos pinos de I/O: A corrente mxima suportada por cada
pino de 40mA. A corrente total de kit de 150mA.
Memria flash: 32KB - a memria onde gravado o programa que foi
criado - denominado firmware.
Memria de execuo: 2KB
Pinos de I/O:
14 no total, sendo que 6 destes podem ser configurados como
sadas PWM;
6 pinos de entrada analgica (conversor A/D);
1 porta serial (pinos 0 e 1) ou porta serial USB.
2
Forma de tecnologia em que qualquer desenvolvedor tem acesso a sua fonte, tendo total
liberdade para executar melhorias e/ou modificaes.
3
PWM - Pulse Width Modulation.
Programao do arduino
O arduino programado em linguagem C/C++ em uma IDE
dedicada e fornecida pelo prprio arduino. A ferramenta multiplataforma e
traz embutida compilador e gravador.
Estrutura do programa feito para arduino no IDE arduino
Todo programa tem duas funes principais que so:
void setup() - executada apenas uma vez - na inicializao da
placa (quando esta for ligada). Esta funo frequentemente
usada para incializar variveis, objetos ou mtodos.
void loop() - executada sequencialmente, em loop infinito, aps
a inicalizao. onde nosso programa fica.
Para um programar necessrio conhecer o hardware e entender como
o programa que iremos criar interage com este hardware. preciso saber
quais pinos ligamos usamos, como usamos e quando usamos.
Queremos um programa que ligue um led - ento precisamos saber
onde o led foi ligado, para poder codificar usando a porta certa.
Primeiro Hello World
Um hello world no arduino pode significar uma infinidade de opes.
Nesta primeira verso vamos fazer o led que est na placa (ao lado do pino
13 (pisca em cor laranja).
helloworldv1.ino
byte Led = 13;
void setup(){
pinMode(Led, OUTPUT);
}
void loop(){
digitalWrite(Led,HIGH);
delay(1000);
digitalWrite(Led,LOW);
delay(1000);
}
Segundo Hello World
O circuito: O circuito mostrado na figura abaixo apresenta um led
comum, ligado a um resistor de 220R entre os pinos 13 e GND. A lgica do
circuito pode ser entendida assim: o sinal lgico alto e 5v (HIGH) sai pelo
pino 13, passa pelo resistor de 220R (limitador de corrente) e passa pelo
led; se o sinal lgico for baixo (LOW), ento na da passa pelo led e este fica
desligado.
1. Porque precisamos usar um resisitor? Nenhum componente pode ser
ligado diretamente na placa arduino (e a nenhum outra placa
eletrnica) sem um resistor limitador de corrente. Este resistor
limitador de corrente impede que o LED puxe mais corrente do que o
arduino pode fornecer. Se o led for ligado diretamente (sem o resistor),
a porta de sada do arduino (e talvez o prprio arduino) ser quimada
por sobre corrente. Esta caracterstica muito importante para garantir
a longevidade do kit, caso contrrio.
2. Um pouco mais sobre corrente: De forma bem simples, a corrente
eltrica o movimento dos eltrons em um condutor; este movimento de
eltrons capaz de produzir trabalhos, como ligar leds, motores,
acionar dispositivos entre outros. A unidade de medida usada para
medir corrente conhecida por ampre (simbolo A, tambm
encontramos I). Em circuitos microcontrolados a corrente muito
pequena, frequentemente medida em miliamperes (mA).
a. Entendendo o consumo: Para qualquer coisa funcionar, preciso
saber quantos Ampres sero consumidos. Por exemplo: uma
lmpada incandescente de 100W (aquelas antigas) precisa de
aproximadamente 0,45A para ligar; se ligarmos 3 lampadas em
um circuito qualquer, teremos um consumo de 3 x 0,45A = 1,3A.
b. Consumo no arduino: No caso do arduino, trabalhamos com
eletrnica de baixo consumo. Um led consome aproximadamente
0,015A para funcionar (15 mA) - uma porta do arduino consegue
suprir at 0,040A (40mA) ento podemos ligar apenas 2,6 leds
em uma porta. E se o mesmo for ligado sem o resistor limitador
de corrente .
c. Sempre consulte o manual de referncia do que voc pretende
ligar ao arduino, a fim de saber qual a corrente mxima que ele
consumir - caso contrario ...
Mas e o programa? O programa usado ser o mesmo do exemplo
anterior helloworldv1.ino - observe que o led externo est ligado no pino da
saida 13, que o mesmo compartilhado pelo led da placa.
Posso ligar em outra porta? Sim, podemos ligar em outra porta desde
que sejam respeitados os limites e que a programao seja adequada.
Semforo simples
Neste exemplo vamos programar um simples semforo.
Circuito:
Neste circuito temos 3 leds, cada um sendo limitado por um resistor de
330R. Os leds verde, amarelo e vermelho esto conectados respectivamente,
nas portas 8, 9 e 10. Saber onde esto ligados importante para que
possamos escrever nosso cdigo.
Cdigo:
byte ledG = 8;
byte ledY = 9;
byte ledR = 10;
void setup(){
pinMode(ledG,OUTPUT);
pinMode(ledY,OUTPUT);
pinMode(ledR,OUTPUT);
}
void loop(){
digitalWrite(ledR,HIGH);
digitalWrite(ledY,LOW);
digitalWrite(ledG,LOW);
delay(500);
digitalWrite(ledR,LOW);
digitalWrite(ledY,HIGH);
digitalWrite(ledG,LOW);
delay(500);
digitalWrite(ledR,LOW);
digitalWrite(ledY,LOW);
digitalWrite(ledG,HIGH);
delay(500);
}
Nosso cdigo bastante simples, inicializamos variveis de controle
dos leds, que informam o endereo de cada led no arduino; na funo
setup() configuramos os endereos dos leds para o modo sada; na funo
loop() criamos um ciclo temporizado pela funo delay(500). Esta funo
facilita bastante o controle de tempo para o programador arduino (controle
de tempo SEMPRE um desafio em microcontroladores).
delay(1000) referncia para 1s;
delay(500) referncia para 0,5s;
Enquanto que as funes digitalWrite(pino,estado) alternam os
estados dos leds para ligado (HIGH) ou desligado (LOW).
Controlando o semforo pela USB
O arduino UNO trabalha comunica-se com o computador pela porta
USB, tanto para transmisso do firmware como para controle do programa.
Vamos ento controlar o semforo enviando dados pela serial. O
objetivo simples: alterar o tempo do semforo enviando pela serial.
Circuito:
No muda.
Cdigo:
byte ledG = 8;
byte ledY = 9;
byte ledR = 10;
int tempo = 1000;
char cmd;
void setup(){
pinMode(ledG,OUTPUT);
pinMode(ledY,OUTPUT);
pinMode(ledR,OUTPUT);
Serial.begin(9600);
}
void loop(){
digitalWrite(ledR,HIGH);
digitalWrite(ledY,LOW);
digitalWrite(ledG,LOW);
delay(tempo);
digitalWrite(ledR,LOW);
digitalWrite(ledY,HIGH);
digitalWrite(ledG,LOW);
delay(tempo);
digitalWrite(ledR,LOW);
digitalWrite(ledY,LOW);
digitalWrite(ledG,HIGH);
delay(tempo);
if(Serial.available() > 0){
cmd = Serial.read();
switch (cmd){
case 'a':
tempo = tempo - 50;
break;
case 'd':
tempo = tempo - 50;
break;
}
}
}
No cdigo acima, temos a introduo da funo Serial, que
inicializada em setup(), setando a configurao para 9600 bps (taxa de
transferncia da serial.
Serial.begin(9600);
A funo Serial.available() detecta se h algo no buffer de entrada da
serial; havendo, o contedo lido e armazenado em uma varivel do tipo
char. Esta varivel ento testada, no caso em um switch/case, e uma ao
correspondente executada.
O que mais poderia ser feito para melhorar o cdigo acima ?
Controlado com botes
Para microcontrolar coisas, preciso ler sinais externos, como sensores
ou botes. No exemplo a seguir, dois botes controlam o desligamento e o
desligamento do led da placa.
Circuito:
O circuito da figura 5 mostra dois botes do tipo tctil; cada boto
est ligado a um pino de entrada digital do arduino; enquanto o boto no
est pressionado, o nvel lgico no pino baixo (LOW ou 0v); ao pressionar
o boto um nvel lgico alto (HIGH ou 5v) colocado no pino. Alguma funo
ser executada quando o boto for pressionado.
Cdigo:
byte btnOn = 7;
byte btnOff = 8;
byte led = 13;
boolean flagEstado = LOW;
void setup(){
pinMode(btnOn,INPUT);
pinMode(btnOff,INPUT);
pinMode(led,OUTPUT);
digitalWrite(led,flagEstado);
}
void loop(){
if(digitalRead(btnOn)){
flagEstado = HIGH;
delay(250);
}
if(digitalRead(btnOff)){
flagEstado = LOW;
delay(250);
}
digitalWrite(led,flagEstado);
}
No cdigo acima, temos a introduo da funo de leitura de entrada
digital, que inicializada em setup() com o comando pinMode(pino,INPUT).
INPUT configura uma porta como entrada e posteriormente o comando
digitalRead(porta) ir ler o estado desta porta.
O circuito est montado para que as portas estejam sempre em estado
baixo (LOW) passando para alto (HIGH) quando o boto pressionado; o
programa monitora os botes e quando detecta que um est em alto troca o
estado da flagEstado; produzindo o efeito liga/desliga do led. Evidentemente
poderamos fazer o mesmo usando apenas um boto, bastando adequar o
programa.
O que mais poderia ser feito para melhorar o cdigo acima ?
Sada analgica
Antes de prosseguir, necessrio conhcer as diferenas entre os sinais
Digital, Analgico e PWM.
Sinal Analgico
A natureza analgica; tudo ao nosso redor analgico, pois suas
medidas variam infinitamente entre uma medida e outra. Ex. som (temos
uma infinidade de amplitudes de som entre as frequncias A e B.
Sinal Digital
Computadores e sistemas informatizados em geral so digitais; seus
sinais variam entre um estado e outro. O famoso 0 (nvel lgico baixo) e 1
(nvel lgico alto). Ex. liga/desliga de um led.
A figura 6 mostra a diferena grfica entre os sinais. O sinal digital
compreendido normalmente pelo arduino enquanto que o analgico precisa
de uma interface especialmente projetada para fazer uma traduo.
Sinal PWM - Pulse Width Modulation
Modulao por largura de pulso (PWM) um mecanismo usado por
microcontroladores para escrever em uma sada digital um sinal que se
assemelha muito a um sinal analgico. Isto nos permite ter uma emulao
quase perfeita de um sinal analgico. Seu funcionamento baseia-se na
velocidade com que um sinal mantido em alto - observando a figura 7
podemos ter uma viso mais clara.
Considerando uma tenso mxima de 5v, com 20% de PWM teremos
uma tenso de sada de aproximadamente 1v (ver posio da seta na linha
azul); ainda, com 50% de PWM teremos uma tenso de sada de
aproximadamente 2,5v (ver posio da seta na linha azul); com 80% de PWM
teremos uma tenso de sada de aproximadamente 4v (ver posio da seta
na linha azul).
Podemos, desta forma atingir praticamente todos os nveis de tenso
entre 0v e 5v.
Sada analgica - PWM
O arduino UNO dotado de 6 sadas PWM que so sadas digitais
especiais, onde podemos emular uma sada analgica. A porta que tem esta
caracterstica pode tambm ser usada como sada digital convencional.
Estas portas PWM devem ser usadas sempre que precisamos controlar
um dispositivo analgico (ou que tenha um efeito analgico). Por exemplo
um buzzer (para produzir o som); um motor (para controlar a velocidade); um
led (para controlar o brilho).
Controlando o Brilho de um led
Neste exerccio, vamos controlar a intensidade da luz emitida por um
led
Circuito:
O circuito acima liga um led simples em uma porta PWM, no pino 9 do
arduino.
Cdigo:
byte ledPWM = 9;
void setup(){
//nada para ser feito aqui
}
void loop(){
for(int valFade = 0; valFade<=255; valFade +=5){
analogWrite(ledPWM,valFade);
delay(100);
}
for(int valFade = 255; valFade<=0 ; valFade -=5){
analogWrite(ledPWM,valFade);
delay(100);
}
}
O cdigo acima apresenta a funo analogWrite(pino,valor), pino DEVE
ser uma saida PWM e valor deve ser um valor entre 0 e 255 (byte). O circuito
aplica o PWM e leva para a sada a tenso correspondente.
O que mais poderia ser feito para melhorar o cdigo acima ?
Um alarme simples
O sensor de alarme (conhecido por reed switch) tambm pode ser
configurado no arduino; seu funcionamento muito parecido com o de um
boto do tipo tctil apresentado no exemplo anterior, sendo que quando o
sensor detectar que houve uma abertura o alarme ir disparar.
Circuito:
O circuito acima combina um sensor reed switch, que ligado da
mesma forma que um boto ttil e um buzzer (pequeno alto-falante), que
ligado em uma sada PWM.
Cdigo:
byte sensor = 5;
byte buzz = 9;
void setup(){
pinMode(sensor,INPUT);
}
void loop(){
if(digitalRead(sensor)){
disparaAlarme();
}
void disparaAlarme(){
analogWrite(buzz,127);
delay(100);
analogWrite(buzz,200);
delay(100);
}
O cdigo acima combina entrada digital com sada PWM. J explorados
em exemplos anteriores. A novidade est no uso de funes externas a ao
loop() e ao seutp(), bastando simplesmente declarar a funo e chamar
dentro de loop(). O uso de funes segue o mesmo princpio da linguagem C.
O que mais poderia ser feito para melhorar o cdigo acima ?
Entrada analgica
O arduino pode monitorar sinais analgicos do mundo exterior.
Evidentemente esta entrada deve ser um valor entre 0v e 5v; em outras
palavras, no podemos entrar diretamente com um sinal de 50v nos pinos
analgicos - seno
Para que o arduino possa compreender o sinal que est sendo
informado na entrada, o microcontorlador possui um conversor AD (analgico
para digital) com resoluo de 10bits.
* Quanto mais bits tiver o conversor, mais
precisa ser sua medida do valor
analgico.
Sensor de luminosidade
Nesta experincia, vamos fazer a leitura da intensidade e luminosidade
em um ambiente usando um componente sensvel a esta variao.
Circuito:
O circuito liga um sensor LDR (light dependent resistor), alimentado
por 5v, com corrente controlada por um resistor de 10KR, na porta 0
(primeira entrada analgica).
Cdigo:
byte sensorLRD = A0;
int valLido;
void setup(){
Serial.begin(9600);
}
void loop(){
valLido = analogRead(sensorLDR);
Serial.println(valLido);
delay(500);
}
O sensor LDR est ligado de forma a inserir na porta 0 um valor que
varia entre 0v e 5v; ao ler o valor na porta 0 este valor passa por uma
converso para digital em uma matriz de 10bits. O comando
analogRead(pino) faz a leitura do pino analgico e coloca em uma varivel
do tipo inteira; a funo Serial.println(varivavel) mostra este valor lido no
monitor serial.
Importante ressaltar que o valor lido uma representao da tenso
(analgica) lida no pino 0; no caso no est sendo feita nenhum tipo de
converso de unidade.
O que mais poderia ser feito para melhorar o cdigo acima ?
Lendo um potencimetro
Nesta experincia, vamos fazer a leitura da variao causada por um
potencimetro.
Circuito:
O potencimetro do circuito um resitor que varia seu valor entre 0 e
10KR; esta variao faz com que a tenso que saia do pino do meio (e que
est ligado na entrada analgica - pino 0 ) varie entre 0v e 5v.
Cdigo:
byte poten= A0;
int valLido;
void setup(){
Serial.begin(9600);
}
void loop(){
valLido = analogRead(poten);
Serial.print(valLido,DEC);
delay(500);
}
O cdgio bastant simples; l o valor analgico no pino 0 e envia
pela serial a cada s.
O que mais poderia ser feito para melhorar o cdigo acima ?
Lendo a temperatura
Nesta experincia vamos usar um sensor de temperatura bastante
simples e fcil de manipular.
Circuito:
O sensor de temperatura LM35 provvelmente um dos componentes
mais simples de se conectar ao arduino; sua alimentao no precisa de
resistor limitador, bastando ligar diretamente nos pinos de 5v e gnd. Os
dados lidos so entregues em uma sada analgica com variao de 10mV/
grau clcius.
Cdigo:
byte lm35= A0;
int valLido;
int temp;
void setup(){
Serial.begin(9600);
}
void loop(){
valLido = analogRead(lm35);
Serial.println(valLido);
delay(500);
}
Bibliografia
ARDUINO. Guia de referncia. Disponvel em: <http:
arduino.cc/en/Reference/HomePage>. Acesso em: 29 out. 2013.
ARDUINIZANDO. Brincando com o Arduino. Disponvel em:
<http://arduinizando.blogspot.com.br>. Acesso em: 29 out. 2013.
LABDEGARAGEM. Portal Lab de Garagem (arduino, eletrnica, robotica).
Disponvel em: <http: labdegaragem.com>. Acesso em: 29 out. 2013.
WEBTRONICO. Blog Projetos eletrnicos. Disponvel em:
<http://blog.webtronico.com>. Acesso em: 29 out. 2013.

Você também pode gostar