2021年1月31日
コルク瓶に自作のデジタル時計をつめこんだ、おしゃれな時計を作りました。
この時計は、はんだづけからプログラミング、装飾、プリント基板づくりにいたるまで、一から作っています。
今回は、このLED時計の製作過程を書きつづりたいと思います。
Fusion360で概要設計
まず最初に、思いついたイメージを3D-CADでモデル化しました。イメージは、コルク栓の試験管に空中配線された7セグメントLEDを立てて表示する構想にしました。試験管は、東急ハンズで販売されていた試験管(リカシツ:リム付 平底試験管 40φx190)を使うことにしました。
リカシツオンラインSHOP 【理化学用耐熱ガラスの専門店】
リム付 平底試験管 40φx190
https://rikashitsu.jp/online-shop/products/detail1201.html
〈3D設計の写真〉
回路設計
回路図を下図に示します。
〈CK-02の回路図〉
回路図はpdfファイルにもとっております。
回路自体はとても単純です。殆どの機能をArduinoのマイコン(ATmega328-P)にまとめています。ブートローダ書込み済のマイコンを使えば、Arduinoの基板をわざわざ使わなくても、なかのICチップとクロックのみで動かすことができます。
[Arduinoを単体で動かす方法は下記のpdfがわかりやすいです]
また時間を数える機能は、マイコンの中ではなく、外部にRTCモジュール(M3231)をつけることにしました。
7セグLEDは、アノードコモンのオレンジ色(型番)を使い、アノードコモン側をPNPトランジスタでON/OFFします。カソード側は330Ωの抵抗を介してマイコンのデジタルピンに直接つながっています。LEDの最大電流は10mAであるため、マイコンの供給能力(20mA)で十分まかなえます。
基板設計
次に基板を設計します。基板設計はいつもKiCadというソフトを使います。
基板サイズは、コルク瓶に入れるために25mm×120mmと最初に決めました。
それに合うようになんとかして配線を押し込みます。今回は片面一層基板を使うので、線同士の交差はできません。そのため、どうしても部品を交差させるときは、5025サイズの0オーム抵抗を置いて対応します。
KiCadの便利な特徴として、3Dで表示できるのも魅力です。
最後に白紙の紙にパターンを白黒で印刷して、実際に部品を載せてピッチを確認します。
時計の基板図面をpdfにしています。
基板製作
今回は、エッチングという方法で基板を作ります。
https://www.marutsu.co.jp/pc/i/40779/
パターンは、インクジェットモードの白黒モードで印刷します。
基板はサンハヤトのクイックポジ感光基板(片面ガラスエポキシ)を選びました。基板のサイズは最小で100×150mmなので、1枚だけ切り出すにはもったいないので、3枚まとめてデータを作りました。
基板製作エッチングの方法は、サンハヤトの公式に掲載されていたのでリンクを貼ります。
https://www.sunhayato.co.jp/problem-solving/step_of_original_circuit.html
ここでは、簡単に手順を掲載します。
はんだ付け
基板に部品をはんだ付けしていきます。
表面実装部品のはんだ付けはP板ドットコムの動画がわかりやすかったと思います。
表面実装部品をはんだ付けしていきます。抵抗のサイズは1608サイズという、ほぼお米サイズです。
7セグメントLEDは、空中配線立てます。構想してた時は不安でしたが、いざ組み立ててみると、結構しっくりきました。
基板にスイッチなどもはんだ付けすれば完成!いい感じになってきた。
ソフト設計
次に、プログラミングをします。
プログラムは、Arduinoを使って書きました。後日、プログラムも詳しく説明した投稿を載せたいと思います。
#include <DS3232RTC.h>//ライブラリーをインクルード
void setup() {
Serial.begin(115200);
DDRD = DDRD | B11111100; //D7 6 5 4 3 2 1 0 の入出力設定(1で出力 0で入力)
DDRB = DDRB | B00111111; //D * * 13 12 11 10 9 8の入出力設定(1で出力 0で入力)
DDRC = DDRC | B00000000; //A* * 5 4 3 2 1 0の入出力設定(1で出力 0で入力)
//setTime(17, 31, 0, 29, 12, 2020);//初期設定 時、分、秒、日、月、年の順で入力
//RTC.set(now());//初期設定時間の書き込み
}
boolean Number_Array[11][7]={ //Number_Array[数字の数][セグ数]
//{g,f,a,b,e,d,c}で入力。1がOFF,0がON(アノードコモンのため)
{1,0,0,0,0,0,0},//0
{1,1,1,0,1,1,0},//1
{0,1,0,0,0,0,1},//2
{0,1,0,0,1,0,0},//3
{0,0,1,0,1,1,0},//4
{0,0,0,1,1,0,0},//5
{0,0,0,1,0,0,0},//6
{1,0,0,0,1,1,0},//7
{0,0,0,0,0,0,0},//8
{0,0,0,0,1,0,0} //9
};
//LED表示関数を定義
void Number(int x){
for (int seg=0; seg<=6; seg++){
digitalWrite(seg+2,-Number_Array[x][seg]);
}
}
void loop() {
PORTD |= 0b11111100; //D7 6 5 4 3 2をHIGH(一旦非表示にする)
PORTB |= 0b00111111; //D * * 13 12 11 10 9 8をHIGH(一旦非表示にする)
int com[]={13,12,10,11}; //COMポートを設定{comA,comB,comC,comD}
int y[]={0,0,0,0}; //各桁に表示する数字の変数を宣言{時,時,分,分}
tmElements_t tm;
RTC.read(tm);
y[0]= tm.Hour/10;
y[1]= tm.Hour%10;
y[2]= tm.Minute/10;
y[3]= tm.Minute%10;
int dots = tm.Second%2;
dots = 255- dots *10;
analogWrite(9,dots);
for(int i=0;i<=3;i++){ //ダイナミック点灯のループ
digitalWrite(com[i],LOW); //表示する桁を開ける
int x=y[i]; //その桁で表示する数字をxに代入
Number(x); //xの数字を表示する
delay(3);
digitalWrite(com[i],HIGH); //表示した桁を閉じる
}
}
このプログラムを、USBシリアル変換器を通して時計に書込みます。
書込みがうまくいけば、狙い通り、時間が表示される。
装飾
完成した基板をそのまま瓶に詰めました。うーん、なんかもの足りない、、、、
そこで、空いたすきまに百円ショップで購入した造花を加えてみました。
お、なんかしっくりきた。
ちなみに、電源はUSBからとっています。自作のものなので万が一、電源がショートしてしまったりする心配もしました。なので、いくらUSBだからといって、パソコンなどには刺さず、USBの充電器だけにしています(通常の充電器は、コンセントとトランスで絶縁されている、保護回路が必ずはいっているので)
完成品を棚のアンプの上にかざりました。円筒型なのでたまに転がってしまうので、なにか足になるものを作ろうと思います。
とりあえず、製作の記録としてホームページに載せてみました。
これからもいろいろなものを製作していこうと思っていますのでよろしくお願いいたします。