AVR ATtiny2313 7セグ4桁ボード応用デジタル時計 〜バリエーション編〜
2010年2月 ※2013/02 ページデザイン変更 このサイトでよく登場する7セグ4桁ボードを使ったデジタル時計を紹介します。 「AVR ATtiny2313 デジタル時計〜7セグ4桁ボード応用」の最後に書いた「近いうちに製作紹介の記事になる予定」、その記事ということで。 私がAVRの勉強を始めたのは、7セグでデジタル時計を作るためでした。 製作してから1年以上経った今も愛用しています。気に入っています。 そういえば、7セグ4桁ボードの製作当時はクリスタルについてよく知らなかった、ということを思い出しました。ちょうどよい機会なので、時計作りの観点からクリスタルの選び方について解説してみました。 記事は長編です。2部構成になっています。 |
7セグ4桁デジタル時計 | |||||||||
ここで紹介する7セグ4桁デジタル時計は、「AVR ATtiny2313 7セグ4桁ボード〜製作、動作チェック」のボードに発振器を追加したものです。精度は上々。 緑の7セグの方は常用の時計です。カソードコモン用のボードです。 赤い7セグの方は実験用にソフトをあれこれ変えて使っています。アノードコモン用のボードです。 今回は撮影のため時計に仕立てました。カメラの関係で白い光に見えますが、実物は鮮やかな赤です。 【参考】 「ねんどろいど ドロッセル 自動的に「便利ね」」 さりげなくストップウォッチ登場。(動画) 機能
7セグ4桁デジタル時計のプログラムのソースです。 ソース内には作り始めたころからの履歴やコメントが残っています。敢えてそのまま公開します。 因みに「アナログコンパレータ禁止(消費電力を抑えるため)」という処理が1行入っていますが、昔のバージョンの名残です。この時計は特に省電力を意識してはいません。…その割に動作周波数を低めにしてあったりしますが。 写真の時計はどちらも11.776MHzのオシレータを使っています。ですがこのハードを製作しようとする人のほとんどは、8MHzや16MHzなど容易に入手できる周波数のクリスタルを使うはずです。ソース中の周波数と分周の設定を、実際に組み込んだクリスタルの周波数に合わせて変更してください。 アノードコモン用とカソードコモン用でソースは共通です。先頭付近に
アノードコモン/カソードコモンの切り替えについて、この他に変更箇所はありません。 以上の点を修正したらビルドして.hexファイルを作ってください。AVRに書き込むのは.hexファイルだけです。ATtiny2313のヒューズビットの設定はソースファイルの先頭付近に書いてあります。 回路図 7セグ4桁デジタル時計の制御ボードと表示ボードの回路図です。新たに書き起こしました。表示ボードの7セグがアノードコモンの場合はアノードコモン用の制御ボードAと、7セグがカソードコモンの場合はカソードコモン用の制御ボードKと、組み合わせます。制御ボードA/Kはトランジスタ(デジタルトランジスタ)のNPN型かPNP型かが違うだけです。
|
操作説明 | ||||||||||||||||||||||||||||||
2つのスイッチ(ボタン)で操作します。 swLはPB7に、swRはPB6につながったスイッチです。 時刻/日付の設定 基本的にswLで設定項目を切り替え、swRでそれぞれ値を変更します。 swRは押しっぱなしにしても自動的に値が増えません。面倒ですがポチポチ押してください。
カレンダー表示 一度swRを押したら2秒ごとに年/月日/曜日が切り替わり、自動的に時刻表示に戻ります。 「年」の表示を省略できます。何月何日かすぐに見たいときは「年」非表示モードにしておきます。
|
部品について |
まず、このサイトの下記記事の部品説明を読んでください。 「今から始めるAVR #3 ATtiny2313 7セグ4桁ボード〜製作、動作チェック」 「Shuttle K45 改造 自作デジタル時計」 今回の記事中の7セグ4桁ボードはこれらを合わせた物です。よって、ここでは部品の説明をほとんど省略します。 発振器 この先にある「クリスタル選びについて」の項目を読んでください。 4MHzや16MHzが分周に強く、1秒ないし0.5秒が計りやすいです。8MHzでもヒューズビットで8分周なしの設定にすれば、1秒ないし0.5秒が計れます。個人的には秋月電子の11.776MHzの発振器をお勧めします。分周に強く、クリスタルと同サイズの大きさで(小さい)、安価だからです。※(2011/04追記) 現在では販売されていないようです。 7セグLED アノードコモン、カソードコモン、どちらでも製作の難易度は変わりません。 7セグの配線にはUEW(ポリウレタン線)がお勧めです。これも用意しましょう。 電流制限抵抗 7セグのデータシートを参照して抵抗値を計算してください。一覧表で挙げた220Ωは一例です。 VCC=5V、LEDがVF=2.0V、10mA流す、だとしたら (5V - 2.0V) / 10mA = 300Ω 220Ωか330Ωの抵抗で10mA前後流せます。高輝度赤の7セグなら470Ω(6mA)でも明るいです。 デジタルトランジスタ デジトラが入手しにくい場合、回路図の代替え回路を参考に普通のトランジスタを使います。 代替え回路のRbは1kΩ〜4.7kΩ、Rb-eは10kΩ〜47kΩのどれでもよいです。 Trの2SC1815/2SA1015のグレード(末尾のアルファベットGRやY)は何でもよいです。 [O]range,[Y]ellow,[GR]een,[BL]ueは電流の増幅率を表しています(カラーコード3,4,5,6ですね)。回路上、7セグのコモンに流れる電流の大きさが変わり、明るさに影響が出そう?ですが、LEDの電流制限抵抗がありますし、この増幅率の区分は範囲が広い上に重なってもいるため、7セグを光らせるような用途では気にしてもしょうがないなーと思います。 ピンヘッダ/ピンソケット 1つの基板上に制御部と表示部を載せるなら、コネクタはもちろん不要です。 スペーサーを使ったりケースに入れたり、お好みでどうぞ。 それとは別に、一覧表には書いてありませんがISP用で2x3ピンのピンヘッダが必要です。 |
部品名 | 部品番号 | 値 | 個数 | 参考価格/備考 |
AVR(マイコン) | U | ATtiny2313 | 1 | 100円(秋月電子) |
発振器 | OSC | (11.776MHz) | 1 | 5個100円(秋月電子) |
積層セラミックコンデンサ | C1 | 0.1uF [104] | 1 | 10個100円 |
抵抗 | R1-R8 | 220Ω [赤赤茶金] | 8 | 1個5円/100個100円 |
タクトスイッチ | SW1,SW2 | -- | 2 | 10個180円 (千石電商 店頭価格) |
7セグLED | D1-D4 | -- | 4桁分 | 1個100円など |
ピンソケット(制御ボード側) | CN | 2x10 | 1 | このサイズがなければ 長いものを切って使う |
ピンヘッダ(表示ボード側) | CN | 2x10 L型 | 1 | 長いものを折って使う |
7セグがアノードコモンの場合 | ||||
デジタルトランジスタ | Tr1-Tr4 | RN2205 | 4 | 10個100円(鈴商) |
RN2205の代わりに | ||||
トランジスタ(PNP型) | Tr | 2SA1015 | 4 | 20個100円(秋月電子) |
抵抗 | Rb | 2.2kΩ [赤赤赤金] | 4 | 1個5円/100個100円 |
抵抗 | Rb-e | 47kΩ [黄紫橙金] | 4 | 1個5円/100個100円 |
7セグがカソードコモンの場合 | ||||
デジタルトランジスタ | Tr1-Tr4 | RN1205 | 4 | 10個100円(鈴商) |
RN1205の代わりに | ||||
トランジスタ(NPN型) | Tr | 2SC1815 | 4 | 20個100円(秋月電子) |
抵抗 | Rb | 2.2kΩ [赤赤赤金] | 4 | 1個5円/100個100円 |
抵抗 | Rb-e | 47kΩ [黄紫橙金] | 4 | 1個5円/100個100円 |
クリスタル選びについて |
時計を作る上で重要なことは「如何にして正確な1秒を計るか」です。 マイコンは動作周波数(システムクロック)を基準に時間を計ります。振動子/発振器の周波数によって1秒の計りやすさが違います。ここでは、1秒を計るには何MHzのクリスタル(振動子/発振器)をマイコンに付ければよいのか、について説明します。クリスタル選びのヒントにしてください。 振動子か発振器か 時計を作るにはクリスタル(水晶)を使います。電子部品でクリスタルを調べると、水晶振動子と水晶発振器が出てきます。この2つはどう違うのでしょうか。 水晶は電圧を掛けるとたわみ、止めると戻ります。電圧を掛けっぱなしにしても震えを繰り返すわけではありません。持続する振動を発生させるには発振回路が必要です。 水晶のかけらに電極を付けたものが水晶振動子、発振回路まで含めたものが水晶発振器です。 電子工作で単にクリスタルといったら大抵、水晶振動子のことです。この記事でもそのように読んでください。 解説書などで水晶発振器をクリスタルオシレータ(Xtal oscillator)、単に発振器、オシレータと書くことも多いです。 話がややこしくなりますが、水晶発振子という表記も多く見かけます。発振器なの?振動子なの? これは水晶振動子と同じ物、同じ意味です。単に呼び方が2つあるだけです。JISでは水晶振動子と表記しています。「子」は素(す)の状態、「器」は発振回路込み、と区別すればよいでしょう。 AVRは発振回路を内蔵しています。そこにクリスタル(水晶振動子)をつなぐと持続する振動が発生し、システムクロックとなります。このときクリスタルが正常に発振するよう、数十pFのコンデンサを2個、クリスタルと共に付ける必要があります。 このコンデンサを負荷容量と呼びます。発振に最適な負荷容量はクリスタルの周波数によって違います。そのためマイコンに内蔵しておくことができません。コンデンサの具体的な容量は各マイコンのデータシートに説明があります。 AVRにクリスタルと負荷容量のコンデンサをつなぐ代わりに、発振器をつないでシステムクロックとすることもできます。発振器は指定された電圧を掛ければ確実に発振すること、正確な周波数であるよう調整されていること、がメリットです。 時計の話から外れますが… AVRなどと違う、マイコンではないICに外部からクロックを供給する必要がある場合、クリスタルを使うなら自分で発振回路を組まなければなりません。部品が増え、実装面積も取られます。そんなとき発振器の出番です。 【参考】 「AD725 RGB to NTSC ビデオエンコーダの製作」 マイコンではない電子工作で発振器と、クリスタル+発振回路を使っています。 精度 クリスタル自体は正確な周期で振動する素子です。しかし発振回路が温度や電圧、その他の影響を受け、発生する周波数がわずかに不正確となることがあります。 それを逆手に取り、上記ビデオエンコーダでは調節目的で周波数を意図的にずらす使い方をしています。 それに対し、発振器は温度変化の影響を受けにくいよう設計されており、極めて正確な周波数が発生します。発振器のデータシートには「温度補償付き」などと説明されています。 ところでAVRは発振回路の他に発振器も内蔵していて、自分自身でクロックを供給できます。おかげで外付けの振動子/発振器なしでも、買ってきた状態でとりあえず動作します。 内蔵発振器は抵抗(R)とコンデンサ(C)で構成されたRC発振回路で、温度変化や電圧の影響を受けやすく、発生する周波数は大雑把です。例として、時計にしたら1日で15〜20分遅れました。 AVRのデータシートには内蔵発振器の特性がグラフで示されています。 振動子には、クリスタルではなくセラミックを使ったものもあります。 村田製作所のセラロックは負荷容量のコンデンサ内蔵で、手軽で安価で入手性がよく、重宝します。ただしクリスタルよりも周波数の精度が落ちます。AVRの内蔵発振器よりは正確です。 以上をまとめると、正確なクロックを発生させる仕組みの順位はこのようになります。 水晶発振器 > クリスタル(水晶振動子) > セラミック発振子 > AVR内蔵発振器(RC発振回路) この3つの部品の大きさはどれも縦横1cm前後です。 水晶発振器は8ピンのICソケットに挿せます。 挿せるのですが、本体の大きさ自体は8ピンICより大きいです。 なお、AVRでは接続できるクリスタルと発振器の周波数の上限が違います。 例えばATtiny2313では、クリスタルは20MHzまで、発振器は16MHzまで接続できます。 分周 マイコンが1MHz(1,000,000Hz)で動作していたら1,000,000サイクルをカウントして1秒です。ただ、1,000,000という値は8ビットないし16ビット符号なし整数の範囲でカウントできないので、実際にはクロックサイクルを分周してカウントします。 AVRのタイマー・カウンタは8分周、64分周、256分周、1024分周が設定できます。分周なしの設定もあります。詳しくはデータシートのタイマー・カウンタの説明を読んでください。 AVRはタイマー・カウンタの分周の他、システムクロック自体を分周することができます。 ヒューズビットの設定で「システムクロックを8分周する/しない」という項目があります。 また、プログラム上からシステムクロックを8分周以外に設定することもできます。 CLKPRレジスタに値を書き込んで1/1〜1/256の範囲で1/(2^n)ごとの任意の分周ができます。 詳しくはデータシートの前置分周器の説明を読んでください。 タイマー・カウンタの分周を何とか都合のよい分周にしようと、システムクロックも分周する。そのようなやり方も考えられますが、システムクロックを分周すればその分システム全体の動作速度が遅くなることに注意してください。もちろん、敢えて遅くしたいこともあります。 動作周波数とカウンタの値 マイコンで1秒、0.5秒、0.1秒などどんな長さを計るにしろ、クロックを分周したとき小数になるようでは意味がありません。マイコンの動作周波数(システムクロック)を決めるとき、「分周に強い周波数」を選ぶと時計作りに有利です。 下の表は、動作周波数と分周と1秒/0.5秒を計るタイマー・カウンタの値の関係をまとめたものです。一般的に入手しやすいと思われるクリスタル(振動子/発振器)の周波数と、個人的にお勧めな11.776MHzについて調べました。 ※(2011/04追記) 秋月電子にあった11.776MHzの発振器は、現在では販売されていないようです。 (もとのexcelファイルはこちら→ダウンロード zip圧縮形式) kHz単位のクリスタルはまさに時計製作のために存在します。と言っても過言ではない 時計は短時間に多くの処理をこなすような性格の物ではないので、高速な処理速度は必要ありません。そしてマイコンは動作周波数が低いほど消費電力が小さくて済みます(電池が長持ちする)。 【参考】 「AVR ATtiny2313 デジタル時計〜7セグ4桁ボード応用」 92kHzで動かしています。 ATtiny2313やATmega88(48/88/168/328)の内蔵発振器は8MHz、出荷設定で8分周ありになっています。買ってきた状態で動作周波数1MHzで動きます。 これを参考に2つの表それぞれで1MHzと8MHzの欄を見ると、どの組み合わせもあまり分周に強くないことが分かります。秒表現の点滅で0.5秒が必要なら、「8MHz。ヒューズビット設定で8分周なし。16ビットタイマー・カウンタを256分周に設定。」 これしか選択肢がありません。 逆に、AVR内蔵発振器8MHzで0.5秒を計ることはできる、と言うこともできます。正確さはともかく。 それに対して4MHz、16MHzは分周に強いことが分かります。1秒を計れる設定の組み合わせが1つだけではありません。システムを設計していて、時間を計る目的以外の機能とタイマー・カウンタを兼用する必要があるとなったとき、分周の組み合わせがいくつか選べるのは、そのシステムを組む上で有利です。 4MHz、16MHzとも、62500カウントで1秒を計れる設定があります。これは625カウントで0.01秒が計れるということです。ストップウォッチを作るのにこの設定が活かせます。 その点では11.776MHzに注目です。46000カウントで1秒が計れる設定があります。ということは46カウントで0.001秒(1ms)が計れるのです。11.776MHzには1秒、0.5秒、0.1秒を計れる設定がいくつもあります。分周に強いです。 半端な周波数のクリスタル/発振器が売っていたら、分周に強いかどうか確かめてみましょう。2のn乗で何回か割ってみれば分かります。分周に強かったらお買い得かもしれません。 ATtiny2313やATmega88の動作周波数の上限は20MHzです。表を見ると、時間を計るには向いていないことが分かります。純粋に速度追求のために選ぶ周波数だと思ってよさそうです。 しかし1秒を計る方法がないわけではありません。マイコンを20MHzで動作させるとき、タイマー・カウンタを256分周に設定すれば78125カウントで1秒が計れる、ということが表から分かります。 65535より大きい値は適当な大きさに分解してカウントします。 78125 = 625 x 125 タイマー・カウンタが625カウントするのを125回繰り返したら1秒です。 |
第2部 |
表示ボードをいろいろ取り替えて楽しめることを紹介します。 つまるところ、制御ボードはAVRのピンに抵抗とトランジスタを付けてソケットに出しただけの物です。 多少の制限をやりくりできれば、表示デバイスを取り替えることは簡単です。 ただ、表示ボードに電源ラインまで渡すようにするとズルい気もしますが。でもやっちゃう |
時計向き4桁1組の7セグを付けてみる | |||||||||||||||||||||||||||||||
時計に利用されることを意識した、セグメントが「18:88」の形になっている4桁1組の7セグがあります。これを制御ボードに付けてみました。 ※このタイプの7セグは測定器の分解能でいう「3・1/2桁」とは目的が異なり、純粋に時計表示用のものです。しかしながら、左側のドットを「+」「-」と見なしてコロン「:」を無視すれば、-1999〜+1999を表現できることになり、測定器の分解能でいう「3・1/2桁」表示ができる7セグ、と言うこともできます。…こじつけっぽいですが。 午後7時19分 若松通商で購入した「GL-3Y403」という7セグです。カソードコモン、緑色。 購入した7セグには「GL-3Y403A」と印刷されていました。末尾Aなしとの違いは分かりません。 データシートが見つからないのでピンアサインは手探りで調べました。 左:GL-3Y403A ピンアサイン(おそらくGL-3Y403も同じ) 中:時計製作用配線案 右:時計の動作テスト この7セグを調査中、うっかり制限抵抗なしで電流を流してしまったところ、眩しくオレンジ色に光りました。何度か試しても焼損しませんでしたが、そういう2色仕様ではないと思うので、おとなしく緑色のLEDとして使うことにします。 うっかりオレンジ色、といえば昔、紫外線消去タイプのEPROMを逆挿しして窓がオレンジ色に光ったことがあります。希に起こるらしい、と教えてくれた人は「100回以上逆挿しの経験あるけど自分では見たことがない」と言っていました。私は一発でお目にかかれました。 時計用の配線を検討する ピンアサインが判明したところで時計用の配線を考え、動作テストしました。 各桁のセグメントはダイナミックドライブ用に内部で配線されています。コロンがクセモノです。 2桁目にDPが2個配線されています。セグメントA-G,DP,DP。しかし制御ボードは1桁をセグメントA-G,DPの線で制御しているので、2桁目の2個のDPへ個別に電流を流すことはできません。 従って「時計製作用配線案」ではコロンのDPを一まとめにしています。他のセグメントの半分の明るさになってしまいますが仕方ありません。DP3(コロンの上側のDP)が1桁目に配線されていれば都合が良かったんですけどね。 左端上下のDPは午前/午後を表すのに使えます。回路的にもプログラム的にも、1桁目のセグメントE(下のDP)、セグメントF(上のDP)と見ています。
時刻/日付の設定 基本的にswLで設定項目を切り替え、swRでそれぞれ値を変更します。
カレンダー表示 一度swRを押したら2秒ごとに年/月日/曜日が切り替わり、自動的に時刻表示に戻ります。 「年」の表示を省略できます。何月何日かすぐに見たいときは「年」非表示モードにしておきます。
思い付いたこと 時計向きで小さい7セグ(30x14mm)、結構気に入った。aitendoの1.44インチ液晶モジュールと合わせて、ミニサイズの時計付きデジタルフォトフレームなんて作ってみたいと思う。 USB接続でPCのフォルダ内の画像を次々と表示。画像サイズやフォーマットの変換はPC側で随時処理、液晶モジュールへ転送。液晶モジュール側は単純に表示処理だけでよし。USB給電ならPCの電源を切っても液晶画面の表示は消えず、時計は動き続ける。なんか楽しそうだ。 |
LCDモジュールを付けてみる | |||
16x2のキャラクタ液晶モジュールを制御ボードに付けられるか検討してみました。 制御ボードA(アノードコモン用)の場合はPNP型トランジスタによってVCCを引っ張ってこれるので、電源ライン無しでもLCDモジュールを動かすことができます。 ただし、GNDがきちんと取れないのでバックライトは明るさ全開にできません。適当なセグメントをLレベルにしてGND代わりにしているのですが、7セグドライブ用の電流制限抵抗が入っている分、電位が上がってしまうのです。 それはそれで、まぁいいやってことにして、他を頑張ってみました。PWM制御でコントラストとバックライトの明るさが調節できます。制御ボードの制約の中で上手くピンを割り当てたことが「頑張った」ところです。 51秒から52秒へ変わる瞬間だったようです。 制御ボードK(カソードコモン用)の場合は制御ボードから電源を取らないと、LCDモジュールを動かせません。
思い付いたこと LCDモジュール2行目、空いてるスペースがもったいない。ここに気温を表示したい。それならA/DコンバータのあるATmega88を使って温度センサを乗せようと。プログラム領域もグッと増えるから、カレンダー時計以外にもストップウォッチやラーメンタイマーの機能を入れられそう…といった物を作った方がお得な感じ。 ATtiny2313より8ビットタイマーが1つ多いから、裏で時計を動かしたままストップウォッチを動かすことも多分できるだろう。マルチタスクだとか深く考えていない。ベタで行く。 ATtiny2313で試してみた 制御ボードを少し改造して、ATtiny2313のAIN0,AIN1ピンに温度センサLM61BIZと0.1uF[104]のコンデンサを接続。アナログコンパレータ利用の簡易A/Dコンバータ。 LM61BIZの出力電圧は良好。計算値と実際の気温がよく一致している。だが簡易ADCの性能がイマイチで、結果的に+-2度の誤差が出る(精度+-1度の壁掛け温度計の値に対して)。 これ以上は追求しないことにする。 【参考】 簡易A/Dコンバータの部分は勉強がてらアセンブラで書いた。 ソースはここをクリック(acadc.txt) 使うときはacadc.sにリネームする。 ビルド環境: WinAVR-20080610 最適化オプション:-Os ATtiny2313 11.776MHz/8分周(1.472MHz) |
◆ ◆ ◆ |
マイコン初心者。 まず、LEDチカチカから入ります。ポートの制御を知ります。 次に、複数桁の7セグを光らせます。ダイナミックドライブを知ります。 次に、タイマー・カウンタと割り込みの仕組みを習得します。1秒が計れるようになります。 次に、60秒で分、時、日、月、年と繰り上がるプログラムを組みます。時計のことです。 こうやってマイコン初心者(過去の私)は時計を作れるようになりました。 |
(C) 『昼夜逆転』工作室 | [トップページへ戻る] |