USBリレーモジュールの警告灯をブラウザで制御

警告灯をブラウザで制御

FreeBSDではUSBシリアルデバイスは/dev/ttyU*と/dev/cuaU*として認識される。 認識されたデバイスはパーミッションが600になるのでそのままでは使いにくい。そこで/etc/devfs.confでパーミッションを変更する。


/etc/devfs.conf (ファイル末に2行追加)
perm cuaU0 0666
perm ttyU0 0666

認識されたUSBシリアルデバイスが/etc/cuaU0と/etc/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ヘッダなど必要なものを書く。

制御用の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でメニューやボタンを表示させている。

関連記事: