======== Connexion RPI et ESP32 via UART ======== Pour connecter un Raspberry Pi 4 à un ESP32 en utilisant le protocole **UART (série)**, voici les étapes détaillées : ==== Matériel nécessaire :==== - Raspberry Pi 4 - ESP32 - Câbles de connexion (Dupont) - Optionnel : Résistances (si nécessaire pour les niveaux de tension) ==== Connexion physique :==== {{ :start:raspberry:17r-02-raspberry-pi-3-uart-pins-2563198065.png?direct&600 |}} {{ :start:raspberry:uart:capture_d_ecran_du_2025-02-23_15-10-18.png?direct&800 |}} Raspberry Pi 4 → ESP32: * Raspberry Pi 4 : * GPIO 14 (TX) → **ESP32 GPIO 16 (RX)** (Transmission du Raspberry Pi vers l'ESP32) UART(2) *GPIO 15 (RX) → **ESP32 GPIO 17 (TX)** (Réception du Raspberry Pi depuis l'ESP32) UART(2) OU *GPIO 14 (TX) → **ESP32 GPIO 25 (RX)** (Transmission du Raspberry Pi vers l'ESP32) UART(1) *GPIO 15 (RX) → **ESP32 GPIO 26 (TX)** (Réception du Raspberry Pi depuis l'ESP32) UART(1) * Alimentation : *3.3V (Raspberry Pi 4) → **3.3V (ESP32)** (L'ESP32 fonctionne en 3.3V, évitez le 5V) *GND → GND {{ :start:raspberry:uart:capture_d_ecran_du_2025-02-23_16-53-42.png?direct&600 |}} Important : - Vous devez connecter TX à RX et RX à TX. - Le Raspberry Pi utilise un niveau logique de 3.3V, donc assurez-vous que l'ESP32 soit alimenté en 3.3V également. Si vous branchez un câble GPIO directement à un autre périphérique qui fonctionne à 5V (par exemple, certaines cartes Arduino), vous risquez d'endommager les broches. Configuration sur le **Raspberry Pi** (UART Master) : 1. **Activer le port série** : - Par défaut, le port série du Raspberry Pi est réservé à la console. Vous devez le libérer pour l'utiliser pour la communication série. - Ouvrez une terminal et tapez : sudo raspi-config - Allez dans **"Interfacing Options"** puis **"Serial"**. Désactivez l'accès à la console série et activez l'interface série. - Redémarrez le Raspberry Pi. ( sudo reboot ) - Desactiver le Bluetooth sur le Raspberry Pi - Installer [[https://pimylifeup.com/raspberry-pi-pip/|le module pip]] ( sudo apt install python3-pip ) - Installer PySerial ( sudo apt-get install python3-serial ) - sudo reboot 2. **Vérifiez que le port série fonctionne** : - Une fois le port série activé, vous pouvez vérifier si le périphérique série est détecté. Tapez la commande suivante pour vérifier : ls /dev/ttyAMA* Vous devriez voir quelque chose comme `/dev/ttyAMA0`. 3. **Installer les outils de communication série (si nécessaire)** : Si vous souhaitez envoyer et recevoir des données en ligne de commande, installez **minicom** ou **screen** : sudo apt-get install minicom 4. **Testez la connexion série avec `minicom`** : - Utilisez minicom pour tester la communication série en vous connectant au port `/dev/ttyAMA0` : minicom -b 115200 -o -D /dev/ttyAMAO Ctrl + A et ensuite X pour sortir de minicom : Ctrl + A et ensuite Z pour l'Aide : CTRL + A et ensuite O pour configurer minicom Remarque : Changez le port si nécessaire (en fonction de la sortie de `ls /dev/ttyAMA0`). ====Configuration sur l'**ESP32** (UART Slave) :==== 1. **Utiliser l'IDE Arduino pour programmer l'ESP32** : - Si vous n'avez pas encore installé le support pour l'ESP32 dans l'IDE Arduino, allez dans `Outils` → `Carte` → Sélectionnez votre modèle ESP32. - Assurez-vous que vous avez installé le paquet ESP32 dans le **Gestionnaire de cartes** de l'IDE Arduino. 2. **Code pour l'ESP32 (réception et envoi UART)** : ==-1-Voici un exemple de code pour configurer l'ESP32 pour communiquer via UART(2) :== #define RXD2 16 #define TXD2 17 #define GPS_BAUDS 115200 HardwareSerial mySerial2(2); int counter = 0; void setup() { Serial.begin(115200); mySerial2.begin(GPS_BAUDS, SERIAL_8N1, RXD2, TXD2); Serial.println("Serial 2 demarre en 115200 Bds"); } void loop() { while (mySerial2.available() > 0) { char gpsData1 = mySerial2.read(); Serial.print(gpsData1); } delay(2000); Serial.println("--------------------------------------------"); mySerial2.println(String(counter)); Serial.println("Envoie UART2: " + String(counter)); counter++; delay(2000); } Ce code permet à l'ESP32 de lire les caractères envoyés par le Raspberry Pi et de répondre avec un message. ==-2- Voici un exemple de code pour configurer l'ESP32 pour communiquer via UART(1) :== #define RXD1 25 #define TXD1 26 #define GPS_BAUDS 115200 HardwareSerial mySerial1(1); int counter = 0; void setup() { Serial.begin(115200); mySerial1.begin(GPS_BAUDS, SERIAL_8N1, RXD1, TXD1); Serial.println("Serial 1 25R 26T demarre en 115200 Bds"); } void loop() { while (mySerial1.available() > 0) { char gpsData2 = mySerial1.read(); Serial.print(gpsData2); } delay(2000); Serial.println("--------------------------------------------"); mySerial1.println(String(counter)); Serial.println("Envoie UART1: " + String(counter)); counter++; delay(2000); } Ce code permet à l'ESP32 de lire les caractères envoyés par le Raspberry Pi et de répondre avec un message. == Code pour l"ESP32M qui recoit sur l'UART1 le RPI et sur l'UART2 l'ESP32E == {{ :start:raspberry:uart:capture_d_ecran_du_2025-02-23_21-30-05.png?direct&800 |}} Raspberry Pi 4 → ESP32M <-- ESP32E: * Raspberry Pi 4 : *GPIO 14 (TX) → **ESP32M GPIO 25 (RX)** (Transmission du Raspberry Pi vers l'ESP32M) UART(1) *GPIO 15 (RX) <-- **ESP32M GPIO 26 (TX)** (Réception du Raspberry Pi depuis l'ESP32M) UART(1) * ESP32M *GPIO 16 (RX) --> **ESP32E GPIO 17 (TX) ** (Transmission de l'ESP32M vers l'ESP32E) UART(2) *GPIO 17 (TX) <-- **ESP32E GPIO 16 (RX) ** (Réception de l'ESP32M depuis l'ESP32E) UART(2) * Alimentation : *3.3V (Raspberry Pi 4) → **3.3V (ESP32M et E )** (L'ESP32 fonctionne en 3.3V, évitez le 5V) *GND → GND #define RXD1 25 #define TXD1 26 #define RXD2 16 #define TXD2 17 #define GPS_BAUDS 115200 HardwareSerial mySerial1(1); HardwareSerial mySerial2(2); int counter = 0; void setup() { Serial.begin(115200); mySerial1.begin(GPS_BAUDS, SERIAL_8N1, RXD1, TXD1); Serial.println("Serial 1 25R 26T demarre en 115200 Bds"); mySerial2.begin(GPS_BAUDS, SERIAL_8N1, RXD2, TXD2); Serial.println("Serial 2 16R 17T demarre en 115200 Bds"); } void loop() { while (mySerial1.available() > 0) { char gpsData1 = mySerial1.read(); Serial.print(gpsData1); } while (mySerial2.available() > 0) { char gpsData2 = mySerial2.read(); Serial.print(gpsData2); } delay(2000); Serial.println("--------------------------------------------"); mySerial1.println(String(counter)); Serial.println("Envoie UART1: " + String(counter)); mySerial2.println(String(counter)); Serial.println("Envoie UART2: " + String(counter)); counter++; delay(2000); } == Code pour test sur ESP32E == #define RXD2 16 #define TXD2 17 #define GPS_BAUDS 115200 HardwareSerial mySerial2(2); int counter = 0; void setup() { Serial.begin(115200); mySerial2.begin(GPS_BAUDS, SERIAL_8N1, RXD2, TXD2); Serial.println("Serial 2 demarre en 115200 Bds"); } void loop() { while (mySerial2.available() > 0) { char gpsData1 = mySerial2.read(); Serial.print(gpsData1); } delay(2000); Serial.println("--------------------------------------------"); mySerial2.println(String(counter)); Serial.println("Envoie UART2: " + String(counter)); counter++; delay(2000); } ====Étapes sur le **Raspberry Pi** (UART Master) :==== 1. **Code Python pour envoyer/recevoir des données via UART** : Voici un exemple de code Python pour communiquer avec l'ESP32M en utilisant le port série /dev/ttyAMA0 : Installer le module pyserial sur raspbery : sudo apt-get install python3-serial import serial import time # Configurer le port série pour le Raspberry Pi ser = serial.Serial('/dev/ttyAMA0', 115200) # Le port série, le même que pour Minicom time.sleep(2) # Attendre que la communication soit stable # Envoyer un message à l'ESP32 ser.write(b"Hello ESP32!\n") print("Envoie Hello ESP32!\n") # Reception des messages de l'ESP32 while True: if ser.in_waiting > 0: # Si des données sont reçues #received = ser.readline().decode('utf-8').strip() # Lire et décoder les données reçues de l'ESP32 en utf-8 received = ser.readline().decode('iso-8859-1').strip() # Lire et décoder les données reçues de l'ESP32 en iso-8859-1 print("Reçu de l'ESP32:", received) time.sleep(1) # Envoie des messages de l'ESP32 ser.write(b"Hello ESP32!\n") print("Envoie Hello ESP32!\n") === Lancer le programme python sur le raspberry === python3 exemple010.py Ce script Python envoie un message à l'ESP32 et attend la réponse. Vous pouvez tester la communication en lisant les réponses dans le terminal du Raspberry : {{ :start:raspberry:uart:capture_d_ecran_du_2025-02-23_16-40-41.png?direct&400 |}} Terminal ESP32: {{ :start:raspberry:uart:capture_d_ecran_du_2025-02-23_16-39-15.png?direct&400 |}} ====Vérification et dépannage :==== - Si la communication ne fonctionne pas, assurez-vous que les connexions sont correctes, que le code est bien téléchargé sur l'ESP32 et que le Raspberry Pi utilise le bon port série. - Si vous avez des problèmes avec le niveau de tension, vous pouvez utiliser un convertisseur logique pour passer du 3.3V à un 5V, mais ce n'est pas nécessaire si vous utilisez 3.3V des deux côtés. - Si vous ne voyez rien sur le port série (pour le Raspberry Pi), vous pouvez essayer d'utiliser `dmesg | grep tty` pour voir les messages du système concernant les ports série. Cela devrait vous permettre d'établir une communication UART entre votre Raspberry Pi 4 et votre ESP32. ====== Test la vitesse entre RPI4 et ESP32 sur UART à 115200Bds ====== ====Programme python sur le RPI4==== import serial import time # Configurer le port série pour le Raspberry Pi ser = serial.Serial('/dev/ttyAMA0', 115200) # Le port série, le même que pour > time.sleep(2) # Attendre que la communication soit stable # Envoyer un message à l'ESP32 ser.write(b"Hello ESP32!\n") print("Envoie Hello ESP32!\n") while True: if ser.in_waiting > 0: # Si des données sont reçues received = ser.readline().decode('utf-8').strip() # Lire et décoder le> print("Reçu de l'ESP32:", received) time.sleep(0.008) ser.write(b"OK!\n") #print("Bien recu du Raspberry!\n") ==== Code C-Arduino sur ESP32 ==== #define RXD2 16 #define TXD2 17 #define GPS_BAUDS 115200 //HardwareSerial gpsSerial(2); HardwareSerial mySerial(2); int counter = 0; void setup() { Serial.begin(115200); mySerial.begin(GPS_BAUDS, SERIAL_8N1, RXD2, TXD2); Serial.println("Serial 2 demarre en 115200 Bds"); } void loop() { while (mySerial.available() > 0) { char gpsData = mySerial.read(); Serial.println(gpsData); } delay(3); //Serial.println("--------------------------------------------"); mySerial.println(String(counter)); if (counter == 1000){ counter = 0; } //Serial.println("Envoie: UART2 " + String(counter)); counter++; delay(0.005); }