IchigoJamでパソコンとUSBシリアル通信。Node.jsを使うとキーボードとモニタいらず
IchigoJamとUSB経由でシリアル接続
IchigoJamとは、子供向けのパソコンです。昔懐かしい、そして、今では知らない人も多いかも知れない、BASICというプログラミング言語でプログラムを作ることが出来ます。
通常、このパソコンは、基板むき出しで文字入力はPS/2のキーボード、映像出力はVideo端子でアナログテレビへ。それらをつなぐと、単体でプログラミングが出来るというすぐれもの。
ただし、今時のパソコンと違って、ネットワークに繋がってクラウドと連携して〇〇する、みたいなことはことは出来ません。あくまでも単体でプログラミング学習するのがメインなので、それで良いのです。
でも、実はUSBのちょっとした基板を増設することで、パソコンとシリアル通信が出来るのです。
シリアル接続に必要なもの
そもそも、シリアル通信ってなんでしょう?
一昔前のパソコンは、みんなRS232Cという規格のシリアル端子というのが付いていまして、パソコン通信をするためのモデムというデバイスをパソコンのシリアル端子に接続して使っていました。
今では、このシリアル端子はUSB端子がその代わりとして用意されていて、USB端子経由で昔のシリアル通信が出来る、という事になっています。
IchigoJamとパソコンをシリアル通信でつなぐためには、以下のような小さな基板と何本かのケーブルが必要です。
ふんせんショップさんというネット通販サイトより購入させていただきました。とても親切丁寧なお店です。
Ubuntu 18.04.1 LTS に接続して使えます
私は、普段Ubuntu を使っておりますので、Ubuntu 18.04.1が動作するパソコンのUSB端子にIchigoJamを接続してみました。
購入した小さなUSBの基板には、CP2102というチップが載っているそうです。特殊なドライバでも必要かと思いましたが、Ubuntuに差し込むと勝手にデバイスが認識されました。
/dev/ttyUSB0という場所にデバイスが以下のような感じで現れました。
ただし、一番最初に認識されたときは、一般ユーザの権限では使えなかったので、
$ sudo chmod 666 /dev/ttyUSB0
などと、アクセス権限の設定変更をしています。
Nodejsを使って通信してみる
シリアル通信をするソフトは、Linux (Ubuntu)向けにも色々存在しますし、IchigoJam用のプログラムもあります。例えば、こちらのソフトはLinuxでも動作します。
私の場合は、ちょっとプログラミングをしてみたかったので、Node.jsを使ってJavaScriptでシリアル通信を実現しました。
JavaScriptはChromeなどのWebブラウザで動作する、いわゆるクライアントのプログラムを書く時に使う言語として有名ですね。Node.jsはそれをサーバ側でも使えるようにするものです。
今回はサーバのプログラムを作るわけではないです。ただ、Node.jsを使うとコマンドラインで対話的にJavaScriptが扱えるようになり、便利です。そして、npmというパッケージマネージャを使用することで、JavaScriptの各種ライブラリを自由にインストールして、自分のプログラムで使うことが可能になります。なんとJavaScriptを使って、パソコンに付いているUSBのデバイスとシリアル通信をすることも可能になります。
Node.jsのインストールなどは他のサイトでも詳しく書かれています。ここでは、Node.js自体の準備は他のサイトに譲り、Node.js及び、npmが使える環境を想定して話を進めます。
シリアル通信のライブラリ(SerialPort)のインストール
まず、適当なフォルダ(ディレクトリと呼ぶべきか)を作ります。そのフォルダをnpmで初期化して、そのフォルダ内でNode.jsの関連ライブラリを管理できるような状態にします。そして、npmを使って、「serialport」というライブラリをインストールします。
$ mkdir ichigo_serial
$ cd ichigo_serial
$ npm init
$ npm install serialport
これで、作成したフォルダの下でプログラムを書く時に、serialportのライブラリが使えるようになります。
シリアル通信のJavaScriptプログラム
試しにコーディングしてみたプログラムはこんなことが出来るものです。
- パソコンについているシリアルデバイス(IchigoJam)を初期化
- 標準入力、つまり、キーボードからの入力を待って文字を広いIchigoJamに送る
- 標準出力、つまり、IchigoJamから来たテキストを画面に表示
というだけです。
が、これが意外と使えます。
通常、IchigoJamは、基板に直接キーボードとモニタ(テレビ)を繋がないと使えません。でも、このプログラムを使えば、キーボードを繋がなくてもいいし、テレビを繋がなくてもいい。USBのケーブルでパソコンにつなぐだけでいいのです。パソコンに繋がったキーボードから文字を入力し、パソコンのモニターにIchigoJamの表示が出るのです。意外と便利、べんり。
以下のようなプログラムを書きました。
'use strict';
const SerialPort = require('serialport');
const port = new SerialPort('/dev/ttyUSB0', {baudRate: 115200});
var parser = new SerialPort.parsers.Readline;
port.pipe(parser);
parser.on('data', console.log);
var reader = require('readline').createInterface({
input: process.stdin
});
reader.on('line', function (line) {
port.write(new Buffer(line + '\n'));
});
※ 投稿時、“baudRate: 112500″と、記載していた部分、正しくは、115200でした。上記修正しました(2020/3/22)
たったこれだけで、シリアル通信が出来てしまうのです。なんという便利な世の中なのでしょうか。
プログラムの中身を簡単に説明
1行目は型チェックを厳格にしましょうという、お作法です。
3行目、4行目は、serialportというライブラリをインポートして、初期化します。 /dev/ttyUSB0の部分はご自分の環境でデバイスが何と言う名前になっているかを確認してください。ls -ls /dev/serial/by-id/を見るとそれっぽいものがあるのではないかと思います。”port"という変数にSerialPortのオブジェクトが入りました。従って、プログラム中では、portを使って、IchigoJamにデータを送ったり、このオブジェクト経由でデータが送られてきたりする、ということになります。
6〜8行目では、シリアル通信でIchigoJamから来たデータを一行ごとに読み取る為の「パーサー」を作成し、そのパーサがパースし終わったデータを、標準出力、ここでは、console.logに出力しています。
10〜16行目は、readlineというライブラリを使って標準入力(キーボード入力)からの入力を待つ為の処理です。ここでも一行ごとの処理を実施しています。1行入力したら、"port"に1行送る、という処理をしています(15行目)。
プログラムの実行
上記のプログラムをコピーして、エディタ等にペースト。ファイル名を何か付けます。ここでは、test.js
先程npmの説明で作ったフォルダに保存します。
コマンドラインの保存したフォルダで、以下のように打ち込みます。
$ node test.js
実行しても何も表示されませんが、BASICのコマンドを何か打ち込んでみましょう。
led1
と打ち込んで、OKと返ってくれば正解です。
このコマンドで、IchigoJamのLEDが赤く光るか見てみるのが良いと思います。
パソコンとIchigJamでシリアル通信が出来ました
実際に動かしたときのビデオをアップしております↓