こんにちは
本日午後からですが半日バイクに乗ってきました!
今回は、問題なく動作しました
やはり入出力回路を電気的に切り分ける必要があったのでしょう
ということです
この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 マイコンのピン配置が間違ってましたので図面差し替えました
では、m(_ _)m 今度は何つくろーかな