Travail à faire

Objectif global

Coder une solution logicielle constituée de 3 applications qui :

  1. Propose une interface homme-machine de pilotage du robot sur PC ou tablette/smarphone qui permet d’envoyer par réseau des commandes de pilotage du robot à la Raspberry Pi

  2. Convertit les commandes de l’interface de pilotage en trames séries

  3. Simule le robot en fonction des trames séries reçues

synoptique ir

Lorsque la solution logicielle sera mise au point, le simulateur de robot sera simplement remplacé par la carte Arduino mise en œuvre par les étudiants EC et qui est en charge de piloter véritablement le robot (déplacement + pince).

Travail commun

Installer l’OS de la Raspberry Pi

  1. Demander à l’enseignant IR une Raspberry Pi de développement. Cette Raspberry Pi sera utilisée en phase de développement logiciel en lieu et place de celle implantée sur le chassis du robot.

    Prendre une Raspberry Pi dont l’identifiant correspond au numéro de votre équipe.

    Ex. : Équipe n°1 ⇒ prendre la Raspberry Pi identifiée RPI01-C12 (et éventuellement la RPI11-C12 si vous souhaitez disposer de 2 Raspberry Pis)

  2. Demander à l’enseignant IR l’image disque compressée de l’OS à flasher sur la carte SD de la Raspberry Pi (→ 2022-09-22-raspios-bullseye-armhf-robocup.img.xz) et la copier sur le disque dur d’un PC Windows

  3. Décompresser l’image disque avec 7-zip

  4. Utiliser Rufus pour flasher la carte SD que vous aurez récupérée AVEC PRÉCAUTION sur votre Raspberry Pi

  5. Nommer votre Raspberry Pi en renseignant le fichier hostname.txt présent dans la partition boot de la carte SD

    Vous nommerez votre Raspberry Pi avec le nom : rpi-robocup-<n°-équipe>.

    Ex. : Équipe n°1 ⇒ nommer la Raspberry Pi avec rpi-robocup-01

  6. Éjecter la carte SD et l’insérer dans la Raspberry Pi

  7. Brancher un câble réseau sur la Raspberry Pi et l’alimenter avec son bloc d’alimentation micro-usb.

  8. Se connecter par SSH à la Raspberry Pi avec Putty en indiquant directement son nom dans le champ “HostName (or IP address)”

Installer NodeRED & NodeJS

  1. Se rendre dans le chapitre Running on Raspberry Pi link sur le site officiel de NodeRED et parcourir la procédure d’installation

  2. Procéder à l’installation en tapant la commande :

    bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

    Comme NodeRED est une application développée avec NodeJS, ce dernier sera automatiquement installé s’il n’est pas déjà présent sur la Raspberry Pi

  3. Suivre éventuellement les indications du message de post-installation pour sécuriser ou affiner le paramétrage de NodeRED

    Message de post-installation

    # WARNING # DO NOT EXPOSE NODE-RED TO THE OPEN INTERNET WITHOUT SECURING IT FIRST

    Even if your Node-RED doesn’t have anything valuable, (automated) attacks will happen and could provide a foothold in your local network

    Follow the guide at https://nodered.org/docs/user-guide/runtime/securing-node-red to setup security.

    ### ADDITIONAL RECOMMENDATIONS ###
    • Remove the /etc/sudoers.d/010_pi-nopasswd file to require entering your password when performing any sudo/root commands:

      sudo rm -f /etc/sudoers.d/010_pi-nopasswd
    • You can customise the initial settings by running:

      node-red admin init
    • After running Node-RED for the first time, change the ownership of the settings file to 'root' to prevent unauthorised changes:

      sudo chown root:root ~/.node-red/settings.js

Installer Qt

Installez Qt même si vous n’êtes pas amenés à développer avec lui sur la Raspberry Pi. Ainsi toutes les Raspberry Pis auront la même configuration.

  1. Depuis la ligne de commande de la Raspberry Pi, taper les commandes suivantes pour installer le framework Qt et QtCreator :

    sudo apt-get update (1)
    sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator (2)
    1 Mise à jour de la base de données des paquets disponibles dans leur dernière version
    2 Installation de Qt
  2. Installer la librairie Qt qui permet d’accéder au port série

    sudo apt-get install libqt5serialport5 libserialport-dev

Travail Équipes N°1,2 et 3 : Solution Qt + NodeRED

Étudiant IR1

Votre mission : Développer une application Qt sur PC qui permet de piloter, via le WiFi, le robot à distance à partir du clavier ou d’un joystick (→ gamepad)

Travail à faire :

  1. Créer une machine virtuelle OpenSUSE ou utiliser celle que vous avez déjà

  2. Installer — depuis YaST — les paquets logiciels du framework Qt :

    • libqt5-creator

    • libqt5-qtbase-devel

    • libqt5-qtdoc

  3. Développer, sur OpenSUSE, une application graphique Qt qui jouera le rôle d’interface homme-machine pour piloter le robot.

    Celle-ci enverra des ordres par réseau (TCP ou UDP) à un serveur s’exécutant sur la Raspberry Pi présente sur le chassis du robot afin de pouvoir le piloter à distance.

    • Vous vous accorderez avec l’étudiant IR2 sur un protocole réseau (TCP ou UDP) pour communiquer ensemble mais aussi sur le format/contenu des messages échangés.

    • En phase de développement, vous pourrez utiliser PacketSender link sur votre PC pour émuler le serveur réseau de la Raspberry Pi en charge de l’étudiant IR2 pour visualiser les trames envoyées par votre application ou simuler les réponses renvoyées par le serveur.

      Pour l’intégration, vous vous connecterez à la Raspberry Pi du robot , configurée en “Hotspot” WiFi à l’aide d’une clé USB WiFi (→ Voir os:rpi:hwt-rpi-network.adoc#hwt-rpi-hotspot pour savoir comment configurer la Raspberry Pi en “Hotspot” WiFi).

    • Pour une communication TCP, vous pouvez vous appuyer sur le code étudié lors de l’activité de communication avec l’afficheur AIVBT (Afficheur Informations Voyageur Bus & Train) :

      git clone https://framagit.org/labworks-bts-sn/qaivbt
    • Pour une communication UDP, vous pouvez vous baser sur le code suivant mis à disposition sur ce dépôt Framagit link

      git clone https://framagit.org/codebase-bts-sn/commudp
  4. Intégrer le code informatique produit avec celui de l’étudiant IR2 c.-à-d. en vérifiant qu’il prend bien en compte les ordres transmis.

Étudiant IR2

Votre mission :

Développer, sur Raspberry Pi, une application console Qt qui :

  1. reçoit les ordres transmis par réseau (TCP ou UDP) depuis l’application de l’étudiant IR1

  2. convertit ces ordres en trames (ASCII ou binaire) avant de les envoyer sur la liaison série.

Travail à faire :

  1. S’accorder avec l’étudiant IR1 sur un protocole réseau (TCP ou UDP) pour communiquer ensemble mais aussi sur le format/contenu des messages échangés.

  2. S’accorder avec l’équipe EC sur le protocole série à utiliser pour déplacer le robot, actionner la pince : délimiteurs de trame, commandes possibles, nombre et valeurs possibles pour les paramètres

  3. Développer, sur Raspberry Pi, une application console Qt qui recevra les ordres transmis par réseau (TCP ou UDP) depuis l’application de l’étudiant n°1 et devra les relayer à la carte Arduino par liaison série en respectant le protocole choisi

    • Pour plus de confort, sachant que d’une part, Qt est multi-platformes et d’autre part, que votre application ne repose pas sur des spécificités de la Raspberry Pi, vous avez la possibilité de développer sur PC avant de transposer votre code sur Raspberry Pi au prix de modifications mineures (ex. : nom du port série différent)

    • Pour la communication série vous pouvez vous appuyer sur le code suivant mis à disposition sur ce dépôt Framagit link

      git clone https://framagit.org/codebase-bts-sn/qseriallogger
    • Pour la mise en oeuvre de la liaison série depuis Qt voir Liaison UART

    • Pour une communication TCP, vous pouvez vous appuyer sur le code étudié lors de l’activité de communication avec l’afficheur AIVBT (Afficheur Informations Voyageur Bus & Train) :

      git clone https://framagit.org/labworks-bts-sn/qaivbt
    • Pour une communication UDP, vous pouvez vous baser sur le code suivant mis à disposition sur ce dépôt Framagit link

      git clone https://framagit.org/codebase-bts-sn/commudp
      commudp
    • En phase de développement, vous pourrez utiliser PacketSender link pour émuler le client réseau, en charge de l’étudiant IR1, afin de tester votre application. La connexion pourra être faite soit par Ethernet soit par WiFi — via une clé USB WiFi — si la Raspberry Pi est configurée en “Hotspot” (→ Voir os:rpi:hwt-rpi-network.adoc#hwt-rpi-hotspot pour savoir comment configurer la Raspberry Pi en “Hotspot” WiFi)

  4. Intégrer le code informatique produit avec celui de l’étudiant IR2 c.-à-d. en vérifiant qu’il prend bien en compte les ordres transmis.

Étudiant IR3

Votre mission :

Développer une application NodeRed qui simule le robot en interprétant les trames qui vouys parviennent par liaison série

Travail à faire :

  1. Démarrer le service NodeRED et le configurer pour le démarrer automatiquement au démarrage

    sudo systemctl start nodered.service (1)
    sudo systemctl enable nodered.service (2)
    1 Démarre le service
    2 configure le service pour qu’il se lance automatiquement au démarrage de la Raspberry Pi
  2. Afficher l’interface de développement de NodeRED en se connectant, depuis un navigateur web, sur le port 1880 de votre Raspberry Pi. Ex. : http://rpi-robocup-01:1880

  3. Installer depuis l’onglet “Install” du menu   Manage palette les modules suivants :

    • node-red-node-serialport pour ajouter à la palette un nœud qui permet la prise en charge d’un port série

    • node-red-dashboard pour ajouter à la palette des composants pour construire une interface web

  4. Développer une application NodeRed qui simule le robot.

    Cette application devra analyser les trames qui lui parviennent par liaison série et retranscrire sur une IHM les actions qu’elles doivent déclencher (avancer, tourner à gauche, fermer la pince…​)

    app nodered
    Exemple d’IHM attendue
  • Vous pouvez vous appuyer sur l’activité Prise en main de NodeRED pour reprendre les bases d’utilisation de NodeRED

  • Voir aussi Node-Red link pour une présentation générale de NodeRED avec un exemple de mise en œuvre utilisant un nœud liaison série

Travail Équipes N°4 et 5 : Solution NodeJS + NodeRED

Étudiant IR1

Votre mission :

Développer un site web — servi par une application NodeJS (→ module Express de NodeJS) — qui propose une interface web de pilotage du robot (déplacement + pince) et transmet les commandes via websocket à l’application NodeJS de l’étudiant IR2.

Travail à faire :

  1. Participer à la mise en place sur la Raspberry Pi de l’application NodeJS par l’étudiant IR2

  2. Se renseigner sur internet sur le fonctionnement global des modules supplémentaires installés (→ Express, Serialport, Socket.IO) et le protocole WebSocket :

  3. Définir avec IR2 les message webSocket à prendre en charge au niveau de l’interface web pour pouvoir piloter le robot à distance (format des commandes, valeurs des champs, …​)

  4. Développer un site web qui propose une interface web de pilotage du robot (déplacement + pince)

    • Pour un exemple de projet pouvant servir de base pour le développement, voir ce dépôt Framagit link

      git clone https://framagit.org/codebase-bts-sn/njs-robocup-template
      site web
    • Pour savoir comment prendre en compte les appuis de touche sur une interface web, consulter KeyboardEvent.code link.

      Cet autre site link propose une interface conviviale pour obtenir le code des touches du clavier

  5. Intégrer le site web produit dans l’application NodeJS de l’étudiant IR2 pour vérifier que toutes les commandes de pilotage du robot sont bien prises en compte.

Étudiant IR2

Votre mission :

Développer, sur Raspberry Pi, une application NodeJS qui :

  1. fait office de serveur web pour publier un site web en charge de l’étudiant IR1

  2. reçoit les ordres transmis par réseau (websocket) depuis la site web de l’étudiant IR1

  3. convertit les messages websocket en trames (ASCII ou binaire) avant de les envoyer sur la liaison série ou, inversement, traduit les trames reçues par liaison série en message websocket à envoyer sur le site web de l’étudiant IR1 pour qu’il mette à jour l’IHM

Travail à faire :

  1. Créer sur la Raspberry Pi le répertoire de l’application NodeJS

    mkdir ~/Documents/njs-robocup-<n°-équipe>-; cd $_ (1)
    1 <n°-équipe> à remplacer par le n° de votre équipe
  2. Créer l’application NodeJS en exécutant l’assistant de création d’application

    npm init
    Exemple de réponses aux questions de l’assistant
    pi@raspberrypi:~/Documents/njs-robocup-template $ npm init
    This utility will walk you through creating a package.json file.
    It only covers the most common items, and tries to guess sensible defaults.
    
    See `npm help init` for definitive documentation on these fields
    and exactly what they do.
    
    Use `npm install <pkg>` afterwards to install a package and
    save it as a dependency in the package.json file.
    
    Press ^C at any time to quit.
    package name: (njs-robocup-template)
    version: (1.0.0)
    description:  Modèle d'application NodeJS pour le projet Robocup
    entry point: (index.js) app.js
    test command:
    git repository:
    keywords: robot dashboard
    author: BTS CIEL Lycée Alphonse Benoit
    license: (ISC)
  3. Installer les modules NodeJS supplémentaires qui sont nécessaires pour notre application

    npm install express --save (1)
    npm install socket.io --save (2)
    npm install serialport --save (3)
    1 installation du module contenant le framework d’application web
    2 instalaltion du module de prise en charge du protocole WebSocket
    3 installation du module de gestion de liaison série
  4. Se renseigner sur internet sur le fonctionnement global des modules supplémentaires installés et le protocole WebSocket :

  5. S’accorder avec l’étudiant IR1 sur les messages websocket à définir pour pouvoir communiquer ensemble (nom, types et valeurs des paramètres).

  6. S’accorder avec l’équipe EC sur le protocole série à utiliser pour déplacer le robot, actionner la pince : délimiteurs de trame, commandes possibles, nombre et valeurs possibles pour les paramètres

  7. Développer, sur Raspberry Pi, une application NodeJS qui :

    1. sert le site web développé par IR1 (→ module Express de NodeJS)

    2. convertit les messages websocket (→ module Socket.IO de NodeJS) reçus depuis le site web de l’étudiant IR1 en trames (ASCII ou binaire) conformes au protocole choisi avec l’équipe EC puis les envoie sur la liaison série (→ module Serialport de NodeJS) ou, inversement, traduit les trames reçues par liaison série en message websocket à envoyer sur le site web de l’étudiant IR1 pour qu’il mette à jour l’IHM

      • Pour un exemple de projet pouvant servir de base pour le développement, voir ce dépôt Framagit link

        git clone https://framagit.org/codebase-bts-sn/njs-robocup-template
      • En phase de développement, vous pourrez utiliser Postman link pour émuler le site web, en charge de l’étudiant IR1, afin de tester la bonne prise en compte par votre application des messages websocket qu’il doit vous envoyer.

        La connexion pourra être faite soit par Ethernet soit par WiFi — via une clé USB WiFi — si la Raspberry Pi est configurée en “Hotspot” (→ Voir os:rpi:hwt-rpi-network.adoc#hwt-rpi-hotspot pour savoir comment configurer la Raspberry Pi en “Hotspot” WiFi)

        Pour savoir comment utiliser Postman pour tester votre serveur Socket.IO voir How to test your Socket.IO server using Postman link

      • Pour tester la liaison série, plusieurs solutions existent :

        • utiliser l’application NodeRED développée par l’étudiant IR3

        • utiliser un adapteur USB/Série TTL pour visualiser les trames envoyées dans un terminal série (→ CuteCom, Termite, PuTTY …)

        • mettre en place une paire de ports série virtuel. Voir os:rpi:hwt-rpi-interfaces.adoc#virtual-nullmodem

  8. Intégrer le site web produit avec celui de l’étudiant IR1 dans votre application NodeJS pour vérifier que toutes les commandes de pilotage du robot sont bien prises en compte.

Étudiant IR3

Votre mission :

Développer une application NodeRed qui simule le robot en interprétant les trames qui vous parviennent par liaison série

Travail à faire :

Identique à celui de l’étudiant IR3 des équipes 1, 2 et 3 ⇒ voir Étudiant IR3

🞄  🞄  🞄