Sota用の人感センサ付き台座「VS-ST002」はご存知ですか?
主にプレゼン機能(プレゼンSota・ロボコネクトSota)での利用を想定し、プレゼン職人で専用コマンドを使うことで「人が来たことを感知してプレゼンを開始」と言った使い方ができます。

プレゼンSota用人感センサ搭載台「VS-ST002」 66,000円(税込)

人感センサ搭載台「VS-ST002」
人感センサ搭載台「VS-ST002」本体及びSotaの装着状態

搭載された人感センサ「IWS600-CM」は、一般的な人感センサをUSB-HID経由で容易に扱えるようにした製品です。プレゼンで利用する場合は、センサはPC側に接続しますが、折角のHIDデバイスなのでSotaから直接扱いたい気持ちもあります。

そんなあなたに朗報です。なんとデベロッパ版Sotaを用いて内部の開発をすることで、この人感センサをSotaから直接読み出すことが可能です。これから何回かに分けて、センサの値をSotaから取得してプログラムで活用する方法について紹介していきます。

サンプルコードのダウンロードと展開

IWS600-CMの製品ページには、技術資料とWindows及びLinux向けのサンプルコードが公開されています。まずはこれらをダウンロードしてください。

センサの製品ページから、資料とLinux版のサンプルコードをダウンロード

ダウンロードしたファイルは、Sotaに転送して展開してください。

ダウンロードしたサンプルコードファイルをSota内に転送

SSHでSotaのコンソールにログインして、ダウンロードしたサンプルファイルを展開します。tar.gzの展開は、”tar -zxvf (ファイル名)”で行います。

$ tar -zxvf iws600cm-0.1.0.tar.gz
サンプルコードを展開。iws600cm-0.1.0と言うディレクトリに展開される

配布されているサンプルコードはC言語なので、今回はまずC言語ベースで数値が取得できるところまで確認します。サンプルコードのメイン処理(main関数)はiws600cm.cで実装されています。

必要なライブラリの準備

ここで一度、 SotaとセンサをUSBで接続し、認識されることを確認してみます。USBケーブル(mini-B)で、SotaのUSBポートにセンサを接続してみてください。

なお、検証に使用したSotaでは、本体に上下に並んだUSBポートの上側のみが認識しました。USBポートによってこのように認識するものとしない物がある可能性があります。

センサを接続しコンソールからlsusbコマンドを入力すると 、IDが16c0:05dfで認識されたデバイスが存在することが確認できます。これは、サンプルコードのREADME.txtに記載のベンダID・プロダクトIDと同じです。

ベンダID:16c0、プロダクトID:05dfのデバイスが追加される。
これらのIDは後々随所で出て来るのでメモしておくとよい。

続いて、必要なライブラリをインストールします。付属のREADME.txtにlibusbを使用する旨が記載されているので、Sotaにopkgでインストールします。 libusbには0.1系と1.0系の二種類が存在するようです。両者の違いは把握できていませんが、今回の検証では0.1系で進めてみます(0.1のインストール時に自動的に1.0も入る?)。

$ opkg install libusb-0.1-4
$ opkg install libusb-0.1-dev
opkgでlibusb-0.1-4、libusb-0.1-devをインストール

サンプルコードのビルド(make)

さて、 必要なライブラリがそろったはずので、一度makeしてみます。サンプルコードを展開したディレクトリに移動して、makeを実行します。

$ cd iws600cm-0.1.0
$ make
一度makeしてみるが、エラーが表示される

makeすると、様々な参照が見つからずにmakeに失敗した旨が表示されます。
どうやらライブラリの参照に関する設定に問題があるようなので、Makefileを修正します。viで編集を開始します(ファイル名の大文字・小文字は正確に入力)。

$ vi Makefile

ライブラリの参照設定は、13~19行目のUSBFLAGS・USBLIBSの設定のようです。

Makefileの中身。USBFLAGS,USBLIBSあたりが参照設定。
Windows用とLinux用があるが、必ずしもそれに従うわけではない(詳細は後述)

Intel EdisonのLinux(yocto)のCコンパイラでは、ライブラリの参照は’-l(ライブラリのファイル名の冒頭のlibと拡張子を省いた表記)’のようにするため、USBLIBSをそれに準じた形で書き換えます。また、libub以外のライブラリの参照を削除します。
viで編集を始める場合は、キーボードのiキーを押してください。

USBFLAGS,USBLIBSのコメントアウトを上側・下側で入れ替え、libusb以外の参照を削除する

ファイルを書き換えたら、キーボードからESCキー→:(コロン)→w→qの順番でキーを入力して、編集内容を保存してください。
保存したら再度makeを実行してみます。エラーが表示されなくなり、iws600cmというファイル名の実行ファイルが生成されたことが確認できます。

$ make
再びmakeを実行すると、エラーが出なくなり「iws600cm」という実行ファイルが生成される
(実行属性が与えられたファイルは緑色で表示される)

ちなみに、USBLIBSの設定を-lhid -lusb -lsetupapiのままmakeすると、それらの参照が見つからないエラーが発生します。

libusb以外のライブラリ参照を削除せずにmakeすると、
それらが見つからないエラーが表示される

ビルドしたプログラムを実行

それでは、makeしたファイルを実行してみましょう。Sotaにセンサをつないで「./iws600cm」と入力するとファイルを実行できます。実行すると、「必要なパラメータを与えて実行してください」というような案内が表示されます。

$ ./iws600cm
何かパラメータを与えて実行しないといけない

どんなパラメータを与えればよいかは、製品ページで公開されているデータシート・マニュアル(PDF形式のマニュアル)の2~3ページに記載されているものと同じです。
センサを1回だけ読み取る場合はone、連続で読み取り続ける場合はloopを指定し、また、接続先のセンサをシリアル番号もしくはANY(最初に見つかったセンサ)で指定します。

今回は、センサ情報を画面に表示し続けたいので、「./iws600cm loop ANY」と入力してみます。入力すると、画面に数字が出続けます。数値は0または2で、センサに反応があると2、反応が無いと0が出ます。

$ ./iws600cm loop ANY
センサ入力が表示され続ける。
センサに反応があると2、反応が無いと0が出る

ちなみに、センサの特性により、人を検出してもその人が滞留している(その場にとどまり続ける)と数値が0に戻るようです。その人が再び大きく動いてセンサの入力が変化すれば数値が2になります。この特性のため、センサの用途としては「人を検出したか否か」の一瞬の判断に用いるのが適切であり、「人がいるかいないか」という時間軸方向も含めた検出には向かないようです。

今回はここまでとします。次回はVstoneMagicでも使われているJavaからセンサの値を読み出す方法について解説していきたいと思います。
今回のサンプルコードは、以下のリポジトリで公開しています。なお、元々のサンプルコードのライセンスはGPL2のため、公開したコードを用いて開発・配布される際はご注意ください。

https://github.com/vstoneofficial/HumanSensor_Sota/releases/tag/HumanSensor_1st

このリポジトリは、本連載全体のソースコードです。今回のソースを取得する場合は、上記URLより「Source code (zip)」をクリックすれば、記事に合ったzip形式のソースをダウンロードできます。