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