要旨

 iTunesをPC外部から操作する方法に関する記事。USB対応PICマイコンPIC18F14K50と赤外線リモコン、自作Windowsアプリケーションを組み合わせた方法を実験し操作することができた。


背景と目的

 iTunesはPC上で操作することが多いが、PCと音楽を聴く場所が離れている場合などにはPCの外部から操作したいことがある。それにはiPhoneアプリのremoteが便利だ。同一のLANでつながれたPCであれば操作できる。しかし、それは当然ながらiPhone/iPodユーザーしか使用できない。そこで、iPhone/iPodユーザー以外でもPC外部からiTunesを操作できないかと考えてみたところ、PICマイコンを用いて操作するシステムが構築できそうなことに気づいた。そこで、実際にシステムを検討し操作してみたい。


詳細
1.システム構成

 図1は今回考案したシステム構成である。これは赤外線リモコンと毎度おなじみUSB対応マイコンPIC18F14K50、およびiTunes操作用自作PCアプリケーションを用いている。原理としては、まずユーザーが赤外線リモコンを操作すると赤外線信号を受信した受光モジュールの出力信号がPICのRC4ポートに入力され、PICがUSBにてPCへ受信信号の内容を伝える。そしてそれを受けたPC上のアプリケーションは受信内容に応じてiTunesに操作コマンドを送信するという仕組みである。

VBE3
図1.1 iTunesをPC外部から操作するためのシステム構成案

2.システムの作製
2.1 赤外線リモコンと受光モジュール

 赤外線リモコンは、オーディオプレーヤーの操作ということを考え手持ちのAVアンプであるSC-LX73(Pioneer)のリモコンを使用することにした。また、赤外線受光モジュールは、PL-IRM0101-3を用いる。これは秋月電子などで100円程度で手に入る。なお、SC-LX73のリモコンコードはどうやらNECフォーマット相当のようなので、PICの解析プログラムはNECフォーマットにあわせて書けばよいことがわかった。

2.2 赤外線受光モジュールの出力をPICで0/1パターンに変換

 PICで赤外線リモコンの受信信号を解析する場合には、通常受信コードを8ビットごとに変数に格納することが多いが今回は最終的な制御対象がPCであることからPICでいちいち処理せずPC側に任せてしまえばよい。そこで、受信した信号の1/0だけを判断してそのつどシリアルに文字列として1/0を送信するようなプログラムにした。プログラムは詳しくは載せないが、簡単に構成を述べると、タイマ割り込みによってNECフォーマットの最小時間単位0.56msのおよそ1/5の周期でタイマ割り込みを行い、1⇒0または0⇒1に変化するタイミングをよみとり1/0パターンを解析した。

2.3 PICからPCへの受信内容の送信/PCでの受信方法

 PICとPC間の通信は、毎度おなじみUSBによる仮想シリアル通信を用い、2.2で解析した1/0のパターンを送信する。なおPICからのシリアル送信については本ブログでは何度も取り上げているので、ここでは割愛する。一方、PC側のシリアルの受信であるが今回は自作アプリにて処理を記述する必要がある。今回はVB2008にてシリアルを受信するプログラムを記述し、正しくシリアルが受信できることを確認した。このPC側シリアル受信処理についても、Webの各所で取り上げられているので本ブログでは割愛する。

2.4 iTunes操作用自作アプリ

 今回のキモであるiTunesを別アプリから操作する部分は、iTunes Type Libraryというオブジェクトライブラリを使用することにした。具体的には、今回のアプリ開発環境であるVisual Basic 2008で図2.11のようにプロジェクト>参照の追加からiTunes Type Libraryにチェックを入れる。これにより、図2.12のように変数の型としてiTunesAppが参照できるようになりiTunesの画面上の操作は一通りプログラム上で扱えることになった。そこで、再生、一時停止、停止、トラック送り、トラック戻しのコマンドをそれぞれ以下のように書いてみた。そして、実際にiTunesがコマンドに反応して動作していることも確認できた。以上で、外部アプリケーションからiTunesを操作できるようになった。

    'iTunesをVB2008で操作するコマンドの例
    Private Sub iTunesCommandSample()

        Dim MyiTunes1 As New iTunesLib.iTunesApp

        MyiTunes1.Play() '再生
        MyiTunes1.Pause() '一時停止
        MyiTunes1.Stop() '停止
        MyiTunes1.NextTrack() 'トラック送り
        MyiTunes1.BackTrack() 'トラック戻し

    End Sub

VBE
図2.11 iTunes Type Libraryの参照

VBE2
図2.12 iTunesApp型オブジェクト変数を宣言

2.5 プログラム全体

 詳細説明は省くが、今回PC側アプリとして作成したコードを以下に示す。

Public Class Form1

    'iTunesAppオブジェクト
    Dim MyiTunes As New iTunesLib.iTunesApp

    'フォームのロード
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'シリアルポートのオープン
        SerialPort1.PortName = "COM9"
        'シリアルポートの通信速度指定
        SerialPort1.BaudRate = 19200
        'シリアルポートのパリティ指定
        SerialPort1.Parity = System.IO.Ports.Parity.None
        'シリアルポートのビット数指定
        SerialPort1.DataBits = 8
        'シリアルポートのストップビット指定
        SerialPort1.StopBits = System.IO.Ports.StopBits.One
        'シリアルポートのオープン
        SerialPort1.Open()

    End Sub

    'シリアルポートがデータを受信したら
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        Dim ir_code1 As String
        Dim ir_code2 As String
        Dim maker1 As Integer
        Dim maker2 As Integer
        Dim data1 As Integer
        Dim data2 As Integer

        '2回分の受信結果を得る(NECフォーマットでは同じコードを2回送るので)
        ir_code1 = SerialPort1.ReadLine()
        ir_code2 = SerialPort1.ReadLine()

        If ir_code1 = ir_code2 Then '2回の受信結果が同一か(NECフォーマットでは同じコードを2回送るので)
            If Mid(ir_code1, 1, 3) = "SLD" Then '先頭に"SLD"という文字列があるか(PIC送信側で先頭に"SLD"という文字列をつけているため)

                '0/1のパターンを分解
                maker1 = BinStr2Dec(Mid(ir_code1, 4, 8))
                maker2 = BinStr2Dec(Mid(ir_code1, 12, 8))
                data1 = BinStr2Dec(Mid(ir_code1, 20, 8))
                data2 = BinStr2Dec(Mid(ir_code1, 28, 8))

                'data1の内容で操作を決める
                Select Case data1
                    Case 232
                        MyiTunes.Play() '再生
                    Case 104
                        MyiTunes.Stop() '停止
                    Case 8
                        MyiTunes.NextTrack() 'トラック送り
                    Case 136
                        MyiTunes.BackTrack() 'トラック戻し
                End Select

            End If
        End If

    End Sub

    'フォームを閉じとき
    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed

        ' シリアルポートのクローズ
        SerialPort1.Close()

    End Sub

    'バイナリの文字列を10進数に直す
    Private Function BinStr2Dec(ByVal a_str As String) As Integer

        Dim len_str As Integer
        Dim buf As Integer = 0

        len_str = Len(a_str)

        For i As Integer = 1 To len_str
            If Mid(a_str, i, 1) = "1" Then
                buf = buf + 2 ^ (len_str - i)
            End If
        Next i

        BinStr2Dec = buf

    End Function

End Class

3.結果

 2.5のプログラムを起動し、赤外線受光モジュールに向けてリモコンの再生ボタンを押したところ、iTunesの再生が開始した。他のボタンについても同様に押してみたところ、正しくiTunesを操作することができた。これにより、赤外線リモコンを用いてPC外部よりiTunesが操作できることがわかった。


まとめと今後の課題

 USB対応PICマイコンPIC18F14K50と赤外線リモコン、自作Windowsアプリケーションを組み合わせ、iTunesをPC外部から操作するシステムを構築し、正しく操作することができた。