Assistant IA Pour Arduino - Raspberry Pi 4

by mouaad el jallab in Circuits > Arduino

46 Views, 0 Favorites, 0 Comments

Assistant IA Pour Arduino - Raspberry Pi 4

MAQUETTE.PNG
Capture d'écran 2026-06-08 152501.png

Ce projet a été développé au sein de l'Orange Digital Center Maroc, un espace dédié à la promotion de l'innovation, de la créativité et du prototypage rapide. Au FabLab, les individus et les équipes ont accès à des outils de pointe, y compris des imprimantes 3D, des découpeuses laser et une variété de ressources électroniques et mécaniques. Le centre offre un environnement collaboratif où les innovateurs, entrepreneurs et étudiants peuvent transformer leurs idées en produits tangibles, en se concentrant sur des solutions durables et ayant un impact.

Ce projet a été développé pour créer un Assistant Pédagogique Intelligent et Vocal dédié à l'apprentissage de l'électronique et de la programmation Arduino. En combinant la flexibilité d'un Raspberry Pi 4 pour la gestion matérielle et la puissance de l'API Gemini pour le traitement du langage, cet assistant interagit de vive voix pour guider les étudiants, générer du code et débugger des circuits en temps réel.


Supplies

RASP_PI_4_B_01_ANW.png
Capture d'écran 2026-06-08 151909.png
Capture d'écran 2026-06-08 152013.png
Capture d'écran 2026-06-08 152126.png

Fournitures

Composants Matériels

Raspberry Pi 4 (Toutes versions de RAM) : Comme le modèle tourne sur le cloud, même une version 2GB ou 4GB de RAM est largement suffisante.

Haut-parleur : Pour restituer les explications de l'assistant.

Carte MicroSD (16GB ou supérieure) : Pour stocker le système d'exploitation et les scripts Python.

Alimentation Fiable (5V 3A Type-C)

Connexion Internet (Wi-Fi ou Ethernet) : Obligatoire dans cette configuration pour communiquer avec l'API Gemini.

Arduino Uno : C'est la carte microcontrôleur principale qui exécute le programme informatique, reçoit les informations des capteurs et commande les actionneurs.

Capteur à ultrasons (HC-SR04) : Ce composant mesure la distance d'un objet en émettant une onde sonore inaudible et en calculant le temps qu'elle met à revenir.

Platine d'essai (Breadboard) : C'est une plaque de prototypage qui permet de connecter et de tester rapidement les circuits électroniques entre eux sans faire de soudure.

Potentiomètre : Il s'agit d'une résistance variable manuelle (comme un bouton de volume) qui envoie une tension électrique ajustable à l'Arduino pour faire varier un paramètre.

Diode LED : Ce composant électronique émet de la lumière dès qu'il est traversé par un courant électrique, servant généralement d'indicateur visuel d'état.

Servo-moteur (SG90) : C'est un petit moteur intelligent capable de tourner et de maintenir son axe dans une position angulaire très précise, généralement entre 0° et 180°.

  1. Bouton-poussoir : Ce commutateur mécanique permet d'ouvrir ou de fermer temporairement un circuit électrique pour envoyer un signal logique (0 ou 1) à l'Arduino lors d'un appui.

Configuration Du Raspberry Pi 4

Capture d'écran 2026-06-08 152410.png
  1. Télécharge Raspberry Pi Imager et flashe Raspberry Pi OS (64-bit) sur ta carte MicroSD.
  2. Avant d'écrire, accède aux options avancées (icône de rouage) :
  3. Active le SSH.
  4. Configure tes identifiants Wi-Fi.
  5. Insère la carte dans le Pi, démarre-le, et connecte-toi à distance depuis ton PC via ton terminal :

Bash


ssh ton_pseudo@raspberrypi.local


Clé D'API Gemini Et Dépendances

Capture d'écran 2026-06-08 152544.png

2.1 Obtenir une clé API (Méthode d'obtention de la clé gratuite)

Pour interconnecter le Raspberry Pi 4 au modèle de traitement du langage naturel, l'obtention d'une clé d'authentification sécurisée et gratuite a été réalisée sur la plateforme Google AI Studio selon la démarche suivante :

  1. Connexion à la plateforme : Accès au portail des développeurs via l'URL Google AI Studio et authentification à l'aide d'un compte Google standard.
  2. Création du projet de développement : Depuis le tableau de bord principal, sélection de l'option « Create API Key » (Créer une clé API).
  3. Sélection du modèle de tarification (Gratuit) : Lors de la génération, le choix s'est porté sur l'option « Create API key in a new project » sous le plan de tarification gratuit (Free Tier). Ce plan offre un quota suffisant pour un usage pédagogique et de laboratoire (jusqu'à 15 requêtes par minute avec le modèle gemini-1.5-flash), sans nécessiter l'introduction d'une carte bancaire.
  4. Sécurisation de la clé : Une fois la clé alphanumérique unique générée, elle a été copiée puis directement intégrée dans l'environnement local du Raspberry Pi sous la forme d'une variable d'environnement masquée dans un fichier .env (GEMINI_API_KEY=xxxxx), garantissant ainsi la sécurité du code source face aux risques de fuite sur les dépôts publics.

.

2.2 Installation des paquets système et Python

Mets à jour le système et installe les outils de gestion audio et la bibliothèque officielle de Google :

Bash


sudo apt update && sudo apt upgrade -y
sudo apt install python3 python3-pip python3-pyaudio mpv -y

Installe la bibliothèque de l'API Gemini (google-genai ou google-generativeai) et les utilitaires de gestion d'environnement :

Bash


pip3 install google-generativeai speech_recognition gTTS python-dotenv

Structure Du Code Source (API Gemini)

Crée un fichier nommé .env dans le dossier de ton projet pour y cacher ta clé en toute sécurité :

Extrait de code


GEMINI_API_KEY="AIzaSyYourActualKeyHere..."

Le Code Principal (main.py)

Ce script gère l'écoute, l'envoi de la question à Gemini en conservant l'historique (grâce au mode start_chat), et la synthèse vocale.

Python


import os
import time
import speech_recognition as sr
import google.generativeai as genai
from gtts import gTTS
from dotenv import load_dotenv

# Charger la clé API
load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))

# Initialiser le modèle Gemini (le modèle Flash est idéal pour la rapidité d'un assistant vocal)
model = genai.GenerativeModel(
model_name="gemini-1.5-flash",
system_instruction=(
"Tu es un tuteur vocal expert en Arduino. L'étudiant travaille sur son circuit. "
"Donne des réponses courtes, directes et faciles à comprendre à l'audition. "
"Explique les branchements broche par broche de manière simple. Évite les trop longs blocs "
"de code compliqués à lister à l'oral."
)
)

# Initialiser une session de chat pour garder l'historique de la conversation
chat = model.start_chat(history=[])

def parler(texte_reponse):
"""Convertit le texte en parole et le joue sur le haut-parleur."""
print(f"Assistant: {texte_reponse}")
tts = gTTS(text=texte_reponse, lang='fr')
tts.save("reponse.mpv")
os.system("mpv --no-video reponse.mpv > /dev/null 2>&1")

def ecouter_etudiant():
"""Capture l'audio du micro et le transforme en texte."""
recognizer = sr.Recognizer()
with sr.Microphone() as source:
print("\n[Écoute en cours...] Posez votre question sur Arduino...")
recognizer.adjust_for_ambient_noise(source, duration=1)
try:
audio = recognizer.listen(source, timeout=8)
texte = recognizer.recognize_google(audio, language='fr-FR')
print(f"Vous avez dit: {texte}")
return texte
except sr.UnknownValueError:
return None
except Exception as e:
print(f"Erreur microphone: {e}")
return None

if __name__ == "__main__":
parler("Bonjour ! Je suis votre assistant Arduino. En quoi puis-je vous aider aujourd'hui ?")
while True:
question = ecouter_etudiant()
if question:
if "quitter" in question.lower() or "stop" in question.lower():
parler("Au revoir et bon prototypage ! Bon courage pour votre projet.")
break
# Envoyer la question à l'API Gemini en conservant le contexte
try:
response = chat.send_message(question)
parler(response.text)
except Exception as e:
print(f"Erreur API Gemini: {e}")
parler("Désolé, j'ai rencontré un problème pour me connecter à mon serveur.")
time.sleep(0.5)


Design Et Impression 3D Du Boîtier(Tinkercad)

3D.PNG

Comme il n'y a pas d'écran sur ton projet, tu as l'avantage de pouvoir imprimer un boîtier très compact et esthétique. Tu peux lui donner une forme de borne cylindrique ou de petite enceinte de labo.

Fichiers STL à préparer pour l'impression :

  1. Base_Boitier_RPI4.stl : Contient les fixations pour maintenir la carte Raspberry Pi 4 bien en place.
  2. Couvercle_Ventile.stl : Un top surélevé muni d'une grille pour laisser sortir le son du haut-parleur et laisser respirer le Pi.
  3. Clip_Micro_Frontal.stl : Un petit support externe pour bloquer la tête du microphone USB vers l'avant de la station.


Downloads

Conception De L'Interface Utilisateur (Dashboard Web)

Screenshot (289).png
chatbot.PNG

Pour offrir un support visuel en plus de la voix (notamment pour copier les blocs de code C++), une interface web légère a été développée :

Dans cette interface de projet, nous avons conçu une plateforme qui permet d’expliquer les exercices Arduino de manière progressive, en les classant selon différents niveaux de difficulté (débutant, intermédiaire et avancé). Chaque exercice est accompagné d’une explication claire, du schéma du circuit et du code correspondant, afin d’aider l’utilisateur à bien comprendre le fonctionnement. L’utilisateur peut ensuite tester ces exercices par lui-même, valider ses acquis et avancer étape par étape dans le parcours, ce qui rend l’apprentissage interactif, pratique et adapté à son niveau.

1. Création du Serveur Web Back-end (Flask)

La mise en place du serveur back-end repose sur le micro-framework Flask en Python. Son rôle est de s'exécuter en arrière-plan sur le Raspberry Pi pour orchestrer les requêtes de l'API Gemini, gérer l'historique du chat et exposer une API locale pour l'interface graphique.

La création de ce serveur s'est déroulée selon les étapes suivantes :

  1. Étape 1 : Initialisation de l'application et des variables globales Le script instancie l'application Flask (app = Flask(__name__)) et définit deux variables globales partagées : messages_history (une liste de dictionnaires stockant le rôle 'user' ou 'assistant' et le texte) et system_status (une chaîne de caractères indiquant l'état en temps réel du script comme "En écoute", "Appel API", ou "En attente").
  2. Étape 2 : Développement des Routes Web (End-points) Deux routes principales ont été programmées pour structurer l'architecture :
  3. La route d'affichage (/) : Elle intercepte l'accès à l'adresse IP du Raspberry Pi (ex: http://192.168.1.X:5000) et renvoie le squelette de l'interface graphique (le code HTML/CSS/JavaScript).
  4. La route API (/api/data) : C'est une route au format JSON qui renvoie dynamiquement l'état du système et l'historique mis à jour. Elle permet à l'interface client de venir récupérer les nouvelles données sans recharger la page.
  5. Étape 3 : Programmation du Threading Parallèle Flask étant par nature bloquant lorsqu'il attend des connexions web, il était impossible de faire tourner la boucle d'écoute vocale (STT/API Gemini/TTS) sur le même fil d'exécution. La solution a été d'utiliser la bibliothèque native threading. La fonction gérant le microphone et l'IA est lancée dans un thread esclave (Daemon Thread), ce qui lui permet de s'exécuter en parallèle du serveur web Flask sans bloquer ce dernier.
  6. Étape 4 : Déploiement et Ouverture Réseau Pour rendre l'interface accessible depuis n'importe quel ordinateur ou smartphone du laboratoire connecté au même réseau Wi-Fi, le serveur a été configuré pour écouter sur l'adresse IP universelle 0.0.0.0 sur le port standard 5000 :
  7. Design du tableau de bord (Front-end) : Développement d'une page HTML/CSS épurée et moderne. Cette interface affiche :
  8. Un indicateur visuel de l'état du microphone (En écoute / En attente).
  9. Une boîte de dialogue de type "Chatbot" affichant la transcription textuelle de la question de l'étudiant.
  10. Un bloc de texte formaté avec coloration syntaxique pour afficher proprement le code Arduino renvoyé par Gemini.

Exécution

Pour tester ton assistant vocal connecté à Gemini, lance simplement la commande suivante dans ton terminal SSH :

Bash


python3 main.py

Les avantages de cette configuration finale :

  1. Temps de réponse (Latence) : Le modèle Gemini 1.5 Flash répond en moins d'une seconde, bien plus vite qu'un modèle local lourd sur Raspberry Pi.
  2. Qualité des réponses : Gemini possède une connaissance encyclopédique de l'écosystème Arduino, du code C++ et de la résolution de bugs électroniques.
  3. Légèreté matérielle : Ton boîtier reste froid, consomme moins d'énergie, et le système reste simple à maintenir.