Go Down

Topic: EXCEL vers Arduino (Read 805 times) previous topic - next topic

Steelson

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 : http://michael-schwimmer.de/vba117.htm
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

Code: [Select]
#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 : http://forum.arduino.cc/index.php?topic=396450.0

voir fichier ExcelToArduino_LiaisonSerie

Code: [Select]
// 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);
}

68tjs

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

Quid de Linux et de LibreOffice ?

Steelson

#2
May 14, 2018, 06:00 pm Last Edit: May 15, 2018, 01:44 am by Steelson
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 https://forum.openoffice.org/fr/forum/viewtopic.php?p=169979&sid=4c6979f3da515f5e2f4660b52fd928a8#p169979.

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

Go Up