Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

MICROCONTROLADORES 
Renato de Brito Sanchez 
 
 
 
 
 
 
 
 
 
 
SUMÁRIO 
 
1 MICROPROCESSADORES E MICROCONTROLADORES ............................... 3 
2 CARACTERÍSTICAS DOS MICROCONTROLADORES .................................. 10 
3 APLICAÇÃO DE MICROCONTROLADORES .............................................. 20 
4 CONFIGURAÇÃO E CODIFICAÇÃO .......................................................... 33 
5 PROJETO COM MICROCONTROLADORES I ............................................. 43 
6 PROJETO COM MICROCONTROLADORES II ............................................ 65 
 
 
 
1 MICROPROCESSADORES E MICROCONTROLADORES 
Olá, estudante! 
Neste primeiro bloco da disciplina de Microcontroladores, serão introduzidos os 
conceitos de microcontrolador e microprocessador, apresentaremos suas definições, 
funções, principais características e a arquitetura física do microcontrolador. Por fim, 
será apresentada a definição de conjuntos básicos de instruções. 
Vamos começar?! 
 
1.1 Conceitos e Tecnologias 
Os microprocessadores e os microcontroladores estão presentes em diversos 
equipamentos. Esses componentes possuem códigos especialmente programados para 
realizar diversas tarefas como a leitura de sensores, a transmissão de dados e o 
controle de motores. Cada equipamento possui uma aplicação específica, dessa forma, 
o microprocessador e o microcontrolador realizam funções diferentes para cada 
equipamento. 
Ao desenvolver um equipamento, é necessário conhecer as características e detalhes 
dos microcontroladores e microprocessadores utilizados. Assim, é possível escolher o 
componente adequado para cada função. Lembrando que, nem sempre um 
componente ideal para uma aplicação pode ser usado para outra aplicação. 
O microcontrolador pode ser visto como um minicomputador, possui um núcleo de 
processador, memória voláteis e não voláteis e diversos periféricos de entrada e saída. 
Os modelos mais populares de microcontroladores são: o PIC da Microchip, a Intel 
MCS da Intel e o Atmel AR da Atmel. Entre eles, o modelo mais popular é o Atmel, pois 
é o microcontrolador utilizado nas placas Arduino. Essas placas são muito utilizadas 
pelos estudantes por serem acessíveis, fáceis de utilizar e possuírem um código aberto, 
permitindo alterá-la de acordo com a necessidade do usuário. 
Enquanto isso, o microprocessador é um circuito integrado responsável por realizar 
cálculos e tomar decisões de acordo com a sua programação. Pode-se disser que ele é 
o cérebro do equipamento. 
O microprocessador reúne todas as funções de uma unidade central de computação 
(CPU) em um único circuito integrado. Ele é programado para receber dados de 
diversas origens, processá-los de acordo com a sua programação e retornar os 
resultados de uma forma que possam ser utilizados. 
Como o microprocessador é responsável pelo processamento de dados, é de suma 
importância analisar as especificações de cada modelo e selecionar o 
microprocessador adequado ao desenvolver um equipamento, afinal, ere irá 
determinar a sua capacidade de processamento. 
Essa é a maior diferença entre o microprocessador e o microcontrolador, o 
microprocessador é responsável apenas por processar os dados recebidos, já o 
microcontrolador interage com diversos componentes de acordo com os dados 
processados. Ambos são necessários para o desenvolvimento de equipamentos. 
 
1.2 Arquiteturas e Características Físicas 
O microcontrolador é composto por um microprocessador, memórias e periféricos, 
interligados para trabalharem em conjunto, seguindo a arquitetura abaixo: 
 
 
 
 
 
 
 
Fonte: Guimarães, 2020. Disponível em: 
Figura 1.1 – Arquitetura de um microcontrolador. 
 
A imagem demonstra a arquitetura de um microcontrolador PIC16F887, ilustrando 
bem uma arquitetura genérica de um microcontrolador. 
 
 Alimentação 
Os microcontroladores conseguem trabalhar em uma faixa de tensão de alguns 
volts. Entretanto, é comum alimentar os microcontroladores de 8 bits com 3,3V 
ou 5V. 
 Reset 
O microcontrolador possui um pino que serve para reiniciá-lo a partir de um 
sinal de tensão aplicado no pino. Reiniciar, então, nada mais é do que fazer o 
programa interno do microcontrolador voltar ao início. Este pino pode receber o 
nome de RESET ou de Master Clear (MCLR). 
 
 CPU 
É o “cérebro” do microcontrolador. 
 Watchdog 
O Watchdog é responsável por monitorar o comportamento do microcontrolador. 
Caso ocorra um erro durante o seu funcionamento, o watchdog irá aplicar um reset no 
microcontrolador, evitado que ele fique preso. 
 Memórias 
As principais memórias utilizadas pelo microcontrolador são: memória de 
dados, memória de programa e EEPROM. As memórias de dados são as 
memórias RAM e registradores da CPU e responsáveis pelo armazenamento de 
dados. E as EEPROM são responsáveis por armazenar qualquer tipo de dados 
necessário. 
 Oscilador 
O oscilador é responsável por gerar o clock do microcontrolador, ele pode ser 
interno ou externo. 
 GPIO 
Os GPIO são os pinos de entrada e saída digital do microcontrolador. 
Normalmente, eles são divididos por letras. 
 Timers 
Os timers são responsáveis por criar contadores e temporizadores utilizados 
pelo microcontrolador. 
 
 Outros 
O microcontrolador pode possuir outros tipos de periféricos de acordo com o 
seu modelo, como um conversor analógico digital e um gerador de sinal PWM. 
 
1.3 Conjuntos básicos de instruções 
A fim de facilitar a operação dos microcontroladores e dos microprocessadores, foi 
desenvolvido um conjunto básico de instruções. Essas instruções são códigos pré-
programados que funcionam como atalhos para a realização de funções especificas do 
componente. 
Esses conjuntos de instruções são, normalmente, fornecidos pelos fabricantes do 
componente, que listam todos os conjuntos de instruções presentes no componente. 
Nos processadores, essas instruções são divididas e RISC e CISC. 
O conjunto de instruções CISC (Complex Instruction Set Computer) possui instruções 
mais complexas e especificas. Já o conjunto de instruções RISC (Reduced Instruction 
Set Computer) é mais simplificada e com uso mais geral, sendo o conjunto utilizado 
com mais frequência. 
A linguagem de máquina é composta por declarações e instruções simples. Todo 
programa é traduzido por uma linguagem de nível mais alto para a linguagem de 
máquina. 
Uma instrução pode especificar: 
 Registradores especiais para aritmética, endereçamento, ou funções de 
controle. 
 Posições de memória específicas ou deslocamentos. 
 Modos de endereçamento específico. 
 
Ao combinar essas instruções e controlar a ordem que elas são executadas, é possível 
obter operações mais complexas. 
Exemplo: 
 Transferência de dados de uma célula para outra. 
 Operações matemáticas de dois valores. 
 Armazenar o resultado obtido de operações matemática. 
 Desvio para outro endereço fora da sequência. 
 Teste de condição. 
 Mudar o endereço de acordo com o teste de condição. 
 Realizar operações lógicas como “AND”, “OR” e “XOR”. 
 Interromper a execução de um programa. 
 Transferir bytes da porta de E/S para a MP e vice-versa. 
 Substituição do operando por seu valor absoluto. 
 
Uma arquitetura tradicional possui códigos de operação especificando que operação 
será executada, como transferir um dado de uma memória para um registrador. 
Existem arquiteturas que possuem longas instruções, como o VLIW, que possuem 
inúmeros códigos, onde uma série de operações ocorre com apenas uma instrução. 
 
Conclusão 
Caro estudante, nesse bloco você conheceu os conceitos de microcontroladores e 
microprocessadores. Foram apresentadas suas definições, aplicações e principais 
características, além da estrutura física do microcontrolador e das funções de cada 
parte dela, fornecendo a base para o entendimento dos componentes. 
Por fim, foi abordadao tempo das produções 
 Monitorar processos 
 Visualizar tendências, tags e dados 
 Monitorar entradas 
 Traduzir dados 
 Revisar processos 
 Monitorar Saídas 
 Dar diagnóstico de problemas 
 Supervisionar KPI’s 
Como a IHM é uma forma de facilitar a interação dos operadores com as máquinas, ela 
precisa que alguns processos sejam feitos para funcionar. No setor industrial, a 
combinação mais vista é o uso da IHM juntamente com o CLP, que é o Controlador 
Lógico Programável. 
A IHM funciona de maneira semelhante ao computador de uso comum, pois ela reúne 
programações e processos antes feitos manualmente e os exibe na tela. 
Um exemplo disso são os caixas eletrônicos, ou até mesmo um processo de impressão, 
onde não é feita a programação que o computador utiliza para imprimir o seu arquivo, 
e sim a interação com ícones pré-programados que fornecem o mesmo resultado. 
Da mesma forma funciona a IHM. Antigamente o controle dos sistemas e máquinas era 
feito manualmente através de painéis com botoeiras, chaves ou sinalizadores LEDs. 
Porém, com a chegada do CLP e da IHM, esse processo está mais automatizado. 
Isso porque a IHM reúne todos os processos que o CLP realiza e envia para as 
máquinas, exibindo-os na tela. Para conseguir simplificar a interface, a IHM precisa 
anteriormente de uma programação comum, assim como os computadores de uso 
comum, que são configurados antes de começarem a realizar as suas funções. 
No projeto proposto, o IHM seria o botão, o potenciômetro e o display. Com o botão e 
o potenciômetro é possível controlar a rotação do motor sem a necessidade de 
reprogramá-lo e com o display é possível obter dados dos comportamentos do motor. 
 
6.3 Interfaces para chaveamento de carga e controle motores 
No caso dos motores, a “velocidade de giro” (RPM) pode ser controlada variando sua 
tensão de alimentação. Além disso, o RPM é diretamente proporcional à tensão 
aplicada. Portanto, variando-se a tensão média de alimentação do motor, varia-se o 
RPM do mesmo. 
Isso significa que: 
 Duty cycle de 0%: tensão média igual a 0V, logo, o motor fica parado. 
 Duty cycle de 50%: tensão média igual a 50% da tensão de alimentação do 
motor, logo este girará com RPM igual a metade de sua rotação máxima. 
 Duty cycle de 100%: tensão média igual a tensão de alimentação do motor, 
logo este girará com RPM igual a sua rotação máxima. 
A programação do Arduino já possui uma função nativa para gerar um sinal PWM em 
alguns dos pinos (aqueles identificados com um símbolo/identificação ~). Isso torna 
muito mais fácil o desenvolvimento dos projetos que envolvem PWM, permitindo fácil 
utilização do mesmo com pouquíssimo custo em termos computacionais (uso de 
memória Flash, RAM e processamento) e escrita de códigos-fonte mais limpos e 
curtos. Tal função é chamada de analogWrite(), e recebe dois parâmetros, conforme 
abaixo: 
analogWrite(PINO, VALOR_ANALOGICO); 
 
Onde: 
PINO: número do pino do Arduino no qual se deseja que o sinal PWM seja gerado. 
Conforme dito anteriormente, somente pinos com símbolo/identificação ~ podem 
gerar sinais PWM. 
VALOR_ANALOGICO: valor (de 0 a 255), proporcional ao Duty Cycle a ser gerado. 
Ou seja, para Duty Cycle de 100%, deve-se utilizar valor 255, já para Duty Cycle 20% 
deve-se utilizar o valor 51 e assim por diante. 
No projeto proposto, o sinal de PWM gerado pelo arduino é controlado pela posição 
do potenciômetro. Quando ele está no meio do seu percurso o PWM possui um sinal 
de 50%, ou seja, o motor gira na metade da velocidade. Quando está no fim do 
percurso, o PWM possui um sinal de 100%, ou seja, o motor gira na velocidade 
máxima. 
O motor utilizado no projeto é um modelo pequeno, que pode ser acionado pelo 
arduino. É possível ligar motores maiores e mais potentes utilizando o mesmo 
processo, entretanto, pode ser necessário o uso de drivers de controle capazes de lidar 
com fontes de alimentação mais potentes do que o Arduino. Nesse caso, o arduino 
funciona apenas como um controlador. 
 
Fonte: Bertoleti, 2019. Disponível em: . 
Figura 6.2 – Esquema de ligação de um motor com um arduino e um drive de 
controle. 
 
Conclusão 
Caro estudante, neste bloco foi desenvolvido um projeto em que um Arduino controla 
a rotação de um motor. 
Desenvolvemos, também, uma IHM utilizando um botão, potenciômetro e um display, 
que auxiliam no controle do motor. Por fim, foi utilizado o conceito de PWM para 
controlar a velocidade de rotação de um motor. 
Dessa forma, chegamos ao final da disciplina de Microcontroladores, confira as 
Bibliografias Consultadas e continue se aprimorando. 
Bons estudos! 
 
Bibliografia Consultada 
BERTOLETI, P. Controle de velocidade de motor DC com PWM no Arduino UNO. 
Filipeflop, 8 jan. 2019. Disponível em: Acesso: 07 jan. 2022. 
MATTEDE, H. IHM – O que é e para que serve!. Mundo da Elétrica. Displonível em: 
 Acesso: 07 jan. 
2022. 
https://www.mundodaeletrica.com.br/ihm-o-que-e-para-que-serve/a definição de conjuntos básicos de instruções, fornecendo a 
base para o entendimento das futuras programações. 
Bons estudos e até a próxima! 
 
REFERÊNCIAS 
GUIMARÃES, F. Arquitetura de um microcontrolador – Aula 3 – MC. Mundo Projetado, 
30 jan. 2020. Disponível em: Acesso: 05 jan. 2022 
 
REFERÊNCIAS COMPLEMENTARES 
KENSHIMA, G. Diferenças entre microcontrolador e microprocessador. Filipeflop, 29 
jan. 2021. Disponível em Acesso: 05 jan.2022. 
CARDOSO, M. O Que É Um Microcontrolador? Capitulo estudantil de robótica e 
automação, 23 set. 2020. Disponível em: Acesso: 05 jan.2022 
 
 
 
 
 
 
 
 
 
 
2 CARACTERÍSTICAS DOS MICROCONTROLADORES 
Olá, estudante! 
Neste bloco serão apresentaremos o funcionamento dos registradores e acesso à 
memória, os conceitos de instruções lógicas e, por fim, a definição das portas I/O do 
PIC e do Arduino. 
Vamos lá?! 
 
2.1 Registradores e acesso à memória 
Os registradores (SFR – Special Function Regiters) são posições da memória que 
recebem nomes específicos e têm função bem definida: guardar a configuração e o 
estado de funcionamento atual do microcontrolador. 
Normalmente, cada bit do registrador tem uma função específica. Assim, 
temos um registrador para definir se as portas são de entrada ou de saída, ativar e 
desativar interrupções, apresentar o estado da CPU etc. 
Os principais registradores do PIC12F675 e seus respectivos endereços, em 
hexadecimal, são: 
 TMR0 (01H) – armazena a contagem do timer. Sempre que este contador 
chegar a zero e o INTCON estiver ativado, a interrupção de timer 0 será ativada. 
 STATUS (03H) – mostra o estado interno da CPU. 
 GPIO (05H) – apresenta o estado dos pinos de entrada/saída. 
 INTCON (0BH) – ativa/desativa o conjunto de todas as interrupções e cada uma 
delas de forma independente. 
 CMCON (19H) – apresenta o estado das entradas e da saída do comparador 
interno. 
 ADCON (1FH) – apresenta o estado do conversor A/D. 
 TRISIO (85H) – define se os pinos de entrada/saída atuarão como entrada ou 
como saída (individualmente). 
 ANSEL (9FH) – seleciona o estado de cada um dos pinos de entrada/saída 
quanto à sua operação como pino analógico ou digital. 
 
Já no Arduino, os comandos para registradores são baseados na linguagem C. 
Utilizaremos três tipos específicos de registradores: 
 PORTx: registrador de dados, usado para escrever no port ou pino em 
específico e x representa os ports disponíveis no microcontrolador, que no caso 
do ATMega328p, são os ports B, C e D: 
 
Fonte: Madeira, Link . 
Figura 2.1 – Registrador PORTB. 
 
Para definir um pino como alto, devemos estabelecer seu respectivo bit do registrador 
PORT como 1 e para defini-lo como baixo, estabelecê-lo como 0. 
 
 DDRx: registrador de direção, usado para ler a entrada de um port ou pino em 
específico. No caso do ATMega328p, x representa os ports B, C e D. 
 
 
Fonte: Madeira, Disponível em: . 
Figura 2.2 – Registrador DDRB. 
 
Para definir um pino como saída devemos estabelecer seu respectivo bit do registrador 
DDR como 1 e para defini-lo como entrada estabelecê-lo como 0. 
 
 PINx: endereço de entrada do pino, usado para configurar um port inteiro ou o 
pino será entrada ou saída. 
 
Fonte: Madeira. Disponível em: . 
Figura 2.3 – Registrador PINB. 
 
2.2 Instruções Lógicas, Aritméticas e de Controle 
As principais instruções lógicas são: 
 OR 
 AND 
 XOR 
 NOT 
A lógica OR segue o princípio de operação em que, se pelo menos uma entrada for 1, a 
saída será 1. Dessa forma, a única forma da saída ser 0 é quando todas as entradas 
forem 1. 
Fonte: Pérez, 2019. Disponível em: . 
Figura 2.4 – Tabela verdade e diagrama esquemático para a lógica OR. 
 
A lógica AND segue o princípio de operação em que se pelo menos uma entrada for 0 a 
saída será 0, dessa forma, a única forma da saída ser 1 é quando todas as entradas 
forem 1. 
 
Fonte: Pérez, 2019. Disponível em: 
Figura 2.5 – Tabela verdade e diagrama esquemático para a lógica AND. 
 
A lógica XOR segue o princípio de operação em que para que a saída seja 1, as entradas 
devem ser diferentes, se elas forem iguais a saída será 0. 
 
Fonte: Pérez, 2019. Disponível em: . 
Figura 2.6 – Tabela verdade e diagrama esquemático para a lógica XOR. 
 
A lógica NOT segue o princípio de operação em que a entrada é invertida, dessa forma, 
se a entrada for 1, a saída será 0, e se a entrada for 0, a saída será 1. 
 
Fonte: Pérez, 2019. Disponível em: . 
Figura 2.7 – Tabela verdade e diagrama esquemático para a lógica NOT. 
 
2.3 Funções Especiais e I/O 
As portas I/O são portas de entrada e saída de dados, cujo valores alternam entre “0” e 
“1”. Tanto no PIC quanto no Arduino, essas portas devem ser definidas de acordo com 
a aplicação do microcontrolador. 
 
 
PIC 
O PIC possui cinco grupos de portas disponíveis (A, B, C, D, E) e cada porta tem três 
registradores associados à configuração 
 Registrador TRIS: configura o sentido do fluxo de dados de uma determinada 
porta. 
 Registrador PORT: escreve e lê o nível dos pinos associados a uma porta. 
 Registrador LAT: armazena o valor do último comando de escrita. 
 
O registrador TRIS tem 8 bits, sendo cada elemento correspondente à configuração de 
um determinado pino de I∕O, sendo: 
 0 – saída (output) 
 1 – entrada (input) 
 
Sintaxe: 
TRISx = valor 
 
Sendo: 
x = nome da porta (letra maiúscula) 
valor = valor de 8 bits (0 – saída e 1 – entrada) 
Exemplo: 
Fonte: Bastos. Disponível em: . 
Figura 2.8 – Exemplo do registrador TRISB sendo preenchido com o número 
0b00000001. 
 
O status dos pinos das portas é armazenado no registrador PORT. Ele possui um 
tamanho de 8 bits, sendo responsável pelas operações de escrita e leitura dos pinos 
relacionados às portas. Sendo 0 – Vss e 1 – Vcc. 
 
Sintaxe: 
PORTx = valor 
Valor = PORTx 
 
Sendo: 
x = nome da porta (letra maiúscula) 
valor = valor de 8 bits (0 – saída e 1 – entrada) 
Exemplo: 
Suponha que todos os pinos da porta B estejam configurados como saída (TRISB = 
00x0), então podemos selecionar os pinos na porta do PIC, conforme abaixo: 
PORTB = 0b00100101. 
 
Fonte: Bastos. Disponível em: . 
Figura 2.9 – Exemplo da porta B sendo configurada com o número 0b00100101. 
 
Arduino 
As placas Arduino possuem dois tipos de portas, analógica e digital. As portas 
analógicas são capazes de receber ou enviar tensões entre 0 a 5V. Já as portas digitais 
trabalham de forma binária, ou seja, elas podem receber ou enviar 0 ou 5V. Todas as 
portas analógicas e digitais podem ser configuradas como input ou output utilizando o 
comando pinMod. 
Sintaxe: 
pinMode(Porta,Mode); 
 
Onde: 
Porta = Número da porta analógica ou digital correspondente 
Mode= Define se a porta é uma entrada ou saída. INPUT = entrada, OUTPUT = saída. 
 
Exemplo 1: Defina a porta digital 3 como entrada: 
pinMode(3,INPUT). 
 
Exemplo 2: Defina a porta analógica 0 como saída 
pinMode(A0,OUTPUT). 
 
Conclusão 
Caro estudante, a partir desse bloco, você conheceu o funcionamento de registradores 
e acesso à memória e os conceitos de instruções lógicas. 
Por fim, foram explicadas as portas I/O e os comandos para configurá-las, tanto no PIC 
como no Arduino. 
Bons estudos e até a próxima! 
 
Bibliografia Consultada 
KENSHIMA, G. Uso de registradores na IDE Arduino. Filipeflop, 19 mar. 2021. 
Disponível em: Acesso: 05 jan. 2022. 
MADEIRA,D. Arduino – Entradas e saídas digitais – Pinos digitais. Vida de Silício. 14 
maio 2017. Disponível em: . 
PÉREZ, A. Práticas e código de exemplo para obter instruções lógicas Arduino Uno 
(MIC183). Instituto NCB, 2019. Disponível em 
 Acesso: 05 jan. 2022. 
https://www.filipeflop.com/blog/uso-de-registradores-na-ide-arduino/
https://www.filipeflop.com/blog/uso-de-registradores-na-ide-arduino/
https://www.newtoncbraga.com.br/index.php/microcontroladores/138-atmel/16295-praticas-e-codigo-de-exemplo-para-obter-instrucoes-logicas-arduino-uno-mic183.html
https://www.newtoncbraga.com.br/index.php/microcontroladores/138-atmel/16295-praticas-e-codigo-de-exemplo-para-obter-instrucoes-logicas-arduino-uno-mic183.html
https://www.newtoncbraga.com.br/index.php/microcontroladores/138-atmel/16295-praticas-e-codigo-de-exemplo-para-obter-instrucoes-logicas-arduino-uno-mic183.html
PICORETI, R. Entrada e Saída – Manipulando Registradores. Vida do silício. 14 mai. 
2017. Disponível em: . Acesso: 05 jan. 2022. 
SOUZA, F. Curso Arduino – Operadores. FBS Eletrônica, 06 out. 2014. Disponível em: 
 
Acesso em: 05 jan. 2022. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
https://portal.vidadesilicio.com.br/entrada-e-saida-manipulando-registradores/
https://portal.vidadesilicio.com.br/entrada-e-saida-manipulando-registradores/
https://fbseletronica.wordpress.com/2013/05/26/curso-arduino-operadores/
 
3 APLICAÇÃO DE MICROCONTROLADORES 
Olá, estudante! 
Neste bloco apresentaremos as famílias do PIC e do Arduino, juntamente com as 
especificações e caraterísticas dos modelos disponíveis. Em seguida, será listado o 
conjunto (set) de instruções disponível para o PIC e para o Arduino. Por fim, serão 
explicados os ambientes de programação, compilação e gravação do PIC e do Arduino. 
Vamos lá?! 
 
3.1 Famílias de microcontroladores 
Há uma grande variedade de microcontroladores disponíveis comercialmente. 
Podemos classificar esses microcontroladores de acordo com a largura do seu 
barramento, repertório de instruções, arquitetura de memória, e localização da 
memória. Para uma mesma família de microcontroladores, podemos ter variações 
nestes itens. 
Quanto à quantidade de bits disponíveis nos registradores de operação 
lógico-aritméticas, temos tipicamente microcontroladores de 4, 8, 16 e 32 bits. Quanto 
maior a quantidade de bits, maior é a precisão dos cálculos 
numéricos. Microcontroladores de 32 bits são tipicamente usados nos dispositivos 
médicos, de controle e de automação de escritório e secretariado. 
Quanto ao repertório de instruções, temos microcontroladores de arquitetura CISC (
Complex Instruction Set Computer) e de arquitetura RISC (Reduced Instruction Set 
Computer). Na arquitetura CISC o uso do espaço de memória é otimizado por ter 
menos instruções por programa. Na arquitetura RISC, o tempo de execução é 
usualmente menor por padronizar as microinstruções (propicia pipeline) e reduzir a 
quantidade de ciclos de relógio por instrução. 
Quanto à arquitetura de memória, distinguem-se a arquitetura von Neumann 
(Princeton) e a arquitetura Harvard. A arquitetura Harvard é a clássica e a de Princeton 
evita hazards estruturais em pipeline. 
Finalmente, quanto à localização da memória, há microcontroladores com as unidades 
de memória principal embutidas num mesmo chip e existem microcontroladores, 
como o 8031, com memória principal externa. 
Extem, também, diversos modelos de placas arduinos, cada uma com as suas 
características e funcionalidades próprias. Entre os modelos existentes, destacam-se: 
 
Arduino Uno: A placa mais básica disponível, possui um bom número de portas digitais 
e analógicas, além de ser compatível com diversos componentes e sensores. Dessa 
forma, o arduino uno é muito utilizado por iniciantes e estudantes para estudos e 
testes. 
Processador: ATMEGA328. 
Portas digitais: 14. 
Portas de PWM: 6. 
Portas Analógicas: 6. 
Alimentação: 5V. 
 
Arduino Mega 2560: Essa placa é uma versão maior da placa Arduino Uno, ambas 
possuem características de processamento semelhantes, entretanto, o Arduino Mega 
2560 possui mais portas analógica e digitais. Dessa forma, ele é ideal para aplicações 
que utilizam diversos sensores. 
Processador: ATmega2560 
Portas digitais: 54 
Portas de PWM: 15. 
Portas Analógicas: 15. 
Alimentação: 5V. 
Arduino Due: Essa é a placa que possui maior capacidade de processamento. Em 
questão de número de portas, ela possui o mesmo número do que o arduino Mega 
2560, entretanto, a sua capacidade superior de processamento torna essa placa ideal 
para aplicações mais complexas. A sua tensão de operação é de 3,3V, e a grande 
maioria dos componentes e sensores desenvolvidos para trabalhar com as placas 
arduino possuem uma tensão de operação de 5V. Dessa forma, ao utilizar a placa 
Arduino Due, é necessário prestar atenção na comunicação entre a placa e os 
componentes, para evitar danos a placa. 
Processador: ARM. 
Portas digitais: 54. 
Portas de PWM: 12. 
Portas Analógicas: 12. 
Alimentação: 3.3V. 
 
Arduino Nano: Essa placa é uma das menores placas arduino disponível, o seu nível de 
processamento é semelhante ao do arduino uno, entretanto ela é significativamente 
menor e possui menos portas digitais e analógicas. Essa placa é ideal para aplicações 
pequenas e simples, permitindo o desenvolvimento de projetos portáteis. 
Processador: ATmega32. 
Portas digitais: 22. 
Portas de PWM: 6. 
Portas Analógicas: 8. 
Alimentação: 5V. 
 
 
 
 
 
3.2 Set de instruções 
3.2.1 Instruções no PIC 
No PIC 12F675, todas as suas operações lógicas e aritméticas estão relacionadas com o 
registrador W. Essas operações podem ser realizadas entre os dados presentes no 
registrador W e outros registradores do PIC. Diversos periféricos podem ser usados 
com este microcontrolador, esses periféricos são gerenciados por registradores 
especiais, chamados SDR (Special Function Registers). Os SFRs devem ser ajustados 
regularmente antes de serem usados, principalmente entre longos ciclos. 
Os SFRs são organizados em dois blocos de memória, Banco de Memória 0 e Banco de 
Memória 1, dessa forma, antes de utilizar os SFRs é necessário selecionar o bloco de 
memória correto, utilizando o bit 5 do registrador STATUS. 
Algumas funções e modos de operação do PIC12F675 não podem ser configurados 
pelo firmware, dessa forma, eles devem ser alterados durante a programação. Para 
realizar essas modificações, é necessário utilizar instruções específicas incluídas no 
programa fonte, criadas especialmente para essa finalidade. 
Detalhando as instruções temos: 
 ADDW F – (add file em work) adiciona os conteúdos dos registradores W e F. 
 ANDWF – (and file e work) executa a operação E (and) lógica entre os 
conteúdos dos registradores W e F. 
 CLRF – (clear file) carrega o valor 0 no registrador F. 
 CLRW – (clear work) carrega o valor 0 no registrador W. 
 COMF – (complement file) complementa (inverte bit a bit) o conteúdo do 
registrador F. 
 DECF – (dec file) decrementa (subtrai um) do conteúdo do registrador F. 
 DECFSZ – (dec file, skip se zero) decrementa (subtrai um) do conteúdo do 
registrador F e não executa (pula) a próxima instrução se o resultado do 
incremento for igual 0. 
 INCF – (inc file) incrementa (soma um) o conteúdo do registrador F. 
 INCFSZ – (inc file, skip se zero) incrementa (soma um) ao conteúdo do 
registrador F e não executa (pula) a próxima instrução se o resultado do 
incremento for igual 0. 
 IORWF – (W or file) executa a operação OU (or) lógicaentre os conteúdos dos 
registradores W e F. 
 MOVF – (move file para W) move o valor do registrador F para o registrador W. 
 MOVWF – (move W para F) copia o conteúdo do registrador W para o 
registrador F. 
 NOP – (no operation) nenhuma operação é executada, apenas gasta um ciclo 
de máquina. 
 RLF – (rotate left file) rotaciona à esquerda o conteúdo do registrador F. 
 RRF – (rotate rigth file) rotaciona à direita o conteúdo do registrador F. 
 SUBWF – (sub f de W) subtrai o conteúdo do registrador F do registrador W e 
armazena o resultado em W. 
 SWAPF – (troca file) troca os 4 bits mais significativos com os 4 bits menos 
significativos de F. 
 XORWF – (WXORF) executa a operação “ou exclusivo” (xor) lógica entre os 
conteúdos dos registradores W e F e armazena em W. 
 BCF – (bit clear file) ajusta o bit b do registrador f para nível baixo (0). 
 BSF – (bit set file) ajusta o bit b do registrador f para nível alto (1). 
 BTFSC – (bit teste file, skip se clear) testa o bit b do registrador f e não executa 
a próxima instrução se ele estiver em nível baixo (0). 
 BTFSS – (bit teste file, skip se set) testa o bit b do registrador f e não executa a 
próxima instrução se ele estiver em nível baixo (1). 
 ADDLW – (add literal a W) o conteúdo do registrador W é somado a uma 
constante k de 8 bits e o resultado é guardado no registrador W. 
 ANDLW – (and literal e W) executa a operação E (and) lógica entre o 
conteúdo do registrador W e uma constante k de 8 bits e armazena o 
resultado em W. 
 CALL – chamada uma sub-rotina. 
 CLRWDT – (clear wdt) carrega o valor 0 no temporizador do watchdog timer. 
 GOTO – salto incondicional para outro local no programa. 
 IORLW – (or literal ou W) executa a operação OU (or) lógica entre o conteúdo 
do registrador W e uma constante k de 8 bits e armazena o resultado em W. 
 MOVLW – (move literal para W) carrega uma constante k de 8 bits no 
registrador W. 
 RETFIE – retorno de uma rotina de interrupção. 
 RETLW – retorno de uma sub-rotina com o carregamento de uma constante k 
de 8 bits (literal) no registrador W. 
 RETURN – retorno de uma sub-rotina. 
 SLEEP – coloca o processador no modo de baixo consumo. 
 SUBLW – subtrai o literal de 8 bits do conteúdo do registrador W e armazena o 
resultado no registrador W. 
 XORLW – executa a operação “ou exclusivo” (xor) lógica entre o conteúdo do 
registrador W e uma constante k de 8 bits (literal). 
 
3.2.2 Instruções no Arduino 
A linguagem de programação do Arduino pode ser dividida em três partes principais: 
estruturas, valores (variáveis e constantes) e funções. 
Funções 
Para controlar a placa Arduino e realizar computações. 
 
Entradas e Saídas Digitais 
digitalRead() 
digitalWrite() 
pinMode() 
 
Entradas e Saídas Analógicas 
analogRead() 
analogReference() 
analogWrite() 
 
Apenas Zero, Due e Família MKR 
analogReadResolution() 
analogWriteResolution() 
 
Entradas e Saídas Avançadas 
noTone() 
pulseIn() 
pulseInLong() 
shiftIn() 
shiftOut() 
tone() 
Funções Temporizadoras 
delay() 
delayMicroseconds() 
micros() 
millis() 
 
Funções Matemáticas 
abs() 
constrain() 
map() 
max() 
min() 
pow() 
sq() 
sqrt() 
 
Funções Trigonométricas 
cos() 
sin() 
tan() 
 
Caracteres 
isAlpha() 
isAlphaNumeric() 
isAscii() 
isControl() 
isDigit() 
isGraph() 
isHexadecimalDigit() 
isLowerCase() 
isPrintable() 
isPunct() 
isSpace() 
isUpperCase() 
isWhitespace() 
 
Números Aleatórios 
random() 
randomSeed() 
 
Bits e Bytes 
bit() 
bitClear() 
bitRead() 
bitSet() 
bitWrite() 
highByte() 
lowByte() 
 
Interrupções Externas 
attachInterrupt() 
detachInterrupt() 
 
Interrupções 
interrupts() 
noInterrupts() 
 
Comunicação 
Serial 
Stream 
 
USB 
Keyboard 
Mouse 
 
Variáveis 
Tipos de dados e constantes da linguagem Arduino. 
 
Constantes 
HIGH | LOW 
INPUT | OUTPUT | INPUT_PULLUP 
LED_BUILTIN 
 
true | false 
Constantes de Ponto Flutuante 
Constantes Inteiras 
Conversão 
byte() 
char() 
float() 
int() 
long() 
word() 
 
 
Tipos de Dados 
bool 
boolean 
byte 
char 
double 
float 
int 
long 
short 
size_t 
string 
String() 
unsigned char 
unsigned int 
unsigned long 
vetor 
void 
word 
 
Escopo de Variáveis e Qualificadores 
const 
escopo 
static 
volatile 
 
Utilitários 
PROGMEM 
sizeof() 
 
Estruturas 
Os elementos da linguagem Arduino (C++). 
 
Sketch 
loop() 
setup() 
 
Estruturas de Controle 
break 
continue 
do...while 
else 
for 
goto 
if 
return 
switch...case 
while 
 
Outros Elementos da Sintaxe 
#define (define) 
#include (include) 
/* */ (comentário em bloco) 
// (comentário) 
; (ponto e vírgula) 
{} (chaves) 
 
Operadores Aritméticos 
% (resto) 
* (multiplicação) 
+ (adição) 
- (subtração) 
/ (divisão) 
= (operador de atribuição) 
 
Operadores de Comparação 
!= (diferente de) 
 (maior que) 
>= (maior que ou igual a) 
 
Operadores Boleanos 
! (NÃO lógico) 
&& (E lógico) 
|| (OU lógico) 
 
 
Operadores para Ponteiros 
& (referência) 
* (desreferência) 
 
Operadores Bitwise 
& (E) 
> (deslocamento à direita) 
^ (OU EXCLUSIVO) 
| (OU) 
~ (NÃO) 
 
Operadores de Atribuição Composta 
%= (compound remainder) 
&= (atribuição por e) 
*= (atribuição por multiplicação) 
++ (incremento) 
+= (atribuição por adição) 
-- (decremento) 
-= (atribuição por subtração) 
/= (atribuição por divisão) 
^= (atribuição por ou exclusivo) 
|= (atribuição por ou) 
3.3 Ambientes de Programação, Compilação e Gravação 
Para programar, compilar e gravar os códigos de PIC e Arduino é necessário utilizar o 
seu respectivo IDE (Integrated Development Environment). Para o PIC, normalmente é 
utilizado o MPLAB IDE e para o Arduino, o IDE Arduino. 
 
3.3.1 MPLAB IDE 
O MPLAB IDE é um software gratuito oferecido pela empresa Microchip Technology. 
Ele gerencia projetos e ambientes de programação e foi desenvolvido especialmente 
para programação, simulação e gravação de microcontroladores PIC. 
O MPLAB IDE é capaz de trabalhar com diversos modelos de PIC, ele possui 
ferramentas de linguagem que facilitam a sua programação. As linguagens de 
programação que podem ser usadas nesse software são assembly, C ou linguagem 
BASIC. Os códigos escritos são compilados em linguagem hexadecimal, em seguida, o 
código executável, que irá determinar o comportamento do PIC, pode ser gravado no 
equipamento desejado. Para facilitar a detecção de possíveis erros, o MPLAB IDE 
possui debugger como o MPLAB SIM ou ferramentas externas como o Proteus e o 
Matlab, permitindo simular a aplicação do PIC sem a necessidade de montar o sistema 
fisicamente. Além disso, através de equipamentos externos como o MPLAB ICD2, 
MPLAB ICE 200 e PICKIT 2, é possível realizar o debug no próprio PIC, tendo acesso aos 
seus registradores e às suas memórias, permitindo observar o seu comportamento 
durante o seu uso. Para o desenvolvimento de códigos de programação, o MPLAB 
conta com uma interface que permite a criação do código, a detecção de erro e a 
programação direta do PIC através da porta serial ou usb, utilizando equipamentos 
externos como o MPLAB ICD2, MPLAB ICE 200 e PICKIT2. 
Os modelos suportados pelo MPLAB IDE são: 10, 12, 16, 17, 18, 24, 30 e 32 bit, HCS e 
SEE. Entre esses modelos, os mais utilizados são os pics 16f84, 16f628, 16f877, 18f452 
e 18f4550. Entre esses modelos, o Pic 16f84 é muito utilizado por estudantes pois seu 
número de pinos e funções são reduzidos, permitindo projetos simples e didáticos. Já o 
Pic16f628 é muito utilizado em projetos devido a sua versatilidade e flexibilidade. 
3.3.2 IDE Arduino 
O Arduino IDE é um software gratuito oferecido pela empresa Arduino em seu próprio 
site. Esse software foi desenvolvido para facilitar na criação e gravação de códigosem 
todos os modelos de placas Arduino. Ele foi projetado para ser usado pelos sistemas 
operacionais Widows e Linux e é de fácil instalação e manuseio. 
O Arduino IDE é capaz de programar todas as placas Arduinos, basta selecionar a placa 
utilizada e carregar o código, além disso, o software é capaz também de detectar 
problemas durante a programação e ainda, apontar onde estes problemas estão 
ocorrendo, facilitando a sua correção. 
Além do Arduino IDE, é possível programar as placas arduino através da plataforma 
online desenvolvida pela empresa Arduino. Este método evita a necessidade de 
instalar o software no computador e pode ser utilizado por qualquer máquina, 
entretanto é necessário estar conectado à internet. 
O Arduino IDE possui um layout simples e intuitivo, todas as suas fermentas são 
organizadas e de fácil acesso, além de serem bem documentadas, facilitando a criação 
de projetos. 
Para obter o Arduino IDE basta acessar o site do Arduino e realizar o download para o 
sistema operacional correspondente, em seguida o software deve ser instalado. Ao fim 
da instalação, o software poderá ser utilizado gratuitamente quantas vezes o usuário 
quiser, mesmo offline. Ao iniciar o software, ele irá buscar automaticamente a versão 
mais recente disponível, se houver, esta versão poderá ser baixada e instalada 
automaticamente. 
 
Conclusão 
Caro estudante, a partir desse bloco, você pôde conhecer as famílias do PIC e do 
Arduino, incluindo suas principais características e diferenças. Em seguida, o Set de 
instruções do PIC do Arduino foi listado e explicado. 
Por fim, foram apresentados os ambientes de programação, compilação e gravação 
MPLAB IDE e IDE Arduino. 
Bons estudos e até a próxima! 
 
BIBLIOGRAFIA CONSULTADA 
SHIN-TING, W.; OLIVEIRA, J. R. Microcontroladores. 2019. Disponivel em 
 
Acesso: 06 jan. 2022. 
STRAUB, M. G. Arduino IDE – O Software para Gravação de Códigos no Arduino. 
Usinainfo eletrônica e robótica, 24 out. 2019. Disponível em 
. Acesso: 06 jan. 2022. 
THOMSEN, A. Qual Arduino Comprar? Conheça os Tipos de Arduino. Filipeflop, 03 fev. 
2014. Disponível em: Acesso: 06 jan. 2022. 
 
 
 
 
 
 
 
 
 
 
 
4 CONFIGURAÇÃO E CODIFICAÇÃO 
Olá, estudante! 
Neste bloco serão apresentados os funcionamentos de interrupções e temporizadores, 
de entradas e saídas Digitais, Analógicas, PWM e de conversores A/D e D/A. 
Vamos lá?! 
 
4.1 Interrupções e Temporizadores 
Uma das características notáveis dos microcontroladores, que os distinguem dos 
sistemas computacionais convencionais, é a sua “intimidade” com o tempo, para 
poder interagir com o mundo físico em instantes pré-estabelecidos. Todos os 
microcontroladores têm ao menos um sistema de temporização embarcado no seu 
chip. 
O principal componente de um sistema de temporização, em inglês timer, embarcado 
é um contador de corrida livre, em inglês free running counter, de forma totalmente 
independente da CPU. Esse contador é incrementado ciclicamente de 0 até 2n-1 por 
um sinal de relógio, de forma que se consegue computar um intervalo de tempo t pela 
quantidade m de contagem e pelo período fixo T do sinal de relógio: 
t = M * T 
Sendo a contagem máxima de um sistema de temporização dependente da 
quantidade de bits do seu contador, é comum especificar um temporizador por esta 
quantidade. O sinal de Overflow indica que o contador atingiu o valor máximo e o 
contador volta para 0. Esse sinal pode ser usado para contar a quantidade k de ciclos 
completos contados. 
 
Fonte: SHIN-TING & OLIVEIRA, 2019. Link: . 
Figura 4.1 – Componente básico timer. 
 
Supondo que sejam i o valor inicial registrado inicialmente num contador de n bits e j 
o valor final de uma contagem, podemos determinar com precisão a quantidade total 
dos pulsos contados através das seguintes relações: 
 Se o número de ciclos completos for 0: m = j - i pulsos. 
 Se o número de ciclos completos for maior que 0: (2n − 1 – i) + j + 1 = 2n − i + j 
pulsos além dos ciclos completos. 
Somando com os pulsos dos (k-1) ciclos completos, temos no total: 
 m = (k− 1)*(2n) + 2n − i + j = 2n * (k) − i + j pulsos. 
Em diversos timers, a sua fonte do sinal de relógio é configurável. Ela pode ser o 
mesmo sinal de relógio do microprocessador ou um derivado deste sinal. A técnica de 
divisor de frequência é a mais utilizada para gerar sinais de frequências menores. A 
fonte do sinal de relógio do contador pode ser também externa. Neste caso, a 
frequência de contagem pode ser até aperiódica. Visando à redução do consumo de 
energia, deve-se parar o contador do timer quando ele não é mais necessário. 
Adicionalmente, os temporizadores são projetados para gerarem interrupções ou ticks 
com base nos eventos especificados. Exemplos destes eventos são “estouro” ou 
“contagem atingir um valor pré-definido”. Isso torna viável, por software, medir o 
intervalo de tempo entre dois eventos, ou controlar precisamente o tempo de duração 
do estado de um dispositivo. 
Um temporizador que existe em todos os microcontroladores é o temporizador 
watchdog, em inglês watchdog timer. Este temporizador é responsável por disparar 
um reset ao sistema quando ocorre um estouro na sua contagem. Isso garante que o 
sistema consiga sair de uma condição de falha ou de erro numa emergência. Por isso, 
quando esse temporizador estiver ativado precisaremos periodicamente zerar o seu 
contador para evitar resets emergenciais. 
O mecanismo de interrupção implementado nos microcontroladores é uma solução 
eficiente para compatibilizar um microcontrolador com o mundo físico. Ele provê uma 
forma eficiente tanto para capturar as variações “inesperadas” nos estados dos 
periféricos quanto para respondê-las, desviando automaticamente do fluxo corrente 
de execução para uma rotina de serviço de interrupção pré-definida (Interrupt Service 
Routine - ISR). Os sinais assíncronos (em relação ao relógio do sistema) oriundos dos 
periféricos e capazes de interromper o fluxo de execução corrente são chamados de 
requisições de interrupções, em inglês interrupt request (IRQ). Podemos distinguir 
três formas de ativação de interrupção, conforme as características desses sinais 
detectáveis pelos circuitos eletrônicos. 
 Gatilhos por nível: quando a ativação é por nível lógico (0 ou 1) de um pulso 
com uma largura mínima em tempo. 
 Gatilho pela borda: quando a ativação é pela borda (de subida ou de descida) 
de um pulso quadrado. 
 Gatilho pela aresta: quando a ativação é por um pulso rápido (de subida ou de 
descida). 
Portas (de entrada) que suportam interrupções incluem nos seus circuitos 
registradores de controle que permitem customizar o tipo de gatilho ao qual os pinos 
são sensíveis. O intervalo de tempo entre o instante em que ocorre uma interrupção e 
o instante em que se inicia a execução da rotina de serviço correspondente é 
conhecida por latência de interrupção. 
 
4.2 Entradas e Saídas: Digitais, Analógicas e PWM 
Para se comunicar com o mundo físico, todos os microcontroladores são providos de 
uma série de pinos. Portas são abstrações de uma série de registradores embutidos 
nos microcontroladores, que permitem que um software/firmware controle 
modifique ou leia os estados dos pinos individualmente. A correspondência entre os 
pinos e os bits das portas é biunívoca, ou seja, cada pino é controlado por um bit de 
uma porta. Os pinos do microcontrolador podem trabalhar com sinais digitais, 
analógicos e PWM. 
Sinais digitais são aqueles que não variam continuamente no tempo, mas sim em 
saltos entre valores bem definidos. 
Sinais analógicos são aqueles que, ao contrário dossinais digitais, variam 
continuamente dentro de uma faixa de valores. 
Os circuitos e equipamentos elétricos ditos digitais trabalham com apenas dois valores 
de tensão definidos: 
 Um nível lógico alto. 
 Um nível lógico baixo. 
Na prática, não é necessário o pino receber exatamente um valor de tensão especifico 
para ser considerado alto ou baixo, existe uma faixa de tensão em que, se o valor 
estiver dentro dela, o microcontrolador irá automaticamente entender o seu nível. 
Além disso, existe uma faixa entre os dois níveis, em que o microcontrolador não é 
capaz de determinar se é alto ou baixo, gerando valores aleatórios e é importante 
evitar essas faixas sempre que possível. 
Ao configurar uma porta do micocontrolador como uma entrada digital, ela irá adquirir 
uma característica chamada alta impedância. Nesse modo, qualquer variação de 
corrente, mesmo que pequena, pode alterar o seu estado, permitindo ao 
microcontrolador determinar o nível lógico que a entrada se encontra. Isso pode ser 
usado para monitorar botões, foto acopladores ou outros tipos de sensores, 
permitindo ao microcontrolador tomar decisões de acordo com os níveis lógicos das 
suas entradas digitais. 
Ao configurar uma entrada digital, mas não ligar nada nela, o seu nível lógico pode 
ficar oscilando aleatoriamente. Isso ocorre pois a porta pode captar ruídos elétricos do 
ambiente, e devido à alta impedância da entrada, esses ruídos podem ser o bastante 
para alterar o nível lógico da porta, gerando um comportamento imprevisível e 
indesejado. Para evitar esse problema é necessário utilizar uma resistência de pull-
down ou de pull-up ligado nas entradas. Essas resistências garantem um nível lógico 
constante quando não há nada ligado na entrada, dessa forma, o nível lógico apenas 
irá mudar quando for necessário. 
Fonte: Arduíno Portugal, 2017. Link . 
Figura 4.2 – Resistência de pull-down e de pull-up. 
 
Ao configurar uma entrada digital como uma saída, ela pode fornecer 0 ou 5 V, 
dependendo do código carregado no microcontrolador. A corrente máxima fornecida 
pelo micocontrolador pode variar dependendo do modelo, mas normalmente é de 
30mA. Com esta corrente é possível ligar componentes simples como LEDs e alguns 
sensores. Entretanto, equipamentos mais exigentes, como alguns modelos de 
motores, necessitam de uma corrente maior. Se eles forem ligados diretamente, 
podem causar danos ao microcontrolador. 
Assim como outros microcontroladores, o Arduino possui um conversor A/D capaz de 
converter os sinais analógicos gerados por sensores em sinais digitais. O conversor do 
Arduino possui uma resolução de 10 bits, aplicado em uma faixa de 0 a 5V. Ou seja, o 
conversor é capaz de dividir o valor de 5V em 1024 pedaços e determinar em qual 
posição um valor de tensão entre 0 a 5V se encontra. 
O PWM (Pulse Width Modulation) é uma forma de gerar um sinal analógico utilizando 
uma saída digital. Ao controlar o valor do duty cycle do sinal digital, é possível variar o 
valor de tensão da saída, permitindo controlar aspectos de alguns componentes, como 
o brilho de um LED ou a velocidade de um motor. O duty cycle é o tempo em que o 
sinal digital permanece em 5V. No Arduino, um duty cycle de 0% é equivalente a uma 
saída de tensão de 0V, já um duty cycle de 100% é equivalente a uma saída de tensão 
de 5V. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Fonte: 2017. Disponível em: . 
Figura 4.3 – Exemplos de Duty Cycle. 
 
O duty cycle é a razão do tempo em que o sinal permanece na tensão máxima (5V no 
Arduino) sobre o tempo total de oscilação. 
 
 
 
 
 
 
 
 
 
 
Fonte: 2017. Disponível em: . 
Figura 4.4 – Variáveis que compõem o Duty Cycle. 
 
Duty Cycle (%) = (x/x+y)*100% = (x/T)*100% 
Vmédio = Vmax*Duty Cycle(%) 
 
4.3 Conversores A/D e D/A 
Um conversor A/D é capaz de converter um sinal analógico, que é um sinal contínuo 
no tempo, em um sinal amostrado, que é um sinal discreto no tempo. Os limites do 
sinal amostrado coletado dependem da resolução do conversor em bits, um conversor 
de 8 bits é capaz de transformar o sinal analógico em valores entre 0 a 255. 
Um conversor A/D pode converter sinais analógico entre 0 a 5V, ou 0 a 3,3V, 
entretanto, normalmente o sinal analógico gerado por sensores ou outros 
componentes, não gera essas variações. Dessa forma, os sinais analógicos devem ser 
condicionados através de circuitos passivos ou ativos para se encaixarem nessa faixa, 
gerando a maior resolução possível. 
Após condicionar o sinal, ele passa por um circuito chamado Sample & Hold. Esse 
circuito mantém o sinal estável até que o conversor termine de convertê-lo para um 
sinal digital. 
Ao dimensionar um conversor A/D, é necessário verificar se as suas características 
atendem às necessidades do projeto. As especificações mais importantes são: 
 Conversor interno ao processador ou externo. 
 Taxa de amostragem. 
 Número de bits de resolução. 
 Número de bits de precisão ou bits efetivos. 
 Relação sinal/ruído. 
 Linearidade. 
 Necessidade de se utilizar Sample & Hold externo. 
 Necessidade de utilizar um filtro analógico de anti-aliasing. 
 Preço. 
O conversor DA (DAC) aceita como entrada dados digitais e produz uma saída 
analógica, que é relacionada com o código digital de entrada. Um registrador é usado 
para armazenar a entrada do DAC e assegurar que sua saída fique estável até que o 
conversor seja alimentado por outra entrada digital. Ele pode ser externo ou fazer 
parte do DAC. Cada palavra digital (número de bits em paralelo) é convertida no 
tempo. Filtros podem ser usados para suavizar ou restaurar o sinal analógico em sua 
saída. 
Fonte: Lima. Disponível em: . 
Figura 4.5 – Exemplo de uma conversão D/A. 
Resolução de um conversor Digital/Analógico está associado ao número de bits do 
conversor. É a menor quantidade (modificação) que pode ser convertida (resolvida) em 
sua saída analógica, resultante de uma alteração na entrada digital. Em geral, para um 
conversor D/A de N bits, o número de níveis diferentes será de 2N, e o número de 
degraus será de 2N – 1. 
Fonte: Lima. Disponível em: . 
Figura 4.6 – Resolução do conversor DA. 
 
Conclusão 
Caro estudante, neste bloco você conheceu o funcionamento de interrupções e 
temporizadores, de entradas e saídas digitais, analógicas, PWM e dos conversores A/D 
e D/A. 
Bons estudos e até a próxima! 
 
Bibliografia Consultada 
SHIN-TING, W.; OLIVEIRA, J. R. Microcontroladores. Faculdade de Engenharia Elétrica e 
de Computação – UNICAMP, 2019. Disponível em: 
. 
Acesso: 06 jan. 2022. 
LIMA, M. E. Conversão Digital Analógico e Analógico Digital. UFPE – Centro de 
Informática. Disponível em: . Acesso: 06 jan. 2022. 
QUAL a diferença entre entradas Digitais, Analógicas e PWM. Arduino Portugal, 10 
maio 2017. Disponível em: Acesso: 06 jan. 2022. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5 PROJETO COM MICROCONTROLADORES I 
Olá, estudante! 
Neste bloco serão demonstrados quatro projetos utilizando a placa Arduino. 
Apresentaremos as características dos equipamentos que serão utilizados, um 
exemplo de como será o código dos projetos e os resultados esperados de uma 
simulação virtual dos projetos. 
Vamos lá?! 
 
5.1 Características e especificações de hardware 
Para os projetos com microcontroladores, será utilizada a placa Arduino, LED, display, 
módulos ADC, ponte de Wheatstone potenciômetro, resistor e botão e strain gauges 
(células de carga). 
 
Placa Arduino Uno 
A placa Arduino sugerida será o Arduino Uno, suas especificações são: 
 Microcontrolador: ATmega328P. 
 Tensão de operação: 5V. 
14 portas digitais. 
 Seis portas analógicas. 
 Clock: 16 MHz. 
 Tamanho: 68,6 X 53,4 mm. 
 
Esta placa foi selecionada devido a sua fácil acessibilidade e baixo custo. Outras placas 
Arduino também podem ser usadas para os projetos, entretanto, deve-se tomar 
cuidado com a tensão de operação da placa, alguns modelos como a placa Arduino 
Due possuem uma tensão de alimentação de 3,3V, isso pode causar resultados 
diferentes do esperado. 
 
Fonte: Arduino. Disponível em: . 
Figura 5.1 – Arduino UNO. 
Módulo ESP 8622 ESP-12E 
Fonte: Autor. 
Figura 5.2 – Esquematização do ESP-12E. 
 
Características 
Módulo ESP8266 ESP12E. 
Rápida e fácil conexão. 
Switch de Radiofrequência. 
Compatível com sistemas microcontrolados. 
Processadores de MAC e Baseband integrados. 
Pode ser utilizado como STA/AP/STA+AP. 
Engine integrada para criptografias WEP, TKIP, AES e WPA. 
Wi-Fi Direct (P2P), soft-AP. 
Antena integrada. 
Protocolo TCP/IP integrado com suporte a IPv4. 
Wi-Fi em frequência de 2.4GHz com suporte a WPA e WPA2. 
Conversor ADC integrado. 
Excelente relação custo x benefício. 
 
Especificações 
Modelo: ESP-12E. 
Chip Principal: ESP8266. 
Tensão de alimentação: 3.3V. 
Potência de saída: 19,5dBm no modo 802.11b. 
Alcance: 90 metros. 
Taxa de dados: 110 - 460800bps. 
Suporte a redes: 802.11 b/g/n. 
Consumo em Standby:5.10 – Displays de 7 segmentos com três dígitos. 
 
5.2 Exemplos de programação 
Serão propostos quatro projetos utilizando a placa Arduino, em cada projeto serão 
utilizadas diferentes partes da placa. Os códigos desenvolvidos deverão ser criados e 
testados utilizando o software gratuito IDE Arduino. 
 
Projeto 1: Leitura de entrada e acionamento de saída digital 
No primeiro projeto deve-se conectar um botão e um LED em duas portas digitais do 
Arduino. Quando o botão for acionado, o Arduino deve ligar o LED. Este projeto tem 
como objetivo praticar o uso de portas digitais, como input e output. 
Segue o código que deve ser desenvolvido para o projeto: 
int led=2; // Define a porta digital 2 como “led” 
int botao=3; // Define a porta digital 3 como “botao” 
int botao_acionado=0; //Cria a variável “botao_acionado” 
void setup() { 
 pinMode(led, OUTPUT); //Define a porta led como um output 
 pinMode(botao, INPUT); //Define a porta botao como um input 
} 
void loop() { 
 botao_acionado=digitalRead(botao); // Define a variável “botao_acionado” de 
acordo com o estado da porta “botao” 
 if (botao_acionado==HIGH) //Se a variável “botão_acionado” for HIGH execute 
 { 
 digitalWrite(led, HIGH); // Define a porta “led” como HIGH 
 } 
 Else // Se a variável “botão_acionado” for LOW execute 
 { 
 digitalWrite(led,LOW); // Define a porta “led” como LOW 
 } 
} 
 
Projeto 2: Leitura de porta analógica com monitor serial 
No segundo projeto, deve-se conectar um potenciômetro em uma porta analógica do 
Arduino, o Arduino deve mostrar no monitor serial o valor coletado pela porta 
analógica. Este projeto tem como objetivo praticar o uso de portas analógicas. 
Segue o código que deve ser desenvolvido para o projeto: 
int pot=A0; // Define a porta analógica 0 como “pot” 
int S1=0; //Cria a variável “S1” 
void setup() { 
 Serial.begin(9600); // Inicia a comunicação serial com um baudrate de 9600 
} 
void loop() { 
 S1=analogRead(pot); // Lê a porta analógica “pot” 
 Serial.println(S1); // Envia pela comunicação serial o valor de “S1” 
} 
 
Projeto 3: Leitura de entrada analógica com acionamento de saída 
No terceiro projeto deve-se conectar um potenciômetro em uma porta analógica e um 
LED na porta digital do Arduino, o Arduino deve acender o LED quando o 
potenciômetro chega na metade do seu valor. Este projeto tem como objetivo praticar 
o uso de portas analógicas em conjunto com as portas digitais. 
Segue o código que deve ser desenvolvido para o projeto: 
int led=2; // Define a porta digital 2 como “led” 
int pot=A0; // Define a porta analógica 0 como “pot” 
int S1=0; //Cria a variavel “S1” 
 
void setup() { 
 Serial.begin(9600); // Inicia a comunicação serial com um baudrate de 9600 
 
 pinMode(led,OUTPUT); //Define a porta led como um output 
} 
 
void loop() { 
 S1=analogRead(pot); // Lê a porta analógica “pot” 
 Serial.println(S1); // Envia pela comunicação serial o valor de “S1” 
 if(S1>(1024/2)) // Se o valor de S1 for maior do que a metade de 1024, onde 
1024 é o maior valor possível para a porta analógica, execute 
 { 
 digitalWrite(led,HIGH); // Define a porta “led” como HIGH 
 } 
 Else // Se o valor for menor do que a metade do valor máximo possível 
 { 
 digitalWrite(led,LOW); // Define a porta “led” como LOW 
 } 
} 
 
Projeto 4: Calibração de célula de carga com ADC 
É importante que o dispositivo de célula de carga tenha um ajuste que permita a 
calibração, neste caso, o ideal é que seja realizado um ajuste em função do lote 
adquirido de células de carga e componentes eletrônicos, portanto se faz necessária a 
previsão de uma calibração via software para que os valores lidos não tenham desvios, 
ou seja, durante os testes, após a montagem, deverão ser identificados os coeficientes 
e estes devem ser inseridos durante a gravação do microcontrolador. 
Esta calibração permite que seja realizada uma interpretação correta entre a 
conversão do ADC e a leitura da(s) célula(s) de carga, sendo os coeficientes definidos 
por meio de uma expressão matemática que descreve o sistema linearizado. Tal 
expressão é obtida pela equação da reta após os ensaios com o lote de amostragem 
que permitirá obter em laboratório os valores de massa versus o sinal obtido. 
Não se pode equivocadamente confundir calibração com ajuste, pois a calibração de 
processo irá ocorrer sempre que for corrigido, por exemplo, as ‘taras’ de balanças, 
enquanto neste caso a calibração representa o ajuste na programação para a leitura 
dos sinais pelo ADC. 
Considerando que o elemento resistivo que compõe a célula de carga, especificamente 
os strain gauges, possuem uma elevada linearidade em sua resposta, é possível 
considerar como uma equação da reta, ou seja, uma expressão linearizada para a 
resposta. 
Todavia, não se deve ter isso como verdade absoluta, dado que é aplicável para a 
célula de carga utilizada neste projeto e que para outros modelos há a possibilidade de 
uma variação em equação minimamente de segundo grau. 
Para a definição dos coeficientes lineares e angulares associados à linearização é 
imprescindível que sejam elaborados, no processo de montagem e testes, os 
procedimentos de testes em laboratório. 
O gráfico de referência utilizado será o da reta, portanto, é possível definir os 
coeficientes e variáveis como: 
o conta_adc = variável que irá receber os valores lidos pelo ADC. 
o coef_lin = coeficiente linear. 
o coef_ang = coeficiente angular. 
 
O coeficiente angular é obtido matematicamente por meio da divisão entre as 
variações da ‘massa’ pela leitura do ADC, neste caso pode ser representado por: 
𝒄𝒐𝒆𝒇𝒂𝒏𝒈 = 
𝒎𝒇 − 𝒎𝒊
𝒄𝒐𝒏𝒕𝒂_𝒂𝒅𝒄𝒇 − 𝒄𝒐𝒏𝒕𝒂_𝒂𝒅𝒄𝒊
 
Em que: 
mf = massa final. 
mi = massa inicial. 
conta_adcf = leitura do ADC para a massa final. 
 
Para determinar o coeficiente linear, consideramos que a variação do eixo das 
coordenadas e do eixo das abcissas tenha ao menos os valores iniciais ou finais 
definidos e conhecidos, neste caso podemos adotar os valores iniciais antes de 
qualquer variação de carga, portanto: 
𝑐𝑜𝑒𝑓𝑎𝑛𝑔 ∙ (𝑥 − 𝑐𝑜𝑛𝑡𝑎_𝑎𝑑𝑐𝑖) = 𝑦 − 𝑚𝑖 
𝑐𝑜𝑒𝑓𝑎𝑛𝑔 ∙ 𝑥 − 𝑐𝑜𝑒𝑓𝑎𝑛𝑔 ∙ 𝑐𝑜𝑛𝑡𝑎_𝑎𝑑𝑐𝑖 = 𝑦 − 𝑚𝑖 
𝑦 = 𝑐𝑜𝑒𝑓𝑎𝑛𝑔 ∙ 𝑥 − 𝑐𝑜𝑒𝑓𝑎𝑛𝑔 ∙ 𝑐𝑜𝑛𝑡𝑎_𝑎𝑑𝑐𝑖 + 𝑚𝑖 
∴ 𝑐𝑜𝑒𝑓𝑙𝑖𝑛 = −𝑐𝑜𝑒𝑓𝑎𝑛𝑔 ∙ 𝑐𝑜𝑛𝑡𝑎_𝑎𝑑𝑐𝑖 + 𝑚𝑖 
 
Considerando o coeficiente linear ‘coeflin’ e adotando ‘le_massa’ para a leitura 
corrigida e ‘conta_adc’ para a leitura do ADC, a equação resultante será: 
𝑙𝑒_𝑚𝑎𝑠𝑠𝑎 = 𝑐𝑜𝑒𝑓𝑎𝑛𝑔 ∙ 𝑐𝑜𝑛𝑡𝑎_𝑎𝑑𝑐 + 𝑐𝑜𝑒𝑓𝑙𝑖𝑛 
 
Rotina para calibração com o HX711 
#include "HX711.h" 
#define DOUT 2 
#define CLK 3 
HX711 peso; // instancia Balança HX711 
float calibration_factor = 34730; // fator de calibração para teste inicial 
void setup() 
{ 
 Serial.begin(9600); 
 peso.begin(DOUT, CLK); // inicializa a balança 
 Serial.println(); 
 Serial.println("Calibracao da Balança"); 
 peso.set_scale(); // configura a escala da Balança 
 zerapeso (); // zera a Balança 
} 
void zerapeso () 
{ 
 Serial.println(); 
 peso.tare(); // zera a Balança 
 Serial.println("Zerando a Balança "); 
} 
void loop() 
{ 
 peso.set_scale(calibration_factor); // ajusta fator de calibração 
 Serial.print("Peso: "); // imprime no monitor serial 
 Serial.print(peso.get_units(), 3); // imprime peso da balança com 3 casas decimais 
 Serial.print(" kg"); 
 Serial.print(" Fator de Calibração: "); // imprime no monitor serial 
 Serial.println(calibration_factor); // imprime fator de calibração 
 delay(500) ; 
 if (Serial.available()) // reconhece letra para ajuste do fator de calibração{ 
 char temp = Serial.read(); 
 if (temp == '+' || temp == 'a') // a = aumenta 10 
 calibration_factor += 10; 
 else if (temp == '-' || temp == 'z') // z = diminui 10 
 calibration_factor -= 10; 
 else if (temp == 's') // s = aumenta 100 
 calibration_factor += 100; 
 else if (temp == 'x') // x = diminui 100 
 calibration_factor -= 100; 
 else if (temp == 'd') // d = aumenta 1000 
 calibration_factor += 1000; 
 else if (temp == 'c') // c = diminui 1000 
 calibration_factor -= 1000; 
 else if (temp == 'f') // f = aumenta 10000 
 calibration_factor += 10000; 
 else if (temp == 'v') // v = dimuni 10000 
 calibration_factor -= 10000; 
 else if (temp == 't') zerapeso (); // t = zera a Balança 
 } 
} 
 
5.3 Simulação em ambiente virtual 
Para simular os projetos propostos, será utilizado o software online gratuito Tinkercad. 
O Tinkercad é uma ferramenta online de design de modelos 3D em CAD e de simulação 
de circuitos elétricos analógicos e digitais, desenvolvida pela Autodesk. 
 
Projeto 1: Leitura de entrada e acionamento de saída digital 
Para simular este projeto devem ser usados os seguintes componentes: 
- 1 Arduino uno. 
- 2 Resistores de 1KΩ. 
- 1 Botão. 
- 1 LED. 
O circuito deve ser montado da seguinte forma: 
 
Fonte: Autor. 
Figura 5.11 – Simulação do projeto um. 
 
O código criado deve ser inserido no campo “código”, na opção “Texto”. 
Ao iniciar a simulação o LED deve ascender quando o botão é pressionado. 
 
Projeto 2: Leitura de porta analógica com monitor serial 
Para simular este projeto devem ser usados os seguintes componentes: 
- 1 Arduino uno. 
- 1 Potenciômetro. 
O circuito deve ser montado da seguinte forma: 
 
 
Fonte: Autor. 
Figura 5.12 – Simulação do projeto 2. 
 
O código criado deve ser inserido no campo “código”, na opção “Texto”. 
Ao iniciar a simulação, no campo “código”, na opção “monitor serial” o Arduino deve 
apresentar o valor lido pela porta analógica A0. 
 
Projeto 3: Leitura de entrada analógica com acionamento de saída 
Para simular este projeto, devem ser usados os seguintes componentes: 
- 1 Arduino uno. 
- 1 Potenciômetro. 
- 1 LED. 
- 1 Resistor de 1KΩ. 
 
O circuito deve ser montado da seguinte forma: 
 
 
Fonte: Autor. 
Figura 5.13 – Simulação do projeto 3. 
 
O código criado deve ser inserido no campo “código”, na opção “Texto”. 
Ao iniciar a simulação, o LED deve apagar quando o potenciômetro passa do meio e se 
posiciona no lado direito. Quando o potenciômetro fica no lado esquerdo a LED deve 
acender. Se o monitor serial for acessado durante a simulação, será possível ver o valor 
do potenciômetro. 
 
Projeto 4: Calibração de célula de carga com ADC 
o Pinagem e esquema de conexão entre HX711 e o ESP8266-12E 
Fonte: Autor. 
Figura 5.14 – Esquemático de conexão: célula de carga + HX711+ ESP8266-12E. 
 
o Pinagem e esquema de conexão entre o Display e o ESP8266-12E 
 
Fonte: Autor. 
Figura 5.15 – Esquemático de conexão: Display 7 segmentos com 3 dígitos + ESP8266-
12E. 
Entre a conexão dos pinos 18, 19 e 20 e os com os terminais que comandam cada 
dígito poderá ser inserido um resistor de 1kΩ para proteção contra tensão. 
Conclusão 
Caro estudante, neste bloco você visualizou as características dos componentes 
utilizados nos projetos. Os conhecimentos de programação das portas digitais e 
analógicas foram colocados em prática através de três projetos. 
Por fim, esses projetos foram testados por um simulador online. 
Bons estudos e até a próxima! 
 
Bibliografia Consultada 
MATTEDE, H. O que é um LED?. Mundo da Elétrica. Disponível em: 
. Acesso: 06 jan. 2022. 
POTENCIÔMETRO, o que é, para que serve, tipos, aplicações e como funciona. Como 
fazer as coisas. Disponível em: 
. Acesso: 06 jan. 2022. 
 
 
 
 
 
 
 
 
 
 
 
 
 
6 PROJETO COM MICROCONTROLADORES II 
Olá, estudante! 
Neste último bloco será proposto um projeto utilizando a placa Arduino, onde um 
botão e um potenciômetro deverão controlar a rotação de um motor e apresentar os 
seus valores em um display LCD. 
Vamos lá?! 
 
6.1 Interface digital e analógica 
Iremos propor um projeto, onde uma placa Arduino deve controlar a rotação de um 
motor. Nesse projeto, um botão irá controlar quando o motor será acionado e um 
potenciômetro deve controlar a velocidade de rotação do motor. Além disso, o 
Arduino deve se comunicar com um display LCD, que deverá mostrar se o motor está 
ligado ou desligado e o valor do PWM utilizado no motor. O projeto deverá ser testado 
utilizando o software online gratuito Tinkercad. 
Para o projeto serão necessários os seguintes componentes: 
- 1 Arduino Uno 
- 1 Motor 
- 1 Botão 
- 1 Potenciômetro 
- 1 Resistor de 1KΩ 
- 1 Resistor de 220Ω 
- 1 Display LCD 
O projeto deverá ser montado da seguinte forma: 
 
Fonte: Autor. 
Figura 6.1 – Simulação do projeto de controle de motor. 
 
Segue o código que deve ser desenvolvido para o projeto: 
#include // Inclui a biblioteca utilizada pelo display 
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Define os pinos utilizados pelo display 
 
int botao=7; // Define a porta digital 7 como “botao” 
int pot=A0; // Define a porta analógica 0 como “pot” 
int PWMPin = 6; // Define a porta digital 6 como “PWMPin” 
 
float PWM=0; // Cria a variável PWM 
int Ligado=0; // Cria a variável Ligado 
 
void setup() 
{ 
 lcd.begin(16, 2); // Inicia o display 
 pinMode(botao, INPUT); //Define a porta botao como um input //Define o pino 
botão como input 
} 
 
void loop() 
{ 
 if(digitalRead(botao)==HIGH) // Se o botão estiver sendo acionado execute 
 { 
 PWM = analogRead(pot)/4; // lê o pino de entrada analógica e converte o 
resultado em um valor que pode ser usado pelo PWM 
 Ligado=1; 
 } 
 else // Se o botão não estiver pressionado execute 
 { 
 PWM = 0; 
 Ligado=0; 
 } 
 
 analogWrite(PWMPin, PWM); // envia o valor do PWM pelo pino PWMpin 
 
 lcd.setCursor(0,0); // Move o cursor do display para a posição 0,0 
 if(Ligado==1) // Se o botão estiver acionado execute 
 { 
 lcd.print("Ligado "); //Escreve no display a palavra “Ligado” 
 } 
 else //Se o botão não estiver pressionado execute 
 { 
 lcd.print("Desligado"); //Escreve no display a palavra “Desligado” 
 } 
 lcd.setCursor(0,1); // Move o cursor do display para a posição 0,1 
 lcd.print("PWM = "); //Escreve no display a palavra “PWM =” 
 lcd.print((PWM/255)*100); //Escreve no display o valor do PWM convertido para 
porcentagem 
 lcd.print(" % "); //Escreve no display a palavra “%” 
} 
 
Ao iniciar a simulação, o motor deverá girar apenas enquanto o botão estiver 
pressionado. A velocidade do motor deve também mudar de acordo com posição do 
potenciômetro. Por fim, o display deve mostrar quando o motor está ligado ou 
desligado e também a velocidade do PWM em porcentagem. 
 
6.2 IHM com Display e Teclado 
HM é a sigla para Interface Homem Máquina. A interface homem-máquina é um 
software ou componente que é utilizado em ampla escala nas indústrias como forma 
de facilitar a automação industrial. 
A IHM permite que o usuário, as máquinas e as plantas de produção se comuniquem 
de uma forma muito eficiente. Ela traduz uma imensa quantidade de dados bem 
complexos, tornando-os mais descomplicados e fornecendo ao operador ou 
operadora, a possibilidade de comandar as máquinas e controlar toda a produção 
remotamente. 
Ela basicamente é uma tela de touch ou não, que oferece diversas ferramentas como 
por exemplo: 
 Acompanhar

Mais conteúdos dessa disciplina