Arduino-Processing grapher

L’idée est de récupérer la valeur en entrée sur le port analogique 0 de l’Arduino (pour le coup, vous pouvez utiliser pratiquement n’importe quel composant/capteur analogique), et de la renvoyer vers le port série pour qu’elle soit traitée par le PC sur lequel l’Arduino est branché (en USB).

Pour visualiser les données “graphées” en temps réel, vous pouvez utiliser le moniteur série de l’IDE Arduino, ou des librairies comme Processing, PD, Max/MSP, ou n’importe quel autre programme capable de lire et interpréter les données depuis un port série du PC.

Ce code a été écrit par David A. Mellis en 2006, et mis à jour par Tom Igoe et Scott Fitzgerald en 2012.
Il est disponible dans le domaine public et à cette adresse : http://www.arduino.cc/en/Tutorial/Graph

void setup() {
  Serial.begin(9600); // Initialisation de la communication série
}

void loop() {
  Serial.println(analogRead(A0)); // Envoi de la valeur du port analogique 0
  delay(2); // Petit délai pour stabilisation du convertisseur analogique->digital
}

A ce niveau là, rien de très compliqué.

Maintenant, il faut traiter ce qui est envoyé par l’Arduino (et donc ce qui est reçu par le PC).
Pour ça, on va récupérer les chaines encodées en ASCII au niveau du port série (à 9600 baud) et les grapher. Les valeurs sont comprises entre 0 et 1023 suivies d’un retour à la ligne.
Voici ce que ça donne avec Processing :

import processing.serial.*;
 
Serial myPort; // Port série
int xPos = 1; // Positionnement du graphe
 
void setup () {
  size(400, 300); // Taille de la fenêtre
  println(Serial.list()); // Liste des ports séries disponibles
  myPort = new Serial(this, Serial.list()[0], 9600); // Adapter le port en fonction des besoins
  myPort.bufferUntil('\n'); // serialEvent() ne doit pas être utilisé avant le retour à la ligne
  background(0);
}

void draw () {
  // Tout se passe dans serialEvent()
}
 
void serialEvent (Serial myPort) {
  String inString = myPort.readStringUntil('\n'); // Récupération de la chaîne ASCII
 
  if (inString != null) {
    
    inString = trim(inString); // On s'occupe des espaces vides
    float inByte = float(inString); // Conversion en entier
    inByte = map(inByte, 0, 1023, 0, height); // Positionnement vertical
 
    // Dessin de la ligne
    stroke(127,34,255);
    line(xPos, height, xPos, height - inByte);
 
    // Si on atteint le bord de l'écran, on retourne au début
    if (xPos >= width) {
      xPos = 0;
      background(0); 
    } else {
      xPos++;
    }
  }
}
 
/* Max/MSP v5 patch for this example
 ----------begin_max5_patcher----------
1591.3oc0YszbaaCD9r7uBL5RalQUAO3CvdyS5zVenWZxs5NcfHgjPCIfJIT
RTxj+6AOHkoTDooroUs0AQPR73a+1cwtK3WtZxzEpOwqlB9YveAlL4KWMYh6
Q1GLo99ISKXeJMmU451zTUQAWpmNy+NM+SZ2y+sR1l02JuU9t0hJvFlNcMPy
dOuBv.U5Rgb0LPpRpYBooM3529latArTUVvzZdFPtsXAuDrrTU.f.sBffXxL
vGE50lIHkUVJXq3fRtdaoDvjYfbgjujaFJSCzq4.tLaN.bi1tJefWpqbO0uz
1IjIABoluxrJ1guxh2JfPO2B5zRNyBCLDFcqbwNvuv9fHCb8bvevyyEU2JKT
YhkBSWPAfq2TZ6YhqmuMUo0feUn+rYpY4YtY+cFw3lUJdCMYAapZqzwUHX8S
crjAd+SIOU6UBAwIygy.Q1+HAA1KH6EveWOFQlitUK92ehfal9kFhUxJ3tWc
sgpxadigWExbt1o7Ps5dk3yttivyg20W0VcSmg1G90qtx92rAZbH4ez.ruy1
nhmaDPidE07J+5n2sg6E6oKXxUSmc20o6E3SPRDbrkXnPGUYE.i5nCNB9TxQ
jG.G0kCTZtH88f07Rt0ZMMWUw8VvbKVAaTk6GyoraPdZff7rQTejBN54lgyv
HE0Ft7AvIvvgvIwO23jBdUkYOuSvIFSiNcjFhiSsUBwsUCh1AgfNSBAeNDBZ
DIDqY.f8.YjfjV1HAn9XDTxyNFYatVTkKx3kcK9GraZpI5jv7GOx+Z37Xh82
LSKHIDmDXaESoXRngIZQDKVkpxUkMCyXCQhcCK1z.G457gi3TzMz4RFD515F
G3bIQQwcP3SOF0zlkGhiCBQ1kOHHFFlXaEBQIQnCwv9QF1LxPZ.A4jR5cyQs
vbvHMJsLll01We+rE2LazX6zYmCraRrsPFwKg1ANBZFY.IAihr8Ox.aH0oAL
hB8nQVw0FSJiZeunOykbT6t3r.NP8.iL+bnwNiXuVMNJH9H9YCm89CFXPBER
bz422p8.O4dg6kRxdyjDqRwMIHTbT3QFLskxJ8tbmQK4tm0XGeZWF7wKKtYY
aTAF.XPNFaaQBinQMJ4QLF0aNHF0JtYuHSxoUZfZY6.UU2ejJTb8lQw8Fo5k
Rv6e2PI+fOM71o2ecY1VgTYdCSxxUqLokuYq9jYJi6lxPgD2NIPePLB0mwbG
YA9Rgxdiu1k5xiLlSU6JVnx6wzg3sYHwTesB8Z5D7RiGZpXyvDNJY.DQX3.H
hvmcUN4bP1yCkhpTle2P37jtBsKrLWcMScEmltOPv22ZfAqQAdKr9HzATQwZ
q18PrUGt6Tst2XMCRUfGuhXs6ccn23YloomMqcTiC5iMGPsHsHRWhWFlaenV
XcqwgCQiGGJzptyS2ZMODBz6fGza0bzmXBj7+DA94bvpR01MffAlueO7HwcI
pWCwmzJdvi9ILgflLAFmyXB6O7ML0YbD26lenmcGxjVsZUN+A6pUK7AtTrPg
M+eRYG0qD9j4I7eEbco8Xh6WcO.or9XDC6UCiewbXHkh6xm5LiPEkzpJDRTu
mEB44Fgz4NCtJvX.SM1vo2SlTCZGAe7GZu6ahdRyzFOhYZ+mbVVSYptBw.K1
tboIkatIA7c1cTKD1u.honLYV04VkluHsXe0szv9pQCE9Ro3jaVB1o15pz2X
zYoBvO5KXCAe0LCYJybE8ZODf4fV8t9qW0zYxq.YJfTosj1bv0xc.SaC0+AV
9V9L.KKyV3SyTcRtmzi6rO.O16USvts4B5xe9EymDvebK0eMfW6+NIsNlE2m
eqRyJ0utRq13+RjmqYKN1e.4d61jjdsauXe3.2p6jgi9hsNIv97CoyJ01xzl
c3ZhUCtSHx3UZgjoEJYqNY+hYs5zZQVFW19L3JDYaTlMLqAAt1G2yXlnFg9a
53L1FJVcv.cOX0dh7mCVGCLce7GFcQwDdH5Ta3nyAS0pQbHxegr+tGIZORgM
RnMj5vGl1Fs16drnk7Tf1XOLgv1n0d2iEsCxR.eQsNOZ4FGF7whofgfI3kES
1kCeOX5L2rifbdu0A9ae2X.V33B1Z+.Bj1FrP5iFrCYCG5EUWSG.hhunHJd.
HJ5hhnng3h9HPj4lud02.1bxGw.
-----------end_max5_patcher-----------
*/
Share