電子工作 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抵抗が、家庭用換気扇を駆動させようとしたら焼損した。抵抗を新しいものに換えても同じなので、他の部品も破損してしまったようだ。このようにいろんな事が起こる。メーカーが訴えられないような商品を世に出すのが如何に大変か良く分かる。

 

  

 Menu Pageへ戻る    

Topへ戻る