arduinoで電子工作 人感センサー付き7セグ置時計を作ってみる

電子工作

【はじめに】

以前にelchikaというハードウェアの開発者コミュニティのコンテストに出品した製作物となりますがNTP時刻合わせ置き時計をご紹介します。この電子工作のキーパーツとしては、人感センサ、7セグメントLED、リアルタイムクロックを使用しています。詳しくはelchikaサイトのほうにプログラムなど含めて記載していますので宜しければご参照下さい。皆さん、電子工作と言えば、まずは時計を作りたくなりませんか?
人感センサー付き7セグメント時計 by massaJPN | elchika

【外観】

完成系下の写真の通りです。外観的にはあまり面白みはありませんが、日付と時刻表示部は前面に半透明の光拡散板でカバーしLEDの非表示部を見えなくすると、もう少し見栄え良くなると思います。時計の上部は、ある程度の面積で平面を用意しているので小さめの人形などちょっとした置物を置くこともできるのでおしゃれになるかと思います。

【作り方】

〇主なパーツは次に示す通り入手性の良い一般的な部品で構成されています。
・Arduino Nano [互換機] 1個
・人感センサー [SB412A] 1個
・8桁7セグメントLEDモジュール [MAX7219] 2個 ※日付表示用と時刻表示用
・リアルタイムクロック(RTC)モジュール [DS3231] 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プリンタを使用して筐体作成にチャレンジしてみましたが、お菓子の箱やダンボールなどの厚紙で加工すればもっとお手軽に製作できると思います。夏休みなどの自由研究のテーマとして色々と学べる点が多い電子工作はうってつけだと思います。

コメント

タイトルとURLをコピーしました