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 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);
}
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.
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);
});
});
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);
});
});
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