ホーム >> RSSセンター >> 自作赤外線送信装置の完成 ... !!

RSSセンター

  メイン  |  簡易ヘッドライン  

link HoBBy 指向++ ブログ HoBBy 指向++ ブログ (2024/12/30 19:39:13)

feed 自作赤外線送信装置の完成 ... !! (2019/8/3 17:01:25)
初めの本当に何もわかってなかった時点では概ね 4ms 毎の赤外線 ON/OFF を繰り返していると思っていたのでオペアンプを買ってきてネットで調べた見様見真似のウィーンブリッジ発振回路を作ってみたり、、ということで何週間も躓いていたりしました。

そのうちあんまりにもわからないのでオリジナルの赤外線発振回路をバラしてマイコン繋げてμ秒単位で電圧を直接測ってみたり ...
(> _<)

IMG_4615.jpg

IMG_4616.jpg


テキトーに持ってきた LED がダメなのか?波長が違う?とか疑って他の波長の LED をたくさん買ってみたり(波長の測定機器はあまりに高価で手が出ず、、レンタルすら)、、オリジナルの赤外線発振装置の LED をぶった切って付け替えてみたり ...
(> _<)

何度も何度も「もうあきらめるか ...」と思っては、まだ試してなかった調査方法があることに気づいてまた再開して、新しい調査をするために追加の部品を発注して、また発注して、発注して、、

謎は全て解けた ... !

1. 波長 940nm (公式の資料に間違いはなかった)
2. 変調周波数 38kHz
3. ON の時間、OFF の時間はそれぞれおおむね 4ms

1 と 2 は必須ながら、3 は別にそこまで厳密である必要は、おそらくないと思っている。。
2 に関しては、これは一般的な赤外線送受信装置(リモコン含む)の仕様とのこと。赤外線ラップタイマーごときが世界標準と違うことはしているはずはない、と思って試して案の定上手くいきました。。
どういうことかというと、1 秒間に 38,000 回の頻度で LED を ON → OFF → してあげないといけない、ということ。なので 1 回あたりの ON の時間と OFF の時間を足すと大体 26μs 程度。普通は大体コレの 1/3 が ON で、2/3 が OFF なのだとか??
3 で言っているのは、これを繰り返しているのが 4ms で、完全 OFF の時間がまた 4ms ということ。

最初は、、マイコンとかになると「誰にでもメンテできる」ものではなくなっちゃうのでなんとかオペアンプとかアナログの世界で閉じさせたいと思っていたながら、無理と判断。マイコン制御だ!
結局オリジナルの仕様はカンペキにはわからなかったながら、基本的な構成はほとんど同じになったと思います。自分のカンによると!

これが単発の回路。マイコンは (3V でも使える) PIC12F1822-I/P を使用。。ネットで調べたら「今更 PIC かよww」みたいな雰囲気。マイコンとか知らないので聞いたことあるものを使おうとしたんですが、、そうですか、古いですか ...
(^_^;

IR_LED_1.png

マイコンからの電圧、、というか電流では足りないのでトランジスタで増幅してます。トランジスタを使うのは今回初めて ... なんか、オームの法則を考えると「??」という感じなので大苦戦 ... 要は、電流を流したい装置はコレクタ側に繋がないといけないのだ ... ということを今回はよーく理解しました。。つまり、そこでドハマりしてました ...
(^_^;
あと、なんかトランジスタの公式資料ってコレクタとエミッタが逆になってない?気のせい??

あ。そういえばコレだと多分 LED の上限以上に電流が流れているのでは?疑惑が ... どうなんでしょう?あんまり真面目に考えてないので、電流流れ過ぎだと抵抗値を増やした方が良いのかも ... でも、オリジナルは 1kΩなんですがね?オリジナルのトランジスタの増幅率はわからないながら(今回使ったのは 200 倍)。

なお、コンデンサはオリジナルについていたので自分もつけてみた感じ。オリジナルは 7μF くらいなので半分程度。発振には関係がないようで、安定化のためについているみたい?確かにここにコンデンサを付けると安定する。。容量がどれくらいが適正なのかは、わからず。

で、ジムカーナ用だと両側に LED 出せばよいんじゃね?ということでダブルにしたのが以下。まあ多分、電池の消耗が早くなるんでしょうね?

IR_LED_2.png


ちなみに以下がマイコンのプログラム、、今回はアセンブリ言語で書いてみました!初めて!
... 普通のプログラミング言語とほとんど同じでしょ?と思っていたものの、レジスタの扱いがあまりにも違う ... エグイな ...
そしてタイマーなんてものはないので、CPU のクロック周波数を選んで(内部クロックが 3 種類くらいあるのと、あと外部クロックも使えるとか??)、CPU の一回当たりの処理時間を把握したうえで CPU に「何もしない」命令を適切な回数繰り返させる、、とか。
... マシン語に近いプログラムだとそうなるのか ... !!
Σ(゜ロ゜;)!!

--------------------
 
;**************************************************
;
; Schematic
;
;**************************************************
;
; 12F1822
; Internal 16MHz
; +------+
; | |----------Vdd=5V
; | |----------RA5
; | |----------RA4
; | |----------RA3----4.7k---Vdd=5V
; | |----------RA2
; | |----------RA1
; | |----------RA0
; | |----------Vss=GND
; +------+

;**************************************************
list p=12F1822 ; list directive to define processor
#include P12F1822.INC ; processor specific variable definitions

__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF

CBLOCK 0x20 ; Define GPR variable register locations
COUNT
COUNT1
COUNT2
COUNT3
COUNT4
ENDC

ORG 0x0000 ; processor reset vector
GOTO START ; When using debug header, first inst.
; may be passed over by ICD2.

;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------

ORG 0x0004

;------------------------------------------------------------------------------
; USER INTERRUPT SERVICE ROUTINE GOES HERE
;------------------------------------------------------------------------------

; Note the 12F1822 family automatically handles context restoration for
; W, STATUS, BSR, FSR, and PCLATH where previous templates for 16F families
; required manual restoration. Shadow registers store these SFR values, and
; shadow registers may be modified since they are readable and writable for
; modification to the context restoration.

RETFIE ; return from interrupt

;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------

START
MOVLW B'00100'
MOVWF BSR ;BANK4

MOVLW B'00000000'
MOVWF WPUA
;WEAK PULL-UP PORTA REGISTER(BANK4) Disalbed :0, Enalbled :1
;BIT5,4,3,2,1,0
;Note 1: Global WPUEN bit of the OPTION register must be cleared for individual pull-ups to be enabled.
;Note 2: The weak pull-up device is automatically disabled if the pin is in configured as an output.

MOVLW B'00011'
MOVWF BSR ;BANK3

MOVLW B'00000000'
MOVWF ANSELA
;PORTA ANALOG SELECT REGISTER(BANK3) DIGITAL : 0, ANALOG : 1
;BIT4 RA4
;BIT2 RA2
;BIT1 RA1
;BIT0 RA0

MOVLW B'00010'
MOVWF BSR ;BANK2

MOVLW B'00000000'
MOVWF APFCON
;ALTERNATE PIN FUNCTION CONTROL REGISTER(BANK2)
;BIT 7 RX/DT assign to RA1 : 0, RA5 : 1
;BIT 6 SDO assign to RA0 : 0, RA4 : 1
;BIT 5 /SS assign to RA3 : 0, RA0 : 1
;BIT 3 T1G assign to RA4 : 0, RA3 : 1
;BIT 2 TX/CK assign to RA0 : 0, RA4 : 1
;BIT 1 P1B assign to RA0 : 0, RA4 : 1
;BIT 0 CCP1 assign to RA2 : 0, RA5 : 1
MOVLW B'00000000'
MOVWF LATA
;PORTA DATA LATCH REGISTER(BANK2)
;BIT5,4,2,1,0

MOVLW B'00001'
MOVWF BSR ;BANK1

MOVLW B'00000000'
MOVWF TRISA
;(BANK1)

MOVLW B'01111000'
MOVWF OSCCON
;(BANK1)
;OSCILLATOR CONTROL REGISTER
;BIT7 SPLLEN software pll enabled/disalbed
;BIT6~3 IRCF Osc Freq 1111=16MHz
;BIT1~0 SCS System Clock Select bits 00=Clock determined by FOSC in CONFIG1

MOVLW B'00000'
MOVWF BSR ;BANK0

MOVLW B'11111111'
MOVWF PORTA
;(BANK0)
;------------------------------------------------------------------------------
; MAIN
;------------------------------------------------------------------------------
MAINLOOP
CALL IRON
CALL IROFF

GOTO MAINLOOP

IRON
MOVLW D'150' ; 1cycle
MOVWF COUNT ; 1cycle
IRONLOOP
MOVLW B'00110000' ; 1cycle
MOVWF PORTA ; 1cycle
CALL TIME140 ; 2cycle + 137cycle = 139cycle
MOVLW B'00000000' ; 1cycle
MOVWF PORTA ; 1cycle
CALL TIME280 ; 2cycle + 274cycle = 276cycle
DECFSZ COUNT,F ; 1cycle
GOTO IRONLOOP ; 2cycle
RETURN

IROFF
MOVLW D'150' ; 1cycle
MOVWF COUNT ; 1cycle
IROFFLOOP
CALL TIME420 ; 2cycle + 417cycle = 419cycle
DECFSZ COUNT,F ; 1cycle
GOTO IROFFLOOP ; 2cycle
RETURN

;***********************************************************
;Delays
;***********************************************************

TIME140
MOVLW D'44' ; 1cycle
MOVWF COUNT1 ; 1cycle
NOP ; 1cycle dummy
NOP ; 1cycle dummy
LOOP140
DECFSZ COUNT1,F ; 1×(44-1)?2 = 45cycle
GOTO LOOP140 ; 2×(44-1) = 86cycle
RETURN ; 2cycle
; 1+1+1+1+45+86+2=137cycle

TIME280
MOVLW D'90' ; 1cycle
MOVWF COUNT1 ; 1cycle
NOP ; 1cycle dummy
LOOP280
DECFSZ COUNT1,F ; 1×(90-1)?2 = 91cycle
GOTO LOOP280 ; 2×(90-1) = 178cycle
RETURN ; 2cycle
; 1+1+1+91+178+2=274cycle

TIME420
MOVLW D'138' ; 1cycle
MOVWF COUNT1 ; 1cycle
LOOP420
DECFSZ COUNT1,F ; 1×(138-1)?2 = 139cycle
GOTO LOOP420 ; 2×(138-1) = 274cycle
RETURN ; 2cycle
; 1+1+139+274+2=417cycle

END

--------------------

アセンブリ言語なんて知らないので、本まで買っちまいましたよ ...

IMG_4624.jpg

まあ、読んだからと言ってなんでも書けるようになるわけではないんですが ... CPU によって命令は(基本的なもの以外は)全然違うし、レジスタの扱いなんてもっとぜんぜん違うし。基本的な概念を抑えることはできますが。。40 歳近くなってこんなことに手を出すことになるとは ...
(^_^;

今回はこれを MPLAB X IDE という開発環境でマシン語にコンパイルして、 PICkit3 という USB 機器でマイコンにプログラムをアップロードしました。
こんな感じの USB 機器があるので、各端子をマイコンの各足に繋いでアップロードします ...

IMG_4631.jpg

PICkit3.png

シリアル通信だと、「pull up 抵抗」が必要です、、要するに信号がない時に強制的に ON にするためのものです。
で、ここで少しハマったのが、電圧は PC から PICkit3 を通じて供給されているのかと思いきや、デフォルトではそれはないとのこと。MPLAB X IDE の設定で何ボルト供給する、というのを指定しないといけないみたい。。言われてみればそりゃそうかな、とは思うんですけれど。
(^_^;

箱に詰め込む様子。電池の生き死には把握したいので赤い LED を追加してます ... 他、要るかな?と思って要らんプラグを付けてしまいましたが結局使わなかった ...

IMG_4625.jpg

IMG_4626.jpg

造ったものは以上ですが、ではこれがオリジナルと同じ動作をするかというと、そうでもなく。
なんか射程距離が短いんですよね~ ... 1m くらいか。調査すれば何がどう悪いのか多分わかりますが、、まあ第一発目としては上々ではなかろうか ... 疲れたのでとりあえず今回はここまで!よくやった自分!
(T^T)

execution time : 0.007 sec