2017年1月21日土曜日

HTML による動画の連続再生(2)

2016年2月14日の記事、「Google ドライブに置いた動画の連続再生」をバージョンアップ した。登録した動画数が増えたため、好きなところから再生開始出来るようにしないと勝手が悪い。次の機能追加。
  1. スキップボタンの種類を増やす
  2. 再生画面サイズを3種類から選択
  3. 再生中のファイル名を表示する
  4. ランダム再生のチェックボックス
    いわゆる再生リストであり、「パソコンに付いてくるソフトでも済むこと」なので無くても困らないわけで、途中で何度もめげそうになった。

    1.スキップボタンに、5, 10, 20 を追加
    「クリックした行から再生開始」にしたかったが、難しそうだったのでこの方法にした。

    ↓スキップボタン毎にスキップ数を渡す
    <form>
    <input type="button" value="スキップ" onclick="NextVideo(1)">
    <input type="button" value="スキップ5" onclick="NextVideo(5)">
    <input type="button" value="スキップ10" onclick="NextVideo(10)">
    <input type="button" value="スキップ20" onclick="NextVideo(20)">
    </form>

    2.動画再生サイズを3種類から選択出来る
    ラジオボタンによる選択方法にしたかったが、簡単なボタン方式にした。

    ↓ボタンから画面サイズを指定する関数に値を渡す
    <form>
    <input type="button" value="640W"onclick="setWidth('640');">
    <input type="button" value="960W"onclick="setWidth('960');">
    <input type="button" value="1280W"onclick="setWidth('1280');">
    </form>

    ↓ 画面サイズの width を書き換える関数(id="Videoplay の width に $width を適用する)
    function setWidth( $width ) {
        var $elementReference = document.getElementById( "Videoplay" );
        $elementReference.width = $width;
    }

    3.再生中のファイル名を表示する
    ↓ id="VideoTitle"を書き換える(配列にファイル名が入っている)
    document.getElementById( "VideoTitle" ).innerHTML = mp4Array[n];

    4.ランダム再生
    ランダム再生は、再生開始時に調べて分岐すればOK
    ↓チェックボックスを調べる
    flagrand = document.getElementById("ds").checked;

    ↓ 乱数を返す関数を使う(ファイル名配列の要素数の間でランダムな数値を返す)
    function getRandomInt(max) {
      return Math.floor( Math.random() * (max - 1) );
    }

    結び
    前作は、ほぼコピペみたいなものだったが、「画像サイズを変える」機能が「該当する id の要素の属性を書き換える」と理解出来たことでステップアップ。ファイル名表示も同じ事。

    2017年1月11日水曜日

    Excel VBA で USB-SPI ブリッジを使う

    PCからSPI(Serial Peripheral Interface)を持つデバイスを制御する方法を検討した。
    過去にPIC側からのアプローチとして「PIC USB のまとめ」にあるように、今回も目的は同じ。今回は、安価なUSB-SPI ブリッジICを試し、実用に供したい。
    • SPIの先でシリアル-パラレル変換すれば入出力点数は自在
    • SPIの先にマイコンを挟めば、ADコンバータのサンプリング回数や間隔などマイコンに任せられる
    • システム構成上何らかの自前の回路を付加する必要があるなら、これを組み込んでしまえば安上がりになる
    • Excel VBAで制御したい
    • msオーダーのレスポンスが必要
    • 大量のデータを扱う必要は無い
    チップ実装済みの基板が各社から販売されている。デバイスとしては次の二つを選定。
    • Microchip MCP2210
      ・・・HIDデバイスとして認識するみたい/DLLから制御も可能
    • FTDI FT232H
      ・・・USBシリアル変換IC FT232の機能拡張版/各種方式の通信が可能

    FT232Hの実装された基板を購入し、まずVCPモードでループバックテストを試してみた。
    • VCPとは、Virtual COM Port(仮想COMポート,USB-RS232C変換ケーブルがそう)
    • デバイスマネージャーの、USB Serial Conveterのプロパティにて「VCPをロードする」にチェックが必要
    • ノートパソコン(Win8.1)は、Win32API シリアル通信テストで、USB-RS232C変換ケーブルでテストした事があったので、何もせずともループバックテストができた
    • デスクトップPC(Win10)の方は、FTDI D2XXをインストールした後、USBを抜き差しして使えるようになった。COM5に割り当てられた。

    モノが動くことは確認できたので、Excel VBA で制御するためのサンプルコードを探すも、
    • VBAのコードサンプルは皆無
    • FTDI のサイトに VB6 のサンプルコードは有り
    • VB6 のコードをExcel VBEに貼り付けて、コンパイルエラーを潰していく手順
    • MPSSE(Multi-Protocol Synchronous Serial Engine)というモードにすれば、SPIのみならず他の通信方式も使えるらしい
    • D2XXより上位と思われる LibMPSSE-SPI は使わない
    • 各社(まず和文の説明書から)の説明書をつなぎ合わせつつ、サンプルコードも二つ三つを見比べながら、自力でやってみた

    今回は、MPSSEモードにしてビットのオンオフを繰り返すところまでで終わり。繰り返したときの間隔、Sleep関数の精度を確かめてみた。
    • 単発の場合の、最少パルス幅は40~80us
    • 右波形は、Sleep(2)を挟んで30回繰り返し波形、一発目が12msかかっている
    • Sleep(15)の場合は、一発目から15msくらいになり、ほぼ均等に30発
    • Sleepの代わりにtimeGetTime関数を使っても似たような結果
    • やはり、15ms以下のタイマ(休止)はあてにならない
    FT232Hの使い方、移植の際の注意点などは別途、「要点整理」する。

    2017年1月10日火曜日

    画質の劣化原因は、スマホのレンズ保護シール


    • 写真の中心から離れた領域の画像がぼやけて写る(左画像)
    • 全身写真の場合、顔がぼけてしまう
    スマホの反射防止保護フィルムに付いていたおまけのレンズ保護シールをはがしてOK(右写真)
    寒くなって、変質した?