ヘッドライト減光装置つづき2

こんにちは

本日午後からですが半日バイクに乗ってきました!

今回は、問題なく動作しました

やはり入出力回路を電気的に切り分ける必要があったのでしょう

ということです

この1週間ヘッドライト付けたり、外したりと疲れました┐( ̄ヘ ̄)┌ フゥゥ~

これで、次に進めます

お約束事ですが、自分はすべてを理解している訳ありませんので

ソフトのコードの事とか、ハードのことが本当にこれが正しいのか

わかりません

自分もよく他の方のブログを参考にするので、今度は同じ思いで来られた方に

少しでも参考にと思い出来るだけ公開するつもりですが

あくまで趣味の世界で行っていますので、すべて自己責任でお願いします

前回も書きましたが、初めてのArduinoを利用したものなので

ソフトのインストールから、ブートローダーの書き込み方

プログラムの転送の仕方といろいろ障害がありましたが

Arduinoと出会って約1ヶ月でここまで来ました

やはり、漠然とプログラムの勉強をするより何か目標を決めて

製作したほうが勉強になります

たかが、ライトをON、OFFするだけなのにいろいろ勉強になりました

実際、秋月電子で販売している ⇒  ATMEGA168/328マイコンボードキット

ボードに書き込むためのソフト  ⇒  ArduinoIDE

これだけあれば、とりあえずマイコンにコードを書き込めます

今回の使用した部品のコストも合計で1000円位です

AVRマイコン  1個  250円

マイコン動作に必要なセラロック  1個 35円

出力を制御するFET   1個 100円

12vから5vに落とすレギュレーター   1個  40円

入出力を電気的に切り離すフォトカプラ  1個 80円✕2個

基板  1枚 200円程度

その他、抵抗、コンデンサも1個数十円程度です

あとは、挫折しない根性でしょうか??(* ̄ー ̄*)

まずは、動作させるためのコードです

==============ここから始まり========================

1 //—————————————————

2 //ヘッドライト減光装置ーーーー2015/4/10  Yamasawa_Masahiro

3 //Rev 2.11

4 //—————————————————-

5 //boolean Light_State = LOW;

6

7 boolean Loff_Flg = false;

8 boolean In_State;

9 const int Set_Time = 1500;//不感時間の

10 const int Delay_Time = 1000;//チェンジの無効時間

11 const int Led_Out = 9;

12 const int N_In = 3;

13 const int Light_Wait_Val = 20000;//ライト消灯までの時間

14 const int Light_Low_Val = 3;//減光時の明るさ

15 const int Delay_On_Time = 10;

16 const int Delay_Off_Time = 15;

17 const int State_Led = 12;//運転状態表示用Led

18 int Max_Val = 255;//明るさの最大値

19 int Min_Val = 0;//明るさの最小値

20 long Time_Val;

21 //—————————————————-

22 //—————————————————-

23 //===========================================

24 //入力の状態を簡単に変更できるように

25 //関数を作成

26 boolean  Get_Stats(void) {

27   //入力がLOWでニュートラルの場合

28   return digitalRead(N_In);

29   //入力がHIGHでニュートラルの場合

30  //return !digitalRead(N_In);

31  }

32 //———————

33 boolean Chk_Chg(boolean x, int val) {

34   //xがtrueで減光時falseで点灯時

35  //yはその時の明るさの数値

36  //入力に変化がないときはなにもしないで抜け出す

37  if (In_State == Get_Stats()) {

38    Max_Val = 255;

39    Min_Val = 0;

40    return false;

41  }

42    //入力に変化があったなら

43  if (x) {

44    //減光時

45    Min_Val = val;

46   } else {

47    //点灯時

48    Max_Val = val;

49  }

50   return true;

51  }

52 //—————————————————-

53 //Ledの点滅サブルーチン

54 void Led_Blink(int C, int P, int Dly) {

55  for (int s = 0; s < C; s++)

56   {

57    digitalWrite(State_Led, HIGH);

58    delay(P);

59    digitalWrite(State_Led, LOW);

60    delay(Dly);

61  }

62  }

63 //

64 //

65

66 void setup() {

67  // put your setup code here, to run once:

68

69  pinMode(N_In, INPUT_PULLUP);

70

71  pinMode(Led_Out, OUTPUT);

72  pinMode(13, OUTPUT);

73  pinMode(State_Led, OUTPUT);

74  Serial.begin(9600);

75  In_State = Get_Stats();

76  digitalWrite(13, !In_State); //13番をニュートラル表示と同じに

77  //——————————–

78  //入力と出力を

79  if (In_State) {

80    analogWrite(Led_Out, 255);

81   } else {

82    analogWrite(Led_Out, 0);

83  }

84  //——————————–

85  //——————————–

86  Serial.println("SetUp—start!");

87  }

88 //===========================================

89 //===========================================

90 //===========================================

91 //===========================================

92

93 //———————–

94 //———————-

95

96 void loop() {

97   //==========================================

98   //現行時間が一定時間すぎれば完全に消灯

99   //Serial.println(LOFF_Flg);

100   if (Loff_Flg) {

101    // Led_Blink(3,400);//状態表示を3回表示

102    if (Time_Val + Light_Wait_Val < millis()) {

103      analogWrite(Led_Out, 0);

104      Loff_Flg = false;

105      Serial.println("Light_OFF");

106    }

107  }

108  //一定時間が経過したら、入力の状態を確認

109

110  delay(Delay_Time);

111  //記憶している状態と現在の状態が同じなら何もしない

112   if (In_State == Get_Stats()) {

113    if (In_State) {

114      //ライトONの状態なら

115      Led_Blink(1, 10, 0); //状態表示を1回表示

116   } else {

117      //ライトOFFの状態なら

118      if (Loff_Flg) {

119        //減光時

200        Led_Blink(2, 10, 400); //状態表示を2回表示

201      } else {

202        //完全消灯時

203        Led_Blink(1, 500, 400); //状態表示をゆっくり1回表示

204      }

205    }

206    return;

207   }

208  //ここからスタート

209  //

210  //

211

212  Serial.println("Event Start");

213  Loff_Flg = false;

214  //状態の食い違いを合わせる

215  In_State = Get_Stats();

216

217  //———————————

218  digitalWrite(13, !In_State);

219  if (In_State) {

220   //徐々に点灯

221    for (int Led_Val = Min_Val; Led_Val < 256; Led_Val++)

222    {

223      //Serial.println(led_val);

224      analogWrite(Led_Out, Led_Val);

225     delay(Delay_On_Time);

226      if (Chk_Chg(false, Led_Val)) {

227        return; //入力に変化があったら抜け出す

228      }

229    }

230    } else {

231    //徐々に消灯

232    for (int Led_Val = Max_Val; Led_Val > Light_Low_Val; Led_Val–)

233    {

234      //Serial.println(led_val);

235      analogWrite(Led_Out, Led_Val);

236      delay(Delay_Off_Time);

237      if (Chk_Chg(true, Led_Val)) {

238        return; //入力に変化があったら抜け出す

239      }

240    }

241    //————————————

242    Time_Val = millis();

243    Loff_Flg = true;

244

245    //——————————————————

246   }

247   }//End

======================ここで終わり=============================

/記号で始まる部分はコメントです

Serialで始まるコードは動作検証のためにPCに表示させるためのもので

実際にはなくても関係ありません

※7行目から20行目

 各変数を宣言しています

 アナログポートを利用して半固定抵抗を付けて各値をハード的に設定するのも

 可能だと思いますが、最初設定したら変更することがないので

 変数の中で宣言してるだけです

 実際、今回使用しているポートは入力1個、出力1個、表示用に2個使用しているだけです

 ある意味もったいない・・

※26から31行

 入力の接続方法でHiとLowの動作が違うので

 変更する場合ここを書き換えるだけで済むように

 関数を作成しました

※33から51行目

 動作中ニュートラルの動作に変更があった時

 現在のライトの明るさを取得します

※53から62行目

 マイコンの動作状況を把握するためのLEDを点滅させる関数です

※66から87行目

 この部分は、電源が入った時一度だけ実行される部分です

 変数の初期化、入出力の設定を行います

※96から247行目

 この部分がループされて実行されます

※100から107行目

 この部分は減光して一定時間がすぎれば消灯するためのコードです

※110行目

 一定時間待機します(現在は1秒)

 これは、ギヤがローからセカンドに入る場合とか一瞬の動作変更を

 無視するためにタイムラグを取っています

※112から207行目

 これは上記のタイムラグを経過したあと

 ニュートラルの状態を確認して今までと同じ状態であれば

 ここでループを抜けだしてこれ以降のコードを実行しません

※212から247行目

 ここで、ニュートラルの状態によって、ゆっくり点灯か

 ゆっくり消灯か判断しています

 PWM出力ができるのでパルスのディユーティ比を変更して明るさを変えています

 0から255の256段階変更できます

最初ニュートラルの割り込みを

attachInterrupt関数を利用して割り込みをかけたのですが

うまく行かず四苦八苦してようやくこのコードになりました

疲れたので今日はここまで

コード上、おかしいところを発見したら連絡ください

明日もバイクでラジコンに行くので、壊れるかもしれません

最後に回路図載せます、これはおかしいと思うところがあれば連絡ください

尚、バイクの搭載後でもコードを変更できるようにシリアル接続できるように

ピンヘッダーも取り付けました

※2015/04/14 マイコンのピン配置が間違ってましたので図面差し替えました

2

では、m(_ _)m  今度は何つくろーかな