- Visão geral do STM32F103C8 I2C
- Pinos I2C em STM32F103C8
- Pinos I2C no Arduino
- Componentes necessários
- Diagrama de circuito e conexões
- Programação I2C em STM32
- Explicação de programação mestre STM32
- Explicação de programação do Slave Arduino
Em nossos tutoriais anteriores, aprendemos sobre a comunicação SPI e I2C entre duas placas Arduino. Neste tutorial, substituiremos uma placa Arduino pela placa Blue Pill que é STM32F103C8 e nos comunicaremos com a placa Arduino usando o barramento I2C.
STM32 tem mais recursos do que a placa Arduino. Portanto, seria ótimo aprender sobre a comunicação entre o STM32 e o Arduino usando o barramento SPI e I2C. Neste tutorial, usaremos o barramento I2C para comunicação entre o Arduino e o STM32F103C8 e aprenderemos sobre o barramento SPI no próximo tutorial. Para saber mais sobre a placa STM32, verifique outros projetos STM32.
Visão geral do STM32F103C8 I2C
Comparando I2C (Inter Integrated Circuits) na placa STM32F103C8 Blue Pill com Arduino Uno, veremos que o Arduino tem o microcontrolador ATMEGA328 e o STM32F103C8 tem o ARM Cortex-M3. O STM32 tem dois barramentos I2C, enquanto o Arduino Uno tem apenas um barramento I2C e o STM32 é mais rápido que o Arduino.
Para saber mais sobre a comunicação I2C, consulte nossos artigos anteriores
- Como usar I2C no Arduino: comunicação entre duas placas Arduino
- Comunicação I2C com Microcontrolador PIC PIC16F877
- Interface LCD 16X2 com ESP32 usando I2C
- Comunicação I2C com MSP430 Launchpad
- Interface de LCD com NodeMCU sem usar I2C
- Como lidar com comunicações múltiplas (I2C SPI UART) em um único programa do Arduino
Pinos I2C em STM32F103C8
SDA: PB7 ou PB9, PB11.
SCL: PB6 ou PB8, PB10.
Pinos I2C no Arduino
SDA: pino A4
SCL: pino A5
Componentes necessários
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- Botão de pressão (2-Nos)
- Resistores (4-Nos)
- Tábua de pão
- Fios de conexão
Diagrama de circuito e conexões
A tabela a seguir mostra a conexão entre o STM32 Blue Pill e o Arduino Uno para usar o barramento I2C. Requer apenas dois fios.
STM32F103C8 |
Arduino |
Descrição do pino |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Terra |
Importante
- Não se esqueça de conectar o Arduino GND e o STM32F103C8 GND juntos.
- Em seguida, conecte um resistor pull down de 10k aos pinos dos botões de ambas as placas separadamente.
Neste tutorial STM32 I2C iremos configurar o STM32F103C8 como Master e o Arduino como Slave. Ambas as placas são conectadas com um LED e um botão de pressão separadamente.
Para demonstrar a comunicação I2C no STM32, controlamos o LED STM32 mestre usando o valor do botão de ação do Arduino escravo e controlamos o LED do Arduino escravo usando o valor do botão de ação STM32F103C8 mestre. Esses valores são enviados via barramento de comunicação I2C.
Programação I2C em STM32
A programação é semelhante ao código do Arduino. O mesmo
Este tutorial tem dois programas, um para o STM32 mestre e outro para o Arduino escravo. Programas completos para ambos os lados são fornecidos no final deste projeto com um vídeo de demonstração.
Explicação de programação mestre STM32
No Master STM32, vamos ver o que está acontecendo:
1. Em primeiro lugar, precisamos incluir a biblioteca Wire e a biblioteca softwire para usar as funções de comunicação I2C em STM32F103C8.
#incluir
2. Na configuração vazia ()
- Iniciamos a comunicação serial na taxa Baud 9600.
Serial.begin (9600);
- Em seguida, iniciamos a comunicação I2C no pino (B6, B7)
Wire.begin ();
3. Em loop vazio ()
- Primeiro, obtemos os dados do Slave Arduino, então usamos requestFrom () com o endereço do escravo 8 e solicitamos um byte.
Wire.requestFrom (8,1);
O valor recebido é lido usando Wire.read ()
byte a = Wire.read ();
- Dependendo do valor recebido do escravo, o LED mestre é LIGADO ou DESLIGADO usando gravação digital no pino PA1 e também a impressão serial é usada para imprimir o valor no monitor serial
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Master LED OFF"); }
- Em seguida, precisamos ler o status do pino PA0 que é o botão mestre STM32.
int pinvalue = digitalRead (botão);
- Em seguida, envie o valor do pino de acordo com a lógica, então usamos a condição if e então iniciamos a transmissão com o arduino escravo com 8 como endereço e então escrevemos o valor de acordo com o valor de entrada do botão.
if (pinvalue == HIGH) { x = 1; } mais { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Explicação de programação do Slave Arduino
1. Em primeiro lugar, precisamos incluir a biblioteca Wire para usar as funções de comunicação I2C.
#incluir
2. Na configuração vazia ()
- Iniciamos a comunicação serial na taxa Baud 9600.
Serial.begin (9600);
- Em seguida, inicie a comunicação I2C no pino (A4, A5) com o endereço do escravo como 8. Aqui é importante especificar o endereço do escravo.
Wire.begin (8);
Em seguida, precisamos chamar a função Wire.onReceive quando o Slave receber o valor do mestre e a função Wire.onRequest quando o Master solicitar o valor do Slave.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. Em seguida, temos duas funções, uma para solicitar evento e outra para receber evento
Para solicitar evento
Quando o mestre STM32 solicitar o valor do escravo, esta função será executada. Esta função obtém o valor de entrada do botão Slave Arduino e envia um byte (1 ou 0) para o Master STM32 de acordo com o valor do botão usando Wire.write ().
void requestEvent () { valor interno = digitalRead (botão); if (valor == ALTO) { x = 1; } mais { x = 0; } Wire.write (x); }
Para receber evento
Quando o Mestre envia dados ao escravo com endereço de escravo (8), esta função será executada. Esta função lê o valor recebido do mestre e armazenar em uma variável do tipo byte e, em seguida, usar , se a lógica para virar escravo LED ON ou OFF, dependendo do valor recebido. Se o valor recebido for 1, o LED acende e para 0 o LED apaga.
void receiveEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Slave LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Slave LED OFF"); } atraso (500); }
Resultado
1. Quando pressionamos o botão no Master STM32, o LED conectado ao Slave Ardiono acende (Branco).
2. Agora, quando pressionamos o botão de pressão no lado do Escravo, o LED conectado ao Mestre acende (vermelho) e quando o botão é solto o LED apaga.
3. Quando ambos os botões são pressionados simultaneamente, ambos os LEDs acendem ao mesmo tempo e permanecem LIGADOS até que os botões sejam pressionados
Portanto, é assim que a comunicação I2C ocorre no STM32. Agora você pode conectar qualquer sensor I2C com a placa STM32.
A codificação completa para Master STM32 e Slave Arduino é fornecida abaixo com um vídeo de demonstração