- Descripción general de STM32F103C8 I2C
- Pines I2C en STM32F103C8
- Pines I2C en Arduino
- Componentes requeridos
- Diagrama de circuito y conexiones
- Programación I2C en STM32
- Explicación de la programación del maestro STM32
- Explicación de la programación del esclavo Arduino
En nuestros tutoriales anteriores, hemos aprendido sobre la comunicación SPI e I2C entre dos placas Arduino. En este tutorial reemplazaremos una placa Arduino con la placa Blue Pill que es STM32F103C8 y se comunicará con la placa Arduino utilizando el bus I2C.
STM32 tiene más funciones que la placa Arduino. Por lo tanto, sería genial aprender sobre la comunicación entre STM32 y Arduino utilizando el bus SPI e I2C. En este tutorial, usaremos el bus I2C para la comunicación entre Arduino y STM32F103C8, y aprenderemos sobre el bus SPI en el próximo tutorial. Para saber más sobre la placa STM32, consulte otros proyectos STM32.
Descripción general de STM32F103C8 I2C
Comparando I2C (Circuitos Interintegrados) en la placa STM32F103C8 Blue Pill con Arduino Uno, veremos que Arduino tiene el microcontrolador ATMEGA328 y STM32F103C8 tiene ARM Cortex-M3. STM32 tiene dos buses I2C, mientras que Arduino Uno solo tiene un bus I2C y STM32 es más rápido que Arduino.
Para obtener más información sobre la comunicación I2C, consulte nuestros artículos anteriores.
- Cómo usar I2C en Arduino: comunicación entre dos placas Arduino
- Comunicación I2C con el microcontrolador PIC PIC16F877
- Interfaz LCD 16X2 con ESP32 usando I2C
- Comunicación I2C con MSP430 Launchpad
- Interfaz de LCD con NodeMCU sin usar I2C
- Cómo manejar comunicaciones múltiples (I2C SPI UART) en un solo programa de arduino
Pines I2C en STM32F103C8
SDA: PB7 o PB9, PB11.
SCL: PB6 o PB8, PB10.
Pines I2C en Arduino
SDA: pin A4
SCL: patilla A5
Componentes requeridos
- STM32F103C8
- Arduino Uno
- LED (2 números)
- Botón pulsador (2 números)
- Resistencias (4 números)
- Tablero de circuitos
- Conexión de cables
Diagrama de circuito y conexiones
La siguiente tabla muestra la conexión entre STM32 Blue Pill y Arduino Uno para usar el bus I2C. Requiere solo dos cables.
STM32F103C8 |
Arduino |
Pin Descripción |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Suelo |
Importante
- No olvide conectar el Arduino GND y el STM32F103C8 GND juntos.
- Luego, conecte una resistencia Pull down de 10k a los pines del botón pulsador de ambos tableros por separado.
En este tutorial de STM32 I2C configuraremos el STM32F103C8 como maestro y Arduino como esclavo. Ambas placas se unen con un LED y un botón pulsador por separado.
Para demostrar la comunicación I2C en STM32, controlamos el LED STM32 maestro mediante el valor del botón pulsador Arduino esclavo y controlamos el LED Arduino esclavo mediante el valor del botón pulsador STM32F103C8 maestro. Estos valores se envían a través del bus de comunicación I2C.
Programación I2C en STM32
La programación es similar al código Arduino. Lo mismo
Este tutorial tiene dos programas, uno para el maestro STM32 y otro para el esclavo Arduino. Los programas completos para ambos lados se dan al final de este proyecto con un video de demostración.
Explicación de la programación del maestro STM32
En Master STM32 veamos qué está pasando:
1. En primer lugar, debemos incluir la biblioteca Wire y la biblioteca de software para usar las funciones de comunicación I2C en STM32F103C8.
#incluir
2. En configuración nula ()
- Comenzamos la comunicación en serie a una velocidad de 9600 baudios.
Serial.begin (9600);
- A continuación, iniciamos la comunicación I2C en el pin (B6, B7)
Wire.begin ();
3. En bucle vacío ()
- Primero obtenemos los datos del Slave Arduino por lo que usamos requestFrom () con la dirección esclava 8 y solicitamos un byte.
Wire.requestFrom (8,1);
El valor recibido se lee usando Wire.read ()
byte a = Wire.read ();
- Dependiendo del valor recibido del esclavo, el LED maestro se enciende o apaga usando escritura digital en el pin PA1 y también se usa la impresión en serie para imprimir el valor en el monitor en serie
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("LED maestro encendido"); } else { digitalWrite (LED, BAJO); Serial.println ("LED maestro apagado"); }
- A continuación, necesitamos leer el estado del pin PA0 que es el pulsador maestro STM32.
int pinvalue = digitalRead (alfiler de botón);
- A continuación, envíe el valor del pin de acuerdo con la lógica, por lo que usamos la condición if y luego comenzamos la transmisión con el arduino esclavo con 8 como dirección y luego escribimos el valor de acuerdo con el valor de entrada del botón pulsador.
if (pinvalue == HIGH) { x = 1; } más { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Explicación de la programación del esclavo Arduino
1. En primer lugar, debemos incluir la biblioteca Wire para usar las funciones de comunicación I2C.
#incluir
2. En configuración nula ()
- Comenzamos la comunicación en serie a una velocidad de 9600 baudios.
Serial.begin (9600);
- A continuación, inicie la comunicación I2C en el pin (A4, A5) con la dirección del esclavo como 8. Aquí es importante especificar la dirección del esclavo.
Wire.begin (8);
A continuación, debemos llamar a la función Wire.onReceive cuando el esclavo recibe valor del maestro y la función Wire.onRequest llama cuando el maestro solicita el valor del esclavo.
Wire.onReceive (ReceiveEvent); Wire.onRequest (requestEvent);
3. A continuación, tenemos dos funciones, una para solicitar evento y otra para recibir evento.
Para solicitar evento
Cuando el maestro STM32 solicita el valor del esclavo, esta función se ejecutará. Esta función toma el valor de entrada del pulsador Slave Arduino y envía un byte (1 o 0) al Master STM32 de acuerdo con el valor del pulsador mediante Wire.write ().
vacío requestEvent () { int valor = digitalRead (buttonpin); si (valor == ALTO) { x = 1; } más { x = 0; } Wire.write (x); }
Para recibir evento
Cuando el maestro envía datos al esclavo con la dirección del esclavo (8), esta función se ejecutará. Esta función lee el valor recibido del maestro y lo almacena en una variable de tipo byte y luego usa la lógica if para encender o apagar el LED esclavo dependiendo del valor recibido. Si el valor recibido es 1, el LED se enciende y para 0 el LED se apaga.
evento de recepción vacío (int cómoMuchos) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("LED esclavo encendido"); } else { digitalWrite (LED, BAJO); Serial.println ("LED esclavo apagado"); } retraso (500); }
Salida
1. Cuando presionamos el pulsador en Master STM32, el LED conectado al Slave Ardiono se enciende (Blanco).
2. Ahora, cuando presionamos el botón en el lado esclavo, el LED conectado al maestro se enciende (rojo) y cuando se suelta el botón, el LED se apaga.
3. Cuando ambos botones pulsadores se presionan simultáneamente, ambos LED se iluminan al mismo tiempo y permanecen encendidos hasta que se presionan los botones.
Así es como se lleva a cabo la comunicación I2C en STM32. Ahora puede conectar cualquier sensor I2C con la placa STM32.
La codificación completa para Master STM32 y Slave Arduino se proporciona a continuación con un video de demostración