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