ADRSIRでNECのLEDシーリングライトを操作する
/ 3 min read
Table of Contents
はじめに
BitTradeOne の ADRSIR を購入したので、色々とリモコンを記憶させて遊んでいます。
ソニーの TV やパナソニックのエアコンはうまく行ったのですが、NEC の LED シーリングライトはなぜかそのままでは動いてくれませんでした。
そこで色々とググってみると、どうやら ADRSIR の周波数 38khz が原因だったようで、これよりも小さい周波数でサンプリングしないとだめみたいです。
というわけで、任意の周波数に変換するプログラムを書いてみました。(といっても 38000 で割り戻して任意の周波数をかけただけ)
これで良いのかわかりませんが、私の機種だと 37.0khz ~ 37.2khz ぐらいに変換すると動作しました。それでも何故か全灯ボタンは数回に一回しか成功しないので、5 回くらい連続で命令することでカバーしています。
方法
import math
def split\_string(string, n): """n桁ずつ区切ったリストを作成する""" lst = [string[i: i+n] for i in range(0, len(string), n)] return lst
def right(string, n): """右からn文字取り出す""" return string[-n:]
def left(string, n): """左からn文字取り出す""" return string[:n]
def convert\_hz(code, hz): """ Args: code(str): 変換したいコード hz(int): 変換したい周波数 Return: converted\_code(str): 周波数変換後のコード """ lst = split_string(code, 4) # 4桁ずつに区切る
new_lst = [] for l in lst: tmp = right(l, 2) + left(l, 2) # リトルエンディアンの戻し tmp = int(tmp, 16) # 16進数を10進数に変換 tmp = math.floor(tmp / 38000 * hz) # 周波数の変換(少数点以下切捨て) tmp = format(tmp, 'X') # 10進数を16進数に戻す tmp = tmp.zfill(4) # 4桁にゼロパディング tmp = right(tmp, 2) + left(tmp, 2) # リトルエンディアン new_lst.append(tmp)
converted_code = ''.join(new_lst) return converted_code
使い方
# ADRSIRでサンプリングしたコードcode = '123456789ABCDEF'
res = convert_hz(code, 37000) # 37khzに変換した結果を出力# output: 'B3322B75A3B78EE9'