はじめに
以前にelchikaというハードウェアの開発者コミュニティのコンテストに出品した製作物となりますがNTP時刻合わせ置き時計をご紹介します。この電子工作は、キーパーツとして、人感センサ、7セグメントLED、リアルタイムクロックを使用して製作しています。
皆さん、電子工作と言えば、まずは時計を作りたくなりませんか?
詳しくはelchikaサイトのほうにもプログラムなど含めて記載していますので宜しければご参照下さい。
外観の紹介
完成形は下の写真の通りです。
LEDディスプレイの上段には年月日を、下段には時分秒を表示しています。
LEDなので視認性はかなり良いのですが、より良くする改善点として、LEDディスプレイの前面に半透明の光拡散板でカバーする事で、LEDの非表示部分を見えなくすると、時間がくっきりと見やすくなると思います。
3Dプリンターで作成した筐体に色紙でカバーしています。
時計の上部は、ある程度の面積のある平面を用意しているので、小さめの人形などちょっとした置物を置くこともできるのでおしゃれになるかと思います。
材料と作り方
〇主なパーツは次に示す通り入手性の良い一般的な部品で構成されています。
・Arduino Nano [互換機] 1個
・人感センサー [SB412A] 1個 秋月電子通商 通販コード M-09002 など
・8桁7セグメントLEDモジュール [MAX7219] 2個 ※日付表示用と時刻表示用
・リアルタイムクロック(RTC)モジュール [DS3231] 1個
・9V電池 1本、 9V電池用コネクター 1個
人感センサーは人が近くにいる時のみディスプレイを点灯するために使用していて、人がいない時は電池の消耗を防ぐためにArduinoはsleep modeになるようなプログラムにしています。
リアルタイムクロックはsleep時にも現在時刻をカウントするために使用しています。
写真1の通り、配線は半田付け無しでできるようにブレッドボードとジャンパーワイヤーで全て組み上げてみました。
Arduino NanoにLEDモジュール、人感センサー、RTCモジュールをそれぞれ結線し、電源には9V電池を使用しました。
結線後の時計の内部はジャンパーワイヤーで配線しているので一見複雑に見えますが、比較的シンプルな結線になっています。
各部品間で結線すべき端子は下表の通りです。
ソフトウェア
Arduinoでプログラミングしています。なお、ここで紹介するメインプログラムにはRTCモジュールへ現在時刻の書き込み機能が実装されていませんので別途時刻の書き込みが必要です。
/* 7セグメントLED デジタル時計 */ #include "LedControl.h" #include <Wire.h> #include <RtcDS3231.h> #include <avr/sleep.h> RtcDS3231<TwoWire> Rtc(Wire); LedControl lc = LedControl(5,7,6,2); //5-DIN,7-CLK,6-CS,numer of unit void setup() { pinMode(2, INPUT); set_sleep_mode(SLEEP_MODE_PWR_DOWN); Serial.begin(9600); lc.setIntensity(0,0); lc.setIntensity(1,0); lc.clearDisplay(0); lc.clearDisplay(1); Rtc.Begin() ; } void loop() { interrupt(); Serial.println("In operation"); delay (300); while(digitalRead(2)){ lc.shutdown(0,false); lc.shutdown(1,false); lc.setIntensity(0,1); lc.setIntensity(1,1); RtcDateTime dt = Rtc.GetDateTime() ; lc.setDigit(0,7,dt.Hour()/10%10,false); lc.setDigit(0,6,dt.Hour()%10,true); lc.setDigit(0,4,dt.Minute()/10%10,false); lc.setDigit(0,3,dt.Minute()%10,true); lc.setDigit(0,1,dt.Second()/10%10,false); lc.setDigit(0,0,dt.Second()%10,false); lc.setDigit(1,7,dt.Year()/10%10,false); lc.setDigit(1,6,dt.Year()%10,true); lc.setDigit(1,4,dt.Month()/10%10,false); lc.setDigit(1,3,dt.Month()%10,true); lc.setDigit(1,1,dt.Day()/10%10,false); lc.setDigit(1,0,dt.Day()%10,false); } lc.shutdown(0,true); lc.shutdown(1,true); lc.setIntensity(0,0); lc.setIntensity(1,0); lc.clearDisplay(0); lc.clearDisplay(1); } void interrupt(){ attachInterrupt(0,wakeUp,RISING); Serial.println("In Sleep"); delay (300); PRR = PRR | 0b00100000; sleep_mode(); detachInterrupt(0); } void wakeUp(){ Serial.println("Wake up"); delay (300); PRR = PRR & 0b00000000; }
おわりに
私は3Dプリンタを使用して筐体作成にチャレンジしてみましたが、お菓子の箱やダンボールなどの厚紙で加工すればもっとお手軽に製作できると思います。
夏休みなどの自由研究のテーマとして、モノづくりの観点で色々と学べる事が多い電子工作はうってつけだと思います。
電子工作を少しまじめにチャレンジしてみようと思われた方には、次の様なマニュアル付きのArduino UNO R3入門キットと辞書的に使用できる書籍から始める事をオススメします。
コメント