USBリレーモジュールの警告灯をブラウザで制御
FreeBSDでは、USBシリアルデバイスは/dev/ttyU*と/dev/cuaU*として認識されます。認識されたデバイスのパーミッションはデフォルトで600になるため、一般ユーザーではそのままでは使いにくい場合があります。そこで/etc/devfs.confを編集してパーミッションを変更します。
/etc/devfs.conf (ファイル末に2行追加)
perm cuaU0 0666
perm ttyU0 0666
これは、認識されたUSBシリアルデバイスが/dev/cuaU0と/dev/ttyU0の場合です。
devfsサービスを再起動します。
# service devfs restart
警告灯のUSBリレーモジュールをFreeBSDに接続します。
前回の記事でUSBリレーモジュールの操作方法はすでに確認済みなので、FreeBSDでも同じ方法で動作することを確かめます。異なる点はデバイス名くらいのはずです。
#初期化 % echo '50 51 0f' | xxd -r -p > /dev/cuaU0 #消灯 % echo '0f' | xxd -r -p > /dev/cuaU0 #緑点灯 % echo '0b' | xxd -r -p > /dev/cuaU0 #黄点灯 % echo '0d' | xxd -r -p > /dev/cuaU0 #赤点灯 % echo '0e' | xxd -r -p > /dev/cuaU0
ここまで正常に動作することを確認できたら、次はウェブブラウザから警告灯を制御できるようにします。
HTMLファイルの核心部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <!-- ボタン部 (formタグは無し) -->
<button type="submit" value="0">消灯</button><br />
<button type="submit" value="1">緑点灯</button><br />
<button type="submit" value="2">黄点灯</button><br />
<button type="submit" value="3">赤点灯</button><br />
<!-- 結果表示部 -->
<div id="result"></div>
<!-- Javascript -->
<script>
$('button').click(function() {
var val = $(this).val();
mgrAjax(val);
}
});
function mgrAjax(val){
$.ajax({
url: 'control.php',
type: 'POST',
data: {
mgr:val,
},
//frequency: 0.5,
success: function(response) {
$('#result').html(response);
exit;
}
});
}
</script>
|
ブログ記事用に大幅に省略して最小限の動作だけにしています。もちろんこれだけでは完全なHTMLファイルとして成立しないので、<html>ヘッダーや<head>、jQueryの読み込みなど必要な部分を追加してください。
制御用のphpファイルcontrol.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php
if(isset($_POST['mgr'])) {
$change = filter_var($_POST['mgr'], FILTER_VALIDATE_INT);
switch ($change) {
case 0:
$cmd = 'echo "0f" | xxd -r -p > /dev/cuaU0';
exec($cmd);
echo '<img src="/images/off.png" alt="警告灯 消灯" />';
break;
//中略(1,2,3で緑,黄,赤の点灯)
}
}
?>
|
本当はもっと丁寧に書いていますが、このページでは徹底的に省略し、短くするためにスイッチ文をベタ書きにしています。ご了承ください。普通なら、モジュールにコマンドを送った後にステータスを取得して確実に動作したことを確認する処理を入れるべきです(でないと確実な制御が期待できません)。しかし、このUSBリレーモジュールはリレーのステータスを取得できない仕様のため、そのような処理は一切入れていません。コマンド(コード)を送信しっぱなしで、「リレーが操作できたであろう」という期待のもとで結果を表示しています。つまり、実際にはリレーが動いていなくても「赤が点灯した」「消灯した」と表示されます。
動作の様子
Semantic UIでメニューやボタンを表示させています。