Node.js a viac Arduin pomocou sériového portu

Zápisník experimentátora

Hierarchy: Node.js

V dnešnom článku si pripojíme viac Arduin k počítaču pomocou Node.js balíčka serialport. Budeme upravovať predchádzajúci príklad, v ktorom sme pripájali iba jedno Arduino. V tomto príklade sa bude dať vybrať viac COM portov.

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ť. Máme Arduino pripojené 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

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. Môžete si vybrať aj viac portov naraz. Napíšete ich v tvare 1, 2, 3. 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. Výsledný výpis sa bude podobať tomu, ktorý poznáte z monitora sériového portu pre Arduino.

Niekoľko riadkov zdrojového kódu treba vysvetliť. Jednotlivé sériové porty sa zapisujú ako zoznam poradových čísiel, ktoré sú oddelené čiarkami. Do poľa ich transformujem funkciou split a pomocou funkcie map a trim orezávam nadbytočné medzery. Názov sériového portu si ukladám priamo do parsera pomocou príkazu parser.po=port.path;. Vďaka tomu môžem pri výpise jednotlivých riadkov zobraziť aj informáciu, ktoré Arduino daný riadok 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š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\arduinoserialtest3\node
npm install

01.12.2017


Menu