Travail à faire Objectif global Coder une solution logicielle constituée de 3 applications qui : 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 Convertit les commandes de l’interface de pilotage en trames séries Simule le robot en fonction des trames séries reçues 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 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) 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 Décompresser l’image disque avec 7-zip Utiliser Rufus pour flasher la carte SD que vous aurez récupérée AVEC PRÉCAUTION sur votre Raspberry Pi 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 Éjecter la carte SD et l’insérer dans la Raspberry Pi Brancher un câble réseau sur la Raspberry Pi et l’alimenter avec son bloc d’alimentation micro-usb. Se connecter par SSH à la Raspberry Pi avec Putty en indiquant directement son nom dans le champ “HostName (or IP address)” Installer NodeRED & NodeJS Se rendre dans le chapitre Running on Raspberry Pi sur le site officiel de NodeRED et parcourir la procédure d’installation 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 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. 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 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 : Créer une machine virtuelle OpenSUSE ou utiliser celle que vous avez déjà Installer — depuis YaST — les paquets logiciels du framework Qt : libqt5-creator libqt5-qtbase-devel libqt5-qtdoc 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 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 git clone https://framagit.org/codebase-bts-sn/commudp 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 : reçoit les ordres transmis par réseau (TCP ou UDP) depuis l’application de l’étudiant IR1 convertit ces ordres en trames (ASCII ou binaire) avant de les envoyer sur la liaison série. Travail à faire : 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. 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 Voir Protocole série 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 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 git clone https://framagit.org/codebase-bts-sn/commudp En phase de développement, vous pourrez utiliser PacketSender 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) 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 : 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 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 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 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…) 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 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 : Participer à la mise en place sur la Raspberry Pi de l’application NodeJS par l’étudiant IR2 Se renseigner sur internet sur le fonctionnement global des modules supplémentaires installés (→ Express, Serialport, Socket.IO) et le protocole WebSocket : Socket.IO with Node.Js + Express Qu’est-ce que le WebSocket? Serial communication with Node.js … 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, …) 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 git clone https://framagit.org/codebase-bts-sn/njs-robocup-template Pour savoir comment prendre en compte les appuis de touche sur une interface web, consulter KeyboardEvent.code . Cet autre site propose une interface conviviale pour obtenir le code des touches du clavier 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 : fait office de serveur web pour publier un site web en charge de l’étudiant IR1 reçoit les ordres transmis par réseau (websocket) depuis la site web de l’étudiant IR1 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 : 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 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) 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 Se renseigner sur internet sur le fonctionnement global des modules supplémentaires installés et le protocole WebSocket : Socket.IO with Node.Js + Express Qu’est-ce que le WebSocket? Serial communication with Node.js … S’accorder avec l’étudiant IR1 sur les messages websocket à définir pour pouvoir communiquer ensemble (nom, types et valeurs des paramètres). 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 Voir Protocole série Développer, sur Raspberry Pi, une application NodeJS qui : sert le site web développé par IR1 (→ module Express de NodeJS) 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 git clone https://framagit.org/codebase-bts-sn/njs-robocup-template En phase de développement, vous pourrez utiliser Postman 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 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 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 🞄 🞄 🞄 Spécifications Gamepad