みかづきブログ・カスタム

基本的にはちょちょいのほいです。

Node SerialPortを使って、ArduinoとMacで文字列をやり取りする 💻

serialport.io

ArduinoのSerial Monitorを使っても良いのですが、個人的にはさささっとNode.jsを書いて、ターミナル上で確認することが多いです。

www.arduino.cc

受信

ソースコード

package.json
{
  "name": "serial-develop",
  "version": "1.0.0",
  "main": "index.mjs",
  "dependencies": {
    "serialport": "^12.0.0"
  }
}
index.mjs
import { SerialPort, ReadlineParser } from 'serialport';

(async () => {
  let path = '';
  const baudRate = 9600; // Arduino側のbaudRateに合わせる
  const manufacturer = 'Arduino';

  await SerialPort.list().then((list) => {
    list.forEach((item) => {
      if (
        item.manufacturer &&
        (new RegExp(manufacturer)).test(item.manufacturer)
      ) {
        path = item.path;
      }
    });
  });

  if (path) {
    const port = new SerialPort({
      path,
      baudRate
    });
    const parser = new ReadlineParser();

    parser.on('data', (data) => {
      console.log(data); // 受信した文字列を表示
    });

    port.pipe(parser);
  }
})();

実行

node index.mjs

これで、シリアル通信をターミナル上で確認できます。

送信

ソースコード

※ package.jsonは受信と同じです

index.mjs
import { SerialPort, ReadlineParser } from 'serialport';

(async () => {
  let path = '';
  const baudRate = 9600; // Arduino側のbaudRateに合わせる
  const manufacturer = 'Arduino';

  await SerialPort.list().then((list) => {
    list.forEach((item) => {
      if (
        item.manufacturer &&
        (new RegExp(manufacturer)).test(item.manufacturer)
      ) {
        path = item.path;
      }
    });
  });

  if (path) {
    const port = new SerialPort({
      path,
      baudRate
    });

    port.on('open', () => {
      port.write(`${ process.argv[2] }\n`, (err) => {
        if (err) {
          console.error(err);
        }
      });
    });
  }
})();

実行

実行

node index.mjs Ya-Ha-!

これで、Arduinoに Ya-Ha-!\n という文字列を送信できます。

送受信

まとめると、下記のコードで送信と受信が確認できます!

import { SerialPort, ReadlineParser } from 'serialport';

(async () => {
  let path = '';
  const baudRate = 9600; // Arduino側のbaudRateに合わせる
  const manufacturer = 'Arduino';

  await SerialPort.list().then((list) => {
    list.forEach((item) => {
      if (
        item.manufacturer &&
        (new RegExp(manufacturer)).test(item.manufacturer)
      ) {
        path = item.path;
      }
    });
  });

  if (path) {
    const port = new SerialPort({
      path,
      baudRate
    });

    parser.on('data', (data) => {
      console.log(data); // 受信した文字列を表示
    });

    port.pipe(parser);

    port.on('open', () => {
      port.write(`${ process.argv[2] }\n`, (err) => {
        if (err) {
          console.error(err);
        }
      });
    });
  }
})();