HALのプログラム例~ SOCKET SERVER 'HAL'

HAL を操作するためのプログラムは本当に簡単です。難しいプログラムは全て、フレームワークとして提供されています。

ここでは実際にどんなプログラムを書けばいいのかをご紹介することで、ソケットサーバー「HAL」が一体どんなアプリケーションであるかご理解いただければと思います。

どんなプログラムを書くの?

※このページで紹介している記述方法は version 1.3 までを想定した記事です。version 1.4 以降でも同様の記述ができますが、1.4 からは /actions ディレクトリという、ユーザー個別の機能を記述したファイルを配置するディレクトリが作成されました。

「簡単なPHPコードを書くだけで Raspberry Pi を制御することが出来る」と言われてもピンと来ないかもしれません。

ここでは、いくつかのケースを想定して、それに必要なプログラムコードのサンプルをご紹介します。

なお、HAL のプログラムは UTF-8 で記述することが推奨されます。Raspbian のデフォルト文字コードも PHP の推奨文字コードも HTML5 の推奨文字コードも同様に UTF-8 です。別の文字コードを用いる場合、命令の分岐処理に使われている preg_match() メソッドなどは、適宜書き換える必要がありますのでご注意ください。

ケース1:あなたの声で蛍光灯を点ける

Raspberry Pi を購入された方の多くは、赤外線LED を使って学習リモコンを制作する事に興味を持たれると思います。Raspberry Pi での学習リモコンについては、当サイトの「赤外線リモコン信号受信・送信」に回路とプログラムのサンプルを紹介した記事があります。

ここではこの記事の回路とプログラムを、Julius の音声解析をつかって動作させるプログラムコードのサンプルをご紹介します。

今、上記ページサンプルを使って、送信プログラムを sendir、蛍光灯を点けるデータを on.ir、消すデータを off.ir として path ディレクトリに保存してあるとすると、

juliusActions.php

if(preg_match("/電気を?つけて/iu", $method))
{
exec("sudo path/sendir path/on.ir 3");
} else if(preg_match("/電気を?消して/iu", $method)){
exec("sudo path/sendir path/off.ir 3");
}

たったこれだけです。

(※音声認識については Julius の導入 に記載があります。ここでは、音声認識データ kaden.dfa を利用しています。)

Julius の音声認識結果は voice_client.php を介して自動で HAL の juliusActions.php にある action メソッドに $method として文字列で送られてきます。あなたがすることは、$method を調べ、その文字列の時に HAL にさせたい事を書くだけです。

「を」の後にある ? は、その直前の文字が存在してもしなくてもマッチします。つまり「電気を?つけて」は、「電気つけて」と「電気をつけて」の両方にマッチすることになります。

例えば Raspberry Pi の GPIO 25番ピンに LED が接続されており、「豆つけて」という命令でこれを点けたいのであれば、プログラムコードは

juliusActions.php

if(preg_match("/豆を?つけて/iu", $method))
{
digitalWrite(25, 1);
}

になります。簡単でしょう?

ケース2:インターネット経由でブラウザからエアコンを点ける

夏場や冬場、帰宅前にエアコンをつけて温度調節しておきたいといった事も、HAL なら簡単に出来ます。

まず、ケース1のように 赤外線リモコン信号受信・送信 を参照してエアコンの操作ができるようにしてあるとします。

今回はインターネット経由で HAL に命令を出すので、WEBサーバーの構築が必要です。ApacheとPHPのインストール のように、Apache2 か、それに替わる WEB サーバーを導入して下さい。

HAL は BSDソケットを用いたソケットサーバーであり、ソケットを使って通信を行います。ですから、HAL を操作するための WEB サーバーは Raspberry Pi 自体にインストールしても良いですし、別のコンピューターにインストールされた WEBサーバーでも構いません。HAL にソケット通信で接続する PHP のクライアントプログラムライブラリも、この製品に同梱しています。

WEB サーバーが用意出来たら、あなたの指示を HAL に送信するアプリケーションを作ります。

例えば極めて簡単な PHP プログラムの例は以下です。

index.php

<?php
namespace Feijoa\HAL;
require("SOCKET.php");

if(!empty($_POST["method"])){
$socket = new SOCKET();
// HAL の IPアドレスとポート番号
$socket->connect("192.168.1.12", 9000);

if(preg_match("/\Akill,/iu", $_POST["method"])){
// kill,password の形式で命令すると、HAL を終了する命令を送信します。
$killing_word = explode(",", $_POST["method"]);
if(count($killing_word) === 2){
// $killing_word は , で分離された配列が格納されています。
// 配列のインデックスは 0番から始まるため、password 部分は 1番目となります。
$socket->kill(trim($killing_word[1]));
}
} else if($_POST["method"] === "エアコンオン"){
$socket->write("aircon_on");
} else if($_POST["method"] === "エアコンオフ"){
$socket->write("aircon_off");
}

$socket->disconnect();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HALの操作</title>
</head>
<body>
<form method="POST" action="./">
<input type="text" name="method" value="">
<input type="submit" name="submit" value="送信">
</form>
</body>
</html>

冒頭で読み込んでいる SOCKET.php が、HAL との接続を確立する クライアントライブラリです。

SOCKET::write() メソッドで HAL に向けて通信を行います。例えば、$socket->write("aircon_on"); を実行すると、

HAL,aircon_on\n

という情報が HAL に送信されます。HAL で始まる通信が送られると、HAL はその情報を myActions.php の action メソッドに $method として文字列で渡します。

あとは、myActions.php の action メソッド内にケース1の時と同様に、

myActions.php

if(preg_match("/aircon_on/iu", $method))
{
exec("sudo path/sendir path/aircon_on.ir 3");
} else if(preg_match("/aircon_off/iu", $method)){
exec("sudo path/sendir path/aircon_off.ir 3");
}

と記述するだけです。

なお、上記サンプルコードの index.php は、WEBサーバーにアクセスできる人は誰でも操作出来てしまいます。インターネット経由で操作するということは WEBサーバーは公開されている状態ですので、適切なアクセス制限を施しましょう。例えば、当サイトの 365日の紙PHP:最初のPHPプログラム(4日目~11日目) では、安全なログインフォームの作り方をご紹介しています。

ファイアーウォールやWEB サーバー自体のセキュリティ設定等については範囲が膨大になるため、他サイトの解説記事をご参照いただけると幸いですが、当サイトでも今後、そのあたりの記事を増やしていくつもりです。

ケース3:センサーを使ってみたい

Raspberry Pi にセンサーを取り付けてその結果を記録したい、その結果で HAL に何かさせたい、という事もあると思います。

HAL には、SPI通信によって 12ビット ADコンバーターの出力値を取得するためのクラス ReadADC が同梱されています。出力値の取得メソッドは ReadADC::exec($ch) で、戻り値は $chに指定されたチャンネルの値が 0~100% の実数で返されます。

例えば 12ビット ADコンバーターとして MCP3208-CI/P(秋月電子通商) を利用しており、CH0に半固定抵抗が接続されているとします。

この抵抗量を取得するには、

$result = ReadADC::exec(0);

とするだけです。あとは $result を検査して処理を記述してください。例えば、GPIO 25番ピンに LED が接続されている場合、

$result = ReadADC::exec(0);
if($result > 50){
digitalWrite(25, 1);
} else {
digitalWrite(25, 0);
}

とすれば、抵抗の半分をしきい値として LED のオンオフを切り替える事ができます。

なお、ReadADC はプログラムのどこからでも呼び出せますので、juliusAction.php 内や myAction.php 内でも利用できますが、常に検査を行っていたい場合は Sensor.php の exec() メソッド内に処理を記述するようにして下さい。Sensor::exec() は HAL の実行インターバル毎に一度呼び出されます。デフォルトの場合、HAL の実行インターバルは 200 ミリ秒 ですので、約 200 ミリ秒毎にセンサーの値の読み取りが行われます。

補足として、ReadADC::exec() メソッドの第2引数に true を指定すると % ではなくデジタルの実値が返されます。12ビットコンバーターの最大値は 4095 ですので、0 ~ 4095 の整数が返ることになります。

例)

$resutl = ReadADC::exec(3, true);

※第2引数のデフォルトは false であり、この値は省略出来ます。

なお、SPI通信とADコンバーターについては、

の6章を参考にされると良いでしょう。この本は良い本でおすすめです。

ケース4:誰かが動いたらカメラで録画する

人感センサーとカメラを使って HAL を操作します。

当サイトでテストした人感センサーは売り切れになってしまっていたので、似た製品のリンクを貼っておきました。

これらを入手出来たら、あとは本当に簡単です。カメラモジュールを Raspberry Pi に接続し、人感センサーを SPI 通信の出来る 12ビット ADコンバーター(例えばMCP3208-CI/P)の好きなチャンネル(ここでは例としてCH3)に接続します。

そうしたら、Sensor.phpに

Sensor.php

$result = ReadADC::exec(3);
if($result > 50){
$time = date("YmdHis");
exec("sudo raspivid -o video_{$time}.h264 -t 10000 -w 640 -h 480 -n");
}

このようにするだけで、動く人を検知すると自動で 10 秒間の録画を行ってくれます。

raspivid コマンドのオプションについては、こちらのサイト Jun's Homepage に詳しい記述があります。

なお、上記のコードは、動くものを検知する度に録画コマンドが実行されます。実際に人が動く場合、断続的にその動作をセンサーが検知するので、必要以上にコマンドが実行されてしまうことになります。

実際のプログラムを書く場合は、排他処理を加え、録画中は別の録画コマンドを実行しないような処理が必要になるでしょう。

この場合に利用できるのが Sensor::exec() メソッドに渡されてくる HALDto $dto という変数です。

HALDto は、HAL の全てのプログラム内で受け渡しが行われるコンテナオブジェクトで、この HALDto には自由に変数を追加して値を保持できます。

たとえば、録画を開始してから 10 秒間は別の録画をさせたくないのであれば、

Sensor.php

$result = ReadADC::exec(3);
if($result > 50){
if(!isset($dto->my_exclusion_time) || $dto->my_exclusion_time < time()){
$time = date("YmdHis");
exec("sudo raspivid -o video_{$time}.h264 -t 10000 -w 640 -h 480 -n");
$dto->my_exclusion_time = time() + 10;
}
}

等とすれば、録画を開始してから 10 秒間は別の録画を開始することを制限できます。

PHPマニュアル:time

余談として、人感センサーですが、当サイトには 人感センサー(焦電型赤外線センサー)~家電制御の起点になります というページがあり、ここで、全く独自の人感センサーを組み上げています。

ですがこの回路、ブレッドボードまで合わせて考えると軽く1000円を超えてしまうんです。

一方、市販されている Raspberry Pi 対応の人感センサーはほんの数百円ですし、性能もずっと上です。

「自分で回路を組み立てる事が楽しいんだ!」という人でなければ、市販のセンサーを買ったほうがあらゆる面でお得ですよ、ということを最後に申し上げておきますね。

まとめ

いかがでしょうか? ソケットサーバー「HAL」が、サーバーフレームワークであるということの意味がなんとなくお分かりいただけたかと思います。

HAL は、Raspberry Pi をサーバーとして動作させるための機能を、極めて簡単かつ便利な手続きとして提供しています。

ソケットサーバー「HAL」を使えば、あなたは煩雑な設定やプログラムから開放され、本当にあなたがやりたい事だけに集中できるようになります。

ぜひ HAL を使って、あなたの Raspberry Pi をもっと便利な物に育て上げてください。


ご購入

ソケットサーバー「HAL」は以下のオンラインショップでご購入いただけます。ご購入に先立っては、ぜひ、体験版で動作の確認をお願いいたします。

体験版

ソケットサーバー「HAL」の体験版をダウンロード
hal_trial version 1.5
試用期限 2016/11/30 まで
※ sudo wget -O hal_trial_1_5.tar.gz 'http://feijoa.jp/getFile/?place=products&filename=hal_trial_1_5.tar.gz' でもダウンロードできます。
HAL の IP アドレス制限を解除してライセンス制に変更しました。お好きな IP アドレスで HAL をお試しいただけます。なお、ライセンスされていない製品では起動から 40 時間後に HAL は自動終了します。

この記事へのコメント

※現在コメントはMarkdown記法が強制です。>>Markdown の書き方


この記事に返信

このコメントに返信