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 :

  1. Découvrir les capacités de NAO (capteurs, actionneurs, IA)
  2. Programmer NAO en Python pour la domotique
  3. Créer des interactions vocales et gestuelles
  4. 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 :

  1. Bloc [Wake Up] : (Dossier Motion) – Équivalent à motion.wakeUp(). Il met les moteurs sous tension.

  2. Bloc [Stand Up] : (Dossier Motion) – Équivalent à posture.goToPosture("Stand", 0.5).

  3. 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 Say remplace avantageusement vos lignes motion.setAngles car le mouvement est plus fluide et synchronisé avec la parole.

  4. Bloc [Set LEDs] : (Dossier LEDs) – Cliquez sur la boîte pour choisir la couleur Bleu (0x0000FF) et la zone FaceLeds.

  5. 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 :

  1. Bloc [Set Language] : Réglez sur "French".

  2. 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.

  3. Bloc [Switch Case] :

    • Reliez la sortie onWordRecognized du bloc précédent à l'entrée du Switch.

    • Créez une sortie pour chaque commande (ex: "allume la lumière").

  4. 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 :

  1. Bloc [Set Language] : Réglez-le sur "French".

  2. Bloc [Animated Say] : Pour que NAO dise "Bonjour, posez-moi une question sur une date de l'histoire de France".

  3. 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 :

  1. Créez un nouveau Topic nommé HistoireFrance en français.

  2. Copiez ce code à l'intérieur de l'éditeur du bloc :

Extrait de code
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"

  1. Créez une nouvelle boîte de type Script (Python).

  2. Ajoutez-lui deux entrées : onStart (pour lancer la surveillance) et onStop.

  3. Ajoutez-lui plusieurs sorties : onStatusUpdate (pour les messages normaux), onError (pour les alertes) et onFinished.

Le flux visuel (Flow Diagram)

  • Entrée du programmeBloc [Animated Say] ("Je vais surveiller le lave-vitre").

  • Animated SayBloc [MQTT Supervisor].

  • Sortie onStatusUpdateBloc [Set LEDs] (Vert) + Bloc [Say] (Le message d'état).

  • Sortie onErrorBloc [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.

Python
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()