液晶モジュール COG-C144MVGS-04 をドライブするのに AT90USB162を使うことを検討してみた。

目標とするもの
前記事のとおり、KDPDK15 からパーツを取り、AT90USB162 で再構築する。で、プログラムを書き換えることで、いろんな機能を持てるようにする。
最低限度できて欲しいのは、USB 接続 ディスプレイ 。玄箱に接続して モニターにするのだ。
それ以外では、アラーム時計とか ラーメンタイマー。人にイベント知らせるための デバイスは必須で 希望は振動モータ。圧電スピーカーでも良いが、インバクトがないような気がする。
あとは、microSD を使うなにか。USB 接続だと、(古い)OS インストール用に 擬似 CD/フロッピー機能とか。メディア入れ替えの機能のために、ディスプレイとボタンを使う。
それ以外では、外部にデバイスを接続して... いろんなものを作れるようにしておく。
SPI を出せば、ライターとしても使える。操作系があるので、ひょっとしてスタンドアローンで動くライタになるか ... とも思ったのだが、残念ながら データを取り出すデバイスも同じSPIを使うので 同時には使えず無理っぽい。(後で検討してみよう)
基本的には、
STM32 Primer2でできることばかりなのだが ... Primer2 は 6200円とかなり高価で、複数購入して専用装置として使うことは難しい。(材料費)2000円以下で作れれば、複数作成して、それぞれ専用の装置として使うのに抵抗ないはず。
なにを言いたいかというと、Primer2 を買えば済むなら、作る意味はないので、コスト的なメリットが必要ということ。
ポートの割り当て
AT90USB162 は以下の 21 個のポートが自由に使える。そのうち PD0-7 , PB0-7 と 8bit のポートが 2 つある。
- PD0 - PD7 ( USART , HWB )
- PB0 - PB7 ( ISP/SPI , OC0A TI)
- PC2,PC4-PC7 (ICP1 , OC1x )
8bit アクセス必須だとすれば、USART または ISP/SPI のどちらかは使えない。--- 正確には かならずしもそうではないのだが -- たとえば、A25L080 からの読み込みと (液晶モジュールへの)書き込みを交互にするような場合は独立にアクセスできないと困る。
ここで、ISP + SPI を選ぶ。8bit I/O 用に PD0-7 を使うことに決定。
さて、SPI だが、外部モジュール向けに PB0-PB3 (SS/SCLK/MOSI/MISO) を使うことにする(計 4 本)。SCLK/MOSI/MISO は、内部でも共用することにする。内部デバイスは、A25L080 と microSD を予定。それぞれに /CS 用の信号を割り当てる。(計 2本)
あと必須なのは、液晶モジュール用に RSET/CS/WR/RD/A0 の 5 本と、LCD バックライト用に 1つ (OC0x) 。
ここまでの使用ピン数は、20 -- あと 1 本。振動モータ or ブザー用に 1 本使うとして...
そうそう、ボタン用にも1つ必要だ。まだまだピンが必要な気がする。
バッテリーの低電圧検出は、内部基準電圧(1.1V) と AIN1 で可能なのだが、AIN1 が PD2 に割り当てられている。BOD (低電圧リセット) を高めに設定して、BORF をチェックすることで なんとかするしかないか。
A25L080 は、Deep Power-down モードがあるので電源供給制御用のピンは必要ない。液晶モジュールも sleep モードというのがあり、なんとかなりそう。あとは、microSD とか はどうなのか? 外部モジュールもなにか必要そうだが ... やはりデバイス用電源スイッチは必要そうだ。
あと、バッテリーコントローラ MCP73831 だと、充電を強制的にやめることが出来たり、充電しているかどうかのステータスがあるのだが ... 無視? 充電LED をつけるだけでお茶を濁すのか?
液晶モジュールの RD を使わない(= READ をしない)ことで、ピンを 1 つ節約できそう。あと、microSD をあきらめれば、ピン1つ。
microSD は外部デバイスで接続することにして ... READ も使わないことにして 2 本捻出し、ボタン用に1つ、(CPU 以外の)デバイス電源スイッチに 1 つ。計 21本これで行くしかないか。
名前は?
もっとも大事なことを忘れていた。このボードに名前をつけなくては。
最初は、オリジナルの DPF106 を AT90USB162 で再構成したということで DPF162 なんて考えたのだが、あまり芸がないような気がしてきた。もうすこしひねって Super Ramen Timer - 162 ということで SRT162 としよう。
電源部の検討

こんな感じにしようと思う。USB の 5V を バッテリー制御IC の MCP73821-2AC を通して バッテリーに接続。そのバッテリーを入力として、3.3V レギュレータ MCP1703 を通したものを 電源とする。
(AT90USB162)データシート 7.電力配給の図を見ると UVCC, UCAP, VCC, AVCC に 3.3V を入力し、REGCR の REGDIS = 1 で 内部レギュレータを Off にすればよいらしい。あと、3.3V 動作なので クロックは 8MHz (CPU の周波数、≠ 水晶)。
あと PORT を1つつかって、デバイス用電源スイッチとする。
PWM 可能な PORT にしておくと、段々電圧を上げることで、突入電流対策になるかも。
まぁ、トランジスタの前に 10uF ぐらい入れておけば問題ないだろう。(KDPDK15 の基板を見ていると、PNP トランジスタのそばに大き目のコンデンサがある。-- たぶん 突入電流対策 )
メイン部の検討

以前使ったのをちょっと変更して、配線図を作ってみた。
まず、電源は 上記の通り外部レギュレータに変更。次に HWB 周り、スイッチの上下に 33K と 3.3K抵抗を入れて、PD0-7 の bus と共有できるようにした。あと、暫定的に 外部出力を決めた。
最後に スイッチの形態。2回路スライドスイッチ
IS-2235に変更。

プログラムモードにすると、HWB が ON になり、SS を RESET に入れ替えて ISP を使えるようにするようにした。
DFU Bootloader でファームウェアを書き換えるときは、HWB を ON にしてから USB に挿す。タクトスイッチでは、操作が難しかったので このようにした。
ところで水晶は何を使う?
普通に HC-49/S を使うのが第一案。ちなみに、
このタイプも 普通の HC-49/S として使える。

ただ大きいので、
このタイプが使えないか?

問題は 16MHz しかないことだが、CLKPR で 8MHz にできるし、なんとかなるような気もする。
あと、CS 用の PORT は、PB4/T1 に決めた。T1 を使うことで 周波数カウンタぐらいは作れるかも知れない。
スイッチ部の検討
こんな感じにしようと思う。PD0-7 の bus と共有するために抵抗を入れるのは HWB と同じ。
この回路適当すぎた。 PC2 と GND を入れ替える必要がある。
その上で回路を見ると、普段は 33K で pull-down 。これで HI-Z 状態がなくなる。で、PC2 を H にしたとき、ボタンを押せば H が読める。
さて、他のデバイスがアクセスしているとき、ボタンを押すとどうなる?
.. というと 押すボタンが1つだけなら、なにも起こらない。そいて、複数の場合、3.3K x 2 を通して他の PIN に接続されてしまう。... ただし、6.6K だからプルアップが突如追加になったような見え方になり、普通問題はおきない(はず)。
ところで、高速通信をするバスに、スイッチを直接付けてわざわざノイズを入れるというのは、イカガなものか。... といってもピンも IC を追加する場所的余裕もない。 .... せめて ダイオードを入れて、PIN どおしの干渉を防いだ上で、A25L080 に使う TXD/RXD/XCK を外すべきか。
ボタンの数は、できれば 4 つ。4 つが配置的に無理なら OK(DOWN)を外して 3 つにしようと思う。microSD の センス用に PD6 を考えていたのだが、外部に出力するのも面倒だし やめる予定。
使うパーツは、
TSKB-2JLか
LS6J2M-T。5.2〜5.3m角。どちらも使えるようなパターンにしておきたい。


あと、Common につかう Port は何故か決めていて PC2 。
使うケースを
RFADテクノロジーMK6040 (内寸:55×36×12) に決めた。

それは良いのだが、上面はガラスで加工できないので ボタンをどうするかについて、再検討が必要になった。
やはり別ボードにして、メイン基板からは、端子を出すのが良さそう。上下には余裕があるので、短辺側にボタンを出す。ボタンも普通のタクトスイッチが良いだろう。
... そうであれば、メインボード側は、4つ(3つ)にこだわることもない、PD0-PD7 の 8 本 (+ DEV_3V3/GND) を 出しても良いかも知れない。
ちなみに もう一方の短辺は外部出力の予定。 ... ということは USB は 横?
シリアル ROM の検討

フォントや背景、その他グラフィックを記憶するのに、KDPDK15 から外した 8Mbit の A25L080 を使う。ピン配置は左に示した。外すのに失敗したときのために AT26DF081A を代用できるようにする。
HOLD と W (Write Protect) は、両方 Vcc に接続。あと、S (Chip Select) は、ISP 使用時に動作しないよう 外部の抵抗で pull-up しておく。これに限らず すべての CS は 外部抵抗で pull-up する。抵抗値は 33K の予定。
あと、電源(Vcc)は、DEV_3V3 の予定。
初期データ書き込みは、ライタ ファームウェアを書き込んで、USB からダウンロードするつもり。
注意点としては、この IC やたらでかい、PIN の端から端まで MAX 8.1 mm もある(AT26DF081A は 6.2 mm)。 ランドを広くとらないと いけない。
ところで、オリジナルは、Write Protect 周りに工夫があるようだ。コンデンサと接続されていて、電源投入直後は書き込めないようになっている。ただ... それにどういう意味があるのかは良くわからないし面倒なので無視。
ところで、SPI に接続しているのは、データを読みながら 液晶モジュールに書き込むような使い方を想定しているため。
バッファリングしても良いなら XCK/TXD/RXD を SPI として使うこともできる。こうするメリットは、外部モジュールをアクセスしながら FLASH の データにアクセスできること。
表示が遅くなるだけだから、XCK/TXD/RXD にしたほうが良いように思えてきた。(ちなみに、これに切り替えても必要ピン数は変わらない。)
液晶モジュール部の検討

こんなところ? IF1 = L , IF2 = H にして 8080 モードに固定。LED- は GND にして、LED+ を OC0x で直接駆動しようかと思っている。20mA だし、大丈夫ではないかと。PORT は、PB7/OC0A。
注意! LED+ と LED- が逆。
やはり、トランジスタでスイッチした方が良さそうな気がしてきた。BOD 使うし、リセットがかかっても困るので ... 。
高い電圧(5V とか バッテリー電圧とか)を扱う場合を考えて、トランジスタは、NPN にした方が良さそう。
あと、1u を トランジスタの近くに つけるつもり。

ちなみに、使える PWM は、PC5/OC1B と PC6/OC1A のみ。PWM を使うかどうかわからないが、振動モータ/圧電スピーカ と デバイス電源スイッチに割り当てる。
ところで、ふと思ったのだが ... /RST に PORT 割り当ては必要なのだろうか? POWER ON RESET の機能があれば、DEV_3V3 で POWER ON するので、必要ないとも思えるのだが ... ST7637 のデータシートを見ても良くわからない(というか必要そうな感じ)
コマンドでリセットする SOFT RESET というのもあるし、なんとかなるのではないか?
もし、/RST が必要ないのであれば、/RST 用の PORT を RD に振替えられるようにしておきたい。
そうそう、RD は pull-up 必要そう。/RST を使わない場合も /RST に pull-up が必要なはず。抵抗値は、RD 1KΩ , /RST 10KΩ。
あと、/EXT , VPP は 無接続で OK らしい。
ST7637 のデータシート 8. RESET CIRCUIT で、"After Power ON" と "After Hardware Reset" でなにがセットされるかの表がある。比べてみたら ... まったく同じだった。 ... ということは、/RST は、VCC 直結で OK そうだ。ちなみに、表には "After Software Reset" もあり、これは若干違う。
とにかく、/RST への PORT 割り当ては、必要ないことがわかった。RD に切り替えることにする。 ( ピン 1 つは貴重なのだが、ステータスとか読めるとデバッグに役に立つし RD は欲しい )
液晶モジュール部の検討2
BG999076A も入手できる目処がついた。これから こちらの方が入手が簡単になりそうなので、こっちも検討しておく。

データシートの配線図では、RSTE は、VCC に直結している。やはり使わなくてもなんとかなるのではないか ... 。
ちなみに、LED の電圧は、3.1V の模様。普通に扱える見込み。
あと、シリアル モードも併記しておく。

なんと簡単なことか。15 本だけ配線すればよい。しかもほとんどは、VCC or GND 。あと LED の 2本は、フレキから直接配線することができ、すこし楽になる。
さて、
オリジナル基板の検討(2)なんて記事を書いたが、事情が変わってきた。SRT162 を 液晶モジュール 2 タイプで作りたい。2 枚づつで 4 枚。あまったエリアで ボタンモジュール。これで 5 面付けが埋まる。ちなみに、ボタンモジュールは 4枚に 1 枚の割り当てになってしまうが、全部をケースに入れるとは限らないので問題ない(ことにする)。
問題は、自力でこの基板の 設計ができるか .. 9末までに間に合うかということ。まぁがんばってみるか。
抵抗・コンデンサについて
まず、特別な理由がない限り、チップ部品を使うことに決めた。コンデンサについては、
秋月で入手可能なもの、抵抗については、
千石で入手可能なものかつ
共立のチップ抵抗セット(945円)から選択。サイズは基本 2012 。コンデンサに限りやむを得ない場合は、1608 も可ということにする。(抵抗は値が読めないから不可)。
ちなみに、千石では 2012抵抗は 10 個 53 円で買える。ちょっと高いが手間賃なので仕方がない。
マルツでも同じような値段 0 (ジャンパ)
33 (USB 電流制限)
220 (LED 電流制限)
330 (LED 電流制限)
470 (LED 電流制限)
1K (Tr 駆動用)
2.2K (Tr 駆動用)
3.3K (スイッチ入力用)
4.7K (Tr 駆動用?, 充電電流 PROG 用, プルアップ,プルダウン ?))
33K (スイッチ入力用)
100K (プルアップ,プルダウン?)
1u (1608) 各種パスコン
10u
10p ( 3216 ! 水晶用 -- 発振しなければ 親子で 20p化)
基板レイアウトの検討
使うケースを
RFADテクノロジーMK6040 (内寸:55×36×12) に決めた。
このケースにどのように入れるのか検討してみる。
まず、厚さが心配。
- 液晶モジュール 3mm + 両面テープ (1mm厚)
- 基板 1.5 mm
- リポ電池 (3.7V/210mAH 30mm x 15mm x 5mm)
- クリアランス 1.5 mm
液晶、基板、電池の三層なら、クリアランス 1.5mm でなんとか入る。ただし、電池がある部分(15 mmのエリア) に部品は置けない。
(電池は両面テープ (1mm厚) で基板に貼り付ける。1mm 以下の部品で熱を持たないものなら 一応 OK 。 )
とりあえず OK そうなので、次に基板サイズの決定。
問題なければ 1/2 C 基板サイズ。縦 47mm 横 35mm 。上下方向に 8mm ほどの余裕ができる。ここに ボタンモジュールを配置するつもり。
ボタンモジュールは 1列の L 型ピンヘッダーで直結したい。
さて、15mm 分には部品を実装できないので、全部で 縦 32mm 。ただし、コネクタエリアがある。コネクタの場所は、C 基板に合わせる制限を付ける。縦17穴なので、47 - (15 * 2.54) = 8.90 mm (片側 4.45 mm)。これを引くと 23 mm になってしまう。
コネクタは、上側にボタン用 1列 x 9?。下側に外部インターフェイス用 1列 x 6 の予定。
9 までが限界なのは、四隅に穴をあけることを前提としているため。片側のみなら 11 までいける。
さらに、USB miniB を載せる。そうすると 13mmx10mm ほど取られる。
ちなみに、AT90USB (TQFP-32) のサイズ は、ランドなしで 9mm 角。これ以外に載るデバイスは、A25L080M (5.2 x 7.9mm) 、SOT-23-5 , SOT-23 x 4 。 厳しそうでもあるが .. まぁなんとかなるに違いない。オリジナルだって、ボタン付きで 30mm x 35mm 。ボタンエリアを除いた 20mm x 35mm に主要部品が載っているのだ。
そういえば、スライドスイッチ IS-2235 を忘れていた。

これは下向きに付けて、ケース下面に角穴をあけるのだろう。
電池エリア は 横 30mm だから その横に置けるか。
リセットボタンも必須。バッテリーを付けたら常に Power が入っているから Power On Reset に頼れない。
それと、長期保存するとき、バッテリーを 切り離すジャンパは必要。忘れないようにしないと ...
あと液晶モジュールのサイズについて、基板が 47mm でコネクタエリアが 8.9 mm と書いた。コネクタに干渉しない 領域は 約 38mm ということになる。COG-C144MVGS-04 なら、液晶モジュールのサイズは 38 mm で問題なかったのだが ... BG999076A は 42mm と 4mm ほど長い。下はフレキがあるので、コネクタと干渉させられないので、この 4mm は上にずれることになる。4mm ずらすと、ほぼ基板の端まで行く。BG999076A の場合は、(ピンヘッダを出さないように切る等)ボタン用コネクタの扱いには注意が必要。
そういえば、振動モータなぞ置くスペースはないなぁ。圧電スピーカにしてもかなり薄いものでないと無理そうだ。
ちなみに、圧電スピーカを駆動する場合、次のような回路にする。

これは何年か前にメモした回路。murata のページにあったような気がするが、正確には覚えていない。
それはともかく問題は、小型で 30mH 〜 50mH なんてインダクタは入手が難しいこと。
100 円ショップでアラーム付きのなにか(時計?) をバラして、圧電スピーカと インダクタをペアで入手するのが楽かも。電池 2 個を使う装置が良い。
注意)防犯ブザーは 、音が大きすぎるので適さないので注意。
ついでに、振動モータ(DC モータ)の駆動は次の回路で PWM 制御。

デバイスも決まっていないし、無理に メインボードに インダクタやらダイオードを付けなくても良いような気がしてきた。
メインボード としては、DEV_3V3(+ GND) とオープンコレクタ出力で良いのではないか? ... ということで、この 3pin を外部出力のとなりに並べることにしよう。
ここからソフト系の話題
消費電力について
バッテリーは、210mAH 。常に 1mA 消費するなら、わずか 9日弱で空になってしまう。半年持たすならば、50μA 程度でないといけない。そして、オリジナルの KDPDK15 は、それが出来ている。
さてこいつ(SRT162) はどうだろう。
まず、デバイス用のスイッチが付いているので、デバイスのことは考えなくてよい。生きているのは、バッテリ制御用の MCP73821 と 3.3V レギュレータの MCP1703 。
バッテリー制御: MCP73821 のデータシートを見ても実は良くわからない。Output Leakage Current という項目ならグラフにあって、だいたい 0.2 μA 。ちなみに MAX1555 は、BAT Leakage Current という項目があって 5μA 。
まぁ、新しい IC だし、大丈夫に違いない。
レギュレータ: MCP1703 のデータシートでは、2 μA という記載がある。ちなみに XC6202 は 1μA 。これは大丈夫。
残りは、本体の AT90USB162 こいつはどうか?
27.代表特性をみていくと、27.4 パワーダウン動作消費電流というのがあって、あらゆるデバイスを Off にすれば、5μA 程度にはなるようだ。BOD 許可だと これが 30μA まで増える。内部レギュレータは、(使わないが) 電圧が低下すると やたら増える。注意しないと まずそう。
ざっとみたところ、基準電圧とか アナログデバイスの消費が多いようだ。タイマー1だけは、RTC 的動作をさせるのに生かしておいて、あとはできるだけ Off にする。あと、CLKPR で 1/256 ( 8MHz なら 31.25 KHz , 16MHz なら 62.5 KHz ) にすれば、数十 μA に収まるのではないだろうか?
時計機能について
オリジナルは、32.768 KHz の水晶がついていて、RTC 機能を持っているらしく、時計機能は簡単に作れたに違いない。AT90USB162 は、RTC はないので工夫しないといけない。さて、どうやって時計機能を作ろうか。
とりあえず、水晶を 16MHz 。動作時は 1/2 にして 8MHz で動かすことを前提にする。
Off のとき、外部デバイス・内部デバイスのほとんどを Off にして、タイマー1 だけ動かす。CLKPR は 1/256 で、62.5 KHz 。
タイマー1は 16bit だから、1 秒毎に割り込みを起こして、秒をカウントすることにする。
Off のときの動作はこんな感じになるはず。
で、ON のときの動作は、ストップウォッチとかも作りたいので、1/100 秒で割り込みを起こす。プリスケーラを 1/8 にして、10000 カウントぐらいで良いはず。
ただ、こんな風に すると PWM は使えないので注意が必要。
PWM を使いたければ、単位が 秒ではなく 微妙なものになって、値を 秒に変換するような使い方になる。時刻だけでなく日付も対応しないといけないので、やはり面倒。パス。
こうやって考えれば、動作モードが変わらなければ誤差は発生しない。
動作モードの切り替えで誤差が出るわけだが ... どうしよう。
まず、どれぐらいの誤差が出るか考えてみる。日に 10 回 On/Off するとして、それぞれで 62.5 KHz 10 clock ぐらいの誤差になるとする。そうすると 日に 0.0016 秒の誤差。
一方 水晶の誤差が、月差 15秒だとすると ... 日に 0.5 秒。
なんか無視して良さそう。
時計機能について2
タイマー1の PWM をどうしても使いたい場合はどうすれば良いか考えておくことにした。
まず、タイマー1をフリーランニングにする。こうすることで高速PWM が使えるようになる。そして、32bit カウンタ変数を1つ用意する。(以下 cnt)
動作中では、プリスケーラを 1/1 にする。オーバーフロー割り込みで、cnt を +65536 した後、80000 以上の間 -80000 して 1/100秒単位のカウンタを +1 する。
Off のときも cnt を使う。1/128 になっているので、オーバーフロー割り込みでは、cnt を +65536*128 し、8000000 以上の間 -8000000 して 1/100秒単位のカウンタを +100 する。
cnt で タイマーをシミュレーションすると考えればわかり易いかも。