セリカのGT-4じゃねぇGT-FOURだ・Full time Onroad Unlimited Reardrive・思いついたwに関するカスタム事例
2025年09月06日 00時17分
しばらく冬眠と言ったな。
あれは嘘だ。
⋯Systemを思いついたのでメモ代わりに投稿してから冬眠します。
たぶん明日には完全に忘れてると思うので。
まだ思いついただけでプログラムの動作の検証もしてないのだけれど。
とりあえず試作したデータを。
以下プログラム
const byte vssPin = 2; // 車速パルス入力
const byte brakeControlPin = 8; // ブレーキランプ制御出力
volatile unsigned int pulseCount = 0;
unsigned long lastSpeedCheck = 0;
float speedPrev = 0.0;
// 設定値
const float speedFactor = 0.015; // 1パルス = 0.015 km/h
const float decelThreshold = 5.0; // 即点灯の減速度(km/h/s)
const unsigned long sustainedDecelTime = 5000; // 5秒(ms)
const float stopThreshold = 1.0; // 停車判定(km/h未満)
const unsigned long minOnDuration = 1000; // 最低点灯時間(ms)
// 状態管理
bool isSustainedDecel = false;
unsigned long decelStartTime = 0;
bool brakeLampOn = false;
unsigned long brakeOnTime = 0;
void setup() {
pinMode(vssPin, INPUT_PULLUP);
pinMode(brakeControlPin, OUTPUT);
digitalWrite(brakeControlPin, LOW);
attachInterrupt(digitalPinToInterrupt(vssPin), countPulse, RISING);
Serial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastSpeedCheck >= 100) {
float speedNow = pulseCount * speedFactor;
float decel = (speedPrev - speedNow) / 0.1; // km/h/s
Serial.print("Speed: ");
Serial.print(speedNow);
Serial.print(" km/h | Decel: ");
Serial.print(decel);
Serial.println(" km/h/s");
// 停車判定
if (speedNow < stopThreshold) {
if (brakeLampOn && currentTime - brakeOnTime >= minOnDuration) {
brakeLampOn = false;
}
isSustainedDecel = false;
decelStartTime = 0;
}
// 即点灯条件
else if (decel >= decelThreshold) {
if (!brakeLampOn) {
brakeLampOn = true;
brakeOnTime = currentTime;
}
isSustainedDecel = false;
decelStartTime = 0;
}
// 減速継続判定
else if (decel > 0) {
if (!isSustainedDecel) {
decelStartTime = currentTime;
isSustainedDecel = true;
} else if (currentTime - decelStartTime >= sustainedDecelTime) {
if (!brakeLampOn) {
brakeLampOn = true;
brakeOnTime = currentTime;
}
}
}
// 加速または速度一定
else {
isSustainedDecel = false;
decelStartTime = 0;
if (brakeLampOn && currentTime - brakeOnTime >= minOnDuration) {
brakeLampOn = false;
}
}
// ブレーキランプ制御
digitalWrite(brakeControlPin, brakeLampOn ? HIGH : LOW);
speedPrev = speedNow;
pulseCount = 0;
lastSpeedCheck = currentTime;
}
}
void countPulse() {
pulseCount++;
}
強めのエンブレなどの減速が発生した際に後続車にブレーキランプを点灯させて知らせるシステム。
Arduino Nanoに車速パルスを拾わせ続けて規定値を超えた減速が発生した際にブレーキスイッチの12VをFETのコントロールでボディにGNDさせると言う。
追突されるリスク軽減のために。