旧ブログ「結果 Oh! Life」は新ブログ「新・結果オーライ」として生まれ変わりました♪

電動スライドドアの予約ロックの自作に挑戦⑥:インロック対策編

  • 2026.10.30
  • 車
電動スライドドアの予約ロックの自作に挑戦⑥:インロック対策編
  1. ①:基礎知識編
  2. ②:下調べ編
  3. ③:回路図編
  4. ④:実装編
  5. ⑤:調整編
  6. ⑥:インロック対策編 ◀今ココ

ちょっとややこしい事象が発生したので追記です☝

今日、たまたま後席で作業したかったので、スライドドアを開けて、乗り込んで、作業をしようとしてたら、ガチャッと勝手にロックが作動しました😳💦
「そういえば先日もそんなことがあったわ!」と思い出してGoogle AIに聞いたら、「ソリオMA36Sは解錠後にドアを開けなかったらしばらくして自動的に再ロックする機能があるので、たまたま何らかの原因でドアが開いたことを検知できなかったのかも?」というので、「あっ」と気付きました。
そうです、今回作った予約ロック自作キットは、ドア操作後10秒間カーテシ線を分断する仕様なので、その間に乗り降りが完了してしまうと、車両のタイマーロック機能が働く条件が揃ってしまうのです☝

ソリオ取説より
ソリオ取説より

ただ幸いなことに、この状態で車内からドアノブを引いてスライドドアを開けてもセキュリティアラームが鳴ることはなかったので助かりました💦笑
でも、よく考えたら、勝手にロックがかかると言うことは、スライドドアを開けてリモコンキーを車内に置いたままうっかり出てしまうとインロックが起こり兼ねないということです☝💦
なので、何か対策を考えることにしました。

手っ取り早いのは、現在の作動時間の10秒を短くする方法です。
確かに、いつもの予約ロックの流れとしては、スライドドアのドアノブやスイッチ動作の後すぐに運転席のリクエストスイッチを押しちゃうので、実は10秒は長すぎます。3秒もあれば十分なのです。一方、スライドドアを開けて荷物だけ載せて閉めちゃうケースがあるとしても、流石に開け閉めだけでも3秒では終わらないので、タイマーロック機能の作動は回避できます。
なので、プログラムを書き換えて予約ロックの動作保持時間を3秒に設定できるようにしました。

動作保持時間を変更できる変数を追加
動作保持時間を変更できる変数を追加

こちらが書き換えたプログラムです。

#include <xc.h>

#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF

#define _XTAL_FREQ 4000000

// 動作を保持する秒数
#define RELAY_ON_SECONDS 3

// ストライクゾーンを2.45Vの前後(2.20V-2.90V)に絞り込み
#define THRESHOLD_LOW  450   // 2.20V (下限) 1023/5*2.2≒450
#define THRESHOLD_HIGH 593   // 2.90V (上限) 1023/5*2.8≒593

// 通過ノイズを弾くため10回(100ms)連続一致を監視
#define ON_FILTER_COUNT 10

void main(void) {
    CCP1CON = 0x00;
    CMCON0  = 0x07;
    OPTION_REGbits.nGPPU = 1;
    WPU = 0x00;
    GPIO = 0x00;

    TRISIO = 0b00111011;

    ANSELbits.ANS0 = 1;
    ANSELbits.ADCS = 1;

    ADCON0bits.ADFM = 1;
    ADCON0bits.VCFG = 0;
    ADCON0bits.CHS  = 0;
    ADCON0bits.ADON = 1;

    GP2 = 0;
    __delay_ms(1000);

    unsigned int relay_timer = 0;
    unsigned int adc_val10 = 0;
    unsigned int low_voltage_counter = 0;

    while(1) {
        __delay_ms(10);

        ADCON0bits.GO_DONE = 1;
        while (ADCON0bits.GO_DONE == 1) {
            __nop();
        }
        adc_val10 = (unsigned int)((ADRESH << 8) | ADRESL);

        // 電圧範囲 & 100ms時間積分判定
        // 2.20V-2.90Vの電圧範囲のみカウントアップ
        if (adc_val10 >= THRESHOLD_LOW && adc_val10 <= THRESHOLD_HIGH) {
            low_voltage_counter++;

            // 10回(100ms)連続ならボタン操作とみなしてON!
            if (low_voltage_counter >= ON_FILTER_COUNT) {
                GP2 = 1;
                relay_timer = RELAY_ON_SECONDS * 100;   // 動作秒数代入 (10ms周期なので100倍)
                low_voltage_counter = ON_FILTER_COUNT;   // カウンターオーバーフロー防止
            }
        }
        else {
            // 範囲から一瞬でも外れたらリセット!
            low_voltage_counter = 0;

            if (relay_timer > 0) {
                relay_timer--;
                if (relay_timer == 0) {
                    GP2 = 0;
                }
            }
        }
    }
}

流石にもうこれ以上イレギュラーは起きないと思うけど、また何かあればご報告します。

以上、参考になれば幸いです。

このエントリーをはてなブックマークに追加