Tutoriel Installation environnement arduino dans emacs

Présentation

Voulant m'initier à la programmation sur arduino, j'ai recherché un environnement le permettant.
J'utilise déjà Emacs pour programmer en C++ ou faire quelques pages html pour agrémenter mon site web.
De ce fait, je n'ai bien entendu pas utilisé la solution de facilité qu'est vscode ou vscodium.
Certaines personnes m'ont regardé avec des yeux effarés en me disant que ça ne marchera pas, mais le résultat est là : ça fonctionne tout aussi bien avec l'avantage de maîtriser son environnement.

Logiciels nécessaires

Pour pouvoir disposer d'un environnement convenable, il vous faudra ces logiciels ou paquets.
Je fais l'installation sur mon ordinateur portable ou j'ai installé la distribution Archlinux.
Je n'ai pas essayé sur Debian. Il vous faudra, si vous possédez cette distribution, possiblement compiler certains logiciels

Les logiciels nécessaires :

  • Emacs pour l'environnement
  • clang pour pouvoir compiler et utiliser le langage server protocol (lsp)
  • arduino-avr-core pour interagir avec l'arduino
  • platformio-core et platformio-core-udev pour l'integration de platformio
  • Les paquets dans Emacs :

  • lsp-mode pour le mode lsp dans emacs
  • lsp-ui pour l'affichage des paramètres de fonction par exemple
  • which-key pour connaître les raccourcis clavier
  • company pour la complétion générale
  • projectile pour la gestion du projet et envoyer très facilement le code compilé dans l'arduino
  • arduino-cli-mode pour envoyer les commandes à l'arduino
  • arduino-mode pour éditer du code arduino
  • company-arduino pour la complétion de code arduino
  • platformio-mode pour l'intégration de Platformio dans emacs
  • Le fichier de configuration d'Emacs

    Pour pouvoir interagir avec les paquets d'emacs qu'on a installé, il faudra rajouter quelques lignes de configuration
    Je vous donne les miennes, mais vous pourrez les modifier comme vous le souhaitez

    pour lsp :
    (setq lsp-clangd-executable "clangd") (setq lsp-clients-clangd-executable "clangd")

    pour which-key :
    (use-package which-key :config (which-key-setup-minibuffer) :ensure t :diminish which-key-mode :init (which-key-mode))

    pour company :
    (use-package company :ensure t :config (setq company-idle-delay 0) (setq company-minimum-prefix-length 1) (global-company-mode t) )

    pour arduino :
    (use-package arduino-mode :defer t) (add-to-list 'auto-mode-alist '("\\.ino$" . arduino-mode)) (use-package arduino-cli-mode :ensure t ;; :hook arduino-mode ;; :mode "\\.ino\\'" :custom (arduino-cli-warnings 'all) (arduino-cli-verify t))

    pour platformio :
    (use-package platformio-mode :ensure t) ;; Enable ccls for all c++ files, and platformio-mode only ;; when needed (platformio.ini present in project root). (add-hook 'c++-mode-hook (lambda () (platformio-conditionally-enable)) )

    Mise en oeuvre

    Maintenant que tout est configuré, on va pouvoir se focaliser sur la mise en oeuvre et la production de code arduino. Voici la procédure détaillée :

    Pour lister toutes les cartes prises en charge par Platformio :
    platformio boards

    Pour rechercher le modele de carte arduino :
    lsusb ce qui donne
    Bus 001 Device 009: ID 1a86:7523 QinHeng Electronics CH340 serial converter
    sudo dmesg
    ce qui donne
    [ 326.251431] usb usb2-port4: Cannot enable. Maybe the USB cable is bad? [ 326.251487] usb usb2-port4: attempt power cycle [ 327.231357] usb 1-4: new full-speed USB device number 9 using ohci-pci [ 328.194853] usb 1-4: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.64 [ 328.194869] usb 1-4: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [ 328.194875] usb 1-4: Product: USB Serial [ 328.201706] ch341 1-4:1.0: ch341-uart converter detected [ 328.218005] usb 1-4: ch341-uart converter now attached to ttyUSB0
    pio device list
    ce qui donne
    /dev/ttyUSB0 ------------ Hardware ID: USB VID:PID=1A86:7523 LOCATION=1-4 Description: USB Serial
    ces indications ne fournisse pas la référence de la carte arduino car c'est certainement la référence de la carte USB et non du module arduino.
    En tous les cas j'ai pris pour exemple le modèle nodemcu et tout fonctionne

    Pour créer l'embryon du projet :
    pio init --ide emacs --board nodemcu
    cette commande créée tous les fichiers et dossiers nécessaires à la bonne réalisation du projet

    Pour pouvoir avoir les commandes nécessaires à l'évaluation de lsp :
    pio run -t compiledb
    Le fichier compile_commands.json est créé

    Initialiser le dépôt git ;
    git init
    Vous pouvez également le faire dans emacs avec magit

    Dans emacs :

  • lancer projectile via projectile-mode
  • créer un fichier main.cpp par exemple dans le dossier source et importer le via lsp
  • Définir le dossier root du projet avec la commande projectile-discover-projects-in-directory
  • Pour compiler le projet : platformio-build ou C-c i b
  • Pour le télécharger dans la carte arduino : platformio-upload ou C-c i u
  • Pour lancer le programme dans l'arduino : platformio-device-monitor ou C-c i m
  • Conclusion

    Voilà en quelques minutes un environnement de développement pour arduino opérationnel sur Emacs sans passer par l'usine à gaz de vscode