Configurer VSCode pour programmer et déboguer à distance sur Raspberry Pi

Dans un article précédent, l'installation de Visual Studio Code directement sur le Raspberry Pi avait été présentée. En effet, le dernières configurations du nano-ordinateur équipées de quatre coeurs sur 64 bits, permettent d'envisager de les utiliser comme machines de développement.
Malgré tout, d'aucuns préféreront développer dans un environnement plus classique, dans lequel la machine de développement — en général un PC — et le système embarqué (un Raspberry Pi par exemple) sont distincts. En effet l'utilisation de VSCode sur Raspberry Pi nécessite l'installation du Desktop alors que la plupart du temps, cette configuration lourde du nano-ordinateur n'a aucune utilité dans l'usage cible envisagé.
Cet article décrit la configuration l'IDE Visual Studio Code pour programmer, déployer et déboguer à distance des programmes sur Raspberry Pi. Les exemples de cet article ont été implémentés sur un Raspberry Pi 3. Le langage informatique utilisé est Python 3.

Pré-requis

Sur le RaspberryPi

  • Le Raspberry Pi doit être installé et opérationnel. Sauf à viser une application graphique (avec TkInter sous Python par exemple), il n'est pas nécessaire d'y installer le Desktop. La version light est suffisante.
  • En revanche, si comme dans cette article, le langage Python est utilisé, celui-ci doit être installé sur le Raspberry Pi.
  • Le Raspberry Pi doit être connecté au réseau local, le même que le PC de développement. Il est important de connaitre l'adresse IP du Raspberry Pi attribuée par le DHCP. La configuration la meilleure étant d'attribuer une adresse IP fixe au Raspberry Pi.
  • Le Raspberry Pi doit être accessible par SSH. Cela se paramètre par la commande raspi-config en ligne de commande.
    • Lancer la commande sudo raspi-config dans le shell du Raspberry Pi.
    • Choisir 5 - Interfacing options, choisir <Select>.
    • Choisir P2  - SSH, choisir <Select>.
    • Choisir <Oui>.
    • Choisir <Ok>.
  • Activer SSH sur le Raspberry Pi ouvre une faille de sécurité. Il faut impérativement modifier le mot de passe par défaut (raspberry) de l'utilisateur pi, ou même supprimer l'utilisateur pi pour le remplacer par un autre. 
    • Choisir 1 - Change User Password, choisir <select>.
    • Choisir <OK>. A ce moment là, on quitte momentanément raspi-config pour exécuter la modification du mot de passe.
    • Derrière Nouveau mot de passe, taper le nouveau mot de passe.
    • Derrière Retaper le nouveau mot de passe, taper le même mot de passe que précédemment.
    • Après être revenu dans raspi-config, choisir <Finish>.

Sur le PC de développement

  • Il faut disposer d'un client SSH. Sur Widows 10, il suffit d'activer OpenSSH qui est un composant de Windows. Sur les versions plus anciennes, il faut en installer un comme putty.
    On en profite pour tester la connexion SSH sur le Raspberry Pi (ici son adresse IP est 192.168.1.121).
    C:\Users\Framboise>ssh pi@192.168.1.121
    The authenticity of host '192.168.1.121 (192.168.1.121)' can't be established.
    ECDSA key fingerprint is SHA256:jqTt9wqJmJwMjuqGQdW4K7qUoNnksOUt8XbX7XS19L4.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '192.168.1.121' (ECDSA) to the list of known hosts.
    pi@192.168.1.121's password:
    Linux raspi01 4.19.118-v7+ #1311 SMP Mon Apr 27 14:21:24 BST 2020 armv7l

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Linux raspi01 4.19.118-v7+ #1311 SMP Mon Apr 27 14:21:24 BST 2020 armv7l

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    Last login: Thu Jun 25 11:46:40 2020 from 192.168.1.41
    pi@raspi01:~ $ exit
    déconnexion
    Connection to 192.168.1.121 closed.

    C:\Users\Framboise>
    • La partie surlignée en jaune indique que c'est la première fois que la connexion entre le PC et le Raspberry est effectuée. Pour fonctionner, SSH a besoin d'une clé de crytage qu'il faut initialiser.
    • La partie surlignée en bleu indique qu'on se trouve non plus sur une session Windows du PC (indiquée par le prompt C:\Users\Framboise) mais sur une session SSH sur le Raspberry Pi (indiquée par le prompt pi@raspi01:~).
  • Visual Studio Code doit être installer sur le PC (et non pas sur le Raspberry Pi).
  • Python doit être installé sur le PC (puisque c'est le langage utilisé pour programmer le robot). Cela permet de tester en local des modules métiers avant de les embarquer sur le Raspberry Pi, pour ménager la carte microSD de celui-ci.
    Grâce aux environnement virtuels venv de Python, plusieurs versions peuvent cohabiter sur un même PC. Il est recommandé d'utiliser la même version que celle embarquée sur le Raspberry Pi.
    Pour connaitre la version de Python du Raspberry Pi (ici, la version est 3.7.3, il suffit de lancer la commande python3 en ligne de commande.
    pi@raspi01:~ $ python3
    Python 3.7.3 (default, Dec 20 2019, 18:57:59)
    [GCC 8.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> quit()
    pi@raspi01:~ $

Installation des extensions VSCode

Installation de l'extension Python

Si ce n'est déjà fait, il faut installer l'extension Python dans VSCode.
  • Dans VSCode, cliquer l'icône Extension dans la barre verticale à gauche.
  • Dans la zone Search Extensions in MarketPlace, taper python
  • Cliquer le bouton [Install] en face de Python (choisir la version Microsoft qui est la plus sure). Cette version réinstalle la version de Python la plus récente dans  ~/AppData/Local/Programs. Mais il est possible de choisir l'interpréteur Python que l'on souhaite utilisé pour un projet particulier.
  • Cliquer dans sur Python en bas à gauche de la fenêtre de VSCode.
  • Dans la zone Select the workspace to set the interpreter, taper le chemin complet du projet PiStorms. 
  • Puis, sous Enter interpreter path..., choisir l'interpréteur Python installé en pré-requis avec la version utilisée sur le Raspberry Pi.

Installation de l'extension Visual Studio Intellicode

On en profite pour installer également l'extension Visual Studio Intellicode. Cette extension permet d'implémenter la suggestion automatique des propriétés et méthodes des classes d'objets utilisées. Ce qui facilite grandement la programmation et évite des erreurs de saisie. Son installation ne pose pas de problème particulier :
  • Dans VSCode, cliquer l'icône Extension dans la barre verticale à gauche.
  • Dans la zone Search Extensions in MarketPlace, taper Visual Studio Intellicode
  • Il suffit alors de cliquer le bouton [Install] en face de l'extension.

Installation de l'extension Remote Development

L'extension Remote Development fournit tous les outils nécessaires au développement sur des plateforme embarquées telles que le Raspberry Pi. C'est elle qui est au cœur de cet article.
Pour l'installation, on procède comme pour Python :
  • Dans VSCode, cliquer l'icône Extension dans la barre verticale à gauche.
  • Dans la zone Search Extensions in MarketPlace, taper Remote Development
  • Il suffit alors de cliquer le bouton [Install] en face de l'extension.
En réalité l'extension intitulée Remote Development est une combinaison de plusieurs extension VSCode :
  • Remote-Containers est une extension pour fonctionner avec des conteneurs distants comme Docker. Ce type d'application permet aux développeurs de charger d'un coup l'environnement de développement et l'application à développer. Cela évite, lorsqu'on est amené à maintenir plusieurs applications en parallèle, à devoir tout reconfigurer lorsqu'on  passe d'une application à l'autre. Cela permet également de gérer plusieurs version en parallèle.
  • Remote-SSH est une extension pour gérer le répertoire d'un projet embarqué dans une session SSH comme si c'était un répertoire local.
  • Remote-SSH: Editing Configuration Files est une extension qui facilite la configuration des sessions SSH.
  • Remote-WSL est une extension pour gérer le répertoire d'un projet dans WSL (possibilité d'ouvrir une session Linux dans Windows).
L'extension Remote-SSH, dans sa version actuelle, ne permet pas de déboguer à distance. Mais il existe une toute nouvelle version qui le permet. On va donc désinstaller L'extension Remote-SSH et la remplacer par Remote-SSH (Nightly).
  • Sélectionner l'extension Remote-SSH et cliquer le bouton [Uninstall].
  •  Dans la zone Search Extensions in MarketPlace, taper Remote Development
  • Cliquer le bouton [Install] en face de l'extension Remote-SSH (Nightly).

Se connecter à un hôte distant

L'étape d'après consiste à se connecter sur le Raspberry Pi à partir de VSCode.

Ajouter un hôte distant dans VSCode

  • Dans la barre de menu de VSCode, cliquer la commande View/Command Palette... (Shift+Ctrl+P).
  • Derrière le prompt >, taper Remote-SSH. Toutes les commandes du service apparaissent alors.
  • Choisir Remote-SSH: Add New SSH Host...
  • Dans la zone Enter SSH Connection Command, taper ssh pi@192.168.1.102 -A, où 192.168.1.102 est l'adresse IP du Raspberry Pi (qui doit être connecté au réseau...) et pi est l'utilisateur sur le Raspberry Pi (par défaut).
  • Dans la zone Select SSH Configuration file to update, choisir C:\users\myname\.ssh\config, où myname est le nom de l'utilisateur Windows sur le PC.

Se connecter à un hôte distant

  • Dans la barre de menu de VSCode, cliquer la commande View/Command Palette... (Shift+Ctrl+P).
  • Derrière le prompt >, taper Remote-SSH.
  • Choisir Remote-SSH: Connect to Host...
  • Parmi les hôtes déjà utilisés, choisir 192.168.1.102 (l'adresse IP du Raspberry Pi configuré). Une nouvelle fenêtre VSCode s'ouvre.
La première fois, plusieurs questions seront posées. En effet, une partie Serveur de VSCode (25 Mo) doit être installée sur le Raspberry Pi.
  • Dans la zone Select the platform of the remote host "192.168.1.102", choisir Linux.
  • A la question Are you sure to continue ?, répondre Continue
  • Dans la zone Enter password for pi@192.168.1.102, taper le mot de passe de l'utilisateur pi du Raspberry Pi. Le message « Setting up SSH Host 192.168.1.102: (details) Installing VSCode Server » s'affiche en bas à droite de la nouvelle fenêtre de VSCode.
Lorsque la connexion est établie avec l'hôte distant, son adresse IP apparaît en vert dans la barre d'état de la nouvelle fenêtre de VSCode. Il est alors possible de travailler à distance exactement comme en local (création d'un répertoire pour le projet, création d'un nouveau fichier de code, etc.).

Sur le Raspberry Pi ?

Les actions précédentes ont installé un composant supplémentaire sur le compte pi du Raspberry Pi, comme on peut le constater en explorant le répertoire home de l'utilisateur pi :
pi@raspi01:~ $ ls -al
total 162
drwxr-xr-x 25 pi   pi    4096 juin  25 16:39  .
drwxr-xr-x  3 root root  4096 févr. 13 16:55  ..
-rw-------  1 pi   pi   13913 juin  25 16:43  .bash_history
-rw-r--r--  1 pi   pi     220 févr. 13 16:55  .bash_logout
-rw-r--r--  1 pi   pi    3523 févr. 13 16:55  .bashrc
drwxr-xr-x  2 pi   pi    4096 juin  19 16:53  .bluej
drwxr-xr-x  7 pi   pi    4096 mai    9 13:38  .cache
drwx------ 10 pi   pi    4096 juin  19 17:20  .config
drwxr-xr-x  2 pi   pi    4096 mai    9 11:22  Desktop
drwxr-xr-x  2 pi   pi    4096 mai    9 11:22  Documents
drwxr-xr-x  2 pi   pi    4096 mai    9 11:22  Downloads
drwx------  3 pi   pi    4096 févr. 13 17:31  .gnupg
drwxr-xr-x  3 pi   pi    4096 juin  19 16:52  .java
drwxr-xr-x  3 pi   pi    4096 févr. 13 17:03  .local
drwxr-xr-x  2 pi   pi    4096 févr. 13 17:03  MagPi
drwxr-xr-x  3 pi   pi    4096 juin  22 16:14  .mono
drwxr-xr-x  2 pi   pi    4096 mai    9 11:22  Music
-rw-------  1 pi   pi     142 mai   14 19:35  .mysql_history
drwxr-xr-x  5 pi   pi    4096 juin  22 16:08  .npm
drwxr-xr-x  2 pi   pi    4096 mai    9 11:22  Pictures
drwx------  3 pi   pi    4096 mai    9 13:38  .pki
-rw-r--r--  1 pi   pi     807 févr. 13 16:55  .profile
drwxr-xr-x  3 pi   pi    4096 juin  25 16:15 'Projets VSCode'
drwxr-xr-x  2 pi   pi    4096 mai    9 11:22  Public
-rw-------  1 pi   pi      13 juin  25 10:44  .python_history
drwxr-xr-x  2 pi   pi    4096 mai    9 11:22  Templates
drwxr-xr-x  2 pi   pi    4096 mai    9 11:22  Videos
drwx------  3 pi   pi    4096 mai    9 14:02  .vnc
drwxr-xr-x  5 pi   pi    4096 juin  25 16:39  .vscode-server
-rw-r--r--  1 pi   pi     223 juin  25 16:39  .wget-hsts
-rw-------  1 pi   pi     108 juin  25 11:45  .Xauthority
-rw-r--r--  1 pi   pi    8781 mai    9 14:35  .xscreensaver
-rw-------  1 pi   pi    2433 juin  25 11:45  .xsession-errors
-rw-------  1 pi   pi    2433 juin  23 20:41  .xsession-errors.old
pi@raspi01:~ $
L'option -a a été utilisée pour la commande ls car le répertoire .vscode-server n'est un dossier caché.

Créer un nouveau projet Python

Ce qu'il faut maintenant comprendre, c'est la localisation respective des différents composants.
  • VSCode se trouve sur le PC. C'est à dire la machine de développement.
  • En revanche, le répertoire du projet contenant les scripts Python se trouvent sur le Raspberry Pi. Et ils ont interprétés et exécutés sur celui-ci.

Création du répertoire du nouveau projet Python

Le répertoire du projet doit donc être créé sur le Raspberry Pi.
Une bonne pratique est de créer un répertoire Projets VSCode dans le répertoire home de l'utilisateur pi. Et de créer les projets dans ce répertoire.
pi@raspi01:~ $ mkdir 'Projets VSCode'
pi@raspi01:~ $ cd 'Projets VSCode'
pi@raspi01:~/Projets VSCode $ mkdir HelloWorld
pi@raspi01:~/Projets VSCode $ ls
HelloWorld
pi@raspi01:~/Projets VSCode $

Prise en charge de ce nouveau projet dans VSCode

Ouvrir VSCode sur le PC :
  1. Vérifier que VSCode est bien connecté au Raspberry Pi. L'adresse IP (192.168.1.121 dans l'exemple) s'affiche sur fond vert dans le coin inférieur gauche de VSCode. Si ce n'est pas le cas, réitérer l'opération de connexion décrite ci-dessus.
  2. Cliquer sur l'icône Explorer en haut à gauche de VSCode.
  3. Cliquer le bouton [Open Folder].
  4. Choisir le répertoire HelloWorld créé précédemment  dans 'Projets VSCode'.
    Puis cliquer le bouton [OK].

Créer un script Python

L'opération précédente effectuée, le répertoire distant du projet apparaît dans l'onglet Explorer.
Maintenant il faut créer dans ce répertoire le fichier de script hello.py
  • Lancer la commande du menu File/New File (raccourcis : Ctrl+N). Un onglet intitulé Untitled-1 apparait.
  • Taper le code ci dessous :
    #!/usr/bin/env python3

    print ("Hello world !")
    print ("Bye !")
    Le langage Python étant interprété, il est nécessaire d'indiquer sous Linux, quel interpréteur doit être utilisé. La première ligne commentée  #!/usr/bin/env python3 indique qu'il faut solliciter l'interpréteur Python en version 3. A noter qu'en Python-3, il n'est plus nécessaire de préciser l'encodage du fichier, celui-ci étant toujours UTF-8.
  • Lancer la commande du menu File/Save pour enregistrer le fichier. Le nom du fichier est Hello.py. L'extension .py signale qu'il s'agit d'un fichier Python.

Activer l'extension Python sur vscode-server (sur le Raspberry-Pi)

Si l'on exerçait en local, pour lancer l'exécution du programme, il suffirait de cliquer sur l'icône Run/Debug (raccourcis Maj+Ctrl+D) dans la barre à gauche de VSCode. C'est effectivement ce qu'il conviendra de faire par la suite.
Malheureusement cela ne fonctionne pas en standard. En effet, si l'extension Python est bien installée en local sur VSCode, le module vscode-server installé sur le Raspberry Pi n'en a pas encore été informé. La première fois, il faudra donc activer l'extension Python sur ce module pour pouvoir exécuter et tester à distance le programme.
  1. Cliquer l'icône Run/Degug dans la barre à gauche de VSCode.
  2. Cliquer le lien create a launch.json file.
  3. Dans Select Environment, choisir more...
  4. Cliquer sur Install in SSH 192.168.1.121 sur l'extension Python (pour rappel 192.168.1.121 est l'adresse IP du Raspberry Pi).
  5. Cliquer Reload Required. Le redémarrage de VSCode est nécessaire à cette étape.
  6. La connexion devait être rétablie à nouveau, taper le mot de passe de l'utilisateur pi du Raspberry, comme demandé.

Création d'un fichier de configuration de debug

Maintenant que l'extension Python est activée, il est possible de configurer le débogueur Python. Pour cela il faut reprendre les opérations ci-dessous :
  1. Cliquer l'icône Run/Degug dans la barre à gauche de VSCode.
  2. Cliquer le lien create a launch.json file.
  3. Dans Select a Debug configuration, choisir Python File
  4. Cliquer sur Install in SSH 192.168.1.121 sur l'extension Python (pour rappel 192.168.1.121 est l'adresse IP du Raspberry Pi).
  5. Cliquer Reload Required. Le redémarrage de VSCode est nécessaire à cette étape.
  6. La connexion devait être rétablie à nouveau, taper le mot de passe de l'utilisateur pi du Raspberry, comme demandé.
Cette opération a créé un fichier de configuration launch.json pour déboguer à distance dont le contenu est le suivant :
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}
Un même fichier launch.json peut contenir plusieurs configurations. Celle-ci étant définies dans un tableau entre crochets. Pour le moment, il n'y en a qu'une seule dont le nom est Python: Current File. Ce nom, qui peut être changé à volonté, apparaît dans dans une combo dans la barre de debug.

Lancer l'exécution du programme

Un fois les opérations de configurations de débogage effectuées pour tester les scripts Python à distance, il est possible de tester le programme.
  1. Si ce n'est pas encore le cas, cliquer l'icône Run/Degug dans la barre à gauche de VSCode. VSCode change de mode et la barre de débogage s'affiche sous la barre de menu.
  2. Éventuellement, positionner un point d'arrêt sur l'une des instructions. Pour cela, il suffit de cliquer à gauche du numéro de la ligne de l'instruction concernée. Un gros point rouge y apparaît alors. A signaler que la liste des points d'arrêt est affichée dans la boîte Breakpoints en bas, à gauche de VSCode..
  3. Dans la combo Run, choisir la configuration créée ci-dessus (celle qui s'appelle Python: Current file). Il se trouve que dans la suite des opérations présentées dans cet article, il n'y en a qu'une seule, en principe.
  4. Cliquer le petit triangle vert pour lancer l'exécution du programme.
Un point d'arrêt ayant été positionné, après avoir démarré, le programme va s'arrêter sur l'instruction pointée (avant que celle-ci ne soit exécutée). La ligne de l'instruction concernée est surlignée et un index s'affiche en face de celle-ci. Il est alors possible de procéder aux opérations habituelles de débogage en utilisant la barre de navigation pour faire du pas à pas ou contrôler la valeur des variables.

Conclusion

Avec cet article, nous disposons maintenant d'un outil de développement particulièrement efficace pour créer et tester à distance des programmes sur un système embarqué comme le Raspberry Pi. Dans l'exemple, c'est le langage Python qui a été utilisé. Mais le principe peut être appliqué à tous les langages envisageables sur le nano-ordinateur.

Commentaires

Posts les plus consultés de ce blog

Gérer la mise en veille

Créer un nouvel utilisateur Raspbian