- Panoramica di STM32F103C8 I2C
- Pin I2C in STM32F103C8
- Pin I2C in Arduino
- Componenti richiesti
- Schema elettrico e collegamenti
- Programmazione I2C in STM32
- Spiegazione della programmazione del master STM32
- Spiegazione della programmazione di Arduino slave
Nei nostri tutorial precedenti, abbiamo imparato a conoscere la comunicazione SPI e I2C tra due schede Arduino. In questo tutorial sostituiremo una scheda Arduino con la scheda Blue Pill che è STM32F103C8 e comunicheremo con la scheda Arduino utilizzando il bus I2C.
STM32 ha più funzionalità rispetto alla scheda Arduino. Quindi sarebbe fantastico conoscere la comunicazione tra STM32 e Arduino utilizzando il bus SPI e I2C. In questo tutorial, useremo il bus I2C per la comunicazione tra Arduino e STM32F103C8 e impareremo a conoscere il bus SPI nel prossimo tutorial. Per saperne di più sulla scheda STM32, controlla altri progetti STM32.
Panoramica di STM32F103C8 I2C
Confrontando I2C (Inter Integrated Circuits) nella scheda Blue Pill STM32F103C8 con Arduino Uno, vedremo che Arduino ha un microcontrollore ATMEGA328 e STM32F103C8 ha ARM Cortex-M3 in esso. STM32 ha due bus I2C mentre Arduino Uno ha solo un bus I2C e STM32 è più veloce di Arduino.
Per ulteriori informazioni sulla comunicazione I2C, fare riferimento ai nostri articoli precedenti
- Come utilizzare I2C in Arduino: comunicazione tra due schede Arduino
- Comunicazione I2C con microcontrollore PIC PIC16F877
- Interfacciamento LCD 16X2 con ESP32 utilizzando I2C
- Comunicazione I2C con MSP430 Launchpad
- Interfacciamento LCD con NodeMCU senza utilizzare I2C
- Come gestire le multi comunicazioni (I2C SPI UART) in un unico programma di arduino
Pin I2C in STM32F103C8
SDA: PB7 o PB9, PB11.
SCL: PB6 o PB8, PB10.
Pin I2C in Arduino
SDA: pin A4
SCL: perno A5
Componenti richiesti
- STM32F103C8
- Arduino Uno
- LED (2-No)
- Pulsante (2-Nos)
- Resistori (4-Nos)
- Breadboard
- Collegamento dei cavi
Schema elettrico e collegamenti
La tabella seguente mostra la connessione tra STM32 Blue Pill e Arduino Uno per l'utilizzo del bus I2C. Richiede solo due fili.
STM32F103C8 |
Arduino |
Descrizione pin |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Terra |
Importante
- Non dimenticare di connettere Arduino GND e STM32F103C8 GND insieme.
- Quindi collegare una resistenza di pull down da 10k ai pin del pulsante di entrambe le schede separatamente.
In questo tutorial STM32 I2C configureremo STM32F103C8 come Master e Arduino come Slave. Entrambe le schede sono fissate separatamente con un LED e un pulsante.
Per dimostrare la comunicazione I2C in STM32, controlliamo il LED STM32 master utilizzando il valore del pulsante Arduino slave e controlliamo il LED Arduino slave utilizzando il valore del pulsante STM32F103C8 master. Questi valori vengono inviati tramite bus di comunicazione I2C.
Programmazione I2C in STM32
La programmazione è simile al codice Arduino. Lo stesso
Questo tutorial ha due programmi uno per il master STM32 e l'altro per lo slave Arduino. I programmi completi per entrambe le parti sono forniti alla fine di questo progetto con un video dimostrativo.
Spiegazione della programmazione del master STM32
In Master STM32 vediamo cosa sta succedendo:
1. Prima di tutto abbiamo bisogno di includere la libreria Wire e la libreria softwire per l'utilizzo delle funzioni di comunicazione I2C in STM32F103C8.
#includere
2. In void setup ()
- Iniziamo la comunicazione seriale al baud rate 9600.
Serial.begin (9600);
- Successivamente iniziamo la comunicazione I2C sul pin (B6, B7)
Wire.begin ();
3. In Void loop ()
- Per prima cosa otteniamo i dati dallo Slave Arduino quindi usiamo requestFrom () con l'indirizzo slave 8 e chiediamo un byte.
Wire.requestFrom (8,1);
Il valore ricevuto viene letto utilizzando Wire.read ()
byte a = Wire.read ();
- A seconda del valore ricevuto dallo slave, il LED Master viene acceso o spento utilizzando la scrittura digitale sul pin PA1 e anche la stampa seriale viene utilizzata per stampare il valore nel monitor seriale
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("LED master acceso"); } altro { digitalWrite (LED, LOW); Serial.println ("LED master OFF"); }
- Successivamente dobbiamo leggere lo stato del pin PA0 che è il pulsante STM32 master.
int pinvalue = digitalRead (buttonpin);
- Quindi inviare il valore del pin in base alla logica, quindi usiamo la condizione if e quindi iniziamo la trasmissione con arduino slave con 8 come indirizzo e quindi scriviamo il valore in base al valore di input del pulsante.
se (valore pin == ALTO) { x = 1; } altro { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Spiegazione della programmazione di Arduino slave
1. Innanzitutto dobbiamo includere la libreria Wire per utilizzare le funzioni di comunicazione I2C.
#includere
2. In void setup ()
- Iniziamo la comunicazione seriale al baud rate 9600.
Serial.begin (9600);
- Quindi avviare la comunicazione I2C sul pin (A4, A5) con indirizzo slave come 8. Qui è importante specificare l'indirizzo slave.
Wire.begin (8);
Successivamente dobbiamo chiamare la funzione Wire.onReceive quando Slave riceve il valore dal master e la funzione Wire.onRequest quando il Master richiede il valore dallo Slave.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. Successivamente abbiamo due funzioni una per l'evento di richiesta e una per l'evento di ricezione
Per richiesta Evento
Quando il Master STM32 richiede il valore dallo slave, questa funzione verrà eseguita. Questa funzione prende il valore di input dal pulsante Slave Arduino e invia un byte (1 o 0) al Master STM32 in base al valore del pulsante utilizzando Wire.write ().
void requestEvent () { int value = digitalRead (buttonpin); se (valore == ALTO) { x = 1; } altro { x = 0; } Wire.write (x); }
Per ricevere evento
Quando il Master invia dati allo slave con indirizzo slave (8), questa funzione verrà eseguita. Questa funzione legge il valore ricevuto dal master e lo memorizza in una variabile di tipo byte, quindi utilizza la logica if per accendere o spegnere il LED slave a seconda del valore ricevuto. Se il valore ricevuto è 1, il LED si accende e per 0 il LED si spegne.
void receiveEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("LED Slave acceso"); } altro { digitalWrite (LED, LOW); Serial.println ("LED Slave spento"); } ritardo (500); }
Produzione
1. Quando premiamo il pulsante del Master STM32, il LED collegato allo Slave Ardiono si accende (Bianco).
2. Quando si preme il pulsante a lato Slave, il LED collegato al Master si accende (Rosso) e quando il pulsante viene rilasciato il LED si spegne.
3. Quando entrambi i pulsanti vengono premuti contemporaneamente, entrambi i LED si accendono contemporaneamente e rimangono accesi finché i pulsanti non vengono premuti
Ecco come avviene la comunicazione I2C in STM32. Ora puoi interfacciare qualsiasi sensore I2C con la scheda STM32.
La codifica completa per Master STM32 e Slave Arduino è fornita di seguito con un video dimostrativo