Escolar Documentos
Profissional Documentos
Cultura Documentos
ELETRÔNICA
UNIDADE
3
SITUAÇÃO DE
APRENDIZAGEM
APRESENTAÇÃO
Antes de ser montada na máquina de lavar louças, a placa principal será conectada na giga de
testes. A giga deverá receber e enviar sinais elétricos da placa da máquina, simulando o funcion-
amento de todos os componentes, por exemplo, motor, aquecedor, sensores de nível, sensor de
temperatura etc.
Imagine que você tenha sido contratado pela empresa para elaborar o programa que será executa-
do no microcontrolador da nova giga de testes. Você deverá programar a giga de testes para acionar
os sensores no momento adequado, simulando o funcionamento da máquina na medida em que
detecta o acionamento do motor e do aquecedor. No final dos testes, você deverá sinalizar se a
placa da máquina está aprovada ou reprovada.
3
DESAFIOS
Para facilitar seus estudos, a programação do microcontrolador será feita em cinco etapas. Cada
uma corresponderá a um desafio que você precisará enfrentar para ter seu trabalho concluído sat-
isfatoriamente.
O desafio 1 consiste em elaborar uma parte do programa da giga de testes. Por meio
de entradas e saídas digitais, o programa deverá monitorar o acionamento das vál-
vulas de entrada e de saída de água e simular o funcionamento dos sensores de nível.
O desafio 2 consiste em elaborar outra parte do programa da giga de testes. Por meio
de entradas e saídas digitais e/ ou analógicas, o programa deverá monitorar o aciona-
mento do aquecedor e simular o funcionamento de um sensor de temperatura.
4
DESAFIO 1
APRESENTAÇÃO
Neste desafio, você estudará os detalhes necessários para iniciar a elaboração de um projeto com o
Arduino Due, criando programas de leitura/escrita nas suas saídas digitais. No final deste desafio
você terá subsídios para:
6
PLATAFORMA ARDUINO, O QUE É?
Do ponto de vista prático, ao invés de você ter todo o trabalho para realizar um projeto partindo
do zero, desde a ideia inicial, diagrama, PCI (placa de circuito impresso), montagem, protótipos,
pesquisa de bugs, cabeamento e documentação, o Arduino oferece boa parte pronta, por meio de
uma pequena PCI baseada em microcontrolador e com slots conectados às portas de entrada, de
saída e de comunicação.
Seu público alvo se estende desde profissionais de eletrônica, que utilizam o Arduino
na concepção de protótipos, até amadores, que podem utilizar os recursos de
microcontroladores em diversos projetos, sem a necessidade de conhecer profundamente
o funcionamento desse componente.
O Arduino possui vários modelos de placas. A principal diferença entre elas é o microcontrolador
utilizado, por exemplo, o ATmega328, presente na placa Arduino Uno ou um Atmel SAM3X8E
(com núcleo ARM Cortex-M3), presente na Arduino Due. Além do microcontrolador, todas as
placas Arduino contêm os componentes periféricos necessários para os microcontroladores fun-
cionarem adequadamente e se comunicarem com um computador, incluindo a parte que permite
a gravação do firmware no microcontrolador. O preço das placas varia entre €18,00 e €169,00,
conforme o modelo.
Outra vantagem do Arduino é que as placas suportam pequenos equívocos elétricos, comuns a
jovens alunos iniciantes ou amadores.
Arduino Esplora
Arduino Robot
7
Quanto ao software, o Arduino segue a filosofia IDE (Integrated Development Environment) ou
Ambiente de Desenvolvimento Integrado, onde desenvolvedores de todo o mundo participam com
contribuições e que estão disponíveis gratuitamente no site www.arduino.cc e fóruns relacionados.
O ambiente funciona em vários sistemas operacionais, como por exemplo, Linux, Macintosh e Win-
dows. A programação do Arduino é baseada na linguagem C. Além das instruções básicas da lin-
guagem C, o ambiente possui algumas instruções específicas para as placas Arduino, que facilitam o
uso dos recursos do microcontrolador. Normalmente, as instruções do Arduino são mais intuitivas
e fáceis de utilizar do que as do próprio ambiente disponibilizado pelo fabricante do microcontro-
lador. O objetivo é facilitar a programação e torná-la mais acessível, de modo que você não precisa
ser um programador profissional para programar um Arduino.
Importante!
Saiba mais...
8
ARDUINO DUE
Neste curso utilizaremos o Arduino Due. A escolha se deve, principalmente, ao fato do Arduino
Due utilizar um microcontrolador de 32 bits, que é muito superior aos de 8 bits que estamos mais
habituados. Portanto, além da oportunidade de comparar duas plataformas – PIC e Arduino -, você
poderá comparar um microcontrolador de 8 bits com um de 32 bits.
Arduino Due
9
CARACTERÍSTICAS DO ARDUINO DUE
MICROCONTROLADOR
O Arduino Due vem equipado com um microcontrolador Atmel SAM3X, que é membro
da família de microcontroladores baseados na arquitetura do processador de 32 bits da
familia Cortex® M3, projetado pela empresa ARM® Ltd. É a primeira placa da família
Arduino a utilizar esse tipo de microcontrolador, permitindo operações com 4 bytes de
dados por ciclo de clock.
Saiba mais...
O SAM3X está pronto para telas capacitivas sensíveis ao toque, graças à biblioteca
Qtouch, oferecendo uma maneira fácil de implementar botões e controles deslizantes.
A arquitetura do SAM3X é projetada especificamente para sustentar transferências de
dados em alta velocidade. Ela inclui barramentos de dados na forma de uma matrix, em
multicamadas, bem como vários bancos de memória tipo SRAM e canais PDC e DMA
que lhe permitem executar tarefas em paralelo e maximizar taxas de transferências de
dados.
10
A tensão de operação permitida vai de 1,62 V até 3,6 V, e o componente está disponível
em encapsulamentos LQFP de 100 e 144 pinos, TFBGA de 100 pinos e LFBGA 144 pi-
nos. Os microcontroladores SAM3X são particularmente adequados para aplicações de
redes industriais, automação predial, residencial e gateways.
11
RECURSOS DA PLACA
• 54 entradas/ saídas digitais, sendo que 12 podem ser usadas como saída PWM;
• 12 entradas analógicas;
• 2 saídas analógicas (DAC0 e DAC1) com 12 bits de resolução;
• 2 portas USB, sendo uma nativa e outra de programação;
• 1 comunicação SPI (ICSP);
• 1 entrada AREF, para fornecer uma tensão de referência para entradas analógicas;
• 1 conector para alimentação externa.
Saiba mais...
12
Porta USB nativa
Native port (porta nativa): Esta porta é conectada diretamente ao SAM3X, sem
qualquer tipo de interface. A porta nativa também se comunica com taxa de 1200
bps, mas desencadeia um processo de soft erase, onde a memória flash é apagada
e a placa é reiniciada com o bootloader. Se por qualquer motivo o SAM3X travar
nessa operação, é provável que o procedimento de soft erase tenha falhado. Alterar a
taxa de transmissão da porta nativa não irá resolver o problema. Nesses casos, você
deverá reiniciar a programação usando a porta USB nativa.
13
INDICADORES LUMINOSOS (LED)
O arduino possui 4 LED com encapsumento SMD que sinalizam certos eventos na placa.
A localização, na placa, está indicada na figura a seguir.
14
PORTAS DE ENTRADA E DE SAÍDA
Já vimos anteriormente que a tensão nas portas I/O do Arduino não pode ultrapassar 3,3
V. O fabricante indica em
SAM – Arduino Pin Mapping a corrente máxima de cada porta. Mesmo que a maioria
seja capaz de fornecer até 15 mA, não é recomendado ligar um LED diretamente na
porta. O meio mais adequado para se fazer isso é com um resistor em série. Podemos
calcular facilmente o valor do resistor por meio da análise do circuito. Acompanhe:
R = (Vsaída-VF(LED)/IF(LED)
Importante!
Outra opção é utilizar um transistor de sinal para atuar como chave, por exemplo, BC547
ou similar.
Saiba mais...
15
PARTICULARIDADES
Graças à sua porta USB nativa e à biblioteca USB Host, o Arduino Due pode funcionar
como um host USB, permitindo que ele se comunique com periféricos, por exemplo,
mouses e teclados USB. A placa só não suporta dispositivos conectados por meio de hubs
USB, comuns em alguns teclados com um hub interno.
Saiba mais...
Para saber mais sobre USB HOST, leia o artigo disponível aqui
(o artigo está no idioma inglês). Link:
http://www.arduino.cc/en/Reference/USBHost
16
SOFTWARE
Com relação ao software, seguindo a mesma linha de comparação entre o PIC e o SAM3X, ambos
irão trabalhar com linguagem C, mas cada um com seu próprio compilador. É importante lembrar
que linguagens de alto nível costumam ocupar mais espaço na memória de programa. Nesse sen-
tido, um programa elaborado em C tende a ocupar mais espaço do que outro elaborado em As-
sembly. No PIC, é comum utilizarmos o Assembly quando conhecemos muito bem o hardware e o
projeto não é tão complexo. No Arduino não há essa opção, mas contamos com bibliotecas criadas
pelo fabricante e por usuários, essas últimas nem sempre enxutas. Portanto, se por um lado o Ar-
duino oferece mais facilidade na programação, por outro, tende a ocupar mais espaço na memória
de programa.
Não é o caso de apontar o que é melhor ou pior, mas de chamar a sua atenção para essas carac-
terísticas, já que a decisão vai depender da complexidade do projeto e da quantidade de memória
que você tem à disposição.
Saiba mais...
17
INSTALAÇÃO DO SOFTWARE
A primeira tela contém o termo de licença de uso. Leia o texto e as condições de uso e, se concordar,
clique no botão I Agree;
Será apresentada uma lista de módulos para instalação, e por padrão, todos eles estarão seleciona-
dos. Mantenha assim e clique em Next;
18
Você deverá selecionar uma pasta de instalação ou aceitar a pasta padrão, sugerida pelo instalador.
Depois, clique em Install;
19
Após a instalação dos arquivos, algumas janelas solicitarão permissão para instalar os drivers USB.
Clique em Instalar cada vez que for solicitado (a quantidade de solicitações pode variar).
Quando a instalação for concluída, clique em Close. Você terminou a instalação. Os respectivos
drivers serão instalados no momento em que a placa for conectada ao computador pela primeira
vez. Siga em frente e acompanhe o procedimento de configuração dos drivers.
Agora que o software está instalado, conecte seu Arduino Due ao computador com o cabo USB-mi-
croUSB.
20
Utilize a porta USB de programação e mantenha uma conexão ativa com a internet para eventual
aquisição drivers adicionais ou dispositivos solicitados pelo Windows. Nesses casos, o download e
a instalação serão feitos automaticamente.
Agora, vamos conhecer alguns comandos para iniciar a programação de um Arduino Due. Siga em
frente para saber como acionar uma porta de saída.
21
COMO ESCREVER EM UMA PORTA DE SAÍDA
Antes de escrever nível lógico zero ou um em uma porta de saída digital, é necessário configurar a
respectiva porta. Isso é feito por meio da instrução pinMode(). A sintaxe da instrução pinMode() é
bem simples. Se você deseja configurar uma porta como saída, basta indicar o número da porta e a
configuração nos parâmetros da instrução. No exemplo, a seguir, vamos configurar a porta número
13 para funcionar como saída:
pinMode(13, OUTPUT);
Depois de configurar a porta, você poderá utilizar a instrução digitalWrite() para escrever o valor
desejado, na porta. Basta informar o número da porta e o nível lógico desejado nos parâmetros da
instrução. Acompanhe os exemplos:
Um modo prático para testar o acionamento de uma porta é conectar um LED com um resistor em
série diretamente na porta que deseja testar. No exemplo, a seguir, temos um diagrama que indica
como ligar um LED na porta 13 do Arduino Due.
Além do LED externo, utilizado no exemplo anterior, você pode verificar o acionamento da porta
número 13 por meio do LED L, da própria placa. Basta lembrar que esse LED está ligado na porta
13.
22
COMO LER UMA PORTA DE ENTRADA
Assim como acontece no processo de escrita, para ler uma porta você também precisa configurá-la,
primeiro. Para isso, vamos utilizar a mesma instrução pinMode(), mas agora, o último parâmetro
da instrução deverá ser INPUT. Acompanhe um exemplo:
Depois, basta utilizar a função digitalRead() para ler o valor da porta. O único parâmetro da função
é o número da porta que você deseja ler. Você pode carregar o valor da porta em uma variável ou
utilizar a função digitalRead() diretamente em instruções do tipo if ou while. Acompanhe alguns
exemplos:
Um modo prático para testar a leitura de uma porta é conectar uma chave diretamente na porta que
deseja testar. No exemplo a seguir, temos um diagrama que indica como conectar uma chave na
porta 2 do Arduino Due. Note que, como a chave está ligada no positivo da alimentação, adicion-
amos um resistor de pull down conectado ao GND, para forçar nível lógico zero quando a chave
estiver desligada.
Agora que você já sabe como ler e acionar uma porta no Arduino Due, siga em frente para acom-
panhar o exemplo de um programa completo.
23
EXEMPLO DE PROGRAMA: LED PISCANDO
Nesta etapa, você identificará muitas semelhanças com a programação dos microcontroladores PIC,
que fizemos na unidade anterior. Isso se deve ao fato de que o Arduino também utiliza a linguagem
C, ou seja, as declarações de variáveis, inserções de comentários e algumas instruções possuem
a mesma sintaxe. Uma vantagem do ambiente de programação do Arduino é a simplificação das
configurações iniciais e de algumas instruções específicas. Por exemplo, no PIC, antes de começar
um programa você precisa indicar os bits de configuração e a frequência do microcontrolador. No
Arduino não há essa preocupação. Basta iniciar o seu programa pelos procedimentos setup() ou
loop().
Resumindo, o procedimento setup() é mais indicado para ações que devem acontecer uma única
vez, no início do programa. Por exemplo, a inicialização de variáveis globais e a configuração das
portas. Já o procedimento loop() é mais indicado para as instruções gerais do seu programa, que
deverão ser executadas enquanto a placa estiver energizada ou, pelo menos, até que seja acionado
um reset.
24
A seguir, elaboramos um programa de exemplo que faz o LED L, do Arduino Due, piscar em in-
tervalos de 1 segundo. Ao estudar a estrutura do programa você poderá compreender melhor o
ambiente de programação de um Arduino. No programa, todas as instruções estão comentadas
para facilitar o seu entendimento. Acompanhe:
/*PISCANDO UM LED
Este programa fara piscar o LED L do Arduino Due
O Intervalo entre aceso e apagado será de 1 segundo.
Criado em 2015
por Autor 1
modificado em 13 Abr 2015
por Autor 2
*/
void setup ()
{
pinMode(led,OUTPUT); // Configuração da porta 13 como saida
}
void loop ()
{
digitalWrite(led,HIGH); // escrece nível lógico alto na porta 13 - LED essa
delay(1000); // aguarde 1000m
digitalWrite(led,LOW); //escreve nível lógico zero na porta 13 - LED apagado
delay(1000); // aguarda 1000 ms
}
Saiba mais...
Você pode saber mais sobre as funções e comandos usados neste exemplo
nos seguintes endereços eletrônicos:
www.arduino.cc/en/Reference/Setup
www.arduino.cc/en/Reference/Loop
www.arduino.cc/en/Reference/DigitalWrite
www.arduino.cc/en/Reference/Delay
www.arduino.cc/en/Reference/PinMode
25
COMPILANDO E GRAVANDO UM PROGRAMA NO ARDUINO DUE
CONFIGURANDO O PROGRAMA
26
primeiro acesso, logo após a instalação do ambiente, já que os componentes do Arduino
Due não são instalados por padrão. Portanto, precisamos instalá-los, primeiro.
27
Nesta tela, note que Arduino SAM Boards (32-bits ARM Cortex-M3) by Arduino não
está instalado. Esse pacote contém os arquivos necessários para o Arduino Due. Clique
sobre a área Arduino SAM Boards (32-bits ARM Cortex-M3) by Arduino e, depois,
clique em install para instalá-los.
28
Agora sim, podemos configurar o ambiente para o Arduino Due. Selecione
Ferramentas→Placa e clique em Arduino Due, de acordo com a porta que você deseja
utilizar para a gravação. Pronto, o ambiente de programação está preparado para se
comunicar com o Arduino Due.
29
COMPILANDO UM PROGRAMA
Agora que o ambiente está devidamente configurado, você já pode elaborar o seu pro-
grama, compilá-lo e gravá-lo no Arduino Due. Acompanhe, a seguir, o procedimento
passo-a-passo para compilar e, mais adiante, gravar um programa.
Para compilar um programa, basta selecionar Sketch→Verificar/Compilar.
30
Por fim, o compilador indicará os resultados da compilação na parte inferior da tela,
informando se a compilação foi bem-sucedida ou se há erros. Em caso de erros, você
poderá consultar os detalhes de cada erro encontrado.
31
GRAVANDO UM PROGRAMA
Depois de compilar o programa, se não houver erros de compilação, ele está pronto para
ser gravado na placa.
Para iniciar a gravação, clique em Arquivo->Carregar. Nesse processo, o ambiente fará
uma nova compilação e, logo em seguida, iniciará o processo de gravação. Quando a
gravação estiver concluída, aparecerão várias mensagens, entre elas Verify Sucessful, Set
boot flash true e CPU reset na parte inferior da tela.
Neste momento, o Arduino Due já estará funcionando com o programa que você acabou
de gravar.
32
PROGRAMA DE EXEMPLO: DISPOSITIVO DE SEGURANÇA PARA
CONTROLAR AS LUZES DE UM VEÍCULO
Até aqui, vimos como programar um Arduino utilizando instruções de leitura e escrita em portas
digitais e como compilar e gravar um programa nas placas Arduino.
Agora, além da oportunidade de estudar mais um programa de exemplo, você conhecerá uma
alternativa para o projeto do dispositivo de segurança para controlar as luzes de um veículo, que
elaboramos na unidade 1, quando utilizamos um CPLD. O programa de exemplo, a seguir, faz o
controle das luzes utilizando um Arduino, no lugar do CPLD. Note que todo o controle de leitura
das chaves e acionamento das lâmpadas é feito com as instruções que estudamos ao longo deste
desafio.
Para resgatar as informações sobre o escopo do projeto do dispositivo de segurança para controlar
as luzes de um veículo, acesse seu ambiente virtual de aprendizagem.
/*
==========================================================
//Programação de exemplo
//Escopo: A função do programa é monitorar o
//acionamento das luzes veiculares
==========================================================
*/
void setup()
{
pinMode(alav_1, INPUT); // Configura como entrada
pinMode(alav_2, INPUT); // Configura como entrada
pinMode(botao_m, INPUT); // Configura como entrada
pinMode(milha, OUTPUT); // Configura como saída
pinMode(farol, OUTPUT); // Configura como saída
pinMode(lant, OUTPUT); // Configura como saída
}
33
void loop ()
{
//Aguarda alum comando;
if (digitalRead(alav_1)==HIGH) //alav_1 acionada?
{
digitalWeite(lant,HIGH); //sim, liga lant
}
Saiba mais...
L
http://www.arduino.cc/en/Reference/While
34
DESAFIO 1
Bom trabalho!
RECAPITULANDO
35
DESAFIO 2
APRESENTAÇÃO
37
DOCUMENTAÇÃO
No desafio 1 elaboramos um programa para realizar uma atividade simples de leitura e escrita
em portas digitais. Como você pode imaginar, a quantidade de variáveis e de instruções em um
programa costuma ser bem maior do que nos programas que elaboramos até agora, tornando cada
vez mais difícil a programação e a depuração de erros.
Para organizar e registrar a tarefa de programação e facilitar a depuração de erros devemos utilizar
uma ferramenta chamada fluxograma. Um fluxograma indica as etapas de uma determinada tarefa
como, por exemplo, a sequência de gravação de um programa qualquer em um microcontrolador,
que pode ser representada pelo fluxograma, a seguir.
Como você pôde ver, as etapas de um fluxograma indicam o passo-a-passo de uma tarefa.
Importante!
Provavelmente, você já deve ter estudado, em disciplinas de informática, sobre as fases de resolução
de problemas em computação. Vamos resgatar essas informações para você relembrá-las.
Análise de
Programa
Desenho do
Algoritmo
Codificação
Compilação
e Execução
Verificação
Depuração
Manutenção
Documentação
38
Note que, na segunda fase, o desenho do algoritmo retrata a maneira mais adequada de trabalhar
para alcançar o sucesso em nossos desafios.
Portanto, o fluxograma é uma representação gráfica de um algoritmo, cujos símbolos seguem uma
representação normatizada. Você pode ver, a seguir, algumas dessas formas.
39
2. DECLARAÇÃO DE ENTRADAS E SAÍDAS
40
3. PROCEDIMENTO LOOP()
41
Para compreender melhor o fluxograma do exemplo, acesse o simulador do projeto luzes veiculares
e compare o funcionamento do programa com o fluxograma.
Agora que você resgatou informações importantes sobre o fluxograma, não se esqueça de elaborá-
los para os próximos desafios.
42
CONVERSOR A/D
Portanto, para utilizar o conversor A/D do Arduino Due, é importante que você conheça as
particularidades do conversor presente no microcontrolador SAM3X. É o que estudaremos, a
seguir.
43
CONVERSOR A/D DO MICROCONTROLADOR SAM3X
O microcontrolador SAM3X, que equipa o Arduino Due, possui um conversor A/D de até 12 bits.
A figura a seguir, indica as portas que podem ser utilizadas com o conversor A/D (portas AD0 à
AD14).
• Resolução de 12 bits;
• Taxa de conversão de 1 MHz;
• Single Ended selecionável ou por diferencial de tensão de entrada;
• Ganho programável para ampla faixa de entrada, entre 0 – VDD;
• Multiplexador integrado que permite mais de 16 entradas analógicas independentes;
• Enable e Disable individual para cada canal;
• Sincronismo por Hardware ou Software;
• Pino de sincronismo externo;
• Saídas Timer Counter (equivalentes às de sincronismo TIOA);
• Linha de eventos PWM;
• Drive para falta de entrada PWM;
• Suporte a PDC;
• Possibilidade de configuração dos temporizadores do conversor AD;
• 2 modos Sleep e sequenciador de conversão;
• Wakeup automático com sincronismo e retorno ao modo Sleep após a conversão de todos os
canais habilitados;
• Possibilidade de sequenciamento de canais customizada;
• Mode Standby para uma rápida resposta de Wakeup;
• Capacidade de Power Down;
• Janela de comparação automática de valores convertidos;
• Registradores com proteção contra escrita.
44
Para compreender melhor o funcionamento do conversor A/D do SAM3X, é preciso conhecer
mais detalhes sobre as principais características.
FUNCIONAMENTO
45
O conversor A/D se conecta com um canal PDC (Peripheral DMA Controller) e esta
integração, por meio de ciclos de latência e sequenciamento da conversão, contribui para
reduzir tanto o consumo de energia como a intervenção do processador.
Internamente, no conversor A/D, um conjunto de tensões de referência é gerado a partir
de um único nó de tensão de referência externo que pode ser igual à tensão de alimentação
analógica. Uma capacitância externa de desacoplamento será necessária para filtragem
de ruído. Um circuito de correção de erro digital, com base no algoritmo multi-bit
RSD (Redundant Signed Digit), é utilizado a fim de reduzir erros INL (Integral Non-
linearity) e DNL (Differential Non-linearity). Finalmente, o usuário pode configurar os
temporizadores do conversor A/D, tais como o Startup Time e o Tracking Time.
O conversor A/D usa seu clock interno para executar as conversões. A conversão de um
único valor analógico para um digital de 12 bits requer vários ciclos de monitoramento
do clock, tal como definido no campo TRACKTIM, em ADC mode register (página
1333 do datasheet do SAM3X) e outros ciclos de clock para transferência, como definido
no campo TRANSFER do mesmo registro.
A frequência de clock do conversor A/D é selecionada no campo PRESCAL do Mode
Register (ADC_MR). A fase de monitoramento é iniciada durante a conversão do canal
anterior. Se este tempo for maior do que o tempo de conversão, a fase se estende para o
final da conversão que a precede.
A faixa de clock do conversor A/D está entre MCK/2, se PRESCAL for igual a 0,
e MCK/512, se PRESCAL for igual a 255 (0xFF). O valor de PRESCAL deverá ser
programado de forma a proporcionar uma frequência de clock do conversor A/D de
acordo com os parâmetros indicados na seção de características elétricas do produto no
datasheet do SAM3X.
Alguns projetos avançados necessitam deste conhecimento e você pode acompanhar e
discutir no link.
46
ADC PRESCALER
O conversor A/D necessita de alguns pulsos de clock para fazer a conversão. Os pulsos
são gerados pelo clock do sistema que é dividido, sucessivamente, até obter a frequência
necessária. Para funcionar, o conversor A/D necessita de uma frequência entre 1 e 22
MHz. Quanto maior a frequência, mais rápida é a conversão. Por outro lado, frequências
menores proporcionam conversões mais precisas. A frequência do sistema pode ser
definida com qualquer valor definido pelo usuário (usando osciladores internos ou
externos). O clock do sistema pode ser dividido por 1, 2, 3*, 4, 16, 32, 64, sempre definido
pelo Prescaler (campo PRES com default em 1).
Saiba mais...
CANAIS
O conversor A/D do SAM3X tem 12 canais, o que significa que você pode tirar doze
amostras de sinais em diferentes portas, ou seja, você pode conectar até doze sensores
diferentes e obter os seus valores separadamente.
Saiba mais...
47
ENTRADAS E SAÍDAS ANALÓGICAS
Como vimos no desafio anterior, o Arduino Due possui 12 entradas e 2 saídas analógicas,
identificadas como Ax e DACx, respectivamente (de modo que x indica o número da entrada/
saída).
É importante lembrar que as portas analógicas também podem funcionar como portas
digitais, dependendo da configuração indicada no software. Por outro lado, as portas
digitais não podem ser utilizadas como analógicas, portanto, quando for escolher as
portas que pretende utilizar no Arduino Due, certifique-se de que esteja utilizando as
mais adequadas para o seu projeto, evitando o uso de portas dedicadas sem necessidade.
48
COMO CONFIGURAR UMA ENTRADA ANALÓGICA
No Arduino, essa configuração é feita pela instrução pinMode(), que estudamos no desafio anterior.
Portanto, para utilizar uma porta como entrada analógica, basta configurá-la como entrada, do
mesmo modo que fizemos no desafio anterior. Significa dizer que, no Arduino, não é necessário
indicar se a porta será digital ou analógica, basta configurá-la como entrada ou como saída.
Acompanhe um exemplo:
Opcionalmente, você também pode configurar a resolução do conversor por meio da instrução
analogReadResolution(). O parâmetro da instrução indica a resolução desejada. Se você não
configurar a resolução, o valor padrão de 8 bits será utilizado.
Saiba mais...
49
COMO CONFIGURAR UMA ENTRADA ANALÓGICA
O Arduino utiliza uma função chamada analogRead() para iniciar a conversão e obter o valor
digital equivalente à tensão da entrada requisitada.
O microcontrolador demora cerca de 100 microssegundos (0,0001 s) para ler uma entrada analógica,
então, a taxa máxima de leitura será de 10.000 vezes por segundo, aproximadamente.
Importante!
A função analogRead() possui apenas um parâmetro, que é o número da porta que você deseja fazer
a conversão. A função retornará um valor numérico inteiro, que corresponde ao valor convertido.
O valor pode ser carregado em uma variável. Acompanhe um exemplo:
Saiba mais...
Dica...
50
EXEMPLO DE PROGRAMAÇÃO (POTENCIÔMETRO E LED COM
CONVERSOR A/D)
Imagine que você necessita ler uma tensão por meio de uma entrada analógica e sinalizar o valor
lido, de algum modo. Podemos fazê-lo à partir de um potenciômetro, simulando um dispositivo
ou sensor que forneça uma tensão entre 0 e 3,3 V (limitação do modelo Due). Este programa de
exemplo lê a tensão na entrada analógica A0 e mantém um Led aceso por um tempo proporcional
ao valor retornado da função analogRead. Acompanhe o fluxograma e o programa de exemplo:
Fluxograma:
51
Programa:
O que ocorre se modificarmos o segundo delay, quando ledout está em LOW, para (1023-van)?
Simule com números inteiros entre 0 e 1023 e note a mudança nos tempos do Led.
Pronto! Agora você pode copiar o trecho do programa e colar no software Arduino. Salve com
um nome à sua escolha. O arquivo salvo estará na pasta com o mesmo nome acompanhado da
extensão.ino.
Saiba mais...
Você pode saber mais sobre as funções e comandos usados neste exemplo em:
http://www.arduino.cc/en/Reference/Setup
http://www.arduino.cc/en/Reference/Loop
http://www.arduino.cc/en/Reference/DigitalWrite
http://www.arduino.cc/en/Reference/Delay
http://www.arduino.cc/en/Reference/PinMode
http://playground.arduino.cc/Code/Potentiometer
Você já pensou em como ficaria a ligação física do exemplo com a placa Arduino Due? No desafio
1 já fizemos o cálculo do resistor externo, em série com o Led. Se você deseja apenas testar a
programação, pode usar o Led L, interno, já que a programação utiliza o pino 13. A figura, a seguir,
traz um exemplo de ligação do Led no Arduino Due.
52
Se desejar, você pode verificar o funcionamento do programa de exemplo no simulador disponível
em seu ambiente virtual de aprendizagem.
53
CONVERSOR D/A
Um conversor D/A faz o caminho inverso do conversor A/D. Imagine um CD de músicas. Como
você sabe, as músicas são gravadas no formato digital, e as informações são interpretadas por um
software. Depois da conversão, o resultado será o som, no formato analógico.
Um conversor D/A converte um número preciso, abstrato e finito (geralmente um número binário
de ponto fixo) em uma quantidade física real. Em outras palavras, cada número binário será
convertido para um nível de tensão equivalente, compatível com a tensão de referência e com a
resolução (quantidade de bits) de conversor.
No caso do CD, como você pode imaginar, o intervalo entre cada unidade digital forma uma
lacuna, criando uma espécie de degrau entre cada amostra da conversão. Para compor o sinal
analógico é preciso preencher essas lacunas, e para isso são utilizadas técnicas de interpolação de
sinais.
A figura, a seguir, é um exemplo de interpolação de um sinal digital (em vermelho) para um sinal
analógico (em cinza).
É importante que você saiba que nem todas as aplicações exigem a interpolação do sinal. Significa
dizer que, em alguns casos, as lacunas entre as amostras não afetam no funcionamento da aplicação.
54
CONVERSOR D/A
O microcontrolador SAM3X, que equipa o Arduino Due, possui um conversor D/A de até 12 bits.
A figura, a seguir, indica as portas que podem ser utilizadas com o conversor D/A (portas DAC0,
DAC1 e DATRG).
O conversor D/A do SAM3X possui as seguintes características:
• Resolução de 12 bits;
• Tensão de trabalho entre 2 e 3,6 V;
• Comunicação com velocidade de até 1 Msps (1.000.000 de amostras por segundo);
• Função sleep;
• Trigger configurável: interno ou externo.
Para compreender melhor o funcionamento do conversor D/A do SAM3X, é preciso conhecer mais
detalhes sobre as principais características.
FUNCIONAMENTO
O controlador do conversor D/A (DACC) utiliza o clock mestre (MCK) dividido por
dois para realizar as conversões. Este relógio é nomeado DACC clock. Uma vez que uma
conversão é iniciada, o DACC leva 25 períodos de clock para fornecer o resultado da
conversão no canal de saída analógica selecionada.
No modo de funcionamento livre (free running), a conversão começa assim que um dos
canais é habilitado. Nesse instante, os dados são gravados no registrador de dados DACC
e, 25 períodos de clock mais tarde, os dados convertidos estão disponíveis na respectiva
saída analógica escolhida. No modo por disparo externo, espera-se a primeira borda de
subida para iniciar o processo de conversão.
55
CANAIS
O conversor D/A do SAM3X tem 2 canais, o que significa que você pode obter dois sinais
diferentes, um em cada porta.
Saiba mais...
56
COMO CONFIGURAR UMA SAÍDA ANALÓGICA
Do mesmo modo que ocorre com o conversor A/D, a porta do conversor D/A pode ser configurada
com a instrução pinMode(), mas essa configuração é opcional, pois a instrução que escreve na
saída analógica não requer o uso da pinMode(). De qualquer modo, se por algum motivo você
precisar configurar a porta antes, pode utilizar a instrução pinMode() sem problemas.
Para configurar uma porta como saída por meio da instrução pinMode(), basta informar, nos
parâmetros da instrução, o número da porta e o texto OUTPUT. O exemplo, a seguir, ilustra a
configuração da porta 66 como saída.
Opcionalmente, você também pode configurar a resolução do conversor por meio da instrução
analogWriteResolution(). O parâmetro da instrução indica a resolução desejada. Se você não
configurar a resolução, o valor padrão de 8 bits será utilizado. Acompanhe um exemplo de como
configurar a resolução para 12 bits:
Importante!
57
COMO ESCREVER EM UMA SAÍDA ANALÓGICA
O Arduino utiliza uma instrução chamada analogWrite() para iniciar a conversão e disponibilizar
a tensão analógica equivalente ao valor digital informado.
A instrução analogWrite() possui dois parâmetros, sendo um para informar a porta em que o sinal
será disponibilizado e outro para informar o valor digital que você deseja converter para analógico.
Acompanhe um exemplo:
É importante lembrar que o valor informado no segundo parâmetro deve ser compatível
com a resolução configurada, ou seja, se o conversor estiver no modo padrão, de 8 bits, o
valor máximo permitido será 255.
58
EXEMPLO DE PROGRAMAÇÃO (POTENCIÔMETRO E LED COM
CONVERSOR D/A)
No exemplo anterior, controlamos o tempo de acendimento de um Led com base na tensão de uma
porta analógica, proveniente de um potenciômetro. Na medida que aumentávamos a tensão na
porta A/D, o Led piscava mais rapidamente.
Agora, vamos manter a leitura da porta A/D do mesmo modo, com o potenciômetro, mas ao invés
de variar o intervalo de acendimento, vamos controlar o brilho do Led. O controle do brilho será
feito por meio de um conversor D/A. Acompanhe o fluxograma e o programa de exemplo:
Fluxograma:
59
Programa:
A figura, a seguir, indica as ligações do potenciômetro e do Led no Arduino Due para o exemplo
que acabamos de ver.
60
DESAFIO 2
Bom trabalho!
RECAPITULANDO
63
PWM
Portanto, para utilizar o PWM no Arduino Due, é importante você conhecer as particularidades do
microcontrolador SAM3X relacionadas a essa função. É o que estudaremos, a seguir.
64
PWM NO SAM3X
O microcontrolador SAM3X, que equipa o Arduino Due, possui 15 portas que podem ser utilizadas
como PWM e 3 portas denominadas PWM Fault Input (PWMFIx), que podem funcionar como
entrada, para receber informações sobre falhas no PWM. O diagrama em blocos, a seguir, indica
as respectivas portas no microcontrolador. Note, no diagrama em blocos, que algumas portas
são identificadas como PWMH e outras como PWHL. A diferença entre os dois conjuntos está
relacionada com o modo de operação complementar, que faz com que uma porta PWMH tenha
sempre nível lógico oposto a uma PWML.
• 8 canais;
• Contadores independentes de 16 bits para cada canal;
• Saídas complementares com gerador Dead-Time de 12 bits;
• Seleção de frequência independente para cada canal;
• Duty-Cycle independente para cada canal;
• Proteção programável contra falhas;
• 8 unidades de comparação.
Para compreender melhor o funcionamento do módulo PWM do SAM3X, é preciso conhecer mais
detalhes sobre as principais características.
FUNCIONAMENTO
65
Os pinos utilizados para fazer a interface do PWM são multiplexados com linhas de
entradas e saídas periféricas – PIO (do inglês, Peripheric Inputs and Outputs). Desse
modo, para utilizar o módulo PWM, primeiro você precisa configurar o controlador
PIO, atribuindo aos pinos PWM a função periférica desejada. As linhas de I/O do PWM
não utilizadas pela aplicação podem ser utilizadas para outros fins. Todas as saídas PWM
podem ou não ser habilitadas. Se uma aplicação requer apenas quatro canais, então,
apenas quatro linhas PIO serão atribuídas às saídas PWM.
UNIDADES DE COMPARAÇÃO
TEMPORIZAÇÃO
Como o módulo PWM não é continuamente monitorado pelo clock, você precisa
habilitar o clock do PWM no Power Management Controller (PMC), antes de utilizá-lo.
No entanto, se o aplicativo não requer operações de PWM, o clock pode ser interrompido
quando não for necessário e ser reiniciado mais tarde. Neste caso, o PWM vai retomar
suas operações de onde parou. Na descrição do PWM, o Master Clock (MCK) é o clock
do barramento periférico ao qual está ligado o PWM. O gerador de clock é dividido em
três blocos, composto por um contador e dois divisores:
66
Os divisores lineares (1, 1/2, 1/3, ..., 1/255) fornecem dois clocks diferentes: clkA e clkB.
Saiba mais...
67
PORTAS PWM NO ARDUINO DUE
O Arduino Due possui 12 portas que podem funcionar como PWM, numeradas de 2 a 13. A figura,
a seguir, indica a localização das respectivas portas no Arduino Due.
Saiba mais...
Para saber mais sobre o módulo PWM do Arduino Due, consulte os seguintes
sites:
http://www.arduino.cc/en/Tutorial/PWM
http://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
http://playground.arduino.cc/Main/TimerPWMCheatsheet
68
COMO UTILIZAR O PWM
No Arduino, utilizar um PWM é muito mais simples do que nos microcontroladores PIC. Basta
utilizar a instrução analogWrite() para informar o duty-cycle. Provavelmente, você deve ter no-
tado que se trata da mesma instrução que utilizamos no desafio anterior, para escrever em uma
saída analógica. Quando a instrução analogWrite() é utilizada em uma porta do PWM, ao invés
de escrever um sinal analógico na porta indicada, a instrução iniciará a geração dos pulsos PWM,
automaticamente. O segundo parâmetro da instrução, nesse caso, indica o duty-cycle desejado.
O valor indicado para o duty-cycle deve estar entre 0 e 255, de modo que 0 resulta em um duty-cy-
cle de 0% e 255 de 100%. Significa dizer que os valores intermediários alteram, proporcionalmente,
o valor do duty-cycle. O exemplo, a seguir, aciona o PWM na porta 2 do Arduino Due com du-
ty-cycle de 50%.
analogWrite(2, 127);
Por padrão, a frequência do PWM no Arduino gira em torno de 490 Hz, na maioria das saídas.
Portanto, se a frequência estiver adequada para a sua aplicação, não é necessário fazer nenhuma
configuração. Desse modo, uma única instrução é suficiente para fazer o módulo PWM funcionar.
69
FREQUÊNCIA DO PWM NO ARDUINO
Provavelmente, você deve ter percebido que utilizar as principais funções de microcontroladores
costuma ser muito mais fácil na plataforma Arduino do que em outras plataformas de programação.
Na verdade, o compilador do Arduino oferece um ambiente de programação de alto nível, ou
seja, uma única instrução pode englobar as configurações necessárias em diversos registradores.
Em outras palavras, embora você execute apenas uma instrução para ativar certos recursos, o
programa compilado executará várias operações no microcontrolador.
Se, por um lado isso facilita na programação, por outro, pode causar alguns inconvenientes. É
o que acontece com a frequência do PWM. Não existe uma instrução nativa do Arduino para
configurar a frequência de um PWM. Há três razões para isso:
Mesmo assim, isso não significa que a frequência não possa ser alterada, mas o procedimento
envolve a configuração de registradores associados a temporizadores diversos, que podem variar
de uma placa Arduino para outra, ou mesmo entre portas de uma mesma placa.
Ocorre que o Arduino utiliza, automaticamente, certos temporizadores para realizar algumas
operações internas. Quando você altera a configuração de um temporizador, pode estar alterando,
também, o funcionamento de outras operações que envolvem o mesmo temporizador.
Portanto, caso seja necessário alterar a frequência do PWM, você precisará estudar o
datasheet do respectivo microcontrolador para descobrir o temporizador e os registradores
envolvidos na operação, e a documentação do Arduino para descobrir as implicações das
alterações nos respectivos temporizadores e registradores.
Saiba mais...
70
PROGRAMA DE EXEMPLO: CONTROLE DE ROTAÇÃO E VELOCIDADE
Se quiser mais informações sobre o funcionamento da ponte H e sobre o circuito integrado L293,
estude o documento Ponte H, disponível aqui.
Como a tensão das portas do Arduino Due funcionam com 3,3 V e o circuito integrado L293 opera
em 5 V, é necessário um circuito LLC entre o Arduino e o L293. A figura, a seguir, ilustra a conexão
recomendada:
Antes de exibir o programa, vamos entender melhor como será feito o acionamento das portas.
A tabela, a seguir, indica o acionamento das portas envolvidas e a respectiva situação do motor.
Acompanhe:
71
Agora, veja o programa do exemplo:
A figura, a seguir, ilustra as formas de onda em cada saída, de acordo com o funcionamento do
programa de exemplo.
72
Se preferir, você pode simular o funcionamento com Led conectados às portas 8, 9 e 10. Altere o
tempo da instrução delay() e estude o funcionamento no ambiente virtual 123d. O circuito virtual
está disponível no seguinte endereço: http://123d.circuits.io/circuits/833617.
Saiba mais...
73
TIMER COUNTER
74
O diagrama em blocos, a seguir, ilustra um módulo Timer Counter básico.
Você pode construir algo semelhante a partir de uma dupla de contadores 74HC161 ou por um
projeto de lógica utilizando um dispositivo programável como um CPLD ou FPGA.
75
TIMER COUNTER NO SAM3X
76
FUNCIONAMENTO
O módulo Timer Counter (TC) possui três canais idênticos. O número de módulos
implementados de TC é específico para cada dispositivo. Cada canal de TC pode ser
programado de forma independente para executar uma vasta gama de funções. Por
exemplo, medição de frequência, contagem de eventos, medição do intervalo, geração de
pulso, tempo de atraso e sinal PWM.
Cada canal possui três entradas de clock externo, cinco entradas de clock internos e
dois sinais de entrada/saída multiuso que podem ser configurados por software. Cada
canal gerencia um sinal de interrupção interno que pode ser programado para gerar
interrupções no microcontrolador. Note, no diagrama em blocos a seguir, os três canais
do TC (Timer/Counter Channel x), numerados de 0 a 2.
O bloco TC tem dois registros globais que agem sobre todos os canais TC:
• Block Control Register (TC_BCR) - Permite que os canais possam ser iniciados
simultaneamente por uma mesma instrução;
• Block Mode Register (TC_BMR) - Define as entradas de clock externo para cada
canal, permitindo que eles sejam encadeados.
77
CONTADORES
Cada canal do Timer Counter bits está organizado em torno de um contador de 32 bits. O
valor do contador é incrementado a cada borda de subida positiva do clock selecionado.
Quando o contador atingir o valor 232-1 e passar pelo zero, ocorrerá um overflow e o bit
COVFS no TC Status Register (TC_SR) será setado. O valor atual do contador é acessível
em tempo real, por meio da leitura do TC Counter Value Register (TC_CV). O contador
pode ser resetado por um sinal de trigger, que será zerado na próxima transição válida
do clock selecionado.
SINAIS DE CLOCK
No nível de bloco do TC, os sinais de clock de entrada de cada canal podem ser conectados
às entradas externas TCLK0, TCLK1 ou TCLK2, ou serem ligados aos sinais internos de
I/O TIOA0, TIOA1 ou TIOA2 para encadear a programação do TC Block Mode Register
(TC_BMR). Cada canal pode selecionar de forma independente a fonte de clock, interno
ou externo, do seguinte modo:
Esta seleção é feita pelos bits do TCCLKS no TC Channel Mode Register (TC_CMR).
O clock selecionado pode ser invertido com o bit CLKI no TC_CMR. Isso permite contar
as bordas de descida do clock. A função burst permite que o clock possa ser validado
quando um sinal externo vai a nível alto. O parâmetro BURST no TC_CMR define este
sinal e pode assumir parâmetros como none, XC0, XC1, XC2.
Importante!
78
Saiba mais...
Agora que você sabe que é possível monitorar bordas de subida e descida por eventos internos ou
externos por meio do Timer Counter, siga em frente para estudar como aplicar os conceitos em
nosso desafio.
79
LER FREQUÊNCIAS E DUTY-CYCLE COM ARDUINO
Desse modo, o valor total da contagem T corresponde ao período do sinal. Para calcular a frequência
deve-se fazer:
f = 1/T
A relação entre o primeiro valor gravado e o valor total corresponde ao duty-cycle. Por exemplo, se
a primeira contagem é tON = 10 e a contagem total é T = 100, temos:
80
CAPTURA DO VALOR DE FREQUÊNCIA
Utilizando uma placa do Arduino, a tarefa de capturar valores de frequência é mais simples do que
na maioria das plataformas nativas dos microcontroladores. Podemos citar duas formas para se
medir frequências utilizando o Arduino.
Trata-se de uma função presente nas bibliotecas padrão do Arduino. Pode ser
utilizada em qualquer pino, porém, identifica frequências de, no máximo, 50 kHz e
com precisão inferior à da FreqCounter.
Por se tratar de uma função nativa das bibliotecas padrão do Arduino e por ser a maneira mais
indicada para a maioria das aplicações de captura de frequência, iremos nos ater ao estudo da
função pulseIn().
81
FUNÇÃO PULSEIN()
Existem duas opções para utilizar a função pulseIn(). A seguir, temos a sintaxe da instrução para
cada opção e os respectivos parâmetros:
Parâmetros:
Exemplo de programa:
É importante lembrar que a duração do pulso obtida pela instrução pulseIn() corresponde ao
período tON do sinal, conforme indicado na figura.
82
Saiba mais...
83
CÁLCULO DA FREQUÊNCIA
Agora que conhecemos como a duração de um pulso pode ser obtida pela função pulseIn(), só
precisamos do duty-cycle para calcular a frequência.
Para você realizar leituras corretas de frequência, o ideal é que o sinal de entrada tenha um duty-
cycle de 50 %. Desse modo, o valor correspondente a tON medido pela função pode ser multiplicado
por 2 para obtenção do valor do período T. Considerando que a duração de um pulso obtida pela
função pulseIn() seja 1.000.000 (o que equivale a 1 segundo), a frequência, em Hz, da situação
apresentada pode ser calculada por:
É importante destacar que sempre que se necessita realizar leituras deste tipo, deve-se
conhecer muito bem o sinal esperado na entrada. Muitas vezes há uma instabilidade na
frequência que pode gerar erros de medição. Para driblar esse problema, pode-se calcular
uma média de uma determinada quantidade de amostras.
84
CAPTURA DO VALOR DO DUTY-CYCLE DE UM SINAL PWM
No exemplo, a seguir, note que o modo de medir a duração de um pulso é idêntico ao que fizemos
no exemplo anterior. A diferença, agora, está no cálculo que aparece na última linha do programa.
Perceba que o cálculo é feito com base no período, obtido da frequência, e da duração do pulso,
obtida pela instrução pulseIn(). Para o caso do exemplo, o sinal medido possui frequência de 10
Hz, ou seja, um período de 100.000 µs.
Como alternativa à instrução pulseIn(), podemos obter o duty-cycle por meio de interrupções. É o
que estudaremos, a seguir.
85
INTERRUPÇÕES
Nesse sentido, o conceito de interrupção é gerar uma lembrança, um aviso ou uma sinalização
sobre algo que precisa ser executado ou que precisa de sua atenção.
Por hardware: quando ocorrem por evento externo, por exemplo, uma alteração
do valor binário em uma porta digital;
A aplicação de interrupções envolve monitorar e interagir com diversos blocos, por exemplo:
• Na identificação de mudanças de estado de uma porta (necessário em encoders rotativos ou na
identificação de botões acionados);
• No uso do Watchdog timer (caso uma função não seja executada em certo tempo, acione a
interrupção);
• Nas interrupções do timer – usando para comparar e/ou nos eventos de overflowing do timer;
• Na transferência de dados da SPI;
• Na transferência de dados da I2C;
• Na transferência de dados da USART;
• No Conversor A/D (modo analógico para digital);
• Leitura de conteúdo da EEPROM;
• Leitura de memória Flash.
Saiba mais...
86
Na plataforma Arduino temos funções muito interessantes para lidar com interrupções.
INSTRUÇÃO ATTACHINTERRUPT()
Importante!
87
Mas é importante você saber que nem todas as funções e procedimentos funcionam
adequadamente como ISR. A função delay(), por exemplo, não funcionará e o valor
retornado pela função millis() não será incrementado. Dados seriais recebidos na
execução das funções mencionadas serão perdidos.
Importante!
Além disso, você deve declarar como float todas as variáveis ??que modificar dentro da
função de interrupção, certificando-se de que as variáveis ??usadas em uma ISR foram
atualizadas corretamente. Normalmente, essas variáveis ??globais são usadas ??para
transmitir dados entre uma ISR e o programa principal. Uma ISR deve ser a mais curta
e rápida possível. Se o seu programa utiliza várias ISR, apenas uma pode ser executada
naquele momento, e as outras interrupções serão ignoradas (desligadas) até a atual ser
concluída.
No exemplo, a seguir, note que, mesmo com o procedimento void loop() inativo, você
pode controlar o Led na saída 13 utilizando um botão na entrada digital 2.
Para validar o funcionamento, conecte um botão entre a entrada digital 2 e terra (GND).
O pull-up interno (ativado na programação) mantém a entrada em nível lógico alto
(high), inicialmente. Quando conectado à terra, a entrada 2 passa para nível lógico baixo
(low) e a mudança no estado lógico é detectada pela função change da interrupção, o que
faz com que a sub-rotina mudapino() da interrupção (ISR) seja executada. Desse modo,
quando a entrada 2 vai a GND, o Led no pino 13 acende.
88
INSTRUÇÃO DETACHINTERRUPT()
Saiba mais...
89
INSTRUÇÕES INTERRUPTS() E NOINTERRUPTS()
As instruções interrupts() e noInterrupts() ativam e desativam, respectivamente, as
interrupções configuradas pela função attachInterrupt(). A vantagem de utilizar
interrupts() e noInterrupts() é que você pode desativar temporariamente as interrupções
sem a necessidade de reconfigurá-las, depois. Por exemplo, imagine que você esteja
utilizando três interrupções, e que deseja desativá-las para executar uma determinada
tarefa que não pode ser interrompida em nenhuma hipótese. Sem interrupts() e
noInterrupts(), seria necessário desabilitar uma de cada vez por meio detachInterrupt()
para, depois, configurá-las individualmente por attachInterrupt(). Nesse caso, você pode
executar apenas uma vez a instrução noInterrupts(). Isso interromperá todas as instruções
configuradas, de uma só vez. Quando quiser reativá-las, basta executar interrupts().
Pronto! Todas as interrupções que você havia configurado estarão funcionando
novamente.
Ambas as instruções não possuem parâmetro.
Acompanhe um exemplo:
90
DESAFIO 3
Bom trabalho!
RECAPITULANDO
Neste desafio, você estudará o funcionamento e a programação da comunicação USB nas placas
Arduino:
93
COMUNICAÇÃO SERIAL
Antes de falar sobre as características da comunicação USB (Universal Serial Bus), é importante
resgatar alguns conceitos sobre a comunicação serial, pois a USB utiliza os mesmos conceitos para
enviar e receber informações.
Como você sabe, na comunicação serial as informações são enviadas em uma única linha, um bit
de cada vez. Uma parte importante nesse tipo de comunicação é a taxa de transferência (baud
rate). Por exemplo, se você possui uma máquina com taxa de transferência de 220 bits por segundo,
será possível enviar vinte números binários de 11 bits em um segundo.
Na transmissão de dados seriais, o protocolo mais utilizado é o RS-232. Neste sistema, uma borda de
descida inicial no primeiro bit ativa um registrador de deslocamento e os demais são identificados
como dados, usando o código ASCII na representação de letras do alfabeto. Na sequência, temos
um bit de paridade e dois de parada, totalizando 11 pulsos de clock para mover uma palavra binária.
Se uma máquina operar com uma taxa de transferência de 220 bauds (bit/s), significa que podemos
enviar ou receber 20 palavras por segundo. Mas na prática, a velocidade costuma ser bem superior.
No caso do Arduino, podemos chegar facilmente a 9600 bit/s ou mais.
dados seriais
LSB MSB
clock 1 2 3 4 5 6 7 8 9 10 11
Transmissão serial assíncrona
Os bits responsáveis por iniciar e parar o registrador são chamados de bits de enquadramento,
identificados como bit de início e bit de parada. A presença de bits de enquadramento indica que
a comunicação apresentada é assíncrona.
No modo síncrono, além de não haver bits de enquadramento, os dados chegam um após o outro
com velocidade constante.
94
O protocolo RS-485 é amplamente utilizado em aplicações industriais onde são necessárias altas
velocidades e para distâncias mais longas. Já o RS-232 é mais utilizado em instrumentos de medição
e equipamentos para automação comercial, por exemplo, terminais de venda. O quadro, a seguir,
indica as principais diferenças entre os protocolos RS-485 e RS-232.
Sensibilidade +3 V +200 mV
95
PORTA USB
USB é uma sigla inglesa que, em português, significa Barramento Serial Universal. Trata-se de um
padrão de comunicação serial de alta velocidade, que surgiu para substituir as tradicionais portas
RS-232. As principais vantagens da comunicação USB em relação às antecessoras estão na sua alta
velocidade, que varia entre 1,5 MB/s e 5 GB/s (USB 3.0) e no padrão dos conectores, que além de
mais compactos, disponibilizam duas vias para alimentação elétrica de pequenos dispositivos, com
tensão de 5 V e corrente de até 500 mA.
Os padrões de portas USB encontrados no mercado são: A, B, mini USB e micro USB, todos
disponíveis no formato macho ou fêmea. A figura, a seguir, ilustra dois conectores USB, sendo um
do tipo micro USB e outro do tipo A.
Com até seis condutores possíveis (contando com a malha de blindagem), o sinal serial transita
entre os contatos 2 e 3, alternando a polaridade da corrente que por ali circula. Em operação normal
e conectado a um computador, cada via de dados oferece uma queda de tensão da ordem de 400
mV e corrente circulante de 17 mA, com boa imunidade a ruídos devido a forma de montagem do
cabo. A figura, a seguir, ilustra os contatos (numerados) de dois tipos de conectores. Note que a
quantidade de contatos varia de um tipo para o outro.
96
USB NO SAM3X
Embora o Arduino Due possua duas portas USB, o microcontrolador SAM3X possui apenas uma,
pois como você sabe, a porta de programação está ligada em outro microcontrolador, e não faz
parte do SAM3X.
A porta USB no chip do microcontrolador SAM3X é do tipo USB 2.0 Device/Mini Host. O diagrama
em blocos, a seguir, indica a configuração interna da porta no SAM3X:
• 480 Mbps;
• 4 kbyte FIFO;
• Mais de 10 Endpoints bidirecionais;
• Tensão entre 3,3 e 3,6 V;
• Capacidade de wake-up em poucos microssegundos;
• Necessita de um clock externo de 12 MHz (conexão por Xin);
• DMA dedicado.
Para tirar proveito dos softwares instalados para PC que utilizam protocolo RS-232 e que se
comunicam com a USB, a porta do SAM3X utiliza drivers de comunicação de classe (CDC). A classe
CDC é implementada em todas as versões do Windows a partir do Windows 98SE. O documento
CDC, disponível em www.usb.org, descreve a forma correta para implementar dispositivos USB,
por exemplo, modems ISDN e portas seriais virtuais (COM).
Duas características importantes, que todo dispositivo USB precisa ter, são o vendor ID (VID)
e o product ID (PID). O VID e o PID são informações utilizadas pelo sistema operacional para
identificar o dispositivo USB e instalar o driver correto. O microcontrolador SAM3X já vem de
fábrica com essas identificações. O VID da Atmel, que é a fabricante do SAM3X é 0x03EB, e o PID
do mesmo microcontrolador é 0x6124. O sistema operacional Windows armazena as identificações
em arquivos com extensão .inf. Isso faz com que a maioria dos dispositivos USB seja facilmente
detectada pelo sistema operacional.
97
Por fim, você precisa saber que o protocolo USB do SAM3X é do tipo master/slave. Trata-se de
um host que, ao começar a receber solicitações, enumera os dispositivos por meio do controle de
endpoint. O dispositivo trata as solicitações padrão conforme definido na especificação da porta
USB.
Saiba mais...
98
PORTAS USB NO ARDUINO DUE
Para utilizar as portas USB do Arduino Due, ele deverá ser programado no ambiente do software
Arduino que você já instalou no desafio 1. A figura, a seguir, indica a localização das portas USB
no Arduino Due.
Como já estudamos no desafio 1, uma das portas é nativa do microcontrolador SAM3X, e a outra,
denominada porta de programação, está conectada ao referido microcontrolador por meio de
um microcontrolador intermediário, que faz a interface entre a porta USB e o microcontrolador
SAM3X.
O uso da porta USB nativa permite que você utilize o Arduino Due como um dispositivo host ou
periférico. A diferença entre os dois modos é que um dispositivo host gerencia a conexão de outros
dispositivos, enquanto que o dispositivo periférico apenas envia as informações requisitadas pelo
host. Por exemplo, considerando um computador e um mouse conectados entre si, o computador
atua como host enquanto que o mouse atua como periférico.
É importante você saber que para utilizar a porta USB nativa a velocidade de comunicação
precisa ser diferente de 1200 bps. Isso acontece porque qualquer comunicação nessa
velocidade desencadeia um processo de soft erase, que reinicia o microcontrolador e só
é útil quando desejamos programar a memória flash.
A porta USB nativa também pode ser utilizada como uma porta serial virtual. Isso é possível por
meio do objeto SerialUSB, disponível na linguagem de programação Arduino.
99
APLICAÇÃO USB HOST NO ARDUINO DUE
A biblioteca USBHost faz com que uma placa Arduino Due seja reconhecida como um host USB,
permitindo que ela se comunique com periféricos como mouses e teclados USB. A USBHost não
suporta dispositivos que estão conectados por meio de hubs USB, por exemplo, alguns teclados
com um hub interno.
É necessário você saber que a biblioteca USBHost e as funções associadas a ela são
experimentais, ou seja, a API (Application Program Interface) está sujeita a alterações, já
que a biblioteca ainda está em desenvolvimento. A biblioteca USBHost é distribuída sob
a Licença Pública Geral versão 2 (GPL2), de acordo com a publicação da Free Software
Foundation. Qualquer programa que utilize a biblioteca USBHost precisa ser do tipo
open source.
Saiba mais...
100
FUNÇÃO USBHOST
A função USBHost é uma categoria de base para todas as chamadas que dependem de comunicação
de host USB. Quando chamada, ela inicializa o controlador USB.
O exemplo completo pode ser visto no link disponível em seu ambiente virtual de aprendizagem.
No programa de exemplo, além de utilizar uma biblioteca, note que utilizamos a função serial.
print(). Estudaremos o uso de bibliotecas e de funções serial() a seguir.
Saiba mais...
101
BIBLIOTECAS
O exemplo, a seguir, indica a localização da biblioteca Waveforms.h, na pasta libraries. Note que a
pasta da biblioteca contém muitas outras pastas. Os arquivos de cada pasta são importados pelo
software do Arduino.
102
Para adicionar uma biblioteca ao seu projeto, acesse o menu Sketch e clique em Include Library.
O exemplo, a seguir, indica como adicionar a biblioteca Waveforms ao seu projeto. No entanto,
é importante lembrar que a opção só estará disponível se o arquivo da biblioteca que você deseja
adicionar estiver na pasta libraries. Para o caso do exemplo, o arquivo Waveforms.h precisa estar
na referida pasta.
Saiba mais...
103
FERRAMENTA MONITOR SERIAL
Antes de falar sobre a classe de funções serial(), é interessante você conhecer uma ferramenta do
software Arduino que será muito útil para fazer testes de comunicação serial. Estamos falando
sobre a monitor serial.
A ferramenta monitor serial permite enviar informações para a placa Arduino, via porta serial,
e ler os dados recebidos. Esse recurso funciona de modo semelhante a outros aplicativos de
comunicação, por exemplo, Hyper Terminal ou Putty.
A grande vantagem de utilizar esse tipo de ferramenta é que você pode simular e monitorar a
comunicação serial de um Arduino sem precisar conectá-lo à outra placa. Por exemplo, se a placa
Arduino enviar uma informação pela porta serial, você visualizará todos os dados recebidos na
tela do monitor serial. Por outro lado, você também poderá digitar informações que deseja enviar
para a placa por meio da mesma interface.
Para utilizar a ferramenta, é importante lembrar que o seu programa precisa estar aberto no
software Arduino, e sem erros de compilação. A placa do Arduino também precisa estar conectada
ao computador.
O procedimento para utilizar a monitor serial é bastante simples. Basta clicar na opção Monitor
serial, disponível no menu de ferramentas, e escolher a velocidade da comunicação, disponível no
rodapé da tela do monitor serial.
104
Passo 2: Configurando a velocidade da comunicação
105
FUNÇÃO SERIAL()
A função serial() é utilizada para a comunicação serial em placas Arduino. A função serial(), na
verdade, engloba diversas outras funções relacionadas com a comunicação serial. Significa dizer
que a função serial(), sozinha, não faz nada. Ela funciona como uma espécie de pacote que contém
várias outras funções, e para executar as funções que estão no pacote, é necessário informar o
nome do pacote seguido de um ponto e o nome da função que você quer executar. Por exemplo,
imagine que as funções A() e B() sejam parte do pacote serial(). A sintaxe para executar A() seria
serial.A(), e para executar B(), serial.B().
As principais funções contidas em serial() são: begin(), print(), println() e end(). Vamos estudar
cada uma delas, a seguir.
Mas antes de falar sobre as funções contidas em serial(), você precisa saber que esse pacote de
funções não funciona na porta USB Nativa do Arduino Due. Isso ocorre porque as funções
desse pacote são desenvolvidas para o modo de comunicação serial padrão, que é o meio de
comunicação predominante nas placas Arduino, já que todas elas possuem, pelo menos, uma
porta serial (também conhecida como UART ou USART).
Talvez, nesse momento, você possa estar se perguntando? Então eu não posso utilizar as funções
serial() para comunicação USB? Na verdade, pode. Na maior parte das placas Arduino, a porta
USB não é nativa, e é conectada ao microcontrolador por meio das porta serial padrão. Para o caso
da placa Arduino Due, é o que acontece com a porta USB de programação.
Desse modo, as funções serial() podem ser utilizadas para a comunicação USB na maioria das
placas Arduino, e para o caso da Arduino Due, funciona com a USB de programação, que você
pode utilizar sem nenhum problema em nosso desafio.
Saiba mais...
106
FUNÇÃO SERIAL.BEGIN()
A função Serial.begin() define o valor da taxa de transmissão de dados seriais, em bits
por segundo (baud). A função possui dois parâmetros, sendo que o segundo é opcional.
No primeiro parâmetro você deve informar a taxa de transmissão. Os valores padronizados,
que normalmente são utilizados para se comunicar com um computador, são: 300, 600,
1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 ou 115200. No entanto, você
pode especificar outra taxa, caso o dispositivo em que você esteja se conectando funcione
com valores não padronizados.
O segundo parâmetro, que é opcional, configura os dados, a paridade e os bits de parada.
Caso você não informe o segundo parâmetro, os valores padrão serão utilizados: 8 bits
de dados, sem paridade, um bit de parada.
Saiba mais...
FUNÇÃO SERIAL.PRINT()
A função Serial.print() envia dados para a porta serial no modo de um texto legível
e com caracteres da tabela ASCII. Os números são impressos utilizando um caractere
ASCII para cada dígito. Números do tipo float são igualmente impressos como dígitos
ASCII, em modo default com duas casas decimais. Bytes são enviados como um único
caractere.
A função possui dois parâmetros, sendo que o segundo é opcional. O primeiro parâmetro
se refere ao texto que desejamos transmitir. O segundo, especifica a base de conversão
para o valor informado no primeiro parâmetro, quando esse se tratar de um número.
Os parâmetros permitidos para o segundo parâmetro são: BIN (binário ou base 2),
OCT (octal ou base 8), DEC (decimal ou base 10), HEX (hexadecimal ou base 16). Para
números de ponto flutuante, esse argumento determina o número de casas decimais.
Parâmetros:
107
Importante!
Dica...
Saiba mais...
108
FUNÇÃO SERIAL.PRINTLN()
Esta função é similar à Serial.print(), porém, a informação transmitida é seguida por um
caractere de retorno (ASCII 13, ou ‘\ r’) e um caractere de nova linha (ASCII 10, ou ‘\ n’).
A função Serial.println() pode ser utilizada em conjunto com a Serial.print() para ajudar
na formatação de tabelas.
A figura, a seguir, ilustra a tabela montada. Note que a tabela aparece na tela da ferramenta
Serial Monitor com a mesma formatação indicada no programa.
109
Dica...
Caso você note alguma perda, inserção ou alteração entre o que foi
enviado e o que foi exibido na ferramenta Monitor Serial, verifique
se a velocidade de comunicação está correta.
Saiba mais...
110
FUNÇÃO SERIAL.END()
Saiba mais...
111
PROGRAMA DE EXEMPLO
Neste exemplo, vamos utilizar as funções que acabamos de estudar para transmitir informações
lidas de um conversor A/D. Note que existem várias maneiras de formatar a informação.
Acompanhe:
A figura, a seguir, indica como as informações foram recebidas por meio do Monitor Serial.
112
Saiba mais...
113
DESAFIO 4
Bom trabalho!
RECAPITULANDO
• Desafio 4 – Elaborar um programa para enviar os resultados dos testes para um computador,
via USB.
114
REFERÊNCIAS
BIBLIOGRÁFICAS
115
REFERÊNCIAS BIBLIOGRÁFICAS
BANZI, M., SHILOH, M. Make – Getting Started with Arduino. 3. ed. EUA: Ed. Makermedia,
2015.
BIGNELL, J.W.; DONOVAN, R. Eletrônica Digital. 5. ed. São Paulo: Cengage Learning, 2010.
CALDEIRA, U. G. Notas de aula de Eletrônica Analógica – SENAI CFP 1.18. Santo André - SP,
2015.
116
TEXAS. Datasheet do L293D
Disponível em: < http://www.ti.com/lit/ds/symlink/l293.pdf >.
Rev. Nov 2004. Acesso em 13 abr. 2015.
PREMEUAX, E, EVANS, B. Arduino - Projects to save the world. EUA: Ed. Apress, 2011.
WARREN, J.D., ADAMS, J., MOLLE, H. Arduino Robotics. EUA: Ed. Apress, 2011.
117