エントリー

2016年04月04日の記事は以下のとおりです。

AVRtiny13Aでつくるシリーズ5 温度と時刻を同時に表示

  • 2016/04/04 12:02
  • カテゴリー:make:

 さてさて,お次はTCXOの時計と,LMT01の温度計を組み合わせたものです。LCDにはAQM0802を使って,1ライン目には温度を,2ライン目には時計を表示します。写真が好きな割にはうまく撮れずに恥ずかしいです。

20160404221135.JPG

 右側にあるのがLCDのAQM0802,その左下に8ピンDIPのATtiny13A,その上にはLMT01を寝かせておいてあります。

 LMT01の左側にはTCXOの出力(0.8Vp-pのなんちゃって正弦波)をCMOSレベルに変換するトランジスタ(2SC1815)があり,トランジスタの足下には10MHzのTCXOであるTG-5021があります。

 さらにその左側には2.85VのLDOがあって,すべてに電源を供給しています。LCDの電源としてはかなり低めで動作が心配されましたが,コントラストが低くなってしまったのでそこを調整した以外に,今のところ不具合はありません。

 左下の白い四角いものは押しボタンスイッチです。左が時を,右が分を進めます。両方押すと秒がゼロにリセットされ,離すとカウントを始めます。

 なんでもない時計ですが,実力で時計は1ppm以内の精度,温度計は0.5度以内というもので,これを8ピンの50円マイコンで作ってみようというのですから,なかなか面白そうだと思いませんか。

 ソフトとしては,これまで紹介した時計と温度計を組み合わせるだけです。割り込みは2種類から発生しますので,ここがうまく動くか,ちょっと心配な所です。また,それなりに処理が重いので,割り込み処理が間に合うか,また割り込み以外の処理が次の割り込みに間に合うか,そのあたりも気がかりなところです。

 メモリサイズは,あまり心配していませんでした。というのも,それぞれLCD駆動部分をいれて80%程でしたので,ここを共通化すれば収まるだろうと思っていたのです。

 ですが,やっぱりそうは問屋が卸しません。問題が噴出です。

 まず処理の問題。割り込み処理が間に合わないらしく,LMT01のパルスを正しくカウントしていないようです。これは処理順番を変更して対策。

 次に,割り込みの外の処理が重すぎて,時々変な数字を表示します。これも順番を変更して対策。

 そしてやっぱりダメだったメモリ。出来たバイナリは,1.2kBになっていました。2割もオーバーしているというのは,もう絶望的です。ちょっとやそっとで入る大きさではないですよ。しかも,温度のマイナス表示は外してあります。

 この,メモリを削って行く作業というのは実に地道な作業なのですが,もともと1kバイトしかありませんし,豊富な機能があるわけではないので,削る機能もありません。

 手始めに,LCDとI2Cのウェイトを削って行きます。すると,みるみる減っていきます。AVRのdelayというのは,実は結構なステップ数になると聞いたことがあるのですが,あっという間に100バイトほど減りました。

 もともと必要で入れてあったウェイトですから,外していい物はないはずなのですが,そういうきれい事を言っているわけにはいきません。1つずつ外して,動くかどうかを見て,また外して・・・を繰り返し,とにかく実力依存で動くところまで,削り取りました。

 なにかあったら,速攻でコケるだろうなあ。

 それでもまだオーバーしています。次はLMT01です。以前,摂氏に変換するのにカウント数*10/16-500をする,と書いたことがあるのですが,ここを減らします。

 カウント数が1234だとしましょう。この計算式に従うと,271となります。つまり27.1度ですね。

 これを書き直します。カウント数を10倍するのはあきらめます。これを右に4ビットシフトします。これで1/16されて,値は771となります。

 さて,よくよく見てみると,オフセットである500を減算して影響があるのは,100の位だけです。あとの10の位と1の位はなにも変化しません。それなら,この771を表示する際に,100の位の7から5を引き算し,あとはそのまま表示することにします。

 こうすると,演算が8ビットで済むので,少し減ります。シフトとの合わせ技で数バイト減りました。もちろん,マイナス表示は割り切ります。氷点下になるような場所にいたら体に悪いです。

 キーのチャタリング対策のウェイトも全部外しました。LCDの初期化も,本当に最低限必要な物だけにしました。そして,表示部分も,キャラクターコードのオフセット分0x30を,表示関数の中で加算するようにして,毎回加算することをやめました。

 これで,なんと1018バイト。ギリギリ入りました。かろうじて動いている感じです。

 さて,ここまで来て安心した私は,クロックの設定をデバッグ用の内蔵9.6MHzから,外部10MHzに書き換えることにしました。クロックの設定を9600000から10000000にして,ビルドします。

 すると,あろうことか,1030バイトになりました。オーバーしたため書き込みが出来ないと怒られて気が付いたんですが,せっかくの苦労が水の泡です。クロックを変えるだけで,なんでこんなに増えるのかと泣きたくなりましたが,これはおそらく,コードサイズに影響が大きい,delayで回るループの回数が変わったからでしょう。クロックが速くなると,それだけループもたくさん回すことになります。

 ということで,わずか400KHzの差だというなら,もうそのままでいいじゃないかということで,クロックは9600000にしました。

 これで最終的に1018バイト。これで書き込み,動作を確認しました。メモリもほぼ使い切り,機能的にもこれが限界でしょう。精度はTCXOですので申し分なく,温度計もとりあえずおかしな値を表示してはいません。

 文字化けや表示の乱れもなく,安定して動いてくれているのはいいのですが,消費電流が結構大きいのです。TCXOの電源を安定化したいので2.85VのLDOを通してすべての電源を供給していますが,LDOの入力で5.3mA流れています。

 5.4mAですから,仮に2000mAの単三電池を2本使ったとすると,単純計算で370時間。およそ2週間で電池切れです。これはかなり厳しいです。

 深夜にLCDを消すというのはどうかと考えたのですが,それでも減るのは1mA弱。3日ほど伸びるだけです。電池を4本にすれば1ヶ月,6000mAクラスのリチウム電池を使えば1.5ヶ月です。

 中途半端ですよね。10mA以下ですからACアダプタを出してくるのはもったいないですが,かといって電池ではすぐに切れてしまいます。こうなってくると消費電力を下げる工夫を考えたいのですが,これがなかなか難しいです。

 まず考えつくのはtiny13Aのクロックを下げる事ですが,10MHzで時計を作っている以上は,1/8の分周器しか使えません。でも,1.25MHzでは処理が追いつかないのは明白ですから,これはあきらめます。

 1秒ごとに表示を更新するだけだから,それ以外はスリープに入れればいいとも思うのですが,残念ながら1秒間に625回入る割り込みと,温度センサのパルスのカウント,そしてI2Cの通信でほぼずっと全速力で回っているCPUを止められません。

 それと,実はTCXOが2mAほど消費しています。tiny13Aが2mA,LCDが1mAとして合計で5mAですから,TCXOだけを動かすことにしても,2mA以下にはならないのです。仮に2mAになったとして約40日です。これで電池が切れてしまうというのは,程度の問題とは言え,面倒な事には変わりがないでしょう。

 なので,もうあきらめます。電池で動かすことを最初に目標に置いて,そのために必要な対策を最初から盛り込んでいかないといけなかったと思います。例えばクロックは明らかに周波数が高すぎますから,最大でも32.768kHz,可能であればここはリアルタイムクロックで閉じてしまい,tiny13AはRTCからの割り込みで1秒ごとにデータをもらう仕事に徹します。

 そして夜中はLCDを消します。これでおそらく24時間平均で1.2mA,だいたい3.5ヶ月動く計算です。3ヶ月持てば充電式の電池を使うなら,なんとか許せるでしょうか。

 そう考えると,市販されている時計の,なんと低消費電力なことでしょうか。腕時計なんか,小さな電池1つで,何年も動きます。専用のLSIに専用のディスプレイ,専用の水晶発振子でトータルの精度を維持するという,強烈な技術の集大成です。

 どういうわけだか,私は時計を作るのが好きなのですが,ことこの分野においては,消費電力においても,あるいは精度においても,プロが作る製品に,アマチュアの工作は全く追いつかないことを思い知らされます。

 そうそう,ところで,Si5351Aを使ったTCXO時計を作ったとここに書きましたが,壊れてしまいました。

 どういう訳だかわからないのですが,どうもaitendoの特価LCDが壊れてしまったらしく,手にとって他の人に紹介した直後から表示が消えてしまったことを考えると,どうも静電気で破壊したんじゃないかと思います。LCDの消費電流がゼロのまま,まったく変化しません。

 I2Cで動くセグメントLCDってなかなか貴重で,交換しようにも手頃な物がないのです。残念ですがこの時計はあきらめるしかありません。10日ほど動かしましたが,目視で分かるようなズレが出なかったことを,ここに書いておきたいと思います。

ページ移動

  • 前のページ
  • 次のページ
  • ページ
  • 1

ユーティリティ

2016年04月

- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

検索

エントリー検索フォーム
キーワード

ユーザー

新着画像

新着エントリー

過去ログ

Feed