koheiのおもちゃ修理記録

宇部おもちゃ病院 毎月第2土曜日 13:00~16:00
宇部新天町の西の端、市民活動センターで開院してます。

5/4 自動車用フラッシャーリレー製作

2020-05-02 | PIC・電子工作
いや~、待ってましたGW~。やりたいことが一杯あるのねw。
ぼくの愛車のカプチーノですが、平成4年式→もう28年物!あちこちボロボロなだけでなく、古い車なのもあって不具合な所が多いのよね。

カプチーノは電装系が弱いことで有名。例えば、夜信号待ちで、ヘッドライト付けた状態でウインカーを点けると、ヘッドライトがウインカーの点滅に合わせて明暗変わるし、インパネも明暗する。
電装系の弱さをカバーするため省電力を図るには、とりあえずヘッドライトのLED化が一番効くんだけど、それは結構大変…。そこで、ヘッドライト以外のほとんどをLED化してます。
(ちなみにヘッドライトが55W×2、ウインカーが合計47W(×2:ハザード時)、テールランプ/ブレーキランプ42&10WはLED化済み。インパネ周り:15WもLED化済み。エアコンは絶対に使わないw。)

最初にウインカー球をLEDに替えた際は、電流低すぎ=球切れ判断でハイフラッシュ状態になってしまいましたが、純正のウインカーリレーの中の回路の抵抗を変えて、何とか60Hz程度に調整してました。
しかし、それだとDUTYが50%じゃなくなっちゃったので、次にシャント抵抗を上げて
ハイフラッシュ回避してました。これで数年やってました。

しかし車検の時に「ウインカーが黄色い!」という指摘で車検通らず(「橙色」の決まりらしい…)、車検の時だけ電球に戻して車検を通す、という事になった。
ところが、純正のウインカーリレーは、電流低すぎ検知だけじゃなくて、電流高すぎ検知もしてるようで、LEDでちょうどいいシャント抵抗にした状態で白熱電球に戻すと、DUTY20%ぐらいの変な点滅になってしまう…。

という事で、もう電流監視はせずに、LEDを付けても白熱電球を付けても、どっちでも使えるウインカーリレーを作ってしまおう、という目論見です。
(ちなみに、LED用ハイフラ回避ウインカーリレーも売ってますが、「電子音はイヤ!昔ながらのカッチン、カッチンの方がいい!」とか、LED用のリレー刺した状態で白熱灯に戻すとリレーが壊れる、とかの事情で却下ですw。)

元のウインカーリレーはこれです。(ケース外してます。)

これの端子・基板・リレーを転用して、まるっきり作り変えてしまいます。

前置きが長くなりましたが、マイコン使う手もありましたが、最初「タイマーIC:NE555」で作ろう、と思い、TTLタイプNE555を購入しておきました。マイコンと比べての利点は、
・電源が~15Vまでなので、バッテリーから直でいける。電源を用意しなくていい。
・プログラム作らなくていいw。
…ぐらいかしら。
しかし、3極のフラッシャーリレー、「B」端子に給電したらウインカー点き始めるのかと思ってたけど、調べてみるとそうではないらしい…。
回路図はいろいろあったけど、簡略化して書くと、こんな感じらしい。

メインスイッチを入れる(鍵を回す)と、ウインカーリレーは常に電源供給状態になり、ウインカー灯の側でGNDラインを繋げると、ウインカーが点灯(点滅)する、という構造らしい。
これは困った…。555で電源入れっぱなしの発振回路作って、ウインカーを点けたいときにGND側を接続するだけと、点滅の中途半端な途中から始まって、ウインカーレバーを入れてすぐに点かなかったり、点いたけど瞬間切れて遅れたりとかになってしまう…。これはヤだなぁ…。
Lの端子がGNDに落ちたのを検知して電源を入れて、ランプ点灯中は自己保持する、という回路の例があったけど、ちょっと部品点数が増えすぎな気が…。

そこで、マイコンで作ることにしました。
目指す機能は、
・ウインカーつけると、例えば60Hzなら、必ず点灯0.5秒-消灯0.5秒…の最初から始まる。
・点滅周期は、60~120Hzぐらいの可変にする。
・点灯制御は機械式リレーを転用する。
在庫の余ったPICで作ろうかとも思いましたが、Attiny13aならSOP8を持ってて、そっちの方が小さく作れるので、使用デバイスはAttiny13aにしました。

プログラムにちょっと行き詰ったところでいつもの先輩に相談したところ、全体に渡っていろいろとご指摘を頂き、最終的に回路はこうなりました。

プログラムは後で載せますが、ブレッドボードで動作確認。

今回のSOP8のAttiny13aへの書き込みは、SOP8用アダプタを使いました。

AliでSOP用のアダプタを買おうかずっと悩んでたのですが、他のおもちゃドクターの記事で紹介されてた、SOP8→DIP8変換基板を使って挟み込んでネジで締めるアダプタを作ってみました。これで、基板に取り付けずに書き込みできました。

ブレッドボードでの動作確認は、リレーは付けずに出力にLEDを繋いで模擬。PINB0に繋ぐ「SW入った」検知ラインは赤色LEDを経由してGNDに落して実機を模擬。
プログラムは何度か間違い修正してちゃんと動くようになったものの、LEDをGNDに落しただけではPINB0がLになりませんでした…。
LEDの順方向電圧が乗っちゃって、PINB0の内部プルアップ使用時は、LEDをGNDに繋いでもPINB0=1.65Vで点滅が全くスタートせず。内部プルアップをやめて1MΩの外部プルアップにして1.45Vで、点滅がスタートしたりしなかったり…。
先輩の助言から、プルダウン用の抵抗(回路図の、LEDに並列に入れてる10kΩ)が必要という結論になりました。これだと、12Vブロック用のダイオード(BAV99)の電圧降下を考慮しても、PINB0がちゃんとLになってくれると思われます。
プルダウン時の電流と抵抗の電力とプルアップとのバランス考えて、プルアップは200kΩ、プルダウンは10kΩとして、上述の最終回路となりました。
検知ラインのダイオードは、順方向電圧降下の低いショットキーを使おうかと思いましたが、耐逆電圧の高いスイッチングダイオードを選択しました。(家電基板から取った、Marking:KJEのBAV99を使いました。)

さて、プログラムが完成、いけそうな目途が立ったので、いよいよ、元のリレーの部品を全部取っ払って、作り替えていきます。
残りICだけになった所。

型番調べても出てこない、多分法人専用と思われます。ちなみに、リレーも型番からヒットしません…。

1.27mmピッチのスルーホール基板に乗せますが、限られたスペースで、なかなか頭を使いました。こんな感じの出来上がり。

基板の拡大。

おもちゃ修理で鍛えられて「小さく作るのはお手の物!」といいながら、なかなか大変でした。(あまりキレイじゃないのはご勘弁を…)
基板裏面。

1.27mm基板の方のスペースが厳しくて、検知ラインのダイオードは、こっちの基板裏に付けました。また、リレーコイルの逆起電力からFETを保護するためのダイオードも、基板裏に直付けしてます。(回路図に型番書いてませんが、手持ちであったそれっぽいヤツですw。)

これで、車に付けてたLED取ってきて繋いで動作確認……期待通りに動かない…。
LEDをGNDに落すと、点きっ放し、約0.5秒おきに一瞬切れる、という動き…。
PINB0のH→Lがちゃんとできてない?と、オシロ繋いで確認したりしましたが、これは…、リレーの物理的なSWが遅いので、リレーがOFFになってすぐにPINB0が確実にLになりきってない→時間待ちの追加が必要、と思われます…。
もう「プログラムは完成だ!」と、全部組んじゃった…。けど、まだ間に合う。(というか、これが完成しないと車に乗れないw。)
完全にICSPするように作ってないので、一部配線外し&配線を引き出して、無理やり再書き込みをします!

プログラムに時間待ちを追加して、注意深く配線して、書き込み…一発でOK!

プログラムの最終はこうなりました。

1:  /*
2:  * FlashRelay.cpp
3:   *
4:  * Created: 2020/04/29 10:04:27
5:  * Author : Kohei Murakami
6:  */ 
7:
8:  /*
9:  車載フラッシャーリレー用プログラム
10:  【ヒューズ設定】
11:  ”FEF9”
12:  内蔵オシレータ4.8MHzの8分周無し、BOD無効
13:  ピン数には余裕あるが、RESET無効・低電圧プログラミング無効にしておく
14:
15:  【PIN割当て】
16:  PIN1:NC
17:  PIN2:NC
18:  PIN3:NC
19:  PIN4:GND
20:  PIN5:PB0(INT0)ウインカーSW入り検出、外部pull-up
21:  PIN6:PB1 リレー駆動FET行き出力
22:  PIN7:PB2(ADC1) 点滅速度調節用VR
23:  PIN8:Vdd
24:  */
25:
26:  #define F_CPU 4800000 // 4.8MHz
27:
28:  #include <avr/io.h>
29:  #include <util/delay.h>
30:  #include <avr/interrupt.h>
31:
32:  /* ピン変化割込みハンドラ */
33:  ISR(PCINT0_vect)
34:  {
35:  	//何もしない
36:  }
37:
38:  int main(void)
39:  {
40:  	unsigned char i,volt;
41:
42:  // 初期設定
43:  	PORTB = 0b00000000;	// 全ポートL(内部プルアップ不使用)
44:  	DDRB = 0b00000010;	// PB1のみ出力、他は入力(Hi-Z)
45:  	ADMUX = 0b00100001;	// 基準電圧=Vcc、左寄せ、PB2
46:  	MCUCR = 0b00110000;	// パワーダウンモード、Sleep許可
47:  	PCMSK = 0b00000001;	// PINB0のみ割り込みを許可
48:
49:  // 点滅周期取得のため、ADC1電圧を読み込む
50:  	_delay_ms(20);	// 電圧安定時間を取る
51:  	ADCSRA = 0b11000000;	// AD変換許可、変換開始、自動起動不可、完了割込み不可、分周CK/2
52:  	while(!(ADCSRA & (1 << ADIF)));	// 変換終了まで待つ
53:  	volt = ADCH;	// 値取得(上位8bitのみ)
54:  	ADCSRA = 0b00000000;	// AD変換不可
55:
56:  	/* メインループ */
57:  	while (1)
58:  	{
59:  		// PB0がHならsleepに入る
60:  		if (PINB & (1 << PINB0)) {
61:  			GIFR=(1<<PCIF);	// 割り込みフラグをクリア
62:  			GIMSK = 0b00100000;	// ピン変化割り込みを有効
63:  			sei();	// 割り込み許可
64:  			__asm__ __volatile__ ("sleep");		//Sleep
65:  			cli();	// 割り込み禁止
66:  			GIMSK = 0;			//割り込み無効
67:  		}
68:
69:  		for(;;)
70:  		{
71:  			// 出力ON
72:  			PORTB |= (1 << PINB1); // PB1をHに
73:  			for(i=0;i<=100+volt/2;++i) {
74:  				_delay_ms(2);
75:  				__asm__ __volatile__ ("nop");	// OFFと時間を合わせる
76:  				__asm__ __volatile__ ("nop");
77:  			}
78:			
79:  			// 出力OFF
80:  			PORTB &= ~(1 << PINB1); // PB1をLに
81:  			_delay_ms(100);
82:  			for(i=0;i<=50+volt/2;++i) {
83:  				_delay_ms(2);
84:  				if (PINB & (1 << PINB0)) goto OUT;	// 出力OFF時にPINB0がHならloopを抜ける
85:  			}
86:  		}
87:  		OUT:
88:  		;
89:  	}
90:  }

(あい変わらず「不等号」がちゃんと書けないので、倍角に変えてます。コピー時は注意願います。誰もコピーして使わないと思うけどww。)
81行目が、後から追加した時間待ちです。最初20msにしてましたが、失敗してもう一回書き込みするのはイヤだったので、長めに0.1s取っておきました。これを長くしても、次の消灯中のforループを短くすれば影響なしです。(この0.1sの間は、ウインカーSWを入れたり切ったりしても検知してくれませんが、人間の操作には影響ありませんねw。「切り」は、物理的に切断されるので、切った時に切れが遅くなる心配はありません。)

先輩から「デバイスの省電力を狙わないならsleepの必要ないでしょ?」と指摘されましたが、例えば2時間のロングドライブ、そのうちウインカーを点けるのが例えば30秒×20回。その10分の為に残りの1時間50分プログラムがぐるぐる走ってるのは無駄かなぁ、と思って、必要ないときはsleepにしました。

電源ONの最初に1回だけ、ADCを読み込んで点滅周期を決める作りにしてます。
まあ、言ってみれば単なる「Lチカ」ですが、ADC・sleep等、データシート熟読・先輩にダメ出しされながら、いろいろと勉強になりましたw。

さてさて、再書き込みの為にバラしたのを元に戻して、プルダウンを追加したLEDを繋いで動作確認…バッチリ期待通りの動き!!
後は、実車にて、どこにプルダウン抵抗を入れるか検討・実行すれば完成。

外してきたフロントウインカーとLED。

左はサイド用のウェッジ球。右が前後ウインカーに使ってるLED。
「ウインカーが黄色い!」と言われて車検が通らない、黄色LEDを買ったかと思ってたけど、どうやら白色LEDを買ってたみたい。
点灯させて、HDR(明るさ調整)かけて撮ると

こんな感じですが、明るさ調整なしだと

こんな感じ。プラスチックはある程度橙色なのですが、白が強すぎて黄色っぽくなってしまうようです。LEDの表面をオレンジの油性マジックで塗ってみたけど、ほとんど変わりませんでした。何とかならないかなぁ…。

フロント・サイド・リアと確認しましたが、このフロントウインカーでプルダウン取るのが一番簡単そう。被覆の一部を切って、線間に抵抗を入れます。

あとビニールテープ巻いて終了!実車装着して試運転…、とりあえず走ってはないけど、バッチリでした~!
(5/16:追記)
実車装着して走ってみると、不具合発生しました…。
「5/16 自動車用フラッシャーリレー製作~第2報」にて改造実施です。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 3/22 おもちゃ修理1件 | トップ | 5/6 おもちゃ修理3件 »

コメントを投稿