Arduino: Communication par port série
📁 Structure des fichiers
UART_Voice/
├── UART_Voice.ino # Programme principal
├── bsp_uart.hpp # Fichier d'en-tête (trames de protocole et déclarations de fonctions)
├── bsp_uart.cpp # Fichier d'implémentation
└── README.md # Ce tutoriel🔌 Connexion matérielle
Connexion au module vocal
💡 Attention : RX et TX doivent être croisés !

🔧 Compilation et téléversement
Étape 1 : ouvrir l'IDE Arduino
Ouvrez le fichier
UART_Voice.inoSélectionnez le modèle de votre carte de développement (par exemple Arduino Uno)
Sélectionnez le port série correspondant
Étape 2 : compiler et téléverser
Cliquez sur le bouton ✔️ pour compiler
Cliquez sur le bouton ➡️ pour téléverser vers la carte de développement
📡 Test du port série
Ouvrir le moniteur série de l'IDE Arduino
Débit en bauds : 115200
Caractère de fin : Aucun
Sortie attendue
Après la mise sous tension, vous devriez voir :
UART Voice Module InitializedPrononcez le mot de réveil et les mots de commande vers le module, et les ID correspondants seront affichés :
ID: 1
ID: 2
ID: 10📚 Format de la trame de protocole
Exemple : ID de commande lu = 10
FE EF 00 0A EEExemple : envoi de la diffusion d'un mot de commande
FE EF D3 00 EE📚 Description de l'interface BSP
UART_Init()
void UART_Init(void);Fonction : initialise le port série (débit en bauds 115200)
Exemple :
void setup() {
UART_Init();
}UART_ReadCommand()
int UART_ReadCommand(void);
Fonction : lit l'ID de commande reconnu par le module vocal
Valeur de retour :
0- aucune commande reconnue1~254- ID de commande-1- pas de nouvelles données
Exemple :
int id = UART_ReadCommand();
if (id > 0) {
Serial.print("识别到命令: ");
Serial.println(id);
}UART_SetPassiveVoice()
void UART_SetPassiveVoice(uint8_t voiceID);Fonction : définit la phrase de diffusion passive
Paramètres :
0x00- type de phrase de diffusion passive
Exemple :
UART_SetPassiveVoice(0x00);
delay(200);UART_SetFunctionVoice()
void UART_SetFunctionVoice(uint8_t voiceID);Fonction : définit la phrase de diffusion de mot de fonction
Paramètres :
0x00- type de phrase de diffusion de mot de fonction
Exemple :
UART_SetFunctionVoice(0x00);
delay(200);UART_SetCommandVoice()
void UART_SetCommandVoice(uint8_t voiceID);Fonction : définit la phrase de diffusion de mot de commande
Paramètres :
0x00- type de phrase de diffusion de mot de commande
Exemple :
UART_SetCommandVoice(0x00);
delay(200);🎯 Description de la logique du programme principal
void setup() {
Serial.begin(115200);
UART_Init();
Serial.println("UART Voice Module Initialized");
UART_SetCommandVoice(0x00); // Diffuser la voix du mot de commande à la mise sous tension
delay(200);
}
void loop() {
int commandId = UART_ReadCommand();
if (commandId >= 0) {
// Filtrer les valeurs invalides pour éviter les sorties en double
if (commandId != 0 && commandId != 255 && commandId != lastCommandId) {
Serial.print("ID: ");
Serial.println(commandId);
lastCommandId = commandId;
// Exemple : contrôler la diffusion selon la commande reconnue
if (commandId == 1) {
UART_SetCommandVoice(0x00); // Commande 1 reconnue, diffuser la voix du mot de commande
} else if (commandId == 2) {
UART_SetCommandVoice(0x00); // Commande 2 reconnue, diffuser la voix du mot de commande
}
} else if (commandId == 0 || commandId == 255) {
if (lastCommandId != 0) {
lastCommandId = 0; // Réinitialiser l'état
}
}
}
delay(50);
}🔍 Dépannage
Q1 : aucune sortie
Causes possibles :
RX/TX sont inversés
GND n'est pas relié à la masse commune
Le module n'est pas alimenté
Débit en bauds incorrect
Solutions :
Confirmez que D10 est connecté au TX du module et D11 au RX du module (connexion croisée)
Confirmez la connexion GND
Confirmez que l'alimentation 5V est normale
Confirmez que le débit en bauds du port série est 115200
Q2 : le port série n'affiche que des caractères illisibles
Causes possibles :
Débit en bauds non correspondant
L'alimentation du module est anormale
Solutions :
Confirmez que le débit en bauds du moniteur série est 115200
Appuyez sur le bouton de réinitialisation du module
Q3 : la sortie affiche "ID: 255" ou "ID: 0"
Remarque : c'est un phénomène normal
0= aucune commande reconnue255= pas de nouvelles données
Ces valeurs sont déjà filtrées dans le code et ne seront normalement pas affichées. Si vous les voyez s'afficher, cela signifie que le code n'a pas pris effet.
💡 Avantages de l'architecture BSP
Une séparation claire des couches de code
bsp_uart.hpp - ne consulte que les déclarations, pas l'implémentation
bsp_uart.cpp - les détails concrets de l'implémentation
UART_Voice.ino - ne s'occupe que de la logique métier
Facilité de portage
Si vous passez à une autre plateforme (comme STM32, ESP32), il suffit de modifier l'implémentation de bsp_uart.cpp ; le programme principal n'a pas besoin d'être modifié.
Facilité de maintenance
Les modifications du code lié à l'UART se font uniquement dans bsp_uart.cpp ; une seule modification, effective partout.
🚀 Exemples de fonctions étendues
Exemple 1 : déclencher une diffusion différente selon la commande
if (commandId == 1) {
UART_SetCommandVoice(0x00); // Diffuser le mot de commande
} else if (commandId == 2) {
UART_SetFunctionVoice(0x00); // Diffuser le mot de fonction
} else if (commandId == 3) {
UART_SetPassiveVoice(0x00); // Diffuser la voix passive
}Exemple 2 : contrôler une LED
if (commandId == 10) {
digitalWrite(LED_PIN, LOW); // Éteindre la lumière
UART_SetCommandVoice(0x00); // Diffuser la confirmation
}Exemple 3 : contrôler un moteur
if (commandId == 11) {
motor_stop();
UART_SetCommandVoice(0x00); // Diffuser la confirmation
}
