H P S P I N E l e t r ô n i c a D i g i t a l e P r o g r a m a ç ã o d e M i c r o c o n t r o l a d o r e s P I C |
HOME PROJETOS PROGRAMAÇÃO |
Para aqueles que estão se aventurando no Raspberry Pi e tentando controlar dispositivos externos usando os pinos GPIO, devem saber que essa placa não possui portas analógicas para aquisição de dados, obrigando o desenvolvedor buscar soluções externas como os circuitos conversores analógico digitais. A experiência com o microcontrolador PIC, na montagem de alguns termômetros usando o sensor LM35, tornou possível adaptar um desses projetos para fornecer portas analógicas ao Raspberry Pi.
Sabemos que existem no mercado vários CIs para esse fim, como o MCP3008 mas, neste projeto, resolvemos usar o que havia disponível na bancada no momento, que era um PIC18F4520 que possui uma grande quantidade de portas analógicas à disposição e, além do mais, tanto o PIC18F4520 quanto o Raspberry Pi possuem portas I2C que resolvem o problema de comunicação entre ambos.
O PIC18F4520 será programado em linguagem assembly e a comunicação I2C será realizada através o módulo MSSP usando interrupções.
No modo I2C, o módulo MSSP do PIC18F4520 é capaz de realizar todas as funções de comunicação I2C necessárias, tanto no modo Master quanto no modo Slave, tornando possível ao microcontrolador aceitar interrupções ao detetar um Start bit ou um Stop bit além de suportar endereçamento de dispositivos I2C de 7 bits e 10 bits. Para mais informações, consulte o data sheet do PIC18F4520.
O programa que rodará no Raspberry Pi, para ler as informações nas portas analógicas, será programado na l inguagem Python3 quee usará bibliotecas especiais para se comunicar com o PIC18F4520 através do bus I2C.
Monte o esquema elétrico da figura abaixo, confira mil vezes as conexões para não ter surpresas desagradáveis e ligue o circuito.
Não será comentado aqui como instalar o sistema operacional Raspberry Pi OS, nem fazer o setup e nem mesmo como acessá-lo através de um monitor local ou pelo SSH pois assumiremos que o leitor já tenha certa experiência com isso.
Aqui não foram representadas as conexões do Raspberry Pi com seus periféricos como a fonte de alimentação (3,3V), o monitor local HDMI, adaptador WiFi, etc pois cada usuário tem seu próprio ambiente de trabalho. Somente as conexões dos pinos GND, SDA e SCL com o microcontrolador PIC18F4520 foram representadas.
Inicialmente, o projeto foi concebido para ser um termômetro usando um sensor LM35 mas, para facilitar, substituimos esse sensor pelo potenciômetro de 5K porque ele poderá simular o LM35 durante a fase de testes e é encontrado mais facilmente em qualquer caixinha de componentes usados por aí. Quando você tiver um LM35 em mãos, é só substituir o potenciômetro observando as posições corretas dos pinos do sensor.
O LED L1 no pino 20 do PIC18F4520 é um indicador de que o programa está rodando e começará a piscar assim que o circuito for ligado, permanecendo assim para sempre.
O LED L2 no pino 21 do PIC18F4520 piscará sempre que houver uma interrupção do módulo MSSP, isto é, sempre que o programa Python, que roda no Raspberry Pi, fizer uma requisição no bus I2C para ler as portas analógicas.
Os pinos 28, 29 e 30 são aterrados para produzirem o endereço I2C 0x40 do PIC18F4520.
O bus I2C é constituido dos pinos 18 (SCL) e 23 (SDA) do PIC18F4520 que estão conectados aos pinos SCL e SDA correspondentes doRaspberry Pi.
Após ligar o circuito nada vai acontecer porque ainda não temos o módulo I2C ativo e nem as bibliotecas e ferramentas necessárias instaladas no Raspberry Pi.
Para configurar adequadamente o sistema, siga os procedimentos abaixo.
Para verificar se o PIC18F4520 conectado ao bus I2C está respondendo, vamos usar o comando:
sudo i2cdetect -y 1
Se o circuito foi montado corretamente, a resposta deverá ser algo como:
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- |
Onde 0x40 é o endereço I2C do circuito montado com o PIC18F4520 que está conectado ao bus.
Este programa lê, em intervalos de 1 segundo, as portas analógicas do microcontrolador PIC (I2C Slave) no endereço 0x40.
Supondo que na porta analógica AN2 haja um sensor de temperatura LM35, que neste projeto substituimos por um potenciômetro, este programa obtem, no deslocamento 5 do buffer de leitura, os dois byte referentes a esse sensor e mostra, na tela do terminal Linux, o valor correspondente da temperatura.
O programa usa a biblioteca "smbus" para operar o bus I2C sendo que essa biblioteca limita a o tamanho do buffer a 32 bytes.
O PIC18F4520 possui 12 portas analóginas (AN0 a AN11) porém, para simplificar o projeto, vamos dar acesso apenas às portas AN0, AN1, AN2 e AN3 do microcontrolador, que já é um númro suficiente para quem não possui nenhuma.
Neste projeto, o PIC18F4520 vai operar como dispositivo I2C, usando o módulo nativo MSSP configurado no modo I2C Slave. O dispositivo Master escolhido para testar o projeto foi um Raspberry Pi que não possui portas analógicas e usará um programa em linguagem Python para fazer a leitura das mesmas.
O firmware usado no PIC18F4520, no qual a comunicação será feita pelo módulo MSSP e que faz parte do documento "AN734 - 2008 Microchip Technology Inc." da Microchip, foi adaptado para o chip PIC18F4520 e teve seus comentários traduzidos para o português a fim de facilitar sua compreensão.
O projeto do firmware, escrito em linguagem assembly, pode ser obtido aqui no formato ZIP ou no formato TAR.GZ.
Se o circuito for montado como o original apresentado aqui, o arquivo executável "i2c_analog.hex" pode ser gravado diretamente no microcontrolador sem que seja necessário compilá-lo.
O clock (Fosc) do PIC deverá ser de 4MHZ.
O endereço I2C do PIC foi estabelecido em 0x40 mas pode ser configurado
nos pinos RD5, RD6 e RD7.
A parte mais alta (MSB) do endereço será sempre 0x40, sendo que a parte
mais baixa (LSB), fornecidas pelos pinos RD5, RD6 e RD7, poderá variar de
0 até 7, permitindo variar o endereço entre 0x40 até 0x47 caso seja
necessário diferenciar o endereço de outro dispositivo presente no bus I2C.
O dispositivo I2C será operado pela interrupção do módulo MSSP.
Este projeto apresentou um circuito simples utilizando dois módulos periféricos do PIC18F4520 que são o ADC Conversor Analógico Digital e o MSSP para comunicação I2C, além de usar interrupções para atender requisições desse último. Do jeito em que se encontra, o projeto pode atender algumas necessidades básicas imetiadas porém, pode ser expandido e aperfeiçoado para atender outras necessidades mais compexas. Isso fica por sua conta...
Índice dos circuitos |
H P S P I N Desde 04 de Março de 2010 Atualização: 08 de Dec de 2024 |