Komunikace mezi Arduinem a Node.js pomocí sériového portu v. 2

Zápisník experimentátora

Hierarchy: Node.js

Tento článek popisuje aktualizovanou verzi balíčku serialport ve verzi 6. Budeme pomocí sériového portu komunikovat s Arduinem. V JavaScriptu v prohlížeči nelze použít sériový port na lokálním počítači. Tento nedostatek v Node.js není a proto můžete plnohodnotně využívat sériový port na komunikaci. V tomto článku si vysvětlíme dva příklady. V prvním získáme seznam sériových portů a v druhém budeme číst řádky, které nám bude odesílat Arduino. Příklady se budou mírně lišit od příkladů, které jsme používali v předchozím článku.

Kód pro Arduino

Kód pro Arduino je zaměřen na jednoduchost. Proto dělá jedinou věc. Každých 1000 milisekund odešle na sériový port hodnotu funkce millis(). Pro nás vykonává důležitou činnost. Jednak máme Arduino na sériovém portu a máme na tom portu i periodický zdroj dat, které můžeme číst.

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

void loop() {
  Serial.println(millis());
  delay(1000);
}

Kód pro Node.js

Pokud jste nikdy předtím program pro Node.js nespouštěli, je třeba se naučit používat konzolu příkazového řádku a ovládání programu npm, který se používá na instalování souvisejících knihoven. Příklad použití najdete na konci tohoto článku.

Seznam připojených sériových portů (list.js)

Využívá se knihovna serialport. Funkce list potřebuje jako parametr callback funkci se dvěma parametry. Parametr ports bude obsahovat seznam všech com portů a protože je to pole objektů s informacemi o portech, může je jednoduše iterovat pomocí funkce forEach a v tomto případě vypsat na konzolu. Program spustíte v konzole příkazového řádku pomocí příkazu node list.js.

'use strict';

var serialport = require('serialport');

serialport.list(function (err, ports) {
  ports.forEach(function(port) {
    console.log(port.comName);
    console.log(' - pnpId: ' + port.pnpId);
    console.log(' - manufacturer: ' + port.manufacturer);
    console.log(' - serialNumber: ' + port.serialNumber);
    console.log(' - vendorId: ' + port.vendorId);
    console.log(' - productId: ' + port.productId);
  });
});

Čtení ze sériového portu přes Node.js (index.js)

Využívá se knihovna serialport a knihovna readline. Program funguje následovně. Nejprve vypíše seznam připojených sériových portů a vy si musíte vybrat ten, na kterém je vaše Arduino. Pokud je možné se připojit ke zvolenému sériovému portu, program se na něj připojí rychlostí 9600 a nastaví si čtení po řádcích, což odpovídá tomu, jak znáte z monitoru sériového portu pro Arduino.

Připojí se události error a open a pokud se program dostane do obsluhy události open, připojí se na událost data a začne každý řádek vypisovat na konzolu. Program spustíte v konzole příkazového řádku pomocí příkazu node index.js. Program se dá zastavit stisknutím klávesové zkratky Ctrl-C.

Rozdíl vůči verzi 4.0.7 je v tom, že se jinak nastavuje parser. Ve verzi 6.0.0 je třeba nejprve typ parseru vybrat pomocí příkazu const sp_readline = serialport.parsers.Readline;. A pak ho dvojicí příkazů const parser = new sp_readline (); a port.pipe (parser); připojit k objektu sériového portu.

'use strict';

const serialport = require('serialport');
const readline = require('readline');
const sp_readline = serialport.parsers.Readline;

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'select port> '
});

var idx = 0;
var ports = [];

console.log('COM port list:');
serialport.list(function (err, p) {
  p.forEach(function(p) {
    ports.push(p.comName);
    console.log(' [' + idx + '] ' + p.comName);
    idx++;
  });

  rl.prompt();
 
  rl.on('line', function(line) {
    //console.log(line);
    //console.log(ports);
    if(line<idx) {
      console.log('Opening ' + ports[Number(line)]);
     
      const port = new serialport(ports[Number(line)], {
        baudRate: 9600
        });
      const parser = new sp_readline();
      port.pipe(parser); 

      parser.on('data', function(data){
        console.log(data);
      });
       
      port.on('error', function(e) {
        console.error(e.message);
        process.exit(0);
      }); 
       
      port.on('open', function() {
        console.log('Serial Port Opened');
      });

      port.on('close', function(err) {
        console.log('Serial Port Closed: ' + err);
        process.exit(0);
      });
 
    } else {
      console.error('ERROR: Wrong port number');
      process.exit(0);
    }
  });
 
  rl.on('close', function() {
  console.log('Bye!');
  process.exit(0);
});
 
});

Zdrojové texty

Všechny zdrojové texty jsou umístěny na serveru GitHub.

Pokud máte nainstalovaný program git, můžete si zdrojové kódy nainstalovat například takto. Pokud ho nemáte, dají se stáhnout i jako zip archiv. Spusťte si konzolu příkazového řádku. Důležitý je poslední řádek, který nainstaluje všechny související knihovny, které jsou v souboru package.json.

cd d:
mkdir arduino
cd arduino
git clone https://github.com/roboulbricht/arduinoslovakia
cd arduinoslovakia\node.js\arduinoserialtest2\node
npm install

15.10.2017


Menu