TP
| Site: | Le labo numérique de M. MIGNOTTE – Cours, projets et ressources pour les élèves de seconde SNT et STI2D |
| Cours: | Chapitre 6 : Python |
| Livre: | TP |
| Imprimé par: | Visiteur anonyme |
| Date: | samedi 14 mars 2026, 07:00 |
Description
Niveau : Terminale STI2D - SIN / 2I2D
Durée : 2h (séance unique + extensions possibles)
Prérequis :
- Bases Python
- Notions de programmation orientée objet
- Connaissances en domotique (séance lave-vitre conseillée)
Matériel nécessaire :
- Robot NAO (V5 ou V6)
- Ordinateur avec Choregraphe installé
- Accès réseau Wi-Fi
- Box domotique (ou simulation)
Objectif : Transformer NAO en assistant domotique capable d'interagir avec les systèmes de la maison connectée
Compétences visées
- CO2.1 : Identifier les grandeurs agissant sur un système robotique
- CO5.2 : Simuler et mesurer le comportement d'un robot
- CO6.1 : Valider une solution d'interaction homme-machine
- CO7.1 : Concevoir une architecture de communication multi-systèmes
- IA & Robotique : Programmer une intelligence artificielle conversationnelle
- Domotique : Créer un hub de contrôle vocal
1. Contexte et problématique
Mise en situation
Le robot humanoïde NAO de SoftBank Robotics est utilisé dans de nombreux domaines :
- Éducation (programmation, STEM)
- Assistance aux personnes (autisme, personnes âgées)
- Recherche en robotique
- Et maintenant : domotique !
Dans votre maison connectée, vous avez déjà intégré :
- Le lave-vitre DMS
- Le chariot de golf
- Des capteurs divers
- Une box domotique
Problématique
Comment utiliser NAO comme interface naturelle (vocale et gestuelle) pour contrôler et superviser tous les systèmes domotiques de la maison ?
Objectifs de la séance :
- Découvrir les capacités de NAO (capteurs, actionneurs, IA)
- Programmer NAO en Python pour la domotique
- Créer des interactions vocales et gestuelles
- Intégrer NAO dans l'écosystème domotique existant
2. PARTIE 1 : Découverte de NAO et ses capacités (30 min)
Activité 1.1 : Anatomie et capacités de NAO
Document ressource : Schéma de NAO à compléter

Question 1 : Complétez le tableau des capteurs et actionneurs de NAO

Activité 1.2 : NAO vs autres interfaces domotiques
Question 2 : Comparez NAO avec d'autres interfaces de contrôle domotique

Points spécifiques à NAO :
- ✅ Mobilité (peut se déplacer)
- ✅ Interaction naturelle (voix + gestes)
- ✅ Présence sociale (humanoïde)
- ✅ Retour visuel (expressions, LED)
- ❌ Coût élevé
- ❌ Autonomie limitée
- ❌ Complexité de programmation
Activité 1.3 : Cas d'usage de NAO en domotique
Question 3 : Imaginez 5 scénarios d'utilisation de NAO comme assistant domotique
Exemple 1 : Réveil intelligent
7h00 → NAO se déplace vers la chambre
→ Allume progressivement la lumière
→ "Bonjour ! Il est 7h00, il fait 18°C dehors"
→ Ouvre les volets
→ Lance la cafetièreÀ compléter (4 scénarios supplémentaires) :
Scénario 2 : Accueil visiteur
- ...
Scénario 3 : Surveillance maison
- ...
Scénario 4 : Assistance personne âgée
- ...
Scénario 5 : Contrôle vocal multi-systèmes
- ...
3. PARTIE 2
1. Traduction en diagramme de blocs
Dans Choregraphe, vous allez glisser-déposer les boîtes suivantes et les relier en série :
Bloc [Wake Up] : (Dossier Motion) – Équivalent à
motion.wakeUp(). Il met les moteurs sous tension.Bloc [Stand Up] : (Dossier Motion) – Équivalent à
posture.goToPosture("Stand", 0.5).Bloc [Animated Say] : (Dossier Audio > Voice) – C'est ici que vous combinez le texte et le geste.
Texte à saisir :
^start(animations/Stand/Gestures/Hey_1) Bonjour ! Je suis NAO, votre assistant domotique.Note : Utiliser
Animated Sayremplace avantageusement vos lignesmotion.setAnglescar le mouvement est plus fluide et synchronisé avec la parole.
Bloc [Set LEDs] : (Dossier LEDs) – Cliquez sur la boîte pour choisir la couleur Bleu (
0x0000FF) et la zoneFaceLeds.Bloc [Say] : Pour la phrase finale : "Je peux contrôler les lumières, le chauffage, et tous vos objets connectés."
4. PARTIE 3
1. Traduction en diagramme de blocs (Flow Diagram)
Dans Choregraphe, au lieu d'une boucle while True manuelle, on utilise des événements. Voici l'enchaînement idéal :
Bloc [Set Language] : Réglez sur "French".
Bloc [Speech Reco] :
C'est l'équivalent de votre fonction
configurer_reconnaissance_vocale.Paramètres : Cliquez sur la clé à molette et insérez votre liste de mots : allume la lumière, éteins la lumière, lance le lave-vitre, etc.
Seuil (Confidence) : Réglez-le à 40% (0.4) comme dans votre code.
Bloc [Switch Case] :
Reliez la sortie
onWordRecognizeddu bloc précédent à l'entrée du Switch.Créez une sortie pour chaque commande (ex:
"allume la lumière").
Blocs [Animated Say] :
Reliez chaque sortie du Switch à une réponse vocale spécifique.
5. PARTIE 4 HISTOIRE
Voici comment structurer votre programme pour que NAO réponde à des dates de l'histoire de France en utilisant la logique visuelle de Choregraphe :
1. Structure globale (Le "Flow Diagram")
Dans votre fenêtre principale, vous devez enchaîner ces blocs :
Bloc [Set Language] : Réglez-le sur "French".
Bloc [Animated Say] : Pour que NAO dise "Bonjour, posez-moi une question sur une date de l'histoire de France".
Bloc [Dialog] : C'est ici que toute l'intelligence réside.
2. Configuration du bloc "Dialog" (Le cœur du programme)
Le bloc Dialog ne se contente pas de "dire", il "écoute" et "analyse". Voici comment le remplir :
Créez un nouveau Topic nommé
HistoireFranceen français.Copiez ce code à l'intérieur de l'éditeur du bloc :
topic: ~HistoireFrance()
language: frf
# On définit des concepts pour plus de souplesse
concept:(quand) [quand "en quelle année" "c'était quand"]
# Réponses aux questions
u:(~quand est-ce que Clovis a été baptisé) Le baptême de Clovis a eu lieu aux alentours de l'an 496.
u:(~quand a eu lieu la bataille de Marignan) La célèbre bataille de Marignan s'est déroulée en 1515.
u:(~quand a débuté la Révolution française) La Révolution a commencé en 1789 avec la prise de la Bastille.
u:(~quand a été proclamée la 5ème République) Elle a été proclamée le 4 octobre 1958.
# Si NAO ne comprend pas
u:(e:Dialog/NoMatch) Je ne connais pas encore cette date, mais je peux vous parler de 1515 ou de 1789.
6. PARTIE 5
1. Architecture en Blocs Choregraphe
Puisque Choregraphe ne gère pas nativement le protocole MQTT, la meilleure approche est d'utiliser une boîte Python personnalisée qui servira de "pont" entre le réseau et les mouvements du robot.
La boîte "MQTT Supervisor"
Créez une nouvelle boîte de type Script (Python).
Ajoutez-lui deux entrées :
onStart(pour lancer la surveillance) etonStop.Ajoutez-lui plusieurs sorties :
onStatusUpdate(pour les messages normaux),onError(pour les alertes) etonFinished.
Le flux visuel (Flow Diagram)
Entrée du programme ➔ Bloc [Animated Say] ("Je vais surveiller le lave-vitre").
Animated Say ➔ Bloc [MQTT Supervisor].
Sortie
onStatusUpdate➔ Bloc [Set LEDs] (Vert) + Bloc [Say] (Le message d'état).Sortie
onError➔ Bloc [Set LEDs] (Rouge) + Bloc [Animated Say] (L'alerte avec geste).
2. Le script Python optimisé pour le bloc Choregraphe
Voici comment adapter votre code pour qu'il s'insère parfaitement dans une boîte Choregraphe. Ce code utilise la bibliothèque paho-mqtt que vous devrez peut-être installer sur votre environnement.
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
self.mqtt_client = None
def onLoad(self):
import paho.mqtt.client as mqtt
self.mqtt_client = mqtt.Client("NAO_Supervisor")
self.mqtt_client.on_message = self.on_message_lavevitre
self.mqtt_client.connect("192.168.1.100", 1883, 60)
def onUnload(self):
if self.mqtt_client:
self.mqtt_client.loop_stop()
self.mqtt_client.disconnect()
def onInput_onStart(self):
self.mqtt_client.subscribe("maison/exterieur/lavevitre/#")
self.mqtt_client.loop_start()
# Envoyer la commande de départ
self.mqtt_client.publish("maison/exterieur/lavevitre/commande/start", "1")
self.onStart() # Sortie standard de la boîte
def on_message_lavevitre(self, client, userdata, message):
payload = message.payload.decode()
if "etat" in message.topic:
# On envoie le texte vers la sortie de la boîte pour que NAO le dise
self.onStatusUpdate(payload)
elif "erreur" in message.topic and payload != "aucune":
self.onError(payload)
def onInput_onStop(self):
self.onUnload()
self.onStopped()