Komunikácia medzi Arduinom a Node.js pomocou sériového portu v. 2

Zápisník experimentátora

Hierarchy: Node.js

Tento článok popisuje aktualizovanú verziu balíčka serialport vo verzii 6. Budeme pomocou sériového portu komunikovať s Arduinom. V javascripte v prehliadači nemôžete používať sériový port na lokálnom počítači. Tento nedostatok v Node.js nie je a preto môžete plnohodnotne využívať sériový port na komunikáciu. V tomto článku si vysvetlíme dva príklady. V prvom získame zoznam sériových portov a v druhom budeme čítať riadky, ktoré nám bude odosielať Arduino. Príklady sa budú mierne odlišovať od príkladov, ktoré sme používali v predchádzajúcom článku.

Kód pre Arduino

Kód pre Arduino je zameraný na jednoduchosť. Preto robí jedinú vec. Každých 1000 milisekúnd odošle na sériový port hodnotu funkcie millis(). Pre nás vykonáva dôležitú činnosť. Jednak máme Arduino na sériovom porte a máme na tom porte aj periodický zdroj údajov, ktoré môžeme čítať.

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

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

Kód pre Node.js

Pokiaľ ste nikdy predtým program pre Node.js nespúšťali, je potrebné sa naučiť používanie konzoly príkazového riadku a ovládanie programu npm, ktorý sa používa na inštalovanie súvisiacich knižníc. Príklad použitia nájdete na konci tohto článku.

Zoznam pripojených sériových portov (list.js)

Využíva sa knižnica serialport. Funkcia list potrebuje ako parameter callback funkciu s dvoma parametrami. Parameter ports bude obsahovať zoznam všetkých com portov a pretože je to pole objektov s informáciami o portoch, môže ich jednoducho iterovať pomocou funkcie forEach a v tomto prípade vypísať na konzolu. Program spustíte v konzole príkazového riadku pomocou prí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);
  });
});

Čítanie zo sériového portu cez Node.js (index.js)

Využíva sa knižnica serialport a knižnica readline. Program funguje nasledovne. Najprv vypíše zoznam pripojených sériových portov a vy si musíte vybrať ten, na ktorom je vaše Arduino. Ak je možné sa pripojiť ku vybranému sériovému portu, program sa naň pripojí rýchlosťou 9600 a nastaví si čítanie po riadkoch, čo zodpovedá tomu, ako poznáte z monitora sériového portu pre Arduino.

Pripoja sa udalosti error a open a ak sa program dostane do obsluhy udalosti open, pripojí sa na udalosť data a začne každý riadok vypisovať na konzolu. Program spustíte v konzole príkazového riadku pomocou príkazu node index.js. Program sa dá zastaviť stlačením klávesovej skratky Ctrl-C.

Rozdiel voči verzii 4.0.7 je v tom, že sa inakšie nastavuje parser. Vo verzii 6.0.0 je potrebné najprv typ parsera vybrať pomocou príkazu const sp_readline = serialport.parsers.Readline;. A potom ho dvojicou príkazov const parser = new sp_readline(); a port.pipe(parser); pripojiť 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šetky zdrojové texty sú umiestnené na serveri GitHub.

Ak máte nainštalovaný program git, môžete si zdrojové kódy nainštalovať napríklad takto. Ak ho nemáte, dajú sa stiahnuť aj ako zip archív. Spustite si konzolu príkazového riadku. Dôležitý je posledný riadok, ktorý nainštaluje všetky súvisiace knižnice, ktoré sú v súbore package.json.

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

13.10.2017


Menu