LOCODUINO

Piloter son Arduino avec son navigateur web et Node.js

Piloter son Arduino avec son navigateur web et Node.js (1)

.
Par : bobyAndCo

DIFFICULTÉ :

Pour piloter votre Arduino, vous pouvez utiliser des boutons, des interrupteurs ou encore des potentiomètres. Ils font d’ailleurs partie de tous les bons kits de démarrage.

JPEG - 60.6 kio

Mais vous pouvez aussi rêver d’interfaces graphiques riches et esthétiques avec lesquelles vous pourriez commander votre Arduino depuis votre ordinateur, votre tablette ou encore votre téléphone portable. C’est par exemple le cas d’un TCO qui vous permettrait de commander tous les aiguillages de votre réseau ou de manettes pour piloter vos locomotives.

PNG - 477.2 kio

Processing est l’une des alternatives pour réaliser des interfaces graphiques dont la programmation s’apparente à celle de l’Arduino. Son utilisation se fait en lignes de code et repose sur Java.

Mais ce que je vous propose ici, c’est de recourir aux outils de création graphique du web qui sont particulièrement conçus pour produire facilement des contenus graphiques très esthétiques. Par ailleurs, il existe une multitude de bibliothèques qui vous offrent des contenus déjà créés, permettant de simplifier grandement le travail. Vous connaissez tous les glyphicons de Bootstrap sans savoir peut-être que ceux-ci proviennent de bibliothèques : plus d’infos sur les glyphicons

L’application de pilotage de locomotives que j’ai déjà présentée sur Locoduino (copie d’écran ci-dessus) n’utilise que des bibliothèques graphiques. A aucun moment je n’ai utilisé le moindre outil de dessin.

JPEG - 11.3 kio

Et Node.js dans tout cela ?

Eh bien, c’est Node qui, installé sur votre ordinateur (ou tout ordinateur en réseau), va servir d’interface réseau entre la page web que vous aurez créé avec ses boutons et potentiomètres et la ou les cartes Arduino que vous souhaitez piloter. Notez que Node fonctionne sur Mac, Windows et Linux.

PNG - 227.9 kio

Node va-t-il m’obliger à ajouter un shield Ethernet sur mon Arduino ?

Non ! Node peut communiquer avec vos Arduino via le port série. A partir de là, votre Arduino équipé par exemple d’une carte CAN pourra relayer les messages à d’autres Arduino également équipés en CAN.

Mais au fait, c’est quoi Node ?

Tenter de définir Node en quelques lignes est impossible. Wikipédia nous donne la définition suivante : « une plate-forme logicielle libre et événementielle en JavaScript orientée vers les applications réseau qui doivent pouvoir monter en charge »

En réalité, Node offre côté serveur un environnement qui utilise le JavaScript et permet grâce à de très nombreuses bibliothèques de faire tourner des applications qui communiquent en réseau. Des serveurs web, mais pas que…

Par conséquent Node est une façon de développer une interface Web dans un serveur qui commande directement votre Arduino.

Pourquoi Node est-il autant plébiscité ?

Node est simple, puissant et rapide. C’est un environnement de bas niveau comme peut l’être le langage C par exemple. Node.js utilise le moteur d’exécution ultrarapide V8 de Google Chrome. Node s’est ainsi imposé sur des sites aussi célèbres que PayPal, Groupon ou Linkedln pour n’en citer que quelques uns.

Chez PayPal, on considère que Node c’est un tiers de lignes de code en moins, deux fois plus de requêtes traitées par seconde et la réduction d’un tiers du temps de réponse moyen.

Mais dans le contexte qui nous intéresse ici, à savoir, piloter un Arduino à partir d’un navigateur web, on va voir que son point fort est bien la simplicité. A peine une quarantaine de lignes de codes, programmées pratiquement une fois pour toute, quelque soit l’évolution de notre interface graphique ou les nouvelles pages que nous allons créer.

Avertissement : Node nécessite de travailler à l’intérieur du terminal en lignes de commandes. Cela demande une certaine connaissance de l’informatique. Néanmoins, une fois que votre serveur sera installé, vous n’aurez plus à y revenir. Par ailleurs, si vous êtes bien attentif et un peu motivé vous ne devriez pas rencontrer de difficultés particulières. Suivez précisément les consignes qui vous sont données.

Sous Windows, cela s’appelle l’invite de commande :

JPEG - 23.7 kio

Sous Mac OS X ou Linux, cela s’appelle Terminal :

JPEG - 31.5 kio

Installer Node.js

Pour l’installation de Node, je vous renvoie au site OpenClassRooms qui décrit tout ceci de manière claire et facile.

Vous y trouverez, en fonction de votre système :

  • Où le télécharger.
  • Comment l’installer.
  • Comment tester qu’il fonctionne.

Pour commencer rapidement, nous allons reprendre les exemples d’OpenClassRooms. Avec n’importe quel éditeur de texte, vous allez créer un fichier en copiant le code suivant :

var http = require('http');
var server = http.createServer(function(req, res) {
  res.writeHead(200);
  res.end('Salut Locoduino !');
});
server.listen(8080);
console.log("Server Ok");

Ensuite, vous allez l’enregistrer au premier niveau de votre session. Pour Linux ou Mac, ça se passe dans le répertoire « user », au même niveau que le dossier « node_modules » (pas dedans). Pour Windows, il s’agit de « c :\Utilisateurs\VotreNom », ou « c :\Users\VotreNom » à partir de l’invite de commande, et le répertoire « node_modules » n’existe pas encore. Nommez le nouveau fichier « startNode.js ». Maintenant, dans le terminal, vous allez taper « node startNode.js ». Dans mon cas, sur mon ordinateur qui s’appelle Christophe, voici le message qui s’affiche :

PNG - 9.6 kio

Si tout c’est bien déroulé, vous allez ensuite avoir le message suivant :

PNG - 18.9 kio

Important : Pour ouvrir le terminal sous Windows, allez chercher Node dans vos programmes, puis développez avec la flèche à droite pour obtenir les différentes options (comme le montre la figure ci-dessous) et sélectionnez Node.js command prompt. L’autre solution est de n’importe où taper une fois sur la touche ’Windows’ à gauche de la barre espace pour ouvrir le menu ’Démarrer’, et sans rien sélectionner taper directement ’node’. Toutes les applications dont le nom commence par ’node’ s’afficheront, il suffira de lancer la bonne ! Une fois dans le terminal, pour récupérer l’invite de commande, il suffit de taper le raccourci clavier CTRL + C. Pour fermer le terminal, et donc sortir du programme Node, il suffit de taper exit suivi de la touche Entrée (Return).

Dans votre navigateur, entrez http://localhost:8080 comme url. Vous devriez voir apparaître le texte : Salut Locoduino !

Nous venons de créer un serveur web qui « écoute » sur le port 8080 et qui, quand on l’interroge, retourne un header 200 qui signifie « communication établie » et un texte qui s’affiche dans la page « Salut Locoduino ».

J’ai envie de dire, le plus dur est fait ! Nous allons maintenant faire évoluer le code exécuté par Node. Notez à la première ligne du code l’expression require('http'). C’est en quelque sorte l’équivalent de include en C. On demande à l’application de charger une bibliothèque particulière (pour Node, cela s’appelle un module). Ici, le module http qui fournit tout un certain nombre de fonctions. Nous allons utiliser d’autres modules pour simplifier la rédaction de notre code.

Pour qu’un module soit utilisable par Node, il devra avoir été chargé au moins une fois sur votre ordinateur. Pour ce faire, on tape dans la fenêtre du terminal npm install puis le nom du module. Ici, nous allons installer le module socket.io dont nous allons avoir besoin. Soit :

npm install socket.io.

Une petite précision concernant les installations de modules sur Mac. Il se peut que l’installation ne se soit pas bien déroulée simplement parce que vous ne disposez pas avec votre session des droits suffisants. Pour Linux ou Mac, il vous faudra alors taper sudo puis npm install socket.io soit en entier et sur une ligne :

sudo npm install socket.io.

Il vous sera alors demandé d’entrer le password d’administrateur et si celui-ci est correct, l’installation se poursuivra normalement. Pour Windows, la fenêtre de demande de confirmation d’accès administrateur s’affichera et vous n’aurez qu’à valider.

Le module socket.io va nous permettre de créer une communication synchrone et permanente avec le serveur. Ainsi, il vous sera possible d’envoyer des ordres à votre Arduino, mais cela nous permettra aussi de voir dans votre page web les messages que l’Arduino va retourner via la fonction Serial.print (ou Serial.println).

Nous allons en profiter pour installer deux autres modules dont nous allons avoir besoin. Un pour la manipulation de fichiers sur disque qui s’appelle fs et l’autre serialport qui va servir à envoyer les données par le port série à l’Arduino.

Nous allons également avoir besoin de modules pour la gestion des différentes pages web que nous allons créer. Ce sont les modules path et url.

Dans la fenêtre du terminal, nous allons donc taper :

npm install fs puis
npm install serialport puis
npm install path et enfin
npm install url.

A chaque installation vous verrez peut-être des lignes s’afficher telles que :

JPEG - 19.5 kio

Vous pouvez ensuite vérifier que les modules sont présents dans le dossier « node_modules ».

Vous allez maintenant placer tous les fichiers téléchargeables ici :

archive1

dans le répertoire où se trouve le dossier « node_modules », là où vous avez déjà placé « startNode.js ».

Avant d’aller plus loin, vous allez devoir modifier le fichier « serialport.js » qui est situé à l’intérieur des dossiers suivants :
node_modules -> serialport -> lib -> serialport.js.
Ligne 32, vous allez entrez baudRate: 115200 au lieu de 9600 comme actuellement.
Enregistrez et fermez ce fichier.

Ouvrez dans l’IDE d’Arduino le sketch « power1.ino » et téléversez le dans votre Arduino.

Au passage, notez le port série auquel est connecté votre Arduino.
Dans le fichier « arduino.js », la première ligne indique :
var usbserial = '/dev/cu.usbmodem1451';
Si le port série de votre Arduino ne coincide pas exactement avec cette ligne, alors changez le nom du port série dans cette ligne. Par exemple, sous Windows, si le module Arduino utilise le port COM4, vous aurez à changer cette ligne pour :
var usbserial = 'COM4';

Dans la fenêtre de votre terminal, vous allez entrer « node arduino.js ». Le message Communication serie Arduino 115200 bauds : Ok vous indique que Node a réussi à communiquer avec la carte. Sinon, vérifiez la connexion de la carte au port USB.

ALLUMER OU ÉTEINDRE LA LED DE VOTRE ARDUINO A PARTIR DE VOTRE NAVIGATEUR

Dans votre navigateur, vous allez entrer l’url : http://localhost:8080/power1.html

Sur la page qui apparaît, quand vous cliquez sur le bouton « on », la LED de la carte doit s’allumer et inversement quand vous cliquez sur le bouton « off ».

La ligne de logs sous les boutons affiche les messages retournés par l’Arduino. Ici 1 ou 0 selon que la LED est allumée ou éteinte.

PNG - 30.4 kio

Regardons tout d’abord le code de l’Arduino :

/*
 * Eteindre ou allumer la LED_BUILTIN d'un Arduino en fonction du message reçu
 * d'un navigateur web par l'intermédiaire de Node.js.
 * Christophe BOBILLE juin 2017
 */

void process(unsigned char inChar) {
  switch (inChar) {
    case 48:
      digitalWrite(LED_BUILTIN, LOW);
      Serial.print("0");
      break;
    case 49:
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.print("1");
      break;
    default:
      Serial.print("error");
  }
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  while (Serial.available()) {
     unsigned char inChar = (unsigned char)Serial.read();
     process(inChar);
  }
}

Dans le loop, la boucle while (Serial.available()) ligne 28 attend que quelque chose soit présent sur le port série. Quand c’est le cas, le caractère reçu est stocké dans la variable inChar. Je ne parle bien que d’un seul caractère, ce qui va être largement suffisant pour l’instant. Puis la fonction void process(unsigned char inChar) est appelée avec en paramètre le caractère reçu.

Dans cette fonction process, j’utilise un switch qui est beaucoup plus rapide et beaucoup plus clair quand vous souhaitez traiter un nombre important de cas. Si le caractère reçu est 48 alors on éteint la LED, si c’est 49, on l’allume. Et comme dans tout swich qui se respecte, je prévois tous les autres cas avec default qui signifie que si le message reçu ne correspond à rien de ce qui est attendu on retourne un message « error ».

Pourquoi case 48 ou case 49 dans le switch alors que nous verrons par la suite que ce sont les caractères « 0 » ou « 1 » qui vont être envoyés. C’est que dans la variable inChar, c’est la valeur ASCII du caractère que je récupère et non la valeur du caractère. Ce qui m’arrange beaucoup car il y a 127 codes ASCII pour 127 caractères. Un seul caractère me permet donc d’avoir un codage en 7 bits (127 possibilités différentes). En décimal, avec 1 caractère je ne couvre que la plage 0 à 9 puis il me faut 2 caractères pour 10 à 99 ce qui reste encore inférieur à mes 127 possibilités précédentes.

L’Arduino ne peut utiliser que les 127 premiers caractère de la table ASCII et ne connaît pas ce que l’on appelle la table ASCII étendue qui comprend en plus et entre autres les caractères accentués.

Mais j’aurais tout aussi bien pu écrire :

switch (inChar) {
    case '0':
      digitalWrite(LED_BUILTIN, LOW);
      Serial.print("0");
      break;
    case '1':
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.print("1");
      break;
    default:
      Serial.print("error");
  }

’0’ ou ’1’ entre simple quote sont la représentation du caractère. En effet char ’0’ est équivalent à char 48. Par contre "0" ou "1" entre double quote n’auraient pas fonctionné car ils représentent des chaines de caractères (string). Retenez qu’avec Arduino (et les langages C ou C++) un caractère s"écrit ’A’ alors qu’une chaîne s’écrit "A" même si elle n’a qu’un caractère.

Concernant le code JavaScript « arduino.js » qui sert à faire fonctionner notre application sur Node, je ne m’y attarderai pas. En effet, vous pouvez le considérer comme une bibliothèque sans savoir ce qu’il y a dedans. Aucune modification ne sera nécessaire pour tous les exemples que nous aborderons et bien probablement tout ce que vous voudrez créer par la suite. Mais je répondrai volontiers à tous ceux qui souhaiteraient avoir des informations complémentaires.

Comme indiqué plus haut, vous devrez tout de même régler un paramètre à la ligne 1 de ce fichier en entrant votre port série spécifique. Pour mon Uno ou mon Mega sur Mac, ce réglage est : var usbserial = '/dev/cu.usbmodem1451';. Sur Windows, cette variable sera du type var usbserial = 'COM3'; ou COM4...

var usbserial = '/dev/cu.usbmodem1451'; // Pour mon UNO et mon MEGA
//var usbserial = '/dev/cu.usbserial-AL02VFGY'; // Pour mon NANO

var http = require('http');
var fs = require('fs');
var path = require("path");
var url = require("url");

// Gestion des pages HTML
function sendError(errCode, errString, response) {
  response.writeHead(errCode, {"Content-Type": "text/plain"});
  response.write(errString + "\n");
  response.end();
  return;
}

function sendFile(err, file, response) {
  if(err) return sendError(500, err, response);
  response.writeHead(200);
  response.write(file, "binary");
  response.end();
}

function getFile(exists, response, localpath) {
  if(!exists) return sendError(404, '404 Not Found', response);
  fs.readFile(localpath, "binary",
   function(err, file){ sendFile(err, file, response);});
}

function getFilename(request, response) {
  var urlpath = url.parse(request.url).pathname; 
  var localpath = path.join(process.cwd(), urlpath); 
  fs.exists(localpath, function(result) { getFile(result, response, localpath)});
}

var server = http.createServer(getFilename);

// -- socket.io --
// Chargement
var io = require('socket.io').listen(server);

// -- SerialPort --
// Chargement
var SerialPort = require('serialport');
var arduino = new SerialPort(usbserial, { autoOpen: false });

/************ IMPORTANT ********
Pour fonctionner correctement, le fichier 'serialport' @ Users/node_modules/serialport/lib/serialport.js
à été modifié à la ligne 32
baudRate: 115200,

La communication série dans les sketches arduino doit être paramètrés à 115200 bauds : Serial.begin(115200);  
*/


// Overture du port serie
arduino.open(function (err) {
  if (err) {
    return console.log('Error opening port: ', err.message);
  }
  else {
    console.log ("Communication serie Arduino 115200 bauds : Ok")
  }
});


// Requetes
io.sockets.on('connection', function (socket) {
	// Message à la connexion
  console.log('Connexion socket : Ok');
  socket.emit('message', 'Connexion : Ok');
    // Le serveur reçoit un message" du navigateur    
    socket.on('message', function (msg) {
    	//console.log(msg);
      socket.emit('message', 'Veuillez patienter !');
      arduino.write(msg, function (err) {
		  if (err) {
		  	io.sockets.emit('message', err.message);
		  	return console.log('Error: ', err.message);
		  }
		});
	});
});

arduino.on('data', function (data) {
  let buf = new Buffer(data);
  io.sockets.emit('message', buf.toString('ascii'));
  console.log(buf.toString('ascii'));
  //console.log(buf);
});

server.listen(8080);
console.log("Serveur : Ok");

Voyons maintenant le premier fichier HTML, power1.html correspondant à notre première application. Elle est très simple et contient deux boutons qui servent à allumer ou éteindre la LED de la carte reliée à la sortie 13 (LED_BUILTIN).

<!DOCTYPE html>
<html>
        <head>
            <meta charset="utf-8" />
            <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
            <script src="./socket.io/socket.io.js"></script>
            <script>
                //$(document).ready(function() {
                $(function() {	
                            var socket = io.connect('http://localhost:8080');
                            socket.on('message', function(message) {
                                $('#logs').html(message);
                            });
                
                            $('#btn_on').click(function () {
                                socket.emit('message', '1');
                            });
                
                            $('#btn_off').click(function () {
                                socket.emit('message', '0');
                            });

                            // Initialisation
                            socket.emit('message', '0');
                });
            </script>
        </head>

        <body>
            <h1>Communication avec Arduino !</h1>
            <table width="100%" border="1">
              <tr>
                <td><input type="button" value="On" id="btn_on" /></td>
                <td><input type="button" value="Off" id="btn_off" /></td>
              </tr>
            </table>
            <p>Logs : <span id="logs"></span></p>
        </body>
</html>

Information pratique. Pour avoir le rendu en temps réel du code HTML que vous rédigez, utilisez un éditeur on-line (et gratuit) comme celui de Mozilla qui est vraiment très bien. https://thimble.mozilla.org/fr/

A partir de la page d’accueil, cliquez sur créer un nouveau projet.

Un fichier HTML se structure autour de 2 balises principales, <head> jusqu’à </head> et <body> jusqu’à </body>. Dans le body se trouve le code de la partie visible de la page alors que dans le head se trouvent les « utilitaires ».

Dans le body, j’ai mis un texte entre balises <h1>Communication avec Arduino !</h1> qui va lui donner un aspect gros caractères en gras. Ensuite, j’ai créé un tableau entre les balises <table> et </table>. Je vous conseil de procéder ainsi surtout si vous n’êtes pas familier avec le HTML. Le tableau va vous aider considérablement à réaliser la mise en page de tous vos éléments graphiques. A ce tableau j’ai donné les propriétés width="100%" qui fait qu’il occupe toute la largeur de la page et border="1" qui place une bordure de 1 pixel autour. Pas très jolie je vous l’accorde mais qui nous permet pour l’instant de mieux repérer nos objets dans la page.

Un tableau HTML est toujours constitué d’au moins 1 série de balises <tr> </tr> qui permettent de créer des lignes au tableau. Ensuite, on créé les colonnes du tableau avec les balises <td> </td>.

Ici nous n’avons 1 ligne et 2 colonnes. Dans la première colonne, j’ai placé le code pour 1 bouton : <td><input type="button" value="On" id="btn_on" /></td>.

<input type="button" /> désigne un objet servant à recevoir une information « input » et que le type de l’objet est un bouton « type="button" ». « Value » est le texte apparaissant dans le bouton. Enfin, id="btn_on" est une information très importante. Cela sert à identifier de manière unique cet objet dans la page grâce à son « id ». Ici, c’est moi qui ai choisi le nom « btn_on ». Cela aurait pu être tout autre chose mais ne doit pas porter le même id qu’un autre objet de la page.

Dans la seconde colonne du tableau, j’ai un autre bouton : <input type="button" value="Off" id="btn_off" /> qui se distingue du précédent par son texte et aussi par son id="btn_off" qui précise bien je crois ce que fait le bouton.

Pour finir sur la partie affichage de cette page, on trouve en bas une zone de paragraphe entre <p> et </p> avec un texte « Logs : » est une zone dans laquelle viendra s’afficher entre <span> et </span> le message renvoyé par la fonction Serial.print de l’Arduino. De la même façon, vous remarquez que j’ai donné in « id » à cette zone : id="logs".

Dans le <head> je trouve un lien : <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> qui va charger une bibliothèque JavaScript externe très puissante nommée Jquery. Elle est chargée par internet.

La seconde bibliothèque : <script src="./socket.io/socket.io.js"></script> est aussi externe mais présente dans le dossier des modules de Node. Elle sert à la communication avec Node.

Enfin, une troisième balise <script> </script>. Ici, le code est interne à notre page car il est spécifique à notre application.

J’ai mis la première ligne en commentaire //$(document).ready(function() { car en Jquery ça veut dire exactement la même chose que $(function() { mais c’est plus explicite. Cela indique que le code sera exécuté quand la page HTML sera chargée (ready).

var socket = io.connect('http://localhost:8080'); sert à créer une instance pour la connexion avec Node. C’est un objet (au sens informatique) stocké dans une variable à laquelle j’ai donné le nom socket.

L’objet socket hérite d’un certain nombre de fonction dont .on(‘message’ qui se déclenche quand la page HTML reçoit un message du serveur Node. $('#logs') avec Jquery fait référence à la zone dont on parlait un peu plus haut. Celle à laquelle on a donné l’id=logs. $('#logs').html(message); indique d’écrire dans la zone « logs » le message qui sera reçu de Node, qui l’aura lui même reçu de l’Arduino.

Les lignes suivantes sont assez similaires dans leur compréhension. $('#btn_on').click indique un click sur le bouton ayant pour id « btn_on ».

socket.emit('message', '1'); appelle la fonction « emit » dont l’objet socket a hérité. C’est ici le second paramètre de la fonction qui nous intéresse, la valeur « 1 ».

De la même manière, le code suivant :

$('#btn_off').click(function () {
socket.emit('message', '0'); 
});

indique que quand on clique sur le bouton ayant pour id btn_off, alors on va envoyer un message dont le contenu est « 0 ».

Notez bien que les valeurs « 0 » ou « 1 » envoyées par le message auraient pu être toutes autres, « a » ou « b » par exemple. Simplement, nous avons vu dans le code de l’Arduino que quand celui-ci reçoit le message « 1 » la carte allume la diode, et elle l’éteint si elle reçoit le message « 0 ». Tout ceci est donc purement conventionnel.

Si vous ouvrez la page web dans votre navigateur avec l’url : http://localhost:8080/power1.html, vous devez donc voir s’allumer ou s’éteindre la LED selon que vous cliquerez sur on ou sur off.

Dans votre navigateur, lancez maintenant la page : http://localhost:8080/power2.html

PNG - 39.1 kio

Les boutons sont remplacés par des images mais quand on clique dessus, les effets sur l’Arduino sont les mêmes.

Regardons le code de cette page. Dans le <head>, on a ajouté un lien externe :

<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

Il s’agit ici d’une bibliothèque graphique dans laquelle je vais puiser les icônes dont j’ai envie pour ma page. Vous avez ici : http://getbootstrap.com/components/ un aperçu des icônes disponibles.

<body>
            <h1>Communication avec Arduino !</h1>
            <table width="100%" border="0">
               <tr>
                <td><span id="btn_off" class="glyphicon glyphicon-off btn_red"></span></td>
                <td><span id="btn_on" class="glyphicon glyphicon-off btn_green"></span></td>
              </tr>
            </table>
            <p>Logs : <span id="logs"></span></p>
</body>

Dans mes colonnes <td>, j’ai remplacé les boutons standards du HTML par des icônes et le curseur de la souris change au survol de ces icônes (cursor:pointer ;). Pour ce faire, j’ai créé deux divisions dans la page avec <span> et comme toute à l’heure, les id de ces <span> restent btn_on et btn_off.

Mais j’ai surtout ajouté des « class ». En fait, 3 classes par bouton. Les « class » glyphicon et glyphicon-off qui vont chercher dans la bibliothèque externe l’icône des boutons et les « class » btn_red et btn_green que j’ai créées dans le header entre les balises <style> et </style>. Ces classes déterminent, outre la couleur (red ou green) la taille (font-size:48px) et la modification de l’aspect du pointeur (cursor:pointer ;) au survol.

<style>
              html {
                  margin-left:20px;
              }
              .btn_red {
                  color: red;
                  font-size:48px;
                  cursor:pointer;
              }
              .btn_green {
                  color: green;
                  font-size:48px;
                  cursor:pointer;
              }
</style>

Tout le reste du code et en particulier le JavaScript est identique. Voici donc une évolution purement cosmétique avec par exemple un « margin-left:20px ; » appliqué au html qui décale la page du bord droit de 20 pixels.

html {
	margin-left:20px;
}

La page : http://localhost:8080/power3.html apporte un résultat plus ergonomique. Il n’y a plus qu’un seul bouton dont la couleur change en fonction de l’état de la LED de l’Arduino. Plus besoin non plus de ligne de logs puisque la couleur suffit à nous donner l’information "on" ou "off".

PNG - 34.8 kio

Ici, contrairement à la page 2, la différence graphique est obtenue essentiellement par le JavaScript et non le style. On a supprimé un bouton en supprimant une colonne du tableau. Il ne reste que celui dont la « class » est « btn_red ». Le bouton sera donc rouge au chargement de la page (initialisation).

A l’intérieur de la balise <script> </script>, sous le commentaire // Initialisation on trouve une nouvelle ligne. La déclaration et l’initialisation d’une variable globale « status » à « 0 ». Puisqu’il n’y a plus qu’un seul bouton, la variable status enregistre l’état du bouton.

<script>
   //$(document).ready(function() {
   $(function() {
					

	// Ouverture d'un socket avec le serveur
	var socket = io.connect('http://localhost:8080');

	// En cas de réception d'un message du serveur
	socket.on('message', function(message) {
		status = message;
		if(status == "1") {
			$("#btn").removeClass("btn_red");
			$("#btn").addClass("btn_green");
		}
		else {
			$("#btn").removeClass("btn_green");
			$("#btn").addClass("btn_red");
		}
	});
	    			
					
	// Sur click
	$('#btn').click(function () {
	if(status == "0") {
		status = "1";
	}
	else {
		status = "0";
	}
	socketEmit(status);
	}); 

	var socketEmit = function(status) {
	        var statusAscii = String.fromCharCode(status);
	         socket.emit('message', statusAscii);
	}

	// Initialisation
	var status = "0";
	socketEmit(status);

    });
</script>

Pour la même raison, nous n’avons plus qu’une seule fonction « $('#btn').click(function () » qui modifie le statut du bouton à 1 s’il était à 0 et inversement. La fonction appelle non plus directement « socket.emit(’message’, value) ; » comme avant mais une fonction nouvelle « socketEmit (status) » que l’on retrouve juste en dessous. La chose la plus importante et nouvelle dans cette fonction est la ligne : var value = String.fromCharCode(status) ; Nous n’allons plus envoyer à l’Arduino le caractère « 0 » ou « 1 » mais grâce à « String.fromCharCode » directement le code ASCII 1 ou 0.

Nous verrons dans le fichier « power2.ino » que le switch est aussi modifié puisque c’est bien le code ASCII « 0 » ou « 1 » qui est reçu.

void process(unsigned char inChar) {
  switch (inChar) {
    case 0:
      digitalWrite(LED_BUILTIN, LOW);
      Serial.print("0");
      break;
    case 1:
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.print("1");
      break;
    default:
      Serial.print("error");
  }
}

Bien évidemment, c’est le fichier « power2.ino » qu’il faut téléverser sur l’Arduino pour fonctionner avec ce fichier « power3.html ». Pour cela, il faut déjà libérer le port qui est utilisé par Node tout simplement en fermant le terminal ou en tapant ^C (control/C) ; une fois le téléversement terminé, vous pourrez rouvrir le terminal et entrer "node arduino.js" pour essayer ce nouvel exemple.

Dans le <body>, l’id de la <span> devient id="btn" puisqu’il n’y a plus qu’un bouton. Dans le JavaScript, dans la fonction sur click, la variable status change de valeur et c’est cette nouvelle valeur qui est envoyée à l’Arduino via Node.

// En cas de réception d'un message du serveur
socket.on('message', function(message) {
	status = message;
	if(status == "1") {
		$("#btn").removeClass("btn_red");
		$("#btn").addClass("btn_green");
	}
	else {
		$("#btn").removeClass("btn_green");
		$("#btn").addClass("btn_red");
	}
});

Plus haut dans le JavaScript, à la réception du message retourné par l’Arduino, la variable status prend la valeur retournée : status = message;. Ce qui est surtout intéressant, c’est que l’on va ici modifier les class par programmation. En effet, si la LED est allumée if(status == "1"), on va supprimer la class btn_red $("#btn").removeClass("btn_red"); et ajouter la class btn_green » $("#btn").addClass("btn_green"); ce qui va avoir pour conséquence de donner au bouton la couleur verte.

Puis en dessus dans le JavaScript, l’effet inverse, $("#btn").removeClass("btn_green"); et $("#btn").addClass("btn_red"); si la LED est éteinte.

Nous avons donc modifié le style (css) de la page par programmation en fonction de la valeur de variables.

A la fin de cette expérimentation, n’oubliez pas d’arrêter le serveur node, soit en tapant ^C dans la fenêtre du Terminal, soit en quittant l’application Terminal, ce qui affichera la message suivant :

JPEG - 22.6 kio

Voilà pour ce premier article, surement le plus difficile. Dans l’article suivant, nous nous intéresserons aux potentiomètres et ensuite encore, au pilotage d’un servomoteur pour terminer par une application très complète : Une manette de pilotage de locomotives avec DCC++.

N’hésitez pas à me poser toutes vos questions et j’essayerai d’y répondre au mieux.

67 Messages

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 juillet 2017 13:58, par Robert Knapen

    Excellent article qui ouvre des possibilités incroyables.
    Avez-vous examiné l’utilisation du codage graphique avec l’utilisation de node RED développé par IBM pour des applications de ’’Internet of things``IOT.

    Voir en ligne : How IBM’s Node-RED is hacking together the internet of things

    Répondre

    • Bonjour Robert,

      Je suis heureux que vous ayez perçu les possibilités que cela pouvait ouvrir de pouvoir piloter son Arduino à partir de son ordinateur, sa tablette et/ou son smartphone. C’est bien que vous citiez également Node RED auquel les plus convaincus pourront se référer. Pour l’essentiel, les Locoduinistes sont avant tout des modélistes ferroviaires, intéressés par ce que l’Arduino peut apporter sur leur réseau. Tout ce qui peut leur simplifier la tâche de programmation est bienvenu.

      Moi je note au passage l’investissement de IBM autour des technologies JavaScript (Node RED, TypeScript...) ce qui tend à démontrer à mon avis sa puissance et son potentiel.

      Bien cordialement

      Christophe

      Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 juillet 2017 23:38, par maxou9914

    pour Node RED je viens de franchir le cap il à de ça une semaine, simple et rapide de mise en oeuvre. Il me permet de contrôler par wifi sur une tablette mes loco LGB avec un Wemos 1D (équivalent arduino nano avec wifi intégré). Il faut que je trouve un peu de temps pour mettre à jour mon fil sur le forum !

    En protocole d’échange j’utilise MQTT (facile pour deboger).

    Voir en ligne : Mon interface

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 8 juillet 2017 10:45, par bobyAndCo

    Je trouve qu’il y a une accélération des offres en ce moment avec une multiplicité de produits nouveaux ; autours des technologies WIFI entre autres. Je suis convaincu qu’il y a plein de choses à imaginer en modélisme ferroviaire autour des modules WIFI (ESP8266) dont certains ont des tailles extrêmement réduites, jusqu’à 12 E/S et d’un prix quasiment ridicule, de 2 à 10 € !!! On peut entre autre réfléchir à des systèmes embarqués sinon dans des locos mais tout au moins dans les wagons d’un convoi. A quand les décodeurs WIFI ? Et pourquoi pas des réseaux totalement sans câbles ?

    N’hésitez pas à présenter vos propres projets de la façon la plus explicite possible pour les partager avec tous les Locoduinistes. Node RED est assez abordable pour qui a une certaine appréhension à se lancer dans la programmation.

    Répondre

  • Merci pour cet article qui donne envie de s’y lancer.
    ROCO a fait une tentative de décodeur Wifi (en fait une carte Wifi couplée à un décodeur DCC) avec ses kits Next Generation 51400 sortis en 2014. En prime une détection de Tag RFID pour la position des locomotives. Manifestement pour attirer vers le modélisme les enfants à partir de 6-8 ans avec des scénarios se déroulant sur tablette. Probablement trop répéfitifs sur un ovale et 3 arrêts. Une extension avec un aiguillage existe. Mais pas de version en français (seuls D, SP et GB). Malheureusement ce projet n’a pas rencontré le succès puisqu’on trouve ce matériel bradé à 75€ sur eBay et ailleurs et il n’est plus au catalogue de ROCO. Les locos 51400 sont canibalisés en éléments séparés. Le projet initial consistait en une rame ICE de 3 éléments alors que celui qui a été commercialisé contenait une locomotive électrique basique en rouge ou en bleu, sans aucun détaillage (pas de tampons, pantographe ultra simple) avec deux wagons. Avantage, on fait du numérique avec seulement de la technologie dans la locomotive (et du RFID à 3 sous) en supposant que la tablette est déjà acquise.
    Il est peut-être possible de faire du reverse engeniering sur l’application android qu’on peut télécharger gratuitement. Je suis intéressé par tout détail qui serait disponible.

    Voir en ligne : Voir la présentation youtube :

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 9 juillet 2017 00:57, par bobyAndCo

    Ce projet est pourtant très innovant. Si je comprends bien, il y a un module WIFI embarqué dans la loco. Mais vous pensez vraiment qu’il y a un décodeur DCC ou quoique ce soit de similaire dans la machine ? A mon avis non. Les commandes passent en WIFI et le courant de traction par les rails. Un L293 lui aussi embarqué (et un µc) et le tour est joué. C’est exactement ce que j’évoquais plus haut avec les ESP8266. La fin des décodeurs embarqués est peut être pour bientôt ?

     

    Pour le RFID, je ne m’y suis que très peu intéressé car j’étais resté sur l’idée qu’il était assez difficile de faire fonctionner plus d’un capteur (interférences). Apparemment non. Là aussi ce serait une très bonne nouvelle.

     

    Quant à faire "du reverse engeniering sur l’application android" cela me semble assez facilement envisageable pour peu que l’on puisse décrypter les messages envoyés pour chaque commande et les reprogrammer dans un Arduino. C’est un peu du même ordre que lorsque l’on utilise une télécommande par exemple. Beaucoup de boulot en perspective.

     

    Nous sommes bien d’accord que les projet que je présente : "Pilotage d’un Arduino avec son navigateur WEB" pourraient tout aussi bien fonctionner en WIFI. J’en ai d’ailleurs présenté plusieurs ici. Ce que nous voulions dans cette série d’article, c’était de proposer une configuration "minimaliste" fonctionnant sur le moins cher des Arduino (UNO) et sans shield ou hard quelconque supplémentaire.

     

    Je travaille actuellement sur le protocole TELNET qui permettra de s’affranchir de la liaison série entre Node et Arduino (donc WIFI en particulier) en consommant très peu de ressources réseau contrairement au HTTP plus "verbeux" en travaillant directement sur les commandes TCP/IP de bas niveau. A suivre donc !

     

    Christophe

    Répondre

    • bonjour, j’ai pas réussi à faire communiquer NODE avec arduino en entrant la commande node arduino.js...
      est ce que je rassemble tout les fichiers(serialport.js et arduino.js) dans un meme dossier et puis j’ouvre le terminal dans cette dossier...ou quoi faire ?
      j’ai vraiment besoin d’aide je suis coincé...merci !

      Répondre

      • Bonjour Farouk,

        Je suis désolé mais reconnaissez que vous ne donnez que peu d’informations pour permettre de trouver une solution. Pouvez-vous être plus précis. Cette configuration est éprouvée depuis longtemps, moi-même, je l’utilise régulièrement. En suivant pas à pas les explications, il ne devrait pas y avoir de problème.

        Répondre

  • C’est effectivement dommage que Roco n’ait pas poursuivi. (et qu’il n’ait pas publié le standard pour amorcer une normalisation - du moins à ma connaissance) Il s’agit bien d’un "vrai" décodeur DCC respectant le standard. D’ailleurs Roco indique qu’il peut se piloter avec une Z21. J’ai testé avec DCC++ : adresse loco modifiable, commande éclairage par exemple. Si je me souvient bien du CV8, ce serait un ZIMO. Tant qu’on n’a pas pris la main sur la loco en Wifi, elle fonctionne en DCC.
    Pour les applications en apk, il semble qu’il y ait de nombreux décompilateurs qui permettent d’avoir le code java. Mais cela dépasse mes compétences d’utiliser ensuite ce code.
    Pour le RFID, il y a dans le ballast de la voie Geoline un circuit imprimé avec une antenne et un CI SOT8 de STI marqué 24LBERB K435U juste connecté à l’antenne.
    Effectivement, on dérive du sujet initial, peut-être faudrait-il passer sur le forum ?

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 9 juillet 2017 13:13, par bobyAndCo

    Oui il faut ouvrir un nouveau sujet sur le forum en précisant bien les objectifs poursivis et les réponses attendues. Il semble que pas mal de choses soient abordées ci-dessus.

    Bien cordialement.

    Christophe

    Répondre

  • Super Christophe j’ai enfin des explications du comment fonctionne DCC+_Controller_Ethernet que j’utilise avec plaisir sur mon réseau. J’attends ensuite les autres explications pour le DCC++. Pour le moment je suis indécis pour l’automatisation de mon réseau soit continuer avec tes explications futures ou utiliser "Un gestionnaire en C++ pour votre réseau" ? avec bus CAN. Sachant que mon réseau est découpé en cantons avec détection de consommation et des relais tout cela pas très satisfaisant. Un conseil serait le bien venu.
    Bien cordialement.

    Répondre

  • Bonjour Christophe.
    Merci beaucoup pour ces explications détaillées, en français et en détail... Même si je ne suis pas pratiquant ferroviaire, ma petite contribution pour les débutants comme moi :
    _vérifier le comportement de l’arduino dans son environnement avec l’interface série intégrée : ctrl maj M
    en envoyant directement 0 et 1.
    _Chrome ne permet pas forcément de faire tourner des serveurs en adresse locale (secu) ; Firefoxe ne se limite pas a ca. Sous firefoxe utiliser F12 pour debugger. Ce qui m’a permis de voir que pour mon installation du 12/2017 il fallait modifier la ligne de la lib socket io comme suit :
    ./node_modules/socket.io-client/dist/socket.io.js

    Mon but est de faire plus simple pour le moment : utiliser un script nodejs pour récupérer des infos sur le port série après l’émission d’une commande. Plus simple en python et en perl , moins simple avec nodejs et ses gestions parallèle d’événements, plus puissant a terme, c’est certain.

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 février 2018 00:06, par stephane

    Super, merci pour tous ces tuyaux, çà me donne pleins d’idées maintenant.
    Tous fonctionne bien en suivant correctement les informations.

    Répondre

  • Bonjour,
    Super, merci pour tous ces tuyaux. Juste une question j’aimerai bien savoir faire l’inverse j’ai besoin lorsque je clique sur une bouton passoire l’arduino envoi une requet via nodejs vers page html pour faire bouger quelque chose .
    Besoin d’aide concernant ça.
    Merci

    Répondre

    • Piloter son Arduino avec son navigateur web et Node.js (1) 13 février 2018 13:26, par bobyAndCo

      Bonjour Nelly,

       

      Attention tout d’abord, un bouton "passoire" laisse tout passer ;-)

       

      La question importante est de savoir ce que vous voulez faire bouger ? Un élément dans la page HTML, changer un bouton, faire varier un compteur ? Ou faire bouger autre chose (hors de la page HTML), moteur, LED ???

       

      En fonction de cela la réponse sera bien différente.

       

      Bien cordialement.

       

      Christophe

      Répondre

      • Bonjour,
        Ok je vais expliquer a vous , je dois travailler sur jeu snake,. Au lieu d’utiliser les fleche de calvier , le remplacer par Joystick de arduino , donc j’utiliser javascript via serveur NodeJs.
        Donc actuellement je suis ressuie a faire allumé une led lorsque le snake tape le mur çàd gameouvre mais j’arrive pas a faire transmet un message de la part d’arduino vers le serveur.
        Merci tout aide

        Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 15 février 2018 13:45, par bobyAndCo

    Bonjour,
    Votre question ne concerne pas le modélisme ferroviaire, mais voici la réponse (qui se trouve d’ailleurs dans l’article). Il faut tout simplement utiliser Serial.print ou Serial.write et un message sera retourné à Node.js. Dans l’exemple, la fonction retourne soit "0" soit "1" soit le texte "error" :

    switch (inChar) {
        case '0':
          digitalWrite(LED_BUILTIN, LOW);
          Serial.print("0");
          break;
        case '1':
          digitalWrite(LED_BUILTIN, HIGH);
          Serial.print("1");
          break;
        default:
          Serial.print("error");
      }

    La réponse est captée par Node.js par l’événement "on(data)" de l’objet que j’ai nommé ici arduino

    arduino.on('data', function (data) {
      let buf = new Buffer(data);
      io.sockets.emit('message', buf.toString('ascii'));
      console.log(buf.toString('ascii'));
      //console.log(buf);
    });

    Répondre

  • Bonsoir Christophe,
    J’ai testé exemple "power1.ino" avec arduino UNO en modifiant ’COM4’ ça fonctionne parfaitement.
    Ensuite je change de carte pour ARDUINO MEGA mais en ’COM6’ comme me l’indique IDE que je modifie et j’ai comme message "Logs : Connexion : Ok" j’appuie sur le bouton ON et j’ai comme message "Logs : Veuillez patienter !".
    Où est le problème ? j’ai cherché dans les programmes je n’ai même pas trouvé la provenance du message "Logs : Veuillez patienter !"
    Merci de m’aider, j’attendais depuis longtemps la dernière parution de NODE 4 et maintenant que c’est fait je souhaite transformer tout mon travail de ETHERNET_DCC++ en NODE.

    Répondre

  • REBonsoir Christophe,
    Ne tiens pas compte de mon précédent message tout fonctionne maintenant...
    Ne me demande pas pourquoi, j’ai tout réinitialisé NODE, POWER1, etc... et ça marche.
    Je passe à l’étape suivant me passer de ETHERNET_DCC++ et programmer une occupation d’une ZONE par le NODE.
    Bonsoir.

    Répondre

  • Bonjour,

    J’ai testé exemple "power1.ino" avec arduino UNO en modifiant ’COM3’.
    J’ai comme message "Logs : Connexion : Ok" suite à l’ouverture de la page html
    Lorsque j’appuie sur le bouton ON,j’ai comme message "Logs : Veuillez patienter !".
    J’ai modifié les programmes de façon à tester le passage d’infos entre la page html et mon arduino. Celui-ci détecte bien lorsque j’appuie sur le bouton ON ou OFF (modif prog arduino pour détecter si quelque chose est emis sur la liaison série). Je pense que j’ai un pb avec la reconnaissances des variables char transmises entre la page html et l’arduino mais je vois pas comment le résoudre.

    Répondre

    • Bonjour Thierry,

      Si je comprends bien, vous avez modifié le programme de l’Arduino. Il faudrait m’adresser via la messagerie de Locoduino le code Arduino pour que je regarde ce que cela peut être.

      Bien cordialement

      Répondre

      • Re-bonjour,

        J’ai voulu tester votre exemple "power1.ino" avec un arduino UNO en modifiant ’COM3’.
        Lorsque j’utilise la page html : power1.html, j’ai comme message "Logs : Connexion : Ok" suite à l’ouverture de la page html => la connexion PC —> Arduino se déroule bien
        Mais lorsque j’appuie sur le bouton ON,j’ai comme message "Logs : Veuillez patienter !" => pas d’allumage de la led 13.
        J’ai redémarré le pc, relancé la communication série et tj impossibilité de faire allumer la led (nota : je n’ai pas modifié vos programmes)
        Cordialement

        Répondre

  • Bonsoir,

    J’ai repris les manips à zéro en suivant pas à pas votre tuto :

    1) modification de la vitesse de connexion de 9600bd à 115200 dans serialport.js (on trouve aussi 9600 dans les premières ligne du fichier, à modifier en 115200 ou seulement modif ligne32 ?)

    2) modification du nom du port dans arduino.js

    3) telechargement du sketch power1.ino dans mon arduino

    4) lancement du serveur web arduino.js dans le terminal
    => message
    Serveur : OK
    Communication serie Arduino 115200 bauds : Ok
    Connexion socket : OK

    5) ouverture page html http://localhost:8080/power1.html
    => Logs : Connexion : Ok sur la page html

    6) clic sur bouton On => la led reste éteinte et affichage o à coté de Logs.
    7) clic sur bouton Off => la led reste éteinte et affichage ? à coté de Logs

    => Il y a bien un dialogue entre la page html et l’arduino mais j’ai l’impression que les caractères Ascii sont mal retransmis.

    Qu’en pensez vous ?

    Cldt

    Répondre

    • Bonsoir Thierry,

      Je pense que votre analyse doit être bonne et qu’il s’agit probablement de problèmes de caractères puisque vous avez bien un retour de l’Arduino :

      6) clic sur bouton On => la led reste éteinte et affichage o à coté de Logs.
      7) clic sur bouton Off => la led reste éteinte et affichage ? à coté de Logs

      Cela peut avoir plusieurs causes. Il est possible que le paramètre de vitesse de transfert dans serial.js influe. Dans ma version, je n’ai de réglage qu’à la ligne 32. Si vous avez 9600b ailleurs (version plus récente), n’hésitez pas à changer, et à tester.

      Dans le terminal (invite commande) doivent s’afficher 0 ou 1 quand vous appuyez sur les boutons de la page HTML, quand est il pour vous ?

      En stoppant le terminal et en utilisant la fenêtre série de l’IDE d’Arduino, envoyez le caractère 1 à la carte et voyez si vous avez un retour 1. Vous allez avoir sans doute aussi plusieurs "error" mais c’est parce que la fenêtre de l’IDE envoie d’autres caractères mais l’important est que vous ayez bien 1 ou 0 dans les retours. Si vous voulez supprimer les error, selectionnez "pas de fin de ligne" dans la fenêtre de l’IDE.

      Voilà, de cette manière, vous voyez déjà si la carte répond et allume ou éteint la LED. Ensuite, dans la page HTML (javascript) modifiez le code à partir de la ligne 15

      $('#btn_on').click(function () {
                                      socket.emit('message', '1');
                                  });
                      
                                  $('#btn_off').click(function () {
                                      socket.emit('message', '0');
                                  });

      Essayez d’autres caractères, par exemple ’A’ et ’B’ et n’oubliez pas de faire la même chose dans le code Arduino :

      void process(unsigned char inChar) {
        switch (inChar) {
          case 48:
            digitalWrite(LED_BUILTIN, LOW);
            Serial.print("0");
            break;
          case 49:
            digitalWrite(LED_BUILTIN, HIGH);
            Serial.print("1");
            break;
          default:
            Serial.print("error");
        }
      }

      Vous mettrez alors ’A’ et ’B’ (n’oubliez pas ’’) au lieu de 48 et 49.

      Essayé déjà ceci et tenez moi au courant.

      Bien cordialement

      Christophe

      Répondre

  • Bonsoir Christophe,
    Merci pour votre réponse très détaillée. Je suis allé voir le contenu de mon fichier serial.js : je n’ai effectivement pas la même version que vous et j’avais un pb de paramétrage. Il faut en réalité changer le paramétrage de vitesse au début du fichier. J’avais changé la vitesse dans une zone de commentaire (avec le bloc note de windows, la lecture du fichier n’est pas très pratique ...) Est-ce qu’il existe des utilitaires plus pratiques avec numérotation des lignes ?

    J’ai fait le test d’allumage/extinction de la led dans la fenetre de l’IDE d’Arduino et cela a fonctionné.

    J’ai ensuite lancé le serveur web arduino.js dans le terminal et ouvert la page html http://localhost:8080/power1.html

    => la Led réagit correctement aux clics sur On et Off. J’ai 1 et 0 en retour dans la zone LOGS.

    Merci encore. Grace à votre dernier message, j’ai réussi envoyer des cdes à mon arduino et à récupérer des données via une page htlm.

    Mon projet est de faire l’acquisition d’une température avec un capteur DS18B20 et d’afficher celle-ci sur une page html.
    J’ai maintenant les outils de base pour le faire. J’ai modifié mon programme d’acquisition et traitement de température et j’arrive à faire afficher celle-ci sur la page power1.html dans la zone LOGS (je n’ai pas encore de compétences en html) mais par moment l’affichage est tronqué :
    ex : 22.5 C puis affichage C puis 5 C.
    A votre avis, d’où vient ce phénomène ? Est-ce un pb de vitesse de transmission de donnée qui serait trop lent par rapport au traitement de la mesure dans l’arduino ?

    Cdlt

    Répondre

    • Thierry,

      Je réponds à votre message car il présente un caractère général, mais je vous rappelle que le site Locoduino est réservé au modélisme ferroviaire.

       

      mais par moment l’affichage est tronqué : ex : 22.5 C puis affichage C puis 5 C.

       

      Ce problème est sans doute lié à une question de vitesse en effet. J’ai depuis réglé le problème de la manière présentée ci-dessous dans le fichier e Node.js

       

      Dans la réponse de l’Arduino, je place un caractère de fin de message, ici ">". Dans le code de Node js, je concatène les messages reçu dans la variable responseServ jusqu’à ce que je trouve le caractère ">" if(responseServ.indexOf(">") > 0 ) {

      Et alors j’envoie le message "complet" à la page HTML.

      var sendServ = function(data) {
        responseServ = responseServ + data;
        if(responseServ.indexOf(">") > 0 ) {
          let buf = new Buffer(responseServ);
          io.sockets.emit('response', buf.toString('ascii')); 
          console.log('Arduino response : ', buf.toString('ascii'));
          responseServ = "";
        }
      } 

      Bien cordialement

      Christophe

      Répondre

  • Bonsoir Christophe,

    Vous parlez d’une modification à apporter au fichier e node.js ou node.js ?
    Où se trouve ce fichier ? Est-ce que vous parlez du fichier arduino.js qu’on lance pour communiquer avec la carte ? Merci pour votre aide

    Cordialement

    Répondre

  • Oui il s’agit bien de arduino.js (fichier executé par Node.js)

    Bien cordialement

    Répondre

  • Bonjour,
    je viens vers vous car je n’arrive pas a installé les modules serialport.
    voici le message que me retourne la console :

    > @serialport/bindings@2.0.2 install C :\Users\cdomo\node_modules\@serialport\bindings
    > prebuild-install —tag-prefix @serialport/bindings@ || node-gyp rebuild

    C :\Users\cdomo\node_modules\@serialport\bindings>if not defined npm_config_node_gyp (node "C :\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild ) else (node "C :\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" rebuild )
    gyp ERR ! configure error
    gyp ERR ! stack Error : Can’t find Python executable "python", you can set the PYTHON env variable.
    gyp ERR ! stack at PythonFinder.failNoPython (C :\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\lib\configure.js:483:19)
    gyp ERR ! stack at PythonFinder. (C :\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\lib\configure.js:508:16)
    gyp ERR ! stack at C :\Program Files\nodejs\node_modules\npm\node_modules\graceful-fs\polyfills.js:284:29
    gyp ERR ! stack at FSReqWrap.oncomplete (fs.js:152:21)
    gyp ERR ! System Windows_NT 10.0.17134
    gyp ERR ! command "C :\Program Files\nodejs\node.exe" "C :\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" "rebuild"
    gyp ERR ! cwd C :\Users\cdomo\node_modules\@serialport\bindings
    gyp ERR ! node -v v8.11.4
    gyp ERR ! node-gyp -v v3.6.2
    gyp ERR ! not ok
    npm WARN enoent ENOENT : no such file or directory, open ’C :\Users\cdomo\package.json’
    npm WARN cdomo No description
    npm WARN cdomo No repository field.

    Répondre

    •  

      Woooo là là là là !!!

       

      Bon, ça relève plus du PC que de l’Arduino. Ca peut avoir pas mal de causes. Avez-vous réussi toutes les installations précédentes ? Node bien sûr mais aussi les autres modules ? Ceci pour savoir si on a le même problème sur d’autres modules ou seulement sur serialport ? Je vois qu’il est question de Phyton (Can’t find Python executable "python", you can set the PYTHON env variable.) Il est maintenant assez courant de devoir installer Python pour executer des scrits d’installation.

       

      Attention aussi, si vous installez serialport, il y a dans la version actuelle des incompatibilités avec ce que j’ai écrit à l’époque avec une version antérieure. Il faudra un peu chercher, en particulier en ce qui concerne les vitesses sur le port série mais rien de très compliqué.

       

      Est-il important pour vous d’utiliser Node car je présente en effet de nouvelles solutions plus simples et tout aussi performantes en WiFi et sans Node. Voir ici : Controller DCC++ Base Station en WiFi

       

      A voir également l’ébauche d’un article dont je prépare la publication sur Locoduino au sujet des shieldes WiFi

       

      Je n’ai encore pas écrit grand choses mais si cela vous intéresse mieux, je peux m’y mettre ce qui en intéressera d’autres.

       

      A suivre donc et bien amicalement.

       

      Christophe

      Répondre

      • Merci pour votre réactivité.
        Je voudrais pouvoir commander mon arduino par ethernet au final avec des échanges de données simple, visualiser les état des In/Out et possibilité de les commander à distance.
        j’ai un shield ethernet et je suis en train de faire un tuto en parallèle (beaucoup d’info).
        Node me paraissait une bonne solution pour personnaliser l’interface Homme / machine.
        Je débute le JS et dans mon projet la communication série ne me parait pas nécessaire (sauf pour faire ce superbe tutoriel).

        Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 septembre 2018 16:24, par BobyAndCo

     

    Oui, ça va toujours mieux quand on commence par le besoin. Pouvez-vous présenter succinctement votre projet ?

     

    Il y a une solution avec le shield Ethernet qui consiste à héberger un mini site, en fait une application en HTML et JavaScript sur une carte SD elle-même hébergée dans le lecteur SD du shield Ethernet.

     

    J’aborde cela en détail avec un mini-controller que je présente ici sur Locoduino.

     

    On pourra alors utiliser de classiques requêtes http (POST ou GET) mais aussi des requêtes en TCP (moins gourmandes en ressource et plus réactivites) Probablement aussi des websockets.

     

    Tenez-moi au courant pour savoir si cela répond à votre attente et je vous aiderai au besoin.

     

    Bien amicalement

     

    Christophe

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 octobre 2018 10:41, par René Mathieu

    Bonjour,
    je viens juste de tester le pilotage de mon Arduino par navigateur web ainsi que vous l’avez très bien décrit. J’ai un problème, il ne m’est pas possible de modifier le fichier serialport.js tout simplement parce que ce fichier est absent du répertoire \node_modules\serialport malgré deux tentatives de recharger par install dans la fenêtre Node.js command prompt.
    Pouvez-vous m’aider à résoudre ce problème ?
    Merci.

    j’ai lu le post "Piloter son Arduino avec son navigateur web et Node.js (1) 4 avril 22:00, par Thierry " ainsi que votre réponse. (le pilotage de la led port 13 fonctionne sans soucis avec par exemple "blink.ino")

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 octobre 2018 11:05, par bobyAndCo

    Uhmm, uhmm, c’est bien embêtant en effet. Mais je pense que l’on devrait trouver une solution simple en recopiant le dossier complet dans le bon repertoire sur votre ordinateur. Envoyez moi votre mail en MP, je vous retournerai le dossier à recopier et ça devrait fonctionner.

     

    Bien amicalement.

     

    Christophe

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 16 décembre 2018 10:28, par Philippe MESLIN

    Bonjour,

    Pour l’installation du module serialport sur mon Mac, j’ai le message d’erreur suivant lorsque j’ai lancé la commande npm install serialport :

    Error: EACCES: permission denied, mkdir '/Users/philippemeslin/node_modules/serialport/node_modules/@serialport/bindings/build'.

    J’ai résolu le problème en utilisant cette commande : sudo npm install serialport —unsafe-perm=true

    Merci pour toutes ces informations,

    Philippe MESLIN

    Répondre

  • Bonjour, comme fais tu pour te connecter depuis un autre ordinateur ou ton smartphone sur ton serveur node.js ?

    Répondre

  • correction je fesais avec bb.html et la j’ai fais sans le 8080 donc 192.168.1.50/bb.html
    pas de réaction depuis mon tel

    Répondre

  • Si le PC fonctionne mais pas le téléphone, c’est que ce dernier doit avoir des paramètres de sécurité activés (étonnant cependant). Je n’ai pas de réponse, il faut faire des recherche sur le net.

    Répondre

  • Bonjour,
    pour information, il faut installer ou les fichiers arduino.js ? un exemple de chemin svp

    Répondre

  • Bonjour, je suis bloqué, il est écrit qu’il faut modifier le fichier intitulé "serialport.js", mais je ne le trouve pas. Je suis pourtant bien allé dans : Utilisateurs/totol/node_modules/serialport/lib mais je ne trouve que "index" et "parsers".

    Merci de votre aide.

    Répondre

  • Bonjour
    Visiblement tout cela semble simple pour tout le monde sauf pour moi.
    Etape 1
    J’ai suivi scrupuleusement l’installation
    Etape 2
    je lance donc node, dans la fenêtre (Dos) je tape : node startNode.js réponse
    Thrown
    node startNode.js
    Syntax error : Unexpected identifier

    Quelle en est la raison ? Grand mystère
    Serait-il possible d’avoir un élément de réponse ?
    Merci par avance
    Cordialement

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 4 novembre 2019 15:58, par bobyAndCo

    Dans un fichier que vous nommerez "test.js", écrivez ceci : console.log("Hello Rolland !") ;console.log("Node.js fonctionne !") ;
    ensuite, de le terminal (invite commande sous "Fenêtres"), entrez node test.js
    S’il n’affiche pas le message, "Hello Rolland !, Node.js fonctionne !" c’est déjà qu’il y a un problème dans l’installation de Node.js

    Répondre

    • Merci pour votre réponse, problème solutionné.
      J’avais sauté une étape.
      En fait je n’ai pas lancé la fonction "cmd" pour pouvoir avancer.
      Tout fonctionne parfaitement.
      Ces explications sont vraiment formidables.
      Beaucoup de temps passé pour les rédiger mais cela permet de découvrir d’autres possibilités
      Cordialement

      Répondre

  • ou je vais trouver le fichier serialport.js ?merci de me répondre .cordialement

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 6 février 2020 08:30, par bobyAndCo

    Bonjour, la réponse est dans l’article !

    Répondre

  • Mais moi aussi je ne le trouve pas le fichier serialport.js, il n’y a que "index" et "parsers".

    C’est fort dommage d’arrêter si rapidement, ne pouvoir tester complètement.

    Pourriez-vous le mettre en téléchargement s’il vous plait ?

    Voir en ligne : Thierry BERTEAU

    Répondre

  • Mais cela a été fait, seulement il n’y a pas de serialport.js seulement index.js et parsets.js
    Les paquets ont dû être modifié !!!

    Voir en ligne : Piloter son Arduino avec son navigateur web et Node.js

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 6 février 2020 22:53, par bobyAndCo

    serialport est un module de Node. Quand on excecute NPM comme indiqué, serialport est automatiquement placé dans le répertoire : node_modules -> serialport -> lib -> serialport.js

    Cela aussi je l’indique dans l’article :

    Avant d’aller plus loin, vous allez devoir modifier le fichier « serialport.js » qui est situé à l’intérieur des dossiers suivants :
    node_modules -> serialport -> lib -> serialport.js.

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 10 avril 2020 00:33, par nizar hicheri

    Bonjour, je ne trouve pas le fichier : serialport.js. que dois je faire ? Merci

    Répondre

  • Bonjour,
    Pour répondre à vos questions sur le fichier "serialport.js", celui-ci n’est plus dans les dernières distribution de Serialport.
    Il faut toutefois modifier la vitesse pour que ça fonctionne et ne pas avoir d’erreur de transimission. Pour cela, une fois Serialport installé (avec npm install serialport), il faut aller dans ouvrir le fichier : "index.js" dans \node_modules\@serialport\stream\lib . Dans ce fichier, ligne 14 (dans ma version), il faudra changer "baudRate : 9600," par "baudRate : 115200,".
    J’espère que ça vous sera utile et merci pour ce tuto.
    Bonne journée

    Répondre

    • Bonjour
      Je me heurte à des problèmes de version (entre 2022 et 2018) qui nécessitent des modifications dans les programmes ou les bibliothèques. Je n’y entends pas grand chose et je me déplace dans un "brouillard informatique".
      J’ai réussi à suivre votre tuto (dans la forme assez clair) jusqu’à la modification : "node_modules -> serialport -> lib -> serialport.js. "
      J’ai la version 16.15.0 de Node dans laquelle je ne trouve aucun dossier "lib" ni dans "@serialport/stream" ni dans "serialport". Donc pas de modification possible de débit dans un fichier "index".
      Par ailleurs j’ai modifié (comme conseillé) la ligne 40 du fichier "arduino.js" mais il reste toujours à intervenir sur la ligne 45 : "var arduino = new SerialPort(usbserial, autoOpen : false ) ;" qui bloque.
      Pourriez vous m’aider svp.
      Emmanuel

      Voir en ligne : Piloter son Arduino avec son navigateur web et Node.js (1)

      Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 17 novembre 2021 15:44, par Olivier CASSE

    Bonjour,

    tout ,d’abord bravo pour l’article !
    j’ai réussi avec la version actuelle de node.js a obtenir la commutation de la LED sur mon Arduino Uno.
    j’ai rencontré plusieurs problèmes (dus au décalage de version je pense, j’utilise Windows 10 - NodeJS 16.13.0 (avec npm 8.1.0)) :
    1) serialport.js qui n’existe plus et le paramétrage de la vitesse à faire comme indiqué dans le message précédent
    2) index.js la ligne 40 doit etre modifiée de :
    var io = require(’socket.io’).listen(server) ;
    pour devenir :
    var io = require(’socket.io’)(server) ; // on supprime .listen qui donne une erreur "listen is not a function" sinon...

    je continue la suite de l’article pour créer ma propre IHM
    Olivier

    Répondre

  • Bonjour,

    Cet article à maintenant 5 ans et les choses ont beaucoup évoluées depuis. La bibliothèque « serialport » pour Node.js elle aussi a beaucoup évoluée et n’est plus directement compatible avec ce que j’avais écrit à l’époque.

    Et les websockets en JavaScript ont aussi fait leur entrée dans le paysage !

    Je suis absent pour plusieurs semaines et je n’ai pas avec moi le matériel pour tester des mises à jour et je ne suis pas sûr d’en avoir le temps.

    Si vous voulez avancer sur ce sujet, vous pouvez vous reporter au site de serialport : https://serialport.io/

    Vous trouverez aussi de nombreux tuto sur le web et aussi des vidéos : https://www.youtube.com/watch?v=__F...

    Répondre

  • Bonjour,

    Effectivement aujourd’hui (janv.2023), la version actuelle de Node.js et du module SerialPort sont différents de ce qu’ils étaient eu début de cet article. Voilà ce qu’il faut faire.

    • Il n’y a pas de modifications à faire dans node_modules/serialport/lib/serialport.js, ce fichier n’existe plus.

    Toutes les modifications sont à faire dans le fichier arduino.js :

    • la modification de la ligne 1 concernant le port série reste d’actualité
      var usbserial = 'COM3';
    • la ligne 40 devient
      var io = require('socket.io')(server);
      au lieu de
      var io = require('socket.io').listen(server);
    • les lignes 44 et 45 devienent
      var  { SerialPort } = require('serialport');
      var arduino = new SerialPort({ path: usbserial, baudRate: 115200, autoOpen: false });

    au lieu de

    var SerialPort = require('serialport');
    var arduino = new SerialPort(usbserial, { autoOpen: false });

    Le reste ne change pas.
    Joël

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 novembre 2023 12:36, par PARMENTIER Dominique

    Bonjour
    Je suis très intéressé par votre article.
    Jusqu’a cette étape tout ce passe bien, mais je suis coincé au niveau du fichier node_modules -> serialport -> lib -> serialport.js.
    Dans serial port il n’y a pas ou plus le dossier LIB.
    Il y a bien un fichier serialport.js mais dans le dossier node_modules>serialport>dist>serialport.js. pas LIB
    Quand j’ouvre serialport avec bloc note mais aucune ligne concernant la vitesse de connexion à modifier.
    De ce fait pas de communication avec arduino.

    Voila le message d’erreur

    C :\Users\domin>node arduino.js
    node:internal/modules/cjs/loader:1051
    throw err ;
    ^

    Error : Cannot find module ’C :\Users\domin\arduino.js’
    at Module._resolveFilename (node:internal/modules/cjs/loader:1048:15)
    at Module._load (node:internal/modules/cjs/loader:901:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
    at node:internal/main/run_main_module:23:47
    code : ’MODULE_NOT_FOUND’,
    requireStack : []

    Node.js v20.9.0
    Avez-vous une solution ou est ce que je ne cherche pas au bon endroit ?
    Cordialement

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 novembre 2023 12:56, par PARMENTIER Dominique

    Bonjour
    je viens de voir les modifications a faire dans le fichier arduino.js
    Je viens de les réalisées par des copier coller mais toujours pas de communication.
    Le port COM 3 est utilisé et bien réglé en vitesse 115200.
    Pour l’instant bloqué.
    Quand pensez vous
    Cordialement

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 novembre 2023 20:49, par bobyAndCo

    Bonjour,

    Cet article a 7 ans maintenant et les choses ont beaucoup évoluées. Il existe maintenant une API qui fait le job.

    Regardez ces liens :

    https://randomnerdtutorials.com/esp32-webserial-library/

    https://f1atb.fr/index.php/fr/2021/10/29/web-serial-api-arduino/

    https://developer.chrome.com/articles/serial/

    Bien cordialement.

    Christophe

    Répondre

  • Piloter son Arduino avec son navigateur web et Node.js (1) 7 novembre 2023 21:20, par PARMENTIER Dominique

    Bonsoir
    merçi de votre réponse.
    J’ai fait un copier coller du fichier arduino.js et mis dans le meme dossier que startNode et la j’ai la communication OK.
    Je continu la lecture de ce projet.
    Cordialement

    Répondre

Réagissez à « Piloter son Arduino avec son navigateur web et Node.js (1) »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Programmation »

Les derniers articles

Les articles les plus lus