Bit Trade Oneのラズベリー・パイ専用 学習リモコン基板
基板の構成
1:電源切替ジャンパピン
2:赤外線受信(光)モジュール
3:インジケータLED
4:記憶/送信モード切替SW
5:操作スィッチ
ラズパイから電力供給を受ける場合
電源切替ジャンパピンはRasPi側にします(デフォルト)
通常の接続
Quimatディスプレイを付けた場合
GPIOのピンも使えるので、こんな風にセット
GPIOを全部は塞ぎたくない場合
以下のPIN番号をジャンパー線でつなぎます(この結線は出力のみです)。
PIN 2 –>5V
PIN3 –>GPIO2
PIN5 –> GPIO3
PIN9 –> GND
ちなみに
モード切替SWをCONTROL側にしてから電源投入(デフォルト)
インジケータLEDは最初赤のみ点滅しています。
リモコンコードを学習する
①モード切替SWをLEARN側にします
青のLEDが点灯します。
②記憶させる操作スィッチを押します
スィッチ側のLEDが一瞬赤く点滅
③受光モジュールに赤外線を送ります
緑のLEDが一瞬点滅します
④モード切替SWをCONTROL側に戻します
LEDは赤のみの点滅に戻ります。
⑤これで学習終了です。
操作スィッチを押して学習した赤外線コードで機器が動作するか確認します。
学習記録を消去する
①モード切替SWをLEARN側にします
②対象になる操作スィッチを押します(複数連続して押しても可)
③何もせずにモード切替SWをCONTROL側に戻します
④これで記録は消去されます
単体で機能させる場合
電源切替ジャンパピンはUSB側にします
MicroUSBケーブルで電力供給を受けます。
赤いLEDが点滅します。
この状態でもリモコンコードを学習することはできます。
操作スィッチを押せば学習済のコードで機器を動かせます。
カバーを作ってみます
こういう部品むきだし状態の製品ですが、スペーサーが同梱されているので、なんか不安という向きは透明アクリルや塩ビ板かなんかで天板を作ってかぶせてもいいかもしれません。
操作場所は爪先やピンセットが入る程度に開けておきましょう。
ナットは付いてきませんが、M2.6のをホームセンターなどで入手しましょう。
こんな感じ。
ちなみに、ラズパイの寸法はこちら(pi B+ , pi3 B+ , pi3 A+)
Pythonで赤外線送信
スィッチに記録したコードをそのまま使用する場合
こういう感じのディレクトリ構造にしておきます。
home/pi
+/adrsirlib
ircommand.py
ircommand.pyというPythonファイルを作って使ってみます。
スィッチ番号は1~10
$python3
>>>import adrsir-com as ir
スィッチ番号2の場合
>>>sw2 = ir.get(2)
>>>ir.send(sw2)
スィッチ番号3の場合
>>>sw3 = ir.get(3)
>>>ir.send(sw3)
スィッチに記録したコードをファイルとして保存して使用する場合
このやり方だと、スィッチの数は関係しません。
スィッチに記録したコードをすべて消去した状態でも使えます。
ir-comというPythonの実行ファイルを作って使ってみます。
こういう感じのディレクトリ構造にしておきます。
home/pi
+/adrsirlib
ir-com
+/irdata
スィッチに記録したコードをデータファイルとして保存
スィッチ番号は1~10
$cd ~/adrsirlib
$./ir-com store <スィッチ番号>:<データファイル名>
例
$./ir-com store 1:sw1.dat
$./ir-com store 2:sw2.dat 3:sw3.dat …..
コードを送信して機器を作動させる
$./ir-com send sw1.dat
【ircommand.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#coding: utf-8 import smbus ADDR = 0x52 R1_memo_no_write = 0x15 R2_data_num_read = 0x25 R3_data_read = 0x35 W2_data_num_write = 0x29 W3_data_write = 0x39 T1_trans_start = 0x59 bus = smbus.SMBus(1) def get(no): senddata = [no - 1] bus.write_i2c_block_data(ADDR, R1_memo_no_write, senddata) data = bus.read_i2c_block_data(ADDR, R2_data_num_read, 3) read_length = (data[1] << 8) + data[2] if read_length == 0xffff: return [] data = bus.read_i2c_block_data(ADDR, R3_data_read, 1) ir_data = [] for i in range(read_length): data = bus.read_i2c_block_data(ADDR, R3_data_read, 4) ir_data.extend(data) ir_str_data = '' for i in ir_data: ir_str_data += "{:02x}".format(i) return ir_str_data def send(ir_str_data): ir_data = [int(ir_str_data[i:i+2],16) for i in range(0,len(ir_str_data),2)] data_length = len(ir_data) senddata = [data_length >> 8, data_length & 0xff] bus.write_i2c_block_data(ADDR, W2_data_num_write, senddata) for i in range(0, data_length, 4): bus.write_i2c_block_data(ADDR, W3_data_write, ir_data[i:i+4]) bus.write_i2c_block_data(ADDR, T1_trans_start, [0] ) if __name__ == '__main__': str = get(0) print(str) send(str) |
【ir-com】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#!/usr/bin/python3 #coding: utf-8 import os import sys import smbus ADDR = 0x52 R1_memo_no_write = 0x15 R2_data_num_read = 0x25 R3_data_read = 0x35 W2_data_num_write = 0x29 W3_data_write = 0x39 T1_trans_start = 0x59 bus = smbus.SMBus(1) dir = "./irdata/" def ir_get(no): senddata = [no] bus.write_i2c_block_data(ADDR, R1_memo_no_write, senddata) data = bus.read_i2c_block_data(ADDR, R2_data_num_read, 3) read_length = (data[1] << 8) + data[2] if read_length == 0xffff: return [] data = bus.read_i2c_block_data(ADDR, R3_data_read, 1) ir_data = [] for i in range(read_length): data = bus.read_i2c_block_data(ADDR, R3_data_read, 4) ir_data.extend(data) ir_str_data = '' for i in ir_data: ir_str_data += "{:02x}".format(i) return ir_str_data def ir_send(ir_str_data): ir_data = [int(ir_str_data[i:i+2],16) for i in range(0,len(ir_str_data),2)] data_length = len(ir_data) senddata = [data_length >> 8, data_length & 0xff] bus.write_i2c_block_data(ADDR, W2_data_num_write, senddata) for i in range(0, data_length, 4): bus.write_i2c_block_data(ADDR, W3_data_write, ir_data[i:i+4]) bus.write_i2c_block_data(ADDR, T1_trans_start, [0] ) def read_to_file(no, filename): str = ir_get(no) with open(dir+filename, 'wt') as fout: fout.write(str) def send_from_file(filename): path = dir+filename if not os.path.isfile(path): print("Not exist.") return print(path) with open(path, 'rt') as fin: str = fin.read() ir_send(str) def display_list(): files = os.listdir(dir) if len(files) == 0: print ("ありません") else: for file in files: print (" * {}".format(file)) def store(list): for one in list: ones = one.split(':') if len(ones) != 2: print("Skip: {}".format(one)) continue no = ones[0] num = int(no) - 1 file = ones[1] if (not no.isdigit()) or num<0 or 9<num : print("Skip: {}".format(no)) continue read_to_file(num,file) def send(list): if len(list) != 1: print("Illegal options.") file = list[0] send_from_file(file) if __name__ == '__main__': if len(sys.argv) == 1: exit() command = sys.argv[1] if command == 'store': store(sys.argv[2:]) elif command == 'send': send(sys.argv[2:]) elif command == 'list': display_list() else: exit() |
データファイルの送信がうまくいかない時
●取得に失敗した場合、ファイルサイズは0バイト。
0バイトではない場合、ファイルをエディターで開いてみる。
先頭1バイト目が0の場合があります。
再度取得してみましょう。
●マニュアルで送信して、再度実行
リモコンコードを学習を参考に、何か適当に学習させて手動で送信してから、再度実行してみる。
Webブラウザーから制御する場合
「ラズパイ3のWeb インターフェースを作成」をご参照
スマートコンセントを使って外出先から家電の電源をON・OFFしてみる
ラズパイにAI推論実行用プロセッシング・ユニットを使ってみる
IoTプラットフォームをAIで賢くしてみる
学習リモコン ADVANCEについて
ADVANCEのコードは公開されていますが、最新のRaspbianでは何故かmakeしても実行できませんでした。
ただ別にC#のコードも公開されているので、これをコンソールアプリとしてビルドして、Raspbianには.NET CoreかMonoをインストールして使ってみる予定です。
Leave a Reply