Bonjour,
J'essaie de me bricoler des fonctions pour commander un Arduino à partir d'une fiction intéractive de style Twine. Twine, en gros, cela vous fabrique un .html du type "livre dont vous êtes le héros", sans que vous ayez à savoir programmer du .html ... Twine supporte plusieurs formats d'histoire, j'utilisais d'abord Harlowe mais il m'a vite semblé que SugarCube était meilleur pour implémenter des javascripts et c'est ce dont on a besoin.
Donc, "en gros", j'ai un site qui utilise des javascripts pour envoyer des instructions à une Arduino UNO, à travers le port COM4 et à travers un Server Node.
J'ai réalisé une première partie qui réussit à envoyer des variables de type "char". Là, je sens que je vais devoir copier du code (celui qui marche d'abord)...
void loop() {
if (Serial.available() > 0) {
char command = Serial.read();
if (command == 'H') {
digitalWrite(7, HIGH);}
else if (command == 'L') {
digitalWrite(7, LOW);
}
}}
De l'autre côté, j'ai mon javascript dans Twine qui utilise ce code là :
<<script>>
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:3000/H");
xhr.send();
<</script>>
Là, quand j'appelle ce script, le bousin envoie "http://localhost:3000/H" et le server Node envoie un H docilement sur le port COM de mon Arduino, qui le réceptionne et qui m'allume ma LED. Cela marche, c'est parfait, je suis content ...
Maintenant, je veux passer à la vitesse supérieure et envoyer des variables plus complexes à mon Arduino, par exemple en envoyant du texte à afficher sur un écran LED à partir d'un PROMPT ...
Naturellement, j'ai essayé dans un premier temps à updater mon code en essayant d'utiliser des "strings". Cela n'a pas marché et j'ai lu le tuto sur l'écoute des ports séries de J-M-L que j'ai trouvé via une réponse à quelqu'un qui a fait quelque chose comme moi ...
Donc ça donnait quelque chose comme ça :
void loop() {
if (Serial.available() > 0) {
String command = Serial.readStringUntil('\n');
if (command == 'HelloWorld') {
digitalWrite(7, HIGH);
} else if (command == 'Ciao') {
digitalWrite(7, LOW);
}
}}
Et avec un script derrière qui ressemblait à ça :
<<script>>
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:3000/HelloWorld\n");
xhr.send();
<</script>>
avec ou sans \n, avec ou sans #, avec ou sans \0 ...
La requête part bien. J'ai essayé de l'envoyer directement ... ça part, ça ne lit pas à l'Arduino.
BON, j'ai lu le tuto, et j'ai remis à jour mon code en suivant les instructions de JML. Et ça marchait, du moins à travers le Serial Monitor du Arduino IDE. Quand je tape "HelloWorld" sur le Monitor IDE, la Arduino UNO me répond bien les lettres une à une et le mot au final.
Mais quand j'essaie le même code non pas à travers le COM série de l'Arduino mais à travers le Node.js, je n'ai rien. Et je suis bien embêté parce que comme je ne peux pas avoir ouvert en même l'Arduino Ide et le NodeJS (cela me crée un conflit de port COM), je n'arrive pas à savoir ce qui passe, ce qui ne se passe pas ...
Je suspecte la donnée d'arriver sous un format que je ne comprends et que "du coup", l'Arduino est perdu. Mais en vrai, je suis un peu à court d'idées. Pourquoi ça marche quand j'envoie un H et pas un HelloWorld ...?
Après, il est possible que ce qui soit défectueux, c'est le code pour interpréter le message long.
En effet, la méthode du (tutoriel de jml) produit un c-string. J'ai essayé "plein" d'instructions pour lire ce C-string avec un seul caractère, H (envoyer H en char, ça marchait ... donc pourquoi pas essayer d'envoyer H en C-string ou même en string ...). Cela a donné ce code là hier soir, mais c'est tellement pourri que j'ai un peu honte ...
void loop() {
if (! ecouter()) {
if (message == 'H\0') {
digitalWrite(7, HIGH);}
else if (message == 'L\0') {
digitalWrite(7, LOW);}
}
if (! ecouter()) {
if (message == 'H') {
digitalWrite(7, HIGH);}
else if (message == 'L') {
digitalWrite(7, LOW);}
}
if (! ecouter()) {
if (message == 'H#') {
digitalWrite(7, HIGH);}
else if (message == 'L#') {
digitalWrite(7, LOW);}
}
}
Je soupçonne que le server node.js ne fait pas les appels de pied qui trigger le "écouter" ce qui fait échouer les méthodes "prescrites", mais j'en sais rien.
J'avoue que je commençais à accuser la fatigue hier soir. C'est sans doute quelque chose sur lequel vous devriez pouvoir m'éclairer en cinq secondes... Dans tous les cas, je vous remercie du temps passé à me lire.