赤外線波形解析
(上級者向け)
このページでは irMagician を制御する方法について、実際のコードを提示します。自分でプログラムを書いた経験がある人が対象です。web-master のテスト環境は以下の通りです。
- MacBook Pro 13inch late 2013
- python 2.7.3 (ipython 2.0.0)
動作確認方法
- Windows
ipython が使える環境をご用意下さい。 - Macintosh
注意
MacOSx 10.4.1 以上 ではCDC-ACMのドライバが不調です。irMagician接続直後の下記コマンドの実行は出来ますが、実行後ターミナルに戻り再度実行しようとするとデバイスのハンドリングができなくなります。詳しくはこちらをご覧下さい。ターミナルを起動後、以下のコマンドを入力して下さい。
1>ls /dev/cu.*結果として、cu.usbmodem0121が表示されれば、irMagicianは利用可能です。
- Linux
CDC-ACM はカーネルドライバとして、設定してある場合が多いので、irMagicianをUSBに接続するとドライバも自動的にロードされます。
ターミナルを起動後、以下のコマンドを入力して下さい。1>ls /dev/usb*結果として、usbACM0が表示されれば、irMagicianは利用可能です。
以下のスクリプトはipython上で実行するスクリプトファイルになります。ipython の強力な解析機能により、収集した赤外線データの解析が簡単に行えます。>>> run file_name.ipyで実行します。
- 動作の流れ
以下に簡単な動作の流れを説明します。 - 信号のキャプチャとPCへの取り込み
赤外線信号をキャプチャして、そのデータをPCに送るまでの動作になります。キャプチャした信号はirMagician本体のメモリに取り込まれます。それをPC側へ転送(アップロード)する必要があります。- 初期化 (initSerial.ipy)
- 赤外線信号のキャプチャ (cap.ipy)
- 対象となる機器のリモコンから赤外線信号をirMagicianのセンサに向かって照射
- 赤外線信号の照射(play.ipy)
- 赤外線信号のアップロード (dataReadFromSerialGraph.ipy)
- 赤外線信号の表示
- 初期化
12345678910111213# -*- coding: utf-8 -*-import sysimport serialimport timeimport numpyimport pylab as plimport jsonFILEIN = 'sample_out.json'FILEOUT = 'sample_out.json'ser = serial.Serial("/dev/cu.usbmodem0121", 9600, timeout = 1)ser.readline()
- 実行方法
iptyhon 上から以下のように実行します。1>>> run init.ipy - 注意点
最後に ser.readline() を行い、irMagicianのシリアルバッファをクリアしておく必要があります。
- 実行方法
- 赤外線信号のキャプチャ(cap.ipy)
赤外線信号のキャプチャ(取り込み)を行います。12345# -*- coding: utf-8 -*-ser.write("c\r\n")time.sleep(1.0)print ser.readline()- 実行方法
iptyhon 上から以下のように実行します。1>>> run cap.ipy
- 実行方法
- 対象となる機器のリモコンから赤外線信号をirMagicianのセンサに向かって照射
c コマンド投入直後に、対象となる機器のリモコンから赤外線信号をirMagicianのセンサに向かって照射します。 - 赤外線信号の送出(play.ipy)
赤外線信号を対象となる機器に送出します。1234# -*- coding: utf-8 -*-ser.write("p\r\n")print ser.readline()- 実行方法
iptyhon 上から以下のように実行します。12>>>run play.ipy... done
先ほど、キャプチャした信号が動作するかを確認します。
- 実行方法
- 赤外線信号のアップロード (dataReadFromSerialGraph.ipy)
irMagician 本体に格納されている赤外線信号をホストに転送します。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647# -*- coding: utf-8 -*-distanceX = 0logicLevelTrue = logicLevelFalse = 0rawX = []postScale = 100x = []y = []ser.write("I,0\r\n")time.sleep(1.0)recNumberStr = ser.readline()recNumber = int(recNumberStr, 16)ser.write("I,5\r\n")time.sleep(1.0)postScaleStr = ser.readline()postScale = int(postScaleStr, 10)#for n in range(640):for n in range(recNumber):bank = n / 64pos = n % 64ser.write("b,%d\r\n" % bank)ser.readline()ser.write("d,%d\n\r" % pos)xStr = ser.read(3)xData = int(xStr, 16)rawX.append(xData)distanceX = distanceX + xDataprint '%02x ' % xData,if n % 2 == 0:logicLevelTrue = 100logicLevelFalse = 0else:logicLevelTrue = 0logicLevelFalse = 100x.append(distanceX)y.append(logicLevelTrue)x.append(distanceX)y.append(logicLevelFalse)print ""numpy.array(x)numpy.array(y) - 赤外線信号の表示
matplotlib により、アップロードされたデータの表示を行います。
- 赤外線データのsaveとload
キャプチャした赤外線データはjson形式でセーブされます。フォーマットは以下の通りです。123456{"postscale": 100,"freq": 38,"data": [5, 152, 75, 8, 27, 9, 27, 9, 27, 8, 8, 8, 8, 8, 27, 8, 27, 8, 28, 8, 8, 8, 8, 8, 27, 8, 28, 8, 8, 8, 8, 8, 8, 8, 9, 8, 27, 8, 27, 8, 8, 8, 28, 8, 8, 8, 8, 8, 8, 8, 28, 8, 8, 8, 8, 8, 27, 8, 8, 8, 27, 8, 27, 8, 27, 8, 8, 8, 23, 152, 37, 8, 69, 151, 37, 8],"format": "raw"}以上のデータは東芝のLED照明のリモコンの「シーンOn」のデータになります。
- セーブ
- FILEOUTに出力するファイル名を設定します。
1>>>FILEOUT="filename.json"
- セーブの実行
1>>> run save.ipy
- FILEOUTに出力するファイル名を設定します。
- ロード
- FILEINに出力するファイル名を設定します。
1>>>FILEIN="filename.json"
- ロードの実行
1>>> run load.ipy
- ロードスクリプト
1234567891011121314151617181920212223242526f = open(FILEIN, 'r')json_data = json.load(f)f.close()recNumber = len(json_data['data'])rawX = json_data['data']ser.write("n,%d\r\n" % recNumber)ser.readline()postScale = json_data['postscale']ser.write("k,%d\r\n" % postScale)time.sleep(1.0)ser.readline()for n in range(recNumber):bank = n / 64pos = n % 64ser.write("b,%d\r\n" % bank)ser.readline()ser.write("w,%d,%d\n\r" % (pos, rawX[n]))ser.readline()
- FILEINに出力するファイル名を設定します。
- セーブ