Dispositivo I2C Slave para Portas Analógicas

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.


Esquema Elétrico

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.

Observações sobre o esquema elétrico:


O Raspberry Pi 5 Como Dispositivo Master

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.


Habilitação do bus I2C no sistema

  1. Abrir um terminal Linux e digitar o seguinte comando: sudo raspi-config
  2. Selecionar a opção "Interfacing Options"
  3. Selecionar a opção "I2C"
  4. Habilitar I2C selecionando "Yes" e pressionando Enter
  5. Sair do programa raspi-config selecionando "Finish"
  6. Reiniciar o sistema com o comando: sudo reboot

Instalação da biblioteca I2C no Python e as ferramentas necessárias

  1. Instalar as ferramentos para o I2C com o comando: sudo apt-get install -y i2c-tools python3-smbus
  2. Verificar se os módulos I2C já estão carregados no Kernel usando o comando: lsmod | grep i2c_
  3. Se a saída do comando mostrar os módulos i2c_bcm2835 ou i2c_bcm2708 e i2c_dev, então pode ir para o último passo...
  4. ...senão, deve-se adicionar esses módulos no Kernel com o seguinte procedimento:

Teste do bus I2C

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.

Programa Python3 para Raspberry Pi 5

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.

Notas:

  1. O buffer do I2C e' limitado a 32 bytes pela biblioteca smbus.
  2. Para efeito de teste, o sensor LM35 pode ser substituido por um potenciometro de 5K a 10K.
  3. Apesar do Raspberry ser alimentado com 3,3V e o PIC com 5V, os pinos SDA e SCL do Raspberry podem ser conectados diretamente aos pinos SDA e SCL do microcontrolador PIC.

O PIC Como Dispositivo Slave

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.

Detalhes do Firmware

Conclusão

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