【電子工作】PICマイコン「シーケンシャルウィンカー」回路の試作
”光の点滅” 電子工作では、LEDの点滅回路「Lチカ」として入門用でもお馴染みですよね、
今回は点滅回路を応用し、複数LEDの順次点灯点滅「シーケンシャルウィンカー」の回路を実験・試作してみました。
シーケンシャルウィンカー
「シーケンシャルウィンカー」とは、
流れるように光るウィンカーを指し、他に「流れるウィンカー」とも呼ばれています。
また、公的には「連鎖点灯式方向指示器」と定義されと呼ばれ、内側から外側に流れるように光ることが特徴です。
保安基準
自動車の構造・装置について、安全確保及び環境保全上の技術基準を「道路運送車両の保安基準」として定められています。
メーカー完成車(純正部品装着車)は、シーケンシャルウインカー等その基準に適合となる検証・検査が実施され、もちろん問題ありません。
しかし、社外品やその他後付け車両は、仕様や基準など、保安基準を正確に把握した上で施工しなければ不正改造となってしまうこともあります。 十分に注意が必要です。
なお、元よりのウィンカーでも、それらの保安基準が元より定められいます。
・取り付け位置、色、明るさ、面積、点滅回数(周期)等、その他
本記事では、ウィンカーを構成する光の点滅方法などを、電子回路を用いて紹介するに留まります。
したがって、シーケンシャルウィンカー等、これら合法的な処置を紹介する方法ではありません。
仕様・構成
本実験回路を製作するにあたり、ウィンカーの定義を一部抜粋し、それを基準した仕様で構成します。
- 内側から外側に向かって順点灯
点灯後、他の全てが点灯するまで点灯し続け(内側から順番に点灯し、全ての電球が点灯してから同時に消えること) - 左右対称の点灯の流れ
- 毎分60回以上120回以下の点灯回数
(他のウインカーとシンクロした点灯周期)
シュミュレータ
開発、試作やテスト状態で、実際の自動車からウィンカー信号を得て作業するには、無理な環境と思いますので、ウィンカーシュミュレータを作成しテスト環境としました。
- DC12V駆動
- 点滅間隔調整
- ハザード、ウィンカーL・R スイッチ
- DC12V L・R(+)出力
- ウィンカー動作音
ICウィンカーリレー
上記を基準に、555タイマーICからリレー経由にてカチカチ音及び信号を出力とする
「ICウィンカーリレー」を製作
PICシーケンシャルウィンカー
PICマイコンを用いて、シーケンシャル制御をプログラミングにて制御します。
ウィンカー点滅間隔
PIC内では、ウィンカー全体の点滅制御は行いません。
- 点滅間隔は、ウィンカー電圧(DC12V+)をトリガとし、それを主電源とする回路で構成します。
シーケンシャル処理
- ウィンカー電圧供給タイミングをシーケンシャル単発処理として終結しています。
- シーケンシャル間隔調整
PICのA/D機能(電圧対応)を用いて、半固定抵抗にて調整可
同期
ウィンカー同期(左右同期)は、同期信号として非対応です。
(主L・R信号の電圧供給で編成とする回路内分岐方式)
4連シーケンシャルウィンカー
8ピンPIC 「12F1822]
A/D監視(シーケンシャルタイミング調整)、RA(OUTPUT)4連構成
プログラム
/*===========================================================================
/
/ LED 4連 シーケンシャルウィンカー
/ (Sequential blinker 4ines Version)
/
/ PIC 12F1822
/
/ https://www.pochiweb.com
/============================================================================
/ 12F1822
/
/ 01-Vdd 08-Vss
/ 02-RA5 → LED #01 07-RA0 → LED #04
/ 03-RA4 ← VR(v0-12) 06-RA1 → LED #03
/ 04-RA3 none 05-RA2 → LED #02
/
/============================================================================
*/
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // 内部発振使用
#pragma config WDTE = OFF // ウオッチドッグタイマー OFF
#pragma config PWRTE = ON // パワーアップタイマ(立上り待機) ON
#pragma config MCLRE = OFF // リセット(外部入力での) OFF , DIGITAL Input
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = OFF // 電源電圧降下常時監視機能(OFF)
#pragma config CLKOUTEN = OFF // CLKOUT(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(OFF)
// CONFIG2
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // PLL-32MHz動作(OFF)
#pragma config STVREN = OFF // スタック オーバ、アンダフロー リセット (OFF)
#pragma config BORV = HI // 電源電圧降下常時監視電圧設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
#define _XTAL_FREQ 8000000 // 8MHz発振
// ===========================================================================
// A/D Read
// ===========================================================================
unsigned int adconv()
{
unsigned int advt ;
GO_nDONE = 1 ; // Read ana
while(GO_nDONE) ; // Read wait process
advt = ADRESH ; // set DRESH,ADRESL
advt = ( advt << 8 ) | ADRESL ; // 10bit 分能
return advt ;
}
// ==========================================================================
// Wait Time(ms)
// ==========================================================================
void Wait(unsigned int numw)
{
int i ; // loop i delay
for (i=0 ; i<numw ; i++) {
__delay_ms(1) ; // 1ms delay
}
}
// ==========================================================================
// MAIN Process
// ==========================================================================
void main()
{
unsigned int num ;
// REG
OSCCON = 0b01110010 ; // 内部クロックは8MHz
ANSELA = 0b00010000 ; // アナログRA4、他デジタルI/O
TRISA = 0b00011000 ; // RA4=入力、RA3(none)、他出力
// A/D
ADCON1 = 0b10010000 ; // 読取右寄せ、A/D変換FOSC/8
ADCON0 = 0b00001101 ; // A/D 設定(RA4から読込む)
__delay_us(5) ; // A/D Wait Delay Time
// START
// // 初期化(全消灯)
RA5 = 0 , RA2 = 0 , RA1 = 0 , RA0 = 0 ;
num = adconv() ; // RA4 VR(v) IN
num = num / 8 ; // 補正処理(÷8)
// // シーケンシャル処理
RA5 = 1 ;
Wait(num) ;
RA2 = 1 ;
Wait(num) ;
RA1 = 1 ;
Wait(num) ;
RA0 = 1 ;
Wait(num) ;
// // 全点灯後、全消灯
RA5 = 0 , RA2 = 0 , RA1 = 0 , RA0 = 0 ;
Wait(num) ;
// END
SLEEP();
}
8連シーケンシャルウィンカー
18ピンPIC 「16F1827]
A/D監視(シーケンシャルタイミング調整)、RB(OUTPUT)8連構成
プログラム
/*===========================================================================
/
/ LED 8連 シーケンシャルウィンカー
/ (Sequential blinker 8ines Version)
/
/ PIC 16F1827
/
/ https://www.pochiweb.com
/============================================================================
/ 16F1827
/
/ 01-RA2 ← VR(v0-12) 18-RA1 none
/ 02-RA3 none 17-RA0 none
/ 03-RA4 none 16-RA7 none
/ 04-RA5 none 15-RA6 none
/ 05-VSS 14-VDD
/ 06-RB0 → LED #01 13-RB7 → LED #08
/ 07-RB1 → LED #02 12-RB6 → LED #07
/ 08-RB2 → LED #03 11-RB5 → LED #06
/ 09-RB3 → LED #04 10-RB4 → LED #05
/
/============================================================================
*/
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // 内部発振使用
#pragma config WDTE = OFF // Watchdog タイマ OFF
#pragma config PWRTE = OFF // パワーアップタイマ(立上り待機) OFF
#pragma config MCLRE = OFF // リセット(外部入力での) OFF , DIGITAL Input
#pragma config CP = OFF // コードプロテクト(プログラム) OFF
#pragma config CPD = OFF // データ コード プロテクト OFF
#pragma config BOREN = OFF // ブラウンアウトリセット(低電圧検知) OFF
#pragma config CLKOUTEN = OFF // RA6 I/O
#pragma config IESO = OFF // 内部、外部クロック切り替え OFF
#pragma config FCMEN = OFF // クロックモニタ OFF
// CONFIG2
#pragma config WRT = OFF // 4kフラッシュメモリ 保護 OFF
#pragma config PLLEN = OFF // 4xPLL 動作 OFF
#pragma config STVREN = OFF // スタック.オーバーフロー リセット OFF
#pragma config BORV = LO // 電源電圧降下常時監視 電圧設定 LO(1.9V)
#pragma config LVP = OFF // 定電圧プログラミング機能 OFF
#define _XTAL_FREQ 8000000 // 8MHz発振
// ===========================================================================
// A/D Read
// ===========================================================================
unsigned int adconv()
{
unsigned int advt ;
GO_nDONE = 1 ; // Read ana
while(GO_nDONE) ; // Read wait process
advt = ADRESH ; // set DRESH,ADRESL
advt = ( advt << 8 ) | ADRESL ; // 10bit 分能
return advt ;
}
// ==========================================================================
// Wait Time(ms)
// ==========================================================================
void Wait(unsigned int numw)
{
int i ; // loop i delay
for (i=0 ; i<numw ; i++) {
__delay_ms(1) ; // 1ms delay
}
}
// ==========================================================================
// MAIN Process
// ==========================================================================
void main()
{
unsigned int num ;
// REG
OSCCON = 0b01110010 ; // 内部クロック 8MHz
ANSELA = 0b00000100 ; // RA# アナログRA2、他デジタルI/O
ANSELB = 0b00000000 ; // RB# 全デジタルI/O
TRISA = 0b00000100 ; // RA# RA2=入力、他出力
TRISB = 0b00000000 ; // RB# 全出力
// A/D
ADCON1 = 0b10010000 ; // 読取右寄せ A/D変換FOSC/8
ADCON0 = 0b00001001 ; // A/D 設定(AN2から読込む)
__delay_us(5) ; // A/D Wait Delay Time
// START
// // 初期化(全消灯)
PORTB = 0b00000000 ;
num = adconv() ; // RA2 VR(V) IN
num = num / 12 ; // 補正処置(÷12)
// // 点灯処理(シーケンシャル)
RB0 = 1 ;
Wait(num) ;
RB1 = 1 ;
Wait(num) ;
RB2 = 1 ;
Wait(num) ;
RB3 = 1 ;
Wait(num) ;
RB4 = 1 ;
Wait(num) ;
RB5 = 1 ;
Wait(num) ;
RB6 = 1 ;
Wait(num) ;
RB7 = 1 ;
Wait(num) ;
// // 全点灯後、消灯
PORTB = 0b00000000 ;
Wait(num);
// END
SLEEP();
}
まとめ
PICマイコンを用いた、LED「シーケンシャルウィンカー」回路の実験・試作
- 実車両からのウィンカー信号は、555を使用した「ICウィンカーリレー」を作成し(シュミュレーション)連動させました。
- シーケンシャル処理はPIC制御、LEDドライバはFETを使用。
- LED連動数は、PICのI/O実装数による、8ピンPICでは4連制御、18ピンPICにて8連制御で構成しました。
なお、本仕様は16F1827のRA側未処理です(RA側の追加処理次第で、より多く連動数が可能とも考えられます)