MPCMeter-ビデオの視聴の進行状況の表示。 Arduino + JavaScript

導入する代わりに



現在の私の匿名habramedicumに感謝( pro mini )。 彼はそれをどうするかを長い間ためらいました。 彼は手を振って、さらに中国の小包を注文しました...

1か月後、「LEDを点滅させる」時間になりました;)。

アイデア



パッケージが旅行している間、私はそのようなことをすると思いました。 その結果、LEDを点滅させる以上のことをすることにしました。

アイデアは、何らかの種類のインジケータを使用してビデオの表示の進行状況を表示することです。



挑戦する



  1. 実行中の映画の統計を引き出す;
  2. データを処理してarduinoに転送します。
  3. インジケータに進行状況を表示します。


せっかちな結果をすぐに







実装



1. MPC


覚えている限り、常にPCにMedia PLayer Classicをインストールしています。 MPCは、たとえば、現在のセッションに関する統計情報を、次の内容を持つhtmlページの形式で提供できることがわかります。

HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>MPC-HC WebServer - Variables</title> <link rel="stylesheet" href="default.css"> <link rel="icon" href="favicon.ico"> </head> <body> <!--[if lt IE 8]> <div class="browser-warning"><strong>Warning!</strong> You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</div> <![endif]--> <p id="filepatharg">D:%5cFILMS%5cIts.Always.Sunny.in.Philadelphia.S10E10.720p.WEB.rus.LostFilm.TV.mp4</p> <p id="filepath">D:\FILMS\Its.Always.Sunny.in.Philadelphia.S10E10.720p.WEB.rus.LostFilm.TV.mp4</p> <p id="filedirarg">D:%5cFILMS</p> <p id="filedir">D:\FILMS</p> <p id="state">1</p> <p id="statestring"></p> <p id="position">1069384</p> <p id="positionstring">00:17:49</p> <p id="duration">1255210</p> <p id="durationstring">00:20:55</p> <p id="volumelevel">75</p> <p id="muted">0</p> <p id="playbackrate">1</p> <p id="reloadtime">0</p> </body> </html>
      
      







彼からそのような機能を取得するには、設定の「 リッスンポート 」チェックボックスをチェックする必要があります

設定




最も重要なのはタグです。

 <p id=""></p>
      
      





それらを分解して正しいものを選択するだけです。

2. NodeJS


NodeJSを使用してページをソートします。 ちなみに、このページはlocalhost :13580 / variables.html(設定からのポート)で利用できます。

すべてのロジックは3つのブロックに分割できます。



さらなるハイライト。 プロジェクト全体とコードを見ることができます 画像 github

リトルjs
ネイティブのhttp.getとpromiseの助けを借りて、私たちのページに戻ります

 main.prototype.get = function(){ var that = this return new Promise(function(done){ http.get(that.mpc_uri, function(res) { res.on('data', function (chunk) { that.mpc_obj.parse(chunk) done(that.mpc_obj.get()); }); }).on('error', function(e) { done(e.message); }); }) }
      
      





mpc_objオブジェクトの解析メソッドを使用して、受信したデータを解析します

 MPC_obj.prototype.parse = function(data){ var obj = {} data.toString().split('\n').forEach(function(line){ //  ,       if (match=/\<p/.test(line)){ var name2 = line.match(/id\=\"(\w+)\"/)[1] if (!obj.hasOwnProperty(name2)) obj[name2]=line.substring(line.indexOf('>')+1,line.lastIndexOf('<')) } }) this.settings=obj; }
      
      





出力には、このようなオブジェクトがあります

 { filepatharg: 'D:%5cmbrr555.avi', filepath: 'D:\\mbrr555.avi', filedirarg: 'D:%5c', filedir: 'D:\\', state: '1', statestring: '', position: '1023', positionstring: '00:00:01', duration: '114906', durationstring: '00:01:54', volumelevel: '77', muted: '0', playbackrate: '1', reloadtime: '0' }
      
      





Arduinoのデータの準備

 //    MPC_obj.prototype.getProgress = function(){ return (this.settings["position"]/this.settings["duration"]).toFixed(5) } //     (PWM) 1,0 -> 255 MPC_obj.prototype.PWM = function(){ return (this.getProgress()*255).toFixed(0) }
      
      





Arduinoとの通信は、com-portでのデータ交換を通じて行われます。 comでの作業では、ライブラリを選択しました 画像 ノードシリアルポート

それとポートcom5に接続し、速度を設定します

 var SerialPort = require('serialport').SerialPort; var serialPort = new SerialPort("COM5", { baudrate: 57600 }, false);
      
      





ポートを開き、arduinoが尋ねるたびに進捗状況を送信します

 serialPort.open(function (error) { if ( error ) { console.log('failed to open: '+error); } else { console.log('open'); //   arduino serialPort.on('data', function(data) { main.init(function(a){ //     serialPort.write(a); }); }); } });
      
      







3. Arduino


今鉄。 arduinoのデータを準備しましたが、今度は同じ適応を決定します。 進行状況を表示するために、この非常に安価な電圧計モジュールを選択し、少し「色付け」しました



もう少し
蓋が保持されていることがわかります...粘着テープで、簡単に取り外すことができます



さて、サイズといくつかの新しいパネル





Arduinoでは、フィルムの進行状況に関するデータを送信し、マイクロコントローラーの一方のレッグの電圧を比例的に変化させます。 概略図(セッションの終了時に点滅するLEDの存在;))



次に、マイクロコントローラをプログラムします。

inByte変数では、com-port経由で受信したデータを読み取ります。 3番目のピンのLED、および9番目の電圧計に取り付けます。 以前とまったく同じ速度を設定します。 ループは無限ループです。 100ミリ秒ごとに、抽象データSerial.print( 'A')をポートに送信します。 Serial.available()> 0の回答を待っています。MPCがPCおよび進行状況を返すnodeJSアプリケーションで実行されている場合、analogWrite(3、5)の3番目のピンのLEDをわずかに強調表示し、analogWriteの進行値を電圧計の9番目のピン(9、 inByte)。 analogWrite関数は、0から255までの値を渡します。この場合、0Vから5Vに対応します。 ここでは、 PWM(PWM)について読む必要があります-それはすべて彼のおかげです。

映画の半分を見ると、その時点で255/2 = analogWrite(9、127)は電圧計の2.5Vに対応し、9番目のピンに送信されます。 フィルムが完成するとすぐに、LEDで軽く点滅します;)

 int inByte = 0; void setup() { pinMode(9, OUTPUT); pinMode(3, OUTPUT); analogWrite(3, 0); analogWrite(9, 0); Serial.begin(57600); } void loop() { Serial.print('A'); delay(100); if (Serial.available() > 0) { analogWrite(3, 5); inByte = Serial.parseInt(); analogWrite(9, inByte); if (inByte==255) analogWrite(3, 255); } }
      
      





それがすべてブレッドボード上でライブに見える方法です



はい、そしてビデオで;)



ちなみに、このプロジェクトでは、その非常にハブラダーアモロサからのプレゼントだけを使用しました。

PS。

Attiny13が近くにあります。時間が経つと、すべてを転送しようとします。

参照:



どこかで完全なナンセンスを書いたり、間違いを犯した場合-教えてください、正しい;)。 ご清聴ありがとうございました。



All Articles