Arduino: Communication IIC
📁 Structure des fichiers
IIC_Voice/
├── IIC_Voice.ino # Programme principal
├── bsp_iic.hpp # Fichier d'en-tête (adresses et déclarations de fonctions)
├── bsp_iic.cpp # Fichier d'implémentation
└── README.md # Ce tutoriel🔌 Connexion matérielle

🔧 Compilation et téléversement
Étape 1 : ouvrir l'IDE Arduino
Ouvrez le fichier
IIC_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 :
IIC Voice Module Initialized
Prononcez 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📚 Mappage des registres
📚 Description de l'interface BSP
IIC_Init()
void IIC_Init(void);Fonction : initialise le bus I2C
Exemple :
void setup() {
IIC_Init();
}IIC_ReadCommand()
int IIC_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- erreur de communication
Exemple :
int id = IIC_ReadCommand();
if (id > 0) {
Serial.print("识别到命令: ");
Serial.println(id);
}IIC_SetPassiveVoice()
void IIC_SetPassiveVoice(uint8_t voiceID);Fonction : définit la phrase de diffusion passive
Paramètres :
0x00- type de phrase de diffusion passive
Exemple :
IIC_SetPassiveVoice(0x00);
delay(200);IIC_SetFunctionVoice()
void IIC_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 :
IIC_SetFunctionVoice(0x00);
delay(200);IIC_SetCommandVoice()
void IIC_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 :
IIC_SetCommandVoice(0x00);
delay(200);🎯 Description de la logique du programme principal
void setup() {
Serial.begin(115200);
IIC_Init();
Serial.println("IIC Voice Module Initialized");
IIC_SetCommandVoice(0x00); // Diffuser la voix du mot de commande à la mise sous tension
delay(200);
}
void loop() {
int commandId = IIC_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) {
IIC_SetCommandVoice(0x00); // Commande 1 reconnue, diffuser la voix du mot de commande
} else if (commandId == 2) {
IIC_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
}
}
} else {
Serial.println("IIC Read Error");
delay(1000);
}
delay(50);
}🔍 Dépannage
Q1 : le port série n'affiche que "IIC Read Error"
Causes possibles :
Câblage incorrect, non connecté
Le module n'est pas alimenté
Adresse I2C incorrecte
Solutions :
Vérifiez si SDA/SCL sont inversés
Vérifiez si les masses sont communes
Vérifiez si l'alimentation 5V est normale
Utilisez un programme de scan I2C pour confirmer l'adresse du dispositif
Q2 : aucune sortie
Causes possibles :
Débit en bauds du port série incorrect
Le module n'est pas réveillé
Solutions :
Confirmez que le débit en bauds du port série est 115200
Dites d'abord le mot de réveil, puis les mots de commande
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_iic.hpp - ne consulte que les déclarations, pas l'implémentation
bsp_iic.cpp - les détails concrets de l'implémentation
IIC_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_iic.cpp ; le programme principal n'a pas besoin d'être modifié.
Facilité de maintenance
Les modifications du code lié à l'I2C se font uniquement dans bsp_iic.cpp ; une seule modification, effective partout.
🚀 Exemples de fonctions étendues
Exemple 1 : déclencher une diffusion différente selon la commande
if (commandId == 1) {
IIC_SetCommandVoice(0x00); // Diffuser le mot de commande
} else if (commandId == 2) {
IIC_SetFunctionVoice(0x00); // Diffuser le mot de fonction
} else if (commandId == 3) {
IIC_SetPassiveVoice(0x00); // Diffuser la voix passive
}Exemple 2 : contrôler une LED
if (commandId == 10) {
digitalWrite(LED_PIN, LOW); // Éteindre la lumière
IIC_SetCommandVoice(0x00); // Diffuser la confirmation
}Exemple 3 : contrôler un moteur
if (commandId == 11) {
motor_stop();
IIC_SetCommandVoice(0x00); // Diffuser la confirmation
}
