ラズパイ3 + 専用 学習リモコン基板を使ってみます


Bit Trade Oneのラズベリー・パイ専用 学習リモコン基板

 

基板の構成

ラズパイから電力供給を受ける場合

リモコンコードを学習

学習記録を消去

単体で機能させる場合

カバーを作ってみる

Pythonで赤外線送信

 


基板の構成

 

:電源切替ジャンパピン

:赤外線受信(光)モジュール

:インジケータLED

:記憶/送信モード切替SW

:操作スィッチ

 

スィッチ番号 1 2 3 4 5 6 7 8 9 10
GPIO番号 4 17 27 18 5 6 13 12 22 23
PIN番号 7 11 13 12 29 31 33 32 15 16

 

 

TOP

 


ラズパイから電力供給を受ける場合

電源切替ジャンパピンはRasPi側にします(デフォルト)

 

 

通常の接続

Quimatディスプレイを付けた場合

GPIOのピンも使えるので、こんな風にセット

 

モード切替SWをCONTROL側にしてから電源投入(デフォルト)

インジケータLEDは最初赤のみ点滅しています。

 

TOP

 


リモコンコードを学習する

①モード切替SWをLEARN側にします

青のLEDが点灯します。

②記憶させる操作スィッチを押します

スィッチ側のLEDが一瞬赤く点滅

 

③受光モジュールに赤外線を送ります

緑のLEDが一瞬点滅します

④モード切替SWをCONTROL側に戻します

LEDは赤のみの点滅に戻ります。

⑤これで学習終了です。

操作スィッチを押して学習した赤外線コードで機器が動作するか確認します。

 

 

TOP

 


学習記録を消去する

①モード切替SWをLEARN側にします

②対象になる操作スィッチを押します(複数連続して押しても可)

③何もせずにモード切替SWをCONTROL側に戻します

④これで記録は消去されます

 

TOP

 


単体で機能させる場合

電源切替ジャンパピンはUSB側にします

MicroUSBケーブルで電力供給を受けます。

赤いLEDが点滅します。

この状態でもリモコンコードを学習することはできます。

操作スィッチを押せば学習済のコードで機器を動かせます。

TOP

 


カバーを作ってみます

こういう部品むきだし状態の製品ですが、スペーサーが同梱されているので、なんか不安という向きは透明アクリルや塩ビ板かなんかで天板を作ってかぶせてもいいかもしれません。

操作場所は爪先やピンセットが入る程度に開けておきましょう。

ナットは付いてきませんが、M2.6のをホームセンターなどで入手しましょう。

こんな感じ。

 

TOP

 


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

TOP


 

【ircommand.py】

#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】

#!/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の場合があります。

 

再度取得してみましょう。

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*