はじめに
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'