- Qu'est-ce que SPI?
- Fonctionnement de SPI
- Broches SPI dans Arduino UNO
- Utilisation de SPI dans Arduino
- Composants requis pour la communication Arduino SPI
- Schéma du circuit de communication Arduino SPI
- Comment programmer Arduino pour la communication SPI:
- Explication de la programmation du maître Arduino SPI
- Explication de la programmation de l'esclave Arduino SPI
- Comment fonctionne SPI sur Arduino? - Testons-le!
Un microcontrôleur utilise de nombreux protocoles différents pour communiquer avec divers capteurs et modules. Il existe de nombreux types de protocoles de communication pour la communication sans fil et filaire, et la technique de communication la plus couramment utilisée est la communication série. La communication série est le processus d'envoi de données un bit à la fois, séquentiellement, sur un canal ou un bus de communication. Il existe de nombreux types de communication série comme les communications UART, CAN, USB, I2C et SPI.
Dans ce tutoriel, nous apprenons le protocole SPI et comment l'utiliser dans Arduino. Nous utiliserons le protocole SPI pour la communication entre deux Arduinos. Ici, un Arduino agira en tant que maître et un autre agira en tant qu'esclave, deux LED et des boutons-poussoirs seront connectés à la fois à l'Arduino. Pour démontrer la communication SPI, nous contrôlerons la LED côté maître par le bouton poussoir côté esclave et vice versa en utilisant le protocole de communication série SPI.
Qu'est-ce que SPI?
SPI (Serial Peripheral Interface) est un protocole de communication série. L'interface SPI a été trouvée par Motorola en 1970. SPI dispose d'une connexion full-duplex, ce qui signifie que les données sont envoyées et reçues simultanément. Autrement dit, un maître peut envoyer des données à un esclave et un esclave peut envoyer des données au maître simultanément. SPI est une communication série synchrone signifie que l'horloge est nécessaire à des fins de communication.
La communication SPI est précédemment expliquée dans d'autres microcontrôleurs:
- Communication SPI avec le microcontrôleur PIC PIC16F877A
- Interfaçage de l'écran LCD TFT tactile de 3,5 pouces avec Raspberry Pi
- Programmation du microcontrôleur AVR avec broches SPI
- Interfaçage de l'écran LCD graphique Nokia 5110 avec Arduino
Fonctionnement de SPI
Un SPI a une communication maître / esclave en utilisant quatre lignes. Un SPI ne peut avoir qu'un seul maître et peut avoir plusieurs esclaves. Un maître est généralement un microcontrôleur et les esclaves peuvent être un microcontrôleur, des capteurs, ADC, DAC, LCD, etc.
Vous trouverez ci-dessous la représentation schématique du maître SPI avec un seul esclave.
SPI a les quatre lignes suivantes MISO, MOSI, SS et CLK
- MISO (Master in Slave Out) - La ligne Slave pour l'envoi de données au maître.
- MOSI (Master Out Slave In) - La ligne Master pour l'envoi de données aux périphériques.
- SCK (Serial Clock) - Les impulsions d'horloge qui synchronisent la transmission de données générée par le maître.
- SS (Slave Select) - Le maître peut utiliser cette broche pour activer et désactiver des périphériques spécifiques.
Maître SPI avec plusieurs esclaves
Pour démarrer la communication entre le maître et l'esclave, nous devons définir la broche de sélection d'esclave (SS) de l'appareil requis sur LOW, afin qu'il puisse communiquer avec le maître. Quand il est haut, il ignore le maître. Cela vous permet d'avoir plusieurs périphériques SPI partageant les mêmes lignes MISO, MOSI et CLK de maître. Comme vous pouvez le voir dans l'image ci-dessus, il y a quatre esclaves dans lesquels le SCLK, MISO, MOSI sont connectés en commun au maître et le SS de chaque esclave est connecté séparément aux broches SS individuelles (SS1, SS2, SS3) du maître. En réglant la broche SS requise sur BAS, un maître peut communiquer avec cet esclave.
Broches SPI dans Arduino UNO
L'image ci-dessous montre les broches SPI présentes Arduino UNO (dans la boîte rouge).
Ligne SPI |
Broche dans Arduino |
MOSI |
11 ou ICSP-4 |
MISO |
12 ou ICSP-1 |
SCK |
13 ou ICSP-3 |
SS |
dix |
Utilisation de SPI dans Arduino
Avant de commencer la programmation de la communication SPI entre deux Arduinos. Nous devons en savoir plus sur la bibliothèque Arduino SPI utilisée dans Arduino IDE.
La bibliothèque
1. SPI.begin ()
UTILISATION: Pour initialiser le bus SPI en réglant SCK, MOSI et SS sur les sorties, en tirant SCK et MOSI bas et SS haut.
2. SPI.setClockDivider (diviseur)
UTILISATION: Pour régler le diviseur d'horloge SPI par rapport à l'horloge système. Les diviseurs disponibles sont 2, 4, 8, 16, 32, 64 ou 128.
Diviseurs:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (gestionnaire)
UTILISATION: Cette fonction est appelée lorsqu'un appareil esclave reçoit des données du maître.
4. Transfert SPI (val)
UTILISATION: Cette fonction permet d'envoyer et de recevoir simultanément les données entre le maître et l'esclave.
Commençons donc maintenant par une démonstration pratique du protocole SPI dans Arduino. Dans ce tutoriel, nous utiliserons deux arduino l'un comme maître et l'autre comme esclave. Les deux Arduino sont attachés avec une LED et un bouton poussoir séparément. La LED maître peut être contrôlée à l'aide du bouton-poussoir de l'esclave Arduino et la LED de l'esclave Arduino peut être contrôlée par le bouton-poussoir du maître Arduino en utilisant le protocole de communication SPI présent dans Arduino.
Composants requis pour la communication Arduino SPI
- Arduino UNO (2)
- À LED (2)
- Bouton poussoir (2)
- Résistance 10k (2)
- Résistance 2,2k (2)
- Planche à pain
- Connexion des fils
Schéma du circuit de communication Arduino SPI
Le schéma de circuit ci-dessous montre comment utiliser SPI sur Arduino UNO, mais vous pouvez suivre la même procédure pour la communication Arduino Mega SPI ou la communication Arduino nano SPI. Presque tout restera le même, à l'exception du numéro de broche. Vous devez vérifier le brochage d'Arduino nano ou mega pour trouver les broches Arduino nano SPI et les broches Arduino Mega, une fois que vous avez fait, tout le reste sera le même.
J'ai construit le circuit illustré ci-dessus sur une maquette, vous pouvez voir la configuration du circuit que j'ai utilisée pour les tests ci-dessous.
Comment programmer Arduino pour la communication SPI:
Ce tutoriel comporte deux programmes, l'un pour le maître Arduino et l'autre pour l'esclave Arduino. Des programmes complets pour les deux parties sont donnés à la fin de ce projet.
Explication de la programmation du maître Arduino SPI
1. Tout d'abord, nous devons inclure la bibliothèque SPI pour utiliser les fonctions de communication SPI.
#comprendre
2. Dans void setup ()
- Nous commençons la communication série à la vitesse de transmission 115200.
Serial.begin (115200);
- Fixez la LED à la broche 7 et le bouton-poussoir à la broche 2 et définissez respectivement ces broches OUTPUT et INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, SORTIE);
- Ensuite, nous commençons la communication SPI
SPI.begin ();
- Ensuite, nous définissons le Clockdivider pour la communication SPI. Ici, nous avons défini le diviseur 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Ensuite, réglez la broche SS sur HIGH car nous n'avons commencé aucun transfert vers l'arduino esclave.
DigitalWrite (SS, HIGH);
3. Dans void loop ():
- Nous lisons l'état de la broche du bouton-poussoir connectée à la broche2 (maître Arduino) pour envoyer ces valeurs à l'esclave Arduino.
buttonvalue = digitalRead (ipbutton);
- Set Logic for Setting x value (à envoyer à l'esclave) en fonction de l'entrée de la broche 2
if (valeur du bouton == HIGH) { x = 1; } else { x = 0; }
- Avant d'envoyer la valeur, nous devons BASSE la valeur de sélection de l'esclave pour commencer le transfert vers l'esclave depuis le maître.
DigitalWrite (SS, LOW);
- Voici l'étape importante, dans la déclaration suivante, nous envoyons la valeur de bouton stocké dans Mastersend variable à la arduino esclave et reçoit également la valeur de l' esclave qui sera en magasin Mastereceive variable.
Mastereceive = SPI.transfer (Mastersend);
- Après cela, en fonction de la valeur Mastereceive , nous allons allumer ou éteindre la LED Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Définit la broche 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // Définit la broche 7 LOW Serial.println ("Master LED OFF"); }
Remarque: Nous utilisons serial.println () pour afficher le résultat dans Serial Motor of Arduino IDE. Vérifiez la vidéo à la fin.
Explication de la programmation de l'esclave Arduino SPI
1. Tout d'abord, nous devons inclure la bibliothèque SPI pour utiliser les fonctions de communication SPI.
#comprendre
2. Dans void setup ()
- Nous commençons la communication série à la vitesse de transmission 115200.
Serial.begin (115200);
- Fixez la LED à la broche 7 et le bouton-poussoir à la broche 2 et définissez respectivement ces broches OUTPUT et INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, SORTIE);
- L'étape importante ici est les déclarations suivantes
pinMode (MISO, SORTIE);
L'instruction ci-dessus définit MISO comme OUTPUT (Have to Send data to Master IN). Les données sont donc envoyées via MISO de Slave Arduino.
- Activez maintenant SPI en mode esclave à l'aide du registre de contrôle SPI
SPCR - = _BV (SPE);
- Activez ensuite l'interruption pour la communication SPI. Si une donnée est reçue du maître, la routine d'interruption est appelée et la valeur reçue est extraite du SPDR (SPI data Register)
SPI.attachInterrupt ();
- La valeur du maître est extraite de SPDR et stockée dans la variable Slavereceived . Cela a lieu dans la fonction de routine d'interruption suivante.
ISR (SPI_STC_vect) { Slavereceived = SPDR; reçu = vrai; }
3. Ensuite, dans la boucle vide (), nous réglons la LED de l'arduino esclave pour qu'elle s'allume ou s'éteigne en fonction de la valeur Slavereceived.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Définit la broche 7 comme LED HIGH ON Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // Définit la broche 7 comme LOW LED OFF Serial.println ("Slave LED OFF"); }
- Ensuite, nous lisons l'état du bouton-poussoir Slave Arduino et stockons la valeur dans Slavesend pour envoyer la valeur au maître Arduino en donnant une valeur au registre SPDR.
buttonvalue = digitalRead (buttonpin); if (valeur du bouton == HIGH) {x = 1; } else {x = 0; } Slavesend = x; SPDR = Slavesend;
Remarque: Nous utilisons serial.println () pour afficher le résultat dans Serial Motor of Arduino IDE. Vérifiez la vidéo à la fin.
Comment fonctionne SPI sur Arduino? - Testons-le!
Voici l'image de la configuration finale pour la communication SPI entre deux cartes Arduino.
Lorsque le bouton-poussoir du côté maître est enfoncé, la LED blanche du côté esclave s'allume.
Et lorsque le bouton-poussoir du côté esclave est enfoncé, la LED rouge du côté maître s'allume.
Vous pouvez regarder la vidéo ci-dessous pour voir la démonstration de la communication Arduino SPI. Si vous avez des questions, veuillez les laisser dans la section commentaires, notre utilisation de nos forums.