電子工作 33 – リモコンで動作するトライアック調光器の製作
概要
今回は電子工作31と32を組み合わせてリモコンで動作する調光器の製作を試みた。電子工作31のトライアックを使った調光器では2個のスイッチでAC100Vの出力を昇降できた。一方、電子工作32では2個のリモコンのキーに反応して対応する2個のLEDをそれぞれ点灯させることができた。
今回の製作での要点は以下の2つである。
1) 2つのハードウエアをどう組み合わせるか。
2) それに合うソフトウエアを元の電子工作32のソフトウエアを余り変えずに作成する。
回路図
下に示すように、わずかに2本の線(左側の上下に走る太線)でリモコン信号受信回路をトライアック調光器の回路と結合するだけで目的を達成できることが分かった。この回路ではAC100Vの出力の昇降をリモコン信号によって出来るようになったほか、UP/DOWN スイッチによるコントロール機能もそのまま温存できた。
写真の左側ボードがリモコン信号受信部で、右側がトライアック調光器を載せたボード。2つのボード間は2本の電源線と2本の信号線(上記回路図の太線に相当)で結ばれている。
プログラム
先ず、トライアック調光器側の12F675に入っているプログラム(DimmerIn2.bas、電子工作31参照、この部分2009.1.21に訂正)には何の変更も必要ない。
トライアック調光器側のGP4とGP5をHighの状態からGroundに落とすことによってAC出力の昇降が可能になる。したがって、信号線(回路図の太線)でつないだリモコン信号受信側のGP0とGP1がリモコン (電子工作32で使ったリモコン) の”電源”や”テレビ/ビデオ”キーからの信号を受け取った時、Highの状態(通常)からLowの状態に変化するようにする必要がある。つまり、LED1とLED2が通常時点灯していて、各キーを押した時のみ消灯するようにプログラムを作成しないといけない。これは電子工作32のプログラム(IRrecTD.bas)を少し変えれば可能になる。
具体的には、電子工作32のプログラムを下の2か所で変更した。
その部分は太字で示した。
1) *** Main Program *** から下方向に数えて14 - 15行目を以下のように変える。
Low
LED1 --> High LED1
Low LED2 --> High LED2
2) *** プログラムの終わり *** から上方向に数えて2 – 9行目を以下のように変える。
LED1ON:
High LED1 --> Low LED1
Pause
100 --> Pause 200
Goto
Loop
LED2ON:
High LED2 --> Low LED2
Pause
100 --> Pause 200
Goto Loop
改変したリモコン信号受信側のプログラム IRrecTDtriac.bas を下に示す。
‘************************ 'プログラミング備忘録 ****************************
‘Name of Program: IRrecTDtriac.bas Works well !
'This program was obtained by slightly modifying IRrecTD.bas to interface with Dimmer Circuit of Project 31.
‘2009.1.8
'*********************** Pin connection **********************
'12F629, 4MHz Internal Clock used
'Pin 1: Vdd (5.0V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0: output - connected to LED1
'Pin 6: GPIO.1: output - connected to LED2
'Pin 3: GPIO.4: input - connected to IR Receiver module
'Pin 4: GPIO.3: input - connected to MCLR via 10K resistor
'*********************** Main program ***********************
CMCON=7 'Comparator off
TRISIO=%011000 'all except GP3 and GP4 are outputs.
PlsWidth var word ’16-bit 値 #大きいリーダーパルスの幅の値を一時保存
PlsW300 var word ’16-bit 値 #3.3 ms パルスの幅の値を一時保存
PlsW var word ’16-bit 値 #0.7 msまたは 0,25 ms パルスの幅の値を一時保存
Code var word ’16-bit 値 #合成Code値を一時保存
Code1 var word ’16-bit 値 #合成Code1値を一時保存
LED1 var GPIO.0
LED2 var GPIO.1
Loop:
Code=0
Code1=0
Clear 'Clear the content of all variables -
Essential!
High LED1
High LED2
PlsWidth=0
Pulsin GPIO.4,1,PlsWidth 'Read the long leader pulse width at H level #GP4より取り入れたHレベル(+5V)のパルスの幅を変数PlsWidthに保存せよ、という意味
If (4200<PlsWidth) AND (4500>PlsWidth) then ‘Read the pulse with 39-40 ms #大きいリーダーパルスの検知
Pulsin GPIO.4,1,PlsW300 'Read the pulse with 3.3 ms #パルスの幅の読み込み
If (300<PlsW300) and (400>PlsW300) then #3.3 ms パルスの検知
Goto Countpls
Else
Goto Loop
Endif
Else
Goto Loop
Endif
Countpls: 'Formation of Code and Code1 #以下では “0”と“1”のパルスの並びを1個1づつ読んで16-bit値と8-bit値を合成する
'Checking Bit0 - 0-15 (16 bits) Power TV/Video
Pulsin GPIO.4,1,PlsW 'Read 24 working pulses Key Key
If 150>PlsW then Code.bit0=0 '0 is a small pulse (0.7 ms) 0 0 #16-bit値の最初の0.7 msパルスの検知 150>PlsWなら Codeの0-bit目を0とせよ
If 150<PlsW then Code.bit0=1 '1 is a large pulse (2.5 ms) #16-bit値の最初の0,25 ms パルスの検知 150<PlsWなら Codeの0-bit目を1とせよ
'Checking Bit1
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit1=0 '0 0
If 150<PlsW then Code.bit1=1
'Checking Bit2
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit2=0 '0 0
If 150<PlsW then Code.bit2=1
'Checking Bit3
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit3=0
If 150<PlsW then Code.bit3=1 '1 1
'Checking Bit4
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit4=0 '0 0
If 150<PlsW then Code.bit4=1
'Checking Bit5
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit5=0
If 150<PlsW then Code.bit5=1 '1 1
'Checking Bit6
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit6=0 '0 0
If 150<PlsW then Code.bit6=1
'Checking Bit7
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit7=0 '0 0
If 150<PlsW then Code.bit7=1
'Checking Bit8
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit8=0 '0 0
If 150<PlsW then Code.bit8=1
'Checking Bit9
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit9=0 '0 0
If 150<PlsW then Code.bit9=1
'Checking Bit10
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit10=0 '0 0
If 150<PlsW then Code.bit10=1
'Checking Bit11
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit11=0
If 150<PlsW then Code.bit11=1 '1 0
'Checking Bit12
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit12=0
If 150<PlsW then Code.bit12=1 '1 1
'Checking Bit13
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit13=0
If 150<PlsW then Code.bit13=1 '1 1
'Checking Bit14
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit14=0
If 150<PlsW then Code.bit14=1 '1 1
'Checking Bit15
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code.bit15=0 '0 0 #16-bit値の最後の0.7 msパルスの検知
If 150<PlsW then Code.bit15=1 #16-bit値の最後の0,25 ms パルスの検知
'Code=30760 in first 16 bits =%0111100000101000 (Power Key) #“電源”キーならこの値になる
'Code=28712 =%0111000000101000 (TV/Video Key) #“テレビ/ビデオ”キーならこの値になる
'Checking Bit16 - 16-23 (8 bits)
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code1.bit0=0 #8-bit値の最初の0.7 msパルスの検知 150>PlsWなら Code1の0-bit目を0とせよ
If 150<PlsW then Code1.bit0=1 '1 1 #8-bit値の最初の0,25 ms パルスの検知 150<PlsWなら Code1の0-bit目を1とせよ
'Checking Bit17
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code1.bit1=0 '0 0
If 150<PlsW then Code1.bit1=1
'Checking Bit18
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code1.bit2=0
If 150<PlsW then Code1.bit2=1 '1 1
'Checking Bit19
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code1.bit3=0
If 150<PlsW then Code1.bit3=1 '1 1
'Checking Bit20
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code1.bit4=0
If 150<PlsW then Code1.bit4=1 '1 1
'Checking Bit21
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code1.bit5=0
If 150<PlsW then Code1.bit5=1 '1 1
'Checking Bit22
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code1.bit6=0
If 150<PlsW then Code1.bit6=1 '1 1
'Checking Bit23
Pulsin GPIO.4,1,PlsW
If 150>PlsW then Code1.bit7=0 '0 1 #8-bit値の最後の0.7 msパルスの検知
If 150<PlsW then Code1.bit7=1 #8-bit値の最後の0,25 ms パルスの検知
'Code1=125 in last 8 bits =%01111101 (Power Key) #“電源”キーならこの値になる
'Code1=253 =%11111101 (TV/Video Key) #“テレビ/ビデオ”キーならこの値になる
Pause 20
If (Code=30760) and (Code1=125) then LED1ON ‘パルスを読んで合成したCodeとCode1の値が、理論値30760と125に一致したときLED1を消灯させる
If (Code=28712) and (Code1=253) then LED2ON ‘パルスを読んで合成したCodeとCode1の値が、理論値28712と253に一致したときLED2を消灯させる
Goto Loop
LED1ON:
Low LED1 '0.2 ms 毎にLED1を消灯させる
Pause 200 ‘この値を大きくするとAC出力の変化が速くなるが、細かい調整は出来なくなる
Goto Loop
LED2ON:
Low LED2 '0.2 ms 毎にLED2を消灯させる
Pause 200
Goto Loop
End
'*************** プログラムの終わり ******************
'Note:
'AKI Programmer's configurations:
'FOSC – INTOSC (GP4:I/O); WDTE - Enable; PWRTE - Enable
'MCLR – MCLRpin, BODEN - Enable; CD - Disable; CDP – Disable
動作
1) リモコンの“電源”キーを押すとAC100V出力は降下する.。
2) ”テレビ/ビデオ”キーを押すとAC100V出力は上昇する。
3) 出力電圧の昇降はプログラム内部でスキャンしているので段階的 (stepwise) である。
4) 2つのキー操作で最大出力から最少出力(またはその逆)まで変化させるのに13秒ほどかかる。
結論・余談
汎用リモコンでトライアック調光器をコントロールすることが可能になった。
トライアック調光器で12F675を使っているが12F629でもOK。当時それしか手元に無かったから使用した。
実用機の製作 (2009.1.21)
下に完成した実用機を示す。 100円ショップで購入したプラスチックのバスケット(17.2 x 26.8 x 9 cm)に収納した。製作の途中1つ問題が発生した。それはIR 受信モジュールがAC100Vライン(トライアック、ホトトライアック、電線、トランスなど)に近いと、それらからのノイズ(10または20msのAC100V関連のもの)によって正常に動作しなくなることである。そこでIR 受信モジュール部を15cm位の電線でボードから離したところ正常に動作するようになった。写真で左手上部の三色の3本線がそれで、先端部のモジュールがボードの上部で浮いている。右手に明かりが消灯からフル点灯まで完璧に制御できる白熱電球が見える。8−10メートルの距離からリモコンに機敏に応答することが確認された。 差し当たり、ちょっと問題のあるAC100Vの小型ファンの風量の制御に使ってみる。