電子工作 23 - 赤外線リモートコントロール事始4 – 1モーメンタリ、2ラッチAC100V出力スイッチング回路
概要
今回はまとめとして、送信側の3つのスイッチSW1、SW2、SW3を押すことによって、受信側の出力が次のようになる回路とプログラムを作成した。
1) SW1を押すと、受信側のAC100V出力用SSRがモーメンタリ動作をする(押してる間ON、放すとOFF)。(SSR – Solid State Relay)
2) SW2を押すと、受信側のAC100V出力用SSRがラッチ動作をする(1回目に押した時ONになり、2回目に押すとOFF、以下その繰返し)。
3) SW3を押すと、受信側のAC100V出力用SSRがラッチ動作をする。
テストの結果、この赤外線送受信装置は安定して動作することが分かった。
回路
下図に示す送信回路(赤外線パルス発生装置)は、前の電子工作22のものとほぼ同じである。一方、見にくいが、受信回路ではモーメンタリ動作をつくり出すために、もう1個の2F629を追加している(下の右写真で、2個の12F629の右側のもの)。モーメンタリ動作をつくり出す原理(プログラム)などについては、既に電子工作22の後半部分で述べた。下の左の写真は赤外線パルス発生装置で、ボードの左端に赤外線LEDが見える。単三の電池3本は下のケースに収納してある。右の写真は、実際に受信回路を実用目的に使うために組上げたものを示す。DC5V電源、12F629が2個、SW1-SW3に対応する表示用のLEDが3個、小さいボードに乗ったSSRが3個(大きさが違うが動作は同じ)、AC100V用の出力用差込み口が3個、一番右端に見える。赤外線受信モジュールは、左手の12F529の下に黒く見える。ここでは、AC100V電球がSW3のラッチ動作に反応して、点灯し続けている。
プログラム
送信プログラム: 'PulsinTx.bas (電子工作22の後半部分に記述、16ビットのデータ信号)
受信プログラム(1個目の12F629用): 'PulsnRt1.bas (電子工作22に既述のPulsinRy.basを改良して長さを約半分にした。同じデータ信号列を2回チェックしている)
'PulsnRt1.bas Shortened the code making routine by half using For n=1 To 2
‘Modified from PulsinR5.bas) - Works well!
'SW1 - GP0 - Momentary ON/OFF via 2nd 12F629
'SW2 - GP1 - Latch 1 ON/OFF
'SW3 - GP2 - Latch 2 ON/OFF
'************** Pin connection **********************
'12F629, 4MHz Internal Clock used
'Pin 1: Vdd (5.0V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0: output - connected to GP0 of 2nd 12F629 which is output to GP1 of 2nd 12F629, driving LED1
'Pin 6: GPIO.1: output - connected to LED2
'Pin 5: GPIO.2: output - connected to LED3
Pin 4: GPIO.3: input - Reset
'Pin 3: GPIO.4: input - connected to IR Receiver module
'*************** プログラム本体 ***********************
CMCON=7 'Comparator off
TRISIO=%0010000 'all except GP4 are outputs.
DEFINE OSCCAL_1K 1
Codelength var Byte
Code var word 'for 16-bit code formation
Code1 var word '7.16
Code2 var word '7.16
X var Byte
n var byte '7.25
Clear 'Content of all variables -> 0
Pause 500 'Settle down PIC & IR reciever module
GPIO.0=0
GPIO.1=0
GPIO.2=0
Startpulse:
GPIO.0=0 'for momentary SW1
n=0
For n=1 to 2 'Checking Pulse sequence twice (total 16 bits x 2)
'Code making routine
Pulsin GPIO.4,0,Codelength 'Measure low pulse (IR LED On time)
IF Codelength < 200 Then Startpulse 'Searching 3 ms pulse
IF Codelength > 300 Then Startpulse
'Codepulses
'Checking Bit0
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit0=1 '2 ms pulse is 1
IF Codelength < 100 Then Code.bit0=0 '1 ms pulse is 0
'Checking Bit1
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit1=1
IF Codelength < 100 Then Code.bit1=0
'Checking Bit2
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit2=1
IF Codelength < 100 Then Code.bit2=0
'Checking Bit3
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit3=1
IF Codelength < 100 Then Code.bit3=0
'Checking Bit4
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit4=1
IF Codelength < 100 Then Code.bit4=0
'Checking Bit5
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit5=1
IF Codelength < 100 Then Code.bit5=0
'Checking Bit6
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit6=1
IF Codelength < 100 Then Code.bit6=0
'Checking Bit7
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit7=1
IF Codelength < 100 Then Code.bit7=0
'Checking Bit8
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit8=1
IF Codelength < 100 Then Code.bit8=0
'Checking Bit9
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit9=1
IF Codelength < 100 Then Code.bit9=0
'Checking Bit10
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit10=1
IF Codelength < 100 Then Code.bit10=0
'Checking Bit11
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit11=1
IF Codelength < 100 Then Code.bit11=0
'Checking Bit12
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit12=1
IF Codelength < 100 Then Code.bit12=0
'Checking Bit13
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit13=1
IF Codelength < 100 Then Code.bit13=0
'Checking Bit14
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit14=1
IF Codelength < 100 Then Code.bit14=0
'Checking Bit15
Pulsin GPIO.4,0,Codelength
IF Codelength > 100 Then Code.bit15=1
IF Codelength < 100 Then Code.bit15=0
Code(n)=Code '7.16 Code(n), n=1 or 2 (1st or 2nd check)
'don't insert pause here
Next
'JUMPtoLED
Pause 20
IF Code(1)=1 AND Code(2)=1 Then LEDON1 '=%0000 0000 0000 0001
IF Code(1)=3 AND Code(2)=3 Then SWONOFF1 '=%0000 0000 0000 0011
IF Code(1)=7 AND Code(2)=7 Then SWONOFF2 '=%0000 0000 0000 0111
CLEAR
Goto Startpulse
LEDON1
High GPIO.0 'LED1 Momentary ON/OFF
Pause 500 'Shortened from 1000 7.25
Low GPIO.0
Goto Startpulse
SWONOFF1
Toggle GPIO.1 'LED2 Latch 1 ON/OFF
Pause 500
Goto Startpulse
SWONOFF2
Toggle GPIO.2 'LED3 Latch 2 ON/OFF
Pause 500
Goto Startpulse
'********** プログラムの終わり ***************
'Note:
'AKI Programmer's configurations:
'FOSC INTOSC (GP4:I/O); WDTE - Enable; PWRTE - Enable
'MCLR - Enable; BODEN - Enable; CD - Disable; CDP - Disable
受信プログラム(2個目の12F629用): 'PulsinRu.bas (完全モーメンタリ動作にするためプログラム)
'PulsinRu.bas 2007.7.18 Momentary output using a 2nd 12F629. Succeeded at last
'took 3 days to make this simple program.
'************** Pin connection **********************
'12F629, 4MHz Internal Clock used
'Pin 1: Vdd (5.0V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0: input from the GPIO.0 of 1st 12F629
'Pin 6: GPIO.1: output - connected to 2nd 12F629's LED1 via Tr1815
'*************** プログラム本体 ***********************
CMCON=7 'Comparator off
TRISIO=%000001
GPIO.1=0 'without this, LED sometimes turns ON when power is turned ON.
WaitpulseH:
IF GPIO.0=0 then WaitpulseH 'Wait H-pulse period
High GPIO.1 'Turn on LED connected to GPIO.1
Pause 800 'Space between 2 H-pulse periods; this was experimetally decided. この800msがモーメンタリ動作の要(かなめ)
'If it is <750ms, a small space (turned-off period of LED) is
'formed b/t 2 H-pulse periods. But 800 eliminates the space,
'realizing a real momentary switching action.
Low GPIO.1
goto WaitpulseH
'********** プログラムの終わり ***************
'Note:
'AKI Programmer's configurations:
'FOSC INTOSC (GP4:I/O); WDTE - Enable; PWRTE - Enable
'MCLR - Diable ; BODEN - Enable; CD - Disable; CDP - Disable
余談
ソフトでモーメンタリ動作出力がつくり出せる筈だが、考えつかず。代わりにもう1個の12F629(¥120)を追加し、プログラムでSW1を押している間は出力が“H”を保つように工夫して、何とか目的を達した。波形を見るオシロが無いと出来ない芸当。オシロ様様といったところ。いずれにしても、赤外線リモコン回路のプログラムがPicBasic Pro (変型BASIC言語?)だけを使っても何とか書けることが分かったこと、赤外線送受信の原理がかなり理解できたこと、それに、オシロを使って波形レベルで送受信の中身が見れたことは、大変有益だった。何でもやってみること、半田付けしてみること、大切だと実感した!
理由が不明だが、どうしても受信回路の図面を大きく表示できなかった(BSch V0.90使用)。
後で分かった問題
(2007.10.10)(2007.10.15)
SW1をモーメンタリ動作(SW1を押している間はAC出力がONを保ち、離すとOFF)をするように工夫した筈だが、実際は、SW1を押し続けると約10秒間毎に一瞬AC出力がOFFになる瞬間があることが分かった。プログラムに改良が必要である。
検出されたこのOFFの瞬間は決まって145ms前後であった。後日 (2007.10.15)、上記のプログラムPulsinRu.basを以下のように改良した。その結果、ほぼ問題が解決された。
‘PulsinRv.bas
(2007.10.15)
'***************
Main program ***********************
CMCON=7 'Comparator off
TRISIO=%000001
GPIO.1=0 'without this, LED sometimes turns ON
when power is turned ON.
WaitpulseH:
GPIO.1=0
IF
GPIO.0=0 then WaitpulseH 'Wait the
arrival of H-pulse period (about. 500 ms long)
High
GPIO.1 'Turn on LED connected to
GPIO.1
Pause
750 ‘in ms, this value was
experimentally decided.
goto
WaitpulseH
'**********
End of program ***************
'Note:
'AKI Programmer's configurations:
'FOSC INTOSC (GP4:I/O); WDTE - Enable; PWRTE - Enable
'MCLR - Internal; BODEN - Enable;
CD - Disable; CDP - Disable
また、SW3のラッチ動作に対応するSSR(Solid State Relay、AC100Vを駆動する)ユニットの100W抵抗が、家庭用換気扇を駆動させようとしたら焼損した。抵抗を新しいものに換えても同じなので、他の部品も破損してしまったようだ。このようにいろんな事が起こる。メーカーが訴えられないような商品を世に出すのが如何に大変か良く分かる。