Comment utiliser la communication SPI avec Arduino et Raspberry Pi

L'interface périphérique série (SPI) est un protocole de communication série synchrone largement utilisé pour la communication à courte distance, principalement dans les systèmes intégrés. La combinaison de la polyvalence de l'Arduino avec la puissance de calcul du Raspberry Pi via SPI peut ouvrir une pléthore de possibilités de projet. Dans cet article de blog, nous explorerons comment configurer et utiliser la communication SPI entre un Arduino et un Raspberry Pi.

Comprendre Spi

SPI est un protocole de communication complet du Duplex qui fonctionne en mode maître-esclave. Il utilise quatre lignes principales:

  • Mosi (Master Out Slave in): Transfère les données du maître à l'esclave.
  • Miso (maître à l'esclave): Transfère les données de l'esclave au maître.
  • SCLK (horloge série): Synchronise la transmission de données générée par le maître.
  • SS / CS (Sellave Select / Chip Select): Sélectionne l'appareil esclave.

SPI est favorisé pour sa simplicité et sa vitesse, ce qui le rend idéal pour les applications nécessitant un échange rapide de données entre les appareils.

Pourquoi utiliser SPI avec Arduino et Raspberry Pi?

La combinaison d'un Arduino avec un PI Raspberry exploite les forces des deux plates-formes. L'Arduino excelle à un contrôle matériel en temps réel et de bas niveau, tandis que le Raspberry Pi propose des capacités de traitement de haut niveau, une connectivité réseau et un environnement de système d'exploitation riche. L'utilisation de SPI permet à ces deux appareils de communiquer efficacement, permettant des projets complexes comme les systèmes de domotique, la robotique et les applications de journalisation des données.

Configuration du matériel

Pour établir une communication SPI entre un Arduino et un Raspberry Pi, vous aurez besoin des composants suivants:

  • Arduino Uno (ou toute carte Arduino compatible)
  • Raspberry Pi (n'importe quel modèle avec des broches GPIO)
  • Fils de cavalier
  • Planche à pain (en option)

Câblage de l'Arduino et du Raspberry Pi pour SPI

Un câblage minutieux est crucial pour assurer une bonne communication. Voici comment connecter l'Arduino et Raspberry Pi à l'aide de SPI:

Broche de framboise pi gpio Épingle arduino Description
GPIO10 (MOSI) PIN 11 (MOSI) Master Out Slave in
GPIO9 (MISO) PIN 12 (MISO) Maître en esclave
GPIO11 (SCLK) PIN 13 (SCLK) Horloge en série
GPIO8 (CE0) PIN 10 (SS) Sélection d'esclaves
GND GND Terrain d'entente
3.3 V 5V Alimentation (utilisez un changement de niveau si nécessaire)

Note: Le Raspberry Pi fonctionne à des niveaux logiques de 3,3 V, tandis qu'Arduino UNO utilise 5V. Il est recommandé d'utiliser un convertisseur de niveau logique pour éviter les dommages potentiels au Raspberry Pi.

Configuration de l'Arduino

L'Arduino agira comme le dispositif d'esclaves SPI. Vous trouverez ci-dessous un exemple de croquis Arduino pour le configurer:


// Arduino as SPI Slave

#include 

volatile byte receivedData = 0;

void setup() {
  // Initialize serial communication for debugging
  Serial.begin(9600);

  // Set MISO as output
  pinMode(MISO, OUTPUT);

  // Enable SPI in Slave Mode
  SPCR |= _BV(SPE);
  SPI.attachInterrupt();
}

ISR(SPI_STC_vect) {
  receivedData = SPDR;
}

void loop() {
  if (receivedData) {
    Serial.print("Received: ");
    Serial.println(receivedData);
    receivedData = 0;
  }
}

Explication:

  • Spi.AttachInterrupt (); Permet l'interruption SPI, permettant à l'Arduino de gérer les données entrantes.
  • Dans la routine de service d'interruption ISR(SPI_STC_vect), les données reçues sont stockées pour le traitement.
  • Le loop() La fonction vérifie les données reçues et les imprime au moniteur série.

Configuration du Raspberry Pi

Le Raspberry Pi servira de dispositif maître SPI. Nous utiliserons Python avec le spidev bibliothèque pour gérer la communication SPI. Tout d'abord, assurez-vous que SPI est activé:

  • Ouvrez l'outil de configuration Raspberry Pi:
    sudo raspi-config
  • Se diriger vers Options d'interface > Spice > Activer
  • Redémarrez le Raspberry Pi si invité.

Installer le spidev bibliothèque si elle n'est pas déjà installée:

sudo apt-get install python3-spidev

Voici un exemple de script Python pour le Raspberry Pi:

# Raspberry Pi as SPI Master

import spidev
import time

# Open SPI bus 0, device (CS) 0
spi = spidev.SpiDev()
spi.open(0, 0)

# Set SPI speed and mode
spi.max_speed_hz = 50000
spi.mode = 0

def send_data(data):
    """Send a single byte to the SPI slave"""
    response = spi.xfer2([data])
    return response

try:
    while True:
        data = 42  # Example data byte
        print(f"Sending: {data}")
        resp = send_data(data)
        print(f"Received: {resp[0]}")
        time.sleep(1)

except KeyboardInterrupt:
    spi.close()

Explication:

  • spi.open (0, 0) Ouvre le bus SPI 0, appareil 0 (CE0).
  • spi.xfer2 ([données]) Envoie l'octet de données et reçoit simultanément des données de l'esclave.
  • Le script envoie un octet (par exemple, 42) chaque seconde et imprime la réponse de l'Arduino.

Tester la communication

Après avoir installé à la fois l'Arduino et le Raspberry Pi:

  1. Téléchargez le croquis Arduino sur la carte Arduino.
  2. Connectez l'Arduino au Raspberry Pi via le câblage SPI.
  3. Exécutez le script Python sur le Raspberry Pi:
    python3 spi_master.py
  4. Ouvrez le moniteur série Arduino pour afficher les données reçues:
    Tools > Serial Monitor

Vous devriez voir l'Arduino recevoir les données envoyées par le Raspberry Pi et les afficher dans le moniteur en série. De même, le Raspberry Pi affichera les données qu'il envoie et la réponse qu'elle reçoit.

Conseils de dépannage

  • Vérifier le câblage: Assurez-vous que toutes les connexions entre Arduino et Raspberry Pi sont sécurisées et mappées correctement.
  • Niveaux de tension: Utilisez un convertisseur de niveau logique pour correspondre au 3,3 V du Raspberry Pi avec le 5V de l'Arduino.
  • Activer SPI: Vérifiez que SPI est activé sur le framboise PI en utilisant raspi-config.
  • Autorisations: Assurez-vous que votre utilisateur a les autorisations nécessaires pour accéder aux appareils SPI. Vous devrez peut-être exécuter votre script Python avec sudo.
  • Taux en bauds: Assurez-vous que le moniteur série et le croquis Arduino utilisent le même taux de bauds.
  • Paramètres SPI: Assurez-vous que le maître et l'esclave sont configurés avec le même mode SPI et la même vitesse.

Conclusion

L'utilisation de la communication SPI entre un Arduino et un Raspberry Pi vous permet d'exploiter efficacement les forces des deux plates-formes. Que vous créiez un système de robotique complexe, que vous développiez un réseau de capteurs ou que vous expérimentez la journalisation des données, la compréhension de SPI est inestimable. En suivant les étapes décrites dans ce guide, vous pouvez mettre en place une communication SPI fiable et vous lancer dans des projets intégrés passionnants qui exploitent la puissance d'Arduino et de Raspberry Pi.

Bonne bricolage!

Laissez un commentaire

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.