jeudi 25 février 2021

Développer en C++ pour Arduino

Comment je développe et j'implémente mon code compilé sur une carte Arduino ? La programmation en C/C++ est la manière la plus courante de programmer la carte Arduino.

Le logiciel se divise alors en 2 fonctions le setpup() et une fonction loop() qui est la boucle naturelle de l'application.

Programmation en python, il ne s'agit pasz d'une compilation croisée mais d'une application résidente de la carte arduino qui est en communication avec les instructions python.

http://claude.gueganno.free.fr/arch/polyArduino.pdf

Voilà un bon début et un ensemble de généralités pour bien fixer les idées.

Visual Studio Code permet avec trois extension de programmer en C++ pour Arduino...

Pour moi ça commence Ici :

Devenez-pro-en-electronique-PROGRAMMER SON ARDUINO AVEC VISUAL STUDIO

Arduino gestion des ports COM

Je complique ma configuration de développement en essayant d'installer la chaîne de développement Arduino dans une machine du Cloud.

En jouant avec Arduino vous allez devoir maîtriser les affectation des ports COM aussi je vous conseil la page suivante :

http://www.e-novatic.fr/rediriger-les-ports-com-sous-tse/

Redirection des ports COM de l'hôte vers le cloud
Redirection des ports COM de l'hôte vers le cloud

Pour tout savoir sur la commande :

>change port /query

Pour afficher les ports COM et leur caractéristique.

Sur les ports COM de Windows :

Eltima - 2 méthodes pour régler tous les problèmes de ports COM sur Windows 10

Voilà des gens qui maîtrise les ports COM.

Sur l'autorisation des port COM en Remote Desktop :

Modèle d'administration (ordinateurs) - Ne pas autoriser la redirection des ports COM

Il semble bien que ces possibilités de bloquer la redirection des port com date un peu dans le monde Microsoft et que les clefs de registre ne soient plus utilisées :

regedit - Ne pas autoriser la redirection de port COM

Remote Desktop Services - Some USB devices aren't available

On apprend à mettre la ligne :

usbdevicestoredirect:s: RDP

dans le fichier .rdp 

Et à modifier la base de registres mais attention ...

Attention : Sous Windows 7, il est bien sûr impossible de rediriger un port COM vers une machine du cloud le degrés de virtualisation du port COM n'étant pas suffisant.

Visual Studio Code pour Arduino

Installation de l'extension PlatformIO IDE pour VSCode :


Pour pouvoir créer mon premier projet, choix de la carte Arduino : 


Carte Arduino Mega 2560.

PowerShell vs PlaformIO CLI

Il faut faire attention à exécuter les commandes dans le bon environnement. D'ailleurs je travaille avec une machine sous Windows 7 un peu ancien pour PowerShell, j'ai tenté d'installer l'extension proposée mais impossible "une vraie galère" : 

Error installing PowerShell extension on Visual Studio Code

Allez je vous mets le message d'error :

01/03/2021 17:25:51 [NORMAL] - Visual Studio Code v1.53.2 64-bit
01/03/2021 17:25:51 [NORMAL] - PowerShell Extension v2021.2.2
01/03/2021 17:25:51 [NORMAL] - Operating System: Windows 64-bit
01/03/2021 17:25:51 [NORMAL] - Language server starting --
01/03/2021 17:25:51 [NORMAL] -     PowerShell executable: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
01/03/2021 17:25:51 [NORMAL] -     PowerShell args: -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command Import-Module 'd:\Users\Braby\.vscode\extensions\ms-vscode.powershell-2021.2.2\modules\PowerShellEditorServices\PowerShellEditorServices.psd1'; Start-EditorServices -HostName 'Visual Studio Code Host' -HostProfileId 'Microsoft.VSCode' -HostVersion '2021.2.2' -AdditionalModules @('PowerShellEditorServices.VSCode') -BundledModulesPath 'd:\Users\Braby\.vscode\extensions\ms-vscode.powershell-2021.2.2\modules' -EnableConsoleRepl -StartupBanner '=====> PowerShell Integrated Console v2021.2.2 <=====
' -LogLevel 'Normal' -LogPath 'd:\Users\Braby\.vscode\extensions\ms-vscode.powershell-2021.2.2\logs\1614615951-32066405-00df-48dd-bd18-8b2f8655bf801614615914391\EditorServices.log' -SessionDetailsPath 'd:\Users\Braby\.vscode\extensions\ms-vscode.powershell-2021.2.2\sessions\PSES-VSCode-4792-598641' -FeatureFlags @() 
01/03/2021 17:25:51 [NORMAL] -     PowerShell Editor Services args: Import-Module 'd:\Users\Braby\.vscode\extensions\ms-vscode.powershell-2021.2.2\modules\PowerShellEditorServices\PowerShellEditorServices.psd1'; Start-EditorServices -HostName 'Visual Studio Code Host' -HostProfileId 'Microsoft.VSCode' -HostVersion '2021.2.2' -AdditionalModules @('PowerShellEditorServices.VSCode') -BundledModulesPath 'd:\Users\Braby\.vscode\extensions\ms-vscode.powershell-2021.2.2\modules' -EnableConsoleRepl -StartupBanner '=====> PowerShell Integrated Console v2021.2.2 <=====
' -LogLevel 'Normal' -LogPath 'd:\Users\Braby\.vscode\extensions\ms-vscode.powershell-2021.2.2\logs\1614615951-32066405-00df-48dd-bd18-8b2f8655bf801614615914391\EditorServices.log' -SessionDetailsPath 'd:\Users\Braby\.vscode\extensions\ms-vscode.powershell-2021.2.2\sessions\PSES-VSCode-4792-598641' -FeatureFlags @() 
01/03/2021 17:25:51 [NORMAL] - powershell.exe started.
01/03/2021 17:25:51 [NORMAL] - Waiting for session file
01/03/2021 17:29:51 [NORMAL] - Timed out waiting for session file to appear.
01/03/2021 17:29:51 [NORMAL] - Language server startup failed.
01/03/2021 17:29:51 [ERROR] - The language service could not be started: 
01/03/2021 17:29:51 [ERROR] - Error: Timed out waiting for session file to appear.

Ce n'est pas ce qu'il faut faire !

Dès que vous ouvrez Visual Studio Code sur un projet Arduino il faut ouvrir un Terminal PlatformIO CLI en cliquant sur le tout petit bouton en bas dans le Barre Arduino :

Visual Studio Code pour Arduino - Terminal PlatformIO CLI
Visual Studio Code pour Arduino - Terminal PlatformIO CLI

Et vous obtenez le bon environnement pour exécuter toutes les commandes PlatformIO :

Visual Studio Code pour Arduino - Terminal PlatformIO CLI
Visual Studio Code pour Arduino - Terminal PlatformIO CLI

Voilà mon environnement de développement avec VSCode pour Arduino fonctionne est maintenant correctement configurer.

Architecture des chaînes de caractères

C'est une drôle de surprise, vous allez tomber sur :

const __FlashStringHelper *format

Il y en a qui pour gagner de la place vont vouloir stocker des variables dans la mémoire programme :

Architecture Harvard vs Von-Neuman

Du coup les chaînes sont illisibles, il faut des manipulation pour s'y retrouver.

Il vous faudra consulter la page suivante pour découvrir quels types de mémoires sont utilisés sur les boards arduino :


Arduino faire des Log et des Traces

Moi j'ai attaqué par une fonction que j'aime bien écrire :

void log_print(char const *aFormat, ...)
{
    char buffer[256];
    va_list args;

    va_start(args, aFormat);
    vsprintf(buffer, aFormat, args);
    va_end(args);

    Serial.print(buffer);
};

Cela ne fonctionne pas le format des doubles et des floats ne fonctionne pas avec les fonctions de la lib standard du C++.

J'ai trouvé la fonction
\\.platformio\packages\framework-arduino-avr\cores\arduino\Print.cpp
size_t Print::printFloat(double number, uint8_t digits)

qui permet d'afficher un Float par le port série ...

Comment comparer __FlashStringHelper* avec char* on Arduino ?


Pour finalement trouver ce que je cherche à faire :