Transcript
Page 1: Apostila Arduino Basico

Tutorial básico de arduino

* para programadoresJosé de Figueiredo (autor)Suélen Camargo (revisão)

Apresentação

Este tutorial está sendo desenvolvido para orientar, de forma introdutória, o uso do arduino. Nosso público-alvo são profissionais de TI, que já tenham alguma experiência com a linguagem de programação C/C++.

O que é o arduino?

É um kit de prototipagem rápida, uma placa de circuitos eletrônicos, que foca na automação de dispositivos e sistemas. Para isto a placa possui um microcontrolador programável com diversos pinos de entrada e saída, digitais e analógicas.

Com o arduino, pode-se automatizar uma variedade de atividades eletro/mecânica 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 condições ditadas de acordo com as preferências do usuários.

A figura 1 mostra a placa da última versão do arduino, a Arduino UNO.

Figura 1

Para os profissionais da computação, esta ferramenta se revela de grande valia, uma vez que é uma das formas de implementar de forma prática e rápida, a Internet das Coisas e também a computação 1

ubíqua/pervasiva, conceitos estes relacionados a computação distribuída, um fator de alta relevância na atualidade.

O arduino também contribui para redução de custos e o desperdício de tempo em projetos de automação.

1Também chamada de IoT – Internet of Things

Page 2: Apostila Arduino Basico

Versões do arduino

O arduino é fornecido em diversos formatos que são escolhidos conforme as necessidades específicas do usuário. 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 versão mais robusta, tem mais velocidade e mais portas de interfaceamento;

● Arduino NANO: Versão compacta, com características parecidas com as do UNO.

Outras versões e variações podem ser encontradas no mercado. Por ser uma tecnologia de hardware livre diferentes versões podem ser criadas por 2

diferentes desenvolvedores. Expandindo assim as capacidades desta tecnologia.

Características técnicas do arduino UNO

Alimentação: A placa do circuito pode ser energizada com tensões de7v a 12v. Isto pode ser feito com baterias, pilhas ou fontes externas usandoo pluge de alimentação disponibilizado na placa, assim como via USB. Emaplicações simples usamos alimentação via USB, porém esta não poderá serusada quando precisarmos da comunicação serial do aparelho.

Alimentação: A placa trabalha com alimentação entre 7v e 12v.

Tensão de operação: A placa trabalha, considerando o uso das saídasPWM , com tensões de 0 a 5V.3

Corrente nos pinos de I/O: A corrente máxima suportada por cadapino é de 40mA. A corrente total de kit é de 150mA.

Memória flash: 32KB - É a memória onde é gravado o programa que foicriado - denominado firmware.

Memória de execução: 2KB

Pinos de I/O:

● 14 no total, sendo que 6 destes podem ser configurados comosaídas PWM;

● 6 pinos de entrada analógica (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 totalliberdade para executar melhorias e/ou modificações.3 PWM - Pulse Width Modulation.

Page 3: Apostila Arduino Basico

Programação do arduinoO arduino é programado em linguagem C/C++ em uma IDE

dedicada e fornecida pelo próprio arduino. A ferramenta é multiplataforma e traz “embutida” compilador e gravador.

Estrutura do programa feito para arduino no IDE arduinoTodo programa tem duas funções principais que são:

● void setup() - é executada apenas uma vez - na inicialização da placa (quando esta for ligada). Esta função é frequentemente usada para incializar variáveis, objetos ou métodos.

● void loop() - é executada sequencialmente, em loop infinito, após a inicalização. É onde nosso programa fica.

Para um programar é necessário 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 - então precisamos saber onde o led foi ligado, para poder codificar usando a porta certa.

Primeiro Hello WorldUm hello world no arduino pode significar uma infinidade de opções.

Nesta primeira versão vamos fazer o led que está na placa (ao lado do pino 13 (pisca em cor laranja).

Page 4: Apostila Arduino Basico

helloworldv1.ino

byte Led = 13;

void setup(){ pinMode(Led, OUTPUT);}

void loop(){ digitalWrite(Led,HIGH); delay(1000); digitalWrite(Led,LOW); delay(1000);}

Segundo Hello WorldO circuito: O circuito mostrado na figura abaixo apresenta um led

comum, ligado a um resistor de 220R entre os pinos 13 e GND. A lógica do circuito pode ser entendida assim: “o sinal lógico alto e 5v (HIGH) sai pelo pino 13, passa pelo resistor de 220R (limitador de corrente) e passa pelo led; se o sinal lógico for baixo (LOW), então 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 eletrônica) 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 saída do arduino (e talvez o próprio arduino) será quimada por sobre corrente. Esta característica é muito importante para garantir

Page 5: Apostila Arduino Basico

a longevidade do kit, caso contrário….

2. Um pouco mais sobre corrente: De forma bem simples, a corrente elétrica o movimento dos elétrons em um condutor; este movimento de elétrons é capaz de produzir trabalhos, como ligar leds, motores, acionar dispositivos entre outros. A unidade de medida usada para medir corrente é conhecida por ampére (simbolo A, também 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 Ampéres serão consumidos. Por exemplo: uma lâmpada 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 eletrônica de baixo consumo. Um led consome aproximadamente 0,015A para funcionar (15 mA) - uma porta do arduino consegue suprir até 0,040A (40mA) então 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 referência do que você pretende ligar ao arduino, a fim de saber qual a corrente máxima 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 programação seja adequada.

Page 6: Apostila Arduino Basico

Semáforo simplesNeste exemplo vamos programar um simples semáforo.

Circuito:

Neste circuito temos 3 leds, cada um sendo limitado por um resistor de 330R. Os leds verde, amarelo e vermelho estão conectados respectivamente, nas portas 8, 9 e 10. Saber onde estão ligados é importante para que possamos escrever nosso código.

Código: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 código é bastante simples, inicializamos variáveis de controle dos leds, que informam o “endereço” de cada led no arduino; na função setup() configuramos os “endereços” dos leds para o modo saída; na função loop() criamos um ciclo temporizado pela função delay(500). Esta função facilita bastante o controle de tempo para o programador arduino (controle

Page 7: Apostila Arduino Basico

de tempo SEMPRE é um desafio em microcontroladores).

● delay(1000) é referência para 1s;● delay(500) é referência para 0,5s;

Enquanto que as funções digitalWrite(pino,estado) alternam os estados dos leds para ligado (HIGH) ou desligado (LOW).

Controlando o semáforo pela USBO arduino UNO trabalha comunica-se com o computador pela porta

USB, tanto para transmissão do “firmware” como para controle do programa.Vamos então controlar o semáforo enviando dados pela serial. O

objetivo é simples: alterar o tempo do semáforo enviando pela serial.

Circuito:Não muda.

Código:

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 código acima, temos a introdução da função Serial, que é inicializada em setup(), setando a configuração para 9600 bps (taxa de transferência da serial.

Serial.begin(9600);

A função Serial.available() detecta se há algo no buffer de entrada da serial; havendo, o conteúdo é lido e armazenado em uma variável do tipo char. Esta variável é então testada, no caso em um switch/case, e uma ação correspondente é executada.

Page 8: Apostila Arduino Basico

O que mais poderia ser feito para melhorar o código acima ?

Controlado com botõesPara microcontrolar coisas, é preciso ler sinais externos, como sensores

ou botões. No exemplo a seguir, dois botões controlam o desligamento e o desligamento do led da placa.

Circuito:

O circuito da figura 5 mostra dois botões do tipo táctil; cada botão está ligado a um pino de entrada digital do arduino; enquanto o botão não está pressionado, o nível lógico no pino é baixo (LOW ou 0v); ao pressionar o botão um nível lógico alto (HIGH ou 5v) é colocado no pino. Alguma função será executada quando o botão for pressionado.

Código:

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 código acima, temos a introdução da função 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.

Page 9: Apostila Arduino Basico

O circuito está montado para que as portas estejam sempre em estado baixo (LOW) passando para alto (HIGH) quando o botão é pressionado; o programa monitora os botões e quando detecta que um está em alto troca o estado da flagEstado; produzindo o efeito liga/desliga do led. Evidentemente poderíamos fazer o mesmo usando apenas um botão, bastando adequar o programa.

O que mais poderia ser feito para melhorar o código acima ?

Page 10: Apostila Arduino Basico

Saída analógicaAntes de prosseguir, é necessário conhcer as diferenças entre os sinais

Digital, Analógico e PWM.

Sinal Analógico

A natureza é analógica; tudo ao nosso redor é analógico, pois suas medidas variam infinitamente entre uma medida e outra. Ex. som (temos uma infinidade de amplitudes de som entre as frequências A e B.

Sinal Digital

Computadores e sistemas informatizados em geral são digitais; seus sinais variam entre um estado e outro. O famoso 0 (nível lógico baixo) e 1 (nível lógico alto). Ex. liga/desliga de um led.

A figura 6 mostra a diferença gráfica entre os sinais. O sinal digital é compreendido normalmente pelo arduino enquanto que o analógico precisa de uma interface especialmente projetada para fazer uma tradução.

Sinal PWM - Pulse Width Modulation

Modulação por largura de pulso (PWM) é um mecanismo usado por microcontroladores para escrever em uma saída digital um sinal que se assemelha muito a um sinal analógico. Isto nos permite ter uma “emulação” quase perfeita de um sinal analógico. Seu funcionamento baseia-se na velocidade com que um sinal é mantido em “alto” - observando a figura 7 podemos ter uma visão mais clara.

Considerando uma tensão máxima de 5v, com 20% de PWM teremos uma tensão de saída de aproximadamente 1v (ver posição da seta na linha azul); ainda, com 50% de PWM teremos uma tensão de saída de aproximadamente 2,5v (ver posição da seta na linha azul); com 80% de PWM teremos uma tensão de saída de aproximadamente 4v (ver posição da seta na linha azul).

Podemos, desta forma atingir praticamente todos os níveis de tensão entre 0v e 5v.

Page 11: Apostila Arduino Basico

Saída analógica - PWMO arduino UNO é dotado de 6 saídas PWM que são saídas digitais

especiais, onde podemos emular uma saída analógica. A porta que tem esta característica pode também ser usada como saída digital convencional.

Estas portas PWM devem ser usadas sempre que precisamos controlar um dispositivo analógico (ou que tenha um efeito analógico). 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 ledNeste exercício, vamos controlar a intensidade da luz emitida por um

led

Circuito:

Page 12: Apostila Arduino Basico

O circuito acima liga um led simples em uma porta PWM, no pino 9 do arduino.

Código:

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 código acima apresenta a função 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 saída a tensão correspondente.

O que mais poderia ser feito para melhorar o código acima ?

Page 13: Apostila Arduino Basico

Um alarme simplesO sensor de alarme (conhecido por reed switch) também pode ser

configurado no arduino; seu funcionamento é muito parecido com o de um botão do tipo táctil 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 botão tátil e um buzzer (pequeno alto-falante), que é ligado em uma saída PWM.

Código:

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 código acima combina entrada digital com saída PWM. Já explorados em exemplos anteriores. A novidade está no uso de funções externas a ao

Page 14: Apostila Arduino Basico

loop() e ao seutp(), bastando simplesmente declarar a função e chamar dentro de loop(). O uso de funções segue o mesmo princípio da linguagem C.

O que mais poderia ser feito para melhorar o código acima ?

Entrada analógicaO arduino pode monitorar sinais analógicos do mundo exterior.

Evidentemente esta entrada deve ser um valor entre 0v e 5v; em outras palavras, não podemos entrar diretamente com um sinal de 50v nos pinos analógicos - senão ……

Para que o arduino possa compreender o sinal que está sendo informado na entrada, o microcontorlador possui um conversor AD (analógico para digital) com resolução de 10bits.

* Quanto mais bits tiver o conversor, maisprecisa será sua medida do valoranalógico.

Sensor de luminosidadeNesta experiência, vamos fazer a leitura da intensidade e luminosidade

em um ambiente usando um componente sensível a esta variação.

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 analógica).

Page 15: Apostila Arduino Basico

Código:

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 conversão para digital em uma matriz de 10bits. O comando analogRead(pino) faz a leitura do pino analógico e coloca em uma variável do tipo inteira; a função Serial.println(varivavel) mostra este valor lido no monitor serial.

Importante ressaltar que o valor lido é uma representação da tensão (analógica) lida no pino 0; no caso não está sendo feita nenhum tipo de conversão de unidade.

O que mais poderia ser feito para melhorar o código acima ?

Lendo um potenciômetroNesta experiência, vamos fazer a leitura da variação causada por um

potenciômetro.

Circuito:

Page 16: Apostila Arduino Basico

O potenciômetro do circuito é um resitor que varia seu valor entre 0 e 10KR; esta variação faz com que a tensão que saia do pino do meio (e que está ligado na entrada analógica - pino 0 ) varie entre 0v e 5v.

Código:

byte poten= A0;int valLido;

void setup(){ Serial.begin(9600);}

void loop(){ valLido = analogRead(poten);

Serial.print(valLido,DEC); delay(500);}

O códgio é bastant simples; lê o valor analógico no pino 0 e envia pela serial a cada ½s.

O que mais poderia ser feito para melhorar o código acima ?

Lendo a temperaturaNesta experiência vamos usar um sensor de temperatura bastante

simples e fácil de manipular.

Circuito:

O sensor de temperatura LM35 é provávelmente um dos componentes mais simples de se conectar ao arduino; sua alimentação não precisa de resistor limitador, bastando ligar diretamente nos pinos de 5v e gnd. Os

Page 17: Apostila Arduino Basico

dados lidos são entregues em uma saída analógica com variação de 10mV/ grau célcius.

Código:

byte lm35= A0;int valLido;int temp;

void setup(){ Serial.begin(9600);}

void loop(){ valLido = analogRead(lm35); Serial.println(valLido); delay(500);}

Page 18: Apostila Arduino Basico

Bibliografia

ARDUINO. Guia de referência. Disponível em: <http: arduino.cc/en/Reference/HomePage>. Acesso em: 29 out. 2013.

ARDUINIZANDO. Brincando com o Arduino. Disponível em: <http://arduinizando.blogspot.com.br>. Acesso em: 29 out. 2013.

LABDEGARAGEM. Portal Lab de Garagem (arduino, eletrônica, robotica). Disponível em: <http: labdegaragem.com>. Acesso em: 29 out. 2013.

WEBTRONICO. Blog Projetos eletrônicos. Disponível em: <http://blog.webtronico.com>. Acesso em: 29 out. 2013.


Top Related