Você está na página 1de 117

ATUALIZAÇÃO TECNOLÓGICA EM

ELETRÔNICA

UNIDADE

3
SITUAÇÃO DE
APRENDIZAGEM
APRESENTAÇÃO

IGraças à sua ajuda, a máquina de lavar louças da The Clean Kitchen


S/A foi um sucesso! As encomendas não pararam de chegar, e a dire-
toria da empresa já pensa em algumas soluções para melhorar a pro-
dutividade e atender à crescente demanda na produção. Nesse sentido,
uma das soluções será a criação de uma giga de testes. Trata-se de um
equipamento eletrônico dedicado para realizar, automaticamente, testes
de funcionamento na máquina de lavar louças. A giga será desenvolvida
na plataforma Arduino Due.

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.

Desafio 1 – Elaborar um programa para verificar o funcionamento do controle de


nível do reservatório

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.

Desafio 2 – Elaborar um programa para simular o funcionamento do controle de


temperatura da água

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.

Desafio 3 – Elaborar um programa para verificar o funcionamento do controle


de velocidade da bomba de água

O desafio 3 consiste em elaborar outra parte do programa da giga de testes. Uma


vez que a bomba é controlada por um circuito PWM, você deverá desenvolver
um programa capaz de realizar a leitura do sinal PWM gerado pela placa da la-
va-louças para verificar se o Duty Cycle está de acordo com o programado.

Desafio 4 – Elaborar um programa para enviar os resultados dos testes para um


computador, via USB

O desafio 4 consiste em elaborar outra parte do programa da giga de testes. Nesta


etapa você deverá programar a giga de testes para enviar dados por meio da porta
USB do Arduino Due, informando se a placa principal foi aprovada ou reprovada
nos testes.

Desafio 5 – Etapa presencial

O desafio 5 consiste em unificar todos os programas desenvolvidos nos desafios


anteriores e verificar o funcionamento completo da giga de testes em um Arduino
Due.

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:

• Instalar e configurar o ambiente de programação Arduino;


• Elaborar um programa para efetuar a leitura e a escrita em portas digitais em um Arduino;
• Compilar e gravar um programa em um ambiente Arduino.

Preparado? Então siga em frente!

6
PLATAFORMA ARDUINO, O QUE É?

Arduino é uma plataforma de desenvolvimento de hardware e software do tipo open hardware.


Com essa filosofia, por meio da internet, você consegue trocar experiências e informações com
pessoas de todo o mundo, encurtando prazos de qualquer tarefa e gerando uma biblioteca muita
rica em informações.

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.

Veja abaixo exemplos de Arduinos.

Arduino Esplora
Arduino Robot

Arduino Due Arduino Fio

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!

Existem réplicas do Arduino (normalmente da China), fabricadas a partir


da documentação dos originais italianos, e que chegam a custar a metade do
preço nos websites de leilão online. Mas algumas são de qualidade duvidosa,
o que pode ser facilmente constatado por uma inspeção visual simples.

Concluindo, as características de hardware livre permitem a você utilizar o Arduino em qualquer


tipo de aplicação que envolva um microcontrolador, com acesso gratuito a toda documentação e
software, incluindo programas de exemplo para diversas aplicações.

Saiba mais...

Para conhecer os modelos disponíveis e comparar as características, acesse


http://www.arduino.cc/en/Products.Compare

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.

O microcontrolador SAM3X opera a uma velocidade máxima de 84 MHz e permite o


uso de até 512 kbytes de memória Flash e até 100 kbytes de memória SRAM. Ele é rico
em periféricos. Veja alguns exemplos:

• Host USB de alta velocidade;


• Device port para comunicação em sistemas embarcados;
• Ethernet MAC e 2 redes CANs;
• High Speed MCI para SDIO / SD / MMC;
• Interface de barramento externo NAND Flash Controller (NFC);
• 5 UARTs, 2 TWIs, 4 SPIs;
• 1 PWM e 3 temporizadores de uso geral de 32 bits;
• 1 RTC e RTT de baixo consumo;
• Registradores de backup de uso geral de 256 bits;
• ADC e DAC de 12 bits.

Saiba mais...

Para saber mais sobre a família Cortex® M3, acesse o link:


http://pt.wikipedia.org/wiki/ARM_Cortex-M

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.

Para que tenha uma ideia da superioridade de um microcontrolador Cortex de 32 bits


sobre os de 8 bits, acompanhe as comparações entre o SAM3X e o PIC18F452, que uti-
lizamos na unidade anterior:

Visualização das estruturas internas (adaptado do datasheet de ambos)

Características de operação (adaptado do datasheet do respectivo microcontrolador).

11
RECURSOS DA PLACA

Para usufruir das principais características do microcontrolador, o Arduino Due possui


vários recursos que possibilitam a integração do microcontrolador com dispositivos ex-
ternos. Conheça os principais:

• 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...

Para conhecer mais características do Arduino Due, consulte:


http://www.arduino.cc/en/Main/ArduinoBoardDue

GRAVAÇÃO DA MEMÓRIA DE PROGRAMA

O microcontrolador SAM3X é diferente dos outros microntroladores (em geral AVR)


encontrados em outras placas Arduino, pois sua memória de programa (memória flash)
precisa ser apagada antes de ser reprogramada. Qualquer upload para o chip é gerenciado
pela ROM no SAM3X, e será executado somente quando a memória flash do chip estiver
vazia. Qualquer uma das portas USB pode ser usada para programar a placa, embora se
recomende usar a porta de programação (Programming port), devido à forma como isto
é feito. Conheça as principais características de cada porta clicando nos boxes abaixo:

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.

Porta USB de programação


Programming port (porta de programação): A porta de programação utiliza um
microcontrolador 16U2 para fazer a interface USB-serial entre a porta de programação
e o SAM3X. Além de estar conectado à UART do SAM3X (RX0 e TX0), o 16U2
também possui interligação com os terminais reset e erase do SAM3X. A porta
de programação se comunica com taxa de transmissão de 1200 bps e desencadeia
um processo de hard erase no chip SAM3X, ativando os terminais erase e reset no
SAM3X, antes de se comunicar com o UART. Esse método é mais confiável do que o
utilizado pela porta nativa, já que pode ser concluído com sucesso mesmo quando o
SAM3X apresentar algum tipo de travamento durante a gravação.

Normalmente, os microcontroladores dependem de softwares específicos para fazer a


gravação da memória de programa. Significa dizer que se você elaborar a sua própria
placa com um SAM3X vai precisar de um software para transferir o seu programa para
o microcontrolador. Ao utilizar um Arduino você não precisará se preocupar com isso,
pois o próprio software do Arduino fará a gravação.

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.

RX e TX: Os LED RX e TX estão conectados nas portas de comunicação serial


do microcontrolador 16U2, ou seja, esses LED acendem quando há envio ou
recebimento de dados pela USB de programação. Os LED RX e TX acendem na cor
amarela.
L: O LED L está conectado na porta 13 do microcontrolador, e acende quando a
respectiva porta está em nível lógico um. Este LED acende na cor amarela.
ON: O LED ON está conectado na alimentação elétrica da placa. Quando aceso,
indica que o Arduino Due está energizado. Este LED acende na cor verde.

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)

Onde: IF(LED)<Isaídamáx e VF(LED)<Vsaída

Vamos considerar um LED com os seguintes parâmetros: VF(LED) = 2 V e IF(LED) = 10


mA. Trabalhando com valores, teremos:

R= ((3,3-2))/0,01=130 Ω Arredondando para um valor comercial mais próximo: 150 Ω

Importante!

A corrente do LED pode variar conforme o modelo e o fabricante,


portanto, não se esqueça de consultar o datasheet para saber a cor-
rente exata.

Outra opção é utilizar um transistor de sinal para atuar como chave, por exemplo, BC547
ou similar.

Saiba mais...

As portas I/O do Arduino Due podem se comunicar com uma série de


dispositivos. Maiores detalhes e informações podem ser encontradas
no link em seu ambiente virtual de aprendizagem:
Item 4 - Características do Arduino Due

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.

Outra particularidade interessante é a possibilidade de agregar novas funcionalidades à


placa por meio de shields. O Arduino Due é compatível com todos os shields que tra-
balham com tensões de 3,3 V e com a pinagem do Arduino 1.0.

Saiba mais...

Para saber mais sobre Shields, leia o artigo disponibilizado aqui


(o artigo está no idioma inglês). Link:
https://learn.sparkfun.com/tutorials/arduino-shields

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...

Para conhecer a evolução da linguagem C até os dias de hoje, acesse o artigo.


A evolução da linguagem C

17
INSTALAÇÃO DO SOFTWARE

Antes de iniciar a programação de um Arduino, precisamos baixar e instalar o software. O Ar-


duino disponibiza em seu site um software comum a todos os dispositivos da família. O software
oferece um ambiente de programação, para você digitar e compilar o seu programa, e um recurso
de gravação, de modo que você possa transferir o programa compilado para o microcontrolador.
Portanto, tudo o que você precisa para utilizar um Arduino estará disponível neste software.

A seguir, preparamos um tutorial passo-a-passo para auxiliá-lo na instalação do software. Acom-


panhe:

Instalando a versão IDE para Windows:

Faça o download do software a partir deste endereço: http://www.arduino.cc/en/Main/Software.


Assim que terminar o download, localize o arquivo na pasta de destino e dê um duplo clique sobre
ele para começar a instalação.

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;

O programa mostrará o progresso da instalação enquanto copia os arquivos.

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.

Configurando os drivers para Windows:

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:

digitalWrite(13,HIGH); //escreve nível lógico um na porta 13

digitalWrite(14,LOW); //escreve nível lógico zero na porta 14

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:

pinMode(2, INPUT); //configura a porta 2 como entrada

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:

X = digitalRead(4); //le o valor da porta 4 e carrega o resultado na variável x

If(digitalRead(2)== HIGH){ //verifica se a porta 2 está em nível lógico um }

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().

O procedimento setup() é o primeiro a ser executado. Depois de processar todas as instruções


contidas no setup(), a execução do programa passa para o procedimento loop(). Depois de
processar a última instrução do procedimento loop(), o programa retornará para o início do loop()
e executará todas as instruções novamente, indefinidamente. Daí o nome 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.

Ao iniciar um novo programa, os procedimentos setup() e loop() já estarão disponíveis no ambiente


de programação, como você pode constatar na captura de tela, a seguir:

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
*/

// declaração de uma constante global (valida em qualquer parte do programa)


const int led = 13; //constant de nome led, do tipo inteiro.

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

Agora que você já conhece o ambiente de programação e algumas instruções, podemos


compilar e gravar o programa na memória do Arduino. Mas antes, é preciso verificar se
o ambiente está preparado para a placa que desejamos utilizar. Esta informação aparece
na parte inferior direita da tela principal do ambiente. Note, no exemplo a seguir, que o
ambiente está configurado para o Arduino Uno, conectado na porta COM 1 do com-
putador.

Portanto, se a placa ou a porta de comunicação indicada for diferente da que estamos


utilizando, precisamos configurar o ambiente.
Como exemplo, acompanhe o procedimento passo-a-passo de como configurar o
ambiente para utilizar um Arduino Due, via porta USB.
Na tela principal do ambiente de programação, selecione Ferramentas→Placa e procure
por Arduino Due. Se esta opção estiver disponível na lista, basta selecioná-la. No nosso
caso, porém, note que o Arduino Due não aparece na lista. Isso acontece apenas no

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.

Para instalar os componentes do Arduino Due, selecione Boards Manager.

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.

Você precisa estar conectado à internet para fazer a instalação.


Aguarde a instalação. Esse processo pode demorar alguns minutos, dependendo da
velocidade da conexão com a internet.

Quando a instalação estiver concluída, aparecerá a informação installed no bloco


Arduino SAM Boards (32-bits ARM Cortex-M3) by Arduino. Para fechar a janela, clique
em X, no canto superior direito da tela.

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.

A compilação demora alguns segundos, dependendo do tamanho do seu programa e da


velocidade do seu computador. Você pode acompanhar o andamento da compilação pela
barra de progresso.

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
==========================================================
*/

// Criação de constantes globais para entradas:


const int alav_1 = 8;
const int alav_2 = 10;
const inst botao_m = 12;

// Criação de constantes globais para saídas:


const int milha = 9;
const int farol = 11;
const inst lant = 13;

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
}

if (digitalRead(alav_2)==HIGH) //nao, alav_2 acionada?


{
digitalWrite(lant,HIGH); //sim, liga lant e farol
digitalWrite(farol,HIGH);
}

if (digitalRead(botao_m)==HIGH) && (digitalRead(alav_2)==HIGH)) //nao, botao_m acionado?


{
digitalWrite(lant,HIGH); //sim, acende tudo se alav_2 //acionada
digitalWrite(farol,HIGH);
digitalWrite(milha,HIGH);
}
else
{
if (digitalRead(botao_m)==HIGH && (digitalRead(alav_1)== HIGH))
{
digitalWrite(lant,HIGH); //sim, acende boy se alav_2 //acionada
digitalWrite(milha,HIGH);
}
}
digitalWrite(lant,LOW); //apaga tudo
digitalWrite(farol,LOW);
digitalWrite(milha,LOW);
}

Saiba mais...

Você pode ver o código funcionando em um simulador, gratuitamente neste


endereço:
https://123d.circuits.io/circuits/811045

E, para saber mais sobre as instruções de laço, consulte os seguintes sites:


http://www.arduino.cc/en/Tutorial/WhileLoop

L
http://www.arduino.cc/en/Reference/While

34
DESAFIO 1

Agora que você conhece os principais aspectos necessários para iniciar


um projeto com um Arduino Due e fazer a leitura e a escrita em portas
digitais, chegou o momento de retomar o desafio 1.

Retorne à página principal do ambiente virtual de aprendizagem e


participe do desafio 1. Lembre-se que a elaboração da tarefa proposta
deverá ser realizada em grupo. Você terá à disposição, um ambiente
de grupo, para debater com os colegas e um espaço destinado para a
entrega da tarefa.

Bom trabalho!

RECAPITULANDO

Neste desafio você estudou:

• A Arquitetura geral do Arduino Due;

• Como fazer a instalação do software Arduino;

• Como efetuar a leitura e a escrita em portas digitais no Arduino; e

• Como compilar e gravar um programa em um ambiente Arduino.

Você deverá participar da seguinte atividade:

• Desafio 1 – Elaborar um programa para simulação do controle de nível do reservatório.

35
DESAFIO 2
APRESENTAÇÃO

Neste desafio, você estudará o funcionamento e a programação dos conversores analógico-digital


(A/D) e digital-analógico (D/A) do Arduino. Estudará, também, a importância da documentação
de um programa por meio de fluxogramas.

• No final deste desafio você terá subsídios para:


• Utilizar um conversor A/D na plataforma Arduino;
• Utilizar um conversor D/A na plataforma Arduino;
• Elaborar um fluxograma.

Preparado? Então siga em frente!

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!

É importante você saber que a elaboração de um fluxograma é indicada como


uma boa prática de programação, portanto, você deverá elaborar um para
todos os seus programas.

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.

Agora que conhece a importância de um fluxograma para um projeto, acompanhe o exemplo


a seguir, onde faremos um fluxograma para o programa das luzes veiculares. Para facilitar o
entendimento, faremos a elaboração do fluxograma em etapas.

1. PARTE INICIAL DO CÓDIGO:

Parte inicial do programa:

Fluxograma da parte inicial:

39
2. DECLARAÇÃO DE ENTRADAS E SAÍDAS

Trecho do programa que contém a declaração de entradas e saídas:

Fluxograma da declaração das entradas e saídas:

40
3. PROCEDIMENTO LOOP()

Trecho do programa que contém o procedimento loop():

Fluxograma do procedimento loop():

Agora, veja o fluxograma completo do exemplo:

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.

A seguir, vamos estudar o conversor A/D do Arduino Due. Acompanhe.

42
CONVERSOR A/D

Como vimos no desafio 2 da unidade anterior, quando estudamos os microcontroladores


PIC, os conversores A/D convertem níveis de tensão analógicos para um número equivalente
digital. Conceitualmente falando, a conversão funciona de modo semelhante em todos os
microcontroladores, incluindo os que equipam as placas Arduino.

Embora o princípio seja o mesmo, existem particularidades que afetam o funcionamento do


conversor A/D em cada microcontrolador e o modo de programá-los como, por exemplo, a
quantidade de bits e as instruções utilizadas para fazer a conversão.

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).

Adaptado de datasheet do microcontrolador SAM3X.

O conversor A/D do SAM3X possui as seguintes características:

• 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

O conversor A/D do microcontrolador SAM3X possui dois modos de operação: o modo


de conversão única e o modo livre (Free Running Clock - FCLK). Em modo de conversão
única, o conversor A/D faz a conversão e, em seguida, para. No modo livre, a conversão
prossegue imediatamente após terminar a anterior.
Os registradores do conversor A/D, assim como os registradores de qualquer módulo
periférico particular (por exemplo: ADC, Timer, USART etc.), proporcionam o elo
de comunicação entre o processador central e os dispositivos periféricos. Você pode
configurar o conversor A/D de acordo com a sua necessidade de programação e terá o
resultado da conversão nos registradores indicados no datasheet. O conversor A/D tem
19 registradores, sendo três deles reservados. A gestão destes registradores é realizada
pelo DACC (Digital-to-Analog Converter Controller).
As conversões são possíveis de 0 V a ADVREF. O conversor A/D suporta um modo
de resolução de até 12 bits, e os resultados da conversão são disponibilizados num
registrador comum para todos os canais, bem como num registrador dedicado de
canal. Há a possibilidade de disparo externo por meio de um sinal no pino DATRG
ou internamente, por contadores configuráveis (TRGSEL e TRGEN). O tempo de
monitoramento é diferente para o modo de conversão escolhido, sendo aconselhável
acompanhar as informações da página 1408 do datasheet do SAM3X. A figura, a seguir,
indica as tensões de trabalho e o incremento de tensão para cada modo de operação.

O circuito de comparação permite a detecção automática e de maneiras distintas, como


por exemplo, valores inferiores a um limiar, maiores do que um limiar, num determinado
intervalo ou fora do intervalo. Os intervalos dos limiares são totalmente configuráveis.
O controlador ADC está diretamente ligado à entrada PWM Fault (no PWMC), que
é acionada caso haja uma falha interna, com a finalidade de colocar, imediatamente,
as saídas PWM em um estado seguro. A figura, a seguir, ilustra o circuito de proteção
interno das saídas PWM por meio da entrada PWM fault.

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).

*Apenas no Master Clock Controller, que fornece o clock para os periféricos.

Saiba mais...

Para saber mais sobre o prescaler utilizado pelo conversor A/D do


SAM3X, acesse a página 1404 do datasheet, disponível em:
http://www.atmel.com/Images/Atmel-11057-32-bit-Cortex-M3-
Microcontroller-SAM3X-SAM3A_Datasheet.pdf

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...

Para saber mais sobre o funcionamento do conversor A/D do SAM3X,


acesse a nota de aplicação do fabricante, disponível no seguinte endereço:
http://www.atmel.com/Images/Atmel-42298-SAM3-4S-4C-Analog-to-
digital-Converter-ADC_ApplicationNote_AT06860.pdf

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 SAM3X, assim como acontece em outros microcontroladores, as portas analógicas também


podem ser utilizadas como portas digitais, dependendo da configuração. Além disso, podem operar
como entradas ou como saídas. Tudo depende da configuração informada no software.

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.

Acompanhe um exemplo de como configurar a resolução para 12 bits:

Saiba mais...

Para saber mais sobre a instrução analogReference, consulte:


http://www.arduino.cc/en/Reference/AnalogReference

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!

O comando analogRead não funcionará adequadamente se uma entrada


analógica for previamente definida como uma saída, por isso, se for o caso,
redefina-a como entrada antes de usar a função. O resistor pull-up interno, no
microcontrolador, será redefinido quando voltar a ser entrada.

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...

Para outras informações sobre o módulo A/D do Arduino Due, consulte:


http://www.arduino.cc/en/Reference/AnalogReadResolution
http://www.arduino.cc/en/Tutorial/AnalogInputPins

Dica...

Para fazer várias conversões sucessivas, o fabricante recomenda adicionar


um pequeno atraso entre as execuções da função analogRead().

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.

Segundo o teorema de amostragem de Nyquist-Shannon, um sinal de amostra analógico, limitado


em banda, pode ser recuperado a partir de uma sequência infinita de amostras se a taxa de
amostragem for maior do que o dobro da maior frequência do sinal original. No entanto, mesmo
com um filtro de reconstrução ideal, o processo em si introduz erros de quantificação, o que torna
praticamente impossível uma perfeita representação.

Uma maneira de reduzir os erros de quantificação, é aumentar a resolução do conversor, ou seja,


aumentar a quantidade de bits.

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...

Para saber mais sobre o funcionamento do conversor D/A do SAM3X, consulte


a página 1356 do datasheet disponível em:
http://w w w.at mel.com/Images/At mel-11057-32-bit-C or tex-M3-
Microcontroller-SAM3X-SAM3A_Datasheet.pdf

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!

A instrução analogWriteResoltion() é exclusiva do Arduino Due, ou seja, ela


não funciona nas outras placas Arduino.

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

Agora que você conhece o funcionamento dos conversores A/D e D/A


do Arduino, chegou o momento de retomar o desafio 2.

Retorne à página principal do ambiente virtual de aprendizagem e par-


ticipe do desafio 2. Lembre-se que a elaboração da tarefa proposta de-
verá ser realizada em grupo. Você terá à disposição, um ambiente de
grupo, para debater com os colegas e um espaço destinado para a entre-
ga da tarefa.

Bom trabalho!

RECAPITULANDO

Neste desafio você estudou:

• Como elaborar um fluxograma;


• Como funciona o conversor A/D do Arduino Due;
• Como funciona o conversor D/A do Arduino Due; e
• Como estruturar um programa para ler entrada e acionar saídas
analógicas.

Você deverá participar da seguinte atividade:

• Desafio 2 – Elaborar um programa para simular o funcionamento do controle de temperatura


da água.
DESAFIO 3
APRESENTAÇÃO

Neste desafio, você estudará o funcionamento e a programação de um PWM, de um Timer Coun-


ter e das interrupções no Arduino.

No final deste desafio você terá subsídios para:


• Utilizar o módulo PWM na plataforma Arduino;
• Utilizar o módulo Timer Counter na plataforma Arduino;
• Utilizar recursos de interrupção na plataforma Arduino.

Preparado? Então siga em frente!

63
PWM

Como vimos no desafio 3 da unidade anterior, quando estudamos os microcontroladores PIC,


PWM é uma técnica utilizada para controlar a tensão média, por meio de pulsos, em dispositivos
de corrente contínua, como lâmpadas e motores. Naquela ocasião, vimos que a técnica se baseia
na variação da largura de pulsos (duty-cycle).

Embora o princípio de funcionamento de um PWM seja o mesmo para todos os microcontro-


ladores, o modo de programá-lo possui algumas particularidades que variam de um microcontro-
lador para outro, por exemplo, na configuração da frequência ou do duty-cycle.

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.

As principais características do módulo PWM do microcontrolador SAM3X são:

• 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

O módulo PWM do microcontrolador SAM3X controla 8 canais de forma independente.


Cada canal controla duas formas de onda quadradas complementares nas saídas.
As características das formas de onda, por exemplo, o período, o ciclo de trabalho, a
polaridade e os dead-times, são configurados por meio da interface do usuário.
O clock de cada canal é gerado a partir da divisão do clock principal do PWM (MCK).
Todos os acessos ao módulo PWM são feitos por meio de registradores mapeados pelo
barramento dos periféricos.
Os canais integram um sistema de buffer duplo, a fim de impedir que uma forma de onda
de saída não programada modifique o período, o duty-cycle ou os dead-times do sinal.
Além disso, os canais podem ser conectados entre si como canais síncronos, para poder
atualizar o seu ciclo de trabalho ou dos dead-times, ao mesmo tempo. A atualização do
duty-cycle dos canais síncronos pode ser realizada pelo Controlador de Canal Periférico
DMA (PDC) que oferece um buffer para transferência de dados sem a intervenção do
processador.
As saídas do PWM podem substituir de forma síncrona ou assíncrona o seu contador de
canal. A linha de interrupção do PWM está ligada em uma das fontes internas da Nested
Vectored Interrupt Controller (NVIC). Para usar uma interrupção do PWM, o NVIC
precisa ser programado primeiro.

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

O módulo PWM fornece 8 unidades de comparação independentes, capazes de comparar


um valor programado no contador com o dos canais síncronos (contador de canal 0). O
objetivo das comparações é gerar interrupções de software, sincronizando pulsos sobre
as duas linhas independentes de eventos com os pedidos de transferência do PDC.

PROTEÇÃO CONTRA FALHAS

O módulo PWM fornece um mecanismo de proteção contra falhas com 6 entradas,


sendo 3 provenientes das portas PWMFx, uma dos temporizadores/contadores, uma do
controlador A/D e uma do oscilador principal.
Ao detectar uma condição de falha em qualquer uma das portas, as respectivas saídas
do PWM são fixadas em um valor pré-determinado, configurado por software. Significa
dizer que a saída PWM para de gerar os pulsos quando uma falha for detectada. Mas é
importante dizer que você precisa configurar as respectivas portas de proteção contra
falhas antes utilizá-las, pois elas não são habilitadas por padrão. O registrador PMC_SR
registra as condições de falha, ou seja, serve como sinalizador para indicar que uma falha
foi detectada.

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:

O contador de módulo n fornece 11 clocks: FMCK, FMCK / 2, FMCK / 4, FMCK / 8,


FMCK / 16, FMCK / 32, FMCK / 64, FMCK / 128, FMCK / 256, FMCK / 512, FMCK /
1024;

66
Os divisores lineares (1, 1/2, 1/3, ..., 1/255) fornecem dois clocks diferentes: clkA e clkB.

O duty-cycle será calculado em função do valor presente no campo CDTY do registrador


PWM_CDTYx.

Detalhes pontuais podem ser consultados a partir da página 978 do datasheet.

Se a forma de onda estiver alinhada à esquerda, teremos:

Se a forma de onda estiver centralizada, teremos:

Saiba mais...

Para saber mais sobre o módulo PWM do microcontrolador SAM3X, consulte


o datasheet.

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:

A frequência padrão é adequada para a maioria dos casos.

Alterar a frequência envolve a configurações de diversos registradores, o que


é relativamente complicado (sob o ponto de vista das facilidades do Arduino).

Alterar a frequência pode afetar no funcionamento de outras funções associadas


a rotinas de atrasos, a temporizadores e a contadores.

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...

Para saber mais sobre a configuração da frequência do PWM, consulte as


seguintes páginas, na internet:
http://playground.arduino.cc/Main/TimerPWMCheatsheet
http://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM

70
PROGRAMA DE EXEMPLO: CONTROLE DE ROTAÇÃO E VELOCIDADE

Um exemplo de aplicação comum para um PWM é o controle de velocidade e rotação de um


motor CC por meio de uma ponte H controlada por PWM. O programa de exemplo considera o
uso do circuito integrado L293 atuando como ponte H. Trata-se de um circuito integrado muito
utilizado para esta finalidade, e facilmente encontrado em shields para Arduino.

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...

Para saber mais sobre o controle de motores utilizando Arduino, consulte os


seguintes endereços:
http://www.arduino.cc/en/Main/ArduinoMotorShieldR3
http://www.arduino.cc/en/Tutorial/StepperUnipolar
http://www.arduino.cc/en/Reference/Stepper?from=Tutorial.Stepper

73
TIMER COUNTER

O Timer Counter (TC) é um módulo fundamental em qualquer microcontrolador. Na maior par-


te dos projetos, um processo de temporização mede uma quantidade de tempo decorrido ou mon-
itora eventos de tempo externos para aplicações em tempo real, por exemplo, a geração de baud
rate ou de um sinal PWM. Apesar de o nome Timer Counter conter duas palavras que remetem a
funções distintas – Timer e Counter -, eles realizam tarefas similares, e a diferença na terminologia
tem mais a ver com a forma como o hardware funciona do que em razão da aplicação. Para selecio-
nar um ou outro, podemos manipular o bit de seleção 2 do registrador TMOD (comum em muitos
microcontroladores) para modo timer (carregando zero) ou modo counter (carregando um). Mas
qual é a exata diferença entre eles?

Um temporizador (timer) conta os ciclos de máquina e proporciona um tempo de


atraso como referência, ou gera um clock. Por exemplo, se um ciclo de máquina, no
microcontrolador, é composto por 12 períodos de clock ou representa uma taxa de
contagem de 1/12 da frequência do clock, para um clock de 12 MHz, o período será
igual a 1 µs.

Um contador (counter) monitora eventos. Por exemplo, um contador pode ser


incrementado no microcontrolador em resposta a uma transição de nível lógico
um (1) ou zero (0) em uma porta de entrada externa. Desse modo, a saída do
contador pode iniciar uma contagem ou disponibilizar um valor que represente uma
ocorrência. Para a função de contagem, um microcontrolador leva dois ciclos de
máquinas ou 24 períodos de clock para detectar transições de zero (0) para um (1) na
porta correspondente.

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

O microcontrolador SAM3X possui um Time Counter de 9 canais. O diagrama em blocos, a seguir,


indica as portas associadas ao Timer Counter. No diagrama, o TCLKx é tratado como entrada
e os TIOAx e TIOBx são tratados como I/O. O x representa o número do canal. Os canais são
nomeados de Timer Counter Channel 0 até 8, com as respectivas siglas TC0 a TC8 e separados em
grupos, 0-2, 3-5 e 6-8.

As principais características do Timer Counter do SAM3X são:

• 9 canais que podem ser configurados pelo usuário;


• Resolução de 32 bits;
• Função para medição de frequência;
• Função para contagem de eventos;
• Função para medição de intervalos;
• Contador Gray de 2 bits para motor de passo;
• Registrador com proteção de escrita;
• 3 entradas externas de clock;
• 5 entradas internas de clock;
• Sinal de interrupção interna.

Para compreender melhor o funcionamento do Timer Counter do SAM3X, é preciso conhecer


mais detalhes sobre as principais características.

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 TC incorpora um decodificador de quadratura (QDEC) ligado em frente aos


temporizadores e acionado pelas entradas TIOA0, TIOB0 e TIOB1. Quando ativado, o
QDEC executa as linhas de filtro da entrada, decodifica sinais em quadratura e conecta-
se aos temporizadores/contadores de modo a ler a posição e velocidade do motor, por
exemplo, por meio da interface do projetista.

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:

• Sinais de clock externos*: XC0, XC1 ou XC2;


• Sinais de clock internos: MCK/2, MCK/8, MCK/32, MCK/128, SLCK.

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!

Em todos os casos, se um clock externo for utilizado, a duração de cada


um dos seus níveis deve ser mais longa do que um período do clock
periférico. A frequência de clock externo deve ser, pelo menos, 2,5 vezes
mais baixa do que o clock periférico.

O diagrama em blocos, a seguir, ilustra como é feita a seleção de clock no microcontrolador


SAM3X.

78
Saiba mais...

Para saber mais sobre o Timer Counter do microcontrolador SAM3X, consulte


as páginas 855 a 908 do datasheet, disponível em http://www.atmel.com/
Images/Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_
Datasheet.pdf

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

Quando necessitamos ler uma frequência ou duty-cycle de um sinal PWM utilizando um


microcontrolador qualquer, podemos adotar a seguinte estratégia.

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.

Possibilita a identificação de frequências de alguns Hz até alguns MHz, com boa


precisão. A biblioteca FreqCounter mede apenas um sinal, uma vez que está associada
à porta digital 5. Não é aconselhado o seu uso simultâneo a uma saída PWM na
mesma placa. Outro detalhe importante é que essa biblioteca não possui funções
para a identificação do duty-cycle do sinal, que deve ser de 50%.

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:

pulseIn(pin, value) ou pulseIn(pin, value, timeout)

Parâmetros:

• pin: o número do pino onde se quer ler o pulso;


• value: tipo do pulso. Pode ser por borda de subida (HIGH) ou descida (LOW);
• timeout: parâmetro opcional. Indica o tempo de espera pelo pulso, em microssegundos. Se não
for informado, a função utilizará um valor default de 1 segundo.

O retorno da função é o tempo de duração do pulso, em microssegundos. O valor será zero se o


pulso ocorreu antes da leitura.

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...

Para saber mais sobre a função punseIn() , consulte:


http://www.arduino.cc/en/Reference/PulseIn

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:

No código fonte do Arduino, podemos fazer do seguinte modo:

É 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.

O trecho de código, a seguir, minimiza o problema de instabilidade:

84
CAPTURA DO VALOR DO DUTY-CYCLE DE UM SINAL PWM

Os modos de leitura de frequência que estudamos até o momento possuem a desvantagem de


exigir um sinal com duty-cycle de 50 %, ou seja, só servem para sinais quadrados perfeitos. Mas
é possível utilizar a função pulseIn() para a captura do duty-cycle. Para esse caso, precisamos
conhecer a frequência do sinal.

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.

A vantagem de calcular o duty-cycle por meio da instrução pulseIn() é a simplicidade do programa.


Por outro lado, além de necessitar da informação do período do sinal de entrada, a função pulseIn()
retarda o processamento enquanto realiza a leitura, uma vez que a execução do programa fica
retida até a conclusão da medição feita por essa função.

Como alternativa à instrução pulseIn(), podemos obter o duty-cycle por meio de interrupções. É o
que estudaremos, a seguir.

85
INTERRUPÇÕES

A grande maioria dos microcontroladores possuem recursos de interrupções, e muitas funções se


utilizam desse recurso. As interrupções permitem responder a eventos externos enquanto realizam
determinadas tarefas. Por exemplo, imagine que você está preparando um almoço e que acaba de
colocar um frango no forno. Ao invés de olhar ininterruptamente para o relógio, aguardando o
frango ficar pronto, você pode programar um alarme para avisá-lo no tempo certo. Desse modo,
enquanto o frango está assando, você poderá realizar outras tarefas. Quando o alarme informar que
o frango está pronto, você deverá interromper o que estiver fazendo para tirar o frango do forno.

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.

Uma aplicação interessante para entender o uso de interrupção é a leitura de um encoder


rotativo. Sem o recurso de interrupção, o programa precisaria consultar constantemente o sensor
do codificador para capturar os pulsos, quando eles surgem. Nesse caso, podemos utilizar uma
interrupção para sinalizar a chegada de um pulso do encoder.

Existem dois tipos de interrupções em microcontroladores:

Por hardware: quando ocorrem por evento externo, por exemplo, uma alteração
do valor binário em uma porta digital;

Por software: quando ocorrem por solicitação de alguma instrução dentro da


lógica de programação, por exemplo, a chegada de uma informação em uma
porta serial.

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...

Para saber mais sobre as interrupções, consulte os sites:


http://gammon.com.au/interrupts
http://www.engblaze.com/we-interrupt-this-program-to-bring-you-a-
tutorial-on-arduino-interrupts/
http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-
interrupts/

86
Na plataforma Arduino temos funções muito interessantes para lidar com interrupções.

INSTRUÇÃO ATTACHINTERRUPT()

A instrução attachInterrupt() informa ao Arduino como deverão ser tratadas as


interrupções, ou seja, os critérios para o disparo da interrupção e a rotina que deverá ser
executada quando ela for disparada.
A maioria das placas Arduino tem duas interrupções externas: números 0 (na entrada
digital 2) e 1 (na entrada digital 3). A tabela, a seguir, indica as portas de interrupção
disponíveis nas principais placas Arduino.

Importante!

A placa Arduino Due é diferenciada quando o assunto é interrupção.


Esta permite programar uma interrupção em qualquer uma das saídas
disponíveis. Para isso, você deve especificar diretamente o número da
saída na função attachInterrupt(), no campo pin.

A sintaxe da instrução attachInterrupt() permite duas opções:


attachInterrupt(interrupt, ISR, mode) ou attachInterrupt(pin, ISR, mode), sendo que a
segunda opção é exclusiva do Arduino Due.
Parâmetros:
• interrupt: o número da interrupção;
• pin: o número da saída;
• (Interrupt Service Routine) ISR: é a rotina chamada quando ocorre a interrupção.
Essa função não possui parâmetro ou retorno. Trata-se de uma rotina qualquer a
serviço da interrupção;
• mode: define quando a interrupção deve ser acionada. São quatro chamadas pré-
determinadas:
• CHANGE: Chama interrupção quando há alteração do valor do dado;
• FALLING: Chama interrupção quando detecta borda de descida;
• HIGH: Chama a interrupção quando a saída está em nível alto (Apenas no
Arduino Due);
• LOW: Chama a interrupção quando s saída está em nível baixo;
• RISING: Chama interrupção quando detecta borda de subida.

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!

No website do fabricante do Arduino você encontrará os links das


funções comentadas no texto anterior.
http://www.arduino.cc/en/Reference/AttachInterrupt
http://www.arduino.cc/en/Reference/DelayMicroseconds
http://www.arduino.cc/en/Reference/Millis
http://www.arduino.cc/en/reference/volatile
http://www.arduino.cc/en/Reference/HomePage?from=Reference.Extended
http://www.arduino.cc/en/Reference/Float

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()

A instrução detachInterrupt() serve para desativar uma determinada interrupção. No


Arduino Due, basta indicar a entrada designada para a interrupção no parâmetro da
função. Para os demais, o parâmetro informado deverá ser o número da interrupção,
conforme estudamos na função attachInterrupt():
Significa dizer que a sintaxe da instrução attachInterrupt() permite duas opções:
detachInterrupt(interrupt) ou detachInterrupt(pin), sendo que a segunda opção é exclusiva
do Arduino Due.

Saiba mais...

Para saber mais sobre as interrupções, consulte os sites:


http://gammon.com.au/interrupts
http://www.engblaze.com/we-interrupt-this-program-to-bring-you-a-
tutorial-on-arduino-interrupts/
http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-
timer-interrupts/

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

Agora que você conhece o recurso de PWM, de Timer Counter e de


interrupções, chegou o momento de retomar o desafio 3.

Retorne à página principal do ambiente virtual de aprendizagem e


participe do desafio 3. Lembre-se de que a elaboração da tarefa proposta
deverá ser realizada em grupo. Você terá à disposição, um ambiente
de grupo, para debater com os colegas e um espaço destinado para a
entrega da tarefa.

Bom trabalho!

RECAPITULANDO

Neste desafio você estudou:

• Como funciona o recurso PWM no Arduino;


• Como funciona o recurso de Timer Counter no Arduino; e
• Como funciona o recurso de interrupção no Arduino;

Você deverá participar da seguinte atividade:

• Desafio 3 – Elaborar um programa para verificar o funcionamento do controle de velocidade


da bomba de água.
DESAFIO 4
APRESENTAÇÃO

Neste desafio, você estudará o funcionamento e a programação da comunicação USB nas placas
Arduino:

• No final deste desafio você terá subsídios para:


• Utilizar a comunicação serial na plataforma Arduino;
• Utilizar a comunicação USB na plataforma Arduino.

Preparado? Então siga em frente!

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.

bit de bit de bits de


início dados paridade parada

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.

A transmissão de dados seriais necessita de padronização para definir níveis lógicos e de um


protocolo para o processo de comunicação. Dentre os protocolos mais utilizados, além do RS-
232, podemos destacar o RS-485. Todos utilizam conectores DB-9 ou DB-25. O conector será
do tipo macho para equipamentos DTE (Data Terminal Equipment) e fêmea para os DCE (Data
Communication Equipment). O mercado fornece conversores para a comunicação entre os sistemas.

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.

Características entre as interfaces RS-232 e RS-485

Parâmetro RS-232 RS-485

Configuração de linha Single-ended Differential

Modo de operação Simplex oufull duplex Simplex ou half duplex

Máximo comprimento do cabo 15m 1220 m

Taxa de transmissão máxima 20 kbits/s 10 Mbits/s

Níveis lógicos típicos +5 to +15 V +1.5 to +6 V

Mínima impedância de entrada (receptor) 3 to 7 kΩ 12 kΩ

Sensibilidade +3 V +200 mV

*Máxima velocidade para o comprimento máximo do cabo

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.

Da esquerda para a direita: conectores USB do tipo micro USB e 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.

O sistema USB permite que você conecte um equipamento sem a necessidade de


desligar o computador ao qual ele será conectado. Mas é importante lembrar que alguns
dispositivos exigem certos cuidados no momento de desconectá-los, por exemplo
dispositivos de armazenamento de dados. Para esses casos, os sistemas operacionais
oferecem uma opção para ejetar o dispositivo antes de desconectá-lo.

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:

A porta USB do SAM3X possui as seguintes características:

• 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...

Para saber mais detalhes sobre a porta USB do microcontrolador SAM3X,


consulte as informações da página 1053 até a 1185 do datasheet, no site:
http : / / w w w. at m e l . c om / i m a ge s / at m e l - 1 1 0 5 7 - 3 2 - bit - c or t e x - m 3 -
microcontroller-sam3x-sam3a_datasheet.pdf

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.

Sobre a porta USB de programação, como ela utiliza um microcontrolador intermediário, a


comunicação chega ao SAM3X por meio de portas de comunicação serial padrão (Tx e Rx). Desse
modo, para utilizar a porta de programação, você deverá programar o Arduino Due como se
estivesse fazendo uma comunicação serial convencional. Por esse motivo a porta de programação
não oferece as funcionalidades USB de um host, podendo atuar, apenas, como um dispositivo
periférico.

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...

Para saber mais sobre a biblioteca USBHost, visite:


http://www.arduino.cc/en/Reference/USBHost

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.

Sintaxe da função: USBHost usb.

Acompanhe os exemplos, a seguir, para compreender melhor a dinâmica de chamada da função.


O exemplo utiliza a biblioteca MouseController, que serve para se comunicar com um mouse, via
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...

Para saber mais sobre a função USBHost, visite:


http://www.arduino.cc/en/Reference/USBHostConstructor

101
BIBLIOTECAS

Assim como ocorre na maioria das plataformas de programação, o ambiente de desenvolvimento


do Arduino pode ser ampliado com a utilização de bibliotecas (arquivos .h). Elas oferecem
funcionalidades extras para o seu projeto, por exemplo, para trabalhar com um determinado
hardware ou manipular dados. Algumas bibliotecas são instaladas por padrão, junto com o
software do Arduino, mas você também pode fazer o download ou criar a sua própria.

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...

Para conhecer mais detalhes sobre a instalação de bibliotecas, consulte os


seguintes endereços, na internet:
http://www.arduino.cc/en/Guide/Libraries
http://www.arduino.cc/en/Hacking/LibraryTutorial
http://www.arduino.cc/en/Reference/APIStyleGuide

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.

Passo 1: Abrindo a ferramenta 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...

Para saber mais sobre a função serial(), consulte:


http://www.arduino.cc/en/Reference/Serial

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.

A sintaxe da função é: Serial.begin(speed) ou Serial.begin(speed, config).

Saiba mais...

Para mais informações sobre a função serial.begin(), consulte:


http://www.arduino.cc/en/Serial/Begin

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.

A sintaxe da função é: Serial.print(val) ou Serial.print(val,format)

Parâmetros:

• val: qualquer tipo de dado para impressão;


• format: especifica a base numérica para conversão do dado ou o número de casas
decimais (para dados com ponto flutuante).

107
Importante!

Cuidado na especificação de números com casas decimais utilizando a


vírgula, pois isso pode causar uma interpretação errada sobre o número
de parâmetros, acarretando em erros de compilação. Na versão 1.0, o
processo de transmissão serial é assíncrono, retornando sempre algum
valor quando utilizado o comando.

Acompanhe alguns exemplos de uso da função Serial.print():


• Serial.print (16) retorna “16“;
• Serial.print (9.87654) retorna “9.88”– faz arredondamento, cuidado!;
• Serial.print (‘Y’) retorna “Y“;
• Serial.print (“Olá SENAI”) retorna “Olá SENAI“;
• Serial.print (16, BIN) retorna “10000“;
• Serial.print (16, OCT) retorna “20“;
• Serial.print (16, DEC) retorna “16“;
• Serial.print (16, HEX) retorna “10“;
• Serial.print (9.87654, 0) retorna “10” – faz arredondamento, cuidado!;
• Serial.print (9.87654, 2) retorna “9.88” - faz arredondamento, cuidado!;
• Serial.print (9.87654, 4) retorna “9.8765” - faz arredondamento, cuidado!.

Dica...

Você pode escrever strings presentes na memória flash com a


função Serial.print(), adicionando a expressão “F ()” no primeiro
parâmetro. Exemplo:

Serial.print (F (“Olá SENAI”));

Saiba mais...

Para mais informações sobre a função serial.print(), consulte:


http://www.arduino.cc/en/Serial/Print

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.

O programa de exemplo, a seguir, monta uma tabela de conversão de decimal para


binário, octal e hexadecimal, com legenda e valores. Note que sem o comando Serial.
println() não seria possível formatar a tabela.

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...

Para mais informações sobre a função serial.println(), consulte:


http://www.arduino.cc/en/Serial/Println

110
FUNÇÃO SERIAL.END()

A função Serial.end() desabilita a comunicação serial e libera as saídas RX e TX para


outras tarefas. A função Serial.end() não possui parâmetros.

Saiba mais...

Para mais informações sobre a função serial.end(), consulte:


http://www.arduino.cc/en/Serial/End

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...

Para conhecer mais um exemplo de programa para comunicação serial,


consulte:
http://www.arduino.cc/en/Tutorial/ASCIITable
Existem outras funções acessíveis pela página principal do fabricante Arduino,
no campo de pesquisa, na lupa, acima à esquerda. Alguns links interessantes:
http://www.arduino.cc/en/Reference/SoftwareSerialListen
http://www.arduino.cc/en/Reference/SoftwareSerialConstructor
http://www.arduino.cc/en/Reference/MouseKeyboard
http://blog.filipeflop.com/arduino/usb-host-shield.html

113
DESAFIO 4

Agora que você conhece o funcionamento da porta USB e a comuni-


cação serial na plataforma Arduino, chegou o momento de retomar o
desafio 4.

Retorne à página principal do ambiente virtual de aprendizagem e


participe do desafio 4. Lembre-se que a elaboração da tarefa proposta
deverá ser realizada em grupo. Você terá à disposição, um ambiente
de grupo, para debater com os colegas e um espaço destinado para a
entrega da tarefa.

Bom trabalho!

RECAPITULANDO

Neste desafio você estudou:

• Como montar um diagrama esquemático no software Quartus II;


• Como integrar um CPLD com interface de potência com IGBT; e
• Como integrar um CPLD com interface de potência com Tiristores.

Você deverá participar da seguinte atividade:

• 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

AGUILAR, L. J. Fundamentos de Programação – Algoritmos, Estruturas de Dados e Objetos. 3.


ed. Madrid: Ed. Mc Graw Hill, 2002.

ATMEL. Application note AT06860: SAM3/4S/4C Analog-to-digital Converter (ADC).


Disponível em: < http://www.atmel.com/Images/Atmel-42298-SAM3-4S-4C-Analog-to-digital-
Converter-ADC_ApplicationNote_AT06860.pdf>.
Rev. Abr. 2014. Acesso em: 13 abr. 2015.

BAKER, B. How Delta Sigma Works – part 1


Disponível em: <http://www.ti.com/lit/an/slyt423/slyt423.pdf >.
Rev. 3Q 2011. Acesso em: 13 abr. 2015.

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.

BOXALL, J. Arduino Workshop. EUA: Ed. No Starch Press, 2013.

CALDEIRA, U. G. Notas de aula de Eletrônica Analógica – SENAI CFP 1.18. Santo André - SP,
2015.

EVANS, M., NOBLE, J.,HOCKENBAUM, J. Arduino in Action. EUA: Ed Manning Publications


Co, 2013.

INTERNET. Gammom Forum.


Disponível em: < http://gammon.com.au/interrupts >.
Acesso em: 13 abr. 2015.

INTERNET. Website do fabricante do Arduino Due.


Disponível em: < http://www.arduino.cc >.
Acesso em: 13 abr. 2015.

MICROCHIP. Datasheet do PIC18F452


Disponível em: < http://ww1.microchip.com/downloads/en/DeviceDoc/39564c.pdf >.
Acesso em: 13 abr. 2015.

KESTER, W. The Data Conversion Handbook. EUA. Ed. Newnes. 2005.

MARGOLIS, M. Arduino Cookbook. 2. ed. EUA: Ed. O’Reilly, 2012.

MARTINEZ, S. L., STAGER, L. Invent to Learn – Making, Tinkering and Engineering in


Classroom. 1. ed. EUA: Ed. Modern Knowledge Press, 2013.

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

Você também pode gostar