エントリー

ユーザー「gshoes」の検索結果は以下のとおりです。

シュレッダーを買い換えた

  • 2016/04/11 09:19
  • カテゴリー:散財

 先日のことですが,買って3年ほどになる我が家のシュレッダーが壊れてしまいました。「ガコガコ」を大きな音がするばっかりで,紙を吸い込みません。

 これだけ個人情報に警戒しないといけない世の中で,これだけ個人情報が書かれた書類が手元に届くと,処分するのも一苦労です。手で刻んだくらいでは全然意味がなく,専用のスタンプを押して見えなくしても,実は見る方法などいくらでもあるというのが実際です。

 大昔,有効な定期券と無効な定期券を間違えて,有効な方を当時使っていたシュレッダーで刻んでしまったことがあるのですが,この時も30分ほどで貼り合わせることが出来てしまい,定期売り場の駅員さんもなんの疑いも持たずに,再発行に応じてくれました。

 この時のシュレッダーは,クロスカットとはいえ裁断サイズが4mmとやや大きかったので,以後私は細かいものを選ぶようにしています。

 A4サイズがそのまま2枚まで裁断可能で,2mm幅のクロスカットのものを使っていましたが,ACアダプタ式の非力な物で,次第に裁断能力が落ちていきました。裁断幅が小さい物は,カッターの目が詰まりやすいので,なおさらです。

 そうして半年ほど前ですが,ちょっと分厚い物を裁断しようとするとカッターの間が広がってしまい,全く裁断されないというトラブルが問題になました。そこでプラスチックの枠が広がってしまわないように,2φの銅線で縛り,広がらないようにしたところ効果絶大で,確実に裁断されるようになりました。

 ですがそのせいで過負荷がかかってしまったのでしょうね,先日とうとう壊れたというわけです。

 修理出来るかどうかを確認したかったので分解しましたが,プラスチック製のギアの歯が飛んでおり,ツルツルになっていました。こうなるともう修理は出来ません。あきらめます。これまでご苦労様でした。

 そうなってしまうと後継機を用意しなくてはなりません。

 シュレッダーも本当にピンキリで,大きさも値段も性能も,音も重さも使い心地も,どれも同じ物はないと思うほどです。ゆえに店頭で買うしかないと思っていたのですが,逆に店頭に並んでいるのはごく僅かで,この中から選ぶしかないという不自由さに気が付いて,途方に暮れていたところ,あるサイトが目に付きました。

 この手の話には俄然強さを発揮する,あのラジオライフのサイトです。本誌に掲載された記事の中から抜粋して日替わりで掲載するサイトなのですが,少し前にシュレッダーの評価記事があったことを思い出しました。

 なになに,Amazon限定のコクヨ製AMS-MC20がおすすめ?

 A6までですが6枚までOK,ハイパワーなので高速,音は小さく,裁断幅も小さいと,絶賛です。実勢価格は6400円とあります。

 amazon専用品ではない,これと同じようなものがあるだろうと探してみましたがすでにディスコンになっています。後継機はスペックダウンしていて,特に裁断幅が大きくなってしまっています。ここはこだわるべき所です。

 ということで,結局AMS-MC20を買うことになったのですが,価格はこの時点で6600円と値上がりしています。なんか悔しいですね。

 あきらめようとしたとき,ふとカラーバリエーションで安い物が目に付きました。ピンク入りが5900円です。ちょうどタイムセール中で残り1時間,しかし誰も買っていません。

 これも何かの縁だと,何のためらいもなくピンクを注文しました。私の話など誰も興味はないと思いますが,私は色にはあまりこだわりがなく,色を理由に購入をためらうことはありません。もちろん好みの色や嫌いな色はありますが,理由はともかく縁あって手元に届いたのですから,それはそれで愛着がわきます。

 その結果気にいればなおよしで,自分では選ばない色がやってくる面白さは,次はどんな色の円があるのだろうと,楽しみにさえなっています。

 しかしながら,届いたピンクは,ちょっと下品でした。タイムセールになったのも,きっと不人気だったからでしょう。同じピンクでもサーモンピンクとか,桜色のような上品な物ならいいのに,合成着色料バリバリのショッキングピンクです。ブラックライトを当てればきっとぱーっと光り輝きますよ,これ。

 ですがピンクの好きな4歳の娘は大喜び。「ピンクのきかい」とすっかり気に入ったようです。私は彼女に,シールを貼っても買わない場所として,このシュレッダーを解禁することになりました。もう好きなようにデコレーションして下さい。

 さて,使ってみたところ,さすがはラジオライフが太鼓判を押しただけあり,想像以上の素晴らしさです。レターパックのボール紙も楽々裁断,切り口は鋭く,実に綺麗です。A6サイズは小さくて不便かもと思っていましたが,むしろ危険な挿入口が小さいことは安全に繋がることでもあるので,これだけパワーがあるなら折りたたんで使う方が合理的とさえ思います。

 これまでの物と違い,紙を差し込めば裁断が始まり,終われば自動で止まります。主電源もちゃんあるので,待機時の電力も気になりません。

 そしてコクヨ製だなあと思ったのは,安全面です。挿入口にはフタがあり,開け閉めも面倒でないように作ってあります。これはいいですよ。小さい子供が面白がっておかしな物を突っ込むと,大けがをしますから。

 音も静かで,夜でも使えます。裁断面が綺麗なので,くずかごがすぐに一杯になってしまうこともありません。大きさも手頃ですし,A6サイズということもあり,長さが短くて,置き場所にも困りません。

 パワーのあるシュレッダーは頭が重く,不安定になりがちですが,この製品は安定感もあり,安心です。いやほんとにいいですよ,これ。

 もっと他にもいいものがあるのかも知れませんが,特に不満点が見つからない高次元でのバランスは,家庭用の小型シュッダーに求められるスペックを吟味しているといえ,スピードと騒音,そして2mm幅の裁断で妥協しない,とてもよいものだと思います。

 ところでこの製品,amazon専用品ですので,茶色の素っ気ない箱に入っていたのですが,その箱をさらにamazonの段ボールにいれた状態で届きました。

 非常に大きな箱から取り出した「ピンクのきかい」を見た僅か4歳の娘をして「なんで大きな箱にもう一度入れるの?」と言わしめた,amazonの無駄には私も大いに同意するところです。amazon専用品なら,箱に直接送り状を張り付けて送ってもらっても,私は全然構わないんですが・・・


AVRtiny13Aでつくるシリーズ番外編2 LCD8812K4-01でTCXO時計を

  • 2016/04/08 07:18

20160407134350.jpg
 さてさて,LCD8812K4-01というaitendoの特価LCDを,とりあえずセグメントだけ動かしてみたわけですが,そもそもこれは,同じaitendoで買ったI2CセグメントLCDの交代要員として使いたいという話からスタートしたものでした。

 動かしてはみたものの,LCDまわりのハードもソフトも新規になって,新しい時計をもう1つ作るのと同じくらいの手間ですから,交代要員もクソもないんですが,せっかくですからやるだけやってみましょう。

(1)ハードウェア

 これまで,クロックジェネレータであるSi5351AとLCDが同じI2Cであることを最大限生かし,ピン数を大幅に削減できたことで,tiny13Aでの実装が可能になっていました。2端子で複数のデバイスをぶら下げる事が出来るI2Cは,こうした少ピンのマイコンにはぴったりです。

 ですが今回は,Si5351AにI2C,LCDにSPI(SPIではありませんが,書き込み専用とすればSPIといえなくもないので,以下SPIと書きます)と,それぞれのデバイスにそれぞれのインターフェースを用意しなくてはいけなくなりました。電気的にもソフト的にも,tiny13Aには厳しいです。

 まずはピンの問題から。I2Cに2本,SPIに3本,32.678kHz入力に1本ですでに6本です。この段階で,RESET端子を潰してGPIOにすることは避けられません。なんというか,滅多に使わないだろうなと思っていたヒューズリセッタが大活躍ですよ。

 しかしそれでも,時刻設定用の悪阻ボタンスイッチが置けません。そこで,Si5351Aの初期設定時にだけ必要なI2Cを,設定後に入力端子に再割り当てし,ここにボタンを2つをぶら下げることにしました。I2Cはプルアップされているので,ボタンを置くにも困りません。

 確かに,押しボタンスイッチをI2Cのプロトコルに従って操作すればSi5351Aが誤動作してしまうわけで,こういうのはプロの設計では御法度です。アマチュアの特権ですね。楽しい楽しい。

 これでなんとか必要なピンは揃いました。


(2)ソフトウェア

 I2C用LCDサブルーチンを,先日のLCD8812K4-01用サブルーチンに置き換えるだけです。本来ならこれで動くはず,でした。

 しかし予想通り,大幅なメモリオーバーが発生して,書き込めません。2割ほど減らさないといけないなんて厳しいです・・・

 そこで,まずSi5351Aの設定のうち,後半のゼロばかり書き込む部分のライトを省略しました。本当はこういうことはやってはいけないのですが,初期値がゼロならわざわざ書き込む必要もないので,すっとばします。アマチュアの特権です。

 次に,意外にメモリを食う_delayを,I2C関連の関数から可能な限り外して行きます。これもSi5351Aさえ動けばいいので,ばっさり取っていきます。アマチュアの特権です。

 そして,ボタンのチャタリング対策も取ります。これも使う人がイライラするだけの話ですので,極論すれば私が我慢すればいいだけです。アマチュアの特権です。

 と,ここまで頑張って,I2Cのリード関数が残っていることが判明。使っていないので削除すると,綺麗にメモリ内に収まりました。めでたしめでたし。


 完成して動かしている写真が,冒頭のものです。コロンが使える桁だけを使ったため,画面の一部しか使っていない不細工なものとなってしまいました。

 当初,左側の2桁を時に使い,右側の4桁で分と秒を表示することも試みたのですが,見にくくなってしまったのでやめました。(これはコロンが表示出来ないという問題がきっかけだったのですが,見にくさにあらがえず,コードサイズの増大と戦いながらコロンを表示させることが出来たので,取りやめたという経緯があります。)

 メモリに余裕があれば,左側の4桁にカレンダーでも表示しようかと思ったのですが,これだけカツカツ(きっちり1024バイト使い切りました)だともう全然無理でした。

 ということで,この時計の話はこれでおしまい。

 そのうち,このLCDを本気で使い切るために,他の表示エリアも使ってみようと思います。そうすると自動的にピン数がtiny13Aでは足りませんので,tiny2313を使う事になるでしょう。

 メモリも増えるのであれこれ出来そうですが,とりあえすTCXOを内蔵したリアルタイムクロックICが売っているそうですので,これを試す時に使ってみましょうか。時刻は今の表示位置でいいとして,下のキャラクタ部に年月日と曜日を出してみましょう。

 そうすると,それぞれの設定が複雑になりますね。そうだ,設定用のディスプレイに左側の4桁を使いましょう。モードボタンを1つ追加して3ボタンとし,変更可能な値が表示された左側4桁の数字を,残りの2つのボタンで増減します。終わったらボードボタンを押して,次の設定項目に切り替えます。

 増減ボタン2つを押せば秒がリセットされる仕様はこれまで通り。

 まあいろいろ考えているうちが楽しいものです。

AVRtiny13Aでつくるシリーズ番外編 LCD8812K4-01を動かしてみる

  • 2016/04/07 13:42
  • カテゴリー:make:

20160407134351.jpg

 ATtiny13Aを使った工作,今回は番外編です。

 先日,aitendoで99円で購入した,I2CのセグメントLCDを使ったTCXO時計が壊れてしまったことを書きました。

 TCXOの時計だけに時刻はほとんど狂うことなく,それだけにLCDの破損は非常に残念でした。原因は未だ不明ですし,完動品のLCDが手元にないため交換して治ることも確認出来ず,本当にLCDが悪いのかどうかも実は断言出来ません。

 しかし,tiny13AからはちゃんとI2Cで信号が出ていますし,Si5351Aの設定も出来ていることから,やはりLCDに問題がある可能性が濃厚でしょう。

 同じLCDが手に入らないものかなあと探してみましたが,既に売り切れており同じ物は手に配送にありません。全く同じ物でなくてもいいと「I2Cでセグメント」という条件で探してみても,なかなか見つかりません。

 そういえば,先日GPSモジュールをaitendoで買った時に,199円の特価LCDを2つ買ってあったことを思い出しました。これに交換しようと考えたのですが,それはそう簡単にできません。

 このLCDは,「LCD8812K4-01」という品名で売られているものですが,少なくとも昨年の12月頃には売られていたようです。値段は199円と安いのですが,実はデータシートがなく,サンプルコードもありません。要するに動かすにはそれなりに努力が必要なものだということです。それでこの値段はちょっと高いかなあ。

 壊してしまったI2CセグメントLCDの場合,ピン配置もサンプルコードも出ていました。発売されてからの時間も経っていたので,いろいろな人が実際に動かしていたので,そこも問題はありませんでした。

 ですが,今回のLCD8812K4-01については情報が不足している上に,動作例がありません。分かっていることは,LCDコントローラが2つ載っていることと,それぞれ独立したインターフェースであること,セグメント側はSPI(でもHT1621の仕様書にはSPIとは一切書かれていないし,実際のところSPIとは違います),キャラクタ側は8ビットパラレルであること,電源は5V単電源であること,そしてピン配置です。

 問題なのは,仮にセグメントだけを使う場合でも,SPIなのでI2CのLCDの代わりにはならないということです。SPIで繋げばいいだけじゃないかというなかれ。I2CのLCDだからこそSi5351Aとバスを共用でき,そのおかげで8ピンしかないtiny13Aでも時計が作れるのです。

 ですがSPIのLCDを使うとなると,バスをSi5351Aと共用できませんから,I2Cとは別にSPIも用意しないといけません。SPIが3本,I2Cが2本,32,768kHz入力に1本,これですでに6本ですから,ボタンが置けません。うーん,2313を使うしかないのか。

 もう一度考えます。

 I2CはLCDを制御する役割がなくなり,Si5351Aの初期設定だけに使う物になったので,設定後は入力に切り替え,ボタンを置いても良さそうです。そうするとどうにかピンは足りますね。

 どっちにしても,LCDを動かしてみないことには先に進めません。そこで,この前人未踏のLCD8812K4-01を,とりあえずセグメント側だけ動かしてみることにしました。


(1)ハードウェア

 このLCDの端子は16個あります。電源とGNDは共通ですが,セグメントとキャラクタで別々の信号が出ています。今回はセグメントだけを使いますが,セグメントはSPIという情報から,前半の5ピンが関係しそうです。

 aitendoのサイトでは,1ピンからCS,WR,A0,VDD,GNDと並んでいるということですが,SPIにA0なんて端子はありませんし,搭載されていると書かれているHT1621というLCDコントローラの仕様書を見ても,そういう端子はありません。

 そこで,A0というのはDATAであると仮定しました。そして本来HT1621に備わっている読み出し用の端子RDは,このLCDでは外には出ていないものとしました。書き込み専用ということですね。

 仕様書をさらに見ていると,読み出しの際にはRDをクロックにしてデータが出てくるようですけども,これは明らかにSPIじゃありません。ですのでこのLCDはSPIではないということになるのですが,書き込み専用とすれば,SPIと見なして動かす事が出来ます。


(2)SPIをソフトで書く

 SPIは単純ですので,HT1621の仕様書に従ってソフトで実装することにします。マイコンはもちろんtiny13Aです。

 仕様書を見ているとリードについても書かれていますが,RD端子が外に出ていないので今回は無視です。書き込みのみを実装します。

 で,ちょこちょこと書いてみると,なにやら動いているようです。結構あっさり動いてしまったので拍子抜けです。

 コマンドとデータの書き込みを行う関数をさっと書いて,一応簡単なライブラリのような物を作っておきます。

 不安があるのは,ウェイトをどこにどれくらい置くべきかがさっぱりわからないことです。インターフェースのタイミングはわかりますが,例えば電源投入後最初のコマンドを投げるまどれくらい待てばいいかとか,内部発振器の発振安定時間はいくつかとか,コマンドを投げてそれが有効になるまでの時間がどれくらいか等,全然かかれていません。

 とりあえず動いた,と言うやり方で進めるしかなさそうです。こういうのはトラブルの原因になるんだけどなあ。まぁしゃあないですね。


(3)初期設定をどうする

 ここまでで一応LCDを叩けるようになったのですが,初期設定の手順やコマンドの役割などが不明なままです。HT1621の仕様書だけでは正確なところはわかりませんし,LCDごとに異なる設定が必要な箇所もあります。

 とりあえず必要っぽいのは,SYS ENというコマンドと,LCD ONというコマンドを発行することのようです。ところが,これだけだとどうも動作が不安定になってしまいます。具体的には,4ビット目のデータが電源投入のタイミングによって,ちゃんと反映されたりしなかったりするのです。ですから,すべてのセグメントを点灯させようとしてすべて1を書き込んでいるのに,時々一部のセグメントが点灯しません。8になったり9になったりするのです。

 きっとタイミングの問題だろう,特に最後に書き込むデータがおかしいのならデータ送信後に送るCSのタイミングじゃないかと,ここのウェイトを調整しましたが,発生頻度に変化こそあれ,完治しません。困った。

 そこでもう少し調べて見ると,RC256kというコマンドを発行すれば安定して動作することがわかりました。


(4)マッピングを調べる

 初期化までは出来ました。この時点でRAMにデータを書き込みさえすれば,何らかの表示が行われるようになりました。

 次は思い通りにセグメントを点灯させるために,RAMとセグメントの対応を調べます。

 HT1621は,32x4bitのRAMを持っており,これが各セグメントに繋がっています。よって全部で128のセグメントを個別に操作できるわけです。しかし,どこにどのセグメントが繋がっているのかが分かりません。これはもう,地道に実際に点灯させて調べていくしかないです。

 私の場合,まず32のすべてのアドレスに対し1を書き込み,点灯したセグメントに「1」とLCDの写真に書き込みました。次にデータを2にして同じ事をやり,次に4,その次は8と繰り返します。

 終わったら,アドレス1つに0x0fを書き込んで,点灯したセグメントに対してアドレスを書き込んでいきます。結局,128の組み合わせを総当たりで試したわけですね。

 そして,分かったマッピングから,フォントを作ります。あまり複雑な関数を作るとメモリが足りないとか言われそうなので,必要最小限の機能に絞った小さな関数で済むようにします。


 ということで,LCD8812K4-01を実際に動かしたソースです。これを実行すると写真のように左から0,1,2,3,4,5・・・と10桁分数字が並びます。

続きを読む

AVRtiny13Aでつくるシリーズ6 気圧センサとI2Cのリード

  • 2016/04/05 09:44
  • カテゴリー:make:


 そろそろ面倒くさくなってきたtiny13を使った工作ですが,今回で一応一区切りです。I2Cについては,よく考えるとライトはやっていますが,リードはやっていません。センサなどを繋いだ場合はリードがメインになるだけに,これをやっていないというのは少々物足りません。

 なにかないかなとジャンク箱を漁っていたら,随分昔に秋月で購入した気圧センサ,フリースケールのMPL115A2が出てきました。600円。今,同じ物が400円で売られているんですね。

 I2Cで繋がる気圧センサとしては数年前からよく知られたメジャーなものです。デジタルで情報が飛んできますが,残念ながら値を結構複雑な計算で求めねばなりませんし,チップごとに校正された補正値を読み込んで,その係数を使う必要があったりとなかなか面倒です。

 そのわりには,今ひとつ精度も良くないという事らしく,人気の方は今ひとつという感じです。

 ですが,ちょうどI2Cのリードを試すにはちょうどいいですし,600円もしたんですから使ってみたいと思いました。しかし,この気圧センサはLGAというピンのないパッケージに入っており,小型である事もあいまって,実装が大変です。

 変換基板などもありませんので細いワイヤーで信号を引っ張り出すことにしますが,電源とGNDとI2Cの信号線だけですから,4本だけです。それならなんとかなるでしょう。

 ということで,信号線を引っ張り作業を始めたのですが,これがなかなか難しい。すぐに熱が回ってしまうので,一度付けたハンダがポロッと外れてしまうこともしばしばです。

 そうこうしているうちに,なんと電源のランドがハンダゴテの熱で剥がれてしまいました。万事休す。もうダメだ。俺は寝る。

 しかし,虫眼鏡でよく見ると,剥がれたランドのそばに,電源のパターンが走っています。ここにワイヤーをハンダ付けすればなんとかなるかも知れません。

 慎重に他の信号も引っ張り出して,とにかく外部にピンを出す事に成功しました。

 でも,これで動く保証はありません。というか,ほぼ壊れていると考えていいでしょう。そこで,mbedで動作を確認します。サンプルコードを探すと,あったあったありました。

 さくっと実行すると,気圧と温度と高度がLCDに表示されます。それなりに意味のある数字が出ているようですので,とりあえずこの気圧センサは生きているようです。

 で,あとはtiny13Aです。

 I2Cのライブラリの中に,リードを行う関数が用意されてはいるのですが,これをコールすればそれでいいというような簡単な話ではありません。

 MPL115A2の仕様書を読んでいると,リードの際にはまずコマンドを発行して読みたいレジスタを指定するとあります。それが済んだらリードをするという事です。

 ここで注意すべきは,ホストがリードを行う場合には,アドレスに+1しないといけないということです。この+1は,R/Wビットといって,ホストがライトするときには0,リードするときには1を書きます。

 これを0ビット目とし,あとはアドレスを1から7ビット目まで置いた合計8ビットを,スタートコンディションの次に送ります。

 MPL115A2のI2Cアドレスは0x60なのですが,ライトの時には0xc0を,リードの時には0xc1を送る必要があるということですね。

 ところが,スタートコンディションに続いてアドレスを送り,コマンドを送った後,どうやってR/Wビットを1にしてリードモードにすればいいのでしょう。

 仕様書によると,ここはリピートスタートコンディションを送るとのこと。

 べた書きすると,こんな感じになります。

    I2C_Start();
    I2C_write(0xc0);    //    addr + R/W bit = 0
    I2C_write(0x04);    //    command 0x04(read add = 0x04)

    I2C_Start();    // Repeat start condition(W/O Stop condition)
    I2C_write(0xc1);    //    addr + R/W bit = 1

    a0m = I2C_Read();
    a0l = I2C_Read();
    b1m = I2C_Read();
    b1l = I2C_Read();
    b2m = I2C_Read();
    b2l = I2C_Read();
    c12m = I2C_Read();
    c12l = I2C_Read();
    I2C_Stop();

 これは8つの補正値を読み出すコードなのですが,I2Cではストップコンディションを発行する前にスタートコンディションを発行すると,それはリピートスタートコンディションと見なされて,バスが解放されないまま,アドレスを再送出来るのです。

 ところが,変換開始から変換後の値を読み出すところは,またちょっと違うんです。これも仕様書によると,以下のようになります。

    I2C_Start();
    I2C_write(0xc0);    // addr + R/Wbit = 0
    I2C_write(0x12);    // command = 0x12, 0x01(convert start)
    I2C_write(0x01);   
    I2C_Stop();

    _delay_ms(5);

    I2C_Start();
    I2C_write(0xc0);    // addr + R/Wbit = 0
    I2C_write(0x00);    // command 0x00(read add=0x00)

    I2C_Start();        // Repeat start condition
    I2C_write(0xc1);    // addr + R/Wbit = 1

    bm = I2C_Read();
    bl = I2C_Read();
    tm = I2C_Read();
    tl = I2C_Read();
    I2C_Stop();

 0x12というのは変換開始のコマンド,次の0x01はダミーです。ここで一度ストップコンディションを発行してバスを解放しています。そして数ms待った後で,改めてスタートコンディションを出しているんです。

 あとはどこを読みたいか書き込んで,リピートスタートコンディションを出してから読むという流れなのですが,変換開始のコマンドのあと,わざわざバスを解放しないといけない理由がよく分かりません。

 まあ,普通に考えたら5msも待つんですから,その間にバスを明け渡して他が使えるようにしないといけないわけですが,今回のようにバスを占有しても問題がない場合は,別にいいんじゃないかと思ったのです。

 しかし,試してみたらダメでした。

 やはり仕様書の通りに書かないとダメのようです。

 で,あとは気圧と温度の表示なのですが,これがとても面倒くさい。とても1kバイトのメモリに入りそうにないと悟った私は,とりあえず気温だけ表示することにしました。

    t = tm<<2 | tl>>6;
    t = 250-(t-498)*1000/535;
    lcd_cmd(0xc0);   
    lcd_data(t/100 + 0x30);
    lcd_data(t/10%10 + 0x30);
    lcd_data('.');
    lcd_data(t%10 + 0x30);
    lcd_data('C');

 tはint型で,tmとtlはchar型です。tmを2ビットずらし,tlを6ビットずらして,トータル10ビットの値として,int型に格納します。出来るだけ小数点を使わないようにするために,補正式をちょっと修正しました。本当は,25-(t-498)/5.35で計算するんだそうです。でもおかしいんですよ。472で25度になるという話なのに,この式だと25度にならないですよね・・・まあいいか。

 一応これで温度の表示は出来たのですが,値がとにかく数度単位でばらつくんです。それでももうやる気を失って,やめました。

 ということで,なんとなくだらけたところで,このシリーズはちょっと休憩。小さい小さいマイコンを気軽に使いたいという話から,なぜか限界ギリギリを責める話になってしまったわけですが,これはこれでパズルを解くような面白さがあって,とても楽しかったです。

 たまにはこういうこともやってみるものです。

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日ほど動かしましたが,目視で分かるようなズレが出なかったことを,ここに書いておきたいと思います。

ユーティリティ

2026年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