センサ・シリーズ 温度①確度±0.1℃ TMP117 その4 アラートでリレー駆動
温度センサTMP117で温度を測定し、上限温度を設定し、超えるとアラート信号ALRTをLowにするプログラムを作りました。そのALRT信号を利用して、前回LEDを点灯しました。
ここでは、リレーを駆動します。
使用環境
|
●リレーはマイコンから直接駆動しない
リレーは、大きく分けて、
- 機械式
- 半導体方式
の2種類があります。機械式は、リレーの接点に交流もしくは直流のどちらでもつなげられるので重宝します。駆動はコイル(ソレノイド)なので、ある程度の電流を流さないと反応しません。
したがって、マイコンとリレーの間には、トランジスタもしくはフォト・カプラをはさみます。
半導体方式は、マイコンと直接つなげられます。寿命も長いという特徴があります。しかし、出力の接点側は、交流用、直流用、交流/直流両用の決まった種類があるので、用途に合わせて選択します。
omron G3MB-202P
- 入力 DC5V
- 出力 AC100~240V、2A、ゼロクロス機能あり
omron G3DZ-2R6PL
- 入力 DC5V
- 出力 DC5~100V、AC5~240V、0.6A
omron G3FD-X03SN-VD
- 入力 DC5~24V
- 出力 DC48V、3A
●コンパクトなリレーを用意
プリント基板上で利用しやすい秋月電子通商の
ドライバ内蔵リレーモジュールキット[AE-G5V-DRV] 通販コード K-13573
を利用します。トランジスタのよるドライブ回路が内蔵されています。2V以上のHigh信号を入力端子SIGに入れると、リレーがONします。
- リレー接点容量:1A(24VDC)
- 電源:5V 約30mA
- 制御信号電圧範囲:0~5V(約2V以上でリレーON)
●実際に駆動する
上記のキットのリレーは、最大で、交流125Vac-0.5Aもしくは直流24Vdc-1Aという負荷がつなげます。ここでは、1WのLEDをつなぎます。ブレッドボード上でAC100Vを使うと、抜けたりしたときに回りに被害が及ぶので、DCの負荷の実験に利用します。
配線です。白色LEDの順方向電圧Vfは3Vです。電池は006Pの9Vを使います。LEDはデータシートでは350mA流せます。したがって、電流制限抵抗は、
(9 - 3) / 0.3 = 20 [Ω]
近い抵抗値の22Ωを使います。消費電力は、
0.3 * 0.3 * 22 = 1.98 [W]
なので、3Wもしくは5Wの中くらいの抵抗を使います。
●プログラム
割り込みだけを生かします。ポーリングは使いません。31℃以上になったら割り込みがかかり、callback_alert(ALRT_pin)関数へ処理が写ります。関数の先頭で、
gpio.output(ALRT_LED_pin, True) # リレー ON
リレーをONさせると、1WのLEDが点灯します。温度が31℃以上である限り、ONのままです。本体のwhileループ内で、温度が31℃以下になったら、OFFさせます。
import RPi.GPIO as gpio from time import sleep import smbus bus = smbus.SMBus(1) tmp117_addr = 0x48 TemperatureRegister = 0x00 ConfigurationRegister = 0x01 THigh_LimitRegister = 0x02 High_Limit_temp_dec = 31 High_Limit_temp_list = [0x0f, 0x80] ALRT_pin = 4 # 7pin ALRT_LED_pin = 17 # 11pin def sign16(x): return (-(x & 0b1000000000000000) | (x & 0b0111111111111111)) def callback_alert(ALRT_pin): gpio.output(ALRT_LED_pin, True) # リレー ON print('at High temp') bus.read_i2c_block_data(tmp117_addr, ConfigurationRegister, 2) # clear alert flag gpio.setmode(gpio.BCM) gpio.setup(ALRT_pin, gpio.IN, pull_up_down=gpio.PUD_UP) gpio.add_event_detect(ALRT_pin, gpio.FALLING, callback=callback_alert, bouncetime=1) gpio.setup(ALRT_LED_pin, gpio.OUT) gpio.output(ALRT_LED_pin, False) # set Low print('reset') bus.write_i2c_block_data(tmp117_addr, ConfigurationRegister, [0x00, 0x02]) # soft reset sleep(1) kakunin0 = bus.read_i2c_block_data(tmp117_addr, ConfigurationRegister, 2) print("ConfigurationRegister is %s %s" % (bin(kakunin0[0]), bin(kakunin0[1]))) bus.write_i2c_block_data(tmp117_addr, ConfigurationRegister, [0x02, 0x60]) kakunin1 = bus.read_i2c_block_data(tmp117_addr, ConfigurationRegister, 2) print("ConfigurationRegister is %s %s" % (bin(kakunin1[0]), bin(kakunin1[1]))) sleep(0.5) bus.write_i2c_block_data(tmp117_addr, THigh_LimitRegister, High_Limit_temp_list) kakunin2 = bus.read_i2c_block_data(tmp117_addr, THigh_LimitRegister, 2) print("THigh_LimitRegister is %s %s" % (hex(kakunin2[0]), hex(kakunin2[1]))) temp = kakunin2[0] <<8 | kakunin2[1] temperature = sign16(temp) * 0.0078125 print(' setting High temp Limit %s' % temperature) sleep(5) try: while 1: data = bus.read_i2c_block_data(tmp117_addr, TemperatureRegister, 2) # tempの読み出し temp = data[0] << 8 | data[1] temperature = sign16(temp) * 0.0078125 print("\nTemp is %.5f `C" % temperature) if temperature < High_Limit_temp_dec: gpio.output(ALRT_LED_pin, False) # 上限温度以下ならリレーをOFF sleep(1) except KeyboardInterrupt: print('\n end') gpio.cleanup() |
●ラズパイの立ち上がり時の挙動
リレーと1WのLEDをつないだ状態で、ラズパイの電源を入れました。立ち上がるまでの間、リレーは動作しませんでした。今回利用したGPIO17だけが、不用意にHighにならないのかどうかは不明です。プログラムを動かす前に勝手にリレーがONになる場合、リレーの電源は別途用意し、ラズパイの起動が終わった後に電源を入れるという手順が必要です。