Pour connecter un Raspberry Pi 4 à un ESP32 en utilisant le protocole UART (série), voici les étapes détaillées :
- Raspberry Pi 4 - ESP32 - Câbles de connexion (Dupont) - Optionnel : Résistances (si nécessaire pour les niveaux de tension)
Raspberry Pi 4 → ESP32:
OU
Important :
Configuration sur le Raspberry Pi (UART Master) :
1. Activer le port série :
- Ouvrez une terminal et tapez :
sudo raspi-config
2. Vérifiez que le port série fonctionne :
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` :
minicom -b 115200 -o -D /dev/ttyAMAO
1. Utiliser l'IDE Arduino pour programmer l'ESP32 :
2. Code pour l'ESP32 (réception et envoi UART) :
#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.
#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.
Raspberry Pi 4 → ESP32M ←- ESP32E:
#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); }
#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); }
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")
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 :
Terminal ESP32:
- 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.
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")
#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); }