Você está na página 1de 105

Microcontroladores

Prof. Leonardo Alves Dias


Plano de Ensino
2
leonardoalves@fiepb.org.br

 Ementa: Carga horária: 80h

 Arquiteturas Créditos: 4

 Entradas e saídas Metodologia: Aulas expositivo-


dialogadas e práticas
 Memórias
Principal referência:
 Ambientes de programação MCROBERTS, Michael, Arduino
 Linguagem de programação de alto nível Básico. São Paulo: Novatec,
2011.
 Circuitos, sensores e atuadores para microcontroladores
SOUZA, David J. Desbravando o
PIC. 8 ed. São Paulo: Érica, 2005.
 Avaliações: Google Sala de Aula: 71x9ly
 Prova teórica – 5,0 pontos
 Prova prática – 5,0 pontos
Introdução
 Um microcontrolador (MCU/µC)
pode ser definido como um
circuito integrado dotado de
“inteligência programável”,
utilizado no controle de
processos lógicos.

 Principais fabricantes:
 Difere do microprocessador por não necessitar de periféricos. Por
 Microchip exemplo: memória, conversor A/D, etc.
 Atmel
 Texas Instruments  PIC (Programmable Intelligent Controller): família de
microcontroladores desenvolvido pela Microchip Technology.
 Freescale

 Vantagem dos PICs: o conjunto de instruções é parecido entre


algumas características físicas permitindo uma fácil migração para
3 PICs diferentes.
4
1. Arduino
Introdução
5

 Surgiu em meados de 2005.

 Plataforma Open Source: hardware e software livre.

 Desenvolvido na Itália com objetivo de criar projetos/protótipos de forma simples


e mais rápida.

 Arduino é uma plataforma de prototipagem eletrônica programável baseada em


microcontroladores (Atmel) utilizado para controle de processos.

 Site: https://www.arduino.cc/
6 Pinagem
7 Pinagem
 Microcontrolador presente: Atmega 328P
 Voltagem operacional: 5V
 Pinos I/O (Entrada/Saída): 14 (6 podem ser
usando como PWM(~))
 Corrente contínua: 40mA (5V), 50mA (3,3V)
 Memória flash: 32kB
 Memória SRAM: 2kB
 Memória EEPROM: 1kB
 Clock: 16MHz
IDE do arduino
8  IDE (Integrated Development Environment): Ambiente
Integrado de Desenvolvimento (tela de programação,
compilador e depurador), utilizado para se comunicar
com o Arduino.
IDE do arduino
9  IDE (Integrated Development Environment): Ambiente
Integrado de Desenvolvimento (tela de programação,
compilador e depurador), utilizado para se comunicar
com o Arduino.

7. Nome do Sketch.
8. Área de Código.
9. Barra de status : Existência de erros.
10. Console de texto: Descrição de erros.
11. Placa e Porta serial.
Monitor serial
10
 Monitor serial do Arduino: Exibe dados seriais
sendo enviados da placa Arduino para o
computador. Para enviar dados para a placa,
digite o texto e clique no botão "enviar" ou
pressione enter.
 A comunicação entre a placa Arduino e seu
computador pode acontecer em várias
velocidades padrão pré-definidas. Para que isso
ocorra é importante que seja definida a mesma
velocidade tanto na Sketch quanto no Monitor
Serial.
 Na Sketch esta escolha é feita através da função
Serial.begin. E no Monitor Serial através do menu
drop down do canto inferior direito.
IDE do Arduino
11 Menu: Arquivo
 Novo: Cria uma nova instância fornecido pelo Arduino Configurações da página: Ele
do editor, com a estrutura Software (IDE) ou biblioteca mostra a janela de
mínima de um esboço já aparece neste item de menu. Configuração da Página para
existente. Todos os exemplos estão impressão.
estruturados em uma árvore
 Abrir: Permite carregar um  Impressão: Envia o esboço
que permite acesso fácil por
arquivo de esboço navegando atual para a impressora de
tópico ou biblioteca.
pelas unidades e pastas do acordo com as configurações
computador.  Fechar: Fecha a instância do definidas na Configuração da
software Arduino do qual é Página.
 Aberto recentemente: Fornece
clicado.
uma pequena lista dos esboços  Preferências: Abre a janela
mais recentes, pronto para ser Salvar: Salva o esboço com o Preferências onde algumas
aberto. nome atual. Se o arquivo não configurações do IDE podem
tiver sido nomeado ser personalizadas, como o
 Sketchbook: Mostra os esboços
anteriormente, um nome será idioma da interface IDE.
atuais dentro da estrutura da
fornecido em uma janela
pasta do bloco de desenho;  Sair: Fecha todas as janelas IDE.
"Salvar como ...".
Clicar em qualquer nome abre Os mesmos esboços abertos
o esboço correspondente em Salvar como...: Permite salvar o quando o Quit foi escolhido
uma nova instância de editor. esboço atual com um nome serão automaticamente
diferente. reabertos na próxima vez que
 Exemplos: Qualquer exemplo
você iniciar o IDE.
IDE do Arduino
12 Menu: Editar
 Desfazer/refazer: Desfaz/Refaz código do seu esboço para a (identação): Adiciona ou
uma ação realizada. área de transferência como subtrai um espaço no início de
HTML, adequado para cada linha selecionada,
 Cortar: Remove o texto
incorporação em páginas da movendo o texto para um
selecionado do editor e
web. espaço à direita ou
coloca-o na área de
eliminando um espaço no
transferência.  Colar: Coloca o conteúdo da
começo.
área de transferência na
 Copiar: Duplica o texto
posição do cursor, no editor.  Localizar: Abre a janela
selecionado no editor e
Localizar e Substituir onde
coloca-o na área de Selecionar tudo: Seleciona e
você pode especificar texto
transferência. destaca todo o conteúdo do
para pesquisar dentro do
editor.
 Copiar para o Fórum: Copia o esboço atual de acordo com
código do seu esboço para a Comentar/Descomentar: várias opções.
área de transferência em um Coloca ou remove o //
 Localizar o próximo: Destaca a
formulário adequado para marcador de comentário no
próxima ocorrência.
publicação no fórum, com início de cada linha
cores sintáticas. selecionada.  Localizar Anterior: Destaca a
ocorrência.
 Copie como HTML: Copia o Aumento/Diminuição da recuo
IDE do Arduino
13 Menu: Sketch
 Verificar/Compilar: Verifica Exportar binário compilado: atual). O novo arquivo
seu esboço para erros Salva um arquivo .hex que aparece em uma nova
compilando-o; Ele relatará pode ser mantido como guia na janela de esboço.
o uso de memória para arquivo ou enviado para a Os arquivos podem ser
código. placa usando outras removidos do esboço
ferramentas. usando o menu de guia
 Carregar: Compila e
acessível clicando no
carrega o arquivo binário Mostrar pasta de sketch:
pequeno ícone de triângulo
na placa configurada Abre a pasta de esboço
abaixo do monitor serial um
através da porta atual.
no lado direito da barra de
configurada.
 Incluir Biblioteca: Adiciona ferramentas.
 Carregar usando o uma biblioteca ao seu
Programador: Isso substituirá esboço inserindo instruções
o bootloader; Você #include no início do seu
precisará usar Ferramentas código.
> Gravar bootloader para
 Adicionar arquivo...:
restaurá-lo e poder carregar
Adiciona um arquivo de
para a porta serial USB
origem ao esboço (ele será
novamente.
copiado da sua localização
IDE do Arduino
14 Menu: Ferramentas
 Autoformatação: organiza a na Porta atualmente Hardware ao programar uma
formatação do sketch. selecionada. Isso placa ou chip e não usar a
normalmente reinicia a conexão USB-serial integrada.
 Arquivar Sketch: Arquiva uma
placa, se a placa suportar a
cópia do esboço atual no  Gravar Bootloader: Os itens
Redefinição na abertura da
formato .zip. O arquivo é deste menu permitem gravar
porta serial.
colocado no mesmo diretório um bootloader no
que o esboço.  Plotter serial: plotar gráficos microcontrolador da placa
de forma serial. Arduino. Isso não é
 Corrigir codificação e
necessário para o uso normal
recarregar: Corrige possíveis Placa: Selecione a placa
de uma placa Arduino ou
discrepâncias entre a Arduino que você está
Genuino, mas é útil se você
codificação do mapa de usando.
comprar um novo
caracteres do editor e outros
 Porta: Este menu contém microcontrolador ATmega
mapas gráficos de sistemas
todos os dispositivos de série (que normalmente vem sem
operacionais.
(reais ou virtuais) em sua um bootloader).
 Monitor Serial: Abre a janela máquina.
do monitor serial e inicia a
 Programador: Para selecionar
troca de dados com
um programador de
qualquer placa conectada
15 Simuladores

 Proteus
 Biblioteca simulino
 Arduino interno

 SimulIDE
 https://sourceforge.net/projects/simulide/

 TinkerCAD
 https://www.tinkercad.com/circuits
Ciclo de desenvolvimento de projeto
16

 Um programa é desenvolvido seguindo os passos na figura abaixo.


Entradas e saídas digitais e analógicas
17

 As entradas, ou inputs, normalmente são sensores eletrônicos ou mecânicos que tomam os


sinais (em forma de temperatura, pressão, umidade, contato, luz, movimento, ph, etc.) do
mundo físico e converte em sinais de corrente ou voltagem. Exemplos de entradas são sensores
de gás, temperatura, fotocélulas, potenciômetros, sensores de movimento, e muitos mais

 As saídas, ou outputs, são atuadores, ou outros dispositivos que convertem os sinais de corrente
ou voltagem em sinais fisicamente úteis como movimento, luz, som, força ou rotação, entre
outros. Exemplos de saídas são motores, LEDs ou sistemas de luzes que acendem
automaticamente quando escurece ou um buzzer que gere diversos tons.
18 Entradas e saídas – Arduino UNO

 Entradas digitais:
 Funciona de acordo com os princípios booleanos (0: 0V e 1: 5V).
 Limite de corrente em uma porta do Arduino: 40mA
 Entradas analógicas:
 Sinais variantes no tempo (assumem valores diferentes constantemente).
Hello World
19  Este exemplo mostra a experiência mais simples que você pode fazer com um Arduino
para verificar uma saída física: piscar um LED. Neste exemplo, você irá aprender a
acionar uma carga (LED) conectada a um pino do Arduino.
Hello World
20

 Este código já vem junto com a IDE do Arduino. Você


pode acessar em:
 Arquivo > Exemplos > 01.Basics > Blink
Análise do código: estruturas principais
 A função setup() é chamada quando um  A função loop() faz precisamente o que o
esboço é iniciado. Use-o para inicializar nome sugere, ou seja, executa continuamente
variáveis, modos de funcionamento do pino, o código permitindo que seu programa mude e
comandos de inicialização, etc. A função de responda a eventos enquanto o Arduino estiver
configuração só será executada uma vez, após ligado. Exemplos de eventos são a leitura de
cada inicialização ou reinicialização da placa sensores, acionamento de cargas, etc.
Arduino.

21
Análise do código: funções digitais
22
Análise do código: função de tempo delay
23
Análise do código: constantes
24

𝑝𝑖𝑛𝑀𝑜𝑑𝑒(13, 𝑂𝑈𝑇𝑃𝑈𝑇); // 𝐷𝑒𝑓𝑖𝑛𝑒 𝑜 𝑝𝑖𝑛𝑜 13 𝑑𝑜 𝐴𝑟𝑑𝑢𝑖𝑛𝑜 𝑐𝑜𝑚𝑜 𝑠𝑎í𝑑𝑎

𝑑𝑖𝑔𝑖𝑡𝑎𝑙𝑊𝑟𝑖𝑡𝑒(13, 𝐻𝐼𝐺𝐻); //𝐸𝑠𝑐𝑟𝑒𝑣𝑒 𝑛𝑎 𝑠𝑎í𝑑𝑎 𝑑𝑖𝑔𝑖𝑡𝑎𝑙 13, 𝑜 𝑛í𝑣𝑒𝑙 1 (5𝑉)


Alternando estado de um LED com millis()
25
Exercício
 A partir do mesmo código do blink faça uma nova montagem e as modificações
26
necessárias no código para que o LED seja colocado no Pino 5, e fique 2 segundos aceso
e 1 segundo apagado. Lembre-se que para qualquer pino que não seja o 13 é necessário
colocar um resistor em série com o LED.
Botão
27  O botão é um componente que conecta dois pontos do circuito quando está
pressionado. Neste exemplo quando o botão está pressionado o LED é aceso.
Botão
28
Configuração PULL UP e PULL DOWN

 Normalmente, quando se conecta botões


em pinos digitais de um microcontrolador,
o pino passa ao estado de ponto flutuante
quando o botão está aberto.
 Ponto flutuante: é assumido um estado de
forma aleatória. No caso do Arduino,
normalmente assume o nível alto (bit 1).
 Resistores são empregados de forma a
evitar o ponto flutuante, fixando um valor
de tensão aplicado sob um pino mesmo
quando o botão estiver aberto. Quando
um resistor é conectado a alimentação
(fixando o pino em nível alto), denomina-se
Pull Up. Se for conectado ao GND (fixando
o pino em nível baixo), denomina-se Pull
Down.

29
Configuração PULL UP

 Quando se usa o Arduino e existe a necessidade de uma configuração


Pull Up, não há a necessidade de colocar um resistor externo ao
Arduino conectado a alimentação. Basta utilizar um comando próprio
do Arduino (PULLUP) ao declarar o modo de operação de um pino.
Para entender melhor, veja o exemplo a seguir.

 Digamos que eu queira utilizar um botão conectado ao pino 10, e ao


pressionar este botão enviar o bit 0 (0V) ao Arduino. Logo, quando o
botão não for pressionado, o bit 1 (5V) deve ser enviado. Assim, eu Com resistor Pull Up externo
preciso de uma configuração Pull Up. Para isto, eu declaro o pino 10 da
seguinte forma:
pinMode(10, INPUT_PULLUP);
 Deste modo, internamente no Arduino será ativado um resistor PULLUP
de 20kΩ, e não será mais necessário usar um resistor externo.

30
Com resistor Pull Up interno
Análise do código: estruturas de controle
 if, é usado em conjunto com um operador de  If...else:
comparação, utilizado para testar se uma
determinada condição foi atingida, como uma
entrada que está acima de um determinado
número.

31
Análise do código: Operadores lógicos e aritméticos
32

𝑖𝑓 (𝑥 == 𝑦){
𝑦 + +;
𝑒𝑙𝑠𝑒 {
𝑥 + +;
}
Botão 2
33
34 Leitura serial de uma entrada digital
 Este exemplo mostra como monitorar o estado de um interruptor (botão) estabelecendo a
comunicação serial entre seu Arduino e o computador (através da USB).
Leitura serial de uma entrada digital
35
Análise do código: função serial
36
Análise do código: função serial
37
Utilizando a função serial
38
Comando via monitor serial
39

 Através deste tutorial você vai controlar o acionamento de um LED através do Monitor
Serial de seu computador.
Comando via monitor serial
40
Leitura serial de uma entrada analógica
41
 Este exemplo mostra como ler um pino de uma entrada analógica, mapear o resultado para
um intervalo de 0 a 255, e usar esse resultado para definir a modulação PWM de um pino de
saída para acender e apagar um LED.
Conversões para entradas analógicas
42

 Antes de tudo, vamos entender como é realizado o processo de leitura de uma


entrada analógica:
 O conversor analógico-digital (AD) interno do Arduino uno, possui 10 bits resolução.
Sendo assim, os valores são convertidos da seguinte forma
5𝑉 − 1023
𝑣𝑎𝑙𝑜𝑟𝑒𝑛𝑡𝑟𝑎𝑑𝑎 − 𝑣𝑎𝑙𝑜𝑟𝑙𝑖𝑑𝑜

 Para uma tensão de 3V na entrada


5𝑉 − 1023
3𝑉 − 𝑣𝑎𝑙𝑜𝑟𝑙𝑖𝑑𝑜
𝑣𝑎𝑙𝑜𝑟𝑙𝑖𝑑𝑜 ∗ 5𝑉 = 1023 ∗ 3
𝑣𝑎𝑙𝑜𝑟𝑙𝑖𝑑𝑜 ≅ 614
Leitura serial de uma entrada analógica
43
 Este exemplo mostra como ler um pino de uma entrada analógica, mapear o resultado para
um intervalo de 0 a 255, e usar esse resultado para definir a modulação PWM de um pino de
saída para acender e apagar um LED.
Análise do código: funções analógicas
44  analogReference(): Configura a
tensão de referência usada para
entrada analógica (ou seja, o
valor usado como nível alto de
entrada).
 DEFAULT: a referência analógica
padrão de 5 volts (em placas
Arduino de 5V) ou 3.3 volts (nas
placas Arduino de 3.3V)
 INTERNO: uma referência
integrada, igual a 1,1V no
ATmega168 ou ATmega328 e
2,56 volts no ATmega8 (não
disponível no Arduino Mega)
 INTERNAL1V1: uma referência
integrada de 1.1V (apenas
Arduino Mega)
 INTERNAL2V56: uma referência
integrada de 2.56V (apenas
Arduino Mega)
 EXTERNO: a tensão aplicada ao
pino AREF (apenas 0 a 5V) é
utilizada como referência.
Entendendo o PWM no arduino
45
 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, ou seja, o ciclo ativo da forma de
onda.
 Para calcular o valor médio da tensão de
saída de um sinal PWM pode-se utilizar a
seguinte equação:

Vout = (duty cycle/100)* Vcc


46 Leitura serial para PWM

1023
47 2. Revisão:
Linguagem de programação
Estruturas de controle
 A declaração for é usada para repetir
declarações em um bloco. Um contador de
incremento geralmente é usado para
incrementar e encerrar o loop. A instrução for é
útil para qualquer operação repetitiva, e muitas
vezes é usada em combinação com arrays para
operar em conjunto de dados/pinos.

48
Estruturas de controle
 Switch ... case: controla o fluxo de programas, permitindo
que os programadores especifiquem um código diferente
que deve ser executado em várias condições. Em
particular, essa estrutura compara o valor de uma variável
com os valores especificados nas instruções case.
Quando uma declaração de case é encontrada cujo
valor corresponde ao da variável, o código na
declaração desse case é executado.

 A palavra-chave break sai da instrução


switch e normalmente é usada no final
de cada case.

49
Estruturas de controle
 While: é um loop contínuo, até que a expressão
dentro dos parênteses () torne-se falsa. Algo
deve mudar a variável testada, ou o loop será
infinito. Isso pode estar no seu código, como
uma variável incrementada ou uma condição
externa, como testar um sensor.

 O do...while funciona da mesma maneira que o


loop while, com a exceção de que a condição
é testada no final do loop, portanto, o loop
sempre será executado pelo menos uma vez.

50
Estruturas de controle

 break é usado para sair de um do, for, switch ou


while, ignorando a condição do loop normal.

 A instrução continue ignora o resto da iteração


atual de um loop (do, for ou while). Continua
verificando a expressão condicional do ciclo e
procedendo a qualquer iteração subsequente.

 return Termina uma função e retorna um valor de


uma função para a função de chamada, se
desejar.
51
Operadores bit a bit
52
Variáveis
53

 Definindo variável
global:

#𝑑𝑒𝑓𝑖𝑛𝑒 𝑋 10

 Definindo variável
local:
𝑖𝑛𝑡 𝑥 = 10;
𝑓𝑙𝑜𝑎𝑡 𝑦 = 5,5;
Constantes e variáveis
54

 As variáveis podem ser declaradas:

 No início do código: Global (acesso em qualquer parte do programa).

 Dentro de uma rotina/função: Local (acesso somente dentro da própria


rotina/função).

 Como parâmetro da função: Local.

 Através da diretriz #define


Números inteiros e fracionários
55  Normalmente, inteiros (int) são tratados como inteiros de base 10 (decimal), mas a
notação especial (formatadores) pode ser usada para inserir números em outras bases
numéricas.

 Semelhante aos inteiros, pontos flutuante são usadas para tornar o código mais legível. As
constantes de ponto flutuante são trocadas no tempo de compilação para o valor ao
qual a expressão é avaliada.
Tipo de dados
56
 void: (vazio) é usada apenas nas declarações de função. Isso indica que a função não
deve retornar nenhuma informação para a função a partir da qual foi chamado.

 boolean: pode ser, true or false, (false = 0; true = qualquer número diferente de 0).

 char: dado que ocupa 1 byte de memória para armazenar um valor de caractere. As
literais de caracteres são escritos com citações simples, como: 'A' (para caracteres
múltiplos - strings - use aspas duplas: "ABC"). Entretanto, os caracteres são armazenados
como números: 'A' + 1 = 66.

 int: armazena 16 bits (-32,768 a 32,767)


 unsigned int: 16 bits (0 a 65535)
Tipo de dados
57
 long: 32 bits (2,147,483,648 a 2,147,483,647).

 unsigned long: 32 bits (0 to 4,294,967,295).

 float: 32 bits (valores até 3.4028235e+38 ou -3.4028235E+38), possui 6-7 dígitos de precisão
(double é igual a float).
Tipo de dados
 string: pode ser representado de duas maneiras: utilizando vetor de caracteres, terminado com o
caractere nulo (\0) ou criando um objeto de tipo próprio.
 Declare uma série de caracteres sem inicializar como no Str1;
 Declare uma série de caracteres (com um caractere adicional) e o compilador adicionará o
caractere nulo necessário, como no Str2;
 Adicione explicitamente o caractere nulo, Str3;
 Inicialize com uma string entre aspas; O compilador dimensionará a matriz para ajustar a string e
um caractere nulo de término, Str4;
 Inicialize a matriz com um tamanho explícito e string, Str5;
 Inicialize a matriz, deixando espaço extra para uma string maior, Str6.

58
Tipo de dados
 string: pode ser representado de duas maneiras: utilizando vetor de caracteres, terminado com o
caractere nulo (\0) ou criando um objeto de tipo próprio.

59
60 Conversão de dados
 char(): converte o valor para um dado tipo caractere.

 byte(): converte o valor para um dado tipo byte.

 int(): converte o valor para um dado tipo int.

 long(): converte o valor para um dado tipo long.

 float(): converte o valor para um dado tipo float.


Arrays
 Um array é uma coleção de variáveis acessadas
com um número de índice.

 O primeiro índice de um array é sempre 0.

 Atribuindo valor:

 Lendo um valor:

 Loop:

61  Deslocando valores
62 Funções
63 3. Periféricos:
Sensores, atuadores, cargas e displays.
Sensor de luz com LDR
64

 Quanto maior a incidência de luz


menor a resistência e vice-versa.
Sensor de luz com LDR
65
 Compensação de luz de 5 níveis: dependendo se
há mais ou menos luz incidindo no sensor o sistema
liga ou desliga uma série de LEDs. Este programa
poderia ser usado em um sistema de iluminação
acendendo conforme o sol se põe, compensando
progressivamente a deficiência de luz. Além disso,
um potenciômetro ajusta o nível crítico mínimo de
luz, a partir do qual se ativará o circuito.
Exercitando...
 Utilizando um LDR como no exemplo anterior, aciona três LEDs indicando
a incidência de luz no LDR: vermelho para baixa luminosidade, amarelo
para luminosidade média e verde para alta luminosidade.

 Utilizando um LDR, acione seis LEDs indicando a incidência de luz no LDR:


dois LEDs verdes para baixa luminosidade, dois LEDs amarelo para
66 luminosidade média e dois LEDs vermelho para alta luminosidade. Cada
LED deve acender sequencialmente de acordo com a intensidade de luz.
Sensor Ultrassônico
67  O sensor ultrassônico de distância consiste em um sensor contendo um transmissor e um
receptor ultrassônico. Este é capaz de ser usado para mensurar distâncias com base na
velocidade do som no ar e na diferença de tempo entre emissão e recepção de um sinal
ultrassônico.

 Ao ser dado um pulso no trigger (gatilho), o transmissor emite um sinal sonoro, em


frequência (acima da audível por seres humanos). Ao atingir um objeto, este sinal sonoro é
refletido novamente para o sensor, onde é captado pelo receptor (echo). Em
conhecimento da diferença de tempo entre o trigger e o echo e considerando a
velocidade de propagação do som no ar (340m/s), é possível determinar a distância
entre o sensor ultrassônico e o objeto.
Sensor Ultrassônico
68  Primeiramente é enviado um pulso de 10µs no
trigger (isso fará com que o sensor emita 8
pulsos ultrassônicos em 40kHz e inicie a espera
pelas ondas refletidas), indicando o início da
transmissão de dados. Quando um sinal for
detectado, o pino echo vai de nível baixo
para nível alto por um período de tempo igual
ao da propagação da onda.
 Distância = (Tempo echo em nível alto *
velocidade do som) /2
69 Sensor Ultrassônico

 Acenda 3 LEDs de acordo com a distância entre um objeto e o sensor. Se estiver


próximo um LED vermelho deve acender, distante um LED verde deve acender, uma
distância intermediária um LED amarelo deve acender.

 Repita o exercício anterior, adicionando um buzzer para o caso de o objeto estar


extremamente próximo.

 Utilizando o Arduino uno, um display LCD, e um buzzer. Simule um sensor de ré para um


carro.
Sensor óptico reflexivo TCRT5000
70  Utilizado para detectar objetos. O azul é o emissor infravermelho e o preto é o
fototransistor.
Sensor óptico reflexivo TCRT5000
71  No fototransistor normalmente se utilizam maiores valores de resistência (acima de 4,5kΩ) e
no emissor baixos valores de resistência (como no diodo/LED)
Sensor óptico reflexivo TCRT5000
72

 Acione um LED sempre que algum objeto for detectado pelo sensor óptico.
Display LCD
73
 O display de LCD é uma peça importante em projetos em que você precisa visualizar a
leitura de um sensor ou mesmo para transmitir uma informação para o usuário. Neste
exercício você aprenderá a conectar o Display LCD 2x16 do seu Kit, que já vem com os
pinos soldados.
Display LCD
Biblioteca <LiquidCrystal.h>
74
 LiquidCrystal()
 LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
 begin(): lcd.begin(cols, rows) – inicializa o lcd.
 clear(): lcd.clear() – limpa o lcd.
 home(): lcd.home() – vai para a posição da primeira coluna e linha.
 setCursor(): lcd.setCursor(col, row) – vai para a posição especificada.
 write(): lcd.write(data) – envia dados em formato ASCII
 print() – envia dados
 lcd.print(data)
lcd.print(data, BASE)
 cursor(): lcd.cursor() – exibe o cursor no display
 noCursor(): lcd.noCursor() – esconde o cursor no display
 scrollDisplayLeft() e scrollDisplayRight(): lcd.scrollDisplayLeft() – desliza uma posição
Display LCD
75  Pino 1: GND do Arduino;
 Pino 2: 5V do Arduino;
 Pino 3: Pino central do potenciômetro;
 Pino 4: I/O digital 12;
 Pino 5: GND Arduino;

 Pino 6: I/O digital 11;


 Pino 11: I/O digital 5;
 Pino 12: I/O digital 4;
 Pino 13: I/O digital 3;
 Pino 14: I/O digital 2;
 Pino 15: 5V do Arduino;
 Pino 16: GND do Arduino;
Display LCD
76
 Pino 1: GND do Arduino;
 Pino 2: 5V do Arduino;
 Pino 3: Pino central do potenciômetro;
 Pino 4: I/O digital 9;
 Pino 5: GND Arduino;
 Pino 6: I/O digital 8;
 Pino 11: I/O digital 5;
 Pino 12: I/O digital 4;
 Pino 13: I/O digital 3;
 Pino 14: I/O digital 2;
 Pino 15: Pino central do potenciômetro;
 Pino 16: GND do Arduino
Display LCD
77
 Pino 1: GND do Arduino;
 Pino 2: 5V do Arduino;
 Pino 3: Pino central do potenciômetro;
 Pino 4: I/O digital 9;
 Pino 5: GND Arduino;
 Pino 6: I/O digital 8;
 Pino 11: I/O digital 5;
 Pino 12: I/O digital 4;
 Pino 13: I/O digital 3;
 Pino 14: I/O digital 2;
 Pino 15: Pino central do potenciômetro;
 Pino 16: GND do Arduino
Display LCD com monitor serial
78
 Transmitir informações ou comandos personalizados através do display de LCD pode ser
útil e necessário em vários projetos ou atividades.
79
Servomotor
80

 Controle do ângulo de giro.


180º/360º
 Black/Brown: GND.
 Red: alimentação.
 Yellow/White/Orange: controle.
Servomotor
81
 Biblioteca Servo:

 attach(pin): define o pino o qual o sinal de controle do motor está conectado.

 write(angle): define o ângulo do rotor (180º) ou a velocidade do rotor (360º).


Valores na faixa de 0 a 180.

 read(): ler o valor do ângulo do rotor, definido pela função servo.write().

 attached(): verifica se existe um servomotor conectado ao pino.

 detach(): desabilita o uso do pino para controle do servomotor, liberando para


uso normal.
Exercitando...
1. Utilize o Monitor Serial para definir o ângulo desejado de um servomotor. O
usuário deve inserir um valor entre 0 e 179 e o motor deve ir para o ângulo
inserido. Caso o usuário insira valores fora da margem 0 a 179, deve ser exibido
no Monitor Serial a mensagem: ângulo inválido.
2. Complemente a questão anterior, inserindo um display LCD. O ângulo do
servomotor deve ser inserido no Monitor Serial, após isto o motor vai para o
ângulo definido, e também será exibido no display LCD.
3. Controle um servomotor através de três botões que definem o ângulo. O primeiro
botão é responsável por incrementar o ângulo, um segundo botão decrementa
o ângulo e o terceiro reseta para o ângulo zero.

82
Motor DC
 Motor de corrente contínua

83
Motor DC
com Ponte H
 A ponte H é utilizada para inverter o sentido de giro de um motor DC.

84
Motor DC
com Ponte H
 A ponte H (CI L293D) permite o
controle do sentido de giro de até dois
motores DC.

85
86
Lista de Exercícios I
Exercitando...
1. Pisca-Pisca: Um LED conectado a um pino qualquer deverá piscar em um
intervalo de 500ms (use a função delay e millis).
2. Botão e LED: Ao pressionar um botão conectado no pino 8, deverá acender um
LED conectado no pino 10, de tal forma que o mesmo deverá permanecer
aceso por 5s após desativar o botão, após esse tempo o LED apagará.
3. Barra de LEDs: Um conjunto de 8 LEDs (Pino 2 a 9) será ativado de modo
sequencial após o botão 1 (conectado no pino 10) ser pressionado. Os LEDs
serão desativados também pelo botão 1.
4. Barra de LEDs: Um conjunto de 8 LEDs será ativado de modo sequencial após o
botão 1 ser pressionado. Os LEDs serão desativados após realizar o mesmo ciclo 5
vezes.
5. Barra de LEDs: Um conjunto de 8 LEDs será ativado de modo sequencial após o
botão 1 ser pressionado. Os LEDs serão desativados pelo botão 2.

87
Exercitando...
6. Pisca-Pisca: Repita as questões 3 e 4 utilizando resistores pull up internos
do Arduino.
7. Pisca-Pisca com Relé: Um LED conectado a um relé deverá piscar em um
intervalo de 500ms.
8. Faça com que em uma sequência de seis LEDs, os presentes em AMBAS
as extremidades da sequencia iniciem acesos. Então, avance as luzes,
uma em direção da outra, dando a impressão de que estão se
encontrando e após isso retornando as extremidades, em que só as da
extremidade permanecem acesas.
9. Para evitar acidentes no ambiente de trabalho, uma regra de segurança
em vários equipamentos industriais é obrigar que um usuário aperte dois
botões, um com cada mão, para acionar uma máquina. É o caso da
máquina de corte usada em fábricas de papel. Monte um circuito em
que um LED somente acende se os dois botões do circuito estiverem
88 pressionados.
Exercitando...
10. Faça mais uma modificação na questão 10, em que um LED vermelho
deve acender ao pressionar o botão 1 ou o botão 2. Se ambos forem
pressionados um LED verde deve acender. Ao deixar de pressionar
ambos os botões, ambos os LEDs se apagam.
11. Faça mais uma modificação na questão 10, agora um LED vermelho
deve acender ao iniciar o processo, após 1 segundo esse LED vermelho é
apagado e um LED amarelo deve piscar 5 vezes (intervalo de 500ms) e
depois permanecer aceso indicando que os botões 1 e 2 podem ser
acionados. Ao acionar ambos os botões no mesmo instante, um LED
verde deve acender e o amarelo apagar, do contrário o LED verde não
acende (se pressionar somente um botão por vez). É importante ressaltar
que ao pressionar ambos os botões o LED verde só irá acender se o LED
amarelo estiver aceso continuamente (sem piscar).

89
Exercitando...
12. Semáforo: Projete um semáforo para o cruzamento entre as ruas 01 e 02.
As luzes acedem de modo a nunca coincidirem, permitindo um tráfego
seguro.

13. Dessa vez, considere uma avenida de mão dupla, com um semáforo em
cada uma das vias, e inclua um farol de pedestre e um botão, que será
pressionado pelos pedestres para solicitar a travessia da rua. Ambos os
semáforos presentes na via vão estar no mesmo estado. O Arduino
reagirá quando o botão for pressionado, alterando o estado das luzes
90 para que os carros parem e os pedestres possam atravessar.
Exercitando...
14. Projete um hardware e um software utilizando Arduino que realize a leitura do ADC A0 com
10 bits e que, acenda um LED vermelho quando o valor lido for menor que 2,5V e acenda o
LED amarelo quando for maior. Exiba no monitor serial o valor da tensão.
15. Solução de um programa que implemente as funções soma, subtração, multiplicação e
divisão, em que todas estas são chamadas por uma função exclusiva para a operação,
inclusive pedindo os valores de entrada de cada função e apresentando as saídas das
mesmas no final. Os valores resultantes devem ser inseridos e exibidos no monitor serial.
16. Solução para um programa utilizando um vetor que armazena 5 números. Encontre o maior,
o menor e a média dos números existentes no vetor. Os valores resultantes devem ser
exibidos no monitor serial.
17. Projete um hardware e um software utilizando o Arduino que implemente um ou exclusivo
(XOR) de 3 entradas e acione um LED para demonstrar as saídas com nível lógico alto.
18. Projete um hardware e um software utilizando o Arduino que implemente um codificador
BCD para display de 7 segmentos. Pode ser empregado quatro botões nas entradas para
representar o BCD.
19. Projete um hardware e um software utilizando Arduino que realize a leitura do ADC AN0
com 10 bits e demonstre o resultado da parte inteira da tensão em um display de 7
91 segmentos.
Display 7 segmentos
92
93
Exercitando...
94
20. Utilize um Display 7 seg. para fazer um contador Up/Down (0 a 9, 9 a 0).
21.Botão e display de 7 segmentos: Ao pressionar um botão, o número 0
será incrementado em n+1 até 9
22.Botão e display de 7 segmentos: Ao pressionar um botão, o número 9
será decrementado em n-1 até 0.
23.Botão e display de 7 segmentos: Utilize um botão de decremento e um
botão de incremento para alterar o valor apresentado em um display
de 7 segmentos. Ao pressionar o botão de incremento o número é
somado com 1. Ao pressionar o de decremento o número 1 deve
ser subtraído.
24.Display de 7 segmentos: Faça um programa que acione dois displays de
sete segmentos e apresente uma contagem progressiva de 0 a 99.
25.Display de 7 segmentos: Faça um programa que acione dois displays de
sete segmentos e apresente uma contagem regressiva de 99 a 0.
95
4. Interrupções
Interrupção externa
 As interrupções são úteis para que as
coisas aconteçam automaticamente no
instante que forem acionadas e podem
ajudar a resolver problemas de
temporização.
 Serviço de interrupção de rotinas (ISR) são
tipos especiais de funções que possuem
algumas limitações únicas que a maioria
das outras funções não possuem. Um ISR
não pode ter nenhum parâmetro, e eles
não devem retornar nada.
 Normalmente utiliza-se variáveis globais
para passar dados entre um ISR e o
programa principal. Para garantir que as
variáveis compartilhadas entre um ISR e o
programa principal sejam atualizadas
corretamente, declare-as como volatile
(armazenado na memória de RAM ao
invés de registradores temporários).
96
97
Interrupção externa

98
Interrupção externa
Acendendo um LED por 0,005 segundos, e um
segundo LED (Pin13) ao pressionar um botão

99
Interrupção interna:
Timers
 É possível utilizar o temporizador para medir
repetidamente um período de tempo. No final
de cada período, uma função de interrupção
pode ser executada.

 Bibliotecas utilizadas: TimerOne.h e TimerThree.h

 O uso destas desabilita o uso do PWM nos pinos


indicados na tabela ao lado. Logo a função
analogWrite() não irá funcionar corretamente.

100
TimerOne.h
 Configuração:
 Timer1.initialize(time): define o tempo desejado para ativar a interrupção. Esta função deve
ser utilizada antes de qualquer outra para inicializar o temporizador, e time deve ser definido
em microssegundos. time varia de 1 a 8.388.480 microssegundos (8,3 segundos).
 Timer1.setPeriod(time): modifica o tempo desejado para ativar a interrupção, após o
temporizador ter sido inicializado.

 Controle:
 Timer1.start(): inicializa o temporizador.
 Timer1.stop(): pausa o temporizador.
 Timer1.restart(): reseta o temporizador.
 Timer1.resume(): retoma a contagem do temporizador após ter sido pausado.

101
TimerOne.h
 Interrupção:
 Timer1.attachInterrupt(função): função a ser executada ao término do tempo predefinido. Essa
função será acionada como uma interrupção.
 Timer1.detachInterrupt(): desabilita a função de interrupção.

 PWM:
 Timer1.pwm(pin, duty): permite o uso dos pinos de PWM. O duty cycle varia de 0 a 1023, em
que 0 representa o 0V e 1023 o 5V.
 Timer1.setPwmDuty(pin, duty): permite o reajuste do duty cycle do PWM sem reconfigurar o
pino para uso de PWM. Timer1.pwm(pin, duty) deve ser utilizado pelo menos uma vez antes
desta função.
 Timer1.disablePwm(pin): desabilita o uso do PWM no pino, e o mesmo volta a funcionar com a
função digitalWrite();.

102
TimerOne.h

103
104
Exercitando...
1. Pisca-Pisca: Um LED conectado a um pino qualquer deverá piscar em um
intervalo de 500ms acionado por uma rotina de interrupção (ISR).
2. Botão e LED: Um LED deve alternar o seu estado a cada 50ms, e ao pressionar
um botão, um segundo LED deverá acender ao pressionar o botão.
3. Projeto um semáforo para uma avenida de mão dupla, com um semáforo em cada uma
das vias, e inclua um farol de pedestre e um botão, que será pressionado pelos pedestres
para solicitar a travessia da rua. Ambos os semáforos presentes na via devem estar
sempre no mesmo estado. O Arduino reagirá quando o botão for pressionado através de
uma ISR, alterando o estado das luzes para que os carros parem e os pedestres possam
atravessar.

105

Você também pode gostar