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

Zápisník experimentátora

Hierarchy: Node.js

V niekoľkých článkoch sme sa venovali úvodu k Node.js a dnes sa pozrieme na prvú zaujímavú tému. 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.

Tento článok používa balíček serialport v. 4.0.7 pre Node.js. Tento balíček je zastaraný. V novších balíčkoch je zmenené používanie parsera. Príklad pre v. 6.0.0 si môžete pozrieť v aktualizovanej verzii č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žica 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.

'use strict';

var serialport = require('serialport');
const readline = require('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', (line) => {
    //console.log(line);
    //console.log(ports);
    if(line<idx) {
      console.log('Opening ' + ports[Number(line)]);
     
      var port = new serialport(ports[Number(line)], {
        baudRate: 9600,
        parser: serialport.parsers.readline('\n')
        });
       
      port.on('error', function(e) {
        console.error(e.message);
        process.exit(0);
      }); 
       
      port.on('open', function() {
        console.log('Serial Port Opened');
        port.on('data', function(data){
          console.log(data);
        });
      });
 
    } else {
      console.error('ERROR: Wrong port number');
      process.exit(0);
    }
  });
 
  rl.on('close', () => {
  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\arduinoserialtest\node
npm install

08.05.2017


Menu