対象読者
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を本格的な監視カメラとして利用することができるでしょう。
 
 
 
              
               
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                              
                               
                              
                               
                              
                               
                              
                               
                              
                               
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
															
														 
															
														.png) 
     
     
     
     
     
													 
													 
													 
													 
													 
										
									
 
                     
                    