waiasu’s diary

バーグマン200のカスタムをメインに。

arduinoでウインカーポジション

arduinoでウインカーポジション書いてみました。

はじめて使ってみたのですがお手軽で良いですね。起動の速さとコンパクトさでnano everyを選択。

キーオンでニードルスイープ?に同期して徐々に明るく〜暗く。その後じわっと点灯見たいな感じです。pwm出力の最初が一瞬なぜか不安定なのでおまじない的なの入れてます。上手くごまかせているので良しとします。デューティーが高い状態でオフにして低い状態でスタートするとダメなようです。

int VOL=14;  //ボリューム入力
int WIN=15;  //ウインカー入力
int PO1=9;   //ポジション出力1
int PO2=10;  //ポジション出力2
int WFS=600; //起動待ち(ms)
int CHA=50;  //チャタリング確認時間(ms)
int SWS=5;   //スイープスピード調整(ms)
int SWF=80;  //スイープスフラッシュ調整(ms)
int WFR=1000;//再点灯待ち(ms)

void setup() {
  pinMode(PO1,OUTPUT);
  pinMode(PO2,OUTPUT);
  pinMode(VOL,INPUT);
  pinMode(WIN,INPUT);
  Serial.begin(9600);

  for (int c=0; c<WFS; c++) {
    delay(1);
    if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
      delay(CHA); //待って
      if (digitalRead(WIN)==HIGH) { goto setup_end; } //まだ入力があれば終了
    }
  }

  analogWrite(PO1,1); //点灯時ゆらぎ対策
  digitalWrite(PO1,LOW);
  analogWrite(PO2,1);
  digitalWrite(PO2,LOW);

  for (int v=0; v<256; v++) { //ゆっくり点灯
    analogWrite(PO1,v);
    analogWrite(PO2,v);
    delay(SWS);
    if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
      delay(CHA); //待って
      if (digitalRead(WIN)==HIGH) { goto setup_end; } //まだ入力があれば終了
    }
  }

  for (int c=0; c<SWF; c++) { //消灯
    digitalWrite(PO1,LOW);
    digitalWrite(PO2,LOW);
    delay(1);
    if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
      delay(CHA); //待って
      if (digitalRead(WIN)==HIGH) { goto setup_end; } //まだ入力があれば終了
    }
  }

  for (int c=0; c<SWF; c++) { //点灯
    digitalWrite(PO1,HIGH);
    digitalWrite(PO2,HIGH);
    delay(1);
    if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
      delay(CHA); //待って
      if (digitalRead(WIN)==HIGH) { goto setup_end; } //まだ入力があれば終了
    }
  }

  for (int c=0; c<SWF; c++) { //消灯
    digitalWrite(PO1,LOW);
    digitalWrite(PO2,LOW);
    delay(1);
    if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
      delay(CHA); //待って
      if (digitalRead(WIN)==HIGH) { goto setup_end; } //まだ入力があれば終了
    }
  }

  for (int v=255; v>-1; v--) { //ゆっくり消灯
    analogWrite(PO1,v);
    analogWrite(PO2,v);
    delay(SWS);
    if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
      delay(CHA); //待って
      if (digitalRead(WIN)==HIGH) { goto setup_end; } //まだ入力があれば終了
    }
  }
  setup_end:;
  digitalWrite(PO1,LOW); //中断時の消灯
  digitalWrite(PO2,LOW);
}

void loop() {
  if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
    delay(CHA); //待って
    if (digitalRead(WIN)==HIGH) { //まだ入力があれば
      digitalWrite(PO1,LOW); //ポジションを消す
      digitalWrite(PO2,LOW);
    }
   
  } else { //ウインカー入力がなければ
    delay(CHA); //待って
    if (digitalRead(WIN)==LOW) { //まだ入力がなければ
      for (int c=0; c<WFR/10; c++) { //再点灯待ち
        delay(10);
        if (digitalRead(WIN)==HIGH) { goto loop_end; } //ウインカー入力があれば即終了
      }

      int e=analogRead(VOL)/4; //値を読んで1/4に

      analogWrite(PO1,1); //点灯時ゆらぎ対策
      digitalWrite(PO1,LOW);
      analogWrite(PO2,1);
      digitalWrite(PO2,LOW);
     
      for (int v=0; v<e; v++) { //ゆっくり点灯
        analogWrite(PO1,v);
        analogWrite(PO2,v);
        delay(SWS);
        if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
          delay(CHA); //待って
          if (digitalRead(WIN)==HIGH) { goto loop_end; } //まだ入力があれば終了
        }
      }

// コメントアウトを外してループをコメントアウト
// 入力で揺らぐが常にボリュームで調整可能に
// ここから
//      while(1) {
//        int vt=0;
//        for (int c=0; c<10; c++) {
//          int v=analogRead(VOL)/4;
//          vt=vt+v;
//        }
//      vt=vt/10;
//      Serial.println(vt);
//      analogWrite(PO1,vt);
//      analogWrite(PO2,vt);
// ここまで
        while(1) { //ループ
        if (digitalRead(WIN)==HIGH) { //ウインカー入力があれば
          delay(CHA); //待って
          if (digitalRead(WIN)==HIGH) { goto loop_end; } //まだ入力があれば終了
        }
      }
    }
  loop_end:;
  digitalWrite(PO1,LOW); //中断時の消灯
  digitalWrite(PO2,LOW);
  }
}