和室の隅に置いたこたつタイマーです。

こたつタイマー電子工作 DIY の話もPart3まで進みましたが、なかなか話が進みませんね。

今日は、ケース加工の話をします。

会社の帰りに、千代町から呉服町に移転したマルツパーツ博多で部品を買って

来ました。 リレー¥432は今泉のカホパーツセンターで購入。

オムロンのG2R-1S DC5V 0.1Aで、120V 10A制御できるリレーです。

 パーツ屋で買った部品くん達

ケースは、タカチのプラスチックケース SB-9597A ¥900

ヒューズホルダー \180、ヒューズ(10A) 2本 ¥100

DS122 ACトグルスイッチ \284、黒のプッシュSW ¥220 

2スケのACコード 1m¥220、ACインレット¥102

ACプラグ(黒) \120 ゴムブッシュ φ9 ¥30等々

手持ち部品抜きで、¥2500くらいになりましたよ。

電源として、手持ちの10V ACアダプタや、Arduino基板、

基板の部品なんかを加えると、¥3500~4000くらいでしょうか?

まぁ、そんなことは置いておいて、電源とリレーと配線を考えて

ケース加工の加工図をいつものようにイラストレータで設計します。

それを、ラベル紙で印刷して、部品と合わせてチェックします。

 前後のパネルは1mmのアルミ板でした

今回、ケースのネジ止めのためのボスがスイッチに干渉して、当たり

が出てしまいました。

  あちゃー、当たってしまいました!

  裏は配置OKの模様

必要な作業ですね、現物での確認。

気を取り直し、ボスを避けてスイッチが取りつけられるように、穴位置を

動かして、再度 現物確認。今度はOKそうです。

  直しましたが、LED基板とギリギリです


またまた、いつものようにカミサンのガーデンルームの片隅で作業を行います。

 BOSHのドライバドリルで穴を開けます


今回は、新兵器 ステップドリル¥1300が登場! これで14mmまで開けられます!

(本当は20mmくらいまで開けられるのが欲しかったが、2千円以上します)

 左下がステップドリルの刃です

これまで、ドリル刃が6。5mmまでしかなかったので、それ以上はテーパリーマで

水戸黄門を歌いながら(?) 穴を広げていたのに比べると雲泥の効率UPです。

まぁ、相手がアルミの1mmと薄いので、非常に調子いいのですが、厚い板になったら

どうなんでしょうかね?

ステップドリルの注意として、穴を広げすぎるとアウトですので、ノギスを使いながら

慎重に拡げる必要があります。

  2桁のLED基板もスペーサで取付

さぁ、終了しました。  今回、ステップドリルの御蔭で調子いですね。

押しボタンSWだけは、18mmくらいの穴だったので、14mmからリーマで広げました。

さて、ケースの加工も終わったので、Arduinoの設計に戻ります。

前回、4桁カウンタの設計まででしたね。

今回は、カウントダウン・カウンタを設計します。

実際の機器の仕様では、2時間は20、最大5時間は50と表示するので、カウント

1当たり、6分になりますが、デバッグではカウント1を1秒で分りやすくします。

出来上がったら、カウンタの動作を1/360倍 にすればいいわけです。

【閑話休題】

先日 作ったブレッドボードで再度 プログラムを設計していきます。

部品を入れた段ボールでデバッグ!

まえに参照したHPは、我々初心者にとって非常に分り易かったのですが、ダイナミック

点灯の4桁走査(スキャン)を Delay()関数をつかったりしていたので、このままだと

表示しかできず、ブザーを鳴らしたり、スイッチの入力を受け付けたりすることが

同時に行うことができません。

これらの動作を同時に行うには、割り込みという仕組みを使う必要があるのですが

先に参考にしたページでは、なかなか これから先が難しそうです。

仕方がないので、英語のHPをググってみましたよ。キーワードはArduino

COUNTDOUN TIMIER。 また、スイッチのチャッタリング防止は、button debounce

(ボタン デバウンス)らしいです。 ずいぶん違いますね、日本語と英語の表現。

押しボタンSWを押すと、カウント5ずつカウントアップするが、50が最大でそれ以上

上がらない処理が、今回のプログラムで一番苦労しました。

タイマーがカウントアップしたら、ブザーを5回鳴らしたり、電源ONでリレーをONして

同じようにカウントアップしたら、リレーを切るような処理は、そんなに難しくないですね。

また、カウントアップしても、押しボタンを押したら、10(1時間)になって再度 リレー

がONする仕様は、現物合わせで追加しました。(電源ON時は20(2時間))

ブレッドボードで設計が確認できたら、実機に基板を載せていきます。

まずは、ACアダプタとACスイッチ、ヒューズ等の敗戦から開始。

  CPUの上にリレー基板を載せます

秋月電気通商のATMega基板に必要最小限の部品を載せて、プログラムした

CPUを差し込みます。

http://akizukidenshi.com/catalog/g/gP-04399/

最低限必要な部品は、今回 10V のACアダプタを使いますので、IC2 7805 5V3端子

レギュレータ、レギュレータ回りのC4,C5<C6のパスコン、IC1 CPUの28Pのソケット、

CPUの16MHz水晶、パスコンC1、動作確認用の13PにつながっているLEDとR2 1KΩ

くらいでしょうか? 基板だけなら150円と安いので、デバッグ時は前のUSB付きのキット

で行うとして、実機はこれで十分です。(500円もかからない)

  SWから、リレー、ヒューズ、ACインレットに配線

ACアダプタに、5Vのものを使えば、レギュレータも必要ありませんね。

SELの端子で、USBからの電源か、ACアダプタからの電源かを選択するので、ここの

ジャンパー接続も忘れないようにしてくださいね。

  CPUから7セグLEDに配線、ブザーも

  完成―パチパチ!

以下に、今回のプログラムを載せますねー。

プログラムの説明は次回にします。

(あ”ー、疲れたww)

長文・駄文で失礼しましたー。

それではまったねー (´・ω・`)

// 【こたつタイマー 6分単位 Arduinoプログラム】

【2015.5.30 Arduino1.06版  HTMLでコピーして貼り付けに改善】

const int cathode_pins[] = {1,2,3,4,5,0,6};    // カソードに接続const int buttonPin = 7;    // the number of the pushbutton pinconst int LED1  = 13 ;    // LED blink 1sec durationconst int speker = 8 ; //speker on pin 8const int digit1 = 9; // Display digit 1const int digit2 = 10; // Display digit 2const int RELAY_ON = 12; // AC Relay Control//int ledState = HIGH;         // the current state of the output pinint k=0 ;  // Buzzer counterint Count_up =0 ; // Count up state int buttonState;             // the current reading from the input pinint lastButtonState = LOW;   // the previous reading from the input pinconst int number_of_cathode_pins = sizeof(cathode_pins) / sizeof(cathode_pins[0]);// 配列の数int start_num= 20  ;  // Number to countdown from 20min=20*600sec initial 2HOURSint start_num1 = start_num;  // the following variables are long's because the time, measured in miliseconds,// will quickly become a bigger number than can be stored in an int.long lastDebounceTime = 0;  // the last time the output pin was toggledlong debounceDelay = 50;    // the debounce time; increase if the output flickersunsigned long time;// setup() は,最初に一度だけ実行されるvoid setup() {  for (int i = 0; i < number_of_cathode_pins; i++) {    pinMode(cathode_pins[i], OUTPUT);  // cathode_pinsを出力モードに設定する  }  pinMode(digit1, OUTPUT);  pinMode(digit2, OUTPUT);  pinMode(speker, OUTPUT); // speker on pin 8  pinMode(RELAY_ON, OUTPUT);   pinMode(LED1, OUTPUT);   pinMode(buttonPin,INPUT);  // Button Input        // set initial AC Relay State  digitalWrite(RELAY_ON,HIGH);}void loop() {      // read the state of the switch into a local variable:   int reading = digitalRead(buttonPin);  // If the switch changed, due to noise or pressing:   if (reading != lastButtonState) {     // reset the debouncing timer     lastDebounceTime = millis();   }         if ((millis() - lastDebounceTime) > debounceDelay) {     // whatever the reading is at, it's been there for longer     // than the debounce delay, so take it as the actual current state:     // if the button state has changed:    if (reading != buttonState) {       buttonState = reading;       // only increment ciunrter if the new button state is HIGH       if (buttonState == HIGH) {//         ledState = !ledState;//     If button is pressed, increase timer number          if (Count_up == 0 ) {         start_num = start_num + 5 ;// If button is pushed add 30min//             if ((start_num -  (millis()/1000))> 50) { //              start_num = 50 + (millis()/1000) ;//         360sec =6min  Upper Limit = 50 * 6min = 300min (5 Hourrs)           if (start_num - (millis()/360000) > 50 ) {            start_num = (50 + (millis()/360000)) ;            }         }//     If state is count up, restart from initial.         else         {         Count_up = 0;         k = 0;      // Buzzer is Initialized         digitalWrite(RELAY_ON,HIGH); // Power_Relay is ON//         start_num = 10 + (millis()/1000);//      restart from 10 x 6min = 1 Hour         start_num = 10 + (millis()/360000);         }          }     }   }              // save the reading.  Next time through the loop,   // it'll be the lastButtonState:        lastButtonState = reading;  //start_num limitation 50   //long startTime = millis();//  if((millis()/1000) < start_num){//    displayNumber(start_num -(millis()/1000));// 360sec =6 min =36000 millis() count   if((millis()/360000) < start_num){    displayNumber(start_num -(millis()/360000));     if ((millis()/500)% 2 == 1 ) {      digitalWrite(LED1, HIGH);     }    else {      digitalWrite(LED1, LOW);      }  }  else  {    // reached zero, flash the display    Count_up =1; // count up state    k=k+1;   // count_up buzzer count    time=millis();    while(millis() < time+200) {      displayNumber(0);  // display 0 for 0.2 second      digitalWrite(RELAY_ON,LOW); //TIME UP Relay OFF     if(k<6) { tone (8, 1000, 100);     }    }    time=millis();        while(millis() < time+200) {      lightNumber(10);  // Turn display off for 0.2 second    }  }  }// 2ケタの表示を計算するvoid displayNumber(int toDisplay) {  long beginTime = millis();  for(int digit = 2 ; digit > 0 ; digit--) {    //Turn on a digit for a short amount of time    switch(digit) {    case 1:      digitalWrite(digit1, HIGH);      break;        case 2:      digitalWrite(digit2, HIGH);      break;    }//Turn on the right segments for this digit//    lightNumber(toDisplay % 6);//    toDisplay /= 6;    lightNumber(toDisplay % 10);    toDisplay /= 10;//    delayMicroseconds(DISPLAY_BRIGHTNESS);     //Display digit for fraction of a second (1us to 5000us, 500 is pretty good)    //Turn off all segments    delay(2) ;    lightNumber(0);     //Turn off all digits    digitalWrite(digit1, LOW);    digitalWrite(digit2, LOW);  }////  while( (millis() - beginTime) < 10) ;   //Wait for 20ms to pass before we paint the display again}// 7SEG表示パターンconst int digits[] = {  0b00111111, // 0  0b00000110, // 1  0b01011011, // 2  0b01001111, // 3  0b01100110, // 4  0b01101101, // 5  0b01111101, // 6  0b00100111, // 7  0b01111111, // 8  0b01101111, // 9  0b00000000, // 10}; // 1けたの数字(n)を表示するvoid lightNumber (int n) {  for (int i = 0; i < number_of_cathode_pins; i++) {    digitalWrite(cathode_pins[i], digits[n] & (1 << i) ? LOW : HIGH);  }}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です