O I2C é um barramento utilizado para interligar circuitos integrados de forma simples e fácil. Esse barramento está presente em um grande número de equipamentos eletrônicos como televisores, celulares, equipamentos industriais e também está presente no cartão microbit. Nesta seção estudaremos este barramento e como programá-lo para utilizá-lo em projetos.
A sigla I2C vem da frase: Inter Integrated Circuits, que é um barramento usado para conectar circuitos integrados. Desta forma podemos conectar memórias, microcontroladores, periféricos de entrada e saída, relógios de tempo real (RTC), displays, conversores analógico para digital, etc, a um único barramento. O barramento I2C é composto por uma linha de clock, chamada SCL, e uma linha de dados, chamada SDA, conforme mostra a figura a seguir:
O barramento I2C também é conhecido pela sigla IIC para: “Inter Integrated Circuit” ou pela sigla TWI para: “Two Wire Interface”. É necessário entender alguns conceitos básicos para poder utilizar o barramento I2C, como:
- Mestre
- Escravo.
- Iniciar.
- Parar.
- Endereço
- Bit de reconhecimento.
No barramento I2C, o circuito que controla os pulsos de clock, ou seja, a linha SCL, é denominado: mestre e os demais circuitos são denominados: escravos. Além disso, é possível interligar outros microcontroladores, pois o barramento I2C é um barramento multimestre, ou seja, pode ser controlado por vários mestres, graças ao seu sistema de arbitragem, que garante que, caso mais de um microcontrolador tente simultaneamente controlar o barramento, apenas um microcontrolador consegue e o outro espera até que o barramento seja liberado para fazer as transferências de dados.
As linhas SDA e SCL são conectadas a uma fonte de tensão positiva através de resistores pull-up conforme mostrado na imagem a seguir:
Quando o barramento está livre, as linhas SDA e SCL são ALTAS. Todas as transferências de dados começam com uma condição “start” (START) e terminam com uma condição “stop” (STOP), conforme mostrado na imagem a seguir:
Uma transição de alto para baixo da linha SDA, enquanto a linha SCL permanece alta, é definida como uma condição de "inicialização". Uma transição de baixo para alto, enquanto a linha SCL permanece alta, é definida como uma condição de “parada”.
Todas as condições de partida e parada são geradas pelo mestre. O barramento I2C é considerado ocupado, após uma condição de partida. O barramento I2C é considerado livre, após uma condição de parada.
As transferências de dados são de 8 bits, e o circuito integrado que recebe a informação deve responder com um bit de confirmação (A) conforme mostrado na figura a seguir:
Para iniciar uma transferência de escrita, o mestre inicia o barramento com uma condição de partida (S). Em seguida, ele envia um byte com o endereço do circuito integrado escravo com o qual deseja se comunicar. O endereço é de 7 bits, o outro bit é utilizado para indicar se a operação é de escrita ou leitura (R/W). Como esta operação é uma operação de escrita, este bit será colocado em nível baixo (Lógico 0), conforme mostrado na imagem a seguir:
O IC escravo então retorna um bit de confirmação (A), e assim o mestre começa a enviar dados, terminando com uma condição de parada.
O seguinte é uma transferência de leitura. Nesse caso, o bit R/W é definido como alto, indicando que é uma transferência de leitura. Isso pode ser visto na imagem a seguir:
A maioria das famílias de microcontroladores possui um barramento I2C para comunicação com outros circuitos integrados.
BLOCOS PARA CONTROLAR O BUS I2C NA PLACA MICROBIT.
Existem basicamente dois blocos para controlar o barramento I2C. Um é usado para gravar dados nos periféricos e o outro é usado para ler dados dos periféricos, conforme mostrado na imagem a seguir:
Para encontrar os blocos de barramento I2C, acesse o menu: “Avançado” e selecione o menu: “Pinos … mais”, conforme imagem a seguir:
Quando utilizamos os blocos I2C, utilizamos um parâmetro chamado: “of format”. Este é o tipo de formato de dados que você deseja gravar ou ler no barramento I2C. As mais utilizadas são as de um byte (8 bits), que podem ser assinadas ou não. Embora os dados de 2 e 4 bytes também possam ser usados conforme mostrado na imagem a seguir:
As letras finais de cada formato (LE e BE) vêm da forma como os bytes são armazenados na memória. “LE” significa “little endian” e significa que o byte mais baixo de um número é armazenado na memória primeiro. “BE” significa: “big endian” e significa que o byte mais alto é armazenado na memória primeiro. Para dados em formato de 8 bits, o acima é irrelevante, pois isso se aplica apenas a dados com 2 bytes (16 bits) e 4 bytes (32 bits).
Os blocos vistos acima para controlar o barramento I2C normalmente são pouco utilizados, pois a maioria dos módulos e adaptadores que utilizam o barramento I2C possuem suas próprias "bibliotecas" que já vêm com todas as funcionalidades prontas, evitando que o programador perca tempo programando com essas blocos. Mais adiante neste texto, vamos usar um adaptador I2C para controlar um display de cristal líquido (LCD) e é aí que o acima é colocado em prática.
PINOS DE BARRAMENTO I2C NA PLACA MICRO:BIT.
A placa micro:bit possui 25 conectores na borda, como mostra a imagem a seguir:
Como podemos ver existem 5 pinos grandes chamados: P0, P1, P2, 3V e GND. Além disso, existem 20 pinos pequenos. Observe que para o barramento I2C usamos os pinos pequenos P19 e P20 conforme mostrado na imagem a seguir:
Para facilitar a conexão desses pinos a componentes externos, podemos utilizar placas de expansão como as mostradas na imagem a seguir:
ADAPTADOR I2C PARA DISPLAY LCD.
Para usar o barramento I2C, vamos conectar um display de cristal líquido (LCD) a placa microbit. O adaptador I2C para LCD permite conectar um display de cristal líquido usando os pinos SDA e SCL do barramento I2C. O endereço I2C do adaptador é, por padrão, 0x3F (63 em decimal) ou 0x27 (39 em decimal). A figura a seguir mostra um modelo deste adaptador.
É possível controlar telas LCD de 16x2 ou 16x4 caracteres. É necessário soldar o módulo adaptador ao LCD como mostra a figura a seguir:
O potenciômetro no módulo é usado para controlar o contraste dos dígitos no display LCD. Gire este potenciômetro até atingir o contraste desejado. O jumper presente no adaptador é usado para controlar a retroiluminação LED do LCD. Para ligar a luz de fundo é necessário que o jumper seja colocado entre os pinos de LED do adaptador. Se você não quiser a luz de fundo, remova o jumper. Além disso, é possível controlar a luz de fundo por software.
A imagem a seguir mostra como conectar o adaptador I2C ao módulo de expansão do placa microbit:
Observe que a maioria dos módulos expansores microbit são alimentados por uma fonte externa de 6 a 12 volts. Para alimentar o Adaptador I2C para LCD, é necessário utilizar uma tensão regulada de 5 VCC que normalmente está presente no módulo expansor.
BLOCOS DE PROGRAMAÇÃO DO ADAPTADOR I2C PARA LCD.
Para utilizar os blocos que nos permitirão controlar o LCD, selecione o menu: “Extensões”, como mostra a imagem a seguir.
Uma página como a mostrada na figura a seguir será exibida:
Na caixa de texto, digite: “i2c lcd” e aparecerá uma página semelhante à mostrada na imagem a seguir:
Selecione o módulo: “i2cLCD1602”. Agora é possível visualizar o menu: “I2C_LCD1602”, conforme imagem a seguir:
Este menu contém blocos para controlar o display LCD, que podemos ver na imagem a seguir:
A seguir, explicaremos os blocos usados para controlar o I2C_LCD.
O próximo bloco:
Inicializa o LCD e atribui a ele um endereço no barramento I2C.
O bloco: “show string”, mostra uma string de texto na posição “x,y” do LCD. Este bloco é mostrado na imagem a seguir:
O bloco: “show number”, mostra um número na posição “x,y” do LCD. Este bloco é mostrado na imagem a seguir:
O bloco: “clear LCD”, limpa todo o conteúdo da tela. Este bloco é mostrado na imagem a seguir:
O bloco: “ligar o LCD”:
liga a tela de cristal líquido.
O bloco: “desligar LCD”:
desliga o display de cristal líquido.
O bloco: “ligar a luz de fundo”:
acende a luz de fundo do LCD.
O bloco: “desligar a luz de fundo”:
desliga a luz de fundo do LCD.
O bloco: “shift Left”:
desloca o conteúdo do LCD para a esquerda.
O bloco: “shift Right”:
desloca o conteúdo do LCD para a direita.
O seguinte é um exemplo, mostrando o uso dos blocos vistos acima:
O programa começa atribuindo um endereço I2C ao LCD. Em seguida, desligue a luz de fundo da tela. Depois, atrasa o programa por 2 segundos. Em seguida, acende a luz de fundo da tela e, por fim, mostra a palavra: “Hello” na primeira posição do LCD, como mostra a imagem a seguir:
LEITURA DA TEMPERATURA DO CARTÃO MICROBIT.
O cartão microbit possui um sensor de temperatura integrado, que pode ser usado para indicar a temperatura ambiente. O programa a seguir lê a temperatura e a exibe no display LCD:
A imagem a seguir mostra os caracteres no LCD:
O bloco utilizado para leitura da temperatura pode ser encontrado no menu: “Entrada”, conforme imagem a seguir:
Na próxima seção deste texto usaremos a entrada: “nível de luz”, que se encontra no mesmo menu.
LEITURA DO NÍVEL DE LUZ COM A PLACA MICROBIT.
A placa micro:bit pode ler o nível de brilho do ambiente. Os LEDs da matriz de display 5x5, além de funcionarem como saída, também podem funcionar como sensor de luz, medindo a quantidade de luz que incide sobre eles. Com esta funcionalidade, projetos interessantes podem ser feitos. O programa a seguir lê o nível de luz e o exibe no visor LCD:
A imagem a seguir mostra os caracteres no LCD:
Como visto é muito fácil programar o LCD conectado ao barramento I2C. Há uma grande variedade de circuitos e módulos que podem ser conectados ao barramento I2C, mas todos seguem os mesmos princípios vistos neste texto.