USB-An 応用編

<<トップページへ

概要

USB インターフェイスを使って現在使用している録画システムの外部チューナーの電源を制御してみた。今のところ録画失敗等の 事故は起きていないが、しばらく様子を見て行きたいと思う。ここで注意!まさかこれと同じ事をやってみようという物好きな方はいないと思うけど、もし追試 してみるとしても、この記事はまだ 実験レベルなのでその点を考慮してください。尚、このページだけ読んでも何の事かわからないと思います。そんな時はトップページに戻ってTira-2.1の導入USB -IOを使ってみる libusb編を読んでいただくと理解が深まると思います。

■ ハード概要とその制御について



簡単にハードとその動作について説明します。
右側に見える基板が赤外線で4個のリレーのON-OFFをコントロールできるユニットです。その出力はAC100VをON-OFFするようになっていま す。真ん中に見えるヒートシンクが付いた基板が三端子レギュレーターを使用した9V出力の基板です。これは各ユニットの動作用の電源です。
左側には電源トランスとUSB-An基板が取り付けてあります。
原理はいたって簡単です。
リレー基板でON-OFF時に発生する5Vの電圧をUSB-IO基板で検出してその結果をもとに学習リモコンにより、リレーをON-OFFする信号を発信 させようというものです。
具体的には、現在稼働している録画サーバーに接続している外部チューナーは今までは電源を常時ONのままにしておいて運用していました。
それを節電のため監視して録画していない場合は電源をOFFしようというものです。
正面には赤外線受光部の穴とUSB-IOのコネクターが見えます。背面 にはソリッドステートリレー付きのコンセントが2個、通常のリレーでコントロールする2個のコンセント、電源供給用のコネクター、制御部用のヒューズホル ダー、供給側のヒューズホルダーが見えます。
現在試用中の制御スクリプト

$ cat CHECK-REC-OFF-SH

--------------------------------------------------------------------------

#!/bin/sh

###### USB-IO測定 ######

vout=`/usr/local/bin/usban | grep Port0 | awk '{print $3}' | sed 's/V//g'

###### 録画中検出 ######

bef=`ls -l -t /var/video/*.nuv  | sed -n '1,1p' | grep /\2 | awk '{print $5}'`
←たぶん外部入力の録画ファイル名リスト

sleep 5

aft=`ls -l -t /var/video/*.nuv  | sed -n '1,1p' | grep /\2 | awk '{print $5}'`
←5秒待って再度リストを取る

sa=`echo $aft $bef | awk '{print $1-$2 }'`
←ここで差異が出れば録画中と判断
    echo ""
    echo "# 変数 sa 5秒前後のファイルの容量差 #"
    echo $sa
    echo ""

###### ファイルの大きさ比較 ######

### 録画していない ###

if [ $sa -eq 0 ]; then
   ookisa=`echo 0`

### 録画中 ###

else
    ookisa=`echo 1`
fi
    echo "# 変数 ookisa ファイルの更新の有無 #"
    echo $ookisa
    echo ""

###### Tira-2.1操作 ######

if [ $ookisa -eq 0 -a $vout -gt 3.0 ]; then
←ファイル更新の有無とUSB-IOの出力で判断
    echo ""
    echo "電源-OFF"
    echo ""
    /usr/local/bin/transfer.pl /usr/local/bin/tira2code/ext-14ch-on
←電源ボックスのOFFの信号を発射
    sleep 5
elif [ $ookisa -eq 1 -a $vout -lt 3.0 ]; then

    #/usr/local/bin/transfer.pl /usr/local/bin/tira2code/ext-14ch-on
    echo ""
    echo "録画-START"
    echo ""
else
    echo ""
    echo "待機中"
    echo ""
fi
done

--------------------------------------------------------------------------

# cat ch-chg-usb

--------------------------------------------------------------------------

#!/usr/bin/php

<?php
$chan_data = "/usr/local/bin/tira2code";

$cmd = "/home/hoge/HDH3/ON-OFF/bs-on.sh";
exec($cmd);

if ($argc < 2) exit;

# IOキャプチャでの不具合対応
#$cmd = "/usr/bin/ivtvctl -d /dev/video0 --set-input=7";
#exec($cmd);
#$cmd = "/usr/bin/ivtvctl -d /dev/video0 --set-input=8";
#exec($cmd);

# tira用
for ($i = 0; $i < mb_strlen($argv[1]); $i++) {
$ch = mb_substr($argv[1], $i, 1);
$cmd = "/usr/local/bin/transfer.pl $chan_data/c" . $ch;
exec($cmd);
}

?>
これもまた、出来てしまえばなんだそんな事だったのね...なのですが疲れました...if文の後ろのテストコマンドで二つの変数を 比較することができるはずなのでわざわざ awk を使って差を取る必要はないと思うのですが、なぜか安定しなかったのでそうしてあります。(原因わかる方教えていただければうれしいです。)
このスクリプトで残念な点は録画予定のデータベースにアクセスしていないので、もし録画開始の時に失敗した場合のフィードバックがかからない事と実力がな いのでデーモン化して作れない事の2点です。
いよいよ動作テストを行います。まずルート権限でコマンドを実行します。次にmythtvを起動して録画をスタートしてみます。すると録画-STARTに切り替わります。このスクリプトは自宅システムにて時間 をかけてテストします。
# CHECK-REC-OFF-SH
待機中
待機中
待機中
録画-START
待機中
待機中
ここで録画停止してみると電源-OFFになりコンセントボックスの電源 が切れます。まだすべての場合についての切り分けテストを終えていませんがここまでは成功のようです。
待機中
待機中
録画中
録画中
録画

電源-OFF
待機中
今後の展開としてUSB-Anは4ch入力が可能なので他の機器につい ても制御してみたいと思います。今、考えているのはプリンターの電源の制御です。たとえば、電源を入れてから10分以内にlprコマンドが実行されなけ れば 電源が切れる等です。USB-IO,Tira-2.1,の組み合わせの応用範囲はアイデア次第で大きく広がると思います。
参考資料:4chの 測定プログラムの例(伊藤氏ドライバー使用の場合

!/bin/sh

### USB-IO測定 ####

#初期化
echo 111111111111 >/dev/usbio0

#An0読取設定
echo 001111111111 >/dev/usbio0
#An0読取 桁交換 10進数へ変換
vout0=`head -1 /dev/usbio0 | sed 's/0/-0/g' | sed 's/1/-1/g' | sed 's/^-//g' | sed 's/-/ /g'| \
       awk '{print ($5*2^9+$6*2^8+$7*2^7+$8*2^6+$9*2^5+$10*2^4+$11*2^3+$12*2^2+$3*2^1+$4*2^0)*5/1024}'`
echo $vout0

#An1読取設定
echo 011111111111 >/dev/usbio0
#An1読取 桁交換 10進数へ変換
vout1=`head -1 /dev/usbio0 | sed 's/0/-0/g' | sed 's/1/-1/g' | sed 's/^-//g' | sed 's/-/ /g'| \
      awk '{print ($5*2^9+$6*2^8+$7*2^7+$8*2^6+$9*2^5+$10*2^4+$11*2^3+$12*2^2+$3*2^1+$4*2^0)*5/1024}'`
echo $vout1

#An2読取設定
echo 101111111111 >/dev/usbio0
#An1読取 桁交換 10進数へ変換
vout2=`head -1 /dev/usbio0 | sed 's/0/-0/g' | sed 's/1/-1/g' | sed 's/^-//g' | sed 's/-/ /g'| \
      awk '{print ($5*2^9+$6*2^8+$7*2^7+$8*2^6+$9*2^5+$10*2^4+$11*2^3+$12*2^2+$3*2^1+$4*2^0)*5/1024}'`
echo $vout2

#An3読取設定
echo 111111111111 >/dev/usbio0
#An1読取 桁交換 10進数へ変換
vout3=`head -1 /dev/usbio0 | sed 's/0/-0/g' | sed 's/1/-1/g' | sed 's/^-//g' | sed 's/-/ /g'| \
      awk '{print ($5*2^9+$6*2^8+$7*2^7+$8*2^6+$9*2^5+$10*2^4+$11*2^3+$12*2^2+$3*2^1+$4*2^0)*5/1024}'`
echo $vout3

最後にいつも暇な私なのでこのページで作成したハードが欲しい方があれ ば実費+αで作成します。まあ、こんなHPを読んでいる方はたぶん皆さん半田ゴテを握るような方ばかりだと思うのですが...

参考リンク
http://www.humblesoft.com/lj-pdf/200108-hardware.pdf

▲このページのトップへ戻る

▲トップへ戻 る





Copyright©2005-2006  熊の巣  All Right Reserved.  管理人へメール