Arduino et Processing

Bonjour,

Je suis nouveau dans la communauté Arduino, donc j'espère poster au bon endroit.

J'ai, il y a quelques temps, fais l'acquisition d'un kit de démarrage (Starter Kit). Dedans une carte Uno, des composants et un livre avec différents projets. Et l'un d'eux me pose problème.

Il s'agit d'utiliser la carte Arduino reliée à un potentiomètre pour manipuler la couleur de fond d'une fenêtre créée avec Processing. Sur la conception pas de problème. Et avec l'IDE Arduino je récupère sans problème la valeur du potentiomètre.

J'utilise Serial.write() pour envoyer cette valeur afin que Processing puisse la récupérer, mais quand je lance le programme écrit en Processing, j'ai des valeurs qui tournent en boucle et qui n'ont rien à voir : 10, 53, 255 (alors que dans l'IDE Arduino j'ai de bonnes valeurs). Auriez-vous une piste ?

De plus ils disent d'utiliser la fonction background dans Processing pour changer de fond, mais quelque soit la valeur de la teinte, le fond reste transparent... Si quelqu'un a une idée pour ça aussi.

Un grand merci :slight_smile:

Code Arduino :

int potPin = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(analogRead(potPin) / 4);
  Serial.write(analogRead(potPin) / 4);

  delay(1);
}

Code Processing :

import processing.serial.*;

Serial myPort;
PImage img;

int bgColor = 0;

void setup() {
  size(1,1);
  
  surface.setResizable(true);
  
  colorMode(HSB, 255);
  
  img = loadImage("https://www.liblogo.com/img-logo/ar185ae78-arduino-logo-arduino-logo-free-icon-of-vector-logo.png");
  surface.setSize(img.width, img.height);
  
  println("Ports en série disponibles :");
  println(Serial.list());
  print("Utilisation du port : ");
  println(Serial.list()[3]);
  
  myPort = new Serial(this, Serial.list()[3], 9600);
}

void draw() {
  if(myPort.available() > 0) {
    bgColor = myPort.read();
    println(bgColor); // Affiche en boucle 10, 53, 255
  }
  
  background(126, 255, 255);  // Qu'importe la première valeur, ça reste transparent
  image(img, 0, 0);
}

C'est Processing.
J'ai corrigé le titre.

il vous faut vérifier que sur votre ordi l'arduino UNO est bien sur la troisième entrée de la liste => que voyez vous dans la console de débug de Processing ?

Merci pour la réponse.

Oui, j'utilise le bon port. La console renvoie :

Ports en série disponibles :
COM1 COM3 COM4 COM7
Utilisation du port : COM7

Et COM7 est bien le port utilisé par Arduino UNO (qui est identique à l'IDE Arduino).

Et donc après j'ai en boucle une série de chiffre de façon un peu aléatoire :

50
53
53
13
50
53
53
13
10
255
...

Après j'ai cru comprendre que Processing renvoie les codes ASCII. Donc

  • 50 = 2
  • 53 = 5
  • 13 = Retour chariot
  • 10 = Saut de ligne
  • 255 = ÿ

Mais je ne sais pas trop quoi en faire. Peut-être qu'en voulant les afficher avec println() dans Processing il fait la conversion, et qu'en utilisant la fonction background() il conserve la valeur envoyée (et donc fait correspondre une teinte). Mais comme la fonction background semble ne pas fonctionner comme voulue (à savoir que le fond reste transparent quelque soit la valeur entrée manuellement), je ne peux pas voir les variations.

Bonjour,

Je ne comprend pas ce que tu veux faire ici. Tu envoies la valeur en ASCII et juste après tu envoies la valeur en binaire.

Dans l'idée je voulais vérifier les valeurs envoyées par Arduino dans l'IDE Arduino avec le moniteur série. Raison de la ligne Serial.println(). J'ai constaté qu'elles étaient cohérentes, j'ai donc fermé le moniteur série pour lancer Processing (ne pouvant pas utiliser plusieurs applications pour un même port). D'où l'utilisation de Serial.write() pour la récupérer avec processing.

J'ai déjà lancé le code en commentant la ligne Serial.println, mais Processing renvoie que des 0.

J'ai trouvé un début de solution :
L'image que j'ai utilisé était un PNG avec un fond en damier (et non pas transparent...). Désolé pour la gêne :sweat_smile:

Donc pour background j'ai trouvé la raison du pourquoi je n'avais pas de couleur. Maintenant le problème étant que le potentiomètre ne fait pas varier la couleur... :thinking:

Il y a des chances que ce 255 soit un -1 c’est à dire une erreur de lecture

Assurez vous de ne pas ouvrir le moniteur série

Alors j'ai redémarré ma machine, lancé processing, et rien n'y fait...

Par contre comportement un peu bizarre.

Ca commence à une valeur avec le fond d'une couleur. Tourner le potentiomètre ne change rien. Jusqu'à un moment où ça évolue lentement vers une autre valeur, et où ça semble rester définitivement...

Très étrange comme comportement, assez difficile à décrire.

Partagez ce que vous voyez dans la console

Vous parlez de ce que je fais afficher avec println() ? Alors, j'ai changé un peu mon code par rapport aux remarques précédentes :

Code Arduino

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.write(analogRead(potPin) / 4);

  delay(1);
}

Code Processing

import processing.serial.*;

Serial myPort;
PImage img;

int bgColor = 0;

void setup() {
  size(1,1);
  
  surface.setResizable(true);
  
  colorMode(HSB, 255);
  
  img = loadImage("https://www.liblogo.com/img-logo/ar185ae78-arduino-logo-arduino-logo-free-icon-of-vector-logo.png");
  surface.setSize(img.width, img.height);
  
  println("Ports en série disponibles :");
  println(Serial.list());
  print("Utilisation du port : ");
  println(Serial.list()[3]);
  
  myPort = new Serial(this, Serial.list()[3], 9600);
}

void draw() {
  if(myPort.available() > 0) {
    bgColor = myPort.read();
    println("[", millis(), "] ", bgColor);
  }
  
  background(bgColor, 255, 255);
}

Console

Ports en série disponibles :
COM1 COM3 COM4 COM7
Utilisation du port : COM7
[ 1098 ]  0
[ 1118 ]  0
[ 1132 ]  0
[ 1148 ]  0
[ 1168 ]  0
[ 1182 ]  139
[ 1198 ]  141
[ 1215 ]  142
[ 1232 ]  143
[ 1259 ]  145
[ 1265 ]  146
[ 1282 ]  147
[ 1299 ]  148
[ 1316 ]  0
[ 1332 ]  0
[ 1349 ]  0
[ 1365 ]  0
[ 1382 ]  0
[ 1398 ]  0
[ 1416 ]  0
[ 1432 ]  0
[ 1449 ]  0
[ 1466 ]  0
[ 1482 ]  0
[ 1498 ]  0
[ 1517 ]  0
[ 1531 ]  0
[ 1551 ]  0
[ 1564 ]  0
[ 1583 ]  0
[ 1597 ]  0
[ 1616 ]  0
[ 1632 ]  0
[ 1649 ]  0
[ 1665 ]  0
[ 1681 ]  0
[ 1698 ]  0
[ 1715 ]  0
[ 1733 ]  0
[ 1749 ]  0
[ 1768 ]  0
[ 1782 ]  0
[ 1799 ]  0
[ 1815 ]  0
[ 1833 ]  0
[ 1849 ]  5
[ 1865 ]  7
[ 1882 ]  8
[ 1898 ]  10
[ 1916 ]  12
[ 1932 ]  14
[ 1949 ]  16
[ 1965 ]  17
[ 1984 ]  19
[ 2002 ]  20
[ 2016 ]  22
[ 2032 ]  24
[ 2049 ]  26
[ 2066 ]  28
[ 2082 ]  30
[ 2099 ]  32
[ 2117 ]  34
[ 2131 ]  36
[ 2149 ]  38
[ 2165 ]  40
[ 2182 ]  42
[ 2199 ]  44
[ 2217 ]  46
[ 2234 ]  48
[ 2249 ]  50
[ 2266 ]  52
[ 2283 ]  54
[ 2300 ]  56
[ 2318 ]  57
[ 2332 ]  59
[ 2350 ]  61
[ 2365 ]  63
[ 2381 ]  64
[ 2399 ]  66
[ 2417 ]  68
[ 2441 ]  69
[ 2449 ]  71
[ 2466 ]  72
[ 2482 ]  74
[ 2500 ]  75
[ 2515 ]  77
[ 2532 ]  79
[ 2550 ]  80
[ 2565 ]  82
[ 2582 ]  83
[ 2598 ]  85
[ 2616 ]  86
[ 2632 ]  88
[ 2648 ]  89
[ 2666 ]  91
[ 2682 ]  92
[ 2700 ]  93
[ 2715 ]  95
[ 2732 ]  96
[ 2750 ]  98
[ 2767 ]  99
[ 2783 ]  100
[ 2800 ]  102
[ 2815 ]  103
[ 2833 ]  104
[ 2861 ]  106
[ 2865 ]  107
[ 2883 ]  108
[ 2899 ]  109
[ 2917 ]  111
[ 2934 ]  112
[ 2951 ]  113
[ 2967 ]  114
[ 2984 ]  116
[ 3000 ]  117
[ 3017 ]  118
[ 3036 ]  120
[ 3050 ]  121
[ 3068 ]  122
[ 3084 ]  123
[ 3102 ]  124
[ 3118 ]  126
[ 3135 ]  127
[ 3150 ]  128
[ 3168 ]  129
[ 3184 ]  130
[ 3200 ]  131
[ 3217 ]  132
[ 3235 ]  133
[ 3252 ]  134
[ 3267 ]  136
[ 3285 ]  137
[ 3300 ]  138
[ 3317 ]  139
[ 3334 ]  141
[ 3350 ]  142
[ 3367 ]  143
[ 3385 ]  145
[ 3403 ]  146
[ 3418 ]  147
[ 3435 ]  148
[ 3451 ]  149
[ 3466 ]  0
[ 3483 ]  0
[ 3501 ]  0
[ 3519 ]  0
[ 3542 ]  0
[ 3551 ]  0
[ 3568 ]  0
[ 3584 ]  0
[ 3600 ]  0
[ 3616 ]  0
[ 3635 ]  0
[ 3651 ]  0
[ 3668 ]  0
[ 3683 ]  0
[ 3701 ]  0
[ 3717 ]  0
[ 3735 ]  0
[ 3751 ]  0
[ 3775 ]  0
[ 3784 ]  0
[ 3800 ]  0
[ 3817 ]  0
[ 3833 ]  0
[ 3851 ]  0
[ 3868 ]  0
[ 3884 ]  0
[ 3900 ]  0
[ 3917 ]  0
[ 3935 ]  0
[ 3950 ]  0
[ 3968 ]  0
[ 3984 ]  0
[ 4000 ]  0
[ 4020 ]  0
[ 4040 ]  0
[ 4051 ]  0

Le 128 étant la valeur de mon potentiomètre au moment de lancer l'application.

J'ai l'impression que les variations sont prises en compte les 1ère secondes et s'appliquent normalement à la suite. Mais une fois l'application bien lancée, pas moyen de prendre en compte les nouvelles valeurs du potentiomètre...

Pour commencer, tu devrais :

  • transmettre sur la liaison série à 115200 plutôt qu'à 9600.
  • mettre un delay(100); dans le code Arduino pour éviter de saturer la console. Quitte à réduire ce delay() plus tard si tu as réellement besoin de recevoir tes informations aussi souvent.
  • remettre le Serial.print() coté Arduino et ouvrir une console pour voir ce qui est envoyé et comparer avec ce que tu reçois dans l'autre application.

Mettez la dernière ligne dans le if, vous voulez changez la couleur de fond que quand vous recevez une nouvelle valeur.

Sinon dans le code arduino, mettez un délai plus important, genre 50ms ou 100ms


1 Like

Et bien ça a résolu mon problème.

Donc si j'ai bien compris, Arduino envoyait trop d'informations pour que Processing puisse les gérer en temps et en heure ?

Bon à savoir. Dommage qu'ils ne l'expliquent pas dans le bouquin :frowning:

Merci

Vous faites un analogRead() qui retourne une valeur jusqu’à 1023 et divisez par 4 ce qui fait que la valeur est inférieure à 255 la plupart du temps sauf entre 1021 et 1023 mais comme vous travaillez en entier dans ce cas la division donne quand même 255 ➜ donc vous envoyez une valeur sur 1 octet entre 0 et 255.

À 9600 bauds vous envoyez environ un octet toutes les ms et comme vous aviez un délai de 1ms ça veut dire que vous tirez un peu à la mitraillette. Processing n’est pas un foudre de guerre donc la lecture peut s’accumuler un peu dans le buffer coté ordinateur créant un décalage temporel surtout si vous reaffichez le fond à chaque tour de loop.

En mettant le coup de pinceau uniquement quand vous recevez un nouvel octet c’est mieux mais comme toutes les ms vous envoyez une valeur, ça se fait 1000 fois par secondes . Ça ne sert à rien car votre œil ne perçoit pas un taux de rafraîchissement si rapide.

idéalement votre code devrait émettre la valeur coté arduino uniquement quand cette valeur a changée comme cela le code coté processing ne travaillerait que lorsqu’il y a un vrai affichage à faire.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.