SCIENCES DE L'INGENIEUR

Niveau : Terminale générale, enseignement de spécialité SI

D
É
C
O
N
N
E
C
T
É

TP - Analyse des trames envoyées à un robot

photo du robot alphai

Objectifs

Matériel requis

Étape 1 - Préparation

  1. Exécuter l'application Thonny.
  2. Installer le "plugin" alphai-api
    • Rechercher alphai-api sur PyPI
    • Installer-le
    • Il doit maintenant se trouver dans la liste des paquets
  3. Dans le menu exécuter, cliquer sur Configurer l'interpréteur... et sélectionner Local Python 3.
  4. Créer un nouveau fichier Python avec le contenu suivant :
    import alphai
    alphai.motor(-20, 30, 1.5)
    

    Chaque commande correspond à une vitesse des moteurs gauche et droit (de -50 à +50) et une durée en secondes. Si la durée n'ai pas précisée elle sera égale à None (aucune)

  5. Se connecter au réseau wifi ALPHAI-000xxx où xxx est le numéro du robot.

    le mot de passe du réseau est le même que le nom du réseau (majuscules à respecter).
  6. Exécuter l'application alphai.

    Sélectionner le robot en mode Wifi, pas en Bluetooth.
  7. Dans le menu Fichier sélectionner Configurations d'exemples, puis choisir télécommande.

Étape 2 - Observation des trames avec Wireshark

  1. Ouvrir Wireshark .
  2. Sélectionner l’interface réseau wifi utilisée en cliquant sur l'icone option .
  3. Réorganiser les fenêtres pour avoir wireshark à coté de Thonny.
  4. Cliquer sur démarrer dans le choix de l'interface de wireshark, et dans la foulée, exécuter le programme Python, puis appuyer sur l'icone stop dans wireshark pour ne pas voir trop de trames.
  5. Classer les trames par longueur croissante en cliquant sur la colonne Length.
  6. Identifier les trames de 74 octets (correspondant aux commandes envoyées).

Étape 3 - Analyse de la trame TCP

La premère trame de 74 octets est issue de l'importation de Alphai qui met les moteurs à la valeur 0.

Sélectionner la deuxième trame issue de la commande alphai.motor(-20,30,1.5)

Compléter les champs manquants du tableau

Depuis la capture ci-dessus, remplir le tableau suivant, permettant de comprendre la trame TCP.

Entête Ethernet II
adresse mac source (6 octets)
adresse mac destination (6)
type de paquet (2)
Entête IP
version (½)
 
longueur Entête (½)
type de service (1)
longueur totale du datagramme (2)
Identification (2)
drapeaux (1)
Décalage (1)
Durée de vie (1)
Protocole (1)
contrôle des entêtes (2)
Adresse IP Source (4)
Adresse IP destination (4)
Tansmission Control Protocol (TCP encapsulée)
Port source (2) Port destination (2)
Numéro de séquence (4)
Numéro d'acquitement (4)
Etc ...
Data
.....set motors....
Vitesse MotG
Vitesse MotD
durée

Relever l'adresse IP source et destinataire de la trame et la convertir en décimal.

Exécuter powershell et entrer la commande ipconfig Entrée

Relever l'adresse IP du PC et son masque de sous-réseau, puis déterminer l'adresse du réseau. Montrer que le robot est dans le même réseau que le PC.

Chaque trame contient une commande texte ASCII (set motors) suivie de 4 octets de données :

  • Octet 1 : Vitesse moteur gauche (signé, de -127 à +127)
  • Octet 2 : Vitesse moteur droit (signé, de -127 à +127)
  • Octets 3-4 : Durée (en millisecondes, format Little Endian)

Codage des vitesses

Valeur programméeValeur transmise au robotHex (signé)
-50-12781
-20
0000
30
501277F

Déterminer le coeficient directeur de cette droite linéaire ($"valeur transmise" = a xx "valeur programmée"$), puis calculer les valeurs manquantes et compléter le tableau ci-dessus.

$a=?$

Vérifier que vos valeurs coïncident avec celles de la trame.

Codage de la durée

La durée est transmise en ms au format little endian.

exemple : Durée : 1 s = 1000 ms = 03EB(16) = EB 03 en little endian.

Décoder le temps envoyé au robot dans la trame (au format little endian) pour la durée de 1,5 s, puis vérifier que cela correspond bien à la commande Python.

Octets durée, envoyé en hexa :

Travail à faire

  1. Placer le robot au sol.
  2. Rechercher les valeurs décimales à programmer pour que le robot avance en ligne doite pendant 2s à sa vitesse maximale. Vous ferez ensuite la même chose pour la marche arrière.
    On pourra utiliser des nombres réels (float) pour affiner les trajectoires.
  3. import alphai
    while True:
        # Acquerir les puissances moteurs G et D ainsi que la durée en secondes.
        mg=float(input ("puissance motG : "))
        md=float(input ("puissance motD : "))
        d=float(input ("puissance durée : "))
        if mg>0:
            # Si mg est positif on prépare le moteur à aller vers l'avant et on l'arrête à la fin du mouvement.
            alphai.motor(1, 1, 0.5)
            alphai.motor(mg,md, d)
            # freinage du robot
            alphai.motor(1, 1, 0.5)
        else :
            alphai.motor(-1, -1, 0.5)
            alphai.motor(mg,md, d)
            alphai.motor(-1, -1, 0.5)
  4. Capturer les trames dans Wireshark et relever les valeurs hexadécimales envoyées au robot pour les deux sens de marche.

Fond : Texte : Tables :