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

Zápisník experimentátora

Hierarchy: Node.js

V několika článcích jsme se věnovali úvodu k Node.js a dnes se podíváme na první zajímavou tému. 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.

Tento článek používa balíček serialport v. 4.0.7 pro Node.js. Tento balíček je zastaralý. V novějších balíčcích je změněno používání parseru. Příklad pro v. 6.0.0 si můžete prohlédnout v aktualizované verzi č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 konzoli 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 knižica 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.

'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š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\arduinoserialtest\node
npm install

14.10.2017


Menu