電子工作 34 – HPWMの38KHz搬送波を使ってリモコンの赤外線パルスパターンを作成する試み [16F628A/12F683]

                          

 

 

概要

  Web上をさまよっているとリモコンに必要な38KHzの搬送波(carrier)を16F628AとPICBasic Proで発生させるプログラムを発見した。前に赤外線リモコンをいじくったので搬送波を安定的にかつ簡単に発生させる方法が気になっていた。この搬送波を基準に使いプログラムでリモコンの任意のキーに相当する赤外線パルスパターンを発生させる方法を検討してみた。

 

1)     16F628A に備わっているHardware PWM (pulse-width modulation、パルス幅変調)を使う。この機能は一度動作させると同じPICに同居する他のプログラムルーチンに影響されずに動作し続ける。実際、3個のLEDを次々と連続的に点灯させるルーチンをプログラムの中に同居させオシロで38KHzの出力波を見たところ全く影響を受けないことが分かった。

2)     以下の7行の記述で安定した38KHzのパルスをPB3 (CCP1, Pin 9) から発生させることが出来る。

 

CMCON=7

VRCON=0

TRISB=%11110110

PR2=25

CCPR1L=13

CCP1CON=%00001100

T2CON=%00000100

コンパレータ不使用

A/D 参考電圧不使用

PWM (RB3)を出力ポートに設定

PWM を 38KHzに設定

PWMのduty cycleを 50%に設定

PWMモードの選択(ON/OFF)

Timer2 ON + 1:1 プリスケーラ

                                                                                     (16F628A. 4MHz Internal)

動作原理

74HC08というANDゲートを使う。 16F628A のPB3 (Pin 9)からの38KHzの搬送波を1個のANDゲートの端子2に入力し、また、もう一方のANDゲート端子1にプログラムによって制御された信号をPB0 (Pin 6)より導入する。すると、このANDゲートの出力は2つの入力が両者とも “H” の時だけ “H'” なり、他のすべての組合せでは ”L” となる。つまり、出力の“H'” と “L” の状態と、その状態の長さ(時間)はプログラムで制御できる。この出力端子はIR-LEDに接続されている。

 

74HC08のANDゲートの真理値表

Input 1

Input 2

Output

L

H

L

H

L

L

L

L

L

H

H

H

 

 

回路図

  ボード上に以下のような回路を組んだ。2個のUP/DOWNスイッチが設けてあり、押すと“テレビ・ビデオ”/“電源”キー(リモコンFUNAI RC-7 電子工作32)のそれぞれの類似パルスパターン(後述のプログラムで作成した)がIR-LEDより発射される。これをIR receiver moduleで受信しその出力をオシロで観察した。また現在使用中のトライアック調光器(電子工作33)のIR受信部に発射して動作を検討した。

 

実験&結果

                    写真は実験の様子を示す。上部にIR-LEDとIR receiver moduleが見える。下方の2個のボタンのいずれかを押すとIR-LED

から赤外線パルスパターンが左方向に発射されてIR receiver moduleのみならず約10メートル先の現在使用中のトライアック調光器

(電子工作33)にまで到着しそれを動作させる。

 

16F628AのRB 3(CCP1,Pin 9)より出てくる実験に使った38KHzの搬送波である。大変安定していて波形もきれいである。

同居する他のプログラムルーチンに影響されない。

 

スイッチDOWN(”電源“キー相当)を押した時16F628AのPB0(Pin 6)より74HC08のPin1へ入るプログラムでつくったパルスパターン。

反転してしることに注意。

 

下は74HC08のPin3からIR-LEDへ入力された合成パルスパターン。ピークの電圧は1.3V程度で拡大して見るとかなり乱れた波形です。

 

 上のパルスパターンがIR receiver moduleに入ると、下のようなきれいなパルスパターンが出力される(実験ボード上の

IR receiver moduleの出力ピンで測定)。内蔵されているアンプなどが効いているのであろう。良く再現されていることが分かる。

反転していることにも注意。

実際、上のパルスパターンはリモコン(FUNAI RC-7、電子工作32)の“電源”キーを押した時に発生する下の様なパルスパターンを

モデルとして、各種のパルス幅を実際に測定し、それらと同じような幅や並びになるように後述のプログラムで作成したものである。 

両者は良く類似し上のパルスパターンは良く再現されていると言える。

 

同様にリモコンの“テレビ/ビデオ”キーを押すと下の様なパルスパターンが出力される。これを模したものを作成する部分も

プログラムに含めた(UPスイッチに対応、ただし作成された図はここでは省略)。

 

動作実験

 38KHzの搬送波を使いプログラムで作成した類似パルスパターンが正しく動作するかどうか実験した。すなわち作成した回路のIR-LEDから信号を発射し、約10メートル離れた電子工作33―リモコンで動作するトライアック調光器の製作の機器が動作するかどうか試した。その結果全くリモコン(FUNAI, RC-7)と同様に動作することが分かった。

 

プログラム

  リモコンから出るパルスには上向きと下向き合わせて6種のパルス幅 (40-ms, 3.5-ms, 3.35-ms, 2.5-ms, 1-ms, 0.85-ms) が存在する。 これらの時間作成には多少精度が落ちるが大変便利なPause と Pauseus を使った。例えばHigh PORTB.0 -> Pauseus 3500とすると、IR receiver moduleからの出力パルスは3.5-ms幅の下向きパルスである。それとサブルーチンを多用した。プログラムの大まかな流れは、電源ONでスイッチ入力を待つルーチンに入り、どちらかのスイッチから入力があると、そのスイッチに対応したパルスパターン発生ルーチンに飛び、スイッチ押している間そのパルスパターンを繰り返し発生し続ける。離すとスイッチ入力を待つルーチンに戻る。 受信側 (トライアック調光器) の受信したパルスを処理する原理がパルス幅を範囲設定して分類するという独特なものなので、パルス幅に対する許容度は比較的大きいと思われる

 

'****** 'プログラミング備忘録 ********

'PWMtestAA1.bas 2009.6.1 Producing "DENGEN" & "TV/VIDEO" key pulse patterns

'PIC16F628A + 74HC08(AND gate)

 

'****** Pin connection ******

'16F628A - 74HC08

'B0(P6)  - Pin1

'B3(P9)  - Pin2

'B1(P7) SWdown --> pull-up (to 5V) via 4,7K --> to GND if pressed

'B2(P8) SWup   --> pull-up (to 5V) via 4,7K --> to GND if pressed

 

'******* Program ******         

CMCON=7             'No comparator

VRCON=0              'A/D voltage reference disabled

TRISB=%11110110   'B.3=PWM output, B.0=Control output, B.1&2=Keyin

PR2=25                'Set PWM for 38KHz

CCPR1L=13            'Set PWM for 50% duty cycle

CCP1CON=%00001100  'PWM mode selection

T2CON=%00000100      'Timer2 ON + 1:1 prescale

 

Control var PORTB.0    'Pulse pattern shape control

SWdown var PORTB.1    'SWdown for the generation of pulse patterns

SWup var PORTB.2        'SWup for the generation of pulse patterns

 

Start:

Keyin:                        'Wait SWdown & SWup entry.

If SWdown=0 then Plspattern1

If SWup=0 then Plspattern2

Goto Keyin

 

Plspattern1:      'DENGEN" key of Funai RC-7 remote controller “電源”キー

Gosub w40msH   '40-ms H pulse

Gosub w3p5msL  '3.50-ms L pulse - 3p5ms=3.5-ms

Gosub w3p35msH '3.35-ms H pulse + 1-ms L pulse

Gosub w0p85msH '1, 850-us H pulse + 1-ms L pulse - 1-24 パルス24本の番号

Gosub w0p85msH '2, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '3, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '4, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '5

Gosub w2p5msH  '6

Gosub w0p85msH '7

Gosub w0p85msH '8

Gosub w0p85msH '9

Gosub w0p85msH '10

Gosub w0p85msH '11

Gosub w2p5msH  '12

Gosub w2p5msH  '13

Gosub w2p5msH  '14

Gosub w2p5msH  '15

Gosub w0p85msH '16

Gosub w2p5msH  '17

Gosub w0p85msH '18

Gosub w2p5msH  '19

Gosub w2p5msH  '20

Gosub w2p5msH  '21

Gosub w2p5msH  '22

Gosub w2p5msH  '23

Gosub w0p85msH '24

 

Goto Start

 

Plspattern2:      'TV/VIDEO" key of Funai RC-7 remote controller “テレビ/ビデオ”キー

Gosub w40msH   '40-ms H pulse

Gosub w3p5msL  '3.50-ms L pulse

Gosub w3p35msH '3.35-ms H pulse + 1-ms L pulse

Gosub w0p85msH '1, 850-us H pulse + 1-ms L pulse - 1-24パルス24本の番号

Gosub w0p85msH '2, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '3, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '4, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '5

Gosub w2p5msH  '6

Gosub w0p85msH '7

Gosub w0p85msH '8

Gosub w0p85msH '9

Gosub w0p85msH '10

Gosub w0p85msH '11

Gosub w0p85msH '12

Gosub w2p5msH  '13

Gosub w2p5msH  '14

Gosub w2p5msH  '15

Gosub w0p85msH '16

Gosub w2p5msH  '17

Gosub w0p85msH '18

Gosub w2p5msH  '19

Gosub w2p5msH  '20

Gosub w2p5msH  '21

Gosub w2p5msH  '22

Gosub w2p5msH  '23

Gosub w2p5msH  '24

 

Goto Start

 

'Subroutines ---

w40msH:       ’40-ms H pulse at IR receiver module’s output pin

Low PORTB.0  ‘L(0V)の時間を40msつくりPORTB.0より出力する

Pause 40

Return

 

w3p5msL:      ‘3.5-ms L pulse at IR receiver module’s output pin

High PORTB.0  ‘H(5V)の時間を3.35msつくりPORTB.0より出力する

Pauseus 3500

Return

 

w3p35msH:     ‘3.35-ms H pulse at IR receiver module’s output pin

Low PORTB.0

Pauseus 3350

High PORTB.0  ‘1-ms L pulse at IR receiver module’s output pin

Pauseus 1000

Return

 

w0p85msH:     ‘0.85-ms H pulse at IR receiver module’s output pin

Low PORTB.0

Pauseus 850

High PORTB.0  ‘1-ms L pulse at IR receiver module’s output pin

Pauseus 1000

Return

 

w2p5msH:      ‘2.5-ms H pulse at IR receiver module’s output pin

Low PORTB.0

Pauseus 2500

High PORTB.0  ‘1-ms L pulse at IR receiver module’s output pin

Pauseus 1000

Return

 

End

'****** End of program ******

'Note:

   'AKI Programmer's configurations:

   'FOSC – INTOSC_GPIO, WDTE – Enable, PWRTE – Disable, MCLRE – Internal, BODEN – Enable,

   'LVP-RB4:GPIO, CPD – Not_Protect, CP – Not_Protect

 

結論など

1)     PWM由来の38KHzの搬送波と外付けのANDゲート1個を使い、プログラムでリモコンのパルスパターン(今回は“電源”と“テレビ/ビデオ”)を発生させることが出来た。

2)     ANDゲートの出力が弱いのでTRでの増幅やIR-LEDを2個にしている記事も見たが、今回は1個のIR-LED直結で約10メートル先のリモコン受信装置を動かすことが出来た。

3)     同じPWM由来の38KHzの搬送波を使ってANDゲートなし16F628A丈でパルスパターンが発生できるはずだがそこまではジジイ!の知恵がまわらなかった。

4)     しばらくぶりでロジックICの74シリーズを使ったが、74HCxxなどと高性能化し、しかも安い。エレキの進歩は速いと実感。

5)     大した電子工作ではなかったような気がするが、それでも何となく楽しい。次なにすんべ。

 

 

ANDゲートなしで16F628Aのみでパルスパターンが出るように改良(2009.6.5)

  PWMで38KHzの搬送波を出す機能を検討したところ、PWMを設定するパラメータの内レジスタCCP1CONがPWMをON/OFFするのに係わることを発見した(英文マニュアルp.55 CCP1CON Register表)。つまり38KHzの搬送波の発生モードCCP1CON=%00001100 (12 in decimal)を CCP1CON=%00000000 (0)に変えてやると搬送波の発生は停止する。したがって上記のプログラムのサウブルーチン中にCCP1CON=12 と CCP1CON=0 を適当に入れてやることによって外付け74HC08のANDゲートなしで16F628Aのみで目的のパルスパターンを発生させることが出来るようになる。 結局今回やったことは;

 

1)     ANDゲートを除いて簡素化した回路にした(下に示す)。

2)     プログラムの改良

 

そしてこの簡素化したバルスパターン発生回路は上記のものと全く同じように動作することが分かった。 何よりの収穫は38KHz搬送波の発生をON/OFF出来ることを知ったこと。

 

改良したプログラム

  プログラム中に作成するパルスパターンの位相(HとL)は上記のものと同様にIR receiver moduleの出力に対して反転していることに注意。

 

'****** 'プログラミング備忘録 ********

'PWMtestBB1.bas 2009.6.5 modified program

'PIC16F628A

 

'****** Pin connection ******

'16F628A

'B3(P9)  - Output of 38KHz data

'B1(P7) SWdown --> pull-up (to 5V) via 4,7K --> to GND if pressed

'B2(P8) SWup   --> pull-up (to 5V) via 4,7K --> to GND if pressed

 

'******* Program ******         

CMCON=7              'No comparator

VRCON=0              'A/D voltage reference disabled

TRISB=%11110110   'B.3=PWM output, B.0=Control output, B.1&2=Keyin

PR2=25                  'Set PWM for 38KHz

CCPR1L=13            'Set PWM for 50% duty cycle

CCP1CON=%00001100    'PWM mode selection  PWMのON/OFF

T2CON=%00000100        'Timer2 ON + 1:1 prescale

 

SWdown var PORTB.1   'SWdown for the generation of pulse patterns (SW=switch)

SWup var PORTB.2       'SWup for the generation of pulse patterns

 

Start:

CCP1CON=12           '=%00001100  PWM enable

Keyin:                       'Wait SWdown & SWup entry.

If SWdown=0 then Plspattern1

If SWup=0 then Plspattern2

Goto Keyin

 

Plspattern1:     '"DENGEN" key of Funai RC-7 remote controller “電源”キー

Gosub w40msH   '40-ms H pulse

Gosub w3p5msL  '3.50-ms L pulse

Gosub w3p35msH '3.35-ms H pulse + 1-ms L pulse

Gosub w0p85msH '1, 850-us H pulse + 1-ms L pulse - 1-24 パルス24本の番号

Gosub w0p85msH '2, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '3, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '4, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '5

Gosub w2p5msH  '6

Gosub w0p85msH '7

Gosub w0p85msH '8

Gosub w0p85msH '9

Gosub w0p85msH '10

Gosub w0p85msH '11

Gosub w2p5msH  '12

Gosub w2p5msH  '13

Gosub w2p5msH  '14

Gosub w2p5msH  '15

Gosub w0p85msH '16

Gosub w2p5msH  '17

Gosub w0p85msH '18

Gosub w2p5msH  '19

Gosub w2p5msH  '20

Gosub w2p5msH  '21

Gosub w2p5msH  '22

Gosub w2p5msH  '23

Gosub w0p85msH '24

 

Goto Start

 

Plspattern2:     '"TV/VIDEO" key of Funai RC-7 remote controller “テレビ/ビデオ”キー

Gosub w40msH   '40-ms H pulse

Gosub w3p5msL  '3.50-ms L pulse

Gosub w3p35msH '3.35-ms H pulse + 1-ms L pulse

Gosub w0p85msH '1, 850-us H pulse + 1-ms L pulse - 1-24 パルス24本の番号

Gosub w0p85msH '2, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '3, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '4, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '5

Gosub w2p5msH  '6

Gosub w0p85msH '7

Gosub w0p85msH '8

Gosub w0p85msH '9

Gosub w0p85msH '10

Gosub w0p85msH '11

Gosub w0p85msH '12

Gosub w2p5msH  '13

Gosub w2p5msH  '14

Gosub w2p5msH  '15

Gosub w0p85msH '16

Gosub w2p5msH  '17

Gosub w0p85msH '18

Gosub w2p5msH  '19

Gosub w2p5msH  '20

Gosub w2p5msH  '21

Gosub w2p5msH  '22

Gosub w2p5msH  '23

Gosub w2p5msH  '24

 

Goto Start

 

'Subroutines --- これらのサブルーチンが肝心要の部分

w40msH:             ’40-ms H pulse at IR receiver module’s output pin

CCP1CON=0       ‘=%00000000  PWM disable  PWMをOFFにする=搬送波は出ない(重要)

Low PORTB.3   ‘L(0V)の時間を40msつくりPORTB.3より出力する

Pause 40

CCP1CON=12     ‘=%00001100  PWM enable   PWMをONにする(元にもどす)

Return

 

w3p5msL:    ‘3.5-ms L pulse at IR receiver module’s output pin

CCP1CON=12 ‘PWMをONにして38KHz搬送波でH(5V)の時間を3.5msつくる(重要)

Pauseus 3500

Return

 

w3p35msH:   ‘3.35-ms H pulse at IR receiver module’s output pin

CCP1CON=0     ‘PWMをOFFにする(重要)

Low PORTB.3    ‘L(0V)の時間を3.35msつくりPORTB.3より出力する

Pauseus 3350

CCP1CON=12  ‘PWMをONにして38KHz搬送波でH(5V)の時間を1.0msつくる(重要)

Pauseus 1000    '1-ms L pulse at IR receiver module’s output pin

Return

 

w0p85msH:   ‘0.85-ms H pulse at IR receiver module’s output pin

CCP1CON=0    ‘PWMをOFFにする(重要)

Low PORTB.3   ‘L(0V)の時間を0.85msつくりPORTB.3より出力する

Pauseus 850

CCP1CON=12   ‘PWMをONにして38KHz搬送波でH(5V)の時間を1.0msつくる(重要)

Pauseus 1000    '1-ms L pulse at IR receiver module’s output pin

Return

 

w2p5msH:    ‘2.5-ms H pulse at IR receiver module’s output pin

CCP1CON=0  ‘PWMをOFFにする(重要)

Low PORTB.3  ‘L(0V)の時間を2.5msつくりPORTB.3より出力する

Pauseus 2500

CCP1CON=12  ‘PWMをONにして38KHz搬送波でH(5V)の時間を1.0msつくる(重要)

Pauseus 1000     '1-ms L pulse at IR receiver module’s output pin

Return

 

End

'****** End of program ******

'Note:

   'AKI Programmer's configurations:

   'FOSC – INTOSC_GPIO, WDTE – Enable, PWRTE – Disable, MCLRE – Internal, BODEN – Enable,

   'LVP-RB4:GPIO, CPD – Not_Protect, CP – Not_Protect

 

追加:12F683でHardware PWMを使い38KHz搬送波を出す(2010.6.4)

  150円で手に入る8ピンの12F683がHardware PWM機能を備えていることを知った。上で述べた16F628Aと同じようの動作するか試してみた。テストに使った回路図を下に示す。PWMの出力はGP2(Pin5)からだけに限定される。

 

プログラム

  'HPWMを発生させる設定は上述の16F628Aのそれとほぼ同じである。すなわち、CMCON=7を除いたこと、TRISIOのビット数が6に減ったことなどが違う点である。、

‘********************************

'12F683HPWM.bas  2010.6.4  38.75KHz-PWM output from GP2 (Pin5) Works OK!

'12F683 with internal clock 4MHz

'******** Pin connection ***********

'Pin 1: Vdd (5.0V)

'Pin 8: Vss (GND)

'Pin 7: GPIO.0: input - connected to Vdd(+5V) and GND via 5k-VR

'Pin 5: GPIO.2: output - 38KHz PWM

'Pin 4: GPIO.3: input - connected to MCLR via 4.7kR to Vdd

'********** Program **********

VRCON=0              'A/D voltage reference disabled

TRISIO=%111000        'GP2 - PWM output

PR2=25               'Set PWM for 38KHz (24 for 40KHz)

CCPR1L=13            'Set PWM for 50% duty cycle

CCP1CON=%00001100    'PWM mode selection

T2CON=%00000100      'Timer2 ON + 1:1 prescale

'********* End of program *********

'Note:

   'melabs U2 Programmer's configurations:

   'OSC - INTOSCIO; WDTE - Enable; Power-up Timer - Disable

    'MCLRpin – Reset ; BODEN - Enable; Internal External Switch Over-Enable, Fail-Safe Clock Monitor - Enable, Code – Not Protect, Data EEPROM- Not Protect

 

  上のプログラムを走らせると以下のような連続波が出力され、その周波数は38.75KHzであった。オシロのDC出力モードで測定。

 

  上の連続波を拡大したもので、Duty Cycleがぼぼ50%であることが分かる。測ってみたら理論通り1つの方形波の波長が25ms前後であった。

 

Menu Pageへ戻る    

Topへ戻る