Node.js a více Arduin pomocí sériového portu

Zápisník experimentátora

Hierarchy: Node.js

V dnešním článku si připojíme více Arduin k počítači pomocí Node.js balíčku serialport. Budeme upravovat předchozí příklad, ve kterém jsme připojovali pouze jedno Arduino. V tomto příkladu se bude dát vybrat více COM portů.

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. Máme Arduino připojené 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

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. Můžete si vybrat i více portů najednou. Napíšete jejich seznam ve tvaru 1, 2, 3. 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. Výsledný výpis se bude podobat tomu, který znáte z monitoru sériového portu pro Arduino.

Několik řádků zdrojového kódu třeba vysvětlit. Jednotlivé sériové porty se zapisují jako seznam pořadových čísel, které jsou odděleny čárkami. Do pole jejich transformují funkcí split a pomocí funkce map a trim ořezávám nadbytečné mezery. Název sériového portu si ukládám přímo do parseru pomocí příkazu parser.po=port.path;. Díky tomu mohu při výpisu jednotlivých řádků zobrazit také informaci, které Arduino daný řádek poslalo.

'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 ports (comma separated)> '
});

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) {
    var indexes = line.split(',')
      .map(function(item) {
        return item.trim();
      });
    //console.log(indexes);

    indexes.forEach(function(i) {
      if(i<idx) {
        console.log('Opening ' + ports[Number(i)]);

        const port = new serialport(ports[Number(i)], {
          baudRate: 9600
          });
        const parser = new sp_readline();
        parser.po=port.path;
        port.pipe(parser);  

        parser.on('data', function(data) {
          console.log(this.po + ':' + data);
        });
        
        port.on('error', function(e) {
          console.error(e.message);
          process.exit(0);
        });
        
        port.on('open', function() {
          console.log('Serial port ' + this.path + ' 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\arduinoserialtest3\node
npm install

01.12.2017


Menu