ArduinoとPythonを使用したVLCプレーヤーのリモートコントロール

こんにちは、読者の皆様。



私は長い間Arduinoに興味があり、この素晴らしいプラットフォームを購入することに決めました。 短い検索の後、私は小さなArduinoキットを購入しました。これには、とりわけIRセンサーとリモートコントロールが含まれていました。 マニュアルの例を勉強して、自分の何かを考え出す時だと気づきました。 最終的に、ArduinoとPython3の魔法を使用してVLCプレーヤーをリモートで制御することにしました。



Arduinoマジック


接続図とスケッチは、メーカーのウェブサイトからダウンロードしたArduinoキットのマニュアルから変更することなく、正直に撮影されています。







スケッチ
/* Arduino Advanced Kit example Project 11 - IRRemote * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 July, 2009 * Copyright 2009 Ken Shirriff * http://arcfn.com */ #include <IRremote.h> int RECV_PIN = 7; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value,HEX); // print received values irrecv.resume(); // Receive the next value } }
      
      







その結果、押されたキーのコードがポートモニターに届きます。 経験的に、異なるIRリモートが適切であることがわかりました。 これはよく知られた事実ですが、私にとっては新しいことでした。 しかし、それはもっと面白いです。 VLCメディアプレーヤーには、便利なWebベースのインターフェイスがあります。 また、次の形式の通常のhttp-getリクエストを使用して管理できます。



ホスト :port / page.html?Var = value&var2 = value2&...」



詳細については、 videolan.orgをご覧ください



Python3マジック


Python3とそのリッチライブラリを使用して、httpリクエストを送信したり、シリアルポートからデータを読み取ったりすることができます。 それは私の考えを実現するのに十分でした。 Python3スクリプトは、OOPアプローチを使用して記述されています。



簡単に言うと、スクリプトの動作は次のとおりです。



1. vlc_remote_contolクラスのインスタンスを作成し、Vlcプレーヤーのアドレス、キーコードのリスト、および仮想comポートの名前をコンストラクターに渡します。

2.キーコードがポートから読み取られるコントロールメソッドを呼び出します。

3.キーコードは__switch_buttonメソッドに渡されます。 ここで、__ commandメソッドは特定のパラメーターで呼び出されます

4. __commandはVLCプレーヤーに直接get要求を行います。



スクリプト
 import getpass import time import subprocess import requests import serial import sys import lxml.etree as etree class vlc_remote_contol: def __init__(self,hst,blist,pname): self.host = hst self.btn_list = blist self.port = serial.Serial(pname, 9600, timeout = 0) self.__sess = requests.Session() self.__sess.auth = ('',getpass.getpass()) self.old_vol = self.__get_param(self.__sess.get(self.host+'/requests/status.xml').text, 'volume') self.curr_vol = 0 def __get_param(self,info,param): beg = info.find('<'+param+'>')+len('<'+param+'>') end = info.find('</'+param+'>') return int(info[beg:end]) def __command (self,host,comm,val): if (val == ''): req = self.__sess.get(host+'/requests/status.xml'+'?'+'command='+comm) else: req = self.__sess.get(host+'/requests/status.xml'+'?'+'command='+comm+'&val='+val) req.close() def __switch_button(self,btn_code): if (btn_code == 'FFC23D'): ## play/pause self.__command(self.host,'pl_pause','') elif (btn_code == 'FF906F'): ## fullscreen self.__command(self.host,'fullscreen','') elif (btn_code == 'FFE01F'): ## volume down self.__command(self.host,'volume','-10') elif (btn_code == 'FFA857'): ## volume up self.__command(self.host,'volume','+10') elif (btn_code == 'FF22DD'): ## rewind back self.__command(self.host,'seek','-0.5%') elif (btn_code == 'FF02FD'): ## rewind forward self.__command(self.host,'seek','+0.5%') elif (btn_code == 'FFA25D'): ## previous track self.__command(self.host,'pl_previous','') elif (btn_code == 'FFE21D'): ## previous next self.__command(self.host,'pl_next','') elif (btn_code == 'FF6897'): ## mute self.cur_vol = self.__get_param(self.__sess.get(self.host+'/requests/status.xml').text, 'volume') if (self.cur_vol == 0): self.__command(self.host,'volume',str(self.old_vol)) else: self.old_vol = self.cur_vol self.__command(self.host,'volume','0') else: pass def control(self): print('Success') while True: res = self.port.readline().strip().decode("UTF-8") if (res in self.btn_list): self.__switch_button(res) def main(): conf = etree.parse('conf.xml') vpath = conf.xpath('/document/vpath/text()')[0] vhost = conf.xpath('/document/vhost/text()')[0] try: subprocess.Popen([vpath]) except: input('VLC player not found') return try: buttons0 = ['FFA25D','FF629D','FFE21D','FF22DD','FF02FD','FFC23D','FFE01F','FFA857','FF906F','FF6897', 'FF9867','FFB04F','FF30CF', 'FF18E7','FF7A85','FF10EF','FF38C7','FF5AA5','FF42BD','FF4AB5', 'FF52AD'] vrc = vlc_remote_contol(vhost,buttons0,"COM3") vrc.control() except: input("Connection or authorization error.") return if __name__ == "__main__" : main()
      
      









おわりに


私は、オリジナルで新しいものを思い付かなかったことを理解しています。 これは、大学での実験室作業とオリンピアードの問題の解決しかなかった、産業プログラミングの私の最初の経験です。 コミュニティからの建設的な批判と、スクリプトを改善するためのヒントを楽しみにしています。 これまでのところ、計画はconfig.xmlファイルにキーコードを追加することです。これは、他のリモート、および場合によってはシンプルなグラフィカルインターフェイスを使用することでした。



すべてのソースはGitHubで公開されています



All Articles