目覚まし時計が欲しかった

慶應義塾大学ロボット技術研究会その1Advent Calendar 2018

慶應義塾大学ロボット技術研究会その2Advent Calendar 2018 

こんにちは!18日のアドベントカレンダーを担当します、1年のrmugkakshiです。

最近本当に寒いですね。たとえ寒くても布団からでるために目覚まし時計が欲しくなったので(スマホは布団でいじりかねないので私にはだめです)、作ってみることにしました!ただ、残念ながら現状時計にしかなってません。目覚ましの時刻を設定するモードをタクトスイッチで作ろうとしてうまくいかず、さっき原因が分かったものの間に合いませんでした。すみません。大部分は「mbed 電子工作レシピ」を参考にさせてもらいました。持ち運びたいので小さいのがいい、安いのがいい、4桁数字が出ればいい、分かりやすいのがいい、などの理由で表示器を7セグLEDに変えました。そこでの苦労が1番大きかったので、7セグLEDを中心に話そうと思います。(知っている人が多いと思いますが…)

 

7セグメントLEDとは

スクリーンショット (105) WIN_20181218_20_27_20_Pro (2)

「分かりやすいのがいい」を満たす単純な仕組みです!7つの部分(セグメント)のLEDからなり、数字などを表示することができます。b,cを光らせることで「1」を表すなど。アノードコモン(アノードが共通)のものとカソードコモンのものがありますが、仕組みはほぼ同じで、ここではアノードコモンのものを扱います。

使うのに必要なもの

7セグled(今回は4桁青色7セグメントLED表示器(コロン付) アノードコモン(アノード共通)

マイコン(今回は mbedのLPC1768)

適当な抵抗

ブレッドボード

ジャンパーワイヤ

LEDを光らせるためにカソードにそれぞれ抵抗をいれます。ここでまず私が間違えたのはLEDの回路に抵抗を挟めばいいやと思ってアノードに抵抗を入れたことです。これだと抵抗が1箇所で済みますが、表す数字によって流れる電流が変わってしまうので光る強さが違ってしまいます。1桁の数字を表すにに7つのカソードと1つのアノードの8ピン分のピンを使います。アノードをhighにして、カソードをlowにすることで、対応するLEDが光ります。例えば「1」を表そうとすると、アノードをhighにしてカソードをb,cをlow、a,d,e,f,gをhighにします。

 

ダイナミック点灯方式

スクリーンショット (106)

時計を作りたいので、4桁の数字を表さなければいけません。このまますると32ピンのピンが必要になります。これだと1つのマイコンで動かすのが難しかったり、できてもほかのものを動かすピンがありません。(目覚まし時計に必要な音を鳴らす機能、アラーム時刻を設定する機能などがつけられなくなってしまいます。)それを解決するのがダイナミック点灯方式です!カソードを4桁すべて共通にして、アノードを高速で切り替えることによって人の目にはいつも4桁の数字が点灯されているように見えます。こうするとカソード7ピン、アノード4ピンの11ピンで4桁の7セグLEDを動かすことができます。切り替えを0.005秒にすると私の目にはずっと4桁光っているように見えました。しかしiPhoneのスローで撮るとチカチカして見えました。0.01秒だと目視でもチカチカ、0.0005秒だとスローでもずっと4桁光って見えました。(ここで時間を変えてちょっと遊んでました。)これで時刻を表示できるようになりましたね!

 

時計を作ろう! 

必要なもの

上記のもの

+イーサネットに接続できるようにするもの(今回はLANコネクタとイーサネット接続キットを使いました。LPC1768はキットも出ていて簡単にイーサネットに接続できます。)

時計のプロフラムは簡単に言うと

①NTPサーバーから時刻を受信する。

②マイコン内部のRTC(Real Time Clock)に受信した時刻(+日本時間の32400秒)を設定する。

③設定された時刻を7セグledに表示する。

④59.8秒表示し続ける。(よく分からないけど、60秒より調子が良かった。)

⑤RTCの時刻の分が変わったか比較。

⑥変わっていたら1分増やして④に戻る。

としました。①はmbedに公開されているプログラムでできます。だいぶ本に頼ってしまい、理解できていないけど書いたところもあります。プログラムど素人なため、せっかく秒まで正確な時刻を受信するのにそれを生かせませんでした。また、数字を光らせるのを1つ1つ関数として定義しているため、えらい読みずらく長いことに。(Ctr+C、Ctr+Vには大変お世話になりました。)そんなに複雑でないプログラムのはずがなんと683行にもなってしまいました。

以下プログラムです。

#include “mbed.h”
#include “EthernetInterface.h”
#include “NTPClient.h”

EthernetInterface eth;
NTPClient ntp;

DigitalOut myled_a(p11);
DigitalOut myled_b(p12);
DigitalOut myled_c(p13);
DigitalOut myled_d(p14);
DigitalOut myled_e(p15);
DigitalOut myled_f(p26);
DigitalOut myled_g(p17);
DigitalOut anode1(p5); //アノード側 ledのピン1
DigitalOut anode2(p6); // 2
DigitalOut anode3(p7); // 6
DigitalOut anode4(p8); // 8
DigitalOut anode_point(p9); // 4(時刻の:用)

void display1_(const char n)
{ if(n==0 )
{myled_a = 0;
myled_b=0;
myled_c=0;
myled_d=0;
myled_e=0;
myled_f=0;
myled_g=1;
anode1=1;
anode2=0;
anode3=0;
anode4=0;
anode_point=0;
}

この後永遠に数字を表示させる定義が続く。終わったら、

int main()
{

eth.init();

eth.connect();

printf(“Trying to update time…\r\n”);
if (ntp.setTime(“0.pool.ntp.org”) == 0)
{
printf(“Set time successfully\r\n”);
time_t ctTime;
ctTime = time(NULL)+32400;
printf(“Time is set to (JST): %s\r\n”, ctime(&ctTime));
}
else
{
printf(“Error\r\n”);
}

eth.disconnect();

int old_hour = 0;
int old_min = 0;

while(1){

time_t ctTime;
ctTime=time(NULL)+32400;

struct tm * strtim;
strtim=localtime(&ctTime);

if(strtim -> tm_min !=old_min)

{ old_min = strtim->tm_min;

int count;
for (count = 1; count <= 59800; count = count + 1)
{display1_(strtim->tm_hour/10);
wait(0.0002);
display2_(strtim->tm_hour%10);
wait(0.0002);
display3_(strtim->tm_min/10);
wait(0.0002);
display4_(strtim->tm_min%10);
wait(0.0002);
point();
wait(0.0002);
}
}
}
}

こんな感じになりました。WIN_20181218_22_08_32_Pro (2)

 

終わりに

スマートさからはかけ離れていますが、何とか時計になりました!やってみて、よく分かっていなくても簡単なことからやってみたら意外と何とかなるということと、何とかはなるけど何とかしかならない(正確さはガバガバだし、プログラムは絶対もっと見やすく短く書けるはず)という両方を感じました。本に頼りつつ少し変えるぐらいで今の私にはちょうどいい難易度でした。作りながら少しずつは学べますし、何よりできると嬉しいのでよかったら何か作ってみてください!

私自身はしばらくこれで遊びます。やりたいことが山ほどあるので。(まずは目覚まし機能をちゃんとつける、ブレッドボードはやめる、プログラムの改良、タイマーをつけたい・・・)

こんな記事を最後まで見て頂きありがとうございました。

 

画像の引用元

7セグledのデータシート

 

 

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中