Apostila Arduino para Correção
Apostila Arduino para Correção
INTRODUÇÃO
A
PLATAFORMA
ARDUINO
CURSO TECNICO EM MECATRÔNICA
Sumário
Microcontrolador ....................................................................................... 15
Características:.................................................................................... 16
Periféricos ........................................................................................... 16
Instalação .................................................................................................. 29
Operadores ................................................................................................ 44
PWM .................................................................................................................... 79
O projeto Arduino que conhecemos hoje, foi iniciado no ano de 2005 com a
finalidade de ser uma opção barata para que alunos pudessem realizar seus 05
projetos com microcontroladores. Foi desde o início desenvolvida para ser uma
plataforma (um conjunto de soluções) open-source composto por uma placa, cujo
esquemas estão disponíveis no site oficial, um ambiente de desenvolvimento (IDE)
disponível gratuitamente e por uma linguagem de programação simples e fácil de
utilizar, além de ser multiplataforma, podendo rodar em ambientes Windows,
Linux e MAC.
A plataforma Arduino foi feita para aprender mexendo! Pode-se ensinar desde
lógica de programação simples até avançada. É possível ensinar vários conceitos
de eletrônica, como diversos componentes são ligados às saídas de
microcontroladores e como o microcontrolador entende esses componentes.
A família Arduino.
Atualmente, o projeto UNO é a placa de referência adotada pela equipe Arduino que
mantém na página oficial – www.arduino.cc, toda a documentação atualizada com
referências e exemplos de códigos de aplicação.
Existem outras placas disponíveis como o DUE que é uma placa que possui um número
maior de I/O,
06
http://arduino.cc/en/Main/Products
Existem ainda placas que são adicionadas a placa do Arduino que acrescentam
funcionalidades à plataforma. Essas placas são conhecidas com Shields. Um
exemplo disso é o shield ethernet. Com ele o Arduino poderá ser conectado à
internet a partir de qualquer tomada RJ45.
http://arduino.cc/en/Main/Products
Além dos modelos oficiais, como o projeto é aberto, existem diversas empresas
e grupos que a partir da documentação disponível, desenvolvem produtos e em 07
muitos casos também o comercializam. Uma lista com todos os modelos
similares reconhecidos pode ser encontrada no endereço seguinte:
http://playground.arduino.cc/Main/SimilarBoards
Figura 4 - Severino
http://www.arduino.cc/en/Main/ArduinoBoardSerialSingleSided3
Capítulo 3
Microcontrolador.
VOC
Watchdog
debugWIRE
Timer
Power
Watchdog Supervision PROGRAM
Oscillator POR/BOD & LOGIC
RESET
Oscillator
Flash SRAM
Circuits/
Clock
Generation
EEPROM
08 AVCC
AREF
GND
Analog Internan
8bit T/C 2 Comp. Bandcap
RESET
XTAL[1.2]
Periféricos:
• 23 I/O programáveis.
• 2 temporizadores/contadores de 8 bits com Prescaler separado, 1 modo de
comparação.
• 1 temporizadores/contadores de 16 bits com Prescaler separado, modo de
comparação e captura.
• Contador de tempo real (com cristal externo de 32.768 Hz) conta 09
precisamente 1s.
• 3 canais PWM.
• 6 canais A/D com precisão de 10 bits
• Interface serial para dois fios orientada a Byte (TWI), compatível com o
protocolo I2C.
• Interface serial USART.
• Interface serial SPI Master/Slave
• Watchdog Timer com oscilador interno separado
• Oscilador RC interno (não há necessidade de cristal externo ou outra fonte
de clock).
• 5 modos de Sleep: Idle; Redução de ruído do A/D; Power-Down; Power Safe
e Standby.
Descrição dos pinos
10
.
Capítulo 4
11
Esta placa será conectada ao computador
através da entrada USB. Por essa conexão, a
placa será alimentada com 5V e se
comunicará com o computador.
Além de serem pinos de I/O, alguns tem funcionalidades específicas que estão
descritas a seguir.
Terminais Denominação Descrição
13
Estes terminais além de
RX – Utilizado para receber dados seriais estarem conectados aos
0 pinos TXD e RXD do
TTL
microcontrolador, também
estão ligados ao CI FTDI que
faz a comunicação serial
TX – Utilizado para transmitir dados entre o microcontrolador e o
1
seriais TTL computador.
Assim como nos pinos digitais, alguns pinos têm funções especiais.
14
Tabela 2- Pinos Analógicos.
15
Capítulo 5
A plataforma Arduino utiliza a linguagem de programação Arduino baseada em Wiring que é uma
linguagem de programação open-source para microcontroladores. A estrutura desta linguagem é
muito parecida com a linguagem C sendo que aqueles que dominam a linguagem de programação C
terão pouquíssima dificuldade para programar um Arduino. A estrutura básica da linguagem de
programação do Arduino é bastante simples e é composta de pelo menos duas partes, que são os
blocos setup e loop.
O primeiro bloco é o setup. Nele serão declaradas as variáveis e as configurações dos pinos utilizados,
se serão de entrada ou de saída. Nele também será inicializada a comunicação serial se for utilizada.
O bloco setup, é executado apenas uma única vez, quando o programa é inicializado.
No bloco loop, os pinos de entrada e saída serão constantemente “lidos”, sendo os estados
processados pelo µC (de acordo com as instruções do programa) e alterados quando for o caso. O
processo é contínuo e será encerrado apenas quando uma interrupção acontecer ou o µC for
desligado.
Para escrever um programa, entre outros elementos, são utilizadas funções que são pequenos blocos de
programas usados para montar o programa principal. São como sub-rotinas, procedimentos ou
bibliotecas, escritas para realizar tarefas repetitivas.
Toda a função deve der declarada antes de ser chamada, atribuindo-lhe um tipo e um nome seguido de
parênteses onde serão colocados os parâmetros da função. Entre chaves { }, serão escritos os
procedimentos que a função deverá executar.
A função setup()
É chamada apenas uma única vez e é responsável por iniciar os modos de trabalho dos pinos, e a porta
serial. Deve ser incluído no programa mesmo que não exista alguma declaração para ser feita.
Como em qualquer linguagem de programação a forma como a palavra é escrita, determina se será ou
não reconhecida dando então o necessário significado ao programa que está sendo feito. A palavra
setup (e as outras utilizadas na linguagem de programação do Arduino) devem ser escritas como
determina a referência da linguagem. Os dois parênteses escritos logo a seguir, nesta função, serão
vazios, sem parâmetros, porém não poderão ser suprimidos.
A função loop()
Logo após a função setup, a função loop é escrita e dentro desse bloco é que estará distribuído o
conjunto de instruções que caracterizarão o programa. Este bloco será lido sequencialmente e cada
linha executada a partir da primeira até a última. Após isso, o programa volta para a primeira linha e
executa novamente cada uma das linhas do programa, ciclicamente.
Capítulo 6
Exemplo de programa.
Vamos então utilizar um programa básico do Arduino que é o que faz o Led que está
conectado ao pino 13 da placa piscar para exemplificar a estrutura de programação do
Arduino.
17
O código escrito acima é de domínio público e pode ser encontrado na própria IDE do
Arduino no menu exemplos. Como em todo programa, o recurso de comentar o texto,
explicando o que ele faz e o que cada linha deve executar está presente.
/* */ é utilizado para escrever um comentário de duas ou mais linhas.
18
Então, nesta linha, foi criada uma variável chamada led do tipo int
(que armazena números na faixa de 2^-10 até 2^10 – 1) e que
está fisicamente conectada ao pino 13 da placa, e que neste caso,
também está conectado ao led da placa.
A função setup, não retorna valor algum e por isso, é do tipo void.
Instalação.
Para utilizar qualquer placa Arduino oficial, basta ir até a página de download
-http://arduino.cc/en/Main/Software - e escolher a opção do sistema
operacional instalado em seu computador. No caso da versão para Windows,
o arquivo estará compactado. Basta então fazer a descompactação do arquivo
e executar os procedimentos comuns utilizados para instalação de qualquer
software. Para os outros sistemas operacionais, o procedimento é
semelhante.
Este arquivo que será baixado e instalado em seu computador é o ambiente
de programação do Arduino, ou IDE. Atualmente, a versão da IDE é a 1.0.5.
Em placas Arduino compatíveis, como é o caso da placa da EMPRETEC, as vezes
é necessário instalar um driver de comunicação próprio da placa. No CD que
acompanha o kit, existe um instalador com um atalho para a instalação desse
driver.
Uma vez feito isso, a plataforma está praticamente pronta para uso.
20
Capítulo 8
O ambiente de programação.
É no IDE do Arduino que o programa será escrito e, também transferido para a placa a fim de
ser gravado no µC. Para isso, é necessário conectar a placa do µC através de um cabo USB ao
computador. Inicie então a IDE que terá a aparência mostrada abaixo.
Nome provisório
do código e
versão da IDE
Barra de menus
21
Área de mensagens
Modelo da placa
e porta serial
COM utilizada
Figura 24 - Preferencias.
O próximo passo é configurar o tipo de placa que será utilizado. A placa da EMPRETEC é do
tipo Duelmilanove. Então no menu Ferramentas, selecione Placa. Da lista de opções aberta,
selecione o modelo Arduino Duemilanove w/ ATme- ga328.
Voltando a IDE, confirme o número da COM selecionada. Ela deve ser a mesma que a
23
indicada no painel de controle. No exemplo, a porta COM deve ser a 6. Então vá no menu
Ferramentas e selecione Porta Serial. Na lista de COM selecione a indicada no painel de
controle.
Pronto! Agora é necessário escrever o programa. Vamos utilizar o programa “Piscar” que já
detalhamos.
Capítulo 9
Escrevendo um programa.
Não se esqueça de salvar o programa. Isso pode ser feito no menu Arquivo.
Figura 29 - Compilando.
Figura 30 - Gravando o programa no micro.
Para transferir o programa para o µC, é necessário pressionar o botão carregar disponível
na barra de botões.
Observando a placa, perceba que os dois leds TX e RX piscam rapidamente. Este é o sinal
de que o programa está sendo trans ferido e gravado no µC.
25
Alterando o programa.
Após fazer as alterações, salve este programa com um nome diferente e repita os passos
de verificar e carregar. Observe o LED da placa. Ele pisca mais rapidamente.
Para ligar um LED em uma das portas de saída é necessário ligar um resistor em
série com o LED. A tensão na porta no estado 1 é 5V e portanto um resistor entre
150Ω a 330Ω deve satisfazer essa condição.
Ligue na matriz de contatos dois LEDs, cada um com o seu resistor em série como
mostra o esquema a seguir.
27
Uma vez montado o circuito, é necessário alterar o programa. Então vamos para a IDE.
int led1 = 2;
int led2 = 3;
int led3 = ;
int led4 = ;
void setup() {
pinMode(led1, OUTPUT);
28
pinMode(led2, OUTPUT);
pinMode(led…, );
pinMode(led…, OUTPUT);
Capacitação técnica na plataforma Arduino
void loop() {
digitalWrite (led1, HIGH);
delay(500);
digitalWrite (led2, HIGH);
delay( );
digitalWrite (led_, );
delay( );
}
Figura 34 - Completando o programa.
EX-2 – Acendendo 4 LEDs e apagando na mesma sequencia.
Conectando LEDs 3.
30
Neste espaço, escreva programa solicitado.
Capacitação técnica na plataforma Arduino
DESAFIO
Adicionando variáveis.
Nos programas anteriores, o tempo que determinava quando cada LED acendia ou apagava era escrito
dentro da função delay. Isto significa que cada vez que for necessário modificar o tempo, é necessário
alterar cada um dos valores. Em vez disso, uma variável “tempo” pode ser criada e será esta variável
que ficará dentro da função delay. Assim, para alterar o valor do “tempo” basta alterar apenas esta
variável.
Para criar uma variável o primeiro passo é determinar qual deve ser o tipo da variável. O tipo
determina qual o tipo de dado e sua extensão além de diretamente influenciar no tamanho do arquivo.
Tipo Descrição
A palavra reservada void é usada em declarações de funções. Este tipo indica que a função não
void
retorna nenhum valor quando é executada.
O tipo boolean pode representar valores booleanos, verdadeiro (true) ou falso(false). Um tipo boolean
Boolean
ocupa um byte da Memoria.
O tipo char armazena valores de 1 byte. Caracteres são codificados em um único byte e são especificados
na tabela ASCII. O tipo char é sinalizado e representa números de -128 a 127. Para números não
32 char sinalizados usa-se o tipo byte.
unsigned unsigned char armazena valores de 1 byte não sinalizados, é mesmo que utiliza o tipo byte. A faixa de
Capacitação técnica na plataforma Arduino
No Arduino UNO e em outras placas baseadas em ATMEGA armazenam valores de 16 bits não sinalizados,
unsigned int ou seja, apenas valores positivos de 0 a 65535.
O tipo armazena valores de 16 bis não sinalizados que compreendem valores de 0 a 65535.
word
O tipo de dado Long armazena valores inteiros sinalizados de 32 bits (4 bytes) que
long
compreendem a faixa de -2147483648 a 2147483647.
unsigned O tipo unsigned long armazena valores de 32 bits (4 bytes) não sinalizados que compreendem a faixa
long de 0 a 429967295.
O tipo float armazena valor em ponto flutuante, ou seja, um valor que possui casas decimais. O tipo
float float armazena valores de 32 bits (4 bytes) e compreendem a faixa de -3,4028235 E+38 a 3,4028235
E+38.4.
double O tipo double também armazena valores de ponto flutuante, porém no Arduino Uno e outras placas
baseadas em ATMEGA esse tipo é exatamente o mesmo que o tipo float, sem ganho de precisão,
De acordo com a tabela, é preferível utilizar o tipo byte para a variável tempo e, também, para as variáveis
led. Isto resultará em um programa que ocupa menos espaço de memória.
EX-4 – Inserindo variável tempo 1.
byte led1 = 2;
byte led2 = 3;
byte led3 = 4; 33
byte led4 = 5;
byte tempo = 0;
}
void loop() {
digitalWrite (led1, HIGH);
delay(tempo);
}
EX-5 – Inserindo variável tempo 2.
34
Capacitação técnica na plataforma Arduino
Capítulo 12
Operadores.
Resto da
% x= 7%5 “x” guarda 2, o resto da divisão
divisão
Aritméticos
Tabela 5 - Operadores
Além desses, existem também os operadores bit a bit que realizam operações de
bit e os operadores compostos.
Soma += w+ = d w = w+d
Subtração -= w- = d w = w-d
Produto *= w* = d w = w*d
Compostos
Divisão /= w/ = d w = w/d
Incremento ++ w ++ w = w+1
Decremento -- w -- w = w-1
Botões, chaves ou interruptores estão presentes em diversas situações nos circuitos digitais. A
configuração básica para montar um botão é associando-o a um resistor cuja finalidade é fixar um
valor de tensão ao pino digital que terá seu nível lógico invertido ao ser pressionado o botão. O
nome dado a estes resistores depende do nível de tensão que eles fixam no pino digital, observe:
37
A alimentação do conjunto ( resistor de 10KΩ / chave) deve ser a mesma que alimenta o µC.
Já na parte de programação, é necessário que a porta em que o botão foi ligado seja
constantemente lida para saber se o valor é igual à 1 ou igual à 0. A função digitalRead(pino)
é utilizada para ler o estado do botão que retornará HIGH ou LOW dependendo do estado lido.
O programa abaixo, será utilizado para ler o estado de um botão que controlará o LED que está
no pino 5 da placa Arduino.
int LED = 5;
Inicie declarando as variáveis globais LED e BOTAO.
int BOTAO = 6;
void setup() {
pinMode(LED, OUTPUT);
void loop(){
val = digitalRead(BOTAO); Nesta linha, a variável “val” recebe o valor lido no botão.
digitalWrite(led, val);
Nesta linha, o valor escrito na variável “val” é atribuído ao LED
}
Sendo Pressionada
R:
EX-7 – Ligando um botão na configuração Pull-up.
Sendo Pressionada
R:
40
EX-9 – Ligando botão com Pull up interno e inversão do estado logico do led.
Sabemos que uma chave ao ser acionada, cria uma série de ruídos que poderão ser
“entendidos” pelas entradas do microcontrolador e erroneamente interpreta- dos
pelo programa. Esses “ruídos” são denominados de bounce e em alguns casos, é
necessário eliminá-los para que o programa não interprete um valor errado. Uma
das maneiras de eliminar esse ruído, é proporcionando um atraso entre o primeiro
acionamento do interruptor e a leitura na entrada do microcontrolador.
http://arduino.cc/playground/Code/Bounce
Capacitação técnica na plataforma Arduino
Nesta página, é possível através do link baixar a biblioteca que está compactada.
Os passos seguintes mostrarão como instalar esta biblioteca no IDE do Arduino.
int Botao1 = 6;
int Botao2 = 7;
int LED = 2;
int val1 = 0;
int val2 = 0;
int resultado = 0;
43
void setup () {
pinMode (LED,OUTPUT);
pinMode(Botao1,INPUT);
pinMode(Botao2,INPUT);
}
void loop(){
val1=digitalRead(Botao1);
val2=digitalRead(Botao2);
resultado = val1&&val2;
digitalWrite(LED,resultado);
}
EX-11 - Operações lógicas.
• Acrescente mais dois leds ao programa anterior e as operações lógicas OR e
NOR que serão realizadas entre os botões 1 e 2 e o resultado de cada uma,
mostrado nos LEDS 3, 4 e 5.
• Utilize o espaço abaixo para registrar o programa.
44
Toda a placa da família Arduino, possui pelo menos uma porta serial que serve para
comunicação entre a placa Arduino e o PC ou entre outros dispositivos seriais. A UART -
Universal Asynchronous Receiver Trasmitter – no Arduino está disponível tanto na
própria entrada USB como também nos pinos 0 e 1 da placa. A interface é utilizada para
comunicação com o PC e outros dispositivos que contenham saídas USB e os pinos 0 e 1
para comunicação entre outros dispositivos como outras placas Arduino ou Shields que
trabalham em conjunto com o Arduino.
46
Figura 44 - Monitor serial.
Capacitação técnica na plataforma Arduino
Serial.begin(9600);
Função empregada para configurar a comunicação serial. A taxa de comunicação Serial
[Arduino x PC], padrão é de 9600 bps. Sempre que a comunicação serial for utilizada, esta
função será escrita dentro do setup e quando ativa a comunicação serial, os pinos 0 e 1 da
placa Arduino não podem ser utilizados como entrada.
Serial.available();
Esta função fica constantemente lendo a porta serial do Arduino. Caso algum valor estiver
sendo mandado, ela enviará um valor maior do que 0, retornando o número de Bytes
disponíveis para leitura. Caso nada estiver sendo enviado, a porta retornará 0.
Serial.read();
Lê o primeiro byte que está no buffer que se comporta como uma FIFO. Quando retornar
-1, significa que não existem dados a serem resgatados.
Serial.write();
Esta função será utilizada para escrever na Serial, ou seja, envia algo para o computador
que se estiver disponível, receberá a informação.
Serial.print();
Escreve na serial texto em formato ASCII.
Serial.print ( 123 ); // Envia “123”
Serial.print ( 1.234567 ); // Envia “1.23”
Serial.print ( ‘N’ ); // envia “N”.
Serial.print ( “Hello world” ); // envia “Hello world”.
Obs.: caracteres são enviados com aspas simples e strings com aspas duplas.
Serial.println();
Esta função, escreve o caractere em ASCII e ao final, transmite o caractere Carrier Return
(retorno ao início da linha) e o caractere New Line (mudança para a próxima linha).
Vamos escrever uma mensagem de boas-vindas. Escreva o programa a seguir no IDE e
grave no Arduino.
void setup()
Serial.begin(9600);
void loop()
}
47
Abrindo o monitor serial será possível ler a frase escrita.
Observe que ao usar a função Serial.print , se o conteúdo dentro dos parênteses estiver
entre aspas ele será reproduzido fielmente, como uma foto. Caso não sejam utilizadas
aspas a função só reconhecerá o conteúdo se este for alguma instrução ou operação
utilizado pelo Arduino e neste caso ao invés de ser printado, o conteúdo será executado,
observe o exemplo:
void setup()
Serial.begin(9600);
void loop()
Serial.println (3+2);
}
EX-12 – Calculando valores em um retificador.
48
Capacitação técnica na plataforma Arduino
Estruturas condicionais –
comando if - else
O comando if – else é utilizado para controle de fluxo. Existem três formas de utilização :
a forma simples, composta e a forma encadeada.
If (forma simples)
If(teste logico)
49
{
Bloco de código a ser executado se teste logico retornar
verdadeiro
O comando if else, permite o teste de uma condição e realizar duas coisas. Se o teste for
verdadeiro, executa a parte 1 e se o teste for falso, realiza a parte 2.
If (teste lógico)
{
Bloco de código a ser executado se teste logico retornar
verdadeiro
}
Else
{
Bloco de código a ser executado se teste logico retornar
falso
}
Observe o exemplo:
{
char tecla;
tecla = Serial.read();
if(tecla == ‘L’)
{
digitalWrite(LED, HIGH);
}
else
{
if(tecla == ‘D’)
{
digitalWrite(LED, LOW);
}
delay(1000);
}
}
If-else (forma encadeada).
Sintaxe: else if
Note que podemos ter quantos blocos else if forem necessários. Porém, se
void setup()
{
Serial.begin(9600);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
}
void loop()
{
if (Serial.available())
{
char LED = Serial.read();
if (LED == '1')
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
else if (LED == '2')
52 {
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
Capacitação técnica na plataforma Arduino
switch (variável)
{
case (valor1):
comandos a executar
break;
case (valor2):
comandos a executar
break;
case (valor3):
comandos a executar
break;
case (valorN): 53
comandos a executar
break;
default:
comandos-padrão
break;
}
Note o uso da instrução break; em cada caso. Ela é utilizada para encerrar
as comparações caso um valor correspondente seja encontrado. Se essa
instrução não for utilizada, mesmo que uma correspondência seja
encontrada, o comando switch continuará a fazer comparações da variável
com os casos seguintes, o que é desnecessário.
Exemplo
void setup() {
Serial.begin(9600);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
pinMode(Led4, OUTPUT);
}
void loop() {
if (Serial.available()) {
char Led = Serial.read();
switch (Led) {
case '1':
digitalWrite(Led1, HIGH);
digitalWrite(Led2, LOW);
digitalWrite(Led3, LOW);
digitalWrite(Led4, LOW);
break;
case '2':
digitalWrite(Led1, LOW);
digitalWrite(Led2, HIGH);
digitalWrite(Led3, LOW);
digitalWrite(Led4, LOW);
54 break;
case '3':
digitalWrite(Led1, LOW);
digitalWrite(Led2, LOW);
digitalWrite(Led3, HIGH);
digitalWrite(Led4, LOW);
break;
case '4':
digitalWrite(Led1, LOW);
digitalWrite(Led2, LOW);
digitalWrite(Led3, LOW);
digitalWrite(Led4, HIGH);
break;
default:
Serial.print("Valor ");
Serial.print(Led);
Serial.println(" incorreto.");
digitalWrite(Led1, LOW);
digitalWrite(Led2, LOW);
digitalWrite(Led3, LOW);
digitalWrite(Led4, LOW);
}
}
}
EX-13 - Utilizando comando if
• Elabore um programa utilizando o comando if de maneira que os botões controlem os
LEDs da seguinte forma:
• LED ligado ao pino 2 pisca a um ritmo de 100ms se nenhum botão estiver
pressionado.
• LED ligado ao pino 3 pisca a um ritmo de 100ms se o botão ligado ao pino 6 for
pressionado.
• LED ligado ao pino 4 pisca a um ritmo de 100ms se o botão ligado ao pino 7 for
pressionado.
• LED ligado ao pino 5 pisca a um ritmo de 100ms se os botões ligados aos pinos 6 e 7
forem pressionados simultaneamente.
55
{
Comandos;
}
Para entender melhor a utilização do comando for, vamos estudar o programa abaixo que
deve fazer o LED ligado ao pino 2 piscar exatamente 15 vezes.
int LED = 2;
int tempo = 100;
void setup()
{
pinMode(LED, OUTPUT);
}
56
Void loop()
{
digitalWrite(LED, HIGH);
delay(tempo);
Capacitação técnica na plataforma Arduino
digitalWrite(LED, LOW);
delay(tempo);
digitalWrite(LED, HIGH);
delay(tempo);
digitalWrite(LED, LOW);
delay(tempo);
delay(1000);
}
Então, para fazer o LED piscar exatamente 15 vezes, é necessário escrever 15 vezes os
comandos para acender e apagar o LED.
Uma maneira mais simples e curta de fazer o mesmo utilizando o comando for pode
ser visto no exemplo a seguir:
int LED = 2;
int tempo = 100;
void setup()
{
pinMode(LED, OUTPUT);
}
Void loop()
{
for(int i = 0; i<15; i ++)
{
digitalWrite (LED, HIGH);
delay(tempo);
digitalWrite (LED, LOW);
delay(tempo);
}
delay(1000);
57
}
Entradas analógicas.
Na plataforma Arduino, existem 6 entradas analógicas, A0 até A5, que são utilizadas para a
leitura dos valores de tensão analógica provenientes de sensores analógicos. Estas entradas
podem receber tensões entre 0 à 5V VDC.
... ...
Vamos entender tudo isso de uma forma mais fácil, realizando um passo a passo desde o
início.
GRANDEZAS DIGITAIS
Os sinais digitais são caracterizados por possuírem dois estados lógicos bem definidos,
observe:
OU
OU
59
60
Estes sinais são condicionados e padronizados para que possam ser interpretados por
sistemas digitais como microcontroladores e CLPs.
Exemplos de grandezas analógicas e sensores utilizados:
61
Vamos, por exemplo, considerar uma resolução de 2 bits:
62
63
Por este motivo, é comum que as entradas analógicas utilizem resoluções mais altas, com
mais bits. Uma das resoluções mais comum utilizada na eletrônica é a de 10 bits o que nos
possibilita obter 1024 diferentes estados, observe:
Uma entrada analógica com Range de 0 a 5 volts com resolução de 10 bits, terá uma
exatidão muito maior do que aquela com 2 bits .
Dividindo 5v em 1024 pedaços obteremos 4,88mV (0,00488V) para cada divisão, bem
melhor do que os 1,75V obtidos anteriormente; Desta maneira, esta entrada analógica
poderá ler valores de 0 a 1023 sendo que 0 corresponde a zero volt e 1023 corresponde a
cinco volts. Podemos observar, portanto, que quanto maior nº de bits, maior será a
exatidão obtida.
Na pagina oficial do Arduino quando buscamos o comando AnalogRead(), responsável por
realizar a leitura nas portas analógicas, encontramos a seguinte tabela com os valores da
tensão de operação e resolução máxima em cada tipo de placa.
64
ATIVIDADE PRÁTICA
Vamos utilizar um potenciômetro para obter uma tensão variável e observar, utilizando o
monitor serial, como o Arduino vai ler esta variação da tensão na entrada analógica.
Fig.46
Capítulo 19
Lendo sensores.
Outra função interessante no monitor serial é poder ver a leitura dos valores lidos em uma
entrada analógica. Desta forma, podemos “ver” o comportamento de um sensor e a partir
daí, aperfeiçoar o código. Vamos aperfeiçoar o programa anterior para testar isso.
// monitorando sensores:
int sensor = 0; Cria uma variável chamada sensor que está
ligada ao pino 0 (A0) do tipo int.
void setup() { Inicia-se o setup.
Serial.begin(9600); Inicia-se a comunicação serial.
}
void loop() { Inicia-se o método setup;
sensor = analogRead(A0); Atribui-se à variável sensor, o valor lido na
porta A0 analógica.
Serial.print(“Valor lido=”); Escreve na serial “Valor lido =”
65
Serial.println(sensor); Escreve o valor contido na variável sensor,
pula linha e retorna ao início da linha.
delay(1000); Atraso de 1 segundo.
A função map( ) permite efetuar o mapeamento de um intervalo numérico em outro intervalo numérico
desejado. Isso significa que em um intervalo numérico que vai de um valor mínimo até um valor máximo,
o valor mínimo será mapeado em um novo mínimo, e o valor máximo será mapeado em um novo máximo,
e os valores intermediários serão remapeados em novos valores intermediários, de forma
correspondente.
Sintaxe:
map (variável, Mínimo Atual, Máximo Atual, Novo Mínimo, Novo Máximo);
onde:
▪ Variável: Contém o valor do número a ser mapeado.
▪ Mínimo Atual: Limite inferior do intervalo de valores atual
▪ Máximo Atual: Limite superior do intervalo de valores atual
▪ Novo Mínimo: Limite inferior do novo intervalo de valores mapeados
▪ Novo Máximo: Limite superior do novo intervalo de valores mapeados
Exemplo: Queremos mapear os valores em um intervalo que vai de 0 a 1023 para um novo intervalo entre
0 e 200. Os valores atuais serão lidos a partir de uma variável chamada valor, e os novos valores mapeados
serão gravados em uma variável de nome novo valor:
Desta forma, toda vez que um valor entre 0 e 1023 for gravado na variável valor, ele será mapeado
para seu correspondente no intervalo entre 0 e 200, e esse novo valor será atribuído à variável novo
valor.
A função também pode mapear valores de forma inversa, bastando para isso trocar a posição
dos valores mínimo e máximo novos:
A função map() opera somente com números inteiros, não retornando valores de ponto flutuante
(fracionários). Se um número fracionário for gerado, ele será truncado antes de ser retornado. A função
não arredonda os valores mapeados.
Na prática
Vamos aplicar a função map() em um projeto simples. Usando um potenciômetro como um divisor
resistivo de tensão e aplicando sua saída a um pino analógico, os valores retornados, que por padrão estão
no intervalo entre 0 e 1023 (resolução de 10 bits dos pinos analógicos), serão remapeados para um outro
intervalo, de 8 bits (valores entre 0 e 255). Os valores lidos serão exibidos no monitor serial.
Para isso, vamos conectar o potenciômetro entre os pinos 5V e GND e seu terminal central (divisor de
tensão) será conectado ao pino analógico A0, a partir de onde será feita a leitura do valor da tensão
elétrica.
Observe o circuito na figura a seguir:
67
68
#define pot 0
#define led 9
int valPot = 0;
int brilho = 0;
void setup() {
pinMode(led,OUTPUT);
}
void loop() {
valPot = analogRead(pot);
brilho = map(valPot,0,1023,0,255);
analogWrite(led,brilho);
}
EX- 15 – Mapeando o potenciômetro.
• Monte um circuito com 5 LEDs, sendo dois verdes, um vermelho e dois amarelos
conectados nas saídas 2,3,4, 5 e 6 do Arduino, respectivamente.
• Faça o mapeamento do potenciômetro.
• Elabore um programa que faça o LED vermelho acender quando o potenciômetro
estiver na metade do seu curso. O LED verde conectado ao pino 2 deve acender com o
potenciômetro em 230°. O LED verde ligado ao pino 3, acende quando o
potenciômetro estiver em 185°. O LED amarelo conectado ao pino 6 acende com o
potenciômetro em 50° e o LED ligado ao pino 5 acende com o potenciômetro em 95°.
Use o espaço abaixo para fazer suas anotações.
69
O LDR (Light Dependent Resistor) resistor dependente da luz, é um dispositivo cujo valor
da resistência entre os seus terminais, depende da quantidade de luz que chaga até o seu
corpo. Quanto mais luz chega até o dispositivo, menor será o valor da resistência. E
quanto menos luz chega até o dispositivo, maior será a resistência entre os seus
terminais. Para ligar um LDR à uma porta analógica do Arduino, é necessário montar um
circuito divisor de tensão.
PWM.
PWM (Pulse Width Modulation) – modulação por largura de pulso – é uma técnica utilizada
para obter um valor analógico a partir de uma variação digital. Em uma saída digital, a
tensão poderá variar entre +5V e 0. Se o nível lógico da saída for sempre 1 ou sempre 0, o
resultado será um valor constante. Porém se em vez de fixar a saída em um valor único e
sim fazer variá-lo entre 1 e 0 (+5V e 0), a tensão resultante não será mais constante e sim
uma proporção do valor máximo da tensão, ou seja uma porcentagem de +5V.
A relação entre o tempo em que temos o pulso (t1) e a duração de um ciclo completo
do sinal (T) define o ciclo ativo, conforme é mostrado na figura abaixo.
71
O valor médio da tensão poderá ser obtido multiplicando o máximo valor da tensão
pelo valor do ciclo ativo, conforme a fórmula:
Assim, se o tempo de duração do nível alto for alterado, será possível obter um valor
médio de tensão entre 0 e 5V.
Na placa do Arduino UNO e equivalentes, apenas algumas saídas digitais podem ser
utilizadas como saídas PWM, são as saídas dos pinos 3, 5, 6 ,9, 10 e 11, sendo que a
frequência da tensão nessas saídas quando utilizadas como PWM é de 490Hz.
A função analogWrite(pino,valor) configura o pino indicado como sendo uma saída PWM
e portanto, nele existirá um sinal com frequência igual a 490HZ, com o ciclo ativo definido
pelo valor dentro do parênteses. O parâmetro valor corresponde a variação de 0 até 255.
Se valor = 0, a tensão na saída será 0V, se valor = 255, a tensão na saída será 5V.
.
Em resumo:
PWM, do inglês Pulse Width Modulation, é uma técnica utilizada por sistemas digitais para
variação do valor médio de uma forma de onda periódica. A técnica consiste em manter a
frequência de uma onda quadrada fixa e variar o tempo que o sinal fica em nível lógico alto.
Esse tempo é chamado de duty cycle (ciclo ativo) da forma de onda. No gráfico abaixo são
exibidas algumas modulações de PWM:
72
Capacitação técnica na Plataforma Arduino
O objetivo é controlar o brilho de um LED utilizando a técnica de PWM. Para isso, ligue
um potenciômetro à uma entrada analógica e o LED a uma das I/O digitais que podem
executar a função PWM.
Elabore o código utilizando as funções analogRead para ler o valor do potenciômetro e
transformar em um valor binário, e a função analogWrite que escreve na saída digital, o
valor indicado.
O sensor de temperatura.
Como o CI fornece uma tensão de ~10mV a cada ºC de variação de temperatura ele não
percorre toda a gama possível de valores disponíveis na entrada analógica (0 – 5), então, é
comum aplicar uma fórmula para melhorar a faixa de leituras que é a seguinte:
O programa que pode ser utilizado para a leitura da temperatura no terminal serial é o
seguinte:
Verifique se o código escrito está correto e grave-o no micro. Abra o monitor serial e veja a
indicação da temperatura. Para variar o valor da temperatura, basta segurar com os dedos
o corpo do LM35.
Fazer o mapeamento deste sensor permite atribuir ao valor lido, uma outra gama de
leituras.
Temperatura é a variável
que guardará o valor lido
e aplicada a função map
da temperatura lida.
Serial.println(temperatura);
76
Capacitação técnica na plataforma Arduino
Capítulo 26
Utilizando o relé.
Sempre que a tensão requerida pela carga e/ou a corrente solicitada pela carga
forem maiores do que a tensão de alimentação da placa Arduino (5V) ou maior do
que a máxima corrente que uma saída pode fornecer (40mA), é necessário utilizar
um dispositivo de interface entre a plataforma Arduino e o que se quer utilizar.
Não é recomendado, embora possa ser possível a ligação direta da bobina do relé
na saída da plataforma Arduino e por isso, utiliza-se um transistor que terá a fun-
ção de trabalhar como uma chave eletrônica, recebendo em sua base, um sinal de
tensão em baixíssima potência e podendo acionar com folga a bobina do relé.
O esquema abaixo mostra como o relé está interligado como o transistor. Existe
ainda um LED e um resistor, não mostrados no esquema que tem a função de
indicar quando o módulo recebe um sinal na entrada.
O diodo em paralelo com a bobina do relé, serve para eliminar os efeitos da des-
carga da bobina no momento do seu desligamento.
else Se não
85
{
Para montar o circuito utilize um botão com o seu resistor pull-up conectado ao
pino 5 e o módulo do relé que será conectado ao pino 7 da placa Arduino.
As vezes utilizamos um botão para ligar e outro botão para desligar o circuito. O
programa a seguir faz isso.
86
Capacitação técnica na plataforma Arduino
EX- 24 – Acionando o relé em uma determina temperatura.
Utilize o mesmo circuito e programa utilizado no exercício anterior.
87
delay(250);
Atraso de 250m segundos
}
89
90
Capacitação técnica na plataforma Arduino
Capítulo 28
O esquema mostra um transistor controlado pela base que está conectada à saída
PWM do microcontrolador. Conforme a saída PWM é variada, a velocidade do motor
também é alterada e consegue-se assim um bom e simples controle de velocidade.
//Controle DC
void setup(){
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(10, HIGH); // para o motor
digitalWrite(11, HIGH);
}
void loop(){
digitalWrite(10, HIGH); // primeira direção
digitalWrite(11, LOW);
delay(1000); // espera 1 segundo
digitalWrite(10, LOW); // segunda direção
digitalWrite(11, HIGH);
delay(1000); // espera 1 segundo
}
Figura 66 - Programa para teste do circuito da ponte H.
94
Capacitação técnica na plataforma Arduino
EX- 26 – Controle de velocidade e direção de um motor DC através
de ponte H com transistores.
• Elabore um programa contendo 3 botões e um potenciômetro. Os botões terão
as seguintes funções: Quando o botão 1 for pressionado, o motor deve girar
para a direita. Quando o botão 2 for pressionado, o motor deve girar para a
esquerda e quando o botão 3 for pressionado, o motor deve parar. A velocidade
do motor deve ser ajustada com o auxílio de um potenciômetro.
95
Utilizando o L293D.
pinMode(motor1Pin2, OUTPUT);
pinMode(enablePin, OUTPUT);
97
digitalWrite(enablePin, HIGH); Escreve na variável enable, o valor 1
else { Se não,
}
Figura 69 - Programa para controle de motor com L293D.
EX- 27 – Controle de velocidade e direção de um motor DC com CI
L293D
Elaborar o programa para controle de direção e de velocidade de um motor DC
utilizando o CI L293D.
98
Capacitação técnica na plataforma Arduino
Capítulo 30
Motor de passo.
Um dos tipos de motor de passo disponível é o unipolar que pode ter 5 fios dispo-
níveis. 4 fios são os extremos das bobinas do motor e o quinto é o GND.
(8 -4 -2 -1)
100
Tabela 12 - Acionamento do motor de passo.
Capacitação técnica na plataforma Arduino
Para fazer o movimento contrário, basta fazer a mesma sequência, más na ordem
inversa. (1 – 2 – 4 – 8).
int motorPin1 = 8;
int motorPin2 = 9;
void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
void loop() {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin4, HIGH);
delay(delayTime);
}
Figura 72- Programa para teste do motor de passo.
Para acionarmos o motor de passo, utilizamos por exemplo CI ULN 2003.que con-
siste basicamente de 7 inversores (Darlington) com capacidade de corrente de
500mA cada um.
Figura 73 - Ci ULN2002A
EX- 28 – Controle de motor de passo com ULN2003.
• Elaborar o programa para controle de motor de passo com ULN2003.
102
Capacitação técnica na plataforma Arduino
Capacitação realizada entre os dias 7 de agosto a 13 se setembro, na
ETEC Aristóteles Ferreira em Santos – SP.
Esta publicação foi impressa em papel offset 90g/m2 (miolo) e
papel couché 230g/m2 (capa).