(USB接続の装置をいろいろ自作して)自動化が難しい作業を自動化する

Last-modified: 2019-12-26 (木) 11:49:31

(2016-8-25:検索ワードを教えて頂けませんか)
どなたか、このページに辿り着いた際の検索キーワードを教えて下さい。
どんな内容を充実させるべきなのかの参考にしたいです。
本ページの最下部に書き込める場所があります。


初出 2016-3-15
最終更新 2019-12-24
HDMI(ゲーム)レコーダーAvermedia ER130はステータスLEDの色や点滅速度で内部の状態を表示します。
無音の動画です(18秒)。
&flash(https://www.youtube.com/v/tOXdS1X-KDk,480x360);

これを以下に示すように、いろいろ特別な装置を取り付けることで普通は人間でなければおこなえないような複雑な作業(この場合は録画して、USBメモリを抜き挿しして、ファイルをパソコンに取り込む等)を自動化してしまおうというプロジェクトです。

 

ただし、本ページではAvermedia ER130を題材にしていますが、単なる一例です。赤外線リモコンやBluetoothで操作してUSBメモリに動画や録音やログを溜めるタイプの機器は様々あります。そのような機器なら本ページの手法がかなり応用できるでしょう。その他にも実験等で撮影等、定型作業に面倒さを感じている方等は本ページを参考にしていろいろトライしてみて頂きたいと思います。
因みに本ページの例の場合、仮にHDCPが解除できて且つパソコンから操作できるチューナーを追加すれば、パソコンにMP4でファイルを貯めることのできるテレビレコーダーを作成することができます。
本ページのやり方とFlashAirやEyefiが一見競合すると見えるかもしれません。本ページの手法の方が圧倒的に速いという特徴もありますが、私としては「機器をきちんと操作する」という特徴を活かしてそれらとは全く異なる分野で応用して頂きたいと考えています。

 

aggressive-automation_1_s.jpg
クリックすると大きな画像で表示されます

 

&flash(https://www.youtube.com/v/JsnfsLhQCqU,640x480);
環境音のような音があります(64秒)。

 

システムは以下の様々なモジュールの組み合わせで構成されます。

 
 

USB経由でPCから操作できるUSB切替器

USB経由でPCから操作できるUSB切替器・リレー基板

aggressive-automation_2_s.jpgaggressive-automation_3_s.jpg
クリックすると大きな画像で表示されます
こんなオープンな配線でUSB2.0のスピードが出るのか心配になるでしょう。マスストレージクラスのデバイスのみでの検証ですが、限界のスピードがちゃんと出ますし、もちろんデータ化けも起きていません。

USB経由でPCから操作できるUSB切替器・リレー基板・回路図

usb-switcher_relay-board_circt_s.png
クリックすると大きな画像で表示されます
実体配線と回路図では見た目に少し乖離がありますが、回路図どおりに作成しています。
USB2.0スイッチ専用のTC7USB42FTもありますが、それは入手性が低いし、ユニバーサル基板では電気的なメリットも消えてしまうし、今回の場合は汎用を狙ってVBUS電源をリレーで切り替えることが前提だったので、データ線もリレーで切り替える方式を採用しました。上述のように速度も問題なく出ています。もちろんUSB3.0でこんな手法が採れないのは言うまでもありません。

 

ダウンロード fileUSB_Switcher_circt.zip

USB経由でPCから操作できるUSB切替器・USBインターフェース基板

aggressive-automation_4_s.jpgaggressive-automation_5_s.jpg
クリックすると大きな画像で表示されます。

  • 4連のグリーンのLEDは冒頭の全景の写真では薄型のLEDに交換済みです。
  • USB経由で命令を受けて、4つのデジタルポートを時間差をつけて順番にONからOFFもしくはOFFからONに切り替えることだけが役目です。
  • この作例ではAVRのV-USB基板を採用していますが、単純な役目ですから好みに合わせて適宜変更して下さい。
  • この基板は28ピンのATmegaチップを採用し、USB通信にPD2,PD4を使用するV-USBのデフォルトの回路ほぼそのものです。ICSP回路も含めてメッキ線のみで配線したので、今後またV-USB回路を作成する際はこれを踏襲しようと思っています。

USB経由でPCから操作できるUSB切替器・USBインターフェース基板・ファームウェア

上述のようにこのハードである必然性はあまりないんですが、もちろん一応、現状のファームウェアを公開しておきます。

 

普通は多くのOSでインボックスドライバで動作させられるHIDデバイスにするところだとは思いますが、どうせ当分Linux限定で使うのだからと、私の好みで今回のファームウェアはPowerSwitchをベースとしています。ただし回路の方はV-USBの標準基板のものになっていますので、それに合わせて使用チップ、使用ポート等を変更しています。

 

とりあえず修正したファイルだけをアップします。そのうち一纏めにする可能性もあります。
ダウンロード filePowerSwitch.2012-12-08.USB_Switcher.firmware.main.c
ダウンロード filePowerSwitch.2012-12-08.USB_Switcher.firmware.usbconfig.h
ダウンロード filePowerSwitch.2012-12-08.USB_Switcher.firmware.Makefile
ライセンスはGPL2です。

 

本来は4つのデジタルポートを時間差をつけて駆動する部分はファームウェア側に実装するべきですが、(試行が簡単だからと)テンポラリーにPC側に実装してしまい、未だそのままになっています。

USB経由でPCから操作できるUSB切替器・PC側ソフトウェア

上述のように、テンポラリーな(動作確認テスト時だけの)つもりでしたが、4つのデジタルポートに時間差をつけて駆動する機能を未だここに持たせてしまっています。

 

上述のようにPowerSwitchを使用しています。
とりあえず修正したファイルだけをアップします。
ダウンロード filePowerSwitch.2012-12-08.USB_Switcher.commandline.powerSwitch.c
ライセンスはGPL2です。

USB接続ステータスLED読み取り器

USB接続ステータスLED読み取り器・基板

aggressive-automation_6_s.jpg
クリックすると大きな画像で表示されます
中央の大きなLEDは、センサー部が読み取り対象のLEDの殆どを隠してしまうので、その代替となるLEDです。読み取り対象のLEDの色と点滅具合をほぼそのままコピー表示します。

USB接続ステータスLED読み取り器・回路図

led-status-reader_circt_s.png
クリックすると大きな画像で表示されます

 

6ピンヘッダの部分は(1)3.3V(2)S11059-02DTのSDA(3)S11059-02DTのSCL(4)GND(5)TPS615コレクタ(6)TPS615エミッタ
です。

 

ダウンロード fileLED_Reader_circt.zip

USB接続ステータスLED読み取り器・センサー部

aggressive-automation_7_s.jpg
ベースは秋月で販売されているI2C対応デジタルカラーセンサモジュール S11059-02DTです。
基板に孔が開いていますが、ここには明暗検知のみを受け持つフォトトランジスタTPS615を取り付けています。
カラーセンサ受光部とフォトトランジスタとを出来るだけ近づけて設置する必要があるためにこんな構造にしています。

 

取り付けは当初このページの例のように板で覆おうと考えましたが、面倒なので結局グルーで貼り付けた上で、黒テープを貼った養生テープで光漏れを防ぐという安易な処理に落ち着いています。剥がしたいときに無理なく剥がせるようにグルーは片側だけに盛っています。

USB接続ステータスLED読み取り器・ファームウェア

当初PIC18F14K50の1チップ構成で試行してみましたが、その構成だと代替LEDの動作に時々どうしても不具合が生じてしまいました。カラーセンサーとのI2C通信に時間をとられすぎることが原因です。なのでカラーセンサーとの通信は8ピンチップPIC12F1822に任せることにしました。

 

メインチップPIC18F14K50用
Microchip MLAの「HID - Custom Demos」をベースにしています。
とりあえず修正したファイルだけをアップします。
ご存知の方はご存知だと思いますが、このチップはMLAに含まれるHIDBootloaderを書き込めばライタレスでUSB経由でファームウェアを書き換えることができます。
ダウンロード filemicrochip_solutions_v2013-06-15.USB.Device-HID-Custom_Demos.Firmware.main(LED_Reader).c  2016-4-17更新(はしてない)(前回の修正でもやっぱり駄目だったので結局高速点滅時はデバッグ出力しないように修正し、その後は長くうまく動いています。でも本来はジャンパをセットした時だけデバッグ出力をおこなう仕様を採るべきです。) 2016-3-28更新(ウォッチドッグタイマーを再度無効にしました。僅か一日で再びハングし、ウォッチドッグタイマーが役に立たないケースであることが判明しました。別の解決策として極短時間の点滅を(代替LEDの点滅処理に使用する以外の用途では)無視する間隔を30msから50msに変更しました。因みにハングは必ず監視対象LEDの高速点滅時に起きています) 2016-3-27更新(ウォッチドッグタイマーを有効にしました(3週間ぐらい頻繁に使用して一度だけハングしたので。デバッグ出力がハングの原因だとはわかっていますが、これぐらいに頻度ならデバッグ出力有効のままでいいかと思います)。)
常に115200bpsでデバッグ出力しています。
ダウンロード filemicrochip_solutions_v2013-06-15.USB.Device-HID-Custom_Demos.Firmware.usb_descriptors(LED_Reader).c

 

ビルドするにはMPLAB C18が必要です。
☆MPLAB C18コンパイラーの最終版 v3.47評価版(無料)がダウンロードできるURL
http://ww1.microchip.com/downloads/en/DeviceDoc/mplabc18-v3.47-windows-eval-installer.exe
☆MPLAB IDE の最終版 v8.92(無料)がダウンロードできるURL
http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_IDE_8_92.zip

 

XC8でなくC18を採用しているのは、現状のMicrochipのXC8用のサンプルコードがUSB通信とユーザ定義の割り込みの両立を許さない形式になっているからです。

 

サブチップPIC12F1822用
こちらはXC8用です。
XC8でS11059-02DTと通信する例は他からは入手できないものかもしれません。
(C18でS11059-02DTと通信するソースも持ってます。要望があれば掲げます)
ダウンロード file12f1822_color_identifier.c
(ジャンパをセットされた時のみ9600bpsでデバッグ出力します。)
割り込み機能を使ってないのでハードウェアI2C機能を持ってないPIC12F683に置き換えることもできる筈です(ピン4のプルアップ追加は必要)。

USB接続ステータスLED読み取り器・PC側ソフトウェア

多分他では採ってない手法だと思うんですが、Qtのコマンドラインアプリです。コマンドラインアプリ化するのはシェルスクリプトから使いやすくする為です。

$ ./led_reader

で{None,Slow,Fast}のいずれかと{Blank,Green,Red,Orange}のいずれかを組み合わせた文字列を戻します。exitcodeでなく文字列で戻すのもシェルスクリプトから使いやすくする為です。

 

具体的なところを少し示すと、ER130では録画終了時「FastRed」が暫く続くので、USBメモリ(もしくはHDD等)を取り外す命令を送るには、「FastRed」が「NoneGreen」になるまで待つ必要があります。また取り外し命令を送った後、実際に取り外すには「SlowGreen」になるまで待つ必要があります。また録画中は「SlowRed」です。これらの判定にこのUSB接続ステータスLED読み取り器を用います。

 

Microchip MLAにはQtのGUIアプリサンプルがあるので、それをベースにしています。修正箇所を辿っていくと多分理由がわかりにくい修正があるかと思いますが、そこは多分CUI化に合わせ、1回の問い合わせで確実に答えを戻すように修正した箇所だと思います。

 

Linux(x64 Linux, ラズパイLinux)でしか動作確認をとっていませんが、QtなのでWindowsやMacでも動作させることは難しくないと思います。HIDクラスなのでドライバの問題はありません。

 

ダウンロード fileLED_Reader_Client.zip
私が試した限りではHIDPAIの方はLinuxではqmakeで作成されたMakefileに手動で-I/usr/include/libusb-1.0を追加する必要があり、LED_Readerの方はラズパイLinuxでは-lrtを手動で追加する必要がありました。他のOSでも適宜必要な修正を加えて下さい。あとラズパイLinuxではsetuidする(つまりroot権限を与える)必要がありました。

USB接続赤外線リモコン

写真に写っているUSB接続赤外線リモコンのハードは自作したものですが、事実上、これから受信(学習)機能を省いたようなもので、互換性があります。
Low Pin Count USB Development Kitとも互換性があります。これを適当に簡略化して赤外線LEDを追加しただけとも言えます。

 

ファームウェアは別サイトに私がアップしてあるこれです。
この中のシリアルインターフェース版ファームウェアをPIDだけ変更して使っています。
このファームウェアをリビルドするには上述と同じくMPLAB C18が必要です。

 

シリアルインターフェースにしているのはあくまで私の好みで、デフォルトのHIDインターフェースの方が駄目なわけではありません。むしろラズベリーパイLinuxなんかの場合はHIDインターフェースの方が必須です。加えて言えばシリアルインターフェースには接続後の最初のコールが無視されるという欠陥もあったりします(なので/etc/rc.localに無視されるコールをわざと既述して悪影響を消しています。)。HIDインターフェースの場合はbto_ir_cmdを使うのが標準と言えるでしょう。

 

シリアルインターフェースなのでインターフェースを間違わないようにudevでリンクを張っています。udevルールの定義ファイルの中身はこんな感じです。
ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="000b", ATTRS{product}=="Serial-RemoconServant", MODE="0660", GROUP="owner", SYMLINK+="Serial-ER130-BtoUsbIrRemocon"

 

私は既に互換性のある学習機能を持つデバイスを他に持っているので今回学習機能を省きましたが、皆さんはそうじゃないと思うので学習機能のもつデバイスを自作するか購入して下さい。ただし私の手元に持っているデバイスについては私が既に学習済みなので新たに学習する必要はありません。
ダウンロード fileer130-remocon.sh ER130を赤外線命令で操作するスクリプト

 

他のページにTVチューナーTSTB-R50を赤外線で操作するスクリプトを掲載しているのでそのリンクも載せておきます。
ダウンロード channel-setSerial.sh
これらのスクリプトにはビット・トレード・ワンのUSB接続赤外線リモコンのフォーマットで、学習結果を内包しています。

上述の機器群を制御するスクリプト群

ダウンロード etc_init.d_devmon 自動マウント時に任意のスクリプトを呼び出すdevmonデーモンの起動用ファイル
ダウンロード fileetc_conf.d_devmon.sample2 devmonデーモンの設定ファイル
ダウンロード fileauto-ER130-move.sh devmonデーモンから呼び出されるスクリプト (2019-12-24更新)
ダウンロード fileER130-move.sh auto…から呼び出される子スクリプト (2019-12-24更新)
ダウンロード fileer130-ctl.sh 内部でステータスLEDを読み取ったり、赤外線リモコン命令を送信したりしてER130を操作するスクリプト(直前の処理の時間が可変で、ステータスLEDを読み取る必要があるケースで使用する) (2019-12-24更新)

 

2019年12月24日追加
ダウンロード fileafter-dubbing.sh TSTB-R50に録画済みの番組をER130を介してPC側にダビングするスクリプト
ダウンロード fileer130-interval-shot.sh 15秒ごとに番組をの画像だけをキャプチャーするスクリプト
ダウンロード filedubb-stop.sh after-dubbing.sh --stoponlyオプションのラッパー
ダウンロード fileer130-restore.sh auto-ER130-move.shののPC側アンマウント処理を切り出したもの

 

ここに掲げたスクリプトと、USB経由でPCから操作できるUSB切替器のコマンドと、USB接続ステータスLED読み取り器のコマンドを駆使すると最終的にアプリケーションになります。

 

簡単な、仮定に基づく具体例
ここでの仮定は「もしHDCP解除機能を持ったHDMIスプリッターをもっていたら」ということです。
さらにTVチューナーを追加すると原始的なTVレコーダーが構築できることになります。
たとえばcronに以下のように登録すると定期的な番組録画がおこなえます。

# 報道ステーション(9時54分開始です)
53 21 * * 1-5 /home/owner/bin/prepare-BStv.sh G 6 > /dev/null 2>&1
53 21 * * 1-5 sleep 53.3;/home/owner/bin/er130-ctl.sh rec_on
06 23 * * 1-5 export PATH=$PATH:/home/owner/bin;sleep 0.8; (実際には改行しない)
er130-ctl.sh rec_off && er130-ctl.sh menu && sleep 4 && (実際には改行しない)
er130-remocon.sh f1 && er130-ctl.sh usb_switch_port2

3行目の既述は、録画を終了し、USBメモリ(HDD)を取り外し、USB切替器のポートを切り替える処理です。この後は上掲のauto-ER130-move.shが、再びUSB切替器のポートを切り替えるまでの処理をおこないます。

 

この例では過度に作りこまず、生のコマンドで用が足りるところは生のコマンドのまま既述し、ステータスLEDの読み取り処理は必要な箇所のみに留めています。

 

上記のprepare-BStv.shという名のスクリプトはここではTVチューナーを操作するスクリプトです。
ここにアップしておきます。
ダウンロード fileprepare-BStv.sh
この中で呼び出しているchannel-setSerial.shは他ページにアップしていますのでそのリンクも載せておきます。
ダウンロード channel-setSerial.sh

 

これをもっと本格的な??レコーダーに仕立てるなら、epgrec UNAというソフトを、ローレベルな部分を自分で修正した上で導入すべきなのですが、今のところその気はありません。

 

ご要望、ご意見、質問を下のフォームにどうぞ
(でもここより、掲示板書き込みフォームのページに書いて頂いた方が気づき易いと思います。)

  • キーボード切替機 自作 -- 2016-09-05 (月) 19:32:54
  • 「usb hid 自作」で見つかりました -- 2017-05-31 (水) 08:29:44
  • 「flashair 学習リモコン」で見つかりました -- 2017-08-22 (火) 22:40:55
  • USBセレクター リレー -- 2018-04-13 (金) 07:37:16
  • usb リレー 自作 でたどりつきました -- 検索君? 2018-10-31 (水) 11:00:53
  • usb リレー制御 自作 です。ACのコントロースのため -- ドンゴロス? 2019-10-06 (日) 15:14:54