EXCEL vers Arduino

Comment transmettre un ensemble de valeurs de x=.. et y=.. obtenues dans un classeur EXCEL vers une carte Arduino (table traçante, découpe 2D, imprimante 3D, ..) ?

Je considère ici que la carte peut être reliée au PC.
La liaison série d'excel nécessite le composant MsComm32.ocx qui n'est plus installé. Il n'est pas évident de trouver MsComm32.ocx complet et dans sa dernière version (2009), saus à avoir aussi installé VB6.
Une solution a été développée par Michael Schwimmer ici : michael-schwimmer.de - This website is for sale! - michael schwimmer Resources and Information.
N’ayant pas trouvé de réponse qui m’ait réellement satisfait, je vous fais part modestement de quelques développements.

1- Stocker les données dans un fichier .h

Je vais commencer par le plus simple, encore que j'aie poussé cette solution un peu loin quand même, de quoi se faire plaisir !
Le fichier excel suivant générera un fichier compatible arduino inclus dans la bibliothèque.
Il faut indiquer dans le programme VBA où se trouve le répertoire de croquis Arduino.
Cette solution est simple mais nécessite de recompiler le croquis à chaque évolution des données.

voir fichier ExcelToArduino_libraries

#include <DataExcel.h>

void setup()
{
  Serial.begin(9600);
  for (int i = 0; i < max-1; i = i + 1) {
    Serial.print(i);
    Serial.print(" : ");
    Serial.print("x = ");
    Serial.print(x[i]);
    Serial.print(" | y = ");
    Serial.println(y[i]);
  }
}

void loop()
{
}

2- Utiliser la liaison série de l’IDE Arduino

Ici aussi j’ai poussé la solution assez loin jusqu’à lancer l’IDE puis le moniteur série par Excel
Pour le croquis, je me suis appuyé sur ce topic : Serial Input Basics - updated - Introductory Tutorials - Arduino Forum

voir fichier ExcelToArduino_LiaisonSerie

// http://forum.arduino.cc/index.php?topic=396450.0
// Example 5 - Receive with start- and end-markers combined with parsing
// Modification : <valeur de x,valeur de y>

const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars];
float xfloatFromPC = 0.0;
float yfloatFromPC = 0.0;
boolean newData = false;

void setup() {
    Serial.begin(9600);
    Serial.println("Enter data in this style <12, 24.7>  ");
    Serial.println();
}

void loop() {
    recvWithStartEndMarkers();
    if (newData == true) {
        strcpy(tempChars, receivedChars);
            // this temporary copy is necessary to protect the original data
            // because strtok() used in parseData() replaces the commas with \0
        parseData();
        showParsedData();
        newData = false;
    }
}

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char rc;

    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}

void parseData() {      // split the data into its parts

    char * strtokIndx; // this is used by strtok() as an index

    strtokIndx = strtok(tempChars,",");
    xfloatFromPC = atof(strtokIndx);
 
    strtokIndx = strtok(NULL, ",");
    yfloatFromPC = atof(strtokIndx);

}

void showParsedData() {
    Serial.print("x = ");
    Serial.print(xfloatFromPC);
    Serial.print(" | y = ");
    Serial.println(yfloatFromPC);
}

ExcelToArduino_LiaisonSerie.zip (20.5 KB)

ExcelToArduino_libraries.zip (16.7 KB)

Ok mais la solution ne fonctionne qu'avec des logiciels propriétaires microsoft.

Quid de Linux et de LibreOffice ?

En effet (mais c'était une demande s'appuyant sur excel, ce que j'ai spécifié dans le titre).

Ooo ou LibreOffice peut aussi créer via macro un fichier de données, donc pour le premier point, l'idée de transférer les données d'OpenOffice ou LibreOffice via un fichier stocké en librairie s'applique.

Pour l'utilisation de la liaison série, je ne suis pas sûr d'avoir la solution. Mais la communication directe via le port série est peut-être possible Forum OpenOffice LibreOffice NeoOffice - [Résolu][Basic] Utiliser un port COM (RS232) - (Consulter le sujet).

Cela pourrait faire l'objet d'un autre topic.

Pour travaillé sur excel via arduino j'utilise la macro PLX de paralax et cela fonctionne a merveille :slight_smile: