Prévia do material em texto
PROGRAMAÇÃO DE MICROCONTROLADORES – RESUMO
INTRODUÇÃO
⚙️ Evolução do design eletrônico e novos desafios
· Antes: sistemas eram construídos com componentes discretos (resistores, capacitores, transistores), com foco principal na funcionalidade.
· Hoje: o projetista de sistemas integrados enfrenta maior complexidade, rápidas mudanças tecnológicas e pressão por qualidade, inovação e menor tempo de mercado.
· Além de funcionar, os produtos devem atender múltiplas exigências (desempenho, custo, segurança, consumo de energia, tamanho, etc.).
📱 Importância das restrições e base para sistemas embarcados
· Projetos modernos precisam equilibrar várias restrições simultaneamente (ex: smartphones: bateria, peso, segurança, qualidade).
· O sucesso do projeto depende de entender os fatores que impactam essas restrições.
· O estudo dos microcontroladores (evolução, arquitetura e tipos) é fundamental para projetar e especificar corretamente sistemas embarcados.
Módulo 1. Evolução dos microcontroladores
MICROCONTROLADORES E O AUMENTO NA INTEGRAÇÃO DOS CIRCUITOS
📌 Microcontroladores e a evolução dos circuitos
· Entender a evolução dos microcontroladores ajuda a:
· Compreender seu papel na tecnologia atual
· Fazer melhores escolhas em projetos eletrônicos
· Decidir quando utilizá-los em vez de outras soluções
🕰️ Comparação: Eletrônicos antigos vs. modernos
· Década de 1980 (ex: CD players, videocassetes):
· Muitos circuitos e placas
· Grande quantidade de chips e componentes
· Alta complexidade física
· Dispositivos atuais (ex: Blu-ray):
· Poucas placas e poucos chips
· Mais espaço vazio internamente
· Maior desempenho, qualidade e funcionalidades
⚙️ Principais fatores dessa evolução
🔹 1. Miniaturização dos componentes
· Redução do tamanho dos transistores ao longo do tempo:
· Anos 1970: ~10 microns
· Atualidade: ~14 nanômetros
· Consequências:
· Mais circuitos dentro de um único chip
· Menor quantidade de componentes físicos
· Dispositivos menores e mais eficientes
🔹 2. Migração de hardware para software (firmware)
· Funções que antes eram implementadas em hardware:
· Agora são executadas por software em microcontroladores
· Benefícios:
· Redução de custos de fabricação
· Maior flexibilidade para atualizações
· Adição mais rápida de novas funcionalidades
💡 Importância da integração nos microcontroladores
· Cada nova geração integra mais recursos em um único chip
· Exemplos de recursos integrados:
· Comunicação Wi-Fi
· Processamento
· Interfaces diversas
· Vantagens:
· Simplifica o desenvolvimento de projetos
· Aumenta a confiabilidade
· Reduz a necessidade de componentes externos
📶 Exemplo prático:
· Microcontroladores como o ESP8266 e o ESP32 já possuem Wi-Fi integrado no próprio chip, ou seja, você não precisa adicionar módulos externos para conexão com a internet.
· Na prática, isso significa que um único componente consegue:
· Processar dados (como um “mini computador”)
· Conectar-se à internet (enviar/receber informações)
· Controlar dispositivos (sensores, lâmpadas, motores, etc.)
· 💡 Exemplo simples: Com apenas um ESP32, você pode criar um sistema de automação residencial que liga/desliga uma lâmpada pelo celular via Wi-Fi — sem precisar de vários circuitos separados.
· ✔️ Por que eles são tão populares?
· Reduzem o custo do projeto (menos componentes)
· Simplificam o desenvolvimento (tudo em um só chip)
· Oferecem bom desempenho para diversas aplicações
· São amplamente usados e bem suportados no mercado (muita documentação e exemplos)
👉 Em resumo: esses microcontroladores são populares porque fazem muita coisa sozinhos, de forma simples, barata e eficiente.
🧠 Conclusão
· A evolução dos microcontroladores está diretamente ligada à:
· Miniaturização dos componentes
· Maior integração de funcionalidades
· Isso permitiu:
· Dispositivos mais compactos e poderosos
· Desenvolvimento mais rápido e econômico
· Popularização de sistemas embarcados
A HISTÓRIA DA INVENÇÃO DOS MICROCONTROLADORES
📌 A importância dos microcontroladores
· Estão presentes em quase todos os dispositivos eletrônicos do dia a dia
· Exemplos de uso:
· Máquinas de lavar
· Celulares
· TVs
· Sistemas automotivos
· Produção em larga escala:
· Atualmente, são produzidos mais de 2 bilhões de microcontroladores por ano, evidenciando seu uso massivo na indústria eletrônica.
· Uma residência pode ter:
· Dezenas de microcontroladores (até 50 ou mais)
🧠 Origem dos microcontroladores
· Surgiram no início dos anos 1970–1971
· Contexto histórico:
· Enquanto a Intel desenvolvia o primeiro microprocessador
· Gary Boone, da Texas Instruments, criou o conceito de microcontrolador
⚙️ Primeiro conceito de microcontrolador
· Ideia principal: Integrar quase todos os circuitos de uma calculadora em um único chip
· Primeiro modelo: TMS1802NC
· Características:
· ~5.000 transistores
· 3000 bits de memória de programa
· 128 bits de memória de dados
· Limitação: Display e teclado ainda eram externos
💡 Motivação para a invenção
· Problema identificado: Sistemas usavam vários chips (4 a 6 ou mais) para uma única aplicação
· Desvantagens:
· Maior complexidade
· Mais equipes envolvidas
· Menor eficiência no desenvolvimento
🔍 Solução proposta por Boone
· Nova abordagem:
· Analisar necessidades dos clientes
· Identificar funções em comum entre diferentes projetos
· Criar um chip único com blocos funcionais integrados
🚀 Nascimento do microcontrolador moderno
· Resultado: Série TMS1000
· Características:
· Chip único com várias funções integradas
· Atendia diversas aplicações com mais eficiência
🏭 Evolução e popularização
· Uso inicial: Calculadoras da Texas Instruments (1972–1974)
· Comercialização: Disponibilizado para a indústria em 1974
· Crescimento:
· Diferentes versões com mais memória
· Em 1983: Quase 100 milhões de unidades vendidas
📈 Conclusão
· O microcontrolador surgiu da necessidade de:
· Reduzir complexidade
· Melhorar eficiência
· Integrar funções em um único chip
· Seu sucesso levou a:
· Crescimento acelerado
· Uso massivo na indústria
· Presença essencial na tecnologia moderna
O MICROCONTROLADOR ANTE AO MICROPROCESSADOR
📌 Diferença entre microprocessador e microcontrolador
· Microprocessador (processamento geral):
· Foco está no processamento de dados
· Precisa de componentes externos (memória, E/S)
· Usado em sistemas mais complexos como computadores.
· Limitações: Mais poderoso, porém complexo, caro e dependente de outros componentes
· Microcontrolador:
· Microcontroladores costumam ser chamados de "computadores de propósito especial”
· Foco está no controle de dispositivos
· Integra processador, memória e E/S no mesmo chip
· Uso ideal para sistemas embarcados (automação, eletrônicos).
· Limitações: Limitado e especializado, feito para tarefas específicas (controle de dispositivos), porém simples, barato.
👉 Resumo: é um “mini computador”, porém dedicado e otimizado para controle, não para uso geral.
📌 Relação entre microcontroladores e microprocessadores
· A popularização dos microcontroladores aconteceu graças ao avanço dos microprocessadores
· Microprocessadores foram o passo intermediário entre:
· Circuitos complexos com muitos chips
· Sistemas integrados em um único chip (microcontroladores)
🕰️ Antes dos microprocessadores (até ~1980)
· Produtos eletrônicos eram feitos com:
· Muitos circuitos lógicos combinacionais
· Grande quantidade de chips
· Problemas:
· Alta complexidade
· Alto custo de fabricação
· Difícil manutenção
⚙️ Surgimento dos microprocessadores
· Exemplos importantes:
· Intel 8080
· Zilog Z80
· Principais avanços:
· Redução da quantidade de chips
· Possibilidade de programar funções
💡 Vantagens dos microprocessadores
· Permitiram:
· Criar dispositivos mais versáteis
· Corrigir erros via software (sem trocar hardware)
· Resultado:
· Redução de custos de manutenção
· Maior flexibilidade nos projetos
⚠️ Limitações dos microprocessadores
· Não eram uma solução completa, pois:(ânodo) → pino 13 do Arduino
· ➖ Perna menor (cátodo) → GND
3. Inserir o resistor
· Coloque entre o LED e o pino 13 (ou no outro lado)
· Função: Limitar a corrente e evitar que o LED queime
4. Valor do resistor
· Identificado pelas cores
· Use entre 100Ω e 1000Ω (ohms)
👉 Resumindo:
O LED é polarizado, ou seja, só funciona com ligação correta:
· ➕ Ânodo (perna maior) → energia (pino do Arduino)
· ➖ Cátodo (perna menor) → GND
👉 Se inverter, o LED não acende.
Alimentação:
· O Arduino recebe energia pelo USB ou bateria (5V)
👉 E também fornece esses 5V para outros componentes (como LED)
Como acessar o código no Tinkercad:
1. Adicione o Arduino: Coloque a placa no espaço de trabalho
2. Clique em “CODE”: Fica no canto superior direito
3. Escolha o modo:
· 🧱 Blocos (visual)
· 📝 Texto (linguagem C)
4. Selecione “Texto”: O sistema mostra o código pronto
5. Veja o exemplo: Código já vem configurado para fazer o LED do pino 13 piscar
Resumindo: Clique em CODE → Texto para ver e editar o código que controla o Arduino.
Exemplo:
🎯 Objetivo do código: Fazer o LED (pino 13) piscar a cada 1 segundo.
void setup()
{
pinMode(13, OUTPUT); // Define o pino 13 como saída (controla o LED)
}
void loop()
{
digitalWrite(13, HIGH); // Liga o LED (nível alto)
delay(1000); // Espera 1 segundo
digitalWrite(13, LOW); // Desliga o LED (nível baixo)
delay(1000); // Espera 1 segundo
}
🔄 Execução
· Ao iniciar simulação:
· 💡 LED da placa e externo piscam
· ⏱️ Intervalo de 1 segundo
🎯 Conclusão
· Tinkercad permite: Simular circuitos sem hardware real
· Protoboard facilita: Conexões rápidas
· Arduino + código: Permite o controle de componentes
· Ideal para: Aprendizado prático e rápido
SIMULADORES E EMULADORES
🔧 O que é um Emulador
· É um hardware que imita exatamente um microcontrolador real.
· Executa as funções em tempo real e sem interferência (não intrusivo).
· Considerado a ferramenta de depuração mais poderosa.
· Permite testar o software diretamente no hardware de destino.
· ❗ Desvantagem: alto custo, o que reduz seu uso.
💻 O que é um Simulador
· É um software que simula o funcionamento do microcontrolador.
· Permite:
· Testar e depurar códigos
· Aprender sobre periféricos e funcionamento interno
· Entender modos de endereçamento
· Não precisa de hardware real para funcionar.
Vantagens do Simulador:
· ⏱️ Economiza tempo no desenvolvimento
· 🐞 Ajuda a corrigir erros simples mais rapidamente
· 🎓 Facilita o aprendizado do microcontrolador e da programação
· 🔍 Ajuda a identificar se o problema está no software ou hardware
· ⚙️ Não requer configuração inicial
· 👨💻 Reduz a necessidade de suporte técnico
Limitações do Simulador:
· Não executa em tempo real como o emulador
· Não substitui totalmente um emulador
· Não interage com hardware físico real
🔄 Diferença Principal
· Emulador:
· Testa software no hardware real
· Execução em tempo real
· Simulador:
· Testa software em um ambiente virtual
· Focado no aprendizado e desenvolvimento inicial
🧠 Conclusão
· O uso de ferramentas de desenvolvimento é essencial.
· Simuladores são alternativas mais acessíveis e úteis no início.
· Mesmo com limitações, eles facilitam muito o desenvolvimento e testes em sistemas embarcados.
Módulo 4. Simulação PICSimLab para microcontroladores PIC
PICSIMLAB
💡 Importância da Simulação
· Permite testar códigos e projetos antes de montar o hardware real.
· Usado por estudantes e profissionais.
· Ajuda a validar:
· Modelos
· Lógicas de programação
· Provas de conceito
🧪 O que é o PICSimLab
· É um simulador de sistemas microcontrolados.
· Focado em microcontroladores da família PIC da Microchip Technology.
· Muito utilizado em projetos que exigem alta confiabilidade.
🧠 Evolução do PICSimLab
· Desenvolvido por Luis Claudio Gambôa Lopes do CEFET/MG.
· Inicialmente: Suportava apenas o PIC16F628A
· Atualmente:
· Simula 5 placas diferentes
· Suporta vários microcontroladores (ex: PIC18F4550)
· Inclui simulação de Arduino Uno
⚙️ Como usar o PICSimLab
Antes da simulação, é necessário:
1. Criar o código em uma IDE, como a MPLAB X IDE
2. Compilar o código usando um compilador, como: CCS C Compiler
3. Gerar o arquivo executável (HEX ou similar)
4. Carregar esse arquivo no PICSimLab para simulação
📚 Sobre Compiladores
· A escolha do compilador é muito importante porque:
· Define as bibliotecas disponíveis
· Define as diretivas de configuração
· Mesmo usando a linguagem C:
· Cada compilador possui funções próprias
· Exemplo: escrever em um display LCD pode mudar dependendo do compilador
⚠️ Ponto de Atenção
· É essencial entender o processo de:
· Escrita do código
· Compilação
· Geração do executável
· Diferenças entre compiladores podem impactar diretamente o funcionamento do código
🧠 Conclusão
· O PICSimLab é uma ferramenta importante para:
· Aprendizado
· Testes rápidos
· Redução de erros antes do hardware real
· Seu uso, combinado com IDEs e compiladores, facilita muito o desenvolvimento em sistemas embarcados.
GERANDO CÓDIGO EXECUTÁVEL NO MPLAB X IDE
⚙️ Etapas para gerar o executável (.hex)
🥇 1º Passo: Criar o projeto
· Abrir o MPLAB X IDE
· Criar um novo projeto
· Definir:
· Nome do projeto
· Microcontrolador: PIC16F628A
· Escolher o compilador:CCS C Compiler
· Manter as demais configurações padrão
🥈 2º Passo: Criar o arquivo-fonte
· Na lateral esquerda, localizar a pasta Source Files
· Clicar com o botão direito → C Source File
· Criar e nomear o arquivo (ex: main.c)
🥉 3º Passo: Escrever o código
· O arquivo abre na área central
· Escrever o programa em linguagem C
· Esse código será executado no microcontrolador (ou no simulador)
💡 Objetivo do código:
· Fazer um LED piscar continuamente
· O LED liga e desliga a cada 1 segundo
· Exemplo clássico de introdução a microcontroladores
#include // Inclui definições do microcontrolador PIC16F628A
#fuses XT // Configura o uso de cristal externo (oscilador)
#use delay(clock=4MHz) // Define o clock em 4MHz para controle de tempo
void main() { // Função principal do programa
while (1) { // Loop infinito (executa para sempre)
output_high(PIN_B0); // Coloca nível lógico alto no pino RB0 (liga o LED)
delay_ms(1000); // Espera 1000 ms (1 segundo)
output_low(PIN_B0); // Coloca nível lógico baixo no pino RB0 (desliga o LED)
delay_ms(1000); // Espera mais 1 segundo
}
}
Explicação dos principais comandos:
· #include → Permite usar funções e configurações específicas do PIC
· #fuses XT → Define configurações do hardware (uso de cristal externo)
· #use delay(clock=4MHz) → Define a velocidade do microcontrolador (clock)
· while(1) → Garante execução contínua (loop infinito)
· output_high / output_low → Controlam o estado do pino (liga/desliga LED)
· delay_ms(1000) → Cria atraso de 1 segundo
🔄 4º Passo: Compilar o código
· Clicar no botão de compilar
· Se não houver erros: Será gerado um arquivo .hex
🧪 5º Passo: Simular no PICSimLab
· Abrir o PICSimLab
· Selecionar a placa: McLab1
· Carregar o arquivo: Menu → File → Load HEX
· Resultado: O LED começará a piscar
🔧 6º Passo: Testes e ajustes
· Alterar o tempo no código (ex: delay_ms(500))
· Recompilar
· Recarregar o arquivo .hex
· Observar mudanças na simulação
🧠 Conclusão
· O processo envolve:
1. Criar projeto
2. Escrever código
3. Compilar
4. Gerar .hex
5. Simular
· Esse fluxo é essencial no desenvolvimento de sistemas embarcados
MICROCONTROLADORES PIC E PLACAS DO PICSIMLAB
🧠 Visão Geral
· Para usar placas no PICSimLab, é necessário conhecer:
· Os microcontroladores PIC
· As características das placas
· Os PIC (Peripheral Interface Controller) são:
· Muito populares
· Amplamente usados por projetistas
· Dividem-se em: 8 bits, 16 bits e 32 bits
🔧 Microcontrolador PIC16F628A
· Presente na placa McLab1 do PICSimLab
· Pertence à família de 8 bits
· Característicasprincipais:
· Arquitetura RISC, com poucas instruções – cerca de 35 instruções em Assembly
· Arquitetura Harvard:
· Memória de programa e dados separadas
· Maior desempenho
· Suas instruções possuem largura de 14 bits
· As instruções são executadas em um único ciclo
· Utiliza um barramento de 14 bits para acessar a memória
· Isso permite maior eficiência e rapidez na execução
Recursos internos do PIC16F628A:
· ALU (Unidade Lógica Aritmética): Realiza operações matemáticas e lógicas
· Registrador de trabalho de 8 bits
· Memórias:
· EEPROM: 128 bytes (não volátil)
· RAM: 224 bytes
· Memória de programa: do tipo flash, com 2048 palavras
· Portas:
· PORTA e PORTB
· Usadas para entrada e saída de dados
· Podem ser configuradas com diferentes funções com base nos bits de configuração atribuídos no programa pela diretiva fuses
🔌 Conceito de Portas
· Porta = conjunto de pinos (geralmente 8 pinos)
· Funcionam como registradores internos
· Podem ter múltiplas funções:
· Entrada/saída digital
· Comunicação (USART)
· Temporizadores
· PWM, comparadores, etc.
Diferentes funções que as portas podem assumir no microcontrolador PIC16F628A
Nome
Função
Descrição
RA0/AN0
RA0
Porta de entrada/saída bidirecional
AN0
Entrada do comparador analógico
RA1/AN1
RA1
Porta de entrada/saída bidirecional
AN1
Entrada do comparador analógico
RA2/AN2/VREF
RA2
Porta de entrada/saída bidirecional
AN2
Entrada do comparador analógico
VREF
Saída da VREF
RA3/AN3/CMP1
RA3
Porta de entrada/saída bidirecional
AN3
Entrada do comparador analógico
CMP1
Saída do comparador 1
RA4/T0CKI/CMP2
RA4
Porta de entrada/saída bidirecional
T0CKI
Entrada de clock do Timer0
CMP2
Saída do comparador 2
RA5/MCLR/VPP
RA5
Porta de entrada
MCLR
Reset principal
VPP
Entrada de tensão de programação
RA6/OSC2/CLKOUT
RA6
Porta de entrada/saída bidirecional
OSC2
Saída do oscilador de cristal
CLKOUT
Saída CLKOUT, com 1/4 da frequência do OSC1
RA7/OSC1/CLKIN
RA7
Porta de entrada/saída bidirecional
OSC1
Entrada do oscilador de cristal
CLKIN
Entrada da fonte de clock externa
RB0/INT
RB0
Porta de entrada/saída bidirecional
INT
Interrupção externa
RB1/RX/DT
RB1
Porta de entrada/saída bidirecional
RX
Pino de recepção USART
DT
Entrada/saída de dados sincronizada
RB2/TX/CK
RB2
Porta de entrada/saída bidirecional
TX
Pino de transmissão USART
CK
Entrada/saída de clock sincronizada
RB3/CCP1
RB3
Porta de entrada/saída bidirecional
CCP1
Entrada e Saída do tipo Captura/Comparação/PWM
RB4/PGM
RB4
Porta de entrada/saída bidirecional
PGM
Pino de entrada de programação em baixa tensão
RB5
RB5
Porta de entrada/saída bidirecional
RB6/T1OSO/T1CKI/PGC
RB6
Porta de entrada/saída bidirecional
T1OSO
Saída do oscilador do Timer1
T1CKI
Entrada de clock do Timer1
PCG
Clock de programação ICSPTM
RB7/T1OSI/PGD
RB7
Porta de entrada/saída bidirecional
T1OSI
Entrada do oscilador do Timer1
PGD
Entrada e saída de dados ICSP
VSS
VSS
Referência para os pinos de lógica e de entrada/saída
VDD
VDD
Pino de alimentação positiva para os pinos de lógica e entrada/saída
🧪 Placa McLab1 (PICSimLab)
· É uma placa simples para testes básicos:
· 2 displays de 7 segmentos
· 8 LEDs
· 1 saída PWM (lâmpada)
· 4 botões (pushbuttons)
· Limitações:
· Não possui LCD
· Não possui ADC (conversor analógico-digital)
🔬 Placa PICGenios (mais avançada)
· Usada para testes mais complexos
· Possui:
· Sensores (ex: temperatura)
· Ventoinha, buzzer
· Potenciômetros
· LCD
· 7 segmentos
· 16 LEDs
· 19 botões
· Suporta microcontroladores como: PIC18F4550
🚀 Família PIC18 (evolução)
· Mais avançada que a PIC16
· Vantagens:
· Facilidade de uso
· Maior desempenho
· Integração com família anteriores de 8 bits
· Mais periféricos (CAN, USB, Ethernet)
· Recursos do PIC18F4550:
· Até 13 canais ADC (10 bits)
· 4 PWM
· 4 temporizadores
· 32 KB de memória
· Até 48 MHz de clock
· Comunicação: CAN, USB, Ethernet
⚠️ Limitações da família PIC16
· Pilha pequena
· Apenas um vetor de interrupção
· Menor capacidade para sistemas complexos
🔄 Evolução do PICSimLab
· Software de código aberto
· Está em constante atualização
· Permite adicionar:
· Novas placas
· Novos recursos
· Limitação: Pouca integração com dispositivos externos (comparado ao Tinkercad)
💡 Conclusão
· Simuladores estão evoluindo e facilitando o desenvolvimento
· Ferramentas gratuitas como PICSimLab e Tinkercad tornam o aprendizado mais acessível
· Porém, muitos simuladores profissionais ainda são pagos
TEMA 4 – PERIFÉRICOS INTEGRADOS
INTRODUÇÃO
🔌 O que são periféricos integrados e sua função
· Microcontroladores possuem, além de CPU, RAM e memória, periféricos internos para interação com o mundo externo.
· Esses periféricos permitem comunicação com sensores, motores e interfaces humanas (botões, displays, teclados).
· Eles ajudam a descarregar tarefas da CPU, melhorando desempenho e economizando energia.
⚙️ Uso e controle dos periféricos em sistemas embarcados
· Periféricos são configurados e controlados por registradores específicos.
· O desenvolvedor precisa entender suas capacidades e limitações.
· A programação (geralmente em C) permite controlar esses recursos em plataformas como Arduino e PIC, facilitando o desenvolvimento de sistemas embarcados.
Módulo 1. As portas de entrada e saída dos microcontroladores para a interação com dispositivos externos
PORTAS DIGITAIS DE ENTRADA E SAÍDA
📌 Função dos microcontroladores
· Monitorar e controlar dispositivos externos.
· Essa é sua principal função em sistemas embarcados.
🔢 Organização dos pinos
· Podem ser acessados:
· Individualmente
· Em grupo (portas), geralmente de 8 pinos (1 byte).
· Tipos de pinos:
· Entrada
· Saída
· Bidirecionais (mais comuns → entrada e saída)
🔄 Funções alternativas dos pinos
· Um mesmo pino pode ter múltiplas funções (ex: comunicação, temporizador).
· Isso ajuda a reduzir o tamanho do chip.
· O programador escolhe a função do pino via software.
· ⚠️ Importante:
· Se usado para outra função → não pode ser usado como E/S digital.
· Exige planejamento do hardware.
💡 Conceito de sinal digital
· Trabalha com dois níveis lógicos:
· 1 (alto / positivo)
· 0 (baixo / não positivo)
· Informação é representada por bits (0 e 1).
· Em E/S digital: O pino só pode estar em nível lógico 0 ou 1.
🧠 Registradores (controle dos pinos)
· São usados para conectar e controlar os periféricos.
Tipos:
· Registradores de dados:
· Armazenam o estado dos pinos (ex: valor de uma porta).
· Registradores de status e controle:
· Configuram o funcionamento dos pinos.
· Ex: definir se o pino será entrada ou saída.
⚙️ Configuração dos pinos
· Deve ser feita no início do programa (quando o sistema liga).
· Exemplo (Arduino):
· pinMode() → define entrada ou saída.
🔍 Leitura e escrita nos pinos
· Após configurar:
· Entrada → é possível ler o valor (0 ou 1).
· Saída → é possível definir o valor lógico (alto ou baixo).
· Isso é feito através de funções que manipulam os registradores.
✅ Resumo geral
· Pinos digitais permitem comunicação entre microcontrolador e mundo externo.
· Funcionam com lógica binária (0 e 1).
· Precisam ser configurados corretamente.
· Podem ter múltiplas funções, exigindo planejamento no uso.
LENDO DOS PINOS DIGITAIS
📌 O que é entrada digital
· Usada para monitorar sinais externos.
· O sinal só possui dois estados:
· Alto (1)
· Baixo (0)
⚠️ Importância da estabilidade do pino
· Um pino de entrada não pode ficar flutuando (sem definição).
· Pino flutuante pode gerar:
· Leituras instáveis ou aleatórias.
· Por isso, são necessárias conexões de hardware adicionais.
🔌 Técnicas para evitar instabilidade
· Uso de resistores para definir o estado padrão:
· Pull-up
· Pull-down
⬆️ Pinos com Pull-up
· O pino é mantido em nível alto (1) por padrão.
· Um resistor liga o pino ao VCC (+5V).· Quando ocorre um evento (ex: botão pressionado):
· O pino vai para nível baixo (0).
· Característica: Lógica negativa
· Exemplo: Ação →Sai do nível alto (1) → Passa para nível baixo (0)
⬇️ Pinos com Pull-down
· O pino é mantido em nível baixo (0) por padrão.
· Um resistor liga o pino ao GND (terra).
· Quando ocorre um evento:
· O pino vai para nível alto (1).
· Característica: Lógica positiva
· Exemplo: Ação →Sai do nível baixo (0) → Passa para nível baixo (1)
⚙️ Pull-up interno
· Alguns microcontroladores possuem resistores pull-up internos.
· Vantagem:
· Dispensa componentes externos.
· Pode ser ativado via software.
🔄 Comparação geral
· Pull-up:
· Padrão = 1
· Evento = 0
· Pull-down:
· Padrão = 0
· Evento = 1
✅ Resumo final
· Entradas digitais trabalham com 0 e 1.
· Pinos não podem ficar sem definição (flutuando).
· Pull-up e pull-down garantem leituras confiáveis.
· A escolha depende da lógica do projeto.
ESCREVENDO NOS PINOS DIGITAIS
📌 O que é escrita digital
· Usada para definir o estado de pinos de saída.
· Os níveis são:
· Alto (1)
· Baixo (0)
· Esses níveis dependem da tensão de operação do microcontrolador.
⚙️ Funcionamento do pino de saída
· Quando configurado como saída:
· O microcontrolador controla o pino com base no valor do registrador.
· O pino precisa estar ligado a uma carga externa (ex: LED, motor).
🔌 Formas de conexão com a carga
🔹 1. Microcontrolador fornecendo corrente (source / fonte)
· O microcontrolador fornece a corrente elétrica para acionar o dispositivo.
· O pino de saída envia energia para a carga (ex: LED).
· Caminho da corrente:
→ Microcontrolador → pino (P0) → carga → GND
· ✔️ Ideia simples: o pino “empurra” corrente.
🔹 2. Microcontrolador como consumidor (sink / dreno)
· O microcontrolador recebe (drena) a corrente.
· Caminho da corrente:
→ Fonte (ex: 5V) → carga → pino (P0) → GND
· ✔️ Ideia simples: o pino “puxa” corrente.
· ⚠️ Importante:
· A carga deve estar ligada à mesma alimentação do microcontrolador.
· Caso contrário, pode ocorrer diferença de potencial perigosa e danificar o circuito.
⚠️ Cuidados importantes
· Pinos de saída são mais sensíveis que os de entrada.
· Os pinos de saída têm limite de corrente.
· Se ligar errado → Risco de curto-circuito:
· Exemplo: Ligar o pino direto ao GND e definir como nível alto (1).
· Curtos podem:
· Danificar o pino (queimar)
· Inutilizar o microcontrolador
🔋 Limites de corrente
· Os pinos suportam baixa corrente:
· Geralmente 20 a 25 mA.
· Isso é suficiente para acender um LED
· Mas os circuitos que exigem mais corrente devem isolar a carga de corrente mais alta dos pinos de E/S do microcontrolador.
· Existem limites:
· Por pino
· Por porta (grupo de pinos)
· Total do microcontrolador
· Exceder esses limites → dano permanente.
🏭 Uso em aplicações industriais
· Em ambientes industriais, usa-se tensão alta (24V)
· Microcontroladores usam tensão baixa (3,3V ou 5V)
⚠️ Problema:
· Existe uma grande diferença de tensão (até 10x)
· Se ligar direto:
· Pode danificar o microcontrolador
· Ou o sinal pode não funcionar corretamente
🔄 Desafio:
· Fazer os dois “mundos” se comunicarem:
· Microcontrolador (baixa tensão)
· Equipamentos industriais (alta tensão)
🔧 Solução:
· Usar conversores de nível lógico
· Eles:
· Aumentam ou reduzem a tensão
· Protegem o microcontrolador
✅ Resumo final
· Escrita digital controla dispositivos externos via pinos de saída.
· Pinos de saída podem:
· Empurrar corrente (source) ou
· Puxar corrente (sink)
· São sensíveis → precisam de cuidado
· Use sempre: Resistores ou circuitos de proteção
· Para cargas maiores: Use transistores ou drivers
· É essencial respeitar limites de corrente e tensão.
· Conexões incorretas podem danificar o microcontrolador.
· Em aplicações maiores, usa-se circuitos intermediários para proteção e adaptação.
PORTAS ANALÓGICAS
📌 Diferença entre digital e analógico
· Porta digital:
· Interpreta tensão como:
· 0 (baixo) ou 1 (alto)
· Exemplo microcontroladores que funcionam com 5V:
· Abaixo de 0,7V → 0
· Acima de 2,7V → 1
· Entre esses valores → indefinido (pode ser percebido como 0 ou 1)
· Porta analógica:
· Lê valores contínuos de tensão
· Ex: de 0V até 5V
💡 Por que usar portas analógicas
· Algumas aplicações precisam do valor real da tensão, não só 0 ou 1.
· Exemplo:
· Sensor de luz (foto-transistor)
· A tensão varia conforme a intensidade da luz
🔄 Conversão de sinais
· O microcontrolador é digital, mas o mundo é analógico.
· Por isso, são necessários conversores:
🔹 ADC (Conversor Analógico → Digital)
· Converte tensão analógica em valor digital
· Permite ao microcontrolador interpretar sinais do mundo real
🔹 DAC (Conversor Digital → Analógico)
· Converte valor digital em tensão analógica
· Permite ao microcontrolador gerar sinais variáveis
⚙️ Entradas e saídas analógicas
· Entrada analógica: Lê tensões variáveis (ex: sensores)
· Saída analógica: Gera tensões proporcionais a valores digitais
🔁 Alternativa ao DAC
· Nem todo microcontrolador possui DAC
· Solução comum: Uso de PWM (Modulação por Largura de Pulso)
· Permite simular um sinal analógico
✅ Resumo final
· Portas digitais → trabalham com 0 e 1
· Portas analógicas → trabalham com valores contínuos
· ADC e DAC fazem a “tradução” entre mundo real e digital
· PWM pode substituir DAC em muitos casos
PROGRAMANDO E/S DIGITAIS EM MICROCONTROLADORES
📌 Exemplo com microcontroladores PIC
· Utiliza o simulador PicSimLab.
· O programa precisa ser convertido em um arquivo:
· .hex (arquivo executável) após a compilação.
· Ferramentas utilizadas:
· Compilador: CCS C
· Indicado para iniciantes
· Possui bibliotecas prontas (facilita a programação)
· IDE: MPLAB
· Ambiente para escrever, compilar e testar o código
📌 Exemplo com microcontroladores AVR ATMega (Arduino)
· Utiliza o simulador online Tinkercad.
· Permite:
· Escrever o código
· Compilar
· Simular um Arduino Uno direto no navegador
⚙️ Diferenças entre as famílias
· Cada microcontrolador (PIC, AVR, etc.) possui:
· Formas diferentes de configuração
· Funções específicas
· Não existe um padrão único → muda conforme a plataforma
🔄 Importância da adaptação
· É essencial aprender a:
· Trabalhar com diferentes plataformas
· Entender novas funções e ferramentas
· Flexibilidade é fundamental durante o aprendizado
🎯 Visão para o mercado
· Na prática profissional: Você trabalhará com vários tipos de microcontroladores
· Habilidades importantes:
· Pesquisar
· Adaptar códigos
· Aprender novas tecnologias rapidamente
✅ Resumo final
· PIC e AVR usam ferramentas diferentes para programação e simulação.
· Cada plataforma tem suas próprias regras e funções.
· O mais importante é desenvolver capacidade de adaptação entre sistema
CONFIGURAÇÃO DO MICROCONTROLADOR VIA SOFTWARE
📌 Ideia principal
· Antes de executar o programa, é necessário fazer configurações iniciais.
· Esses ajustes iniciais, funcionam como as “configurações” de um projeto (ex: definir tamanho, cor, etc.).
· Essas configurações:
· Definem como o microcontrolador vai funcionar
· Geralmente não mudam depois de configuradas.
Exemplos de configurações:
· Tipo de clock (interno ou externo)
· Uso de watchdog (detecção de erros de software)
· Configuração de pino de reset
· Outras características do hardware
🧠 Como são feitas as Configurações:
· Através de registradores específicos no microcontrolador
· Cada bit controla uma função → chamados de:
· Bits de configuração ou bits de fusíveis (fuses)
Na prática (PIC)
· No compilador CCS C, usa-se:
· #fuses →Serve para definir essas configurações no código
Exemplo com PIC
🎯 Objetivo do código
· Contar quantas vezes um botão é pressionado
· Mostrar esse valor em LEDs (em binário)
#include // Inclui a biblioteca do microcontrolador
#fuses XT // Configura uso de cristal externo (clock)
#use delay(clock=4MHz) // Define a frequência do clock (4 MHz)
void main() {
int contador= 0; // Variável que armazena a contagem
int1 btn1; // Variável de 1 bit para o botão (economiza memória)
while(TRUE) { // Loop infinito (executa para sempre)
btn1 = input(PIN_A1); // Lê o estado do pino A1 (botão)
if (btn1 == 0) { // Se botão pressionado (nível 0)
contador++; // Incrementa o contador
output_b(contador); // Envia valor para PORTB (LEDs)
delay_ms(500); // Espera 500 ms (evita múltiplas leituras rápidas)
}
}
}
Explicação:
⚙️ Configurações iniciais
· #include → inclui a biblioteca do microcontrolador
· #fuses → define configurações (ex: tipo de clock)
· #use delay → define frequência de operação
🔄 Funcionamento do programa
· Cria uma variável contador
· Usa um loop infinito (while TRUE)
· Lê o botão com input(PIN_A1)
🔘 Lógica do botão
· Botão pressionado → nível lógico 0
· Se pressionado:
· Incrementa o contador (contador++)
· Envia valor para LEDs (output_b(contador))
· Aguarda 500 ms
🔌 Conceitos importantes do Arduino
Portas e registradores:
· Pinos agrupados em:
· PORTB, PORTC, PORTD
· Registrador DDR:
· Define direção:
· 1 → saída
· 0 → entrada
Exemplo com Arduino (ATMega328)
🎯 Objetivo do código
· Mesmo objetivo do PIC:
· Contar pressionamentos do botão
· Exibir valor em LEDs (binário)
int contador = 0; // Variável para armazenar a contagem
void setup(){
DDRD = B11111111; // Define todos os pinos da PORTA D como saída
pinMode(12, INPUT_PULLUP); // Define pino 12 como entrada com pull-up interno
}
void loop(){
if (digitalRead(12) == LOW){ // Se botão pressionado (nível baixo)
contador++; // Incrementa o contador
PORTD = contador; // Envia valor para os pinos (LEDs)
delay(500); // Espera 500 ms
}
}
Explicação:
⚙️ Configuração inicial (setup)
· pinMode(12, INPUT_PULLUP) → Define o pino 12 como entrada com pull-up interno
· DDRD = B11111111 → Define todos os pinos da porta D como saída
🔄 Funcionamento (loop)
· Verifica botão com digitalRead(12)
· Se pressionado (LOW):
· Incrementa contador
· Envia valor para os pinos (PORTD = contador)
· Aguarda 500 ms
🔌 Controle por registradores
· Portas do microcontrolador → PORTB, PORTC, PORTD
· Registrador DDR → Define se pino é entrada (0) ou saída (1)
🔄 Comparação geral (PIC vs Arduino)
· PIC: Usa funções como input() e output_b()
· Arduino:
· Usa digitalRead() e pinMode()
· Ou acesso direto a registradores (nível mais baixo)
✅ Resumo final
· Configurações iniciais são essenciais no firmware
· São feitas por registradores (bits/fuses)
· Programas usam loop infinito
· Entrada (botão) controla saída (LEDs)
· Cada plataforma tem sua forma de programação
Módulo 2. Conversores analógico-digitais
AQUISIÇÃO DE DADOS
📌 O que é Aquisição de Dados (DAQ)?
· É o processo de coletar informações do mundo real (como temperatura, pressão, luz etc.).
· Essas informações são usadas para medir, monitorar, controlar ou testar sistemas.
🖥️ Onde é utilizada?
· Indústrias: automação e controle de processos.
· Laboratórios: testes e medições científicas.
· Cotidiano: sistemas de monitoramento em casas e cidades.
⚙️ Como funciona um sistema de DAQ?
· Muitos sistemas são baseados em computadores (PCs).
· Recebem dados de dispositivos como:
· Sensores (medem grandezas físicas)
· Transdutores (convertem grandezas físicas em sinais elétricos)
🔄 Conversão de sinais
· A maioria dos sensores gera sinais analógicos.
· O sistema precisa converter esses sinais para digitais:
· Isso é feito por um conversor A/D (analógico → digital).
🔌 Recursos dos sistemas de DAQ
· Entradas analógicas (ler sensores)
· Saídas analógicas (controlar dispositivos)
· Entradas e saídas digitais
· Funções de contagem e temporização
🤖 Relação com microcontroladores
· Microcontroladores modernos podem atuar como sistemas de aquisição de dados.
· Eles já possuem:
· Conversores A/D integrados
· Recursos de entrada e saída
· Podem ser programados para controlar e ler dados automaticamente.
🎯 Ideia principal
· A aquisição de dados é essencial para conectar o mundo físico ao digital, permitindo que sistemas eletrônicos interpretem e ajam sobre informações reais.
CONVERSOR ANALÓGICO-DIGITAL
🔌 O que é um Conversor Analógico-Digital (ADC)?
· Dispositivo que converte sinais analógicos (contínuos) em valores digitais (binários).
· Necessário quando o valor da tensão é importante (ex: sensores de temperatura).
· Muitos microcontroladores já possuem ADC integrado.
🔢 Como funciona a conversão?
· A tensão analógica (0 até Vref) é dividida em níveis discretos (degraus).
· Número de níveis = 2ⁿ, onde:
· n = número de bits do ADC
· Cada nível corresponde a um valor digital entre 0 e 2ⁿ − 1.
📏 Resolução do ADC
· Define a menor variação de tensão detectável.
· Fórmula:
· Exemplo:
· ADC de 10 bits com 5V:
· Resolução = 5 / 1024 ≈ 4,88 mV
· Quanto maior o número de bits (n), melhor a precisão.
⚠️ Limitações na conversão
1. Perda de informação (quantização)
· Valores analógicos são aproximados para o degrau mais próximo.
· Pequenas variações dentro de um degrau não são percebidas.
· Exemplo: Variações menores que a resolução → mesmo valor digital.
2. Tempo de conversão
· A conversão não é instantânea.
· Existe um intervalo entre amostras.
· Mudanças rápidas podem ser perdidas.
⏱️ Amostragem e Teorema de Nyquist
· Para representar corretamente um sinal:
· Frequência do sinal DAC → mantém 1
· Se entradade entrada
💡 Ideia-chave
· O ADC SAR funciona como uma busca binária:
· Vai reduzindo o erro pela metade a cada passo
· Converge rapidamente para o valor correto
📌 Resumo final
· Processo rápido e eficiente
· Excelente equilíbrio entre:
· ⚡ Velocidade
· 🎯 Precisão
· 💰 Custo
· Por isso, é amplamente usado em:
· Microcontroladores
· Sistemas embarcados
· Instrumentação
PROGRAMANDO ADCS EM MICROCONTROLADORES
🔌 Ajuste da tensão de entrada
· Para testar ADCs, é necessário variar a tensão de entrada.
· Isso pode ser feito com um Potenciômetro (resistor variável)
· O potenciômetro funciona como: Divisor de tensão
· Permite gerar diferentes níveis de tensão a partir de uma mesma fonte.
⚡ Divisor de tensão (conceito)
· Dois resistores em série (R1 e R2):
· A saída depende da proporção entre eles.
· Se R1 = R2:
· Vsaída = Ventrada / 2
· No potenciômetro: A tensão varia conforme a posição do cursor.
🤖 ADC no Arduino
· Nem todos os pinos são analógicos:
· Arduino Uno: A0 a A5 (6 entradas)
· Características:
· 📏 Resolução: 10 bits → 1024 níveis (0 a 1023)
· 🔋 Referência padrão: 5V
· Taxa de amostragem: Aproximadamente 9,6 kHz (máxima teórica)
🧰 Funções principais (Arduino)
· analogRead(pino) → Lê valor analógico (0 a 1023)
· analogReference() → Define tensão de referência:
· DEFAULT → 5V
· INTERNAL → 1,1V
· EXTERNAL → pino AREF
💻 Código Arduino
🎯 Objetivo do código:
· Ler a tensão do potenciômetro
· Converter para valor em volts
· Exibir no monitor serial
void setup() {
Serial.begin(9600); // Inicia comunicação serial a 9600 bps
}
void loop() {
int sensorValor = analogRead(A0); // Lê valor analógico do pino A0 (0 a 1023)
// Converte a leitura para tensão (0 a 5V)
float tensao = sensorValor * (5.0 / 1023.0);
Serial.println(tensao); // Envia a tensão para o monitor serial
}
💡 Observação:
· O valor exibido deve ser igual ao de um multímetro no circuito.
🔧 ADC em PIC
⚠️ Observação inicial
· Nem todo PIC tem ADC:
· ❌ PIC16F628 → possui apenas um comparador (é um dispositivo analógico que compara dois valores de tensão)
· ✅ PIC18F4550 → possui ADC (10 bits, 13 canais)
🧠 Registradores do ADC (PIC)
Os registradores associados ao controle do ADC no compilador CCS C são:
· ADCON0 → Liga ADC e inicia conversão
· ADCON1 → Configura pinos analógicos
· ADRESH → Parte alta do resultado
· ADRESL → Parte baixa do resultado
🧰 Funções principais (CCS C)
As principais funções para acionar o ADC no compilador CCS C são:
· setup_adc() → Configura ADC
· setup_adc_ports() → Define entradas analógicas
· set_adc_channel() → Seleciona canal
💻 Código PIC (PIC18F4550)
🎯 Objetivo do código:
· Ler tensão do potenciômetro (RA0)
· Converter para valor digital e tensão
· Exibir em um display LCD
#include // Define o microcontrolador usado
#device adc=10 // Configura ADC com 10 bits
#fuses HS, MCLR, NOWDT // Configurações do hardware (clock, reset, watchdog)
#use delay(clock=20MHz) // Define clock de 20 MHz
// Definição dos pinos de dados do LCD
#define LCD_DB0 PIN_D0
#define LCD_DB1 PIN_D1
#define LCD_DB2 PIN_D2
#define LCD_DB3 PIN_D3
#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7
// Definição dos pinos de controle do LCD
#define LCD_E PIN_E1
#define LCD_RS PIN_E2
#include // Biblioteca para controle do LCD
void main () {
unsigned int16 valor; // Variável para armazenar leitura do ADC (0 a 1023)
float tensao; // Variável para armazenar tensão convertida
lcd_init(); // Inicializa o LCD
setup_adc(ADC_CLOCK_INTERNAL); // Configura o ADC
setup_adc_ports(AN0); // Define AN0 como entrada analógica
set_adc_channel(0); // Seleciona canal 0 (RA0)
while(true) { // Loop infinito
valor = read_adc(); // Lê valor do ADC
// Converte valor digital para tensão (0 a 5V)
tensao = valor / 1023.0 * 5.0;
// Exibe valor no LCD (linha 1)
printf(LCD_PUTC, "\fValor: %lu\n", valor);
// Exibe tensão no LCD (linha 2)
printf(LCD_PUTC, "Tensao: %f", tensao);
delay_ms(100); // Pequeno atraso para estabilidade
}
}
📌 Conclusão
· O ADC permite ler sinais analógicos no microcontrolador.
· Potenciômetros são uma forma simples de gerar sinais variáveis.
· Arduino: Mais simples e direto
· PIC: Mais configurável e detalhado
· Ambos seguem a mesma lógica: Ler valor → converter → exibir
Módulo 3. A importância do uso de temporizadores e contadores para o desenvolvimento de sistemas de tempo real com microcontroladores
APLICAÇÕES DE TEMPORIZADORES E CONTADORES
⏱️ O que são temporizadores?
· Temporizadores (timers) são periféricos do microcontrolador usados para medir intervalos de tempo.
· Eles permitem:
· gerar eventos em momentos específicos;
· medir o tempo entre dois acontecimentos.
Exemplos de uso dos temporizadores:
· Controlar o tempo de um semáforo.
· Enviar dados em comunicação serial em uma velocidade definida.
· Medir a velocidade de um carro usando sensores na estrada.
· Medir a rotação do motor de um veículo.
· Cronometrar eventos muito rápidos, como a velocidade de uma bala.
· Produzir sons e músicas.
· Controlar o sistema de ignição automotiva.
· Controlar a velocidade de motores usando pulsos.
🔢 O que são contadores?
· Contadores são semelhantes aos temporizadores, mas contam eventos externos em vez de pulsos de clock.
· Eles registram quantas vezes algo aconteceu.
Exemplos de uso dos contadores
· Contar carros passando por uma estrada.
· Contar pessoas passando por uma catraca.
· Medir velocidade contando quantas vezes a roda de um carro gira em determinado tempo.
⚠️ Diferença entre temporizador e contador
Apesar dos dois modos serem diferentes, ambos funcionam como contadores binários:
· Modo temporizador
· Conta pulsos de clock com período conhecido.
· Serve para medir tempo.
· Modo contador
· Conta eventos externos ou pulsos.
· Serve para registrar ocorrências.
💡 Principal vantagem
· Temporizadores e contadores funcionam independentemente da CPU do microcontrolador.
· Isso reduz o trabalho do processador principal.
· A CPU pode acessar os valores do temporizador quando necessário.
🖥️ Nos microcontroladores
· A maioria dos microcontroladores possui:
· um ou mais temporizadores;
· módulos com diferentes tamanhos em bits (8 bits, 16 bits, etc.).
· Esses módulos são fundamentais em sistemas embarcados e automação.
CONFIGURAÇÕES DOS TEMPORIZADORES E CONTADORES
⏱️ Funcionamento básico
· Um temporizador é basicamente um contador.
· Ele pode:
· incrementar (contar para cima);
· decrementar (contar para baixo).
· A direção da contagem pode ser:
· fixa;
· configurável.
· O valor atual da contagem fica armazenado em um registrador.
🔢 Resolução do temporizador
· Um temporizador de n bits pode armazenar valores entre:
significa:
· o menor valor possível é 0;
· o maior valor possível é 2ⁿ − 1;
· onde: n = quantidade de bits do temporizador.
· Exemplo:
· Exemplo com 8 bits
· Para um temporizador de 8 bits:
· Logo:
· menor valor = 0
· maior valor = 255
· O temporizador conta assim: 0 → 1 → 2 → 3 → ... → 255
· Depois disso ocorre o overflow (estouro), e ele volta para: 0
· Exemplo com 16 bits
· Para 16 bits:
· Então o contador vai de: 0 até 65535
⚠️ Problema ao usar temporizadores maiores que a CPU
· Em microcontroladores de 8 bits, um temporizador de 16 bits precisa ser lido em duas partes:
· byte alto;
· byte baixo.
· Isso pode gerar leituras incorretas se o valor mudar durante a leitura.
Exemplo do problema
· Valor atual: 0x00FF
· Próximo ciclo: 0x0100
· Se os bytes forem lidos em momentos diferentes, podem surgir valores errados como:
· 0x0000
· 0x01FF
💡 Solução usada por alguns microcontroladores
· Alguns modelos usam um registrador de buffer.
· Quando o byte inferior é lido:
· o byte superior é automaticamente copiado para o buffer.
· Isso evita inconsistências na leitura.🔔 Overflow (estouro)
· Ocorre quando o temporizador ultrapassa seu valor máximo e volta para zero.
Exemplo: Em um temporizador de 8 bits: após 255 → volta para 0.
⚡ Uso do overflow
· O overflow é usado quando queremos que o temporizador execute alguma ação automaticamente ao atingir seu valor máximo e voltar para zero.
· Serve para:
· gerar uma interrupção automáticas;
· repetir tarefas periodicamente;
· medir intervalos de tempo.
Exemplos práticos
· Piscar um LED em intervalos regulares;
· Atualizar um relógio digital;
· Criar atrasos temporizados;
· Gerar sinais periódicos;
· Controlar motores e PWM.
⚠️ O problema do recarregamento manual
· Após o overflow, o programa precisa:
1. perceber que ocorreu o overflow;
2. executar a interrupção;
3. carregar novamente o valor inicial no temporizador.
· Mas isso não acontece instantaneamente.
· Existe um pequeno atraso da CPU.
Exemplo:
· Imagine que queremos gerar um evento a cada: 10 ms
· O temporizador estoura corretamente após 10 ms.
· Porém, a CPU ainda precisa:
· entrar na interrupção;
· executar instruções;
· recarregar o timer.
· Isso pode levar, por exemplo: 0,2 ms
· Então o período real fica: 10 ms + 0,2 ms = 10,2 ms
❌ Consequência:
· O sinal perde precisão.
· O erro acontece em todos os ciclos e pode acumular.
· Isso é ruim para aplicações que exigem precisão, como:
· PWM;
· geração de frequência;
· relógios;
· controle de motores;
· comunicação serial.
✅ A solução: recarregamento automático
· Alguns temporizadores possuem um modo especial que recarrega automaticamente o valor inicial imediatamente após o overflow.
· Assim:
· não depende da CPU;
· elimina o atraso do software;
· melhora a precisão.
🕒 Fontes de clock dos temporizadores
· O temporizador precisa de um sinal de clock para funcionar.
· Esse clock pode vir de diferentes fontes.
· O microcontrolador pode oferecer vários modos de temporização.
1️⃣ Relógio do sistema (clock interno)
📌 Como funciona:
· É o modo padrão.
· O temporizador usa o mesmo clock do microcontrolador.
· A cada ciclo do clock o temporizador é incrementado.
💡 Importante
· “Interno” significa apenas que o clock é compartilhado com o microcontrolador.
· O oscilador físico pode ser externo.
2️⃣ Prescaler (pré-divisor)
📌 Como funciona:
· O clock do sistema passa por um divisor de frequência chamado prescaler.
· O temporizador recebe um clock mais lento.
· Exemplos de divisão:
· 8
· 64
· 256
· 1024
✅ Vantagem do Prescaler
· Permite medir tempos maiores.
· Aumenta o intervalo do temporizador.
⚠️ Desvantagem do Prescaler
· Reduz a precisão da medição.
· A granularidade fica mais grosseira.
Exemplo:
Sem prescaler:
· maior precisão;
· tempos menores.
Com prescaler:
· tempos maiores;
· menor precisão.
🎯 Regra prática:
· Usar o menor prescaler possível.
· Assim, obtém-se maior precisão.
3️⃣ Pulso externo
📌 Como funciona:
· O temporizador recebe pulsos de um sinal externo.
· Em outras palavras: Conta eventos externos, como:
· pulsos;
· bordas de subida.
· Cada pulso incrementa a contagem.
Aplicações:
· Contagem de objetos;
· Contar de rotação;
· Sensores externos.
💡 Observação: O sinal externo precisa ser mais lento que o clock do sistema para ser detectado corretamente.
4️⃣ Cristal externo (modo assíncrono)
📌 Como funciona:
· O temporizador usa um cristal externo próprio.
· Geralmente utiliza: 32,768 kHz.
🎯 Aplicação principal: Implementar relógio de tempo real (RTC).
💡 Característica importante:
· O temporizador funciona independentemente do restante do microcontrolador.
· Opera de forma assíncrona.
✅ Conclusão:
· Temporizadores são contadores configuráveis.
· Eles podem usar diferentes fontes de clock.
· Overflow pode gerar interrupções periódicas.
· Prescaler aumenta o tempo máximo de contagem, mas reduz precisão.
· Pulsos externos permitem contar eventos externos.
· Cristais externos são usados para relógios em tempo real.
· Alguns microcontroladores usam buffers e recarga automática para aumentar a confiabilidade e precisão.
CAPTURA DE ENTRADA E COMPARAÇÃO DE SAÍDA
📥 Captura de Entrada (Input Capture)
📌 O que é ?
· Recurso usado para registrar o instante exato em que um evento acontece.
· Os eventos normalmente são:
· borda de subida;
· borda de descida.
⚙️ Como funciona:
· Quando o evento ocorre:
· o temporizador copia automaticamente seu valor atual;
· esse valor é armazenado em um registrador de captura.
🔔 O que mais acontece?
· Um sinalizador (flag) é ativado.
· O microcontrolador pode gerar uma interrupção para avisar o programa.
🎯 Aplicações
· Medir tempo entre eventos;
· medir frequência;
· medir velocidade;
· detectar pulsos externos.
💡 Importante: O microcontrolador pode ter um ou mais pinos de captura de entrada.
📤 Comparação de Saída (Output Compare)
📌 O que é?
· É o recurso oposto da captura de entrada.
· Em vez de registrar quando algo acontece:
· ele faz algo acontecer em um instante programado.
⚙️ Como funciona
· O programa coloca um valor em um registrador de comparação.
· Quando o contador atingir esse valor:
· um evento é acionado.
🔧 O que pode acontecer?
O temporizador pode:
· ligar uma saída;
· desligar uma saída;
· inverter o estado da saída;
· gerar apenas uma interrupção interna.
🎯 Aplicações
· Gerar sinais periódicos;
· PWM;
· controle de motores;
· geração de frequência;
· temporização automática.
🔄 Reinicialização automática do contador
📌 Recurso importante
· Muitos temporizadores podem:
· zerar automaticamente o contador
· quando o valor de comparação é atingido.
✅ Vantagem
· Facilita a geração de interrupções periódicas.
· Reduz o trabalho do programa.
· Aumenta a precisão do tempo.
✅ Conclusão:
· Captura de entrada registra quando um evento ocorre.
· Comparação de saída gera um evento em um instante programado.
· Ambos usam o valor do temporizador como referência de tempo.
· Esses recursos são muito usados em automação e sistemas embarcados.
CONTADOR/TEMPORIZADOR NOS MICROCONTROLADORES
⏱️ Temporizadores e contadores
· Microcontroladores possuem temporizadores internos de hardware.
· Eles podem funcionar como:
· temporizador → usando clock interno;
· contador → contando pulsos externos.
📌 Temporizadores no PIC18F4550
🔢 Quantidade de temporizadores
O PIC18F4550 possui 4 temporizadores:
· Timer 0
· Timer 1
· Timer 2
· Timer 3
📏 Tamanho dos temporizadores
· Timer 2
· 8 bits → conta de: 0 até 255
· Timer 0, 1 e 3
· 16 bits → contam de: 0 até 65535
📌 Temporizadores no PIC16F628A
🔢 Possui 3 temporizadores:
· Timer 0 → 8 bits
· Timer 1 → 16 bits
· Timer 2 → 8 bits
📌 Temporizadores no ATmega328 (Arduino Uno)
🔢 Possui 3 temporizadores:
· Timer 0
· Timer 1
· Timer 2
📏 Tamanho dos temporizadores:
· Timer 0 → 8 bits
· Timer 2 → 8 bits
· Timer 1 → 16 bits
⚠️ Uso dos temporizadores específicos no Arduino
1️⃣ Timer 0:
Usado internamente pelo Arduino para:
· delay()
· millis()
· micros()
⚠️ Importante: Alterar esse timer pode prejudicar essas funções.
2️⃣ Timer 1:
· Utilizado pela biblioteca de controle de servos.
✅ Pode ser usado livremente: se a biblioteca de servo não estiver sendo utilizada.
3️⃣ Timer 2
· Utilizado pela função: tone()
✅ Pode ser usado em outras aplicações: caso a função tone() não seja necessária.
✅ Conclusão:
· Temporizadores podem trabalhar com clock interno ou pulsos externos.
· Microcontroladores possuem timers de 8 e 16 bits.
· Timers de 16 bits conseguem contar valores maiores.
· No Arduino, alguns temporizadores já são usados por funções internas da IDE.
PROGRAMANDO TEMPORIZADORES EM MICROCONTROLADORES
⏱️ Temporizadores e interrupções
📌 Funcionamento normal do microcontrolador:
· O microcontrolador executa o programa sequencialmente, uma instrução após a outra.
⚡ O que é uma interrupção?
· É um evento que interrompe temporariamente o programa principal.
· O microcontrolador:
1. pausa o programa;
2. executa uma função especial;
3. retorna ao ponto onde parou.
🔔 Interrupção por temporizador
· O temporizadorpode gerar interrupção quando ocorre overflow.
· Isso permite executar tarefas periódicas automaticamente.
🧮 Cálculo do tempo da interrupção
A fórmula usada é:
Elementos da fórmula:
· Prescaler: divide a frequência do clock.
· Período:
· depende do tamanho do timer:
· 8 bits → 256
· 16 bits → 65536
· Ciclo de máquina: geralmente:
🖥️ Exemplo no PIC16F628A
🎯 Objetivo do código:
· Fazer dois LEDs piscarem:
· RB0 → usando delay_ms();
· RB1 → usando interrupção do Timer 0.
#include // Inclui a biblioteca do microcontrolador PIC16F628A
#fuses XT, MCLR, NOWDT // Configurações dos fusíveis: oscilador XT, reset externo, sem watchdog
#use delay(clock=4MHz) // Define a frequência do clock em 4 MHz
int cont = 0; // Variável contador inicializada em 0
#INT_TIMER0 // Define rotina de interrupção para o Timer0
void interrupcao_t0() {
clear_interrupt(INT_TIMER0); // Limpa a flag da interrupção do Timer0
if (cont == 1000) { // Se contador chegou a 1000
output_toggle(PIN_B1); // Alterna o estado do pino RB1 (liga/desliga LED)
cont = 0; // Zera o contador
}
cont++; // Incrementa o contador a cada interrupção
}
void main() {
enable_interrupts(GLOBAL); // Habilita interrupções globais
enable_interrupts(INT_TIMER0); // Habilita interrupção do Timer0
setup_timer_0(T0_INTERNAL | T0_DIV_1); // Configura Timer0 para usar clock interno sem divisão
while (true) {
output_toggle(PIN_B0); // Alterna o estado do pino RB0 (liga/desliga LED)
delay_ms(1000); // Aguarda 1 segundo
}
}
💡 Explicação do funcionamento
🔹 LED RB0:
· Pisca usando: delay_ms(1000)
· A CPU fica ocupada esperando.
🔹 LED RB1:
· Pisca usando interrupção do Timer0.
· O temporizador gera interrupções automaticamente.
⏱️ Tempo entre interrupções:
Com:
· Timer de 8 bits → período = 256
· Prescaler = 1
· Clock = 4 MHz
O ciclo de máquina é:
Então: 256×1 μs=256 μs
Cada interrupção ocorre a cada: 256 µs
Como o contador conta 1000 interrupções:
O LED RB1 muda de estado a cada: 256 ms
⚠️ Observação importante:
· Muitas IDEs escondem os registradores internos.
· O programador usa funções prontas.
· Isso facilita o desenvolvimento.
🖥️ Temporizadores e interrupções no Arduino
📌 No Arduino
· Algumas funções já usam timers:
· delay()
· millis()
· Para usar interrupções por timer, normalmente é necessário acessar registradores diretamente.
🖥️ Exemplo no Arduino Uno
🎯 Objetivo do código
· Fazer o LED da placa piscar a cada 1 segundo.
· Sem usar delay().
· Deixar a CPU livre para outras tarefas.
#define ledPin 13 // Define o pino 13 como saída para o LED
void setup()
{
pinMode(ledPin, OUTPUT); // Configura o pino do LED como saída
// Configuração do timer1
TCCR1A = 0; // Configura timer para operação normal (sem usar pinos OC1A/OC1B)
TCCR1B = 0; // Limpa o registrador de controle do Timer1
TCCR1B |= (1específicas dos motores DC
1. Motores DC em ventiladores
· Muitos ventiladores modernos estão usando motores DC em vez de motores AC.
· Principais vantagens:
· maior economia de energia;
· maior eficiência.
· Desvantagem: custo inicial mais alto.
· Porém, a economia de energia pode compensar o investimento.
2. Motores DC em bombas hidráulicas
· Bombas hidráulicas são muito usadas na indústria.
· Áreas de aplicação:
· construção;
· mineração;
· manufatura;
· indústria do aço.
Vantagens dos motores DC:
· controle fácil da velocidade;
· resposta rápida;
· boa eficiência.
3. Motores DC em brinquedos
· Muito utilizados em:
· carrinhos de controle remoto;
· trens em miniatura;
· brinquedos motorizados.
Motivos do uso:
· fáceis de utilizar;
· resistentes;
· pequenos e robustos.
4. Motores DC em carros elétricos
· São amplamente usados em veículos elétricos.
· Principais características:
· alta eficiência energética;
· boa durabilidade;
· alto torque inicial.
Também são populares:
· em projetos amadores;
· em kits de carros elétricos.
5. Motores DC em robôs
· Robôs usam motores DC para movimentar partes mecânicas.
Exemplos:
· esteiras;
· braços robóticos;
· câmeras móveis.
Motivos da popularidade:
· alto torque;
· boa eficiência;
· facilidade de controle.
6. Motores DC em bicicletas elétricas
· Bicicletas elétricas utilizam motores DC compactos.
· O motor pode ficar:
· na roda dianteira;
· na roda traseira;
· no centro da bicicleta.
Tipo mais utilizado: motores DC sem escovas (brushless).
Motivos:
· maior potência;
· maior torque;
· melhor eficiência.
🎯 Conclusão
· Motores DC são extremamente versáteis e podem ser usados em:
· aparelhos domésticos;
· sistemas industriais;
· veículos;
· robôs;
· bicicletas elétricas.
· Seu sucesso ocorre devido a características como:
· eficiência;
· controle de velocidade;
· robustez;
· alto torque.
ACIONAMENTO DE MOTORES DC COM PWM
📌 Controle de velocidade de motores DC
· Motores DC funcionam com corrente contínua.
· A velocidade do motor depende da tensão aplicada em seus terminais:
· maior tensão → motor mais rápido;
· menor tensão → motor mais lento.
📌 Problema no microcontrolador
· Para variar a tensão continuamente, seria necessário usar um:
🔸 DAC (Conversor Digital-Analógico)
· Converte sinais digitais em tensão analógica.
· Porém, DACs não são comuns em muitos microcontroladores.
📌 Solução: PWM
🔸 PWM (Pulse Width Modulation)
· Significa: Modulação por Largura de Pulso.
· É uma técnica muito utilizada para controlar motores DC.
⚙️ Como o PWM funciona?
📌 O sinal PWM
· O PWM gera uma onda quadrada digital:
· alternando entre:
· nível alto (ON);
· nível baixo (OFF).
📌 Duty Cycle (Ciclo de Trabalho)
· É a porcentagem do tempo em que o sinal permanece em nível alto (ON).
Exemplos:
· 20% → sinal fica pouco tempo ligado;
· 80% → sinal fica muito tempo ligado.
📌 Controle da tensão média
· Variando o duty cycle: varia-se a tensão média aplicada ao motor.
· Resultado: PWM funciona como um “DAC simplificado”.
🔄 Relação entre PWM e velocidade do motor
🔸 Pulso mais tempo em ON:
· Maior tensão média;
· Maior corrente no motor;
· Campo magnético mais forte;
· Motor gira mais rápido.
🔸 Pulso mais tempo em OFF:
· Menor tensão média;
· Menor potência;
· Motor gira mais devagar.
📌 Funcionamento interno do PWM
· O PWM usa:
· um contador;
· comparações internas no temporizador do microcontrolador.
· Muitos compiladores possuem funções prontas para:
· configurar o duty cycle;
· controlar a saída PWM facilmente.
📌 Controle da potência do motor
· A potência entregue ao motor depende da largura dos pulsos.
Quanto maior a largura do pulso:
· maior a tensão média;
· maior a potência;
· maior a velocidade do motor.
🎯 Conclusão
· O PWM é uma técnica usada para controlar a velocidade de motores DC.
· Ele varia o tempo em que o sinal permanece ligado (ON) e desligado (OFF).
· Isso altera a tensão média aplicada ao motor, controlando sua velocidade sem precisar de um DAC real.
PROGRAMANDO PWM EM MICROCONTROLADORES
📌 O que é PWM?
· PWM significa:
· Pulse Width Modulation;
· Modulação por Largura de Pulso.
· É uma técnica usada para:
· controlar potência;
· controlar velocidade de motores;
· controlar brilho de LEDs;
· simular uma saída analógica usando sinais digitais.
📌 PWM no Arduino UNO
🔸 Pinos PWM disponíveis
· O Arduino UNO possui:
· 14 pinos de entrada e saída;
· 6 pinos com suporte a PWM.
Pinos PWM:
· 3
· 5
· 6
· 9
· 10
· 11
🔸 Função analogWrite()
· Objetivo: Controlar o duty cycle (ciclo de trabalho) do sinal PWM.
· Usada para gerar PWM nos pinos compatíveis.
· Sintaxe: analogWrite(pino, valor);
· Parâmetros:
· pino → Define qual saída PWM será usada.
· valor → Define quanto tempo o sinal ficará em nível alto (ON).
📌 Valores do PWM
· O valor pode variar de:
· 0 → sempre desligado;
· 255 → sempre ligado.
📌 Duty Cycle
· Duty cycle é o percentual de tempo em que o sinal permanece ligado.
Exemplos:
· 0 → 0%
· 64 → aproximadamente 25%
· 127 → aproximadamente 50%
· 191 → aproximadamente 75%
· 255 → 100%
📌 Frequência do PWM
· No Arduino UNO:
· frequência fixa de aproximadamente 490 Hz.
⚙️ Exemplo: Motor DC controlado por botão
📌 Objetivo do código
· Ligar um motor DC quando um botão for pressionado.
· O motor gira na velocidade máxima enquanto o botão estiver pressionado.
void setup() // Executado apenas uma vez
{
pinMode(10, OUTPUT); // Configura o pino 10 como saída PWM para o motor
pinMode(6, INPUT_PULLUP); // Configura o pino 6 como entrada com resistor pull-up interno
}
void loop()
{
if (digitalRead(6) == LOW){ // Verifica se o botão foi pressionado
analogWrite(10, 255); // Envia PWM máximo (100%) para o motor
}
else{
analogWrite(10, 0); // Desliga o motor
}
}
📌 Funcionamento do botão
🔸 INPUT_PULLUP
· O modo INPUT_PULLUP:
· ativa um resistor interno no Arduino;
· mantém o pino em nível HIGH quando o botão não está pressionado.
🔸 Estados do botão
Botão solto: pino 6 = HIGH
Botão pressionado: pino 6 = LOW
📌 Funcionamento do programa
🔹 Quando o botão é pressionado
· O pino 6 vai para LOW.
· O Arduino envia: analogWrite(10, 255);
· Resultado:
· tensão máxima no motor;
· velocidade máxima.
🔹 Quando o botão não está pressionado
· O Arduino envia: analogWrite(10, 0);
· Resultado: motor desligado.
📌 Controle de velocidade
A velocidade do motor pode ser alterada mudando o valor do PWM.
Exemplos:
Valor PWM
Velocidade aproximada
0
0%
64
25%
127
50%
191
75%
255
100%
Resumindo
· O Arduino usa PWM para controlar motores e outros dispositivos.
· A função analogWrite() controla o duty cycle do sinal PWM.
· Variando o duty cycle, varia-se a tensão média aplicada ao motor.
· Isso permite controlar a velocidade do motor DC de forma simples e eficiente.
📌 PWM em microcontroladores PIC
🔸 Timer 2
· No microcontrolador PIC18F4550, apenas o Timer 2 pode gerar sinais PWM.
· O Timer 2 é:
· um registrador de 8 bits;
· usado como base de tempo para o PWM.
📌 Frequência do PWM
A frequência do PWM é calculada pela fórmula:
Elementos da fórmula:
🔸 Frequência do cristal: Frequência do clock do microcontrolador.
🔸 Prescaler do Timer 2: Divide a velocidade da contagem do timer.
· Valores possíveis:
· 1
· 4
· 16
🔸 PR2:
· Define o período do PWM.
· Pode variar de 0 até 255.
Exemplo de cálculo:
Considerando:
· cristal = 4 MHz;
· PR2 = 124;
· prescaler = 16.
Temos:
✅Resultado: frequência PWM = 500 Hz.
📌 Configuração do Timer 2
1. Função utilizada: setup_timer_2(T2_DIV_BY_16, PR2, 1);
2. Parâmetros:
· T2_DIV_BY_16: Define prescaler = 16.
· PR2: Define o período do PWM.
· 1: Define o pós-escalador (postscaler).
📌 Duty Cycle no PIC
O duty cycle é calculado por:
🔸 onde:
· DC → valor do duty cycle;
· P → percentual desejado.
⚙️ Exemplo de PWM no PIC18F4550
📌 Objetivo do código
· Gerar PWM no pino RC1 para controlar a velocidade de uma ventoinha.
· O motoropera com 50% da potência máxima.
#include // Biblioteca do microcontrolador PIC18F4550
#fuses XT, MCLR, NOWDT // Configuração dos fusíveis do microcontrolador
#use delay(clock=4MHz) // Define o clock de 4 MHz
void main() {
unsigned int16 P; // Variável para armazenar o percentual do duty cycle
unsigned int16 PR2; // Variável para armazenar o valor do período PWM
unsigned int16 DC; // Variável para armazenar o duty cycle calculado
PR2 = 124; // Define o valor do período para gerar 500 Hz
P = 50; // 50% de duty cycle ou metade da potência máxima
setup_timer_2(T2_DIV_BY_16, PR2, 1); // Configura o Timer 2
setup_ccp1(CCP_PWM); // Configura o módulo CCP1 em modo PWM
DC = (unsigned int16)((PR2 + 1) * 4 * (P/100.0)); // Calcula o duty cycle
set_pwm1_duty(DC); // Aplica o duty cycle calculado
while(true) { // Loop infinito
}
}
📌 Controle de velocidade do motor
· A velocidade pode ser alterada modificando o valor de P.
Exemplos:
P (%)
Velocidade aproximada
0
Motor desligado
25
Velocidade baixa
50
Velocidade média
75
Velocidade alta
100
Velocidade máxima
📌 Drivers de motor
🔸 Problema
· Os pinos do microcontrolador fornecem pouca corrente elétrica.
· Porém, muitos motores precisam de:
· corrente maior;
· potência maior.
🔸 Solução: Driver de motor
O que é o Driver de motor?
· Circuito usado entre:
· microcontrolador;
· motor.
Função:
· Receber sinal fraco do microcontrolador;
· fornecer corrente suficiente para o motor.
📌 Aplicações dos drivers
Drivers podem controlar:
· motores DC;
· motores de passo;
· servo motores;
· sistemas pneumáticos;
· resistências de aquecimento;
· outros atuadores.
🎯 Resumindo:
· O PIC18F4550 utiliza o Timer 2 para gerar PWM.
· O PWM permite controlar velocidade e potência de motores.
· O duty cycle define a potência aplicada ao motor.
· Drivers de motor são necessários para acionar cargas maiores com segurança.
TEMA 5 – PERIFÉRICOS EXTERNOS
INTRODUÇÃO
🔌 O que são periféricos externos
· São dispositivos adicionados fora do microcontrolador quando os periféricos internos não são suficientes para a aplicação.
· Esses componentes são conectados na mesma placa e se comunicam com o microcontrolador.
· Permitem ampliar funcionalidades e criar sistemas embarcados mais completos.
⚙️ Comunicação e controle dos periféricos externos
· A comunicação é feita usando protocolos como I2C, UART e SPI.
· Técnicas de interrupção ajudam no atendimento eficiente desses dispositivos.
· A programação em C permite controlar periféricos externos em plataformas como Arduino e PIC.
Módulo 1. Funções de programação de protocolos de transmissão de dados em microcontroladores para a comunicação com dispositivos externos
TRANSMISSÃO DE DADOS
🔹 O que é transmissão de dados?
· É o processo de enviar informações digitais ou analógicas entre dispositivos.
· Ocorre por meio de um canal ou meio de comunicação.
· Permite que dispositivos troquem informações em diferentes ambientes.
🔹 Principais tipos de comunicação
· Ponto a ponto: Comunicação entre dois dispositivos diretamente.
· Ponto a multiponto: Um dispositivo envia dados para vários dispositivos.
· Multiponto a multiponto: Vários dispositivos podem enviar e receber dados entre si.
🔹 Tipos de transmissão
· Pode ser:
· Analógica
· Digital
· A transmissão digital é a mais utilizada atualmente.
· Por isso, também é chamada de:
· Comunicação digital
· Transmissão digital
🔹 Funcionamento da transmissão de dados
1. Um dispositivo de origem gera informações.
2. Os dados são convertidos em fluxos de bits digitais.
3. Esses dados são enviados por um meio de comunicação.
4. O dispositivo de destino recebe as informações.
🔹 Formas de transmissão dos dados
· Paralela: Vários bits são transmitidos ao mesmo tempo.
· Serial: Os bits são transmitidos um após o outro.
📌 Ideia principal
A transmissão de dados permite que dispositivos compartilhem informações de forma organizada e eficiente, sendo essencial para redes, computadores e sistemas de comunicação modernos.
🔌 Transmissão Paralela
🔹 O que é transmissão paralela?
· É um tipo de transmissão em que vários bits são enviados ao mesmo tempo.
· Muito utilizada dentro de placas de circuito com microcontroladores.
· Cada bit possui sua própria linha ou fio de transmissão.
🔹 Como funciona?
· Para transmitir n bits, são necessários n fios.
· Todos os bits são enviados simultaneamente em um único pulso de clock.
· A comunicação ocorre entre diferentes subunidades do sistema eletrônico.
🔹 Vantagens da transmissão paralela
· Alta velocidade de transferência.
· Pequeno atraso na comunicação.
· Ideal para curtas distâncias dentro de circuitos eletrônicos.
🔹 Desvantagens
· Necessita de muitas linhas e conexões.
· Chips e circuitos ficam maiores e mais complexos.
· Ocupa mais espaço físico.
· Aumenta a quantidade de portas necessárias no hardware.
🔹 Uso atual
· O uso de portas paralelas em periféricos externos tornou-se menos comum.
· Ainda é utilizada em alguns: Conversores analógicos-digitais de alta velocidade.
🔹 Uso em microcontroladores
· Microcontroladores utilizam portas digitais de entrada e saída para comunicação paralela.
· Geralmente possuem: 2 ou 3 portas de 8 bits.
📌 Conclusão: A transmissão paralela envia vários bits simultaneamente, oferecendo alta velocidade, porém exige maior quantidade de fios e espaço físico, o que reduziu seu uso em sistemas modernos.
🔄 Transmissão Serial
🔹 O que é transmissão serial?
· É um tipo de transmissão em que os dados são enviados um bit por vez.
· Utiliza poucas linhas ou fios para comunicação.
· Todos os bits passam por uma única linha de transmissão.
🔹 Como funciona?
· Cada bit é transmitido em intervalos fixos de tempo.
· Um único bit é enviado a cada pulso de clock.
· Os dados seguem uma sequência organizada até chegar ao destino.
Exemplo de transmissão:
· Um byte como: 10011010
· Pode ser enviado:
· Do bit menos significativo para o mais significativo.
· Tudo ocorre usando apenas uma linha de comunicação.
🔹 Vantagem principal
· Necessita de poucos fios.
· Reduz a complexidade do circuito.
· Ocupa menos espaço físico.
🔹 Tipos de transmissão serial
Assíncrona:
· Não utiliza um clock compartilhado contínuo.
· Os dados são enviados em intervalos independentes.
Síncrona:
· Usa sincronização contínua entre transmissor e receptor.
· Permite maior controle e velocidade.
🔹 Sincronização de bits
· É o mecanismo que indica:
· Quando os dados começam.
· Quando os dados terminam.
· Ajuda o receptor a interpretar corretamente as informações recebidas.
· Fornece controle de temporização durante a transmissão.
📌 Resumo: A transmissão serial envia os dados bit a bit usando apenas uma linha de comunicação, tornando o sistema mais simples, compacto e muito utilizado em dispositivos modernos.
📌 Transmissão Assíncrona
🔹 O que é?
· Tipo de transmissão serial que envia um caractere (byte) por vez.
🔹 Como ocorre a sincronização?
· Utiliza:
· Bit de início (start bit)
· Bit de parada (stop bit)
· Bit de início
· Geralmente possui valor 0.
· Indica o começo da transmissão.
· Avisa ao receptor que novos dados estão chegando.
· Bit de parada
· Geralmente possui valor 1.
· Indica o fim do byte transmitido.
🔹 Características
· Cada byte precisa desses bits extras.
· Aumenta a quantidade total de bits transmitidos.
· Consome mais largura de banda.
🔹 Vantagem
· Implementação simples.
· Não necessita clock compartilhado contínuo.
📌 Transmissão Síncrona
✅ O que é?
· Tipo de transmissão serial que envia vários bytes continuamente.
· Não utiliza bits de início e parada.
🔹 Como funciona?
· Os bits são agrupados em quadros maiores.
· Não existem espaços entre os bytes transmitidos.
🔹 Sincronização
· O emissor e o receptor utilizam:
· Um sinal de clock compartilhado.
· Esse clock sincroniza a transmissão de cada bit.
🔹 Características
· Emissor e receptor devem operar na mesma frequência.
· Oreceptor precisa separar o fluxo de bits em bytes.
🔹 Vantagens
· Maior eficiência na transmissão.
· Menor desperdício de largura de banda.
· Mais rápida que a transmissão assíncrona.
📌 Diferença principal
ASSÍNCRONA
SÍNCRONA
Usa bits de início e parada
Não usa bits extras
Envia 1 byte por vez
Envia vários bytes continuamente
Mais simples
Mais rápida e eficiente
Consome mais largura de banda
Melhor aproveitamento da transmissão
PROTOCOLO SERIAL I2C
🔹 O que é o I2C?
· I2C significa Inter-Integrated Circuit.
· É um protocolo de comunicação serial de curta distância.
· Foi desenvolvido pela Philips Semiconductor.
· Seu objetivo é facilitar a comunicação entre chips e reduzir custos de fabricação.
🔹 Antes e depois do I2C
📌 Antes do I2C
· A comunicação entre chips utilizava: Interfaces paralelas.
· Necessitava de muitos fios e pinos.
· Alguns chips utilizavam mais de 20 pinos para:
· Endereçamento
· Controle
· Seleção
· Transferência de dados
📌 Após o I2C
· A comunicação passou a utilizar apenas: Dois fios.
· Isso reduziu:
· O tamanho dos chips
· O custo dos circuitos
· A quantidade de conexões
🔹 Fios utilizados no I2C
FIO
FUNÇÃO
SDA
Transporte de dados
SCL
Clock e sincronização
🔹 Funcionamento
· O SDA transmite os dados.
· O SCL sincroniza emissor e receptor.
· A transmissão ocorre: Um bit por vez.
· O I2C é uma comunicação serial síncrona.
🔹 Mestre e Escravo
📌 Mestre (Master)
· Inicia a comunicação.
· Envia mensagens no barramento.
📌 Escravo (Slave)
· Responde às mensagens recebidas.
· Possui endereço exclusivo.
🔹 Características dos dispositivos
· Um dispositivo pode ser:
· Apenas mestre
· Apenas escravo
· Mestre e escravo alternadamente
🔹 Barramento I2C
· Permite conectar vários dispositivos usando apenas dois fios.
· Pode conectar:
· Microcontroladores
· Conversores ADC
· Conversores DAC
· Sensores e outros chips
🔹 Como ocorre a comunicação
📌 Enviando mensagens
· O mestre envia:
· O endereço do escravo
· Os dados da comunicação
📌 Recebendo mensagens
· Todos os dispositivos recebem a mensagem.
· Apenas o escravo com o endereço correspondente responde.
🔹 Suporte a múltiplos mestres
· O I2C permite vários mestres no mesmo barramento.
· Isso melhora:
· Organização
· Eficiência
· Redução de tráfego
🔹 Arbitragem do barramento
· Se dois mestres transmitirem ao mesmo tempo: O protocolo detecta conflito.
📌 Detecção de perda de arbitragem
· O mestre que perde: Interrompe sua transmissão.
· O outro mestre continua normalmente.
· Isso evita erros e corrupção de dados.
🔹 Vantagens do I2C
· Poucos fios.
· Menor custo.
· Chips menores.
· Comunicação simples e eficiente.
· Possibilidade de conectar vários dispositivos.
🔹 Aplicações do I2C
📌 Aplicações iniciais
· Controle de:
· Volume
· Contraste
· Em rádios e televisores.
📌 Aplicações atuais
· Sistemas computacionais
· Equipamentos industriais
· Sistemas médicos
· Eletrônicos de entretenimento
· Sistemas militares
📌 Resumindo: O protocolo I2C é uma forma eficiente e econômica de conectar vários dispositivos utilizando apenas dois fios, sendo amplamente utilizado em sistemas eletrônicos modernos devido à sua simplicidade e flexibilidade.
📌Funções para protocolo I2C no Arduino e PIC
Comunicação I2C no Arduino
· O Arduino utiliza a biblioteca Wire para implementar comunicação I2C.
· No Arduino Uno:
· A4 = SDA (dados)
· A5 = SCL (clock)
· Na comunicação I2C:
· Existe um dispositivo mestre.
· Existem um ou mais dispositivos escravos.
· No exemplo:
· O Arduino mestre possui um botão no pino 12.
· O Arduino escravo possui um LED no pino 13.
· Quando o botão é pressionado, o mestre envia o caractere 'H'.
· Quando o botão não é pressionado, envia 'L'.
· O escravo recebe os caracteres e liga ou desliga o LED.
Código I2C Mestre (Arduino)
Objetivo do código: Ler o estado de um botão e enviar caracteres (H ou L) para o Arduino escravo via I2C.
#include // Biblioteca para comunicação I2C
void setup() {
Wire.begin(); // Inicializa o Arduino como mestre I2C
pinMode(12, INPUT_PULLUP); // Configura o pino 12 como entrada com resistor pull-up
}
void loop() {
// Endereço do escravo é 5
if (digitalRead(12) == LOW) { // Verifica se o botão foi pressionado
Wire.beginTransmission(5); // Inicia transmissão para o escravo endereço 5
Wire.write('H'); // Envia o caractere 'H'
Wire.endTransmission(); // Finaliza a transmissão
delay(100); // Pequena pausa
} else {
Wire.beginTransmission(5); // Inicia transmissão para o escravo
Wire.write('L'); // Envia o caractere 'L'
Wire.endTransmission(); // Finaliza a transmissão
delay(100); // Pequena pausa
}
}
Código I2C Escravo (Arduino)
Objetivo do código: Receber dados do mestre via I2C e controlar um LED de acordo com o caractere recebido.
#include // Biblioteca para comunicação I2C
void setup() {
Wire.begin(5); // Inicializa o Arduino como escravo de endereço 5
Wire.onReceive(react); // Define a função react() para tratar dados recebidos
pinMode(13, OUTPUT); // Configura o pino 13 como saída
digitalWrite(13, LOW); // Inicia com LED apagado
}
void loop() {
// Loop principal vazio
}
void react(int n) {
while (Wire.available()) { // Verifica se há dados disponíveis
char c = Wire.read(); // Lê o caractere recebido
if (c == 'H') { // Se receber 'H'
digitalWrite(13, HIGH); // Liga o LED
} else {
digitalWrite(13, LOW); // Desliga o LED
}
}
}
📌 Principais funções I2C no PIC
Função
Objetivo
i2c_start()
Inicia a comunicação I2C
i2c_write(data)
Envia 1 byte de dados
i2c_read()
Lê 1 byte recebido
i2c_stop()
Finaliza a comunicação I2C
i2c_poll()
Verifica se um byte foi recebido
📌 Funcionamento geral do I2C
· O protocolo I2C permite comunicação entre vários dispositivos usando apenas dois fios:
· SDA → dados
· SCL → clock
· Cada dispositivo escravo possui um endereço único.
· O mestre controla a comunicação e decide quando enviar ou receber dados.
PROTOCOLO UART
🔹 O que é UART?
· UART significa:
· Universal Asynchronous Transmitter Receiver
· (Transmissor Receptor Universal Assíncrono)
· É um dos protocolos mais usados para:
· Comunicação serial.
· Permite comunicação:
· Full duplex
· Ou seja, transmitir e receber dados ao mesmo tempo.
🔹 Características do UART
Comunicação assíncrona:
· Não utiliza sinal de clock compartilhado.
· A sincronização ocorre por:
· Bit de início
· Bit de parada
· Temporização
🔹 Funcionamento do UART
· O transmissor envia os dados.
· O receptor interpreta os dados usando os bits de controle.
· Ambos os dispositivos devem utilizar: A mesma velocidade de transmissão.
🔹 Baud Rate
O que é?
· É a velocidade da comunicação serial.
· Define quantos bits são transmitidos por segundo.
Unidade:
· bps: Bits por segundo.
Taxas comuns:
· 9600 bps
· 33600 bps
· 115200 bps
🔹 Pinos da UART
Pino
Função
TX
Transmissão de dados
RX
Recepção de dados
🔹 Ligação correta
· O pino: TX de um dispositivo
· Deve ser conectado ao RX do outro dispositivo.
🔹 UART e RS232
📌 UART
· Define: Como os dados são organizados e transmitidos.
· É um protocolo de comunicação.
📌 RS232
· Define: A camada física da comunicação.
· Era usado em antigas portas COM de computadores.
🔹 Porta RS232
Características:
· Utilizava: Conector DB9 de 9 pinos.
Níveis de tensão RS232:
Lógica
Tensão
1
-3 V até -25 V
0
+3 V até +25 V
🔹 Lógica TTL da UART
Lógica
Tensão
1
2,4 V até 5 V
0
0 V até 0,4 V
🔹 Problema de compatibilidade
· UART TTL não pode ser conectada diretamente à RS232.
· Os níveis elétricos são diferentes.
🔹 Conversor MAX232
Função:
· Converter: Sinais TTL ↔ RS232.
· Permite comunicação entre:
· Microcontroladores
· Computadores com RS232.
🔹· Precisavam de vários chips adicionais:
· Entrada e saída (E/S)
· Relógio (clock)
· Decodificadores
· Consequência: Ainda havia complexidade e custo elevados
🚀 Evolução para os microcontroladores (anos 1990)
· Avanços na fabricação de chips permitiram: Integrar vários componentes em um único chip
· Surgimento dos microcontroladores:
· Um microcontrolador reúne em um único chip tudo o que antes era separado:
· Microprocessador (processador) + memória + periféricos (E/S) no mesmo chip
· Isso elimina a necessidade de vários componentes externos.
· Resultado: sistemas mais simples, baratos e compactos.
📈 Impacto dos microcontroladores
· Benefícios principais:
· Redução significativa do tamanho dos dispositivos
· Mais funcionalidades integradas
· Menor custo de produção
· Uso crescente:
· Produtos eletrônicos de consumo
· Sistemas de controle
🌍 Popularização (anos 2000 em diante)
· Tornaram-se essenciais: Praticamente todo dispositivo eletrônico utiliza microcontroladores
· Consequência: Projetos sem microcontroladores tornaram-se raros
👉 Em resumo: ficaram populares porque tornam os dispositivos mais baratos, menores e mais fáceis de desenvolver.
🎯 Importância para projetistas
· Conhecer microcontroladores é essencial porque:
· São amplamente utilizados
· Permitem desenvolver projetos mais rápidos e eficientes
· Facilitam a implementação de soluções complexas
🧰 Vantagens práticas no desenvolvimento
· Desenvolvimento mais rápido
· Facilidade de implementação
· Grande disponibilidade de:
· Software gratuito
· Comunidades de suporte ativas
🧠 Conclusão
· Microprocessadores foram um avanço importante, mas incompleto
· Microcontroladores resolveram suas limitações ao integrar tudo em um chip
· Hoje eles são a base da eletrônica moderna, sendo indispensáveis em projetos
Módulo 2. Componentes básicos de microcontroladores
TERMOS FREQUENTEMENTE USADOS
🧠 Microprocessador (MPU) – foco em processamento
· É basicamente a CPU (cérebro do sistema), como em um computador
· Precisa de componentes externos (memória, periféricos) para funcionar
· Não funciona sozinho (não é autônomo)
· ⚠️ Importante: “processador” refere-se apenas ao núcleo (CPU – Unidade Central de Processamento)
🔄 Controlador de sinal misto – digital + analógico
· É um tipo de microcontrolador que:
· Processa sinais digitais e analógicos
· Muito usado quando há sensores do mundo real (temperatura, som, etc.)
📦 Sistema embarcado (embutido) – foco em função específica
· Sistema onde o controlador está integrado ao próprio dispositivo
· Projetado para uma tarefa específica
· Exemplos: Celular, eletrodomésticos, sistemas industriais
· Atenção: Um computador pode ser considerado embarcado:
· Se o computador é usado para uma tarefa específica e dedicada (ex: controlar uma máquina), ele é um sistema embarcado.
· Se é usado de forma geral (ex: navegar, editar textos), não é embarcado.
· 👉 Ou seja: o que define se um equipamento é ou não embarcado, é como ele é utilizado.
· 👉 Resumindo: Nem todo computador é considerado embarcado porque isso depende da função que ele está desempenhando.
⏱️ Sistema de tempo real – resposta dentro de prazo
· É um sistema que precisa responder a eventos em tempo determinado
· Usado em aplicações críticas:
· Aeroespacial
· Automotiva
· Ferroviária
⚙️ Processador embutido – termo moderno
· Usado em sistemas embarcados mais avançados
· Geralmente de 32 bits (mais potente)
· Diferença comum:
· “Processador” → mais avançado (32 bits)
· “Controlador” → mais simples e barato (4, 8, 16 bits)
📡 Processador de Sinal Digital (DSP) – foco em sinais
· Projetado para processar sinais com alto desempenho
· Projetados para realizar operações rápidas, como:
· Soma e multiplicação (principais operações para o processamento de sinais)
· Aplicação comum: Telecomunicações (ex: celulares)
· 🔀 Soluções híbridas:
· Integram microcontrolador + DSP no mesmo chip
· Permitem controle + processamento de sinais
🎯 Resumo geral
· Microprocessador: só CPU, precisa de outros componentes
· Microcontrolador: sistema completo para controle
· Sistema embarcado: dispositivo com função específica
· Tempo real: resposta rápida e dentro de prazo
· DSP: especializado em processamento de sinais
SISTEMAS BASEADOS EM MICROCONTROLADORES
📌 Tipos de sistemas eletrônicos
1. Sistema baseado em microprocessador (uso geral)
· Formado por: Microprocessador + hardware externo + software
· Características:
· Não funciona sozinho (precisa de memória e periféricos externos)
· Pode ser programado e reprogramado para várias tarefas
· Aplicação principal: Computadores (ex: PC)
· 👉 Ideia-chave: sistema flexível e de uso geral
2. Sistema baseado em microcontrolador (sistema embarcado)
· Formado por: Microcontrolador + periféricos (sensores, atuadores, etc.)
· Características:
· Executa uma função específica repetidamente
· Projetado com restrições:
· Tamanho pequeno
· Baixo consumo de energia
· Pode ter resposta em tempo real
· Possíveis componentes externos:
· Sensores
· Motores
· Displays
· Memória adicional (em alguns casos)
· 👉 Ideia-chave: sistema dedicado a uma única função
🏠 Exemplos de sistemas com microcontroladores
· Eletrodomésticos:
· Micro-ondas
· Termostatos
· Dispositivos eletrônicos:
· Câmeras digitais
· Balanças eletrônicas
· Automóveis
👁️ Característica importante: “invisibilidade”
· O usuário NÃO percebe o microcontrolador
· O funcionamento:
· Parece simples (botões, luzes, etc.)
· Mas internamente há controle eletrônico avançado
🎯 Resumo direto (comparação de foco)
· Microprocessador:
· Uso geral
· Flexível (várias aplicações)
· Base de computadores
· Microcontrolador:
· Uso específico
· Integrado e eficiente
· Base dos sistemas embarcados
ARQUITETURA BÁSICA DE MICROCONTROLADORES
📌 Visão geral da arquitetura
· Microcontroladores são chamados de “computadores de chip único” porque já possuem:
· CPU (processamento)
· Memória
· Periféricos (E/S, temporizadores, etc.)
· 👉 Funcionam sozinhos, sem necessidade de muitos componentes externos
· Principais componentes internos do microcontrolador:
· CPU
· Memória
· Entrada/Saída (E/S)
· Temporizador
· Conversor ADC e DAC
🧠 CPU (Unidade Central de Processamento)
📌 Função principal
· Executar o programa armazenado na memória
· Controlar o funcionamento dos periféricos
🔄 Como a CPU funciona
· Busca instruções (opcodes) na memória
· Interpreta e executa essas instruções
· Trabalha de forma sequencial, podendo:
· Seguir ordem normal
· Fazer saltos (desvios) conforme o programa
🗂️ Registradores (memória interna rápida)
· Armazenam dados temporários
· Usados em cálculos intermediários
· Reduzem acesso à memória externa (mais lenta)
· Alguns têm funções especiais:
· Ex: indicar próxima instrução a ser executada
➕ ULA (Unidade Lógica Aritmética)
· Responsável pelos cálculos: Soma, subtração, operações lógicas
· CPUs mais avançadas: Realizam cálculos complexos (ex: ponto flutuante)
🔍 Decodificador de instruções
· Traduz os códigos (opcodes) em ações reais
· Diz à CPU o que fazer em cada instrução
🔌 Barramentos (comunicação da CPU)
🔹 Barramento de dados
· Transporta os dados (bits 0 e 1)
· Representação:
· 1 → tensão (ex: 5V / 3,3V)
· 0 → 0V
· Conecta CPU a memória e periféricos
🔹 Barramento de endereços
· Define qual dispositivo ou posição de memória será acessado
· Evita conflitos: Apenas um dispositivo usa o barramento por vez
🎯 Resumindo:
· CPU = cérebro do sistema
· Executa instruções, faz cálculos e controla tudo
· Usa:
· Registradores → armazenamento rápido
· ULA → cálculos
· Barramentos → comunicação
💾 Memória
📊 Tipos de Memória:
🔹 RAM (Memória volátil – uso temporário)
· Armazena dados que mudam durante a execução do programa
· Perde todas as informações ao desligar
· 👉 Usada para variáveis e cálculos temporários
🔹 ROM (Memória não volátil – uso permanente)
· Mantém os dados mesmo sem energia
· Usada para armazenar o programa do sistemaUART em computadores modernos
Conversores USB/Serial UART
· Criam: Uma porta COM virtual.
· Permitem usar UART através da USB.
🔹 Outros padrões compatíveis
· RS485: Muito usado em ambientes industriais.
· RS422:Também utilizado em sistemas industriais.
🔹 Vantagens da UART
· Comunicação simples.
· Poucos fios.
· Full duplex.
· Muito utilizada em microcontroladores e sistemas embarcados.
📌 Resumindo: A UART é um protocolo de comunicação serial assíncrona muito utilizado para troca de dados entre dispositivos, usando TX e RX, sendo compatível com diferentes padrões físicos como RS232, RS485 e USB/Serial.
💻 Funções para uso de porta serial em PIC
🔹 Comunicação Serial em PIC
✅Objetivo:
· Utilizar a porta serial UART para:
· Enviar mensagens.
· Receber caracteres.
· Realizar comunicação serial.
🔹 Configuração da UART no PIC
✅ Configuração principal: #use rs232(uart1, baud = 9600)
· Configura:
· UART1
· Baud Rate de 9600 bps.
🔹 Funcionamento do programa
· O programa:
1. Inicializa a UART.
2. Envia mensagens pela serial.
3. Aguarda caracteres recebidos.
4. Devolve o caractere recebido.
💻 Código UART para PIC
🎯 Objetivo: Enviar mensagens pela UART e ecoar os caracteres recebidos.
#include // Biblioteca do microcontrolador PIC18F4550
#fuses NOMCLR INTRC_IO // Configuração dos fusíveis do PIC
#use delay(clock = 8000000) // Define clock de 8 MHz
#use rs232(uart1, baud = 9600) // Inicializa UART1 com baud rate 9600
#include // Biblioteca de entrada e saída padrão
char message[] = "Microcontrolador PIC18F4550 - exemplo UART"; // Mensagem a ser enviada
char i, j, textsize; // Variáveis auxiliares
void main(){
setup_oscillator(OSC_8MHZ); // Configura oscilador interno em 8 MHz
putc(13); // Retorno de carro (primeira coluna)
printf("Ola Mundo!"); // Envia string pela UART
delay_ms(5000); // Espera 5 segundos
putc(13); // Retorno de carro
putc(10); // Nova linha
textsize = strlen(message); // Conta quantidade de caracteres
for(j = 0; j· executar ações → usando atuadores.
· Sensores e atuadores fazem parte dos chamados transdutores.
· Transdutor é um dispositivo que:
· converte grandezas físicas em sinais elétricos;
· ou transforma sinais elétricos em ações físicas.
📌 Sensores
· Sensores detectam mudanças no ambiente físico.
· Eles transformam essas mudanças em sinais elétricos que podem ser lidos pelo microcontrolador.
Exemplos de grandezas detectadas:
· Luz
· Temperatura
· Movimento
· Umidade
· Pressão
· Vibração
Funcionamento:
1. O sensor percebe uma condição do ambiente.
2. Gera um sinal elétrico proporcional.
3. O microcontrolador processa esse sinal.
4. O dado pode:
· ser exibido;
· armazenado;
· transmitido;
· ou usado para controle do sistema.
📌 Atuadores
· Atuadores recebem sinais elétricos do microcontrolador e realizam uma ação física.
· Eles transformam energia em movimento ou acionamento.
Tipos de atuadores:
· Pneumáticos
· Hidráulicos
· Elétricos
· Térmicos
· Magnéticos
Exemplos:
· Motores elétricos
· Motores de passo
· Macacos hidráulicos
· Vibrador de celular
Exemplo de funcionamento:
1. O sensor envia dados ao microcontrolador.
2. O programa processa as informações.
3. O microcontrolador envia um sinal ao atuador.
4. O atuador executa uma ação, como:
· ligar uma luz;
· mover um motor;
· abrir uma porta;
· gerar vibração.
Resumo
· Sensores captam informações do ambiente.
· Microcontroladores processam essas informações.
· Atuadores executam ações físicas com base nos sinais recebidos.
· Juntos, eles permitem o funcionamento de sistemas automatizados e embarcados.
TIPOS DE SENSORES QUANTO AO SINAL GERADO
📌 Sensores Analógicos
· Produzem um sinal contínuo na saída.
· A tensão gerada normalmente é proporcional à grandeza medida.
· São usados para medir valores que variam continuamente.
Exemplos de grandezas analógicas:
· Temperatura
· Velocidade
· Pressão
· Deslocamento
· Deformação
Exemplo:
· Um termopar mede a temperatura de um líquido.
· Conforme a temperatura aumenta ou diminui, a tensão de saída também varia continuamente.
Característica principal: Possuem muitos valores possíveis entre o mínimo e o máximo.
📌 Sensores Digitais
· Produzem sinais discretos.
· A saída normalmente representa:
· nível lógico 0
· ou nível lógico 1
Exemplo:
· Um botão (push button) pode ser considerado um sensor digital:
· botão pressionado → nível lógico 1;
· botão solto → nível lógico 0.
Característica principal: Trabalham apenas com estados definidos, sem valores intermediários.
📌 Comparação entre Sensores Analógicos e Digitais
Sensor Analógico
Sensor Digital
Saída contínua
Saída discreta
Mede valores variáveis
Mede estados definidos
Ex.: temperatura e pressão
Ex.: botão e chave
Resumo
· Sensores analógicos geram sinais contínuos proporcionais à grandeza medida.
· Sensores digitais geram sinais binários, representando estados como ligado/desligado.
· Ambos são amplamente utilizados em sistemas embarcados e microcontroladores.
UTILIZAÇÃO DE SENSORES DIGITAIS
📌 O que é o sensor PIR?
· O sensor PIR (Passive Infrared Sensor) é um sensor digital usado para detectar movimento.
· Ele identifica principalmente a presença de pessoas na área monitorada.
· É muito utilizado em:
· alarmes;
· iluminação automática;
· sistemas de segurança;
· automação residencial.
Características do sensor PIR:
· Pequeno
· Barato
· Baixo consumo de energia
· Fácil de usar
· Grande durabilidade
Funcionamento do sensor PIR:
· O PIR detecta radiação infravermelha (RI) emitida pelos corpos.
· Todos os objetos emitem radiação infravermelha:
· quanto mais quente o objeto, maior a emissão.
Como o sensor detecta movimento:
· O sensor possui duas partes internas.
· Essas partes normalmente se anulam.
· Quando ocorre movimento:
· uma metade recebe mais RI que a outra;
· o sensor identifica a diferença;
· a saída muda para nível lógico alto ou baixo.
Resultado: O sensor envia um sinal digital indicando presença de movimento.
📌 Sensor PIR com Arduino
Ligação do circuito:
· O sensor PIR foi conectado a uma placa Arduino Uno.
Ligações:
· Fio vermelho: alimentação positiva.
· Fio preto: GND (terra).
· Fio amarelo: saída digital do sensor.
Funcionamento:
· Quando o PIR detecta movimento:
· envia nível lógico alto (HIGH);
· o Arduino interpreta o sinal;
· o LED da placa começa a piscar.
Objetivo do código: O programa verifica continuamente se o sensor PIR detectou movimento. Quando isso acontece, o LED do Arduino pisca.
void setup() {
pinMode(2, INPUT); // Configura o pino 2 como entrada para receber o sinal do sensor PIR
pinMode(13, OUTPUT); // Configura o pino 13 como saída para controlar o LED
}
void loop() {
if (digitalRead(2) == HIGH) // Verifica se o sensor PIR detectou movimento
{
digitalWrite(13, HIGH); // Liga o LED da placa
delay(100); // Aguarda 100 milissegundos
digitalWrite(13, LOW); // Desliga o LED da placa
delay(100); // Aguarda mais 100 milissegundos
}
}
📌 Como funciona a simulação no Tinkercad
· A simulação do movimento é feita diretamente no sensor PIR.
· Para simular:
1. Clica-se no centro do sensor;
2. Surge um círculo na área sombreada à frente do sensor;
3. O círculo deve ser movimentado para representar a presença de uma pessoa ou objeto em movimento.
Observação importante:
· Em alguns casos, pode ser necessário:
· diminuir o zoom da área de montagem;
· para visualizar corretamente a área sombreada de detecção do sensor.
Resultado da simulação:
· Quando o movimento é detectado:
· o sensor envia nível lógico alto ao Arduino;
· o código executa o acionamento do LED;
· o LED da placa começa a piscar.
Resumo
· O sensor PIR é um sensor digital usado para detectar movimento por infravermelho.
· Ele fornece saída em nível lógico alto ou baixo.
· Em conjunto com o Arduino, pode acionar LEDs, alarmes e sistemas automáticos.
· No exemplo apresentado, o LED pisca sempre que o sensor detecta movimento.
UTILIZAÇÃO DE SENSORES ANALÓGICOS
📌 Sensores analógicos de temperatura
· Sensores analógicos fornecem uma tensão proporcional à grandeza medida.
· Sensores de temperatura como o LM35 e o TMP36 são exemplos de sensores analógicos lineares.
Funcionamento:
· A tensão de saída varia conforme a temperatura.
· Para esses sensores:
· cada aumento de 1 °C gera aumento de 10 mV na saída.
Conversão no Arduino:
· O Arduino possui conversores ADC (Analog to Digital Converter).
· O ADC converte tensões de:
· 0 V até 5 V
· em valores digitais de:
· 0 até 1023 (10 bits).
Processamento da temperatura:
O Arduino:
1. Lê a tensão do sensor;
2. Converte a tensão em valor digital;
3. Calcula a temperatura em graus Celsius;
4. Envia o resultado pela porta serial.
Objetivo do código:
· Ler os dados do sensor de temperatura TMP36 pela entrada analógica;
· Converter a tensão em temperatura;
· Exibir a temperatura em graus Celsius no monitor serial.
char grau = 176; // Armazena o código ASCII do símbolo de grau (°)
void setup()
{
pinMode(A0,INPUT); // Configura o pino analógico A0 como entrada
Serial.begin(9600); // Inicia a comunicação serial com velocidade de 9600 bps
}
void loop()
{
int tmp = analogRead(A0); // Lê o valor analógico do sensor no pino A0
float voltage = (tmp * 5.0)/1024; // Converte o valor lido em tensão (Volts)
float milliVolt = voltage * 1000; // Converte a tensão de Volts para milivolts
float tmpCel = (milliVolt-500)/10 ; // Calcula a temperatura em Celsius para o sensor TMP36
Serial.print("Celsius: "); // Escreve o texto "Celsius: " no monitor serial
Serial.print(tmpCel); // Exibe o valor da temperatura calculada
Serial.println(grau); // Exibe o símbolo de grau e pula linha
delay(1000); // Aguarda 1 segundo antes da próxima leitura
}
📌 Simulação no Tinkercad
Alteração da temperatura:
· Durante a simulação:
· é possível alterar a temperatura do sensor;
· basta clicar nos ícones do sensor no Tinkercad.
Resultado:
· Quandoo valor da temperatura é alterado:
· a tensão do sensor muda;
· o Arduino realiza uma nova leitura;
· a temperatura atualizada aparece no monitor serial.
Resumo
· Sensores analógicos fornecem sinais contínuos proporcionais à grandeza medida.
· O TMP36 transforma temperatura em tensão elétrica.
· O Arduino converte essa tensão em valor digital usando o ADC.
· O programa calcula e exibe a temperatura em graus Celsius pela comunicação serial.
SENSOR DE ULTRASSÔNICO COM ARDUINO
📌 Sensor Ultrassônico com Arduino
O que é o sensor HC-SR04?
· O HC-SR04 é um sensor ultrassônico muito utilizado em:
· robótica;
· automação;
· sistemas de medição de distância.
Funcionamento: O sensor utiliza ondas ultrassônicas para medir distâncias, de forma semelhante aos morcegos (sonar).
Processo:
1. O transmissor envia um pulso ultrassônico.
2. O som percorre o ambiente.
3. Quando encontra um objeto, o sinal é refletido.
4. O receptor recebe o eco do sinal.
5. O Arduino mede o tempo entre envio e recepção.
6. A distância é calculada usando a velocidade do som.
📌 Cálculo da distância
Velocidade do som:
· A velocidade do som no ar é aproximadamente:
· Em centímetros por segundo:
Conversão do tempo para distância:
· O sensor mede o tempo em microssegundos.
· Calcula-se que o som leva aproximadamente:
· Como o som vai e volta até o objeto, divide-se o resultado por 2 para obter a distância real.
Função pulseIn()
· A função pulseIn() mede quanto tempo um pino permanece em nível lógico HIGH.
· Nesse projeto: ela mede o tempo entre o envio do pulso e o recebimento do eco.
· O valor retornado é em microssegundos.
Objetivo do código:
· Enviar um pulso ultrassônico pelo sensor HC-SR04;
· Medir o tempo de retorno do eco;
· Calcular a distância até o objeto;
· Mostrar a distância em centímetros no monitor serial.
int trigPin = 7; // Define o pino 7 como trigger (envio do pulso)
int echoPin = 7; // Define o pino 7 como echo (recebimento do eco)
long duracao, cm; // Variáveis para armazenar o tempo e a distância
void setup() {
Serial.begin (9600); // Inicia a comunicação serial
}
void loop() {
// Configura o pino de trigger como saída
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW); // Garante que o pino comece desligado
delayMicroseconds(5); // Aguarda 5 microssegundos
digitalWrite(trigPin, HIGH); // Envia o pulso ultrassônico
delayMicroseconds(10); // Mantém o pulso ativo por 10 microssegundos
digitalWrite(trigPin, LOW); // Finaliza o pulso
// Configura o pino de eco como entrada
pinMode(echoPin, INPUT);
duracao = pulseIn(echoPin, HIGH); // Mede o tempo de retorno do eco
// Calcula a distância em centímetros
cm = (duracao/2) / 29.1; // Divide por 2 (ida e volta) e converte para cm
Serial.print(cm); // Exibe o valor da distância
Serial.print("cm"); // Exibe a unidade de medida
Serial.println(); // Pula para a próxima linha
delay(250); // Aguarda 250 milissegundos
}
📌 Funcionamento da montagem
· O Arduino envia pulsos ultrassônicos pelo sensor.
· O sensor recebe o eco refletido pelo objeto.
· O tempo medido é usado para calcular a distância.
· O resultado é exibido no monitor serial em centímetros.
Resumo
· O HC-SR04 mede distância usando ondas ultrassônicas.
· O cálculo da distância é baseado no tempo de ida e volta do som.
· A função pulseIn() mede esse intervalo de tempo.
· O Arduino processa os dados e exibe a distância em centímetros.
UTILIZAÇÃO DE ATUADORES
📌 O que são atuadores?
· Atuadores são dispositivos que realizam ações físicas a partir de sinais enviados pelo microcontrolador.
· São muito utilizados em sistemas embarcados e robótica.
Tipos de atuadores:
Alguns exemplos são:
· Motores DC
· Motores de passo
· Servo motores
📌 Servo motor
Características:
· O servo motor permite posicionamento angular preciso.
· Ele pode ser colocado em ângulos específicos através de sinais elétricos.
Aplicações:
· Aviões controlados por rádio
· Robótica
· Sistemas automáticos
· Controle de mecanismos móveis
Tamanhos:
· Existem servos:
· pequenos, para projetos simples;
· grandes, para aplicações industriais.
📌 Biblioteca Servo.h do Arduino
Função da biblioteca
· A biblioteca Servo.h facilita o controle de servo motores no Arduino.
· Ela permite:
· definir a posição do servo;
· controlar o ângulo de rotação.
Comando write()
· O comando: s.write(angulo);
· posiciona o servo no ângulo informado.
📌 Funcionamento do programa
Movimento do servo:
O código faz o servo:
1. Girar de 0° até 90°;
2. Retornar de 90° até 0°;
3. Repetir continuamente.
Controle do movimento:
· O ângulo varia de: 1 em 1 grau.
· O atraso de: 50 milissegundos
· deixa o movimento suave e contínuo.
Tempo total:
· O servo leva aproximadamente: 9 segundos
· para sair da posição inicial e retornar.
Objetivo do código:
· Controlar um servo motor usando o Arduino;
· Movimentar o servo entre 0° e 90°;
· Fazer o retorno para 0° continuamente.
#include // Inclui a biblioteca para controle do servo motor
#define SERVO 9 // Define o pino digital 9 para controle do servo
Servo s; // Cria uma variável do tipo Servo
int pos; // Variável para armazenar a posição do servo
void setup ()
{
s.attach(SERVO); // Liga o servo ao pino definido
s.write(0); // Inicia o servo na posição 0 grau
}
void loop()
{
// Movimento de 0 até 90 graus
for(pos = 0; pos = 0; pos--) // Decrementa o ângulo de 1 em 1 grau
{
s.write(pos); // Move o servo para a posição atual
delay(50); // Aguarda 50 milissegundos
}
}
Resumo
· Atuadores executam ações físicas em sistemas embarcados.
· O servo motor permite controle preciso de posição angular.
· A biblioteca Servo.h facilita o controle do servo no Arduino.
· No exemplo, o servo se movimenta continuamente entre 0° e 90°.
Módulo 3. Funções para a programação de mostradores na criação de interfaces com o usuário
DISPLAY DE CARACTERES E GRÁFICO
📌 Função dos displays
· Displays são dispositivos usados para mostrar informações geradas pelo microcontrolador.
· Eles permitem que o sistema informe dados, mensagens ou estados de funcionamento ao usuário.
· Funcionam como dispositivos de saída.
Exemplo simples de display
· O LED é um exemplo básico de mostrador de saída.
· Ele emite luz quando recebe um comando do microcontrolador.
📌 Principais tipos de displays estudados
· LCD (Display de Cristal Líquido): usado para mostrar textos e caracteres.
· Display de 7 segmentos: muito utilizado para exibir números.
· Display gráfico: permite mostrar imagens, símbolos e gráficos mais complexos.
LCD (LIQUID CRYSTAL DISPLAY – DISPLAY DE CRISTAL LÍQUIDO)
📌 O que é um LCD?
· O LCD é um tipo de display usado para mostrar informações em sistemas eletrônicos.
· Ele utiliza um material que possui características:
· de líquido;
· e de cristal ao mesmo tempo.
Funcionamento do material LCD:
· As partículas do LCD:
· possuem mobilidade semelhante à de um líquido;
· mas permanecem organizadas como um cristal.
· Isso acontece dentro de uma determinada faixa de temperatura.
📌 Características do LCD
Mais informativo que um LED:
· Diferente de um LED simples, o LCD pode exibir:
· letras;
· números;
· símbolos;
· mensagens completas.
Variedade de modelos:
· Existem LCDs de:
· diferentes tamanhos;
· preços;
· configurações.
Capacidade de exibição:
· Alguns possuem:
· poucas linhas de texto;
· Outros possuem:
· telas maiores;
· capacidade gráfica;
· gráficos específicos para aplicações dedicadas.
📌 Comunicação com o microcontrolador
Envio de dados:
· O microcontrolador envia:
· comandos;
· dados;
· informações de controle
· para o LCD.
Restrição de velocidade:
· O microcontrolador trabalha muito mais rápido que o LCD.
· Por isso:
· o LCD precisa de tempo para processar asinformações recebidas.
Temporização:
· O programa deve respeitar o tempo de processamento do LCD.
· Caso contrário:
· os dados podem ser enviados incorretamente.
📌 Papel dos compiladores atuais
Controle automático de tempo:
· Os compiladores modernos já controlam automaticamente:
· o tempo correto de envio de comandos;
· a sincronização com o LCD.
Benefício:
· Facilita a programação do display.
· Evita erros de comunicação entre o microcontrolador e o LCD.
Resumo
· O LCD é um display capaz de exibir informações detalhadas.
· Ele utiliza cristal líquido para formar caracteres e gráficos.
· O microcontrolador envia dados e comandos ao display.
· Como o LCD é mais lento que o microcontrolador, é necessário controlar corretamente o tempo de comunicação.
· Os compiladores atuais ajudam automaticamente nesse controle de temporização.
INTERFACE DE LCD 16×2 COM MICROCONTROLADOR
📌 O que é o LCD 16×2
· É um display de caracteres muito utilizado em sistemas embarcados.
· Possui:
· 2 linhas;
· 16 caracteres por linha.
📌 Modos de operação
Modo de 4 bits:
· Utiliza apenas 4 linhas de dados.
· Economiza pinos do microcontrolador.
Modo de 8 bits:
· Utiliza 8 linhas de dados.
· Permite comunicação mais rápida.
📌 Registradores do LCD
O LCD possui dois registradores principais:
Registrador de comando:
· Recebe instruções de controle.
· Exemplo:
· limpar tela;
· posicionar cursor.
Registrador de dados:
· Recebe os caracteres que serão exibidos.
📌 Principais pinos do LCD
Pino
Função
GND
Terra
VCC
Alimentação 5V
DB0 a DB7
Envio de dados
VEE
Ajuste de contraste
RS
Seleção de registrador
RW
Leitura ou escrita
EN
Habilitação do LCD
LED+ e LED-
Luz de fundo (backlight)
📌 Funcionamento dos pinos de controle
Pino EN (Enable):
· Habilita o envio de dados ao LCD.
· A transição de HIGH para LOW ativa o envio.
Pino RS (Register Select):
· RS = LOW → envia comando.
· RS = HIGH → envia caracteres para a tela.
Pino RW (Read/Write):
· RW = LOW → grava dados no LCD.
· RW = HIGH → realiza leitura do LCD.
· Na prática, RW normalmente fica em LOW.
📌 Características do LCD
Exibição de caracteres:
· Os caracteres seguem a tabela ASCII.
· Cada caractere é formado por uma matriz: pixels.
Alta impedância:
· Quando o LCD não está habilitado:
· suas linhas de dados ficam em alta impedância;
· não interferem no funcionamento do microcontrolador.
📌 Uso de LCD no PIC
Funções importantes:
No compilador CCS:
· lcd_init() → inicializa o LCD.
· LCD_PUTC → envia caracteres ao display.
Objetivo do código em PIC
· Inicializar o LCD;
· Exibir a mensagem “Usando LCD”;
· Mostrar um valor de temperatura na segunda linha.
#include // Biblioteca do microcontrolador PIC18F4550
#fuses HS, NOMCLR, NOWDT // Configurações do microcontrolador
#use delay(clock=20MHz) // Define clock de 20 MHz
#define LCD_DB0 PIN_D0 // Define pino DB0 do LCD
#define LCD_DB1 PIN_D1 // Define pino DB1 do LCD
#define LCD_DB2 PIN_D2 // Define pino DB2 do LCD
#define LCD_DB3 PIN_D3 // Define pino DB3 do LCD
#define LCD_DB4 PIN_D4 // Define pino DB4 do LCD
#define LCD_DB5 PIN_D5 // Define pino DB5 do LCD
#define LCD_DB6 PIN_D6 // Define pino DB6 do LCD
#define LCD_DB7 PIN_D7 // Define pino DB7 do LCD
#define LCD_E PIN_E1 // Define pino Enable do LCD
#define LCD_RS PIN_E2 // Define pino RS do LCD
#include // Biblioteca auxiliar do LCD
void main () {
lcd_init(); // Inicializa o display LCD
printf(LCD_PUTC, "Usando LCD"); // Exibe texto na primeira linha
delay_ms(1000); // Aguarda 1 segundo
printf(LCD_PUTC, "\nTemp = %f", 23.6); // Exibe temperatura na segunda linha
}
📌 Uso de LCD no Arduino
Biblioteca LiquidCrystal:
· Biblioteca usada para controlar displays LCD compatíveis com o controlador HD44780.
📌 Principais funções da biblioteca
• LiquidCrystal() → Cria o objeto responsável pelo controle do LCD.
• begin()
· Inicializa o display.
· Define:
· número de colunas;
· número de linhas.
• setCursor() → Define a posição onde o texto será escrito.
• clear() → Limpa a tela do LCD.
Objetivo do código em Arduino:
· Inicializar o display LCD 16×2;
· Mostrar uma mensagem fixa;
· Exibir um contador de segundos na segunda linha.
/*
Circuito:
* Pino LCD RS ligado ao pino digital 12
* Pino LCD Enable ligado ao pino digital 11
* Pino LCD D4 ligado ao pino digital 5
* Pino LCD D5 ligado ao pino digital 4
* Pino LCD D6 ligado ao pino digital 3
* Pino LCD D7 ligado ao pino digital 2
* Pino LCD R/W ligado ao GND
* Pino LCD GND ligado ao GND
* Pino LCD VCC ligado ao 5V
* Pino LCD VO ligado ao GND
* Pino LED+ ligado ao resistor de 220 ohms
* Resistor ligado ao 5V
* Pino LED- ligado ao GND
*/
#include // Biblioteca do LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Define os pinos conectados ao LCD
void setup() {
lcd.begin(16, 2); // Inicializa LCD de 16 colunas e 2 linhas
lcd.print("Usando o LCD"); // Exibe mensagem inicial
}
void loop() {
lcd.setCursor(0, 1); // Posiciona o cursor na coluna 0 da linha 1
delay(1000); // Aguarda 1 segundo
lcd.print(millis() / 1000); // Exibe o tempo em segundos
}
Explicação do setCursor()
• Funcionamento
A função: lcd.setCursor(coluna, linha);
define a posição onde os próximos caracteres serão escritos.
Exemplo: lcd.setCursor(0, 1);
· coluna = 0 → primeira coluna;
· linha = 1 → segunda linha.
Assim, o texto será exibido no início da segunda linha do LCD.
Resumo
· O LCD 16×2 é um display muito usado para exibição de textos.
· Pode operar em modo de 4 ou 8 bits.
· Utiliza pinos de controle como RS, RW e EN.
· Os caracteres são exibidos usando códigos ASCII.
· Bibliotecas como LiquidCrystal e funções específicas facilitam a programação do LCD em Arduino e PIC.
DISPLAY DE 7 SEGMENTOS
📌 O que é um display de 7 segmentos?
· É um dispositivo eletrônico usado para exibir números.
· É formado por:
· 7 LEDs organizados em formato retangular.
· Cada LED representa um segmento do display.
Segmentos do display
Identificação dos segmentos:
· Os segmentos são identificados pelas letras: A, B, C, D, E, F e G
· Cada segmento pode ser ligado ou desligado individualmente.
📌 Ponto decimal (DP)
Oitavo LED:
· Alguns displays possuem um LED adicional chamado: DP (Decimal Point)
· Ele é usado para mostrar:
· ponto decimal;
· números maiores;
· valores com casas decimais.
📌 Funcionamento do display
Formação dos números:
· Para exibir um número:
· determinados segmentos são acesos;
· outros permanecem apagados.
Controle dos LEDs:
· Cada segmento possui um pino próprio.
· Os demais pinos são ligados em comum.
Exibição dos dígitos:
· A combinação correta dos segmentos permite exibir:
· números de 0 a 9;
· e também caracteres hexadecimais.
Exemplo de exibição do número 0
Segmentos acesos:
· Para mostrar o número: 0
· devem ser ligados os segmentos: A, B, C, D, E e F
Segmento apagado:
· O segmento: G permanece desligado.
📌 Funcionamento geral
Polarização dos LEDs:
· Os segmentos acendem quando recebem polarização elétrica adequada.
· Dependendo dos segmentos ativados: um número diferente aparece no display.
Resumo Geral
· O display de 7 segmentos é formado por 7 LEDs usados para exibir números.
· Cada segmento é identificado de A até G.
· Um LED adicional pode representar o ponto decimal (DP).
· A combinação dos segmentos ligados permite mostrar números de 0 a 9 e caracteres hexadecimais.
CÓDIGO PARA USAR DISPLAY DE 7 SEGMENTOS NO PIC
📌 Objetivo da programação
· Facilitar a escrita de números no display de 7 segmentos.
· Controlar quais segmentos devem acender para formar cada dígito.
📌 Uso de vetor para representar os números
Vetor de dígitos:
· Foi criado um vetor com:
· 10 posições;
· uma para cada número de 0 a 9.
Representação binária:
· Cada posição contém um número binário de 8 bits.
· Cada bit representa um segmento do display:
· A, B, C, D, E, F, G e ponto decimal.
Funcionamento:
· Bit com valor:
· 1 → segmento aceso;
· 0 → segmento apagado.
Exemplo de acionamento· Acender somente o segmento A: 0b00000001
· O bit menos significativo representa o segmento A.
📌 Multiplexação dos displays
Como funciona:
· A placa possui: 4 displays de 7 segmentos.
· Todos compartilham as mesmas linhas de dados.
Controle individual:
· Cada display é ativado separadamente pelos pinos:
· RA2;
· RA3;
· RA4;
· RA5.
Ilusão visual:
· Os displays são ligados muito rapidamente, um após o outro.
· Isso cria a impressão de que todos estão acesos simultaneamente.
Objetivo do código
· Exibir os números: 1, 2, 3 e 4
· em quatro displays de 7 segmentos multiplexados no PIC18F4550.
#include // Biblioteca do microcontrolador PIC18F4550
#fuses XT, NOMCLR, NOWDT // Configurações do PIC
#use delay(clock=4MHz) // Define clock de 4 MHz
// Vetor com os padrões binários dos números de 0 a 9
int8 digitos[] = {
0b00111111, // Número 0
0b00000110, // Número 1
0b01011011, // Número 2
0b01001111, // Número 3
0b01100110, // Número 4
0b01101101, // Número 5
0b01111100, // Número 6
0b00000111, // Número 7
0b01111111, // Número 8
0b01100111 // Número 9
};
// Função para ligar um display e mostrar um número
void ligaDisplay(int pino, int numero) {
output_bit(PIN_A3, 0); // Desliga display ligado ao pino A3
output_bit(PIN_A4, 0); // Desliga display ligado ao pino A4
output_bit(PIN_A5, 0); // Desliga display ligado ao pino A5
output_bit(PIN_A2, 0); // Desliga display ligado ao pino A2
output_bit(pino, 1); // Liga apenas o display desejado
output_d(digitos[numero]); // Envia o padrão binário do número ao display
delay_ms(25); // Mantém o display aceso por 25 ms
}
void main () {
while(true) { // Loop infinito
ligaDisplay(PIN_A2, 1); // Exibe número 1 no display 1
ligaDisplay(PIN_A3, 2); // Exibe número 2 no display 2
ligaDisplay(PIN_A4, 3); // Exibe número 3 no display 3
ligaDisplay(PIN_A5, 4); // Exibe número 4 no display 4
}
}
📌 Funcionamento do programa
Sequência de operação:
1. Todos os displays são desligados.
2. Um display é ativado.
3. O número correspondente é enviado.
4. Após alguns milissegundos: o próximo display é acionado.
5. O processo se repete continuamente.
Resumo
· O display de 7 segmentos utiliza combinações de LEDs para formar números.
· Um vetor binário facilita o controle dos segmentos.
· Os displays da placa são multiplexados.
· O programa alterna rapidamente entre os displays para criar a impressão de exibição simultânea.
· O código apresentado mostra os números 1, 2, 3 e 4 nos quatro displays.
DISPLAYS GRÁFICOS
📌 O que são displays gráficos:
· São visores matriciais capazes de exibir imagens, letras, números e gráficos.
· São controlados pelo firmware do microcontrolador.
· São usados em aplicações que precisam mostrar mais informações do que apenas texto simples.
📌 Funcionamento dos pixels:
· O display é formado por vários pontos chamados pixels.
· Cada pixel pode ser ligado ou desligado individualmente.
· O programador controla esses pixels por software para formar imagens e caracteres.
📌 Resolução e tecnologias utilizadas:
· A resolução é indicada pela quantidade de pixels horizontais e verticais.
· Exemplo: 128x64 → 128 pixels no eixo horizontal (X) e 64 no vertical (Y).
· Resoluções comuns: 122x32, 160x160, 240x128 e 320x240.
· As principais tecnologias usadas são:
· LCD gráfico
· OLED, que vem se tornando cada vez mais popular.
DISPLAY OLED
📌 O que é um display OLED?
· OLED significa:
· Organic Light-Emitting Diode
· (Diodo Orgânico Emissor de Luz)
· É um tipo de display com excelente qualidade de imagem.
📌 Características dos displays OLED
Qualidade de imagem:
Os displays OLED apresentam:
· cores brilhantes;
· contraste muito alto;
· resposta rápida;
· amplos ângulos de visão.
📌 Funcionamento do OLED
Material emissor:
· O principal componente é um material orgânico à base de carbono.
· Esse material emite luz quando recebe energia elétrica.
Estrutura básica:
O OLED possui:
· uma camada emissora;
· um cátodo;
· um ânodo.
Função dos componentes:
· Cátodo: injeta elétrons.
· Ânodo: remove elétrons.
· Camada emissora: produz luz.
📌 Estrutura moderna dos OLEDs
Camadas adicionais:
· Displays OLED modernos possuem várias camadas extras.
· Essas camadas aumentam:
· eficiência;
· durabilidade.
Sensibilidade:
· OLEDs são muito sensíveis a:
· oxigênio;
· umidade.
Encapsulamento: Por isso, a proteção do display é muito importante.
📌 OLEDs em sistemas embarcados
Baixo custo:
· Displays OLED pequenos são baratos e muito usados em projetos com microcontroladores.
Controlador SSD1306:
· Um dos controladores mais comuns é o: SSD1306
📌 Comunicação com microcontroladores
Protocolos suportados:
O SSD1306 pode usar:
· I2C;
· SPI.
📌 Comparação entre I2C e SPI
I2C
SPI
Usa apenas 2 pinos
Usa mais pinos
Pode compartilhar barramento
Comunicação mais rápida
Mais simples
Maior velocidade
📌 Modelos disponíveis
Tamanhos comuns:
· 128×64
· 128×32
Cores comuns:
· Branco
· Azul
📌 Alimentação elétrica
· Tensão do controlador SSD1306:
· Tensão do painel OLED:
📌 Compatibilidade com Arduino
Circuitos internos:
· O módulo possui circuitos internos de alimentação.
· Isso permite conexão direta com:
· Arduino;
· microcontroladores de 5 V.
Vantagem: Não é necessário usar conversores de nível lógico.
Resumo Geral
· Displays OLED possuem excelente qualidade de imagem e baixo consumo.
· Funcionam usando materiais orgânicos emissores de luz.
· O controlador SSD1306 é muito utilizado em sistemas embarcados.
· A comunicação pode ser feita por I2C ou SPI.
· Os módulos OLED podem ser conectados facilmente a microcontroladores como o Arduino.
CÓDIGO PARA USAR UM OLED NO ARDUINO
📌 Código para Usar um OLED no Arduino
Objetivo do código:
· Inicializar um display OLED com controlador SSD1306;
· Utilizar comunicação I2C;
· Exibir a mensagem na tela do display: Ola!
📌 Bibliotecas utilizadas
Wire.h → Biblioteca usada para comunicação I2C.
Adafruit_SSD1306.h → Biblioteca específica para controlar displays OLED SSD1306.
Adafruit_GFX.h → Biblioteca gráfica usada para textos, desenhos e gráficos.
📌 Endereço do display
Endereço I2C:
· O display utiliza o endereço: 0x3C
· para comunicação no barramento I2C.
📌 Funcionamento do programa
Inicialização:
· O display OLED é iniciado.
· A tela é limpa.
Configuração do texto
O programa define:
· tamanho do texto;
· cor;
· posição na tela.
Exibição: A mensagem “Ola!” é enviada ao display.
#include // Biblioteca para comunicação I2C
#include // Biblioteca do display OLED SSD1306
#include // Biblioteca gráfica para textos e desenhos
#define OLED_ADDR 0x3C // Define o endereço I2C do display OLED
// Cria objeto do display OLED
Adafruit_SSD1306 display(-1);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); // Inicializa o display OLED
display.clearDisplay(); // Limpa a tela do display
display.display(); // Atualiza o display apagando o conteúdo anterior
display.setTextSize(1); // Define o tamanho do texto
display.setTextColor(WHITE); // Define a cor do texto
display.setCursor(27,30); // Define a posição do cursor no display
display.print("Ola!"); // Escreve a mensagem no display
display.display(); // Atualiza a tela para mostrar o texto
}
void loop() {
// Loop vazio, sem ações repetitivas
}
Resumo
· O display OLED SSD1306 pode ser controlado pelo Arduino usando I2C.
· As bibliotecas Wire, Adafruit_SSD1306 e Adafruit_GFX facilitam a programação.
· O código inicializa o display, configura o texto e exibe a mensagem “Ola!” na tela OLED.
Módulo 4. Programação de interrupções para o recebimento otimizado de dados de dispositivos externos ao microcontrolador
INTERRUPÇÕES
📌 Problema apresentado
· Em alguns sistemas, o microcontrolador precisa responder a sinais muito rapidamente, em microssegundos.
· O programa pode estar executando qualquer outra tarefa quando o sinal acontecer.
· Monitorar constantemente a entrada por softwareconsumiria muito processamento.
📌 O que são interrupções ?
· Interrupções são mecanismos que permitem ao microcontrolador interromper temporariamente o programa principal para atender um evento importante.
· Assim que o evento ocorre, o microcontrolador executa imediatamente uma rotina específica para tratá-lo.
📌 Vantagens das interrupções
· Permitem respostas muito rápidas a eventos externos.
· Evitam que o programa fique verificando continuamente as entradas.
· Tornam possível executar várias tarefas ao mesmo tempo de forma eficiente.
MECANISMO DE INTERRUPÇÃO
📌 O que é uma interrupção?
· Uma interrupção é um sinal enviado para a CPU informando que algum evento importante aconteceu.
· Esse sinal pode vir:
· do hardware (botão, sensor, timer etc.);
· ou do software.
Objetivo das interrupções:
· Evitar que o processador fique verificando continuamente (“pesquisando”) se algo aconteceu.
· Permitir que a CPU:
· continue executando normalmente outras tarefas;
· e só pare quando um evento importante ocorrer.
Como funciona uma interrupção?
1. O programa está executando normalmente.
2. Um evento ocorre.
3. A CPU recebe o sinal de interrupção.
4. A instrução atual termina.
5. A CPU pausa o programa principal.
6. Ela executa um código especial para tratar o evento.
7. Depois retorna ao ponto onde parou.
⚠️ Atenção: Execução “imediata”
· Quando se diz que a CPU responde “imediatamente”:
· significa, na prática → assim que a instrução atual terminar.
📌 Latência de interrupção
· É o tempo entre:
· o pedido da interrupção;
· e o início da execução da rotina de atendimento.
· Quanto menor a latência: melhor o desempenho do sistema.
📌 O que a CPU faz ao receber uma interrupção?
A CPU normalmente:
· salva o endereço da próxima instrução;
· salva informações importantes do processador;
· pode desabilitar outras interrupções temporariamente;
· limpa o sinal da interrupção;
· desvia para um código específico chamado ISR.
📌 ISR – Rotina de Serviço de Interrupção
· ISR significa: Interrupt Service Routine.
· É um código criado pelo programador para responder a uma interrupção específica.
Exemplo:
· Um botão é pressionado.
· A interrupção é acionada.
· A ISR correspondente é executada para tratar esse evento.
📌 Funcionamento interno
· O contador de programa normalmente avança instrução por instrução.
· Quando ocorre uma interrupção:
· ele “salta” para a ISR;
· depois retorna ao ponto original do programa.
📌 Estado das interrupções após reset
· Após ligar ou resetar o microcontrolador: todas as interrupções começam desabilitadas.
Existem dois níveis de habilitação:
1. Interrupção individual: Cada fonte de interrupção possui sua própria habilitação.
2. Interrupção global: A CPU possui um controle geral para permitir interrupções.
Para funcionar:
· A interrupção específica deve estar habilitada;
· e a interrupção global também.
📌 Fontes de interrupção
Uma interrupção pode ser causada por:
· eventos externos;
· timers;
· comunicação serial;
· sensores;
· mudanças em pinos;
· entre outros.
Exemplo de interrupção externa:
· Um pino do microcontrolador muda para nível baixo devido a um evento externo.
📌 Controle pelo programador
O programador decide:
· quais interrupções serão usadas;
· quando habilitá-las;
· quando desabilitá-las novamente.
📌 Associação entre interrupção e ISR
· Cada interrupção habilitada deve possuir: uma ISR correspondente.
Importância disso:
· Se uma interrupção ocorrer sem ISR válida:
· a CPU pode tentar executar código inválido;
· causando falha ou travamento do programa.
Resumo
· Interrupções tornam o sistema mais rápido e eficiente.
· Permitem resposta rápida a eventos importantes.
· Evitam desperdício de processamento.
· Funcionam através de ISRs.
· Precisam ser corretamente habilitadas e configuradas.
· Toda interrupção ativa deve possuir uma ISR válida.
APLICAÇÕES DE INTERRUPÇÕES
📌 O que são aplicações de interrupções?
· Interrupções são utilizadas para permitir que o microcontrolador responda rapidamente a eventos importantes.
· Elas evitam que a CPU fique parada esperando acontecimentos.
📌 Principais aplicações das interrupções
1. Evitar travamento da CPU
· A CPU não precisa ficar verificando continuamente se algo aconteceu.
· A interrupção avisa automaticamente quando um evento ocorre.
Exemplo: Avisar o processador de que uma transferência de dados pode começar.
2. Responder a condições importantes do hardware
· Permitem detectar rapidamente eventos físicos no sistema.
Exemplos:
· Pressionamento de botão;
· Movimento de uma alavanca;
· Acionamento de sensores.
3. Responder a eventos críticos de tempo
· Algumas situações precisam de resposta imediata.
Exemplo
· Falha de energia:
· o sistema pode salvar dados rapidamente antes de desligar.
4. Tratamento de erros
· Interrupções podem ser usadas para detectar erros e sair de rotinas problemáticas.
Objetivo:
· Evitar travamentos;
· Melhorar a segurança do sistema.
5. Controle de tempo
· Interrupções ajudam a executar tarefas em intervalos exatos.
Exemplo: Executar uma rotina a cada 1 segundo.
📌 Uso conjunto de várias interrupções
· Um programa pode usar várias interrupções ao mesmo tempo.
· Elas podem trabalhar juntas para realizar uma tarefa maior.
Exemplo prático: contagem de pulsos
Objetivo: Contar quantos pulsos chegam em um pino do microcontrolador por segundo.
📌 Funcionamento do sistema
Interrupção externa:
· O microcontrolador detecta mudanças digitais em um pino.
· Cada pulso recebido ativa uma interrupção.
ISR da interrupção externa:
· A rotina de interrupção incrementa uma variável contador.
Resultado: Cada pulso aumenta a contagem.
📌 Interrupção do temporizador
· Outra interrupção é acionada a cada 1 segundo.
Essa rotina pode:
· Ler o valor do contador;
· Armazenar a quantidade de pulsos por segundo;
· Calcular taxas;
· Mostrar informações ao usuário;
· Enviar dados para outro sistema pela rede.
📌 Vantagens das interrupções
· Resposta rápida a eventos;
· Melhor aproveitamento da CPU;
· Maior precisão no controle de tempo;
· Permite automação eficiente;
· Facilita monitoramento de sensores e sinais.
Resumo:
· Interrupções permitem respostas automáticas e rápidas.
· São muito usadas em sensores, temporizadores e comunicação.
· Podem trabalhar juntas em uma mesma aplicação.
· São essenciais em sistemas embarcados e tempo real.
TIPOS E FORMAS DE INTERRUPÇÕES EXTERNAS
📌 O que são interrupções externas?
· São interrupções geradas por sinais externos ao microcontrolador.
· Geralmente acontecem por mudanças em pinos digitais.
📌 Principais formas de interrupções externas
As interrupções externas podem ser configuradas de diferentes maneiras, dependendo do microcontrolador.
Dois aspectos principais:
1. Forma de acionamento;
2. Polaridade da interrupção.
1️⃣ Interrupções disparadas por borda
Como funcionam?
· A interrupção ocorre somente quando há mudança de estado lógico.
Exemplos:
· De 0 para 1;
· De 1 para 0.
Tipos de borda:
· Borda ascendente
· Ocorre quando: 0→1
· Também chamada de transição baixo-alto.
· Borda descendente
· Ocorre quando: 1→0
· Também chamada de transição alto-baixo.
Características das interrupções por borda:
· Geram apenas uma solicitação por mudança.
· São muito usadas para:
· botões;
· pulsos;
· sensores digitais.
2️⃣ Interrupções acionadas por nível
Como funcionam?
· A interrupção permanece ativa enquanto o sinal estiver em determinado estado lógico.
Tipos de nível:
· Nível baixo: A interrupção continua acontecendo enquanto a entrada estiver em: 000
· Nível alto: A interrupção continua acontecendo enquanto a entrada estiver em: 111
Problema das interrupções por nível:
· Se o hardware ou software forem mal projetados:
· a interrupção pode ocorrer repetidamente milhares de vezes por segundo.
· Isso pode travar ou sobrecarregar o sistema.
3️⃣ Interrupção por qualquer mudança lógica
Funcionamento:
· A interrupção ocorre em qualquer transição:
· de 0 para 1;· ou de 1 para 0.
📌 Comparação rápida
Tipo
Quando ocorre
Por borda
Apenas na mudança de estado
Por nível
Enquanto o sinal estiver ativo
Qualquer mudança
Em qualquer transição lógica
📌 Importância da distinção
· A diferença entre interrupções por borda e por nível é muito importante.
· Isso vale:
· não apenas para interrupções externas;
· mas para vários tipos de interrupções do microcontrolador.
📌 Cuidados ao escrever a ISR
O que fazer no início da rotina?
· Algumas ações devem acontecer imediatamente:
· alterar saídas;
· ler entradas;
· salvar informações importantes.
O que pode ser feito depois?
· Processamentos menos urgentes podem ocorrer após as ações principais.
Exemplos:
· cálculos;
· envio de dados;
· atualização de display.
📌 O comportamento da ISR depende de:
· qual interrupção ocorreu;
· qual ação é necessária;
· quais requisitos o hardware possui.
Resumo
· Interrupções externas podem ser acionadas por:
· borda;
· nível;
· qualquer mudança lógica.
· A polaridade define quando a interrupção ocorre.
· Interrupções por nível exigem maior cuidado.
· A ISR deve priorizar ações urgentes logo no início.
SINALIZADORES E PRIORIDADE DE INTERRUPÇÃO
📌 O que são interrupções pendentes?
· Uma interrupção é considerada pendente quando:
· o sinalizador (flag) de interrupção está ativado;
· e a permissão dessa interrupção também está habilitada.
· Se as interrupções globais do microcontrolador estiverem habilitadas:
· a CPU verifica constantemente os sinalizadores de interrupção;
· essa verificação acontece ao final da execução de cada instrução.
📌 Funcionamento quando há apenas uma interrupção
Passos executados pela CPU:
Quando apenas uma interrupção é detectada:
1. A CPU termina a instrução atual.
2. A CPU desvia para a rotina de interrupção.
3. O endereço de retorno é salvo.
4. Alguns registradores e estados internos podem ser armazenados.
5. O sinalizador da interrupção pode ser apagado automaticamente.
6. A rotina de interrupção começa a ser executada.
📌 Quando existem várias interrupções ao mesmo tempo
Prioridade de interrupção:
· Cada interrupção possui uma prioridade.
· Essa prioridade pode ser:
· fixa no hardware;
· ou configurada pelo programador.
Qual interrupção será atendida?
· A interrupção com maior prioridade será executada primeiro.
· As demais permanecem pendentes aguardando atendimento.
Interrupções globais durante a rotina
Em alguns microcontroladores
Ao entrar na rotina de interrupção:
· as interrupções globais são automaticamente desabilitadas;
· isso impede novas interrupções temporariamente.
Consequência: outras interrupções ficam “em espera” até a rotina terminar.
Final da rotina de interrupção
Quando a rotina termina:
1. O estado anterior da CPU é restaurado.
2. As interrupções globais são reabilitadas.
3. O programa principal volta a executar.
4. A CPU verifica novamente interrupções pendentes.
5. A interrupção pendente de maior prioridade será atendida.
📌 Interrupção interrompendo outra interrupção
Situação apresentada
Existem duas interrupções:
· INT1
· INT2
Cenário:
· INT1 já está em execução;
· durante isso, INT2 é acionada.
O que pode acontecer?
Situação 1 — INT2 espera
· INT2 fica bloqueada.
· A rotina de INT1 termina primeiro.
· Depois INT2 é executada.
· Isso ocorre quando: as interrupções globais continuam desabilitadas durante INT1.
Situação 2 — INT2 interrompe INT1
· A rotina INT1 é pausada.
· INT2 é executada imediatamente.
· Depois INT1 continua de onde parou.
· Isso ocorre quando:
· as interrupções são reabilitadas dentro de INT1;
· ou INT2 possui prioridade maior que INT1.
📌 Conceitos principais
· Sinalizador de interrupção (flag): Indica que uma interrupção foi solicitada.
· Interrupção pendente: Interrupção aguardando para ser atendida.
· Prioridade de interrupção: Define qual interrupção será executada primeiro.
· Vetorização de interrupção: Processo de desvio da CPU para a rotina de interrupção correta.
Resumo
· O microcontrolador consegue lidar com várias interrupções ao mesmo tempo usando prioridades.
· Interrupções mais importantes são atendidas primeiro.
· Algumas interrupções podem até interromper outras, dependendo da configuração do sistema.
CUIDADOS NO USO DE INTERRUPÇÃO
📌 Importância das interrupções
· As interrupções são muito importantes em sistemas embarcados.
· Elas permitem respostas rápidas a eventos externos.
· São essenciais para cumprir requisitos de tempo em aplicações críticas.
📌 Principal vantagem das interrupções
Execução imediata:
· O código principal pode ser interrompido praticamente a qualquer momento.
· A CPU pausa temporariamente o programa principal para executar a rotina de interrupção.
Consequência:
· O código interrompido “não sabe” que foi pausado.
· Após a interrupção, ele continua normalmente do ponto onde parou.
📌 Riscos no uso de interrupções
Problemas podem ocorrer facilmente:
· A mesma flexibilidade das interrupções também pode causar erros difíceis de identificar.
· Dados podem ser corrompidos sem que o programador perceba.
Motivo principal:
· A interrupção pode acontecer no meio de uma operação importante.
📌 Analogia apresentada no texto
· O funcionamento inadequado de interrupções é comparado a:
· alguém puxar sua cadeira exatamente no momento em que você vai sentar.
Significado da analogia: O programa pode “perder a estabilidade” se for interrompido em um momento crítico.
📌 Problema comum: compartilhamento de dados
Situação perigosa: O código principal e a rotina de interrupção acessam os mesmos dados.
O que pode acontecer?
1. O código principal começa a alterar uma variável.
2. Antes de terminar, ocorre uma interrupção.
3. A rotina de interrupção também modifica essa variável.
4. Os dados podem ficar incorretos ou inconsistentes.
📌 Cuidados recomendados
Evitar compartilhamento de dados:
· O ideal é que:
· o código principal;
· e a rotina de interrupção
não alterem as mesmas variáveis.
Planejar prioridades corretamente:
· As prioridades das interrupções devem ser definidas com cuidado.
· Isso evita conflitos e comportamentos inesperados.
Fazer testes e análises:
· É importante:
· testar o sistema;
· revisar o código cuidadosamente;
· analisar possíveis conflitos entre interrupções.
📌 Boas práticas no uso de interrupções
Recomendações principais:
· Manter rotinas de interrupção curtas.
· Evitar acessar dados compartilhados.
· Usar prioridades adequadas.
· Realizar testes detalhados.
· Garantir sincronização correta entre tarefas.
Resumo
· Interrupções são extremamente úteis e necessárias em sistemas embarcados.
· Porém, se forem mal utilizadas, podem causar erros difíceis de detectar.
· O maior cuidado deve ser com o acesso simultâneo aos mesmos dados pelo programa principal e pelas rotinas de interrupção.
PROGRAMAÇÃO DE INTERRUPÇÃO EXTERNA
📌 Funcionamento da interrupção externa:
· Uma interrupção externa pode ser acionada quando ocorre uma mudança de sinal em um pino do microcontrolador.
· Exemplo: um pino mantido em nível alto por um resistor pull-up passa para nível baixo ao pressionar um botão.
· Essa transição (alto → baixo) gera a interrupção.
· Exemplo de aplicação:
· Um botão pode controlar um LED usando interrupção externa.
· Quando o botão é pressionado, a interrupção detecta a mudança e altera o estado do LED rapidamente.
· Outro LED pode funcionar simultaneamente usando função de atraso (delay), mostrando que interrupções permitem executar várias tarefas.
📌 Importância da ficha técnica:
· Antes de programar, é necessário consultar a ficha técnica do microcontrolador.
· Ela informa quais pinos suportam interrupções externas e como configurá-los corretamente.
INTERRUPÇÃO EXTERNA NO PIC
📌 Objetivo do exemplo
· Demonstrar o uso de interrupção externa no microcontrolador PIC18F4550 utilizando o compilador CCS.
· O exemplo pode ser testado na placa 4 do PICSimLab.
· O programa mostra que uma interrupção pode ocorrer mesmo enquanto o programa principalestá executando outra tarefa.
📌 Interrupções externas no PIC18F4550
Quantidade de interrupções:
O PIC18F4550 possui três interrupções externas de hardware:
· INT0
· INT1
· INT2
Pinos utilizados:
As interrupções estão localizadas nos pinos da PORTB:
· INT0 → RB0
· INT1 → RB1
· INT2 → RB2
📌 Funcionamento das interrupções
Interrupções por borda:
As interrupções externas funcionam por detecção de borda:
· borda de subida → sinal passa de 0 para 1;
· borda de descida → sinal passa de 1 para 0.
📌 Funcionamento do exemplo
Programa principal:
· O LED D0 pisca continuamente.
· O programa utiliza um delay de 1 segundo.
Interrupção:
· Quando o botão RB0/INT é pressionado:
· ocorre uma interrupção externa;
· o LED D1 muda imediatamente de estado.
Importante:
· A interrupção funciona mesmo durante o delay.
· Isso demonstra que interrupções podem interromper temporariamente o fluxo normal do programa.
📌 Controle do tipo de borda
· Borda de descida:
· enable_interrupts(INT_EXT_H2L); → A interrupção ocorre na transição de nível alto para baixo.
· Borda de subida:
· enable_interrupts(INT_EXT_L2H); → A interrupção ocorre na transição de nível baixo para alto.
📌 Uso de outras interrupções externas
Exemplo com INT1
Para usar a interrupção INT1:
#INT_EXT1
void externa1() {
...
}
E habilitar:
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
Objetivo do código
· Fazer o LED D0 piscar continuamente.
· Alterar o estado do LED D1 quando ocorrer uma interrupção externa no pino RB0/INT0.
#include // Biblioteca do microcontrolador PIC18F4550
#fuses XT, NOWDT, NOMCLR // Configura os fusíveis do PIC
#use delay(clock=4MHz) // Define clock de 4 MHz
#INT_EXT // Define rotina da interrupção externa INT0
void int_externa0() {
output_toggle(PIN_D1); // Inverte o estado do LED ligado ao pino D1
}
void main() {
enable_interrupts(GLOBAL); // Habilita interrupções globais
enable_interrupts(INT_EXT);// Habilita interrupção externa INT0
while(true) { // Laço infinito
output_toggle(PIN_D0); // Inverte o estado do LED D0
delay_ms(1000); // Aguarda 1 segundo
}
}
📌 Conceitos principais
Interrupção externa: Evento externo capaz de interromper o programa principal.
Rotina de interrupção: Função executada automaticamente quando ocorre a interrupção.
Interrupção global: Permissão geral para que interrupções funcionem.
Detecção por borda: A interrupção ocorre apenas na mudança de estado do sinal.
📌 Ideia central do texto
· Interrupções externas permitem resposta imediata a eventos externos.
· Elas funcionam independentemente do que o programa principal esteja executando.
· O PIC18F4550 oferece três interrupções externas configuráveis por borda de subida ou descida
INTERRUPÇÃO EXTERNA NO ARDUINO
📌 Objetivo do exemplo
· Demonstrar o uso de interrupção externa no Arduino Uno.
· Mostrar como detectar o acionamento de um botão usando interrupção.
· Exibir informações em um display OLED.
📌 Interrupções externas no Arduino Uno
Pinos de interrupção:
No Arduino Uno, os pinos usados para interrupções externas são:
· Pino 2
· Pino 3
📌 Funcionamento do circuito
Estado normal: O pino 2 permanece em nível alto.
Ao pressionar o botão:
· O sinal passa para nível baixo.
· O Arduino detecta essa mudança.
· Uma rotina de interrupção (ISR) é executada.
📌 Função attachInterrupt()
Finalidade: Configura uma interrupção externa no Arduino.
Funcionamento: Quando ocorre a mudança de sinal:
· a função attachInterrupt() chama automaticamente uma função ISR (Interrupt Service Routine).
No texto, a ISR mencionada é: ledchange
📌 Bibliotecas utilizadas
· Wire → Responsável pela comunicação I2C.
· Adafruit_GFX → Biblioteca gráfica para displays.
· Adafruit_SSD1306 → Biblioteca específica para displays OLED com controlador SSD1306.
📌 Funcionamento do código
O que o programa faz:
· Inicializa o display OLED.
· Limpa a tela.
· Exibe a mensagem “Ola!” no display.
· O loop principal permanece vazio.
Objetivo do código
· Inicializar um display OLED via I2C e mostrar a mensagem “Ola!” na tela.
#include // Biblioteca para comunicação I2C
#include // Biblioteca do display OLED SSD1306
#include // Biblioteca gráfica para o display
#define OLED_ADDR 0x3C // Endereço I2C do display OLED
Adafruit_SSD1306 display(-1); // Cria objeto do display OLED
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); // Inicializa o display OLED
display.clearDisplay(); // Limpa o conteúdo da tela
display.display(); // Atualiza o display após limpeza
display.setTextSize(1); // Define tamanho do texto
display.setTextColor(WHITE); // Define cor do texto
display.setCursor(27,30); // Define posição do cursor no display
display.print("Ola!"); // Escreve a mensagem no display
display.display(); // Atualiza o display para mostrar o texto
}
void loop() {
// Loop principal vazio
}
Observação importante
· Embora o texto fale sobre interrupção externa usando attachInterrupt(), o código apresentado mostra apenas o funcionamento do display OLED.
· A parte da interrupção externa não aparece implementada nesse código.
📌 Conceitos principais
· Interrupção externa: Permite detectar eventos externos rapidamente.
· ISR (Interrupt Service Routine): Função executada automaticamente quando ocorre uma interrupção.
· I2C: Protocolo de comunicação usado pelo display OLED.
· Display OLED: Tela usada para mostrar informações gráficas e textos.
Resumo
· O Arduino Uno possui suporte a interrupções externas nos pinos 2 e 3.
· Interrupções permitem detectar mudanças de sinal rapidamente.
· O exemplo apresentado também demonstra como utilizar um display OLED com comunicação I2C.
TEMA 6 – PROJETOS COM MICROCONTROLADORES
INTRODUÇÃO
· O que é projetar um sistema
· Projetar significa definir o funcionamento de um sistema e transformá-lo em uma implementação física.
· O projeto deve atender às funcionalidades desejadas e também respeitar restrições técnicas, como desempenho, tamanho e consumo de energia.
· Sistemas embarcados modernos são cada vez mais complexos e precisam responder corretamente a diferentes situações.
· Desafios e restrições do projeto
· Muitas características importantes competem entre si.
· Exemplo:
· Alto desempenho geralmente aumenta o consumo de energia.
· Redução do tamanho pode diminuir o desempenho.
· Por isso, o projetista precisa fazer compensações (trade-offs) para equilibrar as restrições sem perder a funcionalidade do sistema.
· Objetivo do estudo
· Entender como desenvolver sistemas embarcados de alto desempenho baseados em microcontroladores.
· Aprender sobre:
· métricas e restrições de projeto;
· limitações dos dispositivos;
· boas práticas de programação.
· O foco é criar projetos que atendam aos requisitos do sistema de forma eficiente.
Módulo 1. As plataformas de hardware e software para um projeto com microcontrolador
ANÁLISE E PROJETO
O que é o desafio de um projetista?
· O principal desafio de um projetista não é apenas fazer o sistema funcionar.
· O objetivo é encontrar uma solução que consiga otimizar várias características do projeto ao mesmo tempo.
Métricas de Projeto
O que são métricas?
· São medidas usadas para avaliar a implementação de um projeto.
Exemplos de métricas:
· Custo → quanto o projeto vai custar.
· Tamanho → espaço ocupado pelo sistema ou chip.
· Potência/Consumo de energia → gasto de bateria ou eletricidade.
· Desempenho → velocidade de processamento.
Exemplo em sistemas embarcados:
Um sistema embarcado deve:
· Caber em um único chip.
· Processar dados rapidamente.
· Consumir pouca energia.
· Ter baixo custo.
➡️ Em sistemas embarcados, as restrições costumam ser mais rigorosas.
Desafios Durante o Desenvolvimento
Decisões importantes no projeto: Durante o desenvolvimento, surgem vários desafios e decisões importantes.
Algumas decisões exigem:
· Conhecimento da melhorforma de resolver o problema.
· Conhecimento das tecnologias disponíveis no mercado.
Escolha do microcontrolador
A escolha de um microcontrolador pode envolver:
· Projetistas.
· Setor financeiro.
· Outros departamentos da empresa.
Isso ocorre porque a escolha influencia:
· Custos.
· Projetos futuros.
· Estratégias da empresa.
Diferença entre Análise e Projeto
Problema de Análise:
· Possui uma única resposta correta.
· Usa cálculos e regras já conhecidas.
Exemplo apresentado:
Calcular o valor gasto na compra de:
· Feijão
· Pão
· Leite
· Carne
➡️ Basta fazer multiplicações e somas para chegar a uma única resposta.
Problema de Projeto
Características
· Possui várias soluções possíveis.
· É necessário considerar objetivos e restrições.
Exemplo apresentado
A Sra. X precisa:
· Alimentar quatro pessoas.
· Gastar apenas R$30,00.
· Comprar alimentos dos quatro grupos básicos.
Restrições do problema
· A comida deve ser suficiente para quatro pessoas.
· A refeição deve conter:
· Feijão
· Leite
· Pão
· Carne
➡️ Existem várias soluções possíveis dependendo:
· Dos preços.
· Da quantidade comprada.
· Do apetite das pessoas.
Relação entre Análise e Projeto
Problemas de projeto exigem:
· Capacidade de análise.
· Testes e tentativas.
· Comparação entre soluções.
Como normalmente são resolvidos?
· Por tentativa e erro.
· Avaliando diferentes possibilidades até encontrar uma solução aceitável.
Resumo:
· Problemas de análise possuem respostas únicas.
· Problemas de projeto possuem múltiplas soluções possíveis.
· Em engenharia e sistemas embarcados, o projetista precisa equilibrar:
· desempenho,
· custo,
· tamanho,
· consumo de energia,
· e outras restrições do sistema.
MÉTRICAS COMUNS EM UM PROJETO
O que são métricas de projeto?
· São características mensuráveis usadas para avaliar a implementação de um sistema.
· Elas ajudam o projetista a analisar a qualidade, eficiência e viabilidade de um projeto.
Principais Grupos de Métricas
1. Métricas de Desempenho
O que avaliam?
· A velocidade do sistema.
· O tempo necessário para executar determinada aplicação.
Exemplos:
· Tempo de processamento.
· Velocidade de resposta.
· Capacidade de executar tarefas em tempo real.
➡️ Quanto melhor o desempenho, mais rápido e eficiente será o sistema.
2. Métricas de Custo
O que medem?
· O custo de desenvolvimento e fabricação do sistema.
· O preço final do produto.
Custos envolvidos:
· Custo unitário: Valor para fabricar cada unidade do produto.
· Custo de NRE (Non-Recurring Engineering)
· Custo único de desenvolvimento do projeto.
· É gasto apenas durante a criação do sistema.
➡️ Depois do projeto pronto, várias unidades podem ser fabricadas sem repetir esse custo.
Outros fatores que influenciam o custo:
· Tempo para criar o protótipo.
· Tempo para lançar o produto no mercado.
· Facilidade de uso do sistema.
3. Métricas de Consumo de Energia
O que avaliam? A quantidade de energia consumida pelo sistema.
Importância atual
Essas métricas se tornaram mais importantes devido:
· Ao crescimento de dispositivos móveis.
· Ao uso de baterias.
· À necessidade de economizar energia.
Exemplos
· Duração da bateria.
· Eficiência energética.
· Baixo consumo elétrico.
➡️ Sistemas com menor consumo tendem a ser mais eficientes e econômicos.
4. Métricas de Eficácia do Sistema
O que avaliam?
· A capacidade do sistema de cumprir corretamente seu objetivo.
Áreas onde são muito importantes
· Sistemas militares.
· Sistemas críticos.
· Aplicações de alta confiabilidade.
Características relacionadas:
· Confiabilidade → funcionamento correto por longos períodos.
· Facilidade de manutenção → facilidade para reparar problemas.
· Adequação do projeto → capacidade de atender às necessidades.
· Flexibilidade → possibilidade de adaptação e melhorias.
➡️ Em alguns casos, a eficácia é mais importante que o custo.
Outras Métricas Importantes
Além das métricas principais, o projetista também deve considerar:
· Facilidade de uso: Sistema simples de operar.
· Suporte de software: Existência de bibliotecas, ferramentas e atualizações.
· Segurança: Proteção contra falhas e ataques.
· Fornecedores de segunda fonte: Existência de mais de um fornecedor para o mesmo componente.
➡️ Isso evita dependência de um único fabricante.
Resumo:
· As métricas de projeto ajudam a avaliar e comparar diferentes soluções.
· Um bom projeto precisa equilibrar:
· desempenho,
· custo,
· consumo de energia,
· eficácia,
· segurança,
· e facilidade de manutenção.
· A escolha ideal depende das necessidades da aplicação.
RESTRIÇÕES E REQUISITOS DE UM PROJETO
O que são restrições de projeto?
· São limitações impostas à solução de um sistema.
· Podem ser definidas:
· pelo cliente,
· pela empresa desenvolvedora,
· ou por normas e regulamentações externas.
Onde as restrições podem atuar?
As restrições podem envolver:
· Hardware
· Software
· Dados
· Interfaces
· Procedimentos operacionais
· Protocolos de comunicação
Exemplos de restrições
· Uso obrigatório de determinado hardware.
· Utilização de um software específico.
· Implementação de um protocolo padrão.
· Uso de um algoritmo específico.
Requisitos de Projeto
O que são requisitos?
· São as necessidades e condições que o sistema deve atender.
· Representam as demandas do ambiente e das pessoas envolvidas no projeto.
Tipos de requisitos: Os requisitos podem ser:
1. Requisitos Funcionais: Descrevem o que o sistema deve fazer.
Exemplos
· Realizar cálculos.
· Manipular dados.
· Interagir com o usuário.
· Executar funções específicas.
➡️ Definem as entradas, o comportamento e as saídas do sistema.
2. Requisitos Não Funcionais: Descrevem como o sistema deve funcionar.
Exemplos
· Velocidade.
· Segurança.
· Consumo de energia.
· Facilidade de uso.
➡️ Mesmo que o sistema funcione corretamente, ele pode falhar em atender o usuário se não cumprir esses requisitos.
Principais Requisitos Não Funcionais
1. Desempenho
O que mede?
· Tempo de resposta do sistema.
· Quantidade de tarefas executadas por unidade de tempo.
Fatores que influenciam o desempenho
· Taxa de clock.
· Tamanho da palavra.
· Número de registradores.
· Velocidade da memória.
· Linguagem de programação.
· Disponibilidade de periféricos.
➡️ Quanto melhor o desempenho, mais rápido e eficiente será o sistema.
2. Energia
O que mede? O consumo energético do sistema.
Importância:
· Afeta diretamente a duração da bateria.
· Influencia o aquecimento do sistema.
· Pode impactar a confiabilidade do equipamento.
Recursos importantes:
Alguns microcontroladores possuem:
· Modos de baixo consumo.
· Maior eficiência energética.
➡️ Muito importante em dispositivos móveis e sistemas embarcados.
3. Tolerância à Temperatura
O que significa?
· Capacidade do sistema operar em temperaturas extremas.
Aplicações comuns:
· Indústria.
· Automóveis.
· Ambientes externos.
➡️ Maior tolerância normalmente aumenta o custo do sistema.
4. Segurança
Objetivo: Proteger o sistema contra invasões e ataques.
Importância atual
· Fundamental em:
· IoT,
· automóveis,
· sistemas conectados.
Recursos utilizados:
· Criptografia.
· Proteção física.
· Hardware seguro integrado.
➡️ Fabricantes estão desenvolvendo microcontroladores cada vez mais seguros.
5. Custo
O que envolve?
· Preço do microcontrolador.
· Custo total do projeto.
Aspectos importantes
· Relação entre custo e desempenho.
· Possibilidade de expansão futura:
· mais memória,
· suporte a memória externa,
· novos recursos.
➡️ É importante pensar no crescimento do projeto.
6. Confiabilidade
O que significa? Capacidade do sistema funcionar sem falhas por determinado tempo.
Benefícios
· Menos interrupções.
· Menos perdas.
· Maior estabilidade.
➡️ Sistemas confiáveis reduzem manutenção e prejuízos.
7. Disponibilidade
O que representa? Probabilidade de o sistema estar funcionando corretamente.
Outro significado importante: Existência de mais de um fabricante para o mesmo componente.
➡️ Isso evita problemas de falta de fornecimento.
8.Manutenibilidade
O que significa? Facilidade de modificar ou corrigir o sistema após seu lançamento.
Inclui:
· Correção de falhas.
· Atualizações.
· Melhorias de desempenho.
· Adaptação a novos ambientes.
➡️ Sistemas fáceis de manter têm maior vida útil.
9. Time-to-Market
O que é? Tempo necessário para desenvolver e lançar o produto no mercado.
Envolve:
· Tempo de projeto.
· Tempo de fabricação.
· Tempo de testes.
➡️ Quanto menor esse tempo, mais rápido o produto chega ao mercado.
Resumo
· Todo projeto possui restrições e requisitos que precisam ser atendidos.
· Os requisitos podem ser:
· funcionais (o que o sistema faz),
· ou não funcionais (como o sistema funciona).
· Um bom projeto precisa equilibrar:
· desempenho,
· consumo de energia,
· segurança,
· custo,
· confiabilidade,
· manutenção,
· e tempo de desenvolvimento.
PASSOS PARA A SELEÇÃO DE UM MICROCONTROLADOR
Escolher um microcontrolador não é simples
· A seleção do microcontrolador ideal exige:
· análise técnica,
· paciência,
· planejamento,
· e avaliação de fatores de negócio.
Aspectos envolvidos:
Além dos recursos técnicos, também devem ser considerados:
· custo do componente,
· prazo de entrega,
· disponibilidade no mercado,
· vida útil do produto.
➡️ Uma escolha inadequada pode atrasar ou comprometer o projeto.
Evitar decisões precipitadas
· Erro comum no início do projeto: Muitos profissionais tentam escolher o microcontrolador antes de definir totalmente o sistema.
➡️ Isso não é recomendado.
· O que deve ser feito antes?
Os engenheiros precisam primeiro definir:
· os objetivos do sistema,
· o diagrama de blocos,
· o fluxograma do funcionamento.
➡️ Somente depois dessas definições haverá informações suficientes para escolher corretamente o microcontrolador.
Influência da experiência profissional
Comportamento comum: Profissionais experientes costumam escolher microcontroladores com os quais já trabalharam.
Vantagens dessa prática:
· Maior rapidez no desenvolvimento.
· Menor chance de erros.
· Familiaridade com:
· ferramentas,
· bibliotecas,
· compiladores,
· documentação.
➡️ A experiência prática facilita o desenvolvimento do projeto.
Riscos de escolher apenas pela experiência
Problemas possíveis:
· Uso de componentes obsoletos.
· Falta de interfaces modernas.
· Limitações para futuras expansões.
➡️ A tecnologia evolui rapidamente, e um componente antigo pode prejudicar o ciclo de vida do produto.
Importância de avaliar novas tecnologias
Aprender novas famílias de microcontroladores pode trazer:
· Melhor integração do sistema.
· Recursos mais modernos.
· Maior eficiência.
· Melhor preparação para futuras necessidades.
➡️ Apesar da curva de aprendizado, a mudança pode trazer vantagens importantes.
Decisão deve envolver toda a equipe
A escolha do microcontrolador deve considerar:
· Engenheiros de hardware.
· Engenheiros de software.
· Outros profissionais da empresa.
Objetivo: Avaliar diferentes opções de forma equilibrada.
➡️ A decisão não deve ser baseada apenas:
· em modismos,
· nem apenas em experiências antigas.
Resumo
· A escolha de um microcontrolador deve ser feita com planejamento e análise cuidadosa.
· Antes da escolha, o sistema precisa estar bem definido.
· A experiência profissional é importante, mas não deve impedir a avaliação de novas tecnologias.
· Um bom processo de seleção ajuda a criar produtos:
· mais modernos,
· confiáveis,
· integrados,
· e preparados para o futuro.
Módulo 2. As limitações dos microcontroladores para a especificação de projetos embarcados de alto desempenho
MICROCONTROLADORES EM SISTEMAS CRÍTICOS EMBARCADOS
O que são microcontroladores em sistemas embarcados?
· Microcontroladores são pequenos computadores integrados em dispositivos eletrônicos.
· Eles permitem que equipamentos executem funções inteligentes de forma rápida e automática.
· Estão presentes em diversos dispositivos, como:
· Máquinas de lavar
· Telefones
· Fornos micro-ondas
· Automóveis
· Equipamentos industriais
Sistemas Embarcados
Definição:
· Um sistema embarcado é um computador dedicado a funções específicas de controle.
· Pode funcionar:
· Como parte de um sistema maior.
· Como dispositivo independente.
Componentes comuns:
· Microcontroladores
· Processadores de sinal digital (DSPs)
Característica importante:
· Muitos operam em tempo real, ou seja:
· Precisam responder rapidamente aos eventos.
· Não podem atrasar respostas críticas.
Sistemas Críticos Embarcados
O que são? São sistemas em que falhas podem causar:
· Lesões graves em pessoas.
· Danos severos a equipamentos.
· Problemas ambientais.
Áreas de aplicação:
· Forças armadas
· Aviação
· Transporte ferroviário
· Equipamentos médicos
· Indústria
· Exploração espacial
· Instrumentação nuclear
Exigências dos Sistemas Críticos
Principais requisitos:
Esses sistemas precisam:
· Alta confiabilidade.
· Processamento rápido.
· Operação em tempo real.
· Flexibilidade operacional.
· Baixíssima taxa de falhas.
Restrições comuns:
· Tamanho reduzido
· Baixo consumo de energia
· Limites de peso
· Resistência a ambientes extremos
Normas e Regulamentações
Objetivo das normas: Garantir segurança e confiabilidade dos sistemas críticos.
Norma IEC 61508:
· Aplicada a sistemas elétricos, eletrônicos e programáveis.
· Relacionada à segurança funcional.
Exemplos de aplicações:
· Freios automotivos
· Equipamentos médicos
· Sistemas industriais
Outras organizações importantes:
· ISO
· ITU
Ambientes Severos
Alguns sistemas precisam suportar:
· Vibrações intensas
· Choques mecânicos
· Altas temperaturas
· Baixas temperaturas
· Radiação ionizante
Exemplos:
· Sistemas espaciais
· Equipamentos militares
· Instrumentação nuclear
Confiabilidade
Conceito: Capacidade do sistema de funcionar corretamente durante determinado período e condições específicas.
Importância:
A confiabilidade é essencial em:
· Aviões
· Usinas nucleares
· Sistemas de freio
· Equipamentos médicos
Formas de aumentar a confiabilidade:
Redundância:
· Uso de múltiplos dispositivos realizando a mesma função.
· Se um falhar, outro assume.
Aspectos avaliados:
· Precisão dos resultados
· Tempo de resposta
· Tolerância a falhas
· Segurança contra invasões
Determinismo
Conceito: Capacidade do sistema responder em tempo previsível.
Importância:
· Fundamental em sistemas de tempo real.
· Respostas precisam ocorrer dentro do prazo esperado.
Interrupções e Latência
Interrupções: Eventos que fazem o microcontrolador interromper a tarefa atual para tratar algo importante.
Latência: Tempo necessário para responder a uma interrupção.
Exemplo de Determinismo
Situação simples:
· Uma interrupção leva 50 ciclos para ser tratada.
· A resposta é previsível.
Situação complexa:
· Surge uma interrupção mais prioritária de 75 ciclos.
· A interrupção anterior pode atrasar.
Consequência:
· A latência passa a variar:
· De 50 ciclos
· Até 125 ciclos ou mais
Problemas causados por muitas interrupções
Efeitos:
· Redução do determinismo.
· Aumento da latência.
· Risco de perda de prazos em tempo real.
Impactos:
· Menor confiabilidade.
· Menor precisão.
· Respostas imprevisíveis.
Solução:
· Reduzir interrupções simultâneas.
· Melhor gerenciamento de prioridades.
Processamento de Sinais de Alta Frequência
Aplicações
Sinais de alta frequência são usados para:
· Geração de som
· Controle de motores
· Sensores rápidos
· Conversores de tensão
· Sistemas industriais
Desafios:
Quanto maior a frequência:
· Maior o uso da CPU.
· Maior a quantidade de interrupções.
· Maior o risco de atrasos.
Exemplo prático:
Sensor de alta velocidade:
· Pode coletar milhões de amostras por segundo.
· Isso consome muitos ciclos de processamento.
Solução utilizada: Empregar microcontroladores dedicados para tarefas específicas.
Futuro dos Sistemas Críticos Embarcados
Tendência: Crescimento dos sistemas autônomos e inteligentes.
Integração de tecnologias:
· Sensores
· Computação
· Software
· Máquinas inteligentes
Exigências· Tipos:
· EPROM
· EEPROM
· Flash
🧠 Organização da memória
· A memória é composta por vários locais de armazenamento (endereços)
· Organizada em Bytes (8 bits) ou múltiplos
· A CPU acessa a memória usando:
· Barramento de endereços → escolhe a posição
· Barramento de dados → lê/escreve valores
📊 Conceitos importantes
· 1 byte = 8 bits
· Um byte pode representar 0 a 255 (256 valores possíveis)
📏 Unidades de memória
· 1 KB = 1024 bytes (não 1000)
· 1 MB = 1.048.576 bytes (1024²)
🔢 Endereçamento de memória
· Cada posição de memória precisa de um endereço
· Quantidade de endereços depende do número de bits
📌 Exemplo:
· 64 KB = 65.536 posições
· Para acessar tudo:
· É necessário um barramento de 16 bits
· Pois: 2¹⁶ = 65.536
🎯 Resumo:
· RAM: rápida, temporária, volátil
· ROM: permanente, armazena o programa
· Mais bits no endereço → mais memória acessável
🔘 Entradas e Saídas (E/S) – comunicação com o mundo externo
· Microcontroladores usam portas para:
· Enviar dados (saída)
· Receber dados (entrada)
🔹 E/S DIGITAL PARALELA (mais simples)
📌 Como funciona:
· Cada bit do registrador está ligado a um pino físico do chip
· Vários bits são enviados/recebidos ao mesmo tempo
⚡ Níveis lógicos:
· Bit = 1 → tensão alta (ex: 5V ou 3,3V)
· Bit = 0 → 0V
🎯 Características:
· Comunicação rápida (vários bits simultâneos)
· Mais fios/pinos necessários
🔹 E/S SERIAL (UM BIT POR VEZ)
📌 Como funciona:
· Dados são enviados 1 bit por vez
· Cada bit ocupa um intervalo de tempo específico
⏱️ Sincronização (tempo correto):
🔸 Assíncrona
· Cada dispositivo tem seu próprio clock
· Precisam usar a mesma velocidade (baud rate)
🔸 Síncrona: Emissor e receptor compartilham o mesmo clock
💡 Vantagens da comunicação serial
· Usa menos fios (mais econômica)
· Muito utilizada em dispositivos modernos
📱 Exemplos
· Teclado
· Mouse
· USB
· Ethernet
🎯 Resumo (comparação)
· Paralela:
· Vários bits ao mesmo tempo
· Mais rápida, porém usa mais pinos
· Serial:
· Um bit por vez
· Mais lenta, porém mais simples e econômica
⏱️ Temporizadores (Timers)
📌 O que são:
· Dispositivos internos do microcontrolador usados para:
· Medir tempo
· Contar eventos
⚙️ Como funcionam
· Baseados em:
· Um clock (relógio) → gera pulsos
· Um contador (registrador) → conta esses pulsos
· Podem:
· Incrementar (contar para cima)
· Decrementar (contar para baixo)
🔢 Limitação dos contadores
· Possuem número limitado de bits → limite de contagem
Exemplos:
· 8 bits: conta até 255 → depois volta para 0 (overflow)
· 16 bits: conta até 65.535 → depois reinicia
O que é o OVERFLOW (estouro)?
· Ocorre quando o contador ultrapassa seu limite
· Ele reinicia automaticamente (volta ao início)
🎯 Para que servem os temporizadores na prática
· Medir intervalos de tempo
· Contar eventos externos
· Permitir que a CPU execute outras tarefas enquanto o timer conta
🧠 Resumo:
· Timer = contador controlado por clock
· Tem limite definido pelo número de bits
· Muito usado para tempo e eventos sem sobrecarregar a CPU
🔄 Conversores (ADC e DAC)
Conversão de sinais (Analógico ↔ Digital)
· Microcontroladores trabalham com dados digitais (0 e 1)
· Mas o mundo real é analógico (contínuo)
· 👉 Por isso, são necessários conversores
Tipos de conversores:
🔹 ADC (Conversor Analógico → Digital)
· Função: Converte um sinal analógico (ex: tensão) em um valor digital
· Como funciona:
· A CPU solicita a conversão
· O ADC:
· “Tira uma amostra” do sinal
· Converte para um número proporcional
· O resultado é armazenado em um registrador
· Resolução (número de bits)
· Define a precisão da conversão
· Mais bits → mais níveis → maior precisão
Exemplo:
· ADC de 10 bits:
· 2¹⁰ = 1024 valores possíveis
· Faixa de 0 a 5V → resolução ≈ 4,88 mV por nível
💡 Ideia importante:
· Sinal analógico = contínuo
· Sinal digital = valores discretos
· 👉 Mais bits = representação mais fiel do sinal real
🔹 DAC (Conversor Digital → Analógico)
· Função: Converte um valor digital em um sinal analógico
⚠️ Observação:
· Nem sempre está presente no microcontrolador
· Pode exigir circuito externo
· Alternativa ao DAC: PWM (Moduladores por Lagura de Pulso)
· Como funciona
· Alterna rapidamente entre 0V e 5V
· Controla o tempo ligado (duty cycle)
Exemplo:
· 50% ligado → tensão média ≈ 2,5V
· Pode ser filtrado para gerar sinal contínuo
🎯 Resumo
· ADC: analógico → digital (entrada de sensores)
· DAC: digital → analógico (saída de sinais)
· Mais bits no ADC = maior precisão
· PWM: solução prática para simular saída analógica
🚨 Controle de Interrupções
Problema inicial
· Sistemas simples executam uma única tarefa continuamente
· Sistemas mais complexos precisam monitorar várias entradas e saídas ao mesmo tempo
· ❌ Sem interrupções: A CPU fica “checando tudo o tempo todo” (ineficiente)
Solução: Interrupções
📌 O que são interrupções:
· Sinais que indicam que algo importante aconteceu
· Fazem a CPU:
· Parar temporariamente o que está fazendo
· Executar uma tarefa urgente
⚙️ Como funcionam:
· Um dispositivo (ex: sensor, rede, porta serial):
· Envia um sinal de interrupção
· A CPU:
· Vai para um endereço específico de memória
· Executa uma rotina de tratamento (ISR)
· Depois: Retorna à tarefa anterior
Origem das interrupções
· Podem vir de vários dispositivos:
· Entrada de dados
· Temporizadores
· Comunicação serial
· Eventos externos
Vantagens das interrupções
· Resposta rápida a eventos importantes
· Melhor uso da CPU (não precisa ficar verificando tudo)
· Permite lidar com várias tarefas de forma eficiente
· Ajuda na economia de energia:
· CPU pode ficar “em espera” até ser acionada
Aplicações comuns das interrupções
· Contagem de pulsos
· Execução periódica de tarefas (tempo)
· Recebimento de dados (serial)
· Sistemas em modo de baixo consumo
🧠 Resumindo:
· Interrupção = evento urgente que chama a CPU
· Evita verificação constante (polling)
· Torna o sistema mais eficiente, rápido e econômico
🎯 Resumo
· Microcontrolador = CPU + memória + periféricos integrados
· Executa tarefas de forma autônoma e eficiente
· Possui recursos para:
· Comunicação (E/S)
· Controle de tempo (timers)
· Interação com o mundo real (ADC/PWM)
· Resposta rápida (interrupções)
Atividade:
Questão 1. Um microcontrolador deve ser usado em uma aplicação que requer 1 kbyte de memória de dados e um programa de 8 kbytes. Quantos bits seriam necessários para o barramento de endereço?
· Memória de programa: 8 kbytes = 8192 endereços (8 x 1024)
· Memória de dados: 1 kbyte = 1024 endereços
· Total = 8192 + 1024 = 9216 endereços
Para endereçar 9216 posições distintas:
Testando:
· → insuficiente
· → suficiente
Portanto, o barramento de endereços precisa ter 14 bits.
Questão 2. Você foi designado para especificar um microcontrolador que deve medir uma tensão com resolução de pelo menos Qual dispositivo este microcontrolador deve integrar e de quantos bits este dispositivo deve ser? Considere que a tensão de referência deste dispositivo é 5 V .
Passo1. Você precisa de um Conversor Analógico-Digital (ADC), porque o microcontrolador só entende números binários.
· Exemplo: medir 80 μV dentro de uma faixa de 0–5 V → ADC de 16 bits.
Passo 2. Determinar o número de bits a partir LSB - Least Significant Bit (em português, bit menos significativo). No contexto de conversores analógico-digitais (ADC), o termo LSB é usado para indicar o menor incremento de tensão que o conversor consegue distinguir. Em outras palavras, é a resolução do ADC.
Formula:
Onde:
· Resolução do ADC=
·
· n = ? (número de bits do ADC)
Módulo 3. Os diferentes microcontroladores
COMO FUNCIONA O PIPELINING?
📌 Arquiteturas de CPU
A arquitetura da CPU define como ela executa as instruções de um programa.
Existem dois tipos principais:
· RISC: instruções simples e rápidas
· CISC: instruções mais complexas e completas
👉 Ou seja, a diferença está em como as instruções são organizadas e executadas.
🔹 RISC (Reduced Instruction Set Computing)
· Instruções simplesfuturas:
· Mais desempenho.
· Maior confiabilidade.
· Respostas mais rápidas.
· Maior capacidade de processamento em tempo real.
Conclusão
· Sistemas críticos embarcados são essenciais em aplicações onde segurança e confiabilidade são fundamentais.
· Microcontroladores nesses sistemas precisam operar com:
· Alta precisão
· Baixa latência
· Elevada confiabilidade
· Capacidade de resposta em tempo real
· O avanço dos sistemas autônomos aumenta ainda mais a importância desses sistemas no futuro.
MERCADO E CARACTERÍSTICAS DE MICROCONTROLADORES PARA APLICAÇÕES CRÍTICAS
Mercado de Microcontroladores para Aplicações Críticas
Crescimento do setor:
· Os fabricantes de microcontroladores têm investido no desenvolvimento de dispositivos voltados para:
· Segurança funcional
· Alta confiabilidade
· Sistemas críticos
Objetivo desses microcontroladores:
· Garantir funcionamento seguro em aplicações onde falhas podem causar:
· Acidentes
· Danos materiais
· Riscos à vida humana
Exemplos de Microcontroladores para Aplicações Críticas
Texas Instruments:
· Séries:
· Hercules TMS470M/TMS570M
· RM4x
· Arquiteturas:
· 16 bits
· 32 bits
Microchip:
· Modelos PIC:
· PIC12F1612
· PIC16F1613
NXP:
· Série LPC17xx:
· LPC1769
· LPC1788
Outros fabricantes:
· Freescale: Kinetis K20
· Renesas: V850
Principal Diferença desses Modelos
· Característica fundamental: Esses microcontroladores seguem normas internacionais de segurança funcional.
· Norma mais citada: IEC 61508
· Objetivo da norma: Proteger sistemas contra falhas aleatórias e falhas sistemáticas.
Tipos de Falhas
1. Falhas Aleatórias:
Características:
· Relacionadas a defeitos físicos em componentes.
· Associadas à confiabilidade do hardware.
· Exemplos:
· Desgaste de componentes
· Problemas elétricos
· Defeitos de fabricação
Relação com FIT
· FIT = taxa de falhas ao longo do tempo.
2. Falhas Sistemáticas:
Características:
· Originadas por erros de projeto.
· Relacionadas ao desenvolvimento de hardware e software.
· Exemplos:
· Erros de programação
· Testes insuficientes
· Operação fora das especificações
· Projeto inadequado para aplicações críticas
Quando uma Falha se Torna um Erro?
O erro ocorre quando:
· A falha compromete a função de segurança do sistema.
· O sistema deixa de cumprir sua meta de segurança.
Falhas em Software
Característica importante: O software é determinístico: Sempre executa da mesma forma para as mesmas condições.
Consequência: Teoricamente, pode ser formalmente validado antes da implementação.
Controle de falhas:
· Processos rigorosos de:
· Desenvolvimento
· Verificação
· Validação
· Testes
Método Principal de Proteção
Autoteste (Self-Test):
· Objetivo: Detectar falhas automaticamente durante o funcionamento do sistema.
· Aplicação:
· Em hardware
· Em software
Recursos de Segurança Presentes nesses Microcontroladores
Temporizador de Limite de Hardware:
· Função: Monitorar temporizações críticas do sistema.
· Características
· Pode ser reiniciado:
· Por sinais externos
· Por sinais analógicos
· Aplicações:
· Verificação de falhas
· Controle preciso de tempo
CRC com Varredura de Memória (CRC/SCAN)
· O que é? Sistema de verificação de integridade da memória FLASH.
· Funcionamento:
· O hardware calcula códigos CRC automaticamente.
· A memória é varrida em busca de corrupção de dados.
· Uso mais comum: Durante a inicialização do sistema.
· Objetivo: Garantir que o programa não esteja corrompido antes de executar.
Watchdog em Janela (WWDT)
· Watchdog tradicional: Reinicia o sistema se não for atualizado dentro do tempo correto.
· Watchdog em janela: Também reinicia o sistema se for atualizado cedo demais.
· Vantagem:
· Detecta:
· Travamentos
· Erros de sincronização
· Execuções incorretas do software
· Configuração:
· A janela pode variar:
· De 12,5%
· Até 100% do período do watchdog
Ilha Segura (Safe Island)
Conceito: Área protegida do microcontrolador responsável pela segurança das memórias.
Memórias protegidas:
· FLASH
· SRAM
ECC (Error Correction Code)
· Função: Detectar e corrigir erros de memória.
· Funcionamento: Adiciona códigos extras aos dados armazenados.
· Benefícios:
· Detecta corrupção de memória.
· Corrige erros de um único bit automaticamente.
· Mantém o sistema funcionando sem interrupções.
· Importância: Muito eficaz contra falhas aleatórias.
Importância da Segurança Funcional
Objetivos principais:
· Aumentar a confiabilidade.
· Garantir funcionamento seguro.
· Reduzir riscos de falhas críticas.
Aplicações típicas:
· Automóveis
· Aviação
· Equipamentos médicos
· Sistemas industriais
· Sistemas ferroviários
Conclusão
· Microcontroladores para aplicações críticas possuem recursos especiais de segurança e diagnóstico.
· Eles seguem normas rigorosas, como a IEC 61508.
· Esses dispositivos utilizam:
· Autotestes
· Watchdogs avançados
· Verificação CRC
· ECC para memória
· Técnicas de redundância e proteção
· O objetivo é garantir:
· Alta confiabilidade
· Segurança funcional
· Operação contínua mesmo diante de falhas.
Módulo 3. As boas práticas de programação para o desenvolvimento do software embarcado nos microcontroladores
PROBLEMAS COM RELAÇÃO ÀS CONVENÇÕES DE CODIFICAÇÃO
Importância da Codificação em Sistemas Embarcados
Desenvolvimento de software embarcado:
· A criação do código-fonte é uma etapa essencial no desenvolvimento de sistemas embarcados.
· A qualidade do código influencia diretamente:
· O funcionamento do sistema
· A confiabilidade
· A manutenção do software
Linguagem C em Sistemas Embarcados
· Linguagem mais utilizada: A linguagem C é amplamente usada em software embarcado.
· Característica principal: Oferece grande flexibilidade de programação.
· Consequência dessa flexibilidade:
· O código pode variar muito dependendo:
· Da experiência do programador
· Das habilidades de codificação
· Do estilo individual de escrita
Problema da Variação na Qualidade do Código
· Situação indesejada: Programadores diferentes produzem códigos com níveis diferentes de qualidade.
· Impactos negativos:
· Dificuldade de manutenção
· Maior chance de erros
· Falta de padronização
· Redução da confiabilidade do software
Convenções de Codificação
O que são? Conjunto de regras e estilos para escrita de código.
Objetivos principais:
· Padronizar o desenvolvimento.
· Melhorar a qualidade do software.
· Facilitar leitura e manutenção do código.
· Reduzir erros.
Importância da Padronização
Empresas mais organizadas:
· Criam convenções de codificação internas.
· Exigem que todos os desenvolvedores sigam as mesmas regras.
Benefícios:
· Código mais uniforme.
· Melhor comunicação entre equipes.
· Maior controle de qualidade.
Principais Problemas das Convenções de Codificação
1. Falta de compreensão das regras
· Problema: Muitos desenvolvedores não entendem:
· A importância das regras.
· Como lidar com violações das convenções.
· Consequência: As regras acabam não sendo aplicadas corretamente.
2. Grande quantidade de regras
· Problema: Existem muitas regras para aprender.
· Outro desafio: Mesmo com muitas regras, nem todas as situações de programação são cobertas.
· Consequência: Dificuldade de aplicação prática.
3. Verificação manual do código
· Problema: Faltam ferramentas totalmente confiáveis para validar o código automaticamente.
· Resultado: Os engenheiros precisam revisar o código manualmente.
· Impactos:
· Processo cansativo.
· Alto consumo de tempo.
· Maior possibilidade de erros humanos.
Perda de Eficiência das Convenções
· Situação comum: Algumas organizações criam convenções, mas deixam de aplicá-las corretamente ao longo do tempo.
· Motivos:
· Falta de fiscalização.
· Excesso de regras.
· Dificuldade de verificação.
· Consequência: As convenções perdem sua utilidade prática.
Empresas sem Convenções Definidas
· Problema: Algumas empresas não conseguem definir um padrão interno.
· Resultado: Cada programador escreve o código à sua maneira.
· Consequências:
· Falta de uniformidade.· Maior dificuldade de manutenção.
· Qualidade inconsistente do software.
Comparação Entre Organizações
· Empresas com convenções: Mesmo com dificuldades, possuem melhor organização.
· Empresas sem convenções: Dependem totalmente do julgamento individual dos programadores.
· Resultado: Maior risco de problemas de qualidade.
Conclusão
· Convenções de codificação são fundamentais para garantir qualidade e padronização no desenvolvimento de software embarcado.
· A linguagem C oferece flexibilidade, mas isso pode gerar diferenças significativas na qualidade do código.
· Os principais desafios das convenções são:
· Falta de compreensão das regras
· Grande quantidade de normas
· Dificuldade de verificação automática
· Mesmo com limitações, empresas que utilizam convenções de codificação possuem vantagens em relação às que não possuem nenhum padrão definido.
ESCRITA DE CÓDIGO C EFICIENTE PARA MICROCONTROLADORES
Desenvolvimento de Código em Sistemas Embarcados
· Objetivo principal
· Criar códigos:
· Confiáveis
· Legíveis
· Fáceis de manter
· Ideia importante: A otimização não deve ser a primeira preocupação do programador.
Otimização Prematura
· Conceito: Tentar otimizar o código antes de saber onde realmente existem problemas.
· Problema:
· Pode tornar o sistema:
· Mais complexo
· Mais difícil de entender
· Mais difícil de manter
· Recomendação:
· Primeiro: Faça o sistema funcionar corretamente.
· Depois:
· Identifique os pontos críticos.
· Otimize apenas o necessário.
Prioridade em Sistemas Embarcados
· Mais importante que velocidade: Evitar falhas inesperadas.
· Objetivos principais:
· Estabilidade
· Segurança
· Confiabilidade
Principais Cuidados na Programação de Microcontroladores
· Stack de Pilha:
· O que é?
· Área de memória usada para:
· Variáveis locais
· Chamadas de funções
· Retorno de execução
· Característica em sistemas embarcados
· Geralmente possui tamanho pequeno.
· Problemas possíveis: Estouro de pilha (Stack Overflow).
· Consequências:
· Falhas imprevisíveis.
· Erros difíceis de localizar.
· Recomendação: Monitorar constantemente o uso da pilha.
Alocação Dinâmica de Memória
· O que é? Uso de funções como:
· malloc()
· calloc()
· free()
Motivos para evitar alocação dinâmica
1. Falta inesperada de memória
· O sistema pode parar por não conseguir alocar memória.
2. Fragmentação da memória
· Pequenos espaços livres ficam espalhados pela memória.
· Problema:
· Sistemas embarcados podem funcionar por anos.
· A fragmentação aumenta com o tempo.
3. Geralmente não é necessária
· Sistemas embarcados costumam executar sempre as mesmas tarefas.
· Consequência: Memória estática normalmente é suficiente.
4. Menor desempenho
· A alocação dinâmica é mais lenta.
· Problema adicional: Fica ainda mais lenta com fragmentação.
5. Problemas com multitarefa e interrupções
· O compartilhamento de memória dinâmica exige bloqueios (locks).
· Consequência: Pode causar atrasos em interrupções e tarefas críticas.
6. Dificuldade de depuração
· Memória dinâmica dificulta identificar onde os dados estão armazenados.
· Vantagem da memória estática: Facilita análise e depuração do sistema.
Interrupções de Hardware
· O que são? Eventos que interrompem temporariamente a execução normal do programa.
· Importância:
· Devem ser tratadas:
· Rapidamente
· Com segurança
Código Reentrante
· Conceito: Código capaz de ser executado simultaneamente sem causar conflitos.
· Problema: Muitas bibliotecas padrão da linguagem C não são reentrantes.
· Consequência: Não devem ser usadas dentro de rotinas de interrupção.
Uso de Assembly
· Linguagem Assembly: Linguagem de baixo nível próxima ao hardware.
Uso em sistemas embarcados
· Situação atual: Raramente é necessário misturar Assembly com C.
· Quando é utilizado:
· Apenas em casos específicos:
· Funções muito críticas
· Recursos que C não consegue acessar diretamente
· Recomendação: Utilizar pequenas partes de Assembly somente quando realmente necessário.
Boas Práticas para Código em Microcontroladores
Prioridades do desenvolvimento:
1. Confiabilidade
2. Clareza do código
3. Facilidade de manutenção
4. Segurança
5. Otimização somente quando necessária
Conclusão
· Em sistemas embarcados, estabilidade e confiabilidade são mais importantes que otimização prematura.
· Problemas relacionados à pilha, memória dinâmica e interrupções podem causar falhas graves.
· O uso de memória estática e código simples facilita:
· Depuração
· Manutenção
· Segurança do sistema
· O programador deve otimizar apenas após identificar necessidades reais de desempenho.
O PADRÃO MISRA-C
O que é o MISRA-C?
· O MISRA-C é um padrão de desenvolvimento de software para a linguagem C.
· Foi criado pela Motor Industry Software Reliability Association.
· Seu objetivo principal é aumentar a segurança, confiabilidade e qualidade de sistemas embarcados.
Onde o MISRA-C é utilizado?
· Principalmente em:
· Sistemas automotivos;
· Sistemas embarcados críticos;
· Equipamentos autônomos.
· Também pode ser aplicado em outras áreas que exigem alta segurança e confiabilidade.
Histórico do padrão
· Primeira versão lançada em 1998.
· Última grande versão publicada em 2012.
· Tornou-se referência para empresas que desenvolvem software embarcado em linguagem C.
Objetivos do MISRA-C
O padrão busca:
· Reduzir erros de programação;
· Evitar comportamentos perigosos da linguagem C;
· Melhorar:
· confiabilidade;
· legibilidade;
· portabilidade;
· manutenção do código.
Como o MISRA-C funciona?
· O padrão define um subconjunto seguro da linguagem C.
· Algumas construções da linguagem são:
· proibidas;
· limitadas;
· controladas.
➡️Isso reduz as chances de falhas em sistemas críticos.
O que o MISRA-C restringe?
· Comportamentos indefinidos: Situações em que o compilador pode agir de forma imprevisível.
· Recursos dependentes do compilador: Evita códigos que funcionam apenas em determinados compiladores.
· Recursos facilmente mal utilizados: Limita comandos da linguagem que podem causar interpretações erradas ou bugs.
Tipos de diretrizes do MISRA-C
1. Diretiva
· A conformidade não depende apenas do código-fonte.
· Também considera:
· requisitos;
· especificações;
· projeto do sistema.
· Ferramentas de análise estática podem ajudar, mas precisam de informações extras.
2. Regra
· A verificação depende somente do código-fonte.
· Ferramentas de análise estática conseguem verificar automaticamente o cumprimento das regras.
Benefícios do uso do MISRA-C
· Maior segurança em sistemas críticos;
· Menor ocorrência de erros;
· Código mais organizado e padronizado;
· Facilidade de manutenção;
· Melhor compatibilidade entre plataformas e compiladores.
Resumo:
· Embora seguir padrões pareça restritivo, o MISRA-C ajuda a criar softwares mais seguros e confiáveis, especialmente em sistemas embarcados críticos.
Regras do Padrão MISRA-C
Visão geral
· O padrão MISRA-C possui:
· mais de 150 regras;
· divididas em mais de 20 categorias.
· Seu objetivo é aumentar:
· segurança;
· confiabilidade;
· portabilidade;
· manutenção do software embarcado.
Principais regras do MISRA-C
1. Código compatível com o padrão ISO C
· Todo código deve seguir o padrão ISO 9899 da linguagem C.
· O uso de extensões específicas de compiladores deve ser evitado.
· Observação importante:
· Em sistemas embarcados, algumas extensões acabam sendo necessárias.
· Exemplo: rotinas de interrupção geralmente dependem do compilador.
· O MISRA-C permite exceções chamadas de: desvios (deviations).
· Objetivo: Evitar dependência excessiva de compiladores específicos.
2. Uso de typedefs no lugar de tipos básicos
· Deve-se usar tipos definidos explicitamente:
· uint8_t
· int16_t
· uint32_t
· Evita problemas entre arquiteturas diferentes.
· Exemplo:
· Em sistemas de:
· 16 bits → int pode ter 2 bytes;
· 32 bits → int pode ter 4 bytes.
· Objetivo: Garantir portabilidade do código.
3. Declaração antes do uso
· Objetos e funções devem ser declaradosantes de serem utilizados.
· Objetivo: Evitar ambiguidades e erros de compilação.
4. Uso de protótipos de funções
· Toda função deve:
· possuir protótipo;
· ter o protótipo visível antes da chamada.
· Objetivo: Melhorar a verificação de tipos e parâmetros.
5. Inicialização de variáveis locais
· Variáveis automáticas (locais) devem receber valor antes do uso.
· Objetivo: Evitar comportamento indefinido.
6. Proibição de recursão
· Funções não podem chamar:
· a si mesmas diretamente;
· nem indiretamente.
· Motivos:
· Dificulta análise da pilha;
· Pode causar:
· estouro de pilha;
· comportamento imprevisível.
· Objetivo: Garantir previsibilidade em sistemas embarcados.
7. Proibição de alocação dinâmica de memória
· Não devem ser usadas funções como:
· malloc
· calloc
· realloc
· free
· Problemas que podem ocorrer:
· Vazamento de memória;
· Fragmentação;
· Esgotamento de memória;
· Falhas em tempo de execução;
· Comportamento não determinístico.
· Objetivo: Aumentar estabilidade e segurança do sistema.
8. Comparações explícitas com zero
· Verificações devem ser feitas de forma explícita.
Exemplo:
Objetivo do código: Mostrar a forma incorreta e correta de verificar se uma variável possui valor zero ou nulo segundo o padrão MISRA-C.
Exemplo INCORRETO segundo MISRA-C
if (!buffer) { // Verifica implicitamente se buffer é zero/nulo
return; // Sai da função
}
Problema:
· A verificação não é explícita.
· Pode gerar dúvidas de interpretação.
Exemplo CORRETO segundo MISRA-C
if (buffer == 0) { // Verifica explicitamente se buffer é igual a zero
return; // Sai da função
}
Vantagem:
· Código mais claro e legível.
· Reduz ambiguidades.
9. Ponteiros para funções não constantes não devem ser usados
· O MISRA-C restringe o uso de ponteiros para funções.
· Motivo
· Eles podem:
· dificultar leitura;
· aumentar complexidade;
· dificultar análise estática.
· Objetivo: Tornar o código mais previsível e seguro.
Resumo:
· O MISRA-C impõe regras rígidas para evitar falhas em sistemas críticos.
· Muitas práticas comuns em programação tradicional são limitadas para aumentar:
· segurança;
· previsibilidade;
· robustez do software embarcado.
VERIFICAÇÃO E VALIDAÇÃO EM SISTEMAS EMBARCADOS
O que é Garantia de Qualidade?
· Garantia de qualidade está relacionada às atividades de:
· teste;
· verificação;
· avaliação do software.
· Geralmente ocorre após o produto ser desenvolvido.
Problema dessa abordagem:
· Apenas testar no final não garante que o produto foi bem desenvolvido desde o início.
· Isso pode fazer com que:
· muitos erros sejam encontrados tarde;
· o custo de correção aumente;
· o desenvolvimento fique menos eficiente.
Ideia principal:
· É mais eficiente construir qualidade durante o desenvolvimento do que tentar corrigir defeitos depois.
· Para isso, utilizam-se técnicas de:
· Verificação (Verification)
· Validação (Validation)
· Essas técnicas são chamadas de: V&V (Verification and Validation)
Objetivo da V&V em sistemas embarcados
· Garantir alta qualidade do software.
· Detectar defeitos o mais cedo possível.
· Reduzir custos de correção.
· Aumentar a confiabilidade do produto final.
Diferença entre Verificação e Validação
VERIFICAÇÃO
VALIDAÇÃO
Construir o produto da maneira correta
Construir o produto correto
Foca no processo de desenvolvimento
Foca nas necessidades do usuário
Analisa cada etapa do desenvolvimento
Analisa o produto final
Verifica consistência e correção
Verifica se os requisitos foram atendidos
1. Verificação (Verification)
· O que é? Processo que avalia o software durante todas as fases do desenvolvimento.
· Objetivos:
· Garantir que cada etapa:
· esteja correta;
· seja consistente;
· siga os requisitos da etapa anterior.
· A verificação procura:
· erros de implementação;
· inconsistências;
· falhas de projeto;
· problemas de rastreabilidade.
· Exemplo:
· Confirmar que:
· o projeto foi criado corretamente a partir dos requisitos;
· o código implementa corretamente o projeto.
2. Validação (Validation)
· O que é? Processo que verifica se o produto final atende às necessidades do usuário.
· Objetivos:
· Confirmar que o software:
· faz o que deveria fazer;
· atende aos requisitos definidos.
· A validação procura: garantir que o produto final seja adequado ao uso real.
· Exemplo: Verificar se um sistema embarcado automotivo realmente executa as funções esperadas pelo usuário.
Importância de detectar erros cedo
· Quanto mais cedo um defeito é encontrado:
· menor é o custo de correção;
· menor é o impacto no projeto.
· Benefícios:
· Desenvolvimento mais confiável;
· Menor retrabalho;
· Maior qualidade do produto;
· Mais segurança em sistemas críticos.
Relação entre teste, verificação e validação
Teste de software:
· O teste faz parte da V&V.
· É utilizado para:
· encontrar falhas;
· avaliar funcionamento do sistema.
Definições importantes apresentadas no texto
Definição 1:
· Validação: Verifica se o software atende às necessidades e requisitos do usuário.
· Verificação: Garante consistência, integridade e correção em cada etapa do desenvolvimento.
Definição 2:
· Verificação: Avalia cada fase do ciclo de vida do software.
· Validação: Testa o software no final do desenvolvimento.
· Observação: O melhor resultado ocorre quando ambas trabalham juntas.
Definição 3:
· Verificação: Garante que o software implementa corretamente uma função.
· Validação: Garante que o software atende aos requisitos do cliente.
Ideia central da V&V
· Verificação: “Estamos construindo o software corretamente?”
· Validação: “Estamos construindo o software certo?”
Conclusão
· Em sistemas embarcados, qualidade não deve ser deixada apenas para os testes finais.
· As técnicas de V&V ajudam a:
· evitar falhas;
· aumentar a confiabilidade;
· melhorar a segurança;
· garantir que o sistema funcione corretamente desde o início do desenvolvimento.
ATIVIDADES DE V&V
O que são atividades de V&V?
· As atividades de Verificação (Verification) e Validação (Validation) têm como objetivo garantir a qualidade do software embarcado durante todo o desenvolvimento.
Principais elementos analisados em V&V
As atividades de V&V verificam principalmente quatro aspectos:
1. Integridade
2. Consistência
3. Viabilidade
4. Testabilidade
1. Integridade
· O que significa?
· Garantir que o produto de trabalho esteja completo.
· Nenhuma informação importante deve faltar.
· Verificações realizadas:
· Não deve haver:
· itens “TBD” (“a ser determinado”);
· referências inexistentes;
· requisitos incompletos;
· casos especiais ignorados.
· Ideia principal: Tudo que foi definido anteriormente deve aparecer corretamente nas próximas etapas.
· Exemplo: Se um requisito define uma função:
· O projeto e o código devem tratar essa função adequadamente.
2. Consistência
· O que significa? Garantir que não existam conflitos entre requisitos ou funções.
· Tipos de consistência:
· Consistência interna: Verifica conflitos dentro do próprio documento ou produto.
· Consistência externa: Verifica conflitos entre diferentes produtos de trabalho.
· Exemplo: Uma função gera uma saída incompatível com a entrada esperada por outra função.
· Objetivo: Evitar problemas quando os módulos forem integrados.
3. Viabilidade
· O que significa? Avaliar se o produto realmente pode ser desenvolvido.
· Aspectos analisados:
· Recursos humanos disponíveis;
· Tecnologia existente;
· Custos;
· Cronograma;
· Riscos técnicos;
· Interação com outros sistemas.
· Exemplo: Um requisito pode exigir desempenho impossível para o hardware disponível.
· Objetivo: Garantir que o projeto seja realista e executável.
4. Testabilidade
· O que significa? Verificar se o produto pode ser testado corretamente.
· Um requisito testável deve ser:
· específico;
· claro;
· sem ambiguidades;
· quantitativo.
· Exemplo de requisito RUIM: “O algoritmo deve ser o mais rápido possível.”
· Problema: Não existe medida objetiva para verificar isso.· Objetivo da testabilidade
· Facilitar a criação de testes objetivos.
· Melhorar a qualidade do produto antes da implementação final.
· Critérios de saída
· A testabilidade também ajuda a definir:
· quando o software foi suficientemente testado;
· quando ele está pronto para entrega.
Certificação em sistemas embarcados
Objetivo da certificação:
· Demonstrar formalmente que o software:
1. Foi desenvolvido corretamente;
2. Possui características desejadas;
3. Atende requisitos técnicos específicos.
O que um certificado pode informar?
· Quais testes foram realizados;
· Nível de rigor aplicado;
· Grau de conformidade do software.
Importância da certificação
· Em sistemas críticos, a certificação é obrigatória.
· Exemplo:
· Sistemas de:
· usinas nucleares;
· aeronaves;
· equipamentos médicos.
Vantagens da certificação
1. Maior confiabilidade: Pode elevar o nível de qualidade dos softwares no mercado.
2. Base para garantia: Facilita comprovação de qualidade e segurança.
3. Transferência de risco: Parte da responsabilidade é compartilhada com a autoridade certificadora.
4. Garantias de comportamento: O produto possui comprovação funcional e não funcional.
Desvantagens da certificação
1. Aumento de custos: Pode tornar o projeto mais caro.
2. Atrasos no desenvolvimento: O processo de certificação pode aumentar o tempo de entrega.
3. Falsa sensação de segurança: A certificação não garante ausência total de falhas.
4. Redução de flexibilidade:
· Pode limitar:
· inovação;
· interoperabilidade;
· novas soluções tecnológicas.
Resumo
· As atividades de V&V ajudam a garantir qualidade, segurança e confiabilidade em sistemas embarcados.
· Elas verificam se o software:
· está completo;
· é consistente;
· pode ser desenvolvido;
· pode ser testado corretamente.
· Em aplicações críticas, a certificação é essencial para comprovar a confiabilidade do sistema.
Módulo 4. As boas práticas de programação para o desenvolvimento do software embarcado nos microcontroladores
O QUE É A INTERNET DA COISAS?
Conceito de Internet das Coisas (IoT)
· A Internet das Coisas (IoT) é uma rede de objetos físicos conectados à internet.
· Esses objetos possuem componentes inteligentes capazes de:
· coletar dados;
· processar informações;
· comunicar-se com outros dispositivos;
· executar ações automaticamente.
Exemplos de dispositivos IoT
· Relógios inteligentes (wearables);
· Eletrodomésticos inteligentes;
· Sistemas de segurança;
· Veículos autônomos;
· Equipamentos industriais;
· Sensores agrícolas;
· Iluminação inteligente;
· Equipamentos de monitoramento em prédios e pontes.
Componentes usados em sistemas IoT
· Os dispositivos IoT possuem componentes inteligentes, como:
· Microcontroladores;
· Sensores;
· Atuadores;
· Memória para armazenamento de dados;
· Software embarcado;
· Comunicação via internet.
· Esses componentes permitem:
· coletar informações;
· processar dados;
· executar ações automáticas;
· comunicar-se com outros dispositivos.
· A conexão ocorre por meio da internet, permitindo integração entre:
· dispositivos;
· sistemas;
· usuários.
· O principal objetivo da IoT é automatizar processos, monitorar informações e facilitar a troca de dados em tempo real.
Importância da IoT para sistemas embarcados
· A IoT cria diversas oportunidades para profissionais que trabalham com:
· microcontroladores;
· sistemas embarcados;
· automação;
· eletrônica e programação.
· O desenvolvimento de dispositivos conectados é uma das áreas mais promissoras da tecnologia.
Funcionamento básico da IoT
1. O dispositivo coleta dados por sensores;
2. Os dados são enviados pela internet;
3. Um sistema analisa as informações;
4. A partir da análise, ações podem ser executadas automaticamente.
Importância dos dados
· O grande valor da IoT está nos dados coletados.
· Esses dados podem gerar:
· monitoramento;
· automação;
· tomada de decisões;
· inteligência para sistemas.
Segurança e conectividade
· A integridade e proteção dos dados são fundamentais.
· Por isso, é importante:
· usar protocolos de comunicação adequados;
· garantir segurança no sistema;
· gerenciar corretamente os dispositivos conectados.
Sustentabilidade e eficiência energética
· Muitos dispositivos IoT funcionam com bateria.
· Portanto, os sistemas precisam:
· consumir pouca energia;
· transmitir dados de forma confiável;
· operar em diferentes distâncias e ambientes.
Aplicações práticas
A IoT pode ser usada em:
· Agricultura inteligente;
· Cidades inteligentes;
· Indústria 4.0;
· Saúde;
· Automação residencial;
· Transporte;
· Energia e monitoramento ambiental.
Relação com Inteligência Artificial
· Dispositivos IoT estão cada vez mais integrados com:
· Inteligência Artificial (IA);
· Machine Learning (Aprendizado de Máquina).
· Isso permite sistemas mais inteligentes e autônomos.
SOLUÇÕES PARA IOT
O que são soluções para IoT
· As soluções para Internet das Coisas (IoT) ajudam a:
· conectar dispositivos;
· gerenciar sensores e redes;
· garantir segurança;
· controlar plataformas e dados.
Papel dos sensores
· Os sensores permitem que objetos do cotidiano se tornem inteligentes e conectados.
· Eles coletam diferentes tipos de dados para:
· monitoramento;
· análise;
· automação de processos.
· Muitos dispositivos IoT utilizam vários sensores ao mesmo tempo.
Integração e sistema em chip
· Com o crescimento da IoT, empresas utilizam soluções de Sistema em um Chip (SoC).
· Essas soluções ajudam a:
· economizar espaço;
· melhorar a integração dos componentes;
· aumentar a eficiência do dispositivo.
Segurança em IoT
· A segurança é essencial para proteger:
· dispositivos;
· redes;
· dados transmitidos.
· As arquiteturas de segurança são incorporadas diretamente nos sistemas IoT.
Características de uma plataforma IoT
Uma plataforma IoT deve ser:
· flexível;
· segura;
· eficiente.
Ela deve permitir:
· conectividade;
· gerenciamento de dispositivos;
· gerenciamento de dados.
Tecnologias utilizadas nas soluções IoT
As empresas utilizam soluções com:
· sistemas operacionais avançados;
· sistemas em tempo real;
· dispositivos de baixo consumo de energia;
· recursos de segurança integrados.
Principais tipos de soluções IoT
As soluções podem incluir:
· Soluções de tecnologia;
· Gerenciamento de dispositivos;
· Soluções de segurança.
IoT e transformação digital
· A IoT é um dos principais fatores da transformação digital.
· Ela permite que empresas:
· criem novos produtos;
· modernizem serviços;
· melhorem operações internas;
· desenvolvam novos modelos de negócio.
Benefícios das soluções IoT
As soluções IoT possibilitam:
· comunicação contínua entre dispositivos e pessoas;
· monitoramento em tempo real;
· maior eficiência operacional;
· geração de novas oportunidades de receita;
· acesso rápido e transparente aos dados.
Principal dispositivo tecnológico da IoT
· O principal componente tecnológico das soluções IoT é o:
· microcontrolador com interface sem fio integrada.
MICROCONTROLADORES NA IOT
O que é um microcontrolador na IoT
· O microcontrolador é o principal componente de um sistema IoT.
· Ele funciona como o “cérebro” do sistema.
· Sua função é:
· receber dados dos sensores;
· processar informações;
· tomar decisões;
· enviar comandos aos atuadores.
Principais componentes de um sistema IoT
1. Sensores:
· Monitoram o ambiente.
· Coletam dados como:
· temperatura;
· luminosidade;
· movimento;
· umidade;
· pressão.
· Os dados podem:
· ser processados localmente;
· ou enviados para a nuvem.
2. Comunicação:
· Permite a conexão entre dispositivos e a internet.
· Utiliza protocolos de comunicação como:
· Wi-Fi;
· Bluetooth;
· ZigBee;
· Ethernet;
· GPRS.
· Faz a troca de informações entre:
· sensores;
· microcontroladores;
· nuvem;
· usuários.
3. Microcontroladores:
· Coordenam todos os componentes do sistema.
· Processam os dados recebidos dos sensores.
· Geram sinais de controle para os atuadores.
·Executam funções inteligentes no sistema IoT.
Principais funções:
· armazenamento de dados;
· análise de informações;
· controle do sistema;
· comunicação com a nuvem;
· automação de dispositivos.
4. Atuadores:
· São dispositivos que executam ações físicas.
· Transformam sinais elétricos em movimento ou ação mecânica.
Exemplos:
· motores;
· relés;
· válvulas;
· lâmpadas;
· travas automáticas.
5. Interfaces de usuário
· Permitem a interação entre o usuário e o sistema IoT.
· Devem fornecer serviços inteligentes e acessíveis.
Exemplos:
· aplicativos;
· painéis de controle;
· interfaces web;
· sistemas de monitoramento.
Inteligência embarcada na IoT
· Todo sistema IoT deve possuir inteligência embutida.
· O objetivo é:
· melhorar a eficiência;
· automatizar tarefas;
· otimizar a colaboração entre dispositivos.
· O microcontrolador utiliza técnicas inteligentes para coordenar o funcionamento do sistema.
Estrutura de software do microcontrolador IoT
1. Camada de sensoriamento
· Responsável pela interação com:
· sensores;
· atuadores.
· Funções:
· receber dados dos sensores;
· selecionar sensores adequados;
· enviar sinais aos atuadores.
2. Camada de comunicação
· Responsável pelas conexões e troca de dados.
· Interfaces e protocolos:
· Ethernet;
· Wi-Fi;
· Bluetooth;
· ZigBee;
· GPRS.
· Função: conectar o microcontrolador aos demais componentes e à nuvem.
3. Camada de controle
· É a camada central do sistema.
· Responsabilidades:
· armazenar dados;
· analisar informações;
· processar sinais;
· controlar atuadores;
· integrar o sistema com a nuvem.
4. Camada de aplicação
· Responsável pelos serviços oferecidos ao usuário.
· Principais funcionalidades:
· monitoramento do sistema;
· controle remoto dos dispositivos;
· ajuste de sensores e atuadores;
· acompanhamento do estado do sistema.
Objetivo final do microcontrolador na IoT
· Fornecer serviços inteligentes aos usuários.
· Garantir:
· automação;
· conectividade;
· monitoramento;
· controle remoto;
· eficiência operacional.
MODELOS DE MICROCONTROLADORES PARA IOT
Escolha do microcontrolador
· Para selecionar o microcontrolador ideal para um projeto IoT, é necessário conhecer:
· suas funções;
· seus recursos principais;
· sua capacidade de comunicação.
Camada de comunicação
· A comunicação é uma característica essencial em aplicações IoT.
· É ela que permite a conexão do dispositivo com a internet.
· Essa conexão pode ocorrer por:
· Wi-Fi;
· Ethernet;
· outros meios de comunicação.
Consumo de energia
· O consumo de energia é um fator muito importante na escolha do microcontrolador.
· Isso é ainda mais relevante em dispositivos alimentados por:
· bateria;
· energia solar.
· Essa especificação indica o quanto o microcontrolador demanda energia durante o funcionamento.
Ferramentas e comunidade
· Plataformas com boas ferramentas de desenvolvimento facilitam a criação da aplicação.
· Uma comunidade ativa ajuda com:
· documentação;
· exemplos;
· suporte;
· solução de problemas.
· Quanto mais madura for a plataforma, mais simples tende a ser o desenvolvimento.
Integração com a nuvem
· Um dos desafios iniciais em IoT é integrar os dados do dispositivo à nuvem.
· Para isso, utilizam-se protocolos de comunicação específicos.
Protocolo MQTT
· O MQTT (MQ Telemetry Transport) é um dos principais protocolos usados em IoT.
· Suas características:
· protocolo leve;
· otimizado para sensores e dispositivos pequenos;
· funciona sobre redes TCP/IP;
· adequado para dispositivos com poucos recursos.
SISTEMAS OPERACIONAIS EM MICROCONTROLADORES PARA IOT
Uso de sistemas operacionais em IoT
· Muitos projetos IoT utilizam sistemas operacionais para facilitar:
· conexão com a internet;
· desenvolvimento da aplicação.
· Soluções sem sistema operacional podem ser:
· mais econômicas;
· mais eficientes em consumo de energia.
Principais abordagens
1. Bare Metal
· Não utiliza sistema operacional.
· É a abordagem mais tradicional em microcontroladores.
· Vantagens:
· baixo custo;
· alta eficiência;
· menor consumo de recursos.
· Desvantagem: menor suporte para acesso e integração com a internet.
2. RTOS (Sistema Operacional de Tempo Real)
· Garante tempos exatos de execução das operações.
· Mantém características de eficiência do Bare Metal.
· Indicado para aplicações que exigem precisão no tempo.
· Necessita de microcontroladores com maior desempenho.
3. Linux
· Facilita a programação e a conexão com a internet.
· Funciona de forma semelhante a um computador convencional.
· Vantagens:
· maior facilidade de desenvolvimento;
· melhor suporte para redes e aplicações complexas.
· Desvantagem: não possui determinismo no tempo de execução.
· Exemplos:
· Raspberry Pi
· BeagleBone
MICROCONTROLADORES COM COMUNICAÇÃO SEM FIO
Comunicação sem fio em microcontroladores
· Microcontroladores com comunicação sem fio integrada são considerados o futuro dos sistemas embarcados.
· A tendência é que dispositivos precisem estar conectados em rede e na internet.
ESP32 como solução para IoT
· O ESP32, da empresa Espressif, é considerado um dos principais chips para IoT.
· Ele integra em um único chip:
· microcontrolador;
· Wi-Fi;
· Bluetooth.
· Vantagens do ESP32:
· baixo custo;
· suporte da comunidade;
· compatibilidade com a IDE do Arduino;
· facilidade de integração com redes e nuvem;
· dispensa módulos externos adicionais.
Características do ESP32
Dual Core (Núcleo Duplo):
· O ESP32 possui dois processadores:
· PRO_CPU
· APP_CPU
Funções dos núcleos:
· PRO_CPU
· controla Wi-Fi;
· Bluetooth;
· periféricos internos.
· APP_CPU: executa o código principal da aplicação.
Desempenho
· Processadores Tensilica LX6 de 32 bits.
· Frequência:
· 160 MHz;
· 240 MHz.
· Capacidade de até: 600 MIPS (Milhões de Instruções por Segundo).
Framework de desenvolvimento
· O ESP32 utiliza o: ESP-IDF (framework oficial da Espressif).
· O Arduino utiliza o ESP-IDF como base.
· O sistema utiliza o: freeRTOS para gerenciamento de tarefas.
Recursos de comunicação
1. Wi-Fi:
· Implementa:
· protocolo TCP/IP;
· WLAN MAC 802.11.
· Pode funcionar como:
· cliente Wi-Fi;
· ponto de acesso.
2. Wi-Fi Direct
· Permite conexão direta entre dispositivos.
· Não necessita roteador.
· Vantagens:
· configuração simples;
· maior velocidade que Bluetooth.
3. Bluetooth
· Suporta:
· Bluetooth clássico;
· Bluetooth Low Energy (BLE).
· Benefícios:
· compatibilidade com dispositivos antigos e novos;
· baixo consumo de energia.
Periféricos integrados do ESP32
O ESP32 possui diversos recursos internos, como:
· ADC;
· DAC;
· PWM;
· UART;
· SPI;
· I2C;
· Ethernet;
· relógio em tempo real;
· watchdog;
· sensor de toque;
· contador de pulsos;
· coprocessador de baixo consumo.
Objetivo do código apresentado:
· Conectar o ESP32 a uma rede Wi-Fi utilizando a IDE do Arduino.
· Exibir no monitor serial:
· o processo de conexão;
· o endereço IP obtido na rede.
#include // Biblioteca para usar Wi-Fi no ESP32
// Dados da rede Wi-Fi
const char* ssid = "MinhaRedeCasa"; // Nome da rede Wi-Fi
const char* password = "12345678"; // Senha da rede Wi-Fi
void setup() {
Serial.begin(115200); // Inicia comunicação serial
Serial.println("Iniciando conexão WiFi..."); // Mensagem inicial
WiFi.begin(ssid, password); // Inicia conexão com a rede
// Aguarda até conectar ao Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(500); // Espera 500 ms
Serial.print("."); // Mostra progresso da conexão
}
// Mensagem quando conectar
Serial.println("\nConectado na rede WiFi!");
Serial.print("Endereço IP: "); // Exibe texto
Serial.println(WiFi.localIP()); // Mostra o IP recebido
}
void loop() {
// Espaço para outras funções do programa
}
Entrada do programa:
O usuário deve informar:
· nome da rede Wi-Fi (SSID);
· senha da rede.
· Exemplo:
const char* ssid = "MinhaRede";
const char* password = "MinhaSenha";
Saída esperada:
Enquanto tenta conectar:
...
...
...
Apósconexão:
Conectado na rede WiFi!
Endereço IP: 192.168.x.x
Conclusão
· O ESP32 é uma plataforma muito utilizada em IoT.
· Ele facilita:
· conexão com redes;
· integração com sensores;
· comunicação com a nuvem;
· uso de protocolos como MQTT.
· É uma ótima opção para iniciar estudos em IoT.
image6.png
image7.png
image8.png
image9.png
image10.png
image11.png
image12.png
image13.png
image14.png
image15.png
image16.png
image17.png
image18.png
image19.png
image20.png
image21.png
image22.png
image23.png
image24.png
image25.png
image26.png
image27.png
image28.png
image29.png
image30.png
image31.png
image32.png
image33.png
image34.png
image35.png
image36.png
image37.png
image38.png
image39.png
image40.png
image41.gif
image42.png
image43.png
image44.png
image45.png
image1.png
image46.png
image47.png
image48.gif
image49.png
image50.png
image51.png
image52.png
image53.png
image54.png
image55.png
image2.png
image56.png
image57.png
image58.png
image59.png
image60.png
image3.png
image4.jpeg
image5.pnge rápidas
· Cada instrução faz uma tarefa pequena
· ✔️ Melhor desempenho com técnicas como pipelining
🔹 CISC (Complex Instruction Set Computer)
· Instruções complexas (fazem várias operações em uma só)
· Exemplo: ler memória + calcular + armazenar
· ❌ Mais difícil de otimizar
🚀 O que é Pipelining (Tunelamento)
· Técnica para executar várias instruções ao mesmo tempo (em etapas diferentes)
· Funciona como uma linha de montagem
· 👉 Aumenta a velocidade de execução do processador
🧺 Ideia intuitiva (analogia)
· Em vez de fazer tudo de uma tarefa e depois começar outra:
· Várias tarefas são feitas em paralelo, em etapas diferentes
· Resultado: Menos tempo total de execução
⚙️ Etapas do Pipelining (modelo básico)
1. Buscar instrução na memória
2. Decodificar instrução
3. Executar operação
4. Acessar memória (se necessário)
5. Escrever resultado
⏱️ Importante sobre desempenho
· Cada etapa idealmente leva 1 ciclo de clock
· O tempo total depende da etapa mais lenta
· Objetivo: Completar 1 instrução por ciclo (CPI ≈ 1)
💡 Por que RISC é melhor para pipelining
· Instruções:
· Simples
· Mesmo tamanho
· ✔️ Facilita dividir o processo em etapas iguais
· ❌ CISC dificulta (instruções variam muito)
🎯 Resumo:
· Pipelining: técnica que busca executar várias instruções simultaneamente (em fases diferentes)
· RISC: ideal para pipelining (simples e rápido)
· CISC: mais complexo, menos eficiente para isso
· 👉 Resultado: maior desempenho da CPU
RISC VERSUS CISC
📌 Comparação geral: RISC vs CISC
🔹 CISC (Instruções complexas)
· Executa várias operações em uma única instrução
· Objetivo: reduzir a quantidade de código
· Características:
· Menos linhas de código
· Menor uso de memória (RAM)
· Hardware mais complexo
🔹 RISC (Instruções simples)
· Usa instruções simples e separadas
· Cada instrução executa uma única tarefa
· Características:
· Mais linhas de código
· Execução mais rápida (1 ciclo por instrução)
· Facilita o uso de pipelining
· Hardware mais simples
🧠 Exemplo prático: Multiplicação de dois valores
🎯 Objetivo do código: Multiplicar dois valores armazenados na memória (posições 21 e 49) e salvar o resultado na posição 21.
1) Abordagem CISC (1 instrução):
MULT 21, 49
📝 Explicação:
· MULT → instrução complexa que faz tudo:
· Carrega os dados da memória
· Multiplica os valores
· Armazena o resultado
👉 Equivalente em linguagem C: a = a * b;
2) Abordagem RISC (várias instruções):
LOAD A, 21 // Carrega o valor da posição 21 para o registrador A
LOAD B, 49 // Carrega o valor da posição 49 para o registrador B
PROD A, B // Multiplica os valores em A e B (resultado fica em A)
STORE 21, A // Armazena o resultado de volta na posição 21
· O desempenho de um processador com arquitetura RISC depende muita da qualidade do código que é executado.
👉 Se o código for bem otimizado, o processador é muito rápido; se não, pode perder desempenho.
· A escolha entre RISC e CISC depende dos recursos disponíveis no momento (memória, desempenho, custo).
⚖️ Comparação prática
Vantagens e Desvantagens do CISC:
✔️ Vantagens:
· Código mais curto
· Mais fácil de escrever
· Menor uso de memória
❌ Desvantagens:
· Execução mais lenta (instruções complexas)
· Hardware mais complicado
Vantagens e Desvantagens do RISC:
✔️ Vantagens:
· Execução mais rápida (1 ciclo por instrução)
· Permite pipelining (maior desempenho)
· Mantém dados nos registradores (menos acesso à memória)
· Hardware mais simples
❌ Desvantagens:
· Código maior (mais instruções)
· Maior uso de memória
· Compilador mais complexo
🎯 Resumo:
· CISC: menos instruções, mais complexas
· RISC: mais instruções, mais simples e rápidas
· 👉 RISC tende a ser mais eficiente em desempenho
· 👉 CISC tende a ser mais compacto em código
RISC OU CISC?
📌 Escolha atual: RISC vs CISC
· Hoje, a maioria dos fabricantes utiliza arquitetura RISC (instruções menores e mais simples)
· Porém, computadores pessoais ainda usam CISC (ex: família Intel x86)
🕰️ Contexto histórico
· Antigamente:
· Memória era limitada
· Programas precisavam ser pequenos
· Muitos códigos eram escritos em assembly
· 👉 Por isso, CISC era vantajoso:
· Menos instruções para fazer tarefas
⚠️ Problemas com CISC (anos 1980)
· Instruções muito complexas:
· Difíceis de otimizar
· Difíceis de implementar no hardware
· Compiladores não aproveitavam bem essas instruções
· 👉 Conclusão: Melhor investir em simplicidade (RISC)
🚀 Ascensão do RISC
· Vantagens percebidas:
· Melhor desempenho
· Uso mais eficiente de registradores
· Facilidade de implementação
· Evolução dos compiladores ajudou a tornar o RISC mais eficiente
🔄 Situação atual (mistura de conceitos)
· RISC e CISC não são mais totalmente distintos
· Muitas CPUs modernas misturam características dos dois modelos
· 👉 Existe um “meio-termo” entre as arquiteturas
💻 Caso especial: Intel x86
· Mantém arquitetura CISC por compatibilidade com sistemas antigos
· Mesmo assim, internamente usa técnicas modernas (semelhantes ao RISC)
🔌 Microcontroladores
· Predominância atual uso da arquitetura RISC (mais eficiente e simples)
· Exceção importante: Intel 8051 → ainda usa a arquitetura CISC
🎯 Resumo direto
· Antigamente: CISC era melhor (memória limitada)
· Hoje: RISC é mais eficiente e dominante
· Atualidade: arquiteturas híbridas (mistura dos dois)
MICROCONTROLADORES E ARQUITETURA DE MEMÓRIA
📌 Arquitetura de memória: conceito geral
· Ao projetar um processador, é preciso decidir como a memória será usada:
· Se dados e instruções compartilham a mesma memória
· Ou as memórias são separadas para dados e instruções
· 👉 Essa decisão define dois tipos de arquitetura:
· von Neumann
· Harvard
🧠 Arquitetura von Neumann
📌 Como funciona:
· Usa uma única memória para:
· Dados
· Instruções (programa)
· Usa um único barramento
⚠️ Limitação:
· Não consegue acessar dados e instruções ao mesmo tempo
· 👉 Isso gera um gargalo (queda de desempenho)
🎯 Resumindo:
· Mais simples
· Mais barata
· Porém mais lenta
⚙️ Arquitetura Harvard
📌 Como funciona
· Usa memórias separadas:
· Uma para instruções
· Outra para dados
· Usa barramentos diferentes
🚀 Vantagens
· Acessa dados e instruções ao mesmo tempo
· Maior desempenho
· Evita gargalos
⚠️ Desvantagem
· Mais complexa
· Maior custo de implementação
🔄 Comparação direta
· von Neumann:
· 1 memória + 1 barramento
· Mais simples e barata
· Mais lenta (gargalo)
· Harvard:
· Memórias separadas
· Mais rápida
· Mais complexa
🔌 Uso em microcontroladores
· A maioria usa arquitetura Harvard
· Motivo:
· Melhor desempenho
· Memórias já integradas no chip
🧩 Variações (arquitetura híbrida)
· Alguns microcontroladores usam modelos mistos:
· Internamente → Harvard
· Externamente → von Neumann
📌 Exemplos:
· Intel 8051 → Harvard modificada
· ARM Cortex → pode usar ambas
· Microchip PIC → baseado em Harvard
🎯 Resumo:
· von Neumann: simples, porém com gargalo
· Harvard: mais rápida, com acesso simultâneo
· 👉 Microcontroladores preferem Harvard por desempenho
Questão 1. A equação clássica de desempenho da UCP (Unidade Central de Processamento) é dada em termos do número de instruções executadas pelo programa, os ciclos de clock médios por instrução (CPI) e a taxa de clock, como mostrado abaixo.
Onde, respectivamente, atuam as arquiteturas RISC e CISC para melhorar o desempenho da UCP?
Resposta: A equação de desempenho da UCP mostra que o tempo (desempenho) depende do número de instruções, do CPI e da taxa de clock.
· RISC: simplifica as instruções, reduzindo o CPI (menos ciclos por instrução).
· CISC: cria instruções mais complexas, reduzindo o número de instruções necessárias para executar um programa.
Assim, cada arquitetura atua em um fator diferente da equação para melhorar o desempenho.
Questão2. Por que a arquitetura von Neumann tende a ser mais lenta do que a arquitetura Harvard?
Resposta: Porque não pode acessar a memória de programa e dados simultaneamente.
Módulo 4. Microcontroladores:famílias e tipos existentes no mercado
NÚMERO DE BITS EM MICROCONTROLADORES
📌 O que significa “n bits”
· “n bits” é a quantidade de dados que o microcontrolador consegue processar de uma vez
· Exemplo:
· 8 bits → trabalha com números de até 8 bits por operação
· Se o número for maior → precisa dividir em partes
· Em outras palavras: “n bits” = tamanho máximo de dados que o processador manipula de uma vez
⚙️ Impacto no processamento
· Operações dentro do limite: São rápidas (1 ciclo de processamento)
· Operações com números maiores:
· Precisam ser divididas em partes
· Levam mais tempo
🔢 Exemplo prático (8 bits)
· Considerando um microcontrolador de 8 bits, temos um intervalo que varia de 0 a 255 para um inteiro sem sinal e de -128 a 127 para um inteiro com sinal.
Por que 8 bits vai só até 255?
· 8 bits conseguem representar 256 valores diferentes ()
· 👉 Isso dá:
· Sem sinal: 0 até 255
· Com sinal: -128 até 127
O problema com números maiores (ex: 640)
· O número 640 é grande demais para caber em 8 bits
· 👉 Então o microcontrolador não consegue processar ele de uma vez
Como ele resolve isso?
· O número é quebrado em partes menores (8 bits cada)
· Essas partes são processadas uma de cada vez
· Depois, o resultado é reunido
Resumo:
· 8 bits → só trabalha com números pequenos diretamente
· Números grandes → precisam ser divididos e processados em etapas
· 👉 Isso deixa o processamento mais lento
🚀 Comparação de desempenho
· 8 bits:
· Mais simples
· Porém, mais lento para números grandes
· 16 bits (ou mais):
· Processa números maiores diretamente
· Mais rápido para cálculos complexos
💾 Endereçamento de memória
· Exemplo comum um microcontrolador de 8 bits com um contador de programa de 16 bits
· Possui capacidade de até 64 KB de memória (2¹⁶)
Por que 16 bits = 64 KB?
· Um contador de 16 bits consegue formar:
· 2¹⁶ = 65.536 posições de memória
· 👉 Cada posição = 1 byte
· 👉 Total = 64 KB de memória
O que isso significa na prática?
· Mesmo sendo um microcontrolador de 8 bits, ele pode:
· Acessar até 64 KB de programa/memória
· 👉 Ou seja:
· Ele processa dados pequenos (8 bits)
· Mas consegue acessar uma memória relativamente grande
Por que isso é suficiente?
· Sistemas embarcados geralmente:
· Executam tarefas simples
· Não precisam de programas muito grandes
👉 Por isso, 8 bits + 64 KB já atendem muitas aplicações
🎯 Uso na prática
· Microcontroladores de 8 bits:
· Ainda muito usados
· Suficientes para aplicações simples
🧠 Resumo:
· Mais bits = mais capacidade e velocidade
· Menos bits = mais simples e econômico
· 👉 A escolha depende da complexidade da aplicação
ARQUITETURAS DE 8 BITS VERSUS 16 E 32 BITS
🔹 Largura de Barramento de 8, 16 e 32 bits – Principais pontos
· Define quantos dados o microcontrolador processa por vez.
· Quanto maior (16 ou 32 bits), maior a capacidade de processamento.
🔹 Desempenho e velocidade:
· Microcontroladores com mais bits (16 ou 32 bits):
· Realizam cálculos mais rapidamente.
· Possuem maior taxa de transferência de dados.
· Microcontroladores de menos bits (8 bits):
· Precisam de mais ciclos para executar operações maiores.
🔹 Relação entre Bits e Ciclos:
· Quanto menor a largura (bits): Mais ciclos são necessários para completar operações
· Comparação:
· 8 bits → mais ciclos
· 16 bits → menos ciclos
· 32 bits → ainda menos ciclos
· Microcontroladores com maior largura de barramento:
· Oferecem ferramentas de desenvolvimento mais avançadas.
· Possuem mais recursos internos.
🔹 Eficiência Energética:
· Em geral, arquiteturas maiores (16/32 bits):
· Podem ser mais eficientes energeticamente, dependendo da aplicação.
🔹 Confiabilidade em Execução:
· 8 bits:
· Maior risco de falha/interrupção durante operações longas
· Pode não concluir tarefas devido à necessidade de vários ciclos
· 32 bits:
· Podem concluir tarefas em menos ciclos (às vezes em um único ciclo)
· Menor chance de falha durante a execução
🔹 Custo:
· 8 bits:
· Mais baratos
· Menor desempenho
· Ideais para produtos de alto volume e baixo custo
· 16 e 32 bits:
· Mais desempenho e eficiência
· Podem ter custo semelhante aos 8 bits em alguns casos
· Melhor escolha quando se pensa em expansão futura e mais recursos
· Critério de escolha:
· Baseado nos requisitos mínimos do projeto e no menor custo possível
· Em projetos mais avançados, custo do chip pode não ser o fator principal
· Mão de obra e desenvolvimento:
· 32 bits tendem a reduzir custos de desenvolvimento (mais ferramentas e código disponível)
· 8 bits têm escopo mais limitado
· Tendência:
· Ecossistema e inovação estão mais focados em 32 bits
· 8 bits estão ficando tecnologicamente menos relevantes
🔹 Tamanho do Código:
· Maior largura de bits (32 bits):
· Código mais denso e compacto
· Pode ser até ~30% menor que em 8 bits
· Mais complexo em Assembly
· Mais fácil de programar com C/C++ (portável e com boas ferramentas/IDEs)
· 8 bits:
· Mais simples e eficiente em Assembly
· Exige mais esforço para otimização, dependendo do programador
🔹 Recursos e Capacidade:
· 32 bits:
· Mais periféricos e funcionalidades
· Melhor desempenho em tempo real
· Suporte a tecnologias modernas (ex: IoT)
· 8 bits:
· Menos recursos, mas ampla disponibilidade
· Suficientes para aplicações simples
🔹 Uso e Aplicações
· 8 bits:
· Aplicações simples e de baixo custo
· Projetos com requisitos mínimos
· 32 bits:
· Aplicações mais complexas
· Crescente uso em áreas como:
· Automobilística
· Internet das Coisas (IoT)
🔹 Curva de Aprendizado
· 8 bits: Melhor para aprendizado de baixo nível (Assembly)
· 32 bits: Mais complexo, porém mais relevante no mercado atual
🔹 Tendência de Mercado
· Microcontroladores de 8 bits foram padrão por décadas
· Microcontroladores de 32 bits:
· Estão se tornando predominantes
· Representam o futuro da tecnologia
🔹 Conclusão (Essência)
· A escolha depende de:
· Requisitos da aplicação
· Custo do projeto
· Tempo de desenvolvimento
· Necessidade de expansão futura
· Resumo:
· 8 bits → simples, barato, limitado
· 32 bits → poderoso, moderno, escalável
FAMÍLIAS PRINCIPAIS DE MICROCONTROLADORES
🔹 Principais Famílias de Microcontroladores
🟢 1. Microcontrolador 8051
· Arquitetura CISC (8 bits), criada pela Intel (1981)
· Muito difundido e ainda utilizado
· Características:
· 4 KB ROM, 128 B RAM (+ memória externa opcional)
· 4 portas paralelas de 8 bits
· Comunicação serial
· 2 temporizadores de 16 bits
· 5 fontes de interrupção
· Fácil de programar, porém mais antigo
🟢 2. Microcontrolador AVR (Atmel)
· Arquitetura RISC (8 bits, Harvard)
· Mais rápido e eficiente que o 8051
· Muito usado no Arduino
Vantagens sobre 8051:
· Maior velocidade
· Menor consumo de energia
· Mais moderno
Classificação:
· TinyAVR → simples e pequeno
· MegaAVR → mais popular e versátil
· XmegaAVR → alto desempenho
Destaque: ATmega328
· Usado no Arduino Uno/Nano
· 32 KB Flash, 2 KB SRAM
· ADC, PWM, USART, até 20 MHz
🟢 3. Microcontrolador PIC (Microchip)
· Muito popular (indústria e amadores)
· Boa relação custo-benefício
· Arquitetura RISC
Vantagens:
· Grande variedade de modelos
· Muitos periféricos integrados
· Programação serial
Exemplo: PIC16F877
· Memória Flash, RAM e EEPROM
· Até 14 interrupções
· Conversor A/D, UART
· Baixo consumo (modo SLEEP)
🟢 4. Microcontrolador ARM
· Arquitetura RISC de 32 bits
· Alto desempenho e ampla utilização
Família Cortex:
· Cortex-A → alto desempenho (smartphones)
· Cortex-R → tempo real
· Cortex-M → sistemas embarcados
Aplicações: IoT, automotivo, industrial, redes
🟢 5. Microcontrolador MSP (Texas Instruments)
· Arquitetura 16 bits
· Foco em baixo consumo de energia
Características:
· Código mais curto e eficiente
· Bom desempenho com baixo custo
· Ideal para sistemas embarcados simples
🟢 6. Microcontrolador ESP32 (Espressif)
· Microcontrolador moderno com:
· Wi-Fi + Bluetooth integrados
· Processador até 240 MHz (dual-core)
Destaques:
· Baixo consumo de energia
· Altaintegração (antena, amplificadores, etc.)
· Ideal para:
· IoT
· Dispositivos móveis e vestíveis
✔️ Conclusão:
· 8051 → clássico e simples
· AVR / PIC → populares e versáteis (8 bits)
· MSP → eficiente e econômico (16 bits)
· ARM / ESP32 → modernos, rápidos e voltados ao futuro (32 bits + IoT)
Questão 1. Se um microcontrolador é dito de 16 bits, significa que este possui:
Resposta: Uma Unidade Lógica Aritmética capaz de processar operandos com 16 bits de cada vez.
Microcontrolador de X bits refere-se à capacidade de processamento da Unidade Lógica Aritmética (ALU) de um microcontrolador. Em termos simples, é o número de bits de dados que uma ALU pode processar por vez.
TEMA 3 - COMPILADORES E SIMULADORES
INTRODUÇÃO
💻 Mudança no cenário da computação e novas exigências
· A computação evoluiu de máquinas grandes para dispositivos pequenos, móveis e embarcados.
· Softwares embarcados exigem características específicas: determinismo, resposta em tempo real e alta confiabilidade.
· Métodos tradicionais de desenvolvimento nem sempre se aplicam bem a esse novo contexto.
🔌 Desafios do desenvolvimento embarcado e ferramentas
· O desenvolvedor precisa de conhecimentos adicionais em eletrônica e interfaces físicas (digital e analógica).
· O hardware funciona como uma “interface de programação”, exigindo interação direta e cuidadosa.
· Apesar de conceitos similares ao desenvolvimento tradicional, há mais desafios práticos devido ao baixo nível.
· Ferramentas como compiladores e simuladores são essenciais para facilitar o desenvolvimento e aprendizado.
Módulo 1. Linguagem C na programação de sistemas embarcados
DA LINGUAGEM DE MONTAGEM À LINGUAGEM C EM SISTEMAS EMBARCADOS
📌 Evolução do Software em Sistemas Embarcados
· O software passou a ter papel fundamental na funcionalidade dos sistemas embarcados.
· Tornou-se um fator importante para:
· 💡 Inovação
· 🏆 Diferenciação de produtos
· Houve aumento significativo na:
· Complexidade do software
· Pressão por ciclos de desenvolvimento mais rápidos
⚠️ Novas Exigências do Software
· Houve um crescimento da necessidade de requisitos extrafuncionais, como:
· 🔒 Segurança
· ✔️ Confiabilidade
· O software não precisa apenas funcionar, mas também ser:
· Seguro
· Estável
· Confiável
🧠 Desenvolvimento Inicial (Assembly)
· Nos primeiros sistemas embarcados:
· O software era visto como uma tarefa secundária, focada apenas em implementar funcionalidades básicas.
· Principais características:
· Programação feita quase totalmente em linguagem de montagem (assembly)
· Uso em:
· Algoritmos de monitoramento
· Algoritmos de controle
· Problemas do assembly:
· 😓 Difícil de programar
· 🕒 Alto esforço e tempo de desenvolvimento
· 📉 Baixa produtividade
🚀 Transição para Linguagens de Alto Nível (como C)
· Com o aumento da complexidade:
· Surgiu a necessidade de novas abordagens de desenvolvimento
· Solução adotada:
· Uso de linguagens mais amigáveis e produtivas, como a linguagem C
· Benefícios dessa transição:
· 🧩 Maior facilidade de desenvolvimento
· ⚡ Redução do tempo de criação
· 🔧 Melhor manutenção e organização do código
🎯 Conclusão
· A evolução do software embarcado levou à substituição do assembly por linguagens de mais alto nível.
· Essa mudança foi essencial para lidar com:
· Complexidade crescente
· Demandas por qualidade
· Necessidade de inovação rápida
PROGRAMAÇÃO DE SISTEMAS EMBARCADOS
📌 Conceito de Sistemas Embarcados
· Definição: Sistema computacional cuja função não é ser um computador de uso geral
· Sistemas embarcados são compostos por: Hardware + Software
· Exemplos:
· 📷 Câmeras digitais
· 📺 Televisores
· 🏠 Eletrodomésticos
· Não é embarcado: 💻 Notebook (pois é de uso geral)
⚙️ Características Principais de Sistemas Embarcados
· Executam uma ou poucas funções específicas
· Diferem de computadores comuns, pois são projetados para tarefas dedicadas
· Podem usar diferentes tipos de processamento:
· Microcontroladores
· Microprocessadores
· CPLD (Dispositivo Lógico Complexo Programável)
· FPGA (Arranjo de Portas Programável em Campo)
💡 Programabilidade e Firmware
· Todos os sistemas embarcados são programáveis.
· O software embarcado é chamado de: Firmware
· Funções do firmware:
· 📥 Monitorar entradas (eventos externos)
· 📤 Controlar saídas (dispositivos externos)
🔧 Interação com o Hardware
· O programa pode manipular diretamente:
· ⏱️ Temporizadores
· 🔌 Interfaces de comunicação (serial)
· ⚡ Interrupções
· 🔘 Portas de entrada e saída (I/O)
🚀 Importância da Linguagem de Programação
· A escolha da linguagem é crítica para o desempenho do sistema
· Linguagens utilizadas:
· Assembly
· C, C++
· Java
· Visual Basic
· JavaScript
· Python (ex: MicroPython)
🏆 Por que a Linguagem C Predomina?
A linguagem C é a mais utilizada por equilibrar eficiência e controle:
1. Tamanho do Código
· Ocupa menos memória
· Ideal para dispositivos com recursos limitados
2. Desempenho
· Código compilado diretamente em binário
· Vantagens:
· Execução rápida
· Maior eficiência
· Comparação:
· Linguagens como Java exigem:
· JVM (máquina virtual)
· Maior consumo de memória
3. Portabilidade
· Código pode ser reutilizado em diferentes plataformas
· Benefícios:
· Facilidade de manutenção
· Menos modificações necessárias
· A portabilidade é uma característica não está presente na linguagem de montagem (única para cada arquitetura de microcontrolador)
4. Manipulação de Bits
· Permite operações bit a bit
· Muito útil para:
· Controle de registradores
· Interação direta com hardware
🧠 Diferencial da Linguagem C
· Combina:
· 💡 Facilidade da linguagem de alto nível
· ⚙️ Controle próximo ao hardware (como assembly)
· Permite acesso direto a:
· 📍 Memória
· 🔢 Registradores
· 🔗 Ponteiros
⚠️ Comparação com Outras Linguagens
· Linguagens de alto nível escondem detalhes do hardware
· C:
· 🔓 Expõe o funcionamento interno da máquina
· Por isso é ideal para sistemas embarcados
🎯 Conclusão
· A programação é essencial para o funcionamento dos sistemas embarcados.
· A linguagem C se destaca por:
· Eficiência
· Controle direto do hardware
· Portabilidade
· É considerada a principal linguagem de alto nível para microcontroladores
BÁSICO DA LINGUAGEM C PARA MICROCONTROLADORES
📌 Fundamentos da Linguagem C para Microcontroladores
· A linguagem C embarcada usa a mesma sintaxe e semântica do C padrão
· Elementos básicos:
· Função main
· Loops (laços de repetição)
· Tipos de dados
· Funções
· Variáveis
· Instruções
⚙️ Diferenças do C Embarcado
· Inclui extensões específicas para hardware:
· 🔌 Endereçamento de entrada e saída (I/O)
· 🔢 Operações de ponto fixo
· 🧠 Acesso a registradores especiais
· Apesar disso, mantém compatibilidade com o padrão ISO da linguagem C
💬 Comentários no Código
· Servem para facilitar o entendimento do código
· Tipos:
· // → comentário de uma linha
· /* ... */ → comentário de múltiplas linhas
🔑 Palavras-chave
· São palavras reservadas da linguagem
· Não podem ser usadas como nomes de variáveis
· Em sistemas embarcados, podem existir palavras específicas do compilador
· Exemplos:
· Bit
· int1 (para dados de um bit)
· int8 (tipo inteiro de 8 bits)
· Objetivo: Economizar memória
🧾 Instruções - Statements (#include)
· Usadas para incluir arquivos externos (bibliotecas/cabeçalhos)
· Permitem:
· Organização do código
· Acesso a configurações de hardware
Exemplo:
🎯 Objetivo do código: Incluir definições do microcontrolador no programa.
#include // Inclui o arquivo de cabeçalho do microcontrolador PIC18F4550
Explicação do código:
· .H indica arquivo de cabeçalho (Header File)
⚡ Diretivas de Pré-processador (#define)
· Usadas para substituir valores no código
· Benefícios:
· Melhora a legibilidade
· Facilita a manutenção
Exemplo:
🎯 Objetivo do código: Definir uma constante simbólica para taxa de amostragem.
#define SAMPLE_RATE 100000 // Define a constante SAMPLE_RATE com valor 100000
· Vantagem:Alterar o valor em um único lugar reflete em todo o código
🚀 Função Principal (main)
· Todo programa possui: Função main()
· Características:
· Primeiro código a ser executado
· Pode ter:
· Tipo de retorno
· Parâmetros
🔢 Variáveis e Tipos de Dados
· Variáveis representam dados armazenados em memória
· Facilitam escrita e leitura do código
· Tipos básicos:
· char, int, float, double
· Modificadores:
· long, short, signed, unsigned
🎯 Objetivo do código: Declarar uma variável do tipo caractere.
char ch; // Declara uma variável chamada 'ch' do tipo char (8 bits)
🌍 Tipos de Variáveis
🔹 Globais
· Declaradas antes da função main()
· Acessíveis em todo o programa
🔹 Locais
· Declaradas dentro de funções
· Acessíveis apenas no escopo da função
🎯 Conclusão
· O C embarcado é praticamente igual ao C padrão, com algumas extensões voltadas ao hardware
· Permite:
· Controle direto do microcontrolador
· Programação eficiente e otimizada
· Elementos como:
· #include, #define, variáveis e main()
· São fundamentais para qualquer programa embarcado
OPERADORES E DECLARAÇÕES CONDICIONAIS
⚙️ Função Básica da Computação
· O processamento envolve:
· 🔄 Movimentação de dados
· 🔢 Operações matemáticas
· 🧠 Operações lógicas
· 🎯 Tomada de decisões (condições)
🔢 Operadores em C
· São utilizados para realizar cálculos e operações lógicas:
➕ Operadores Matemáticos
· = → atribuição
· + → adição
· - → subtração
· * → multiplicação
· / → divisão
🔌 Operadores Bit a Bit
· & → AND (E lógico bit a bit)
· | → OR (OU lógico bit a bit)
· 📥 Entradas: variáveis ou constantes
· 📤 Saída: resultado armazenado em variável
🔀 Estruturas Condicionais (if-else)
· Permitem executar ações com base em condições:
Exemplo:
🎯 Objetivo do código: Verificar se uma variável é negativa e ajustar seu valor.
if (count = NivelBaixo && ente controle do hardware
Módulo 2. Desenvolvimento de software para sistemas embarcados
CONCEITO DE COMPILAÇÃO
📌 Conceito de Compilação
🔹 O que é compilação
· Processo de tradução do código-fonte (linguagem de alto nível, como C) para código de máquina.
· Resultado: arquivo executável em código binário (.hex em microcontroladores).
· Realizado por um compilador.
· 👉 Em outras palavras: Programação bare metal = programar sem sistema operacional, controlando o hardware diretamente
🔹 Características da linguagem C
· Considerada:
· Linguagem de alto nível
· Também chamada por alguns de nível intermediário
· Necessita de compilação para execução na máquina.
🔹 Compilação em sistemas comuns vs. embarcados
· Sistemas tradicionais (Windows/Linux):
· Compilação ocorre no mesmo sistema onde o programa será executado.
· Ferramentas podem fazer suposições sobre hardware e sistema operacional.
· Maior automação no processo.
· Sistemas embarcados:
· Compilação ocorre em um computador diferente (host).
· Poucas suposições podem ser feitas sobre a plataforma de destino.
· Desenvolvedor precisa fornecer informações explícitas do hardware.
🔹 Programação Bare Metal
· São programas que executam diretamente no hardware, sem sistema operacional (como Windows, Linux ou Android).
· Possuem um bootloader mínimo, responsável por:
· Inicializar processador
· Configurar clock (relógio)
· Preparar memória
· Após isso, o controle passa para o programa principal.
🔹 Etapas do processo de compilação
1. Compilação/Montagem:
👉 O que acontece:
· Cada arquivo do seu código (.c, .h, .asm) é tratado separadamente
· O compilador transforma cada um em um arquivo-objeto (.o)
👉 Importante:
· Ainda não é um programa completo
· São “pedaços” do programa
👉 Cada peça = um arquivo-objeto
2. Ligação (Linkedição):
👉 O que acontece:
· Junta todos os arquivos-objeto (.o)
· Resolve conexões entre eles
· Exemplo: Se um arquivo usa uma função que está em outro, o linker conecta tudo corretamente
· Resultado: Um único arquivo chamado, programa relocável
👉 Ainda não está pronto para rodar!
3. Relocação:
👉 O que acontece:
· O programa recebe endereços reais de memória
· O sistema decide onde cada parte vai ficar na memória do microcontrolador
👉 Isso é essencial porque: O hardware precisa saber onde está cada coisa
👉 Resultado:
· Um arquivo executável (ex: .hex, .bin)
· Pronto para rodar no dispositivo
4. Resultado final:
· Geração de uma imagem binária executável pronta para rodar no sistema embarcado.
🔹 Ferramentas envolvidas
· Compilador
· Montador (assembler)
· Vinculador (linker)
· Localizador (locator)
✔ Todos eles trabalham juntas para gerar o executável correto
✔ Todas executadas no computador host (de uso geral)
❌ Não acontece no microcontrolador
✔ O microcontrolador só recebe o resultado final
🔹 Conceito de Host
· Computador host: Máquina onde ocorre o desenvolvimento e compilação.
· Diferente do sistema embarcado de destino, onde o programa será executado.
🔹 Ponto-chave geral
· Mesmo sendo executadas fora do dispositivo final, as ferramentas geram um código que funciona exclusivamente no hardware de destino.
📌 Compilador e Montador
1. Função do Compilador:
· Traduz o código-fonte (C, por exemplo) → código de máquina (opcodes)
· Saída: Arquivo-objeto
· Cada processador:
· ❗ Possui sua própria linguagem de máquina
· 👉 Exige compilador específico
2. Montador (Assembler)
· Traduz: Assembly → código de máquina
· Característica: tradução simples (1:1)
· Compilador + montador: Formam a primeira etapa da compilação
🔁 Cross-Compiler (Compilador Cruzado)
👉 Cross-Compiler é um compilador que:
· 💻 Roda no seu computador (host)
· 🔌 Mas gera código para outro dispositivo (microcontrolador)
· Importância: Fundamental em sistemas embarcados
💡 Vantagem:
· Ele pode:
· 🔄 funcionar em vários sistemas (Windows, Linux)
· 🎯 gerar código para diferentes microcontroladores, como por exemplo:
· 8 bits (8051)
· 16 bits (MSP430)
· 32 bits (ARM)
📌 Resumindo: 👉 Cross-Compiler é um compilador que cria programas para um hardware diferente daquele em que ele está sendo executado.
📦 Arquivo-Objeto
· Contém: Código + dados (parcialmente prontos)
· ❗ Não é executável diretamente
· Formatos comuns:
· COFF
· ELF
⚠️ Atenção: Se usar múltiplos compiladores, devem gerar mesmo formato de arquivo-objeto
🔗 Vinculador (Linker)
Função:
· Junta todos os arquivos-objeto
· Resolve: referências (variáveis e funções)
O que ele faz:
· Une:
· Código (seção texto)
· Dados (variáveis)
· Substitui: Referências incompletas por reais
· Exemplo:
· Arquivo A usa uma variável
· Arquivo B declara essa variável
👉 O linker conecta os dois
Possíveis erros:
· ❌ Símbolo duplicado → erro
· ❌ Símbolo não encontrado → busca em bibliotecas (ex: strlen)
Saída do Linker:
· Gera: Programa relocável
· Característica:
· ✔️ Completo logicamente
· ❌ Sem endereços de memória definidos
📍 Localizador (Locator)
Função: Converte: Programa relocável → executável final
O que faz:
· Define: Endereços físicos de memória
· Usa: Informações da memória do hardware
Resultado: Arquivo binário final pronto para rodar no microcontrolador
🔄 Fluxo Geral
🎯 Conclusão
· O processo envolve 3 etapas principais: Compilar → Vincular → Localizar
· Cada ferramenta tem um papel:
· 🧠 Compilador: traduz
· 🔗 Linker: conecta
· 📍 Locator: posiciona na memória
· Essencial para: Gerar código executável em sistemas embarcados
AMBIENTES DE DESENVOLVIMENTO
📌 O que é um Ambientes de Desenvolvimento (IDE)?
· IDE (Integrated Development Environment):
· 🧰 Software que reúne ferramentas para programar
· Principais recursos:
· ✍️ Editor de código
· ⚙️ Automação de tarefas
· 🐞 Depurador (debug)
⚙️ Funcionalidades de um IDE
· Facilita o desenvolvimento ao reunir tudo em um só lugar:
· 🔄 Compilador e montador (podem ter vários)
· ✨ Autocompletar código
· 🐞 Depuração
· 📊 Análise de código (cobertura)
· 🔗 Controle de versão
· 📚 Ajuda e documentação
· 🎨 Ferramentas gráficas
🧠 Vantagens de uma IDE
· ✔️ Mais produtividade
· ✔️ Código mais organizado
· ✔️ Desenvolvimento mais rápido
🔌 Integração com Ferramentas
· Uma IDE moderna pode incluir ferramentas d:
· Depuração
· Cobertura de código
· Gerenciamento de versão
· Ferramentas automatizadas de ajuda e documentação
· Editores de recursos gráficos e outras.
MPLAB X IDE
· Exemplo de IDE para microcontroladores: MPLAB X IDE
· É um ambiente de desenvolvimento da Microchip Technology para programar microcontroladores PIC.
· Características principais:
· Suporta:
· Microcontroladores de 8, 16 e 32 bits
· Controladores de sinal digital (dsPIC)
· Memórias da Microchip
· Possui ferramentas integradas:
· ✍️ Editor de código
· 📁 Gerenciador de projetos
· 🧪 Simulador
· 🐞 Depuração (debug)
· Compatível com: Windows, Mac e Linux
· Recursos Extras:
· Suporte a:
· Depuradores em circuito
· Programadores de chip
· Baseado na plataforma NetBeans
· Linguagens e Compiladores:
· Permite programar em:
· Assembly (via montador)
· C (mais utilizado)
· Compiladores C compatíveis:
· MikroC
· MPLAB XC8
· C-Tech C
· CCS C
🏆 Destaque: CCS C
· Desenvolvido pela Custom Computer Services (CCS)
· Vantagens:
· 📚 Bibliotecas prontas
· 👶 Ideal para iniciantes
· ⚡ Facilita programação sem conhecer profundamente o hardware
🎯 Resumo: O MPLAB X é um IDE completo que reúne todas as ferramentas para desenvolver, testar e programar microcontroladores PIC, com suporte a várias linguagens e compiladores.
🎯 Conclusão
· IDE é essencial para desenvolvimento moderno
· Integra todas as ferramentas necessárias
· MPLAB X é um dos principais IDEs para microcontroladores PIC
· Uso de compiladores C acelera e simplifica o desenvolvimento
TESTES COM DEPURADORES
🐞 O que é Depuração?
· Processo de encontrar e corrigir erros (bugs)
· Permite:
· Ver execução do programa (nível de máquina)
· Acompanhar variáveis
· Testar comportamento do código
⚙️ O que o DepuradorFaz?
· Mostra a relação entre código-fonte e execução
· Permite:
· 📊 Ver valores de variáveis
· ✏️ Alterar valores durante execução
· 🔄 Executar passo a passo (testar rotinas)
⚠️ Limitações (Antigamente)
· Ferramentas de depuração:
· ❌ Raras ou inexistentes
· Método utilizado:
· Gravar programa em EPROM
· Testar diretamente no hardware
🚀 Situação Atual
· Com evolução dos microcontroladores:
· 💾 Memória Flash (regravável)
· 💰 Kits de desenvolvimento baratos
· Resultado: ✔️ Depuração direta na placa é comum
🔧 Métodos Alternativos de Depuração
· Quando não há depurador:
🔌 Uso de hardware externo
· Analisadores lógicos
💡 Uso de saídas do microcontrolador
· LEDs indicam:
· Estado do programa
· Ordem de execução
· Permite visualizar fluxo do sistema
🖥️ Simuladores
· Simulam o funcionamento do hardware
· Permitem testar código sem placa física
· Vantagens:
· ⏱️ Reduz tempo de desenvolvimento
· 💲 Diminui custos
🎯 Conclusão
· Depuração é essencial para corrigir erros
· Pode ser feita de várias formas:
· Depuradores
· Hardware (LEDs, analisadores)
· Simuladores
· Evolução tecnológica tornou o processo:
· Mais fácil
· Mais acessível
Módulo 3. Simulador da plataforma Arduino e circuitos eletrônicos da ferramenta Tinkercad
SIMULADOR DE CIRCUITOS TINKERCAD
🎯 Importância na Aprendizagem
· Aprender programação exige: Combinar teoria + prática
· Objetivo: Maximizar aprendizado com menos tempo
· Simulação ajuda a:
· 🧠 Fixar melhor o conhecimento
· 🔄 Testar ideias rapidamente
🧪 O que são Simuladores?
· Ferramentas que simulam projetos eletrônicos
· Permitem:
· Testar cenários reais sem hardware físico
· Experimentar erros e acertos com segurança
💡 Vantagens do Uso
· Aprendizado mais eficaz
· Incentiva experimentação
· Permite aplicar teoria na prática
· Cria ambiente seguro para errar
🖥️ Tinkercad
· Plataforma: Gratuita e online
· Características:
· Fácil de usar (intuitiva)
· Usada para:
· Modelagem 3D (CAD)
· Simulação de circuitos
🔌 Simulação de Circuitos no Tinkercad
· Permite:
· Montar circuitos virtuais
· Testar componentes como:
· 💡 LEDs
· 🔘 Botões
· 🔧 Resistores
· 📡 Sensores
· ⚙️ Motores
· Inclui: Arduino Uno
⚡ Prototipagem Rápida
· Conceito: Criar e testar rapidamente projetos
· Vantagens:
· 🔄 Fácil modificação
· 🧪 Teste de várias ideias
· 🚀 Desenvolvimento mais ágil
🧭 Como acessar o Tinkercad
1. Criar conta no site (gratuita)
2. Clique na opção de menu de circuitos
3. Clique em Criar para construir novo circuito
4. Comece a criar seu projeto na área central
5. Na barra de ferramentas você pode girar, excluir e fazer anotações
🔗 Recursos Extras
· Permite:
· 📤 Exportar e compartilhar projetos
· 📥 Baixar lista de componentes
· Facilita: Levar o projeto virtual para o mundo real
🎯 Conclusão
· O Tinkercad é uma ferramenta essencial para iniciantes
· Une: Simulação + aprendizado prático
· Ajuda a aprender mais rápido e testar projetos sem custo
PLATAFORMA ARDUINO
🧠 Origem e Objetivo
· Criada em 2005 por pesquisadores italianos
· Objetivo:
· 💰 Ser barata e acessível
· 👶 Fácil para iniciantes
· Baseada em: Hardware livre (pode ser modificada e personalizada)
⚙️ Popularidade:
· Cresceu por:
· 📚 Grande quantidade de exemplos e bibliotecas
· 👨💻 Comunidade ativa
· Microchip (PIC)
· Texas Instruments (MSP430)
🔌 Arduino Uno R3
· É o modelo mais popular
· Baseado no microcontrolador ATmega328
· Principais características:
· 🔢 14 pinos digitais (entrada/saída)
· 🔍 6 entradas analógicas
· ⏱️ Clock de 16 MHz
· 🔌 USB para programação e energia
· 🔄 Botão de reset
Tipos de Pinos:
· GND → usados para aterrar o circuito
· 5V / 3.3V → alimentação
· Analógicos (A0–A5) → pinos de entrada analógica
· Digitais (0–13) → pinos de entrada/saída digital
· PWM (~) → usado para controlar a potência de forma variável usando sinais digitais, ou seja, permite ajustar intensidade (luz, velocidade, etc.) usando sinais digitais.
· Exemplo: Controlar brilho de LED; Controlar velocidade de motor
· AREF → referência analógica
· Serve para:
· 📏 Definir o valor máximo de referência das leituras analógicas
· 👉 Ele diz ao Arduino qual é o “limite máximo” de tensão para medir sensores.
· Exemplo:
· Sem AREF: mede de 0 a 5V
· Com AREF = 3.3V, logo mede de 0 a 3.3V (mais preciso nesse intervalo)
· Resumindo: 👉 AREF ajusta a escala de medição das entradas analógicas.
Outros Componentes:
· 🔴 Botão reset → reinicia o programa
· 💡 LED ON → indica que esta conectado a uma fonte de energia
· 🔄 LEDs TX/RX → comunicação serial
· 💡 LED “L” → ligado ao pino 13 (teste)
· ⚙️ Regulador de tensão → controla a quantidade de tensão que é colocada na placa do Arduino, para proteger a placa
💻 Programação no Arduino
· Feita na IDE Arduino usando linguagem baseada em C
· A programação é feita no programa Sketch
Estrutura básica:
· setup():
· Executa apenas uma vez após ser ligada
· Inicializa configurações
· loop():
· Executa o mesmo bloco de código em loop infinito
· Controla o funcionamento contínuo
💡 Exemplo de Código
🎯 Objetivo do código: Fazer o LED do pino 13 piscar a cada 1 segundo.
void setup()
{
pinMode(13, OUTPUT); // Define o pino 13 como saída (para controlar o LED)
}
void loop()
{
digitalWrite(13, HIGH); // Liga o LED (coloca nível alto - 5V)
delay(1000); // Espera 1 segundo (1000 ms)
digitalWrite(13, LOW); // Desliga o LED (nível baixo - 0V)
delay(1000); // Espera 1 segundo
}
🎯 Conclusão
· Arduino é:
· 🧠 Fácil de usar
· 💰 Acessível
· 🔧 Ideal para iniciantes e projetos rápidos
· Destaque:
· Uso de bibliotecas prontas
· Estrutura simples (setup + loop)
· Muito usado em:
· 🤖 Automação
· 📡 Sensores
· 🔌 Projetos eletrônicos
MONTAGEM DE CIRCUITOS NO TINKERCAD
🧩 Protoboard (Placa de Ensaio)
· Usada para montar circuitos sem solda
· Tem uma grade de furos (linhas 1–30 e colunas A–J)
· Furos da mesma linha estão conectados entre si
· Meio da placa é dividido (A–E separado de F–J)
· As laterais do protoboard contém colunas com símbolo:
· ➕ Positivo (Vcc)
· ➖ Negativo (GND)
· Servem para levar energia aos componentes
🧭 Uso no Tinkercad
· Ao acessar a ferramenta Tinkercad, encontre o componente da placa de ensaio e clique nele uma vez.
· A protoboard será selecionada e temporariamente anexada ao ponteiro do mouse.
· Passos básicos:
1. Inserir a protoboard
2. Posicionar na área de trabalho
3. Ajustar zoom
· Visual:
. 🟥 Furo selecionado
. 🟢 Furos conectados
🔌 Testando o Tinkercard
Componentes Básicos:
· LEDs
· Botões de pressão (pushbutton)
· Potenciômetros
💡 LED:
· Diodo emissor de luz (diferente de uma lâmpada)
· Um LED tem uma conexão chamada:
· ➕ Ânodo: possui perna maior → positivo
· ➖ Cátodo: possui perna menor → GND
· Esta distinção é importante porque o anodo deve ser conectado à extremidade positiva de um circuito elétrico
· ⚠️ Atenção: A corrente flui em um único sentido através do LED
🔘 Pushbutton (Botão)
· Função: Conexão temporária
· 🔘 Liga o circuito só quando pressionado
· Pinos laterais conectados internamente
🎚️ Potenciômetro
· Função: Variar tensão/resistência
· Possui: 3 conectores
· Usado como controles de volume em equipamentos de áudio e geralmente não lidam com muita tensão.
· Possui um material interno que varia a resistência conforme o botão é girado, controlando a corrente no circuito.
🤖 Montagem com Arduino Uno
· Inserção da placa: Adicione o Arduino Uno na área de trabalho
· Pinos de Entrada/Saída (I/O)
· Localizados nas laterais da placa
· Funcionam como pontos de conexão com:
· Protoboard
· Componentes (LED, sensores, etc.)
· 🔢 Identificação dos pinos
· Cada pino possui um número
· Esses números são usados no código
· 💡 Exemplo prático
· LED pode ser conectado ao pino 13
· Esse pino é controlado via programação
Montagem LED + Resistor no Arduino Uno:
1. Adicionar componentes: Arraste um LED e um resistor para o projeto
2. Conectar o LED
· ➕ Perna maior