- Présentation du STM32F103C8 I2C
- Broches I2C dans STM32F103C8
- Broches I2C dans Arduino
- Composants requis
- Schéma de circuit et connexions
- Programmation I2C dans STM32
- Explication de la programmation du Master STM32
- Explication de la programmation Arduino esclave
Dans nos tutoriels précédents, nous avons appris la communication SPI et I2C entre deux cartes Arduino. Dans ce tutoriel, nous remplacerons une carte Arduino par la carte Blue Pill qui est STM32F103C8 et communiquerons avec la carte Arduino en utilisant le bus I2C.
STM32 a plus de fonctionnalités que la carte Arduino. Ce serait donc formidable d'en savoir plus sur la communication entre STM32 et Arduino en utilisant le bus SPI et I2C. Dans ce tutoriel, nous utiliserons le bus I2C pour la communication entre Arduino et STM32F103C8, et en apprendrons davantage sur le bus SPI dans le prochain tutoriel. Pour en savoir plus sur la carte STM32, consultez les autres projets STM32.
Présentation du STM32F103C8 I2C
En comparant I2C (Inter Integrated Circuits) dans la carte Blue Pill STM32F103C8 avec Arduino Uno, nous verrons qu'Arduino contient un microcontrôleur ATMEGA328 et que STM32F103C8 contient ARM Cortex-M3. STM32 a deux bus I2C tandis qu'Arduino Uno n'a qu'un seul bus I2C et STM32 est plus rapide que Arduino.
Pour en savoir plus sur la communication I2C, consultez nos articles précédents
- Comment utiliser I2C dans Arduino: Communication entre deux cartes Arduino
- Communication I2C avec le microcontrôleur PIC PIC16F877
- Interfaçage de l'écran LCD 16X2 avec ESP32 en utilisant I2C
- Communication I2C avec le Launchpad MSP430
- Interfaçage de l'écran LCD avec NodeMCU sans utiliser I2C
- Comment gérer les communications multiples (I2C SPI UART) dans un seul programme d'Arduino
Broches I2C dans STM32F103C8
SDA: PB7 ou PB9, PB11.
SCL: PB6 ou PB8, PB10.
Broches I2C dans Arduino
SDA: broche A4
SCL: broche A5
Composants requis
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- Bouton poussoir (2-Nos)
- Résistances (4-Nos)
- Planche à pain
- Connexion des fils
Schéma de circuit et connexions
Le tableau suivant montre la connexion entre STM32 Blue Pill et Arduino Uno pour l'utilisation du bus I2C. Il ne nécessite que deux fils.
STM32F103C8 |
Arduino |
Description des broches |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Sol |
Important
- N'oubliez pas de connecter l'Arduino GND et le STM32F103C8 GND ensemble.
- Ensuite, connectez une résistance Pull down de 10k aux broches du bouton-poussoir des deux cartes séparément.
Dans ce tutoriel STM32 I2C, nous allons configurer le STM32F103C8 en tant que maître et Arduino en tant qu'esclave. Les deux cartes sont fixées séparément avec une LED et un bouton poussoir.
Pour démontrer la communication I2C dans STM32, nous contrôlons la LED STM32 maître en utilisant la valeur du bouton-poussoir Arduino esclave et la LED Arduino esclave en utilisant la valeur du bouton-poussoir maître STM32F103C8. Ces valeurs sont envoyées via le bus de communication I2C.
Programmation I2C dans STM32
La programmation est similaire au code Arduino. Le même
Ce tutoriel a deux programmes un pour le maître STM32 et un autre pour l'esclave Arduino. Des programmes complets pour les deux côtés sont donnés à la fin de ce projet avec une vidéo de démonstration.
Explication de la programmation du Master STM32
Dans Master STM32, voyons ce qui se passe:
1. Tout d'abord, nous devons inclure la bibliothèque Wire et la bibliothèque Softwire pour utiliser les fonctions de communication I2C dans STM32F103C8.
#comprendre
2. Dans void setup ()
- Nous commençons la communication série au débit en bauds de 9600.
Serial.begin (9600);
- Ensuite, nous commençons la communication I2C à la broche (B6, B7)
Wire.begin ();
3. Dans la boucle Void ()
- Nous obtenons d'abord les données de l'Arduino esclave, nous utilisons donc requestFrom () avec l'adresse esclave 8 et nous demandons un octet.
Wire.requestFrom (8,1);
La valeur reçue est lue à l'aide de Wire.read ()
octet a = Wire.read ();
- Selon la valeur reçue de l'esclave, la LED principale est allumée ou éteinte en utilisant l' écriture numérique sur la broche PA1 et l'impression série est également utilisée pour imprimer la valeur dans le moniteur série
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("LED principale allumée"); } else { digitalWrite (LED, LOW); Serial.println ("LED principale éteinte"); }
- Ensuite, nous devons lire l'état de la broche PA0 qui est le bouton-poussoir maître STM32.
int pinvalue = digitalRead (bouton);
- Ensuite, envoyez la valeur de la broche selon la logique, nous utilisons donc if condition, puis commençons la transmission avec l'arduino esclave avec 8 comme adresse, puis écrivons la valeur en fonction de la valeur d'entrée du bouton-poussoir.
if (valeur pin == HIGH) { x = 1; } else { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Explication de la programmation Arduino esclave
1. Tout d'abord, nous devons inclure la bibliothèque Wire pour utiliser les fonctions de communication I2C.
#comprendre
2. Dans void setup ()
- Nous commençons la communication série au débit en bauds de 9600.
Serial.begin (9600);
- Démarrez ensuite la communication I2C sur la broche (A4, A5) avec l'adresse esclave comme 8. Ici, il est important de spécifier l'adresse esclave.
Wire.begin (8);
Ensuite, nous devons appeler la fonction Wire.onReceive lorsque l'esclave reçoit la valeur du maître et l' appel de la fonction Wire.onRequest lorsque le maître demande la valeur de l'esclave.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. Ensuite, nous avons deux fonctions une pour l'événement de demande et une pour l'événement de réception
Pour demande événement
Lorsque le maître STM32 demande la valeur de l'esclave, cette fonction s'exécute. Cette fonction prend la valeur d'entrée du bouton-poussoir Slave Arduino et envoie un octet (1 ou 0) au maître STM32 en fonction de la valeur du bouton-poussoir en utilisant Wire.write ().
void requestEvent () { valeur int = digitalRead (bouton en épingle); if (valeur == HIGH) { x = 1; } else { x = 0; } Wire.write (x); }
Pour recevoir l'événement
Lorsque le maître envoie des données à l'esclave avec l'adresse d'esclave (8), cette fonction s'exécute. Cette fonction lit la valeur reçue du maître et la stocke dans une variable de type octet, puis utilise la logique if pour allumer ou éteindre la LED esclave en fonction de la valeur reçue. Si la valeur reçue est 1, la LED s'allume et pendant 0, la LED s'éteint.
void receiveEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("LED esclave allumée"); } else { digitalWrite (LED, LOW); Serial.println ("LED esclave éteinte"); } retard (500); }
Production
1. Lorsque nous appuyons sur le bouton poussoir du Master STM32, la LED connectée à Slave Ardiono s'allume (blanc).
2. Maintenant, lorsque nous appuyons sur le bouton-poussoir du côté esclave, la LED connectée au maître s'allume (rouge) et lorsque le bouton est relâché, la LED s'éteint.
3. Lorsque les deux boutons-poussoirs sont enfoncés simultanément à nouveau, les deux voyants s'allument en même temps et restent allumés jusqu'à ce que les boutons soient enfoncés
C'est ainsi que la communication I2C se déroule dans STM32. Vous pouvez désormais interfacer n'importe quel capteur I2C avec la carte STM32.
Le codage complet pour Master STM32 et Slave Arduino est donné ci-dessous avec une vidéo de démonstration