• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

メカキチの愛車 [トヨタ エスティマ]

整備手帳

作業日:2010年2月14日

人感知式自動ドアロック/アンロック

他の整備手帳を見る 他の整備手帳を見る

目的 修理・故障・メンテナンス
作業 DIY
難易度

上級

作業時間 30分以内
1
不在検知自動ドアロック+αに紹介レベルだった自動ドアアンロック機能まで搭載させました
近づいただけでアンロックされるだけの事ですが、格段に利便性が向上しましたヽ(*´∀`)ノ

今回、オートライトキャンセル制御とアンロック制御を同時に行っても問題無い事に気づいた為、回路の大幅変更無く出来ました。(^O^)

機能の詳細はパーツレビューで紹介してます。
取付については、過去取付も参照願います。

【パーツレビュー】
自作 人感知式自動ドアロック/アンロック
http://minkara.carview.co.jp/userid/617702/car/526912/2708125/parts.aspx

【過去取付参照】
不在検知自動ドアロック+α(オートライト点灯キャンセル機能)
http://minkara.carview.co.jp/userid/617702/car/526912/1040317/note.aspx
不在検知自動ドアロック+α(ナビ電源制御版 失敗)設計資料
http://minkara.carview.co.jp/userid/617702/car/526912/1028910/note.aspx
自作 不在検知自動ドアロック+α(ナビ電源制御版 失敗)の取付
http://minkara.carview.co.jp/userid/617702/car/526912/1027800/note.aspx
2
分かりづらいですが、アンロック制御用に、緑色の配線が追加されています。
3
運転席足元の、IG3-6pin緑に追加したアンロック制御用配線をつなぎます。
4
以下の動作を確認して完了

① 純正のスマートキーを保持して車両に近づくと自動アンロック
 「警告状態の場合」
   ロック・ハザード1回→アンロックを行う。
 室内照明消灯後10秒以内に人感知無ければ自動ロック

② 乗車して、人感知あれば自動ドアロックまでの時間を延長

③ ACCがON状態であればドアロックしない。

④ 降車した(と推測される場合
)は、室内照明消灯後ロック

⑤ ACCがOFF且つドアクローズ状態が3分続けば、強制ロック

⑥ どのドアを開けても、全てのドアのアンロックが可能
5
回路図
6
パターン図
7
部品表
8
プログラム(室内照明15秒消灯版)

2010/02/14 各動作の反応速度向上
2010/02/18 チャタリング排除タイム削減
2010/02/22 動作パターンの見直し
2010/02/25 降車時に「消灯待たずに即ロック機能」追加
2010/02/27 オートライトキャンセルタイミング変更
         リモスタ起動に関するロジック見直し
2010/03/06 リモスタ起動時の警告方法見直し
2010/03/13 各種マージン再調整
2010/03/14 プログラム容量削減
2010/03/22 3分後の強制ロックでのバグ修正
2017/01/15 機能そのままで全面見直した大幅安定板(XC8で記述し直し)
2017/02/18 ドアロックしないパターンを見直して利便性とセキュリティー性を向上
2017/02/19 乗車時の不在判断を見直してセキュリティー向上

// ============= メモ ======================================
//ファイル名 DoorLock310.c
//作成日 2017.02.19
//作成者 mekakichi
//バージョン 3.11
//コンパイラ MPLAB X IDE + XC8
//プロパティ>XC8>Linker>Calibrate oscillator:有効 値無し
//PIC PIC12F675
//クロック 4MHz(INTIO)
//概要 人感知自動ドアロック
// 照明消灯連動自動ドアロック(人感知センサーによるドアロックタイミング変更機能在り)+ハザード制御機能
// 照明点灯連動自動アンロック + オートライト点灯キャンセル機能
// 室内照明点灯解析機能(乗車中/降車中を直前にACC電源の変移があったかで判断)
// 警告機能(ドアの開閉のみが行われた場合に次にドアを開けた時にハザード)
// 電源の不安定な状態及び瞬断による誤検知排除機能
// 節電機能(いつまでも人感知センサーが反応し続ける場合、3分後にドアロックして本機は休眠する)
// ========================================================


// ================ ProgramStart =================================
// ========= PICのヘッダファイル読み込み ================
#include "xc.h"
// ================ 内部発信4MHzを指定 ===================
#ifndef _XTAL_FREQ
#define MHz 000000
#define _XTAL_FREQ 4MHz
#endif


// ================ 車両や使用状況によって調整する時間を指定 ===================
// ================== (整数の設定値≒15.2588カウント/s × 指定秒)====================
// 室内照明点灯時間「初期値=15秒」(設定値=0~65535)
#define RoomLampInterval 229
// 室内照明点灯時間±誤差「初期値=2秒」(設定値=0~65535)
#define RoomLampMargin 30

// オートライトキャンセル機能利用「初期値=利用する」(設定値=利用する:1 利用しない:0)
#define UsedCancelHeadlight 1

// 警告機能利用「初期値=利用する」(設定値=利用する:1 利用しない:0)
#define UsedAlarm 1

// 瞬断として処理する電源OFF時間「初期値=0.5秒以内は瞬断」(設定値=0~255)
#define PowerFailureInterval 8

// 人感知センサーで不在として判断するまでの時間「初期値=10秒連続人感知無し」(設定値=0~65535)
#define DetectionInterval 153
// 人感知センサーで検知する最大時間「初期値=3分」(設定値=0~65535)
#define SavingInterval 2747


// ==================== 変数定義 ==========================
unsigned int RoomLampIntervalFirst; // 室内照明点灯時間(割り込み処理でカウントアップ)
unsigned int RoomLampIntervalSlow; // 室内照明点灯時間(割り込み処理でカウントアップ)
unsigned int Lighting_Time; // 室内照明点灯時間(割り込み処理でカウントアップ)
unsigned int Sensing_Time; // 不在判定時間(割り込み処理でカウントダウン)
unsigned int Sensing_MaxTime; // 節電までの時間(割り込み処理でカウントダウン)
bit ACC_F; // ACC電源フラグ OFF=0 ON=1
bit Alarm_F; // 警告フラグ 不要=0 必要=1
bit Boot_F; // 起動フラグ 室内照明検知=0 ACC電源検知=1
bit Detect_F; // 検知フラグ 不定=0 反応=1
bit Getoff_F; // 降車フラグ 不定=0 降車=1
bit NextLock_F; // 次回はドアロックフラグ 無効=0 有効=1
bit Sensor_F; // 人感知センサー起動フラグ 停止=0 起動=1
bit Sleep_F; // 休眠フラグ 不可=0 実行=1
unsigned char Delay; // 遅延時間(ここで指定した値は、Waiting();の実行により値*100msのwaitとなる)
unsigned char AccOff_Ignore; // ACC電源瞬断排除時間
unsigned char LampOff_Ignore; // 照明OFF側検知排除時間
char Lamp_S; // 室内照明点灯時間ステータス 消灯=0 通常=1 短時間=2 長時間=3
char LampResult_S; // 室内照明点灯結果ステータス 点灯=0 通常=1 短時間=2 長時間=3
char Lock_S; // ロックステータス 不可=0 実行=1 実行済=2
char Stay_S; // 人存在ステータス 不在=0 存在=1 監視=2
char UnLock_S; // アンロックステータス 不可=0 実行=1 実行済=2
static void picinit(); // 初期設定サブ処理タイトル
static void Waiting(); // 遅延サブ処理タイトル
// ========== コンフィギュレーション設定 ================
//INTIO :内部発振
//WDTDIS :ウォッチドッグタイマ利用しない
//PWRTEN :パワーオンリセット有効
//MCLRDIS :外部リセット利用しない
//BOREN :ブラウンアウトリセット有効
//UNPROTECT :プログラム保護しない
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
// =================== メイン処理 =========================
main() {
ANSEL = 0x00; // デジタル入力
CMCON = 0x07; // コンパレータ未使用
//IOピンの設定
//GP0:OUTPUT->オートライトキャンセル&ドアアンロック制御(SW-OFF:0 SW-ON:1)
//GP1:INPUT->ACC電源検知(OFF:0 ON:1)
//GP2:INPUT->室内照明検知(消灯:0 点灯:1)
//GP3:INPUT->人感知センサー検知(動態感知:0 反応無し:1)
//GP4:OUTPUT->ドアロック&ハザード制御(SW-OFF:0 SW-ON:1)
//GP5:OUTPUT->人感知センサー電源制御(OFF:0 ON:1)
//0:出力 1:入力
TRISIO = 0b11001110;
WPU = 0b00000000; // プルアップ無し
Alarm_F = 0; // 初期化
Boot_F = 0; // 初期化
Getoff_F = 0; // 初期化
NextLock_F = 0; // 初期化
UnLock_S = 0; // 初期化
picinit(); // 共通設定の初期化
Sleep_F = 1; // 初回起動時は即時休眠させるため休眠処理ステータスを実行でセット

while(1) { // ここから以下を繰り返し


// =================== システム休眠 ===================
if (Sleep_F) { // 休眠フラグが実行だった場合
GPIO = 0; // 全ポート出力停止
IOC = 0x02; // ACC電源「GP1」監視
INTCON = 0x18; // 室内照明「INT&GPIE割込のみ許可 GP2/INT」監視
SLEEP(); // 休眠実行 監視しているポートで信号を検知するまでここで停止
// =================== システム復帰後の初期化 ===================
if (INTF) { // 室内照明検知で起動した場合
Boot_F = 0; // 起動フラグを室内照明検知で設定
}else { // ACC電源検知で起動した場合
Boot_F = 1; // 起動フラグをACC電源検知で設定
}
picinit(); // 共通設定の初期化
}
// =================== 検知 ===================
// 室内照明の検知
if (GPIO2) { // 点灯が検知された場合
LampOff_Ignore = PowerFailureInterval; // 電源瞬断排除時間の設定(指定時間連続で電源がOFFとなる事で確実な消灯とする)
LampResult_S = 0; // 室内照明点灯時間結果ステータスをリセット
if (Lighting_Time > RoomLampIntervalSlow) { // 室内照明点灯時間を超えて点灯した場合(ドアを開閉した)
Lamp_S = 3; // 室内照明点灯ステータスを長時間で設定
}else if (Lighting_Time < RoomLampIntervalFirst) { // 室内照明点灯時間以下で点灯している場合(エンジン始動又は手動ドアロック)
Lamp_S = 2; // 室内照明点灯ステータスを短時間で設定
}else { // 室内照明点灯時間分丁度点灯した場合(何もしていない)
Lamp_S = 1; // 室内照明点灯ステータスを通常で設定
}
}else { // 消灯が検知された場合
if (LampOff_Ignore <= 0) { // 確実な消灯を検知(照明OFF側チャタリング排除後で検知)した場合
Lighting_Time = 0; // 室内照明点灯時間リセット
if (Lamp_S != 0) { // 室内照明点灯時間ステータスが消灯以外の場合
LampResult_S = Lamp_S; // 室内照明点灯時間結果ステータスに結果を反映
}
Lamp_S = 0; // 室内照明点灯時間ステータスを消灯で設定
}
}
// ACC電源の検知
if (GPIO1) { // ONが検知された場合
AccOff_Ignore = PowerFailureInterval; // 電源瞬断排除時間の設定(指定時間連続で電源がOFFとなる事で確実なOFFとする)
ACC_F = 1; // ACC電源フラグをONで設定
}else { // OFFが検知された場合
if (AccOff_Ignore <= 0) { // 確実なOFFを検知(瞬断排除時間内のOFFは無視する)した場合
if (ACC_F) { // ACC電源がOFFに変移した場合
Getoff_F = 1; // 降車フラグを降車で設定
}
ACC_F = 0;// ACC電源フラグをOFFで設定
}
}
// 人の検知
if (!GPIO3 && GPIO5) { // 人検知有り
Detect_F = 1; // 検知フラグを反応で設定
}else { // 人検知無し
Detect_F = 0; // 検知フラグをリセット
}
// =================== 判断 ===================
Sensor_F = 0; // 人感知センサー起動フラグを停止で設定(基本は停止としておいて、この後の判断で起動が必要なら書き換える)
if (ACC_F) { // ACC電源がONの場合(エンジン始動した)
Alarm_F = 0; // 警告を解除
if (Getoff_F || Lamp_S == 3 || LampResult_S != 0) { // 降車していない状態でエンジン始動が始動した又はドアの開閉があった場合
Boot_F = 0; // 起動フラグを室内照明検知に切り替え
}
LampResult_S = 0; // 室内照明点灯時間結果ステータスをリセット
NextLock_F = 0; // 次回はドアロックフラグをリセット
if (UsedCancelHeadlight == 1) { // オートライトキャンセル機能を利用する場合
UnLock_S = 0; // アンロックステータスをリセット(エンジン停止後の室内照明点灯でオートライトキャンセルするため)
}
}else {
if (LampResult_S == 3) { // 室内照明点灯時間ステータスが長時間の場合(ドアを開閉した)
if (!Getoff_F && Stay_S != 0) { // 乗車処理中で室内照明点灯時間結果ステータスが長時間で点灯中に人の存在を検知していた場合(乗車したがエンジン始動無し)
Sensor_F = 1; // 人感知センサー起動フラグを起動で設定(乗車してすぐにエンジン始動させていないのか、乗車していないかを判断するため)
if (!GPIO5 || Stay_S == 1) { // センサー初期化
Stay_S = 2; // 人存在ステータスを監視で設定
Sensing_Time = DetectionInterval; // 不在判定時間を設定「指定時間」
Sensing_MaxTime = SavingInterval; // 最大稼働時間を設定
}
if (Detect_F) { // 検知フラグが反応の場合(人がいた)
Sensing_Time = DetectionInterval; // 不在判定時間のリセット
}else if (Sensing_Time <= 0 || Sensing_MaxTime <= 0) { // 不在判定時間内に人の存在を確認できなかった場合
Sensor_F = 0; // 人感知センサー起動フラグを停止で設定
}
}
}else if (LampResult_S == 2) { // 室内照明点灯時間結果ステータスが短時間の場合(手動ドアロックした)
Alarm_F = 0; // 警告を解除
Getoff_F = 0; // 降車フラグをリセット
}else if (!Getoff_F && Lighting_Time > 45) { // 乗車処理中で室内照明が3秒以上点灯している場合(乗車した可能性がある場合)
Sensor_F = 1; // 人感知センサー起動フラグを起動で設定(乗車していないかを判断するため)
if (!GPIO5) { // センサー初期化
Sensing_Time = RoomLampIntervalFirst; // 不在判定時間のリセット
}
if (Detect_F) { // 検知フラグが反応の場合(人がいた)
Alarm_F = UsedAlarm; // 不審者の侵入が考えられるので警告フラグを設定する
Stay_S = 1; // 人存在ステータスを存在で設定
Sensing_Time = RoomLampIntervalFirst; // 不在判定時間のリセット
}else if (Sensing_Time <= 0) { // 不在判定時間内に人の存在を確認できなかった場合
Stay_S = 0; // 人存在ステータスを不在で設定
}
}
// ドアロック/アンロック/休眠
if (Sensor_F) { // 人感知センサー起動中はロックしない
}else if (Lamp_S != 0) { // 室内照明点灯中 アンロック判断する
if (UnLock_S == 0) { // ドアアンロックが実行されていない場合
UnLock_S = 1; // アンロックステータスを許可で設定
}
}else { // ロック判断し休眠する
Sleep_F = 1; // 休眠処理ステータスを実行でセット
if (UnLock_S == 2 && (LampResult_S == 3 || (LampResult_S == 1 && (Boot_F || NextLock_F || !Getoff_F )))) { // アンロックされていたら、手動ドアロックした場合と降車しなかった場合を除いてロック
Getoff_F = 0; // 降車フラグをリセット
NextLock_F = 0; // 次回はドアロックフラグをリセット
Lock_S = 1; // ロックステータスを許可で設定
}else if (LampResult_S == 1) { // 室内照明が指定時間点灯していた場合
NextLock_F = 1; // 次回はドアロックフラグを有効で設定
}
}
}
// =================== 制御 ===================
// 人感知センサーの制御
if (!GPIO5 && Sensor_F) { // 人感知センサーの電源がOFFで人感知センサー起動フラグが起動の場合
Delay = 5; // 0.5秒遅延セット
GPIO5 = 1; // 人感知センサー電源ON
Waiting(); // 0.5秒待機(起動直後の信号に不安があるので念のため安定を狙ったマージン設定)
}else if (GPIO5 && !Sensor_F) { // 人感知センサーの電源がONで人感知センサー起動フラグが停止の場合
GPIO5 = 0;// 人感知センサー電源OFF
Stay_S = 0; // 人存在ステータスをリセット
Sensing_Time = 0; // 初期化
Sensing_MaxTime = 0; // 初期化
}
// ドアの制御
if (Lock_S == 1) { // ロックステータスが許可の場合ドアロックする
Delay = 3; // 0.3秒遅延セット
GPIO4 = 1; // ドアロック&ハザードのスイッチON
Waiting(); // 0.3秒待機
GPIO4 = 0; // ドアロック&ハザードのスイッチOFF
Lock_S = 2; // ロックステータスを実行済で設定
UnLock_S = 0; // アンロックステータスをリセット
}else if (UnLock_S == 1) { // アンロックステータスが許可の場合ドアアンロックする
Delay = 3; // 0.3秒遅延セット
if (Alarm_F) { // 警告フラグが有効の場合ハザード点灯
GPIO4 = 1; // ドアロック&ハザードのスイッチON
Waiting(); // 0.3秒待機
GPIO4 = 0; // ドアロック&ハザードのスイッチOFF
Waiting(); // 0.3秒待機
}
GPIO0 = 1; // ライト点灯キャンセル&アンロックのスイッチON
Waiting(); // 0.3秒待機
GPIO0 = 0; // ライト点灯キャンセル&アンロックのスイッチOFF
Lock_S = 0; // ロックステータスをリセット
UnLock_S = 2; // アンロックステータスを実行済で設定
}
} // ここまでを繰り返し
}
// =================== Finish ==========================

// =================== サブ処理 =========================
// =================== 割り込み =======================
// =============(65.536ms/カウントで発生) ===========
static void interrupt intr(void) { // 各種タイマー値の加減算を実行
T0IF = 0; // 内部タイマーカウントのリセット
if (Lamp_S != 0 && Lighting_Time < 65535) { // 室内照明点灯時間の加算とオーバーフロー防止
Lighting_Time++; // 室内照明点灯時間の加算
}
if (Sensing_Time > 0) { // 不在判定時間の減算オーバーフロー防止
Sensing_Time--; // 不在判定時間の減算
}
if (Sensing_MaxTime > 0) { // 人感知センサーが起動している状態で節電までの時間の減算とオーバーフロー防止
Sensing_MaxTime--;// 節電までの時間の減算
}
if (AccOff_Ignore > 0) { // ACC電源瞬断排除時間の減算オーバーフロー防止
AccOff_Ignore--; // ACC電源瞬断排除時間の減算
}
if (LampOff_Ignore > 0) { // 照明OFF側検知排除時間の減算オーバーフロー防止
LampOff_Ignore--; // 照明OFF側検知排除時間の減算
}
}
// =============== 初期化 =============================
static void picinit() { // 共通設定の初期化
GPIO = 0; // 全ポート出力停止
IOC = 0x00; // 全ポートで割り込み無効
TMR0 = 0x00; // TMR0開始位置
OPTION_REG = 0b11000111; // PullUpOff 立上がり検知 タイマー65.536ms/カウント
INTCON = 0xA0; // TMR0割込のみ許可
if (RoomLampMargin > RoomLampInterval) { // マイナス誤差反映値のオーバーフロー防止
RoomLampIntervalFirst = 0; // 最小値の0を設定
}else { // オーバーフローしない場合
RoomLampIntervalFirst = RoomLampInterval - RoomLampMargin; // マイナス誤差反映値を設定
if (PowerFailureInterval > 65535 - RoomLampIntervalFirst) { // マイナス誤差反映値のオーバーフロー防止
RoomLampIntervalFirst = 65535; // 最大値の65535を設定
}else { // オーバーフローしない場合
RoomLampIntervalFirst += PowerFailureInterval; // マイナス誤差反映値を設定
}
}
if (RoomLampMargin > 65535 - RoomLampInterval) { // プラス誤差反映値のオーバーフロー防止
RoomLampIntervalSlow = 65535; // 最大値の65535を設定
}else { // オーバーフローしない場合
RoomLampIntervalSlow = RoomLampInterval + RoomLampMargin; // プラス誤差反映値を設定
if (PowerFailureInterval > 65535 - RoomLampIntervalSlow) { // プラス誤差反映値のオーバーフロー防止
RoomLampIntervalSlow = 65535; // 最大値の65535を設定
}else { // オーバーフローしない場合
RoomLampIntervalSlow += PowerFailureInterval; // プラス誤差反映値を設定
}
}
Lighting_Time = 0; // 初期化
Sensing_Time = 0; // 初期化
Sensing_MaxTime = 0; // 初期化
ACC_F = 0; // 初期化
Detect_F = 0; // 初期化
Sensor_F = 0; // 初期化
Sleep_F = 0; // 初期化
Delay = 0; // 初期化
AccOff_Ignore = 0; // 初期化
LampOff_Ignore = 0; // 初期化
Lamp_S = 0; // 初期化
LampResult_S = 0; // 初期化
Lock_S = 0; // 初期化
Stay_S = 0; // 初期化
}
// =================== 遅延 =======================
static void Waiting() { // Delay×100ms遅延
for(int msec=0; msec<=Delay; msec++) // Delay回繰り返し
{
__delay_ms(100); // 100ms遅延
}
}
// =================== ProgramEnd ==========================

関連パーツレビュー

イイね!0件




タグ

関連整備ピックアップ

LEDフォグランプ切れ

難易度:

まだまだブルー化!ナンバーランプ交換

難易度:

スマートキーの電池交換しました(2024.03)

難易度:

車内をより青く!

難易度:

右リアドアロックアクチュエーター

難易度:

VICSビーコンユニット

難易度:

関連リンク

この記事へのコメント

2010年4月6日 16:20
これ凄く欲しいです。

制作、御願い出来ませんでしょうか?
コメントへの返答
2010年4月6日 20:26
ようやく安定して動作するようにはなったので、制作受けてみようかな(;^_^A

でも、受けるの怖い・・・((((;゜Д゜)))
2017年7月30日 5:15
はじめまして
凄くいいでね
受付可能になってたらお願いしたいのですが…
ご連絡お待ちしています
コメントへの返答
2017年7月30日 8:06
ごめんなさい、ご迷惑をおかけすることになりますので、制作受付はしないことにしています。

プロフィール

電気的なパーツ大好き! 2009年10月10日納車 エスティマアエラスGエディション ACR50W 純正風を崩さないレベルでいじっていきますw ...
みんカラ新規会員登録

ユーザー内検索

愛車一覧

トヨタ エスティマ トヨタ エスティマ
2009年10月10日納車 アエラスGエディション 2.4L シルバー 7人乗り MOP ...
ヘルプ利用規約サイトマップ

あなたの愛車、今いくら?

複数社の査定額を比較して愛車の最高額を調べよう!

あなたの愛車、今いくら?
メーカー
モデル
年式
走行距離(km)
© LY Corporation