対象読者
IoTに興味があり、JavaScriptの基本的な知識がある方を対象とします。
はじめに
Tessel 2にはUSBポートがついていて、PC用の汎用的なUSBモジュールも接続可能です。そこで今回は、USB接続のWebカメラを接続して、画像を表示してみます。
利用できるWebカメラ
Tessel 2で利用できるWebカメラは、UVC(USB Video Class)に準拠したものです。UVCとは、USB機器の標準仕様のひとつで、Webカメラ向けのUSB通信の仕様です。UVCに準拠していれば、(Tessel 2に限らず、多くの環境で)専用のドライバは不要です。
今回のサンプルでは、ロジクール社の「HD Webcam C310」というWebカメラを用いました。
また、Tessel 2のファームウェアは、Ver 0.0.16で動作を確認しています。古いバージョンでは動作しない可能性がありますので、t2 updateコマンドで、最新のものにアップデートしておいてください。
USBカメラの制御(1)
USBカメラの制御についても、前回の気候センサーと同様、npmモジュールが公開されています。ただし、執筆時点では開発途上のため、npmモジュールの公開ページにあるサンプルコードのままでは、うまく動作しないようです。
静止画像と動画の配信
単純に、静止画像と動画を配信するだけなら、ごくシンプルなコードで実現できます。プロジェクト用のフォルダを新規作成し、initコマンドで初期化したあと、npmモジュールをインストールします。
Webカメラを制御するnpmモジュールは、install tessel-avというコマンドでインストールできます。tessel-avという名前のとおり、このモジュールにはWebカメラだけではなく、USB接続のマイク、スピーカーの制御も含まれています。
> mkdir webcam > cd webcam > t2 init > npm install tessel-av
では、index.jsを書き換えてみます。次のように、たったの3行です。
var av = require('tessel-av'); // Webカメラ用モジュールの読み込み var camera = new av.Camera(); // mjpg_streamerの起動 console.log(camera.url); // 動画配信URLの表示
USBポートにカメラを接続し、t2 run index.jsコマンドで実行します。
プログラムが起動すると、コンソールに、http://XX.XX.XX.XX:8080/?action=streamのようなURLが表示されます。このIPアドレスは、Tessel 2のローカルアドレスですので、そのままブラウザで表示してみましょう。動画が配信されているはずです。
これだけのコードで動画のWeb配信が可能なのは、MJPG-streamerという動画ストリーミングソフトウェアが起動しているからです(Tessel 2の初期のファームウェアでは、MJPG-streamerではなく、FFmpegがインストールされていました)
MJPG-streamerは、その名のとおり、Motion JPEG形式の動画をストリーム配信するためのオープンソースのアプリケーションです。Tessel 2には、HTTP経由の配信が可能なMJPG-streamerのバイナリがインストールされています。
なお、動画だけでなく、http://XX.XX.XX.XX:8080/?action=snapshotとすることで、静止画を取得することもできます
av.Cameraのオプション
Cameraクラスのコンストラクタでは、次のように画像などのオプション指定が可能です。ただし解像度やフレームレートは、USBカメラのハードウェア仕様に依存しますので、カメラの性能以上を指定しても無視されます。
var camera = new av.Camera( { dimensions: '1280x720', // 解像度 fps:30, // フレームレート });
起動時に指定可能なオプションは、次のとおりです。
オプション | 概要 | デフォルト |
---|---|---|
dimensions | 画面解像度(縦×横) | 800×600 |
fps | フレームレート(1秒あたりのフレーム数) | 30 |
quality | JPEGのクオリティ(1~100) | 100 |
port | サーバー用ポート | 8080 |
監視カメラページ
MJPG-streamerに直接アクセスするだけでなく、別途HTTPサーバを起動して表示することもできます。Node.js向けのWebフレームワークである「Express」を使って、かんたんな監視カメラページを作ってみましょう。
// Webカメラ用モジュールの読み込み var av = require('tessel-av'); var express = require('express'); var app = express(); var server = require('http').Server(app); var port = 80; var os = require('os'); var path = require('path'); // mjpg_streamerの起動 var camera = new av.Camera(); server.listen(port, function () { console.log(`start web site...`); }); // 静的ファイル用ディレクトリの設定 app.use(express.static(path.join(__dirname, '/public'))); // 動画の表示 app.get('/stream', (request, response) => { response.redirect(camera.url); });
監視カメラを表示するページ自体は、静的なHTMLファイルとしています。ここでは、プロジェクトにpublicディレクトリを作成して、その中に次のindex.htmlを作成します。
<!doctype html> <html> <head> <meta charset="utf-8"> <title>監視カメラ</title> </head> <body> ただいま監視中です...<br /><img src="/stream"> </body> </html>
なお、このようなJSファイル以外をTessel 2に配置する場合は、プロジェクト内の.tesselincludeファイルに、次のようにパス名を記述しておきます。
public/index.html
t2 run express.jsコマンドで、実行します。サンプルは、ごくシンプルなHTTPページですが、工夫すれば、Tessel 2を本格的な監視カメラとして利用することができるでしょう。