電子工作 33 – リモコンで動作するトライアック調光器の製作

 

 

 

概要

  今回は電子工作31と32を組み合わせてリモコンで動作する調光器の製作を試みた。電子工作31のトライアックを使った調光器では2個のスイッチでAC100Vの出力を昇降できた。一方、電子工作32では2個のリモコンのキーに反応して対応する2個のLEDをそれぞれ点灯させることができた。

 

今回の製作での要点は以下の2つである。

1) 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 – 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の小型ファンの風量の制御に使ってみる。

 

 

Menu Pageへ戻る    

Topへ戻る