2010年02月24日

PWR44

勢いで tiny44A のボードを設計した。




パターンを見ただけで、やっつけ感バリバリ。



回路図はこんなの。抵抗値などは適当。

忘れそうなので、どんなものを作ろうと考えたかメモしておく。

基本は、ステップダウン DC-DC コンバータの回路。Pch MOS FET を PWM でスイッチングして、電流と電圧を測定し フィードバックする。

電源は、DC ジャックから取る。
スイッチングの回路を簡単にするため、tiny44A の VCC も 入力と同じにしている。

基準電圧は、1.2V の レギュレータを使おうと思う。出力 電流が 0 だと 安定しないかも知れないので、抵抗を付けている。

電流測定は、差動入力の ADC を使う。分圧しないでそのまま接続。

電圧測定は、別の ADC 。基準電圧は 1.2V なので とりあえず、5:1.2 で 分圧。ノイズ対策 か 微調整のために、2012 の パターンを1 個 付けている。

    あ、間違ってる。GND にすべきところに ADC を接続している。... ダメダメだ。

あと、インジケータとして LED を 2 個付けられるようにしている。2色LED の SEC2764C を予定。

コネクタは、電源入力と出力。あと ISP 。ISPの信号は、ホストと接続したり、(自作)I2C ディスプレーと接続するようなことを考えている。

なにができるか ... というと 最初に考えたのが NiMH の充電器。

市販の 充電器もボタンがないし、LED だけつけようと考えてこうしている。

そうは言っても、他にもいろいろ使えるはず。ちょっとメモ


  • 高機能電源

    電圧・電流がわかるのだから、ホストとつなげて、ログしたり 電圧を設定したりすることは出来そうだ。

    問題は、電源が 5V 系(予定) なこと。自作装置はすべて 3.3V 系で統一しているから、接続できるものがない。秋月の FT232RL ボードぐらいか。... となると、ソフト シリアルで通信することになりそう。(自作)I2C ディスプレーにつなぐ場合は、5V にも対処できるようにしておけば OK 。

    もっと問題は、高機能であっても高性能にはならないこと。

    ADC からフィードバックするので、出力電流変動が大きいと レスポンスが悪くて追従できないかも。あと、VCC が 入力と直結だし、スイッチングするのでノイズの影響を受ける。

    制御せずに 電流測定をするだけならまだ、なんとかなるかも。

    ちゃんと作るべきだったとは思うが、まずは使ってみようと思っている。

  • ボリュームでの制御。

    ADC はいっぱいあるので、電圧を設定するのに ボリュームを使えても良さそうだ。

    フィードバックの レスポンスは落ちるが、これも試してみようと思う。


反省点。

今日発注したのに、すでにいくつも反省点がある。-- まぁやっつけだから仕方ないか。


  • ノイズ対策
    よく見たらパスコンすらない。スイッチングの入力のコンデンサと同じでは、ノイズ乗りまくりになりそう。

    LC フィルタを通して VCC に接続すべきだった。

    あと、ベタアースとか。実を言うと試してみたのだが、うまくできなかったのでやめてしまった。

  • ボリューム用パターン

    全然考えてなかった。基準電圧を切替えるのは嫌なので、1.2V - GND を分圧するのが良いかも知れない。

  • ホスト との通信。

    電圧差があるので I2C は無理そう。シリアルならそれで良いので、出力を分圧するぐらいしておいても良かった。

  • 電圧フィードバック

    ADC ではレスポンスが悪い。... とすれば コンパレータは使えないのか?

    コンパレータと比較する電圧を PWM で作れば レスポンスが良いものを作れたかも知れない。

    ただし、PWM の電圧を安定させるには、電源をレギューレータにしないとまずそう。... あるいは、コンパレータと比較する電圧を測定した方が良いか。



... というわけで、充電器になれば幸い みたいな基板になってしまった。まぁそういうものでも使っていこうと思う。


追記:あまりにひどいのでデータを作り直した。... あとの祭りだが、次の機会に出すためには用意しておかないと。

    基板データに問題があるという連絡がきた。自作面付けツールのバグだったが、これ幸いとデータ入れ替えすることに。

データ:pwr44-0.2.zip
更新データ:pwr44-03.zip (EzPCB 向けに DRC 変更 と 他の小基板も同梱)





電圧のレベル変換を、抵抗+ツェナーですることにした。V-USB をかで使っている方法。これなら I2C も OK 。... というか I2C の出力 H は pull-up だから 電流もあまり流れず都合が良い。

あとは、ボリューム用に基準電圧を出力したり、コンパレータを使えるようにしたり、VCC の前に LC フィルタ入れたり。

メモ;

普通に ADC で電圧測定する場合は、ADC2/AIN1 を使う。基準電圧 1.2V なので 分圧抵抗を入れる。

電流は、ADC5 - ADC3 。差動入力が使える組み合わせ。

さて、コンパレータを使う場合。OC0B で比較する電圧を作る。その先に ADC1/AIN0 が接続されている。ADC1 で期待した電圧かどうか測定してフィードバックをかける。

この電圧は 基準電圧の1.2V 以上は必要ない。C6 と並列に抵抗を入れて PWM の精度を無駄にしない方が良い。

制御は、AIN1 > AIN0 になったのを割り込みで検出して 一定期間 メインのスイッチングを止めるとか。

パーツリスト

抵抗やコンデンサの値は決めていない。それ以外のもの。


  • ATtiny44A-SSU
  • U1 MCP1700T-1202E 基準電圧用 (1.2V)
  • Q1 Pch MOS FET(SOT23)DMG3415U
  • L1 NRG4026T 22uH/0.9A (VLF4012AT 47uH/360mA(秋月)など 4mm タイプも一応適合)
    NR5040T 22uH/1.4A とかもぎりぎり載るかも。
  • L2 CB2518T 22uH or 47uH (or マイクロインダクタ 47uH(秋月))
  • D1 SBD (SOD-123) SS2040FL(秋月) , RB161M
  • D2 SEC2764C(秋月)
  • D3,D4 ツェナー 3.3V RD3.3S(鈴商) , BZT52C3V3
  • DCジャック マル信 MJ-83/84 (pdf) (秋月)
    DCプラグは、φ3.4 x 1.4 。3.5mm x 1.3mm も? 千石や共立 他で扱っている。
  • RC値の案

    R1 100k (1k 〜 470k )
    R2 100
    R3 0.1 (〜 1) ±1% 電流測定用
    R12,R13 220 (100 〜 1K)
    R4 47k R5 12k 電圧測定用
    R6 100k (10k 〜 )
    R7 1K LED 高輝度赤 (Vf 1.7V)
    R8 470 LED 黄 (Vf 2.0V)
    C6 10u + 47k, R11 100k -- PWM の電圧を 1/3 ぐらいに。cut-off 0.5 Hz
    R9,R10 10k (1k - 10k) -- ISP で使用するため。
    C4,C5 1u
    C3 10p で cut-off 7.2 kHz -- たぶん不要。
    C7 10u (L2 = 47u なら cut-off 7.3kHz )
    C3 22u (L2 = 22u なら cut-off 7.2kHz )

    C2 は、22uF 以上。3216 100uF(Z)(秋月) とか 3216 47uF(K)(秋月) とか。

    PWM は 40kHz 以上を目指す。8MHz 内蔵rc なので、200 clock 周期 以下。OSCCAL 変更で周波数を上げるのもアリか。
    ADC の フィードバックの周期は 15kHz ぐらい? レスポンスは十分かも。


インターフェイス

インターフェイスに使える信号は 2 本しかない。MOSI/SDA と SCK/SCL だけ。ただし、3.3V 対応にはできる。

要するに I2C のマスタか スレーブ。マスタの AVR に接続して I2C で通信すれば、一応なんでもできるはず。I2C のマスタにする場合は、(自作)I2C ディスプレーを接続する。

それ以外には、ADC4 と ADC6 になるので、ボリュームが 2 個までつなげる。

それでほぼすべて。I2C 用の線をソフトシリアルにすることは可能だが ... たぶん使わないだろう。

追記:基板ができて来た。



posted by すz at 18:56| Comment(0) | TrackBack(0) | 日記

2010年02月11日

はさみで切れる基板

アマゾンで売っている ユニバーサル基板(黒)超薄型t=0.4mm 230x320mmは、ハサミで切れる基板として、「なんでもつくっちゃうかも」他で紹介されている。

さらに自由に曲げられるユニバーサル基板 なんてのもある。これは、「スタバブログ」で紹介されていた。

    2011/1/16 追記: 結構安いものもあるようだ。

    しまりす堂というところだと、片面だが 70x90mm が一枚 200円。10 枚セット 1800円。両面大型だと 180x300mm ののものが 1700 円。
    さらに 400mm x 150mm なんてのもある。

    どうも 自動車の LED 装飾用の市場というものがあるらしい。

「エレ玩 Konyaの開発記録: 自己流基板制作方法覚書き」は、プリント基板の作り方が解説されている素晴らしい記事だが、実をいうと 「0.5mm厚の基板を使用しているので、基板カットはハサミで大雑把に切り、ナイフで仕上げます。」という記述が一番驚いた。

とにかく、基板というものは、0.4mm 〜 0.5mm までならハサミで切れるもののようだ。

    基板がはさみで切れるものだという発想自体がなかった。シール基板(0.1mm)なら切ったことはあるのだが、そのとき どの厚さまでなら切れるのだろうなんて考えなかった。

    30mmx10mm の基板を作ったときは、相対的な厚みに驚いた。もうブロックのような感じ。これ以上小さなものを作るのは難しいだろうと思った。はさみで切るのなら、いくらでも基板を小さくできる。SOT23 サイズ 2 個だけのせた基板でも問題ない。

この事実を知ったとき、最初に思ったのが、0.4mm 〜 0.5mm の基板を発注できたら、面倒だったり高価だったりする面付け指定しなくとも良いし、極小基板も自分で切れば作れるではないかということ。

PCBCARTが、0.5 mm を扱っているので調べてみた。

自分で切るなら、サイズは 80x100 で良さそうだ。デフォルトからシルクを 2面に変更したのを ベースとして、0.5mm にしたものと、さらに レジスト色変更+金色仕上げの比較。

    80x100 Silkscreen 2sides
    10 20 50 75
    1.6mm $ 95.50 $ 115.70 $ 160.70 $ 191.95
    0.5mm $ 116.30 $ 139.10 $ 194.20 $ 232.45
    0.5mm + ETC $ 129.00 $ 153.50 $ 214.20 $ 256.70


まぁ安くはない。だが、B基板だって 20枚買えば 4000円近くにはなる。20枚作るとして、高々 それの 3倍ぐらいだ。よく使うパターンを集めれば十分もとはとれる。.... と思うことにしよう。

EzPCB も 0.4mm 厚が発注できるようだ。

ちょっと値段をメモ

    80x100
    10 20 50 75
    1.6mm $ 121.14 $ 166.66 $ 262.53 $ 330.38
    0.4mm $ 116.31 $ 148.86 $ 218.29 $ 271.86

シルクはたぶん片面。

追記: 秋月の SMDプロトタイピングガラスユニバーサル基板(0.3mm厚)Cタイプ(72x47mm) もハサミで切れる。裏面はベタグランドだそうなので、丈夫なような気がする。

    追記 :
    これは、結構便利につかえる。ただパターンが細かすぎで となりにブリッジしたりしてハンダ付けは、なかなか難しい。



    ちなみに、こんな風に USB MINI-B コネクタを無理やり載せることもできる。これを切って親基板に貼り付けるといったこともできる。


2011/1/16 追記

    なんと 0.8 mm でもはさみで切れた。詳しくは『Fusion PCB』の記事を参照。



    使ったはさみ。百均で購入。... 確かセリアの ペット関係。



    はさみで切れることが分かったので小基板を詰め込んだのを設計してみた。記事は『小基板セット』。

    Fusion PCB は 50mm x 50mm までなら 最低 10 枚 でほぼ 2000円(送料込み)。( 今まで発注したのは おまけが付いて 12 枚入っていた。)

    10枚だとしても 一枚 200 円。この基板は 8 つ入れたから 1 つ あたり 25 円。全部について同じ数必要というわけではないが、格安感がある。10m x 10cm に 面付すれば、4 倍入って 4000円ぐらい。そこまで数は必要ないので作らないが、そういう手もある。
posted by すz at 12:14| Comment(1) | TrackBack(0) | 日記

2010年02月10日

シリアルLEDディスプレーメモ

何日か前に、秋月の 3桁 7セグLED C-533SRをみたら品切れだった。(今は入荷したようだ) これで思い出して 8x8 の BU5004-R はどうなったのか見てみたら、なくなっていた。2色の BU5004-RGはまだ売っているようだ。

なくなりかけてから記事にするのもどうかと思うが、なくなってしまっては記事を書けないので、これらを使ったものの記事を書いておこうと思う。

BU5004-RG を BU5004-R と同じ配線にすると 緑の単色ディスプレーになる(はず..確か)。RG を R の代替として Tiny2313 を使った簡単配線の シリアルディスプレーを 考えてみようと思う。

    実は、昔に記事にしたものの焼き直し。最近は事情が変わったので再考してみようと思う。変わった事情としては、

    • FT232RL が手軽に使えるようになって シリアルが使い易くなった。
    • チップ抵抗を使うようになってきた。
    • 140x40のユニバーサル基板が発売されたが、これに並べたくなった。
    • Tiny2313 をあまり使っていなくて死蔵しそうになっている。

    こんなところ。


さて、簡単配線と書いたが、基本は 8x8 ディスプレーに合わせて配線して、プログラム側で対応する方針。考えてみたのだが、次のようにしたら良さそう。Tiny2313 は裏がわに実装する。図は裏から見たもの。



Tiny2313 を LED のピンの間におくとすると、配線図のように、Tiny2313 が 上下にはみだす。なので、横に並べることになる。

    幅は 24mm .. ということは、0.945 inch で 0.1 inch 単位ではない。 0.05 inch 分 無理やり 右か左にずらすことになる。複数並べるときは、最初から考えておかないと 隙間が空いたりでこぼこになったりするので注意。
    140x40 基板に並べたとすると 5 つ。40x8 dot 表示器になる。
    (5+1)x7 で表示するとすれば、6桁+α。値段は RB5004-RG が 200円 Tiny2313 が 100円。140x40 基板が 200 円。5つ並べれば 1700円。

RXD は、全部共通。受信処理もまったく同じにして、すべてのチップが同じデータを持つようにする。チップの EEPROM の 設定で 表示の位置だけを変える。こうすれば、メモリが許す範囲でいくつでもつなげられるはずだ。

表示は、1dot づつ表示する。いくつ並べても 1/64 duty ということになる。このような表示の仕方なら Tiny2313 は 40mA 程度は流せる。LED 側も OK -- ただし、バグなどで、ずっと表示し続けると 焼けるおそれがあるので、3.3V では 数 mA になるようにしてデバッグしておいて、バグが取れたら 5V で使うとか工夫がいる。

    緑だと Vf が高く 2.4V ぐらい。100 Ωなら 3.3V で 9mA 。5V だと 26mA 。9mA で 1/64 duty だと暗いかも知れないが、焼けるおそれはない。赤なら Vf は、1.8V ぐらい。3.3V でも 15mA , 5V なら 32mA 。-- 100Ωでいけそうだ。 (というか 100Ωしか持っていない)

簡単配線といっても、ななめに接続している。チップ抵抗(2012) を使うのが前提。ただし、本当に簡単かどうかは未確認。

あと、ICソケットを付けると配線が難しくなりそう。直付けするのを前提にしている。

ちなみに、ROW1 を PD1 = TXD に 割り当てている。8x7 で良いなら、これを外して、TXDを使うことは可能。たとえば、ボタンを LED の配線と共用で付けて、ボタンの状態を送るとか .. 。TXD は ボタンを付けたチップだけ接続する。全部をつなぐわけではないのでうっかりしないように。

    ボタンの付け方は、
                            __
    COL1(K) -- |>|----o o--- GND

    とか。COL1 を pullup すると ... ボタンを押したとき 0 が読める。表示する場合 COL1 は、Hi-Z か L なので、ボタンを押しても影響がない。

あとは、プログラムを作るだけだが、昔作ったのを利用しようと思っている。→ bu5004s-0.1.tar.gz

作成中のは コレ。bu5004s-0.2.tar.gz。配線に対応しただけ。

ところで、作ったあと、プログラムを書き換えるには ... ICクリップを使うしかない。秋月だと、20個2500円。これは 0.8mm ピッチもいけるロジアナ用の高級品。昔ながらのやつだと、aitendo で 1個50円のこれとか これとか
(後者の方が良さそうに見えるがどうなんだろう?)

さて、同じように、 3桁 7セグLED も扱えるはずだ。ちょっと考えてみた。(ちなみに、4桁7セグLED も、互換性がある。6pin が DIG4)



これは、3桁を 2 個まで接続する例。(裏から見た図)

    C-533SR は、幅 24.7mm, 高さ 18.8mm 。C 基板をたてにしたとして、横方向に 2 個ならべられる。--- ただし、Tiny2313 を左にずらさないといけない。

4桁 2 個のときは TXD を使う→7桁(最後の桁は不表示), 使わない→8 桁 にできるようにする。

ちなみに、aitendo の 4桁 7セグは、50.3mm x 19.0 mm 。140x40 基板に 横に 2 個載る。さらに 上下というのもできるかも知れない。そんなに付けてどうするか? --- デロリアンは、3段だったはず。まだまだ足りない。

それはおいておいて... 7セグの方のプログラムはない。... といっても 上記のプログラムで無理やり使うことは可能なはず。定義ファイルを書き換えて、グラフィック用のデータを送ってやれば良いはず。まぁ、ボチボチ試してみよう。
posted by すz at 21:11| Comment(0) | TrackBack(0) | 日記

2010年02月07日

Tiny44Aをなにに使おう

i2c 温度計が欲しかったので、デジキーで買ったのだが、ついでに Tiny44A も買ってしまった。1個だと 217円だが、25 個だと 137円だったので、ついついぽちった。DIP ではなく SOIC の方。

    他のついでとしては、TCXO 付き RTC の DS3232S とか SPI RAM の23K256 とか。あと 1SV322

    DS3232Sは、1Hz を出力させて AVR に水晶を付けたときの精度とか温度特性を見るために購入したのだが、他は明確な使い道を決めていない。

    ちなみに、23K256 は、A25L80などの SPI FLASH とピンアサインが同じ、コマンド体系も似ている。→A25L80の使い方

AT90USB162/ATmrga32U2 は、ADC がないし 補助用と割り切っても良いかなぐらいの気持ちで買ってみたのが実情。Tiny45 の方が少し安いのだが、8pin では厳しいのではないかと思い 14pin の Tiny44A にしてみた。ちなみに、コストパフォーマンスが良いのは、この 2 種類だと思う。

    8pin の Tiny45 と比べると、使える pin 数が多いのが有利な点。VCC/GND/RESET を除くと 5pin vs 11 pin 。これだけ違えば使える範囲も随分違う。
    ただ、不利な点もある。Tiny45 は、高速な PWM を持っていて、それで音を出したりするのに有利。あと 8 pin なので、SOIC でも実装が楽という利点もある。

    ちなみに ATmega32u2+Tiny44A と ATmega32u4とを比べれば、387円+217円 vs 473円 で 値段の面だけでも ATmega32u4 の方が良さそうだ。USB 用のエンドポイントの数(4 vs 6)とかバッファの量(176B vs 832B)から見ても ATmega32u4 の方が嬉しい。ATmega32u4 が入手できるようになれば、補助としても用なしになりそうだが... 2chip ならではの利点があるかも知れない。

AT90USB162/ATmrga32U2 の補助で使うときは、i2c スレーブにして、ADC とか 電源制御とかを考えている。ただ、AT90USB162/ATmrga32U2 からの書き込みもしたいので、4 pin で接続することになるかも知れない。

  • ISP をまるまる空けるとしても、8 pin も使える。AREF を基準電圧入力に使うとして.. 使える ADC は、ADC1,2,3,7 の 4pin。差動入力が使えるのは、ADC1,2,3 の任意の 2pin 間 と ADC3-7間。MOSI を、ISP 用に使うとしても ADC ぐらいは使えるかも知れない。 その場合は ADC5 が使え ADC3-5 の 作動入力 もある。

  • ADC の差動入力は、両極入力モードが使え、x20 利得モードもある。

  • PWM は、OC0A が空いていて、OC0B は、ADC7 と排他で使用できる。あと MOSI を使う場合、ADC5 と排他で OC1B が使える。

  • XTAL1/2 に水晶をつながない場合は、PORT としてしか使えない。

こんなところ。ADC 専用チップとしても、お得なように感じる。

補助としてどう使えるかについては、だいたいイメージできた。が、なにしろ沢山買ってしまった。スタンドアローンで使う場合どういうものに使うと良いのだろう?

  • V-USB でアレコレするパターンは、USB910B で結構やった。
    V-USB + ADC というのは、あまり美味しくない。USB を駆動するとインピーダンスが低いのでノイズが載ってしまう。USB の通信を抑止することもできないので、ノイズを除去するのも難しい。

  • ATmega88 系が向いているもので、Tiny44A を無理に使っても意味がない。なにしろ ATmega328 が 秋月で 250 円だ。実装スペースを減らしたいとか、差動入力を使いたいとかなら Tiny44A が向いていそうだ。

あまり目新しいのは思いつかないのだが、例えば... 充電器。

差動入力で電流を測定できるから向いているはず。充電器を含めた電源制御をまかせてしまうのもありかも知れない。

あとは、ちょっとした測定器。I2C 液晶を作る予定なので、インターフェイスは 2pin で済む。測定はこちらですることを考えようかと思う。普通は ATmega88 系 1個で済ませられるわけだが、レギュレータと水晶とを 1組にまとめたいので、一応意味はある。

まぁ、他に思いついたらここに追記していこうと思う。

ところで、レギュレータと水晶とを 1組にまとめるのに、アイテムラボの SOP20-1P27-Wを使おうと思っている。



これを次のような配線にするつもり。



現物合わせで、水晶がランドに届かないことがわかった。(スルーホールは絶縁処理されている)足を付けてからハンダ付けしないといけなさそう。それに、かなり配線が多い。ちょっと作るのは厳しいかも知れない。



pin 割り当てはこんな感じ。INT は、内部使用 の意味。AREF は、TAR5SB33 の NOISE 端子を使ってみる。1.2V 前後のはず。

    パーツリスト
  • 水晶:FA238-16MHz
  • レギュレータ TAR5SB33 or SI91841DT-285(2.85V)
  • 水晶用コンデンサ 2012 18p (マルツ:22p)
  • レギュレータ用コンデンサ(入力側) 1608 1u
  • レギュレータ用コンデンサ(出力側) 2012 10u
  • レギュレータ用コンデンサ(NOISE) 2012 0.01u (マルツ)
  • Tiny44A (SOIC-14)
  • 変換基板 SOP20-1P27-W (アイテムラボ)

ちなみに、レギュレータと水晶とを 1組にまとめるために わざわざ こういうふうにしている。単に Tiny44A を使うだけなら、基板に直付けすると思う。カプトンテープかなにかで絶縁しておいて、端の 4pin だけ 基板のランドに付ければ十分だと思う。

追記:結局(ワークサイズパッケージのついでに)基板を作った。




こんな回路図。



で、出来上がったのがこれ。

追記: 2010/12/10 いまさらながら作ってみた。





なんだか.. 適当になってしまった。IC はナナメになっているし。他のパーツもあまり整然とはしていない。

足は、ダイオードの線。2 つに折って 基板に挿している。drill を 1.0mm φにしたのでけっこうぎりぎり。写真では分かりにくいのだが、基板の横ピッチは 400mil のはずなのだが、ブレッドボードに挿すときに 300mil 分の位置に挿してしまった。そのため足が内側を向いている。いつか IC ソケットに挿すかも知れないので、そのままにしている。



ちょっとばかり出来が悪いので修正した。(作るつもりはまだないが、一応)

  • clk44-02.zip

  • まず、C4 の真ん中に VIA が来ている。ちょっと気をつかうので、位置を変えた。
  • あと、線が全体的に細い。ライブラリも修正して、線やランドを太くした。
  • コネクタの drill は 1.1mm φにした。
  • 最後に 裏をベタアースにしておいた。

posted by すz at 20:54| Comment(0) | TrackBack(0) | 日記

i2c液晶の設計

どういうわけか、ATtiny2313 で i2c インターフェイスのキャラクタ液晶を作ろうとしている。

作りたいのは、別のものなのだが、プログラムが入らなくて満足できなかったときの保険として、同じハードで役に立ちそうなものをと考えていたらこうなってしまった。


とりあえず、プログラムが先に出来た。→ i2clcd-0.3.tar.gz

もちろん、デバッグなどしていない。ここでは、どういうものを作ろうとしているかまとめておこうと思う。

    回路図(予定)


まず、使おうと思っているのは、aitendo で安売りしている、8x2のSC802A-3.3V。これと、ボタンを 3 つ付けて i2c デバイスに仕立てようと思っている。

    一応 8x2 液晶のリスト。
    Aタイプ (上に端子) 14 ピン,16 ピン 40Wx35.4H

  • デジキー NHD-0208A 各種
  • サイキットストア XCL-082A-BG-YE 5V BL なし
  • aitendo SC802A-3.3V , SC802A(5V)

    Bタイプ(左に端子) 14 ピン 58Wx32H
  • デジキー NHD-0208B 各種
  • 秋月 ACM0802C-NLW-BBH 5V?, 白ヌキ

    Bタイプ(左に端子) 16 ピン (位置が ずれる) 58Wx32H
  • aitendo SC802B-3.3V


ST7032i


i2c 液晶は、ストロベリー・リナックスで扱っている

これが、どういうものなのか、まず調べてみよう。

データシートのリンクを開くと ST7032i のデータシートだった。
これを見てみたところ、基本は、キャラクタ液晶のコマンド体系をそのまま使って、i2c に載せただけのようだ。

もう少し詳しく説明すると、

  • i2c のパケットの先頭バイトがコントロールバイトで、RS (データかコマンドの指定)と、Co (コントロールバイトをこれ以降使うか使わないかの指定) だけが含まれている。続くデータは、キャラクタ液晶 と同じ意味。

  • Co = 1 のときは、RS + DB0-7 のデータを常に組で送る。16bit データだと単純に考えてもよい。RW は、i2c のパケットに含まれている。8bit 単位でしか送れないにもかかわらず、4 bit mode まで有効。

  • RS 1 bit のために 1 バイト消費するのは効率が悪い。Co = 0 にすると以降のコントロールバイトを省略できる。当然ながら、パケット内では RS の状態を変えられない。

  • i2c のアドレスは、0x3e 。

  • i2c インターフェイスでは、read (RW = 1) は、使えない。Write Only 。


これで基本は説明できた。キャラクタ液晶 を使ったことがあれば、使い出せるはずだ。

ただし、全部は説明していない。コントラストをコマンドで設定できる機能がある。

データシートを見ると、Function Set (001xxxxx) の bit0 が、IS (normal/extension Instruction Select) となっている。

IS = 1 にすると、コマンドセットの一部が切り替わる。

切り変わるのは、Set CGRAM (01xxxxxx) と Cursor or Display shift (0001xxxx)。この部分が、ST7032i 独自のコマンドに切り替わる。

仕様を決める


ST7032i に準じたものにしようと思う。違う点は以下のもの。


  • 4 bit mode は、サポートしない。Function Set の DL が指定されても常に 8bit mode として扱う。
    ... 内部は 4bit mode を使うので、DL = 0 に変換するわけだが、i2c 上のデータは常に 8 bit 単位ということ。

  • read で、bit 0-2 にボタンの状態を読めるようにする。
    ... 複数バイト読もうとしても 1 バイトしか読めない。

  • 拡張コマンド。IS で切り替えるのは同じだが、切り替えるのは Set CGRAM (01xxxxxx) のみ。拡張コマンドでは、コントラストと バックライトをサポートしようと思う。


      拡張コマンド(予定)
      0100 B7 B6 B5 B4 バックライト 上位ビット設定
      0101 C7 C6 C5 C4 コントラスト 上位ビット設定
      0110 B3 B2 B1 B0 バックライト 下位ビット設定
      0111 C3 C2 C1 C0 コントラスト 下位ビット設定


    下位ビット設定に意味があるかどうか分からないし、あくまで予定。輝度調整もできない場合がある(予定)。


    仕様まとめ
  • Write:

    (1) I2C アドレス + RW=0 , control byte , コマンド/データ
    control byte , コマンド/データ
                 ....
    (2) I2C アドレス + RW=0 , control byte , コマンド/データ
    コマンド/データ , コマンド/データ
                 ....

    control byte: bit7 (Co) : Co = 1 (1) パターン ,
    Co = 0 (0) パターン
    bit6 (RS) : RS = 0 コマンド , RS = 1 データ

      コマンド仕様:
    00000001 : Clear Display
    0000001x : Return Hone
    000001 I/D SH : Entry Mode Set
    00001 D C B : Display ON/OFF Control
    0001 S/C R/L xx : Cursor or Display Shift
    001 1 N F 0 IS : Function Set
    01 AAAAAA : Set CGRAM Address (ノーマルモード)
    01 ...... : 拡張モード
    1 AAAAAAA : Set DDRAM Address

  • Read:

    (1) I2C アドレス + RW=1 , xxxxx b2 b1 b0

    b[012] はチャタリング処理済の ボタンの状態 (1 = ON)


i2c スレーブドライバの API 変更


USI を使った i2c スレーブドライバを以前作ったのだが、上記の仕様に合わない。すこし API を考えて作りなおそうと思う。

いくつかセンサ系の i2c デバイスのデータシートを見てきたのだが、だいたい次のような使い方をしている。

  • Write では、最初のバイトで レジスタ番号を指定して、続くデータは、そのレジスタの値。
  • レジスタ番号 のみの Write をする使い方もある。その場合、次の Read で読む レジスタの指定になる。

実は、以前作ったのはこういう使い方すら出来ない仕様だったのだ。

さて、API をどうしよう。

READ は どうも 指定された メモリを勝手に 返すだけで良さそうだ。 レジスタ番号が変更されたら、メモリのアドレスを再度設定すれば良い。xx_set_read_buffer とかそんな感じ。

WRITE の場合、ストリームではなく、パケットを意識したコードを書くことができないといけない。まぁ、パケットの終わりが判かれば良いだけなので、xx_can_getc で、0/1 以外に -1 を返してパケットが終わったことが判るようにしようと思う。

それ以外にも、問題はある。一旦バッファに読み込んで処理する方式なので、受け取ることができるパケットのサイズには上限がある。しかも受け取ったパケットの処理中は、ACK を返せない。
これについては、方式を変えないと対処できないので今回はパス。

追記:i2c のコネクタ

忘れていた。i2c のコネクタをどうするか決めないといけない。

workshop Nakでは、こんな配列を使っているらしい。

    1. GND
    2. VCC
    3. SCL
    4. SDA


あと、玄箱 PROでは、

    SCK(SCL?)
    SDA
    VCC
    GND

らしい。SCL と SDA が逆。I2C はコネクタで接続するものではないから、標準などないのだろうなぁ。とりあえず workshop Nak と同じにしておこう。

追記:

もうひとつ見つけた。Seeeduino V328 では、

    1. VCC
    2. GND
    3. SCL
    4. SDA

これまた違うアサイン。
posted by すz at 07:27| Comment(0) | TrackBack(0) | 日記

2010年01月28日

WDT は温度計に使えるか? -- 実践編

WDT は温度計に使えるか?の記事に書いたことを実際にやってみようと思う。

MCP9801 も入手したし、I2C温度計のつかいかたも分かった。I2C マスターのコードも以前作ったのがある。

使うのは、AT90USB162(SRT162 ボード)。水晶だし、電源用レギュレータも MCP1700 で 電圧も(平均すれば)安定しているはず。

AT90USB162 は、割り込みつかわなくとも通信できるようにしているし、I2C マスターのコードも割り込みつかってない。

とりあえずは、WDIE=1 にして WDT 割り込みを発生させる。インターバルは、WDP[3-0]=0110 で、1 秒に設定しようと思う。

    どういうわけか、インターバルの設定が うまくいかない。
    試行錯誤の末、WDT を一旦設定して、その後に WDT 割り込みに切り替えたらうまくいった。ただ、WDP[3-0]=0110 だと 2 秒になってしまう。500ms の設定の WDP[3-0]=0101 にしたところ 1 秒間隔になってくれた。

この間の CPUクロックを計測。続いて温度を取得。温度の取得は ワンショットにして、タイミングを合わせる。

2 組のデータを 16進数で シリアルでたれながす。ほぼ 1 秒間割り込みが来ないことは分かっているので、他のAVR でも シリアルなど使って通信しても問題なさそう。

この状態で放置してみる。1秒に1組のデータでも 24 時間なら、86400 個のデータになる。これを分析して使えそうかどうか見てみることにしよう。

うまく行きそうなら、次は使い捨てカイロで挟んで放置の予定。

ちょっとメモ:

CONN2
1 VCC(3.3V) VCC
2 GND
3 PC5/OC1B (NPN OC)
4 NC
5 DEV_VCC (3.1V)
6 PB3/MISO (100 ohrm) SDA
7 PB1/SCK (100 ohrm) SCL
8 PB2/MOSI (100 ohrm + LED)
9 PB4/T1 or RESET (100 ohrm)
10 GND GND

MCP9801
SCL 1 8 VCC --- 1u -+
SDA 2 7 A2 --------+
ALART 3 6 A1 --------+
GND 4 5 A0 --------+
|
GND


クロックの校正方法で書いたが、平タスクで 16bit タイマのオーバーフロー回数をカウントしようと思う。

普通は、

    (1) 割り込み禁止にする
    (2) オーバーフローフラグ(TOVF1)が 1 になっていたら、
    (3)   オーバーフロー回数のインクリメント
    (4)   TOVF1 の クリア
    (5)割り込みを許可する

というような処理をすれば良いわけだが、正確にカウントしたいので、常にWDT割り込みを優先しなければならない。

もし (1) と (5) をしなかった場合なにが起きるかというと、WDT割り込みの処理で、TOVF1 が 1 の場合 オーバーフロー回数が インクリメントされていないかも知れない。さらに オーバーフロー回数が 2バイトの場合、インクリメントの途中かも知れない。

これを正しく判断して正しいカウンタ値を記録するのは、無理かも。

では、どうしたら良いのか?

WDT割り込みの処理では、 16bit タイマの値を記録するだけにする。平タスクで WDT割り込みが起きたことが分かったら、オーバーフロー回数を合わせて 32bit カウンタ値にして記録する。

それは良いのだが、TOVF1 が 1 の場合 オーバーフローの前に記録された値なのか、オーバーフローの後に記録された値なのか、の判断をしなければならない。

これについては、レスポンスを保証できてさえいれば、大きな値だった場合は、オーバーフローの前 と判断できるはず。保証する時間は、オーバフローするまでの時間の 1/2 以下だから 16Mhz クロックで 2ms 以下。安全を取って 1ms を保証するようにする。

    ちなみに測定誤差は、± 3 clock 。AVR のデータとりこみは、クロックに同期するので、1 clock ずれる場合がある。また、命令実行中は割り込みができないので、2 clock ずれる場合がある。

    ただし、誤差は蓄積されず、次のサイクルに反映される。複数のサイクル分を合計しても 誤差は大きくならない。

    クロックの校正方法で書いたフィルター処理でどうなるか..

    あるサイクルで 3 クロック多い値になったとする。次のサイクルでは -3 される。

    N=7 だと、そもそも重みが 1/128 なので、3/128 クロック分の誤差。次のサイクルでは、3/128 x 127/128 になる。採取した値は、-3/128 なので、蓄積される誤差は、-3/(128 x 128) クロック。


とりあえず、プログラムはできた。→ calib-test-wk01.tar.gz

これで 2 時間ほどデータを取ってみた。サンプリング数は 8900 。



これは、 WDT 割り込みの間隔 (単位 クロック数/1M@16Mhz) を X 軸にして、 MCP9801 で採取した温度を Y 軸にして プロットしてみたもの。

縦軸は、わずか 1.4 ℃ の幅。それでもちゃんと相関関係になっているのが見て取れる。これを見るとある クロック値になったときの温度の幅は 0.5 ℃ぐらい。

温度計として使えそうな感触。



これは、クロックの校正方法で書いたフィルター処理を 温度とクロック値 について行って、軌跡としてプロットしたもの。右上が始点で、いったん温度が下がって、また上がっている。

N=7 にして無理やりなめらかにしているのだが、温度に幅があるからといって、単純な誤差には見えない。-- 温度計と チップの温度が一致していないかも知れない。温度が下がるときは、低めに出て、温度があがるときは高めになる傾向があるように見える。

温度計のモジュールがまるでヒートシンクのように AT90USB162 に載っているので、温度計の方が先に 温度変化するのだろう。

    そうだとすると、かなり正確な温度計になるのかも知れない。
    ... といっても絶対精度はわからない、相対的な精度。

とりあえずは、こんな感じ。しばらく測定を続けて、もうすこし広い温度範囲で 見てみようと思う。

すこし温度範囲が増えた。


線形のように見えるが、7℃分しかないのでまだわからない。

あと、プログラムに問題があったので修正。→ calib-test-wk02.tar.gz

  • wdt_reset() を 割り込み処理でしているが、インターバルが 割り込み処理分増えるので、変換が面倒。wdt_reset() なしでも 定期的に割り込みが入るようなので、wdt_reset() なしにした。
    もういちどデータを採取しなおし。

  • 出力フォーマットも変更。参考のために、℃に変換したデータも載せているのだが、たとえば tiny2313 で同じデストをする場合メモリが消費されるので省略する予定。おなじ スクリプトで編集できるように、℃のデータは後ろに付けることにした。

本測定



  • 気温よりちょっと高めの温度しかならない。AVR の発熱分だと思えるので、仕事をこなしたら sleep 命令でアイドル状態にするようにした。

  • I2C 温度計の方が気温の変化に敏感なので、全体をタオルでくるむようにした。

  • 両面テープでは、I2C 温度計が剥がれやすいので、瞬間接着剤で貼付け。( 衝撃を与えれば取れるはず。あとは、剥がし液で綺麗にすれば良いはず。)


以上の変更をした上で、本測定。

    測定1)使い捨てカイロを使って高温の測定。温度は、47 ℃ぐらいまで上がった。次いでカイロを抜き取ってゆるやかに冷却。(サンプリング数 22429)

    測定2,3)放置して、気温の変化を採取。昼から測定して、温度が下がっていくのをプロット。(サンプリング数 53947)

    測定4)なかなか温度が下がらないので、設置場所変更。(サンプリング数 12324)



温度が上がるときは若干高めの温度になっているが、下がるときは一致しているようだ。



赤の上のラインが測定開始時。ここから温度が上がっていって冷える時が下のライン。緑、青のラインと合わせると、下のラインが正しい値だと判断できる。


これでデータが得られたので、インターバル→温度の算出方法を考えてみようと思う。

グラフを見ると、上に凸の弓なりの曲線。だいたい 30 ℃の変化に対して 2% ぐらいインターバルが変化する。

データシートを見ると 25 ℃あたりに変曲点があるように見えるので、最低温度、25℃、最高温度の 3 点のデータで算出しようと思う。

選択したのは、以下のデータ。

    インターバル(秒) 温度(℃)
    1.00837242 12.484695
    1.01433937 25.003220
    1.02884322 47.406181


注意)個体差があるから、別の装置では目安にしかならない。

これを使って、どう変換しよう。一番簡単そうなのは、2 次の多項式。連立方程式を解くだけ。

測定範囲外では誤差が大きくなりそうなのだが、この範囲が正しければ良し。

ここまでのプログラム。→ calib-test-wk03.tar.gzRAW データ

ちなみに、グラフは gnuplot で表示。 Windows版もある (gp440rc1_win.zip ダウンロード)

何を作ろう



さて、こうやってやってきたことは、何に応用できるだろうか?

とりあえずは、温度センサーなしの温度計。温度を知りたいだけなら、温度センサーを付ければ良いだけだから、あまり嬉しくはない。

次、1PPS を入力しての クロックの誤差の測定。割り込みを起こすモノを変えるだけで、ほぼ同じプログラムが使える。

温度と誤差の関係が分かれば、たとえば時計を作ったときに誤差を減らせる。ちょっとした測定器 を作った場合も、基準となるクロックを校正できて嬉しいような気がするし、温度の情報も取れる。

...というわけで、温度計付き時計とか、フランクリン型発振回路を使った LC メータとかを作ってみたい。あと、周波数カウンタ。

    周波数カウンタは、8bit タイマの外部クロックに入力して、オーバフロー割り込み 2^N 回に 1 回 WDT割り込みと同じ処理をすれば良い。

    同じシーケンスなら、誤差は WDT割り込みと同じ。最高周波数は、CPUCLOCK /2.5 。AVR は同期での取り込みなので、オーバーフローの間隔は、512 クロック以上。割り込み間隔が短くて困ることはない。

表示は、安易にキャラクタLCD の予定。ちょうど aitendo で安売りしている、8x2の SC802A-3.3Vを使うのだ。ただ、キャラクタLCDでも 1mA ぐらい消費するようだ。常時 On したいので選んだのに.. 残念。

    一番消費電流が小さそうなのは、ストロベリーリナナックスのI2C液晶か。それでも 250uA と 1/4 に過ぎない。世の中に腐るほどある液晶表示の装置は、みなもっと消費電流が小さいはずだが...

    サイキットストアで売っている XCL-082A-BG-YEとよく似ている。バックライトがついて 3.3V 用になったのが SC802A-3.3V。SC802A-3.3V のコネクタは 14 pin → 16pin になっているが、オフセットしているので互換性があるようだ。

    ちなみに、配置が違う SC802B-3.3V なんてのもある。3.3V 用。コントラスト調整用の Vo を、GND に直結して良いようだ。 よくわからないが、そのあたりを 3.3V 用に 調整してあるのかも。

    ちなみに、秋月でも 8x2 を扱っている。ACM0802C-NLW-BBH こちらは 白色LED 。logic は、2.7V - 5.5V のようだが、Vo がどうなのか不明。まぁ、バックライトを点灯させないと見えないそうだから、今回はパス。形状は、SC802B-3.3V と同じだが、コネクタのpin数と位置が違う。

AVR は、USART が付いている tiny2313 で済ませたいのだが、プログラム領域が足りなくなるのが怖い。

逆に考えて tiny2313 で作れる範囲で作るということにすれば、気楽で良いかも知れない。最悪でもシリアル液晶ぐらいにはなるだろう。

そういえば、USBtiny が キャラクタ液晶をつなげているのを思い出した。参考にしよう。

    PB0 DB4
    PB1 DB5
    PB2 DB6
    PB3 DB7 (pull-up 22k)
    PB4 RS
    PB5(MOSI) R/W
    PB6(MISO) E
    PB7(SCK) --

    PB5(MOSI) は、入力の方が良い。LCD を read する予定はないので、R/W は L 固定にして、PB5(MOSI) は、別用途に使おう。I2C も使うし PB5 SDA/PB7 SCL にしよう。

    DB7 のプルアップは、起動中に 不定のコマンドが実行されないための保護。( DB7 == 0 のコマンドは存在しない。)
    E のプルダウンは、ISP を使った場合まずい。

    これで、PORTB は全部うまった。

    PORTD は、合わせるのは無理。

    PD0(RXD) 通信用
    PD1(TXD) 通信用
    PD2(INT0) 1PPS 校正用
    PD3(INT1)
    PD4(T0) 周波数カウンタ用
    PD5(OC0B/T1)
    PD6(ICP)

    ボタンを付けたいのだが.. 空きポートは 3 つしかない。PD3 をコモンにして、DB4-7 を共有することにしよう。PD5 は、空いている唯一の PWM だが、タイマー0 は、周波数カウンタで使うので PWM は 使えない。PB4(OC1B) と入れ替えることにしよう。

    タイマー1 の PWM は、フリーランニングで使うので、65536 クロック周期でしか使えない。 それでも 8 MHz 時、122 Hz で バックライトの輝度調整には使える。Vo もソフトで微調整したいかも知れない。たぶんどちらかで使う。

    いよいよ PD6 あと1つ。むしろこちらの方をバックライトの輝度調整用に した方が良いかも知れない。平タスクで ON/OFF すれば十分だろう。

    あ、1PPS 校正用 は、ピン変化割り込みを使うことにして、PD4(T0) と共用で良いかも。

      あ、ダメだ。PD4(T0) はピン変化割り込みがついていない。Tiny2313A/4313 なら付いているんだけど。

    OC0B のピンをただのポートとして使ってしまっている。周波数カウンタで タイマー0 が使えないだけなので、一応 バックライト用にしよう。

    これで決まった。

    PB0 DB4 , button blue (pull-down 33k)
    PB1 DB5 , button yellow (pull-down 33k)
    PB2 DB6 , button red (pull-down 33k)
    PB3 DB7 (pull-up 22k)
    PB4(OC1B) PWM(122 or 244 Hz) Vo
    PB5(MOSI) I2C SDA
    PB6(MISO) E
    PB7(SCK) I2C SCL
    PD0(RXD) 通信用
    PD1(TXD) 通信用
    PD2(INT0) 1PPS 校正用
    PD3 button common
    PD4(T0) 周波数カウンタ入力
    PD5(OC0B) バックライト用
    PD6 RS


    電源は、5V , VCC は、3.3V レギュレータを通す。バックライトは、5V をアノードにして、カソード側を NPN トランジスタ駆動。ゆえに PD5 は H で ON。

    button common は、SRT162 と同じでダイオードを通して 3.3K でボタンに接続。ボタンは、33 K でプルダウン。PB0-2 の 3 つ。

    Vo は、PWM を RC フィルタ を通して接続。R = 10K , C = 10u。cutoff = 1.6 Hz 。ただし デフォルト 0V で済むはず。


こんな風に決めたものの、やっぱりプログラムが入るとは思えない。ダメでも Tiny4313 がいつか入手できるようになる。

追記:

とは書いたものの ... 実際 AT90USB162 のプログラムを そのまま移植して、lcd ライブラリを 付けただけで、1588 バイトになってしまった。lcd への表示をするだけで、2KB になりそうでやる気がなくなってきた。やはり 4KB は欲しい。

あと チップと 水晶と レギュレータを 1 まとめにしたいのだが、DIP だと なかなか難しい。

実をいうと、ATtiny44Aが 137円@25個と 結構安いので、買ってしまった。

これとアイテムラボの 変換基板 SOP20-1P27-Wを使って、水晶と レギュレータをつけられないか検討中。



こんなレイアウト。水晶は、秋月の FA238-16MHzを載せたい。.. ただ ランドを (カプトンテーブで絶縁するか)カットしないとまずそう。レギュレータは、TAR5SB33を使って、NOISE 端子を 基準電圧として使えないか実験もしたい。

さて、そうすると使えるピンは 8 pin 。ISP の MOSI/MISO/SCK は、ホストとの通信用に空けるとすると 残り 5pin 。T0 は、1PPS 入力/周波数カウンタ用。あとの 4pin のうち 2 pin はスレーブの I2C 用にしたい。

-- まぁどうなるか分からないのだが、とりあえず。

さて、そうなると 表示やボタンがつかない。... 先の ATtiny2313 は、I2C スレーブとしようかと思っている。通信は、ストロベリー リナックスで扱っている I2C液晶 に準じようと思う。これは、ST7032i というコントローラを使っている。基本的に キャラクタディスプレー のコマンドを I2C に載せただけのように見える。I2C のアドレスは、0x3E 。アドレスに続いてコントロールバイト - データの順で 2バイト送る。コントロールバイトは、bit7 = 1 , bit6 = RS 。あと、普通のコマンド以外に コントラストの設定とかのコマンドがある。

どうも Write Only のようなので、Read した場合は、ボタンの状態が読めるようにしようかと思っている。


    一応作ってみた。コンパイルを通しただけのもの。

    i2clcd-0.1.tar.gz

    i2c スレーブドライバは以前作ったものがベース。どうも センサ系とかの i2c のコマンド体系に合わないので仕様変更。
posted by すz at 21:55| Comment(0) | TrackBack(0) | 日記

2010年01月25日

I2C温度計のつかいかた

前の記事(WDT は温度計に使えるか?)で LM75ピン互換らしい I2C 温度計をリストアップしてみた。これらをどのように使うのかまとめて見ようと思う。


LM75 互換チップ (SOIC-8)としてリストしたのは、以下のもの。SOIC-8を選んだのは、表面積が大きいので、AVR とかチップに 両面テープで貼りやすいと思ったため。

    .. の予定で 変換基板でモジュールを作ったのだが、うまく付かない。... 困った。

    そもそもこれらのチップは、基板の温度を測るものらしく、ダイと足の熱伝導性だけが考慮されている。... となるとむしろ 基板側を貼り付けた方が良さそう。


    TCN75A 84 円 ±1℃ (Typ)
    MCP9801 134 円 ±0.5℃ (Typ) (TCN75A 互換)
    TCN75 145 円 ±0.5℃ (Typ)
    STCN75 203 円 ±0.5℃ (Typ) (TCN75 互換)
    AD7414 252 円 ±0.5℃ (Typ) (間違い、ピン互換ではない)
    LM92 403円 ±0.33℃ (Typ)


    TCN75A/TCN75/STCN75/LM92/MCP9801/MCP9803

    SCL 1 8 VCC
    SDA 2 7 A2
    ALART 3 6 A1
    GND 4 5 A0

これ以外で国内のショップで買える I2C温度計は、スイッチサイエンスのTMP102搭載温度センサモジュールマイクロファンのMCP9803がある。MCP9803 は、MCP9801 と同じ? 違いが分かっていない。

    MCP9803 は、SMBus 対応品だそうだ。L の時間が 35 ms 以上だとリセットする機能が追加されている。

    mouser で調べると SA56004X がやたら安い。1 個 60 円。-- ただし LM75 系とはちょっと違う。ピン配置が、基本左右逆で リモートセンサが付けられる。LM86,MAX6657/8 ピン互換だそうだ。

    LM75B はもっと安く 46 円。--- だが、精度は悪そう。±3℃ではちょっと嬉しくない。パッケージも 0.65 mm ピッチだからハンダづけも厳しい。

とりあえず、MCP9801/3 , TMP102, LM92 のデータシートを見比べてみた。

まず、I2C のアクセスの仕方は、3つとも共通のようだ。

  • アドレスは、1001AAA (AAA は設定した値)
  • WRITE の場合、最初の 1 バイトは、ポインタバイトで レジスタの番号をセットする。続くデータがない場合は、READのためにレジスタを指定する意味
  • 続くデータは、1 または 2 バイトでレジスタに書き込む値。2 バイトの場合、上位、下位の順番。
  • READ では、レジスタの値が読める。2 バイトの場合 上位、下位の順番。


レジスタの意味は若干違う。ここでは、温度を読む機能に限定して説明する。

レジスタ0: 温度レジスタ

2 バイトの レジスタで signed short 。温度(℃)を 256 倍した値なのは共通。データの分解能は、チップや設定によって違う。


    MCP9801/3 0.5℃(9bit) 〜 0.00625℃(12bit)
    TCB75A 〃 (互換)
    LM92 0.003125℃(13bit)
    TMP102 0.125℃(12bit) 〜 0.003125℃(13bit)
    TCN75 0.5℃(9bit)
    STCN75 〃 (互換)

複数の分解能があるチップのデフォルトは、荒い方(bit数が少ない)のようだ。LM92 の 下位 3bit は ステータスなのでマスクする必要がある。

レジスタ1: コンフィグレーションレジスタ

MCP9801/3,LM92 は、1 バイト。TMP102 は 2 バイト。分解能の指定や測定インターバルを指定できる。


    MCP9801/3 30ms(9bit),60ms(10bit),120ms(11bit),240ms(12bit)
    LM92 500ms
    TMP102 4000ms,1000ms,250ms,125ms


いずれも Typ. 正確ではない。MCP9801/3 は、bit 数と 変換インターバルはトレードオフの関係。TMP102 は無関係(独立)。

3つだけ調べてみたが、他も似たようなものだろう。最初に設定したら、あとは 温度レジスタを読み込むだけの処理にできる。

追記:安い TCN75A の使い方は、MCP9801/3 と同じのようだ。
違うのは、精度だけ。

コンフィグレーションレジスタの bit6,5 で分解能を設定する。

    00 9bit
    01 10bit
    10 11bit
    11 12bit


コンフィグレーションレジスタの bit7 は、ワンショット。
bit0 が shutdown 。bit1 と bit7 を両方 1 にすると、A-D 変換を開始する。測定が終わるのが、上記の時間後。

測定のタイミングを制御できるのは、嬉しいかも。

TMP102 も ワンショットがある。こちらは、完了したかどうかも判る。
posted by すz at 23:37| Comment(0) | TrackBack(0) | 日記

クロックの校正方法

前の記事(WDT は温度計に使えるか?)で クロックの校正についてちょっと書いた。ここでは、どうするのが良いかまとめて見ようと思う。

普通の水晶発振器のレベルを元にして、RC発振器を校正するだけなら、方法は沢山ある。

しかし、GPS を使ったりして 水晶発振器を校正するとかまで考えると、方法は限られてくる。そういうことが出来ると いろいろ楽しいので、GPS での校正方法で統一しておきたい。

GPS にも 10MHz とかの出力があるものがあるらしいのだが、とりあえず安価で入手できそうなものは、1Hz (1PPS) のみらしい。

    aitendo の LR9543+アンテナ(3980円) とか GM318(6500円) とか。設定は シリアルだが、設定さえすれば、(電源をいったん切っても) 1Hz が常に出力されるようになるのかどうかは知らない。

    秋月の GT-720F は無理だそうだ。


精度は落ちるが、リアルタイムクロックに 1Hz 出力ができるものがある。デジキーで買えるのは、DS3232とか DS32B35とか DS32C35 とか。これに限らず、リアルタイムクロックは、1Hz 出力はできるものが多いようだ。

    秋月で 500円RTC-8564は、32.768 kHz、1024 Hz、32 Hz、1 Hz が出力できるし、リコーの製品も 32.768 kHz (と 2Hz 以下) が出力できるらしい。

リアルタイムクロックは、1Hz を出力するのに 設定が必要。だが、バックアップしておけば、問題ないはず。

設定はよくわからないが、とにかく 1Hz を出力してくれる装置があって、それを使って合わせることを考えてみることにしよう。

水晶付きの 別の AVR で 1Hz 出力をするにはどうするか?


とりあえず、1Hz の出力を出すものとして、AVR を使うのがお手軽なので、最初に考えておくことにする。

クロックに合わせて正確に出力するには、PWM を使う。1Hz にするための設定を考えれば良いわけだ。

クロック周波数が16Mhz の場合、プリスケーラで 1/256 にすれば、1秒は 62500 カウント。8Mhz なら 31250 カウント。16 bit タイマなら OK 。

8bit タイマ しかない AVR は工夫が必要。たとえば、16Mhz だとして、

  • プリスケーラ を 1/256 にして、タイマを 1/125 分周に設定すると、1 秒に 500 回オーバフローすることになる。
  • オーバフロー割り込みを設定しておいて、割り込み処理で 250 回に 1 回 出力をトグルする。
  • 割り込み処理では、かならず毎回同じ処理をする。
  • トグルする割り込みが来そうな時間帯は他の割り込みを使わない。

こんな感じ。8MHz なら 1/250 分周の設定。タイマの桁が足りないので汎用に作るのは難しく 12.8Mhz は無理。

AVR で 1Hz 出力をするにはどうするか?(誤差がわかっている場合)


まず、1Hz の クロック数が 32bit 変数(C)に格納されているとする。
処理は、2 Hz で 任意の PORT 出力をトグルすることにする。

それをするために、16bit タイマーをプリスケーラ 1/1 で使うことにして、次のようにする。

  • 周期 T で N 回 タイマーのオーバフローをカウントした後、
  • 周期を T2 に変更して、オーバフロー 時に PORT をトグルする。
  • T2 の期間は、他の割り込みを使わない。


N,T,T2 の計算は次のようにする。

仮に 1/65536 クロック周期にしてみる。

  • N = ((C/2) >> 16)
  • T = 65536
  • T2 = ((C/2) & 0xffff)


T2 が小さすぎて、T2 を設定する前に時刻が過ぎてしまうケースがある。T2 の最低値(T2MIN)を決めて、T を 調整する必要がある。

T を -1 すると、N だけ 時間が短くなる。T2 で調整するわけなので、T2 に N を加える。

16MHz クロックの場合、C/2 は、8000000 あたりだから N は 122 前後。T2MIN は 1000 ぐらいあれば十分そうだから、10 回ぐらいのループで調整できる。

校正する方の処理


とにかく、1Hz が得られたとする。校正する方の処理はどうするのが良いだろうか?

まずは、自分のクロック周波数の測定。まず、INT0/1 を使うことを前提にする。INT0/1 なら たとえば ↑エッジ検出 で割り込みが発生するように設定することができる。レスポンスを保証しないと なにかと面倒なので、他の割り込みは INT0/1 割り込みが来るころには、発生させないようにする。

INT0/1 割り込みでは、前の INT0/1 から CPUクロックがどれぐらい進んだかの カウンタ値(T)を 記録する。

  • 16bit カウンタを フリーランニングで使うとして、オーバーフローの回数は、平タスクで行う。
  • カウンタ値は、全部で 32bit にして、ずっと積算する。(クリアはしない。)。INT0/1 割り込みでは、前の値との差分をとって T を 計算する。
  • INT0/1 割り込みで、処理されていない オーバフローがある可能性がある。割り込み禁止にして処理してもいけない。この部分に工夫が必要。


さて、これで 1秒間の 平均の周波数は分かるようになった。

だが、ずっと記録してみると、おそらく値が変動する。温度も合わせて採取するとして、温度も変動するかも知れない。

なめらかに変化するように、簡単なフィルタ処理を入れておくと良いかも知れない。

たとえば ...

  • フィルタ処理の結果を Y1 とする。1回前のフィルタ処理の結果も記録しておいて Y0 とする。新たに採取された値は X 。
  • 計算式は、

    Y1 = Y0 + ( (X - Y0) >> N )

    N == 0 なら Y1 = X 。N == 1 なら Y0 と X を 1:1 の重みで平均する意味。N == 2 なら 3:1 での加重平均。

    それは良いが、せっかく採取した X の 下位 N ビットを捨てることになる。Y1/Y0 を 2^N 倍にした値ということにして、

    Y1 = Y0 + ( X - ( Y0 >> N ))

    が良いと思う。

    フィルタとしての意味は、LPF 。IIR=無限インパルス応答フィルタの一種。

    Y1 が 1 になってから X がすべて 0 だった場合、緩やかに値が減っていく。Y1 が 0.5 になるまでの時間 T を求めてみると


    ( 1 - 1/(2^N) ) ^ T = 0.5

    T ln(1 - 1/(2^N) ) = ln(0.5)

    T = ln(0.5) / ln(1 - 1/(2^N))


    16 Mhz は 24bit 必要で、32bit の値にするとすれば、N = 8 まで。これを計算してみると

    N T(秒)
      1 1.0
    2 2.42
    3 5.19
    4 10.74
    5 21.83
    6 44.01
    7 88.38
    8 177.10


      ちなみに、linux とかの uptime で出てくる ロードアベレージもこのような計算方法。
      manpage では、「過去 1, 5, 15 分のシステムの平均負荷」なんて適当に説明されているが、1, 5, 15 分は、Y1 が 0.5 になるまでの時間 = 半減期のこと。シフトでは、60 秒とか任意の値にできないので、固定小数点で乗算をしている。
      それ以外にも プロセスのプライオリティの計算にも使われていたりする。


    これを元に すると、例えば 0.00000001 になるまでの時間 T8 も求めることができる。

    T8 = ln(0.00000001) / ln(0.5) x T

    意味としては、Y0 の 初期値 0 で X を入力してから 8 桁まで収束する時間。計測をスタートしてから 使える値になるまでの時間と思って良い。


    N T(秒) T8(秒)
      1 1.0 26.58
    2 2.42 61.31
    3 5.19 137.93
    4 10.74 285.4
    5 21.83 580.1
    6 44.01 1169
    7 88.38 2349
    8 177.10 4707



posted by すz at 17:59| Comment(0) | TrackBack(0) | 日記

2010年01月19日

WDT は温度計に使えるか?

内蔵RC発信器(WDT含む)の特性は、各データシートの代表的特性に載っている。

それを見ると、どのデバイスもだいたい同じ特性で 内蔵RC発振器は、温度が上がれば 周波数が上がり電圧が上がっても周波数が上がる。WDT は、温度についても電圧についても逆。

ここでは、水晶が載っているような AVR で、WDT が、温度計に使えるかどうかについて考察してみようと思う。

WDT は、例えば 16ms 経過したら (リセットではなく)割り込みを発生するようなことができる。これを使って 16bit タイマカウンタが 16ms にどれだけ進むか計測すれば、WDT の周波数が分かる。

電圧が一定という前提があれば、周波数から 温度を割り出す ことができるはずだ。

    8MHz クロック を 8 分周すると、16ms で 16000 カウントになる。仮に 16ms が +30 % ほどになったとすると 20800 カウント。
    20 MHz で +30 % なら、52000 。

    このカウンタ値から 温度への関数を作れば良いわけだ。

基本的には、電圧 や 水晶の周波数さえも温度が変われば変動する。が、それも込みでキャリブレーション(校正) すれば、使えるものになりそうな気がする。

とりあえずは、tiny2313 のグラフをみてみよう。

グラフを見ると、リニアではないものの、二次曲線なら近似できそうな形をしている。おおざっぱで良いなら、30℃〜80℃の間は リニアのように見える。

3.3V のところを 読み取ると、30℃で 101.2 KHz 、80℃で 98.0 KHz ぐらい。

1 ℃あたりにすると -0.064 KHz /℃ 。-640 ppm/℃ ぐらい。30 ℃以下はこれより若干緩やかなカーブになる。

ちなみに、温度で 水晶の周波数がどれぐらい 変動するかというと 良く分からない。秋月の 12.8MHz モジュールだと ± 3 ppm /℃ と書いてある。30 ppm /℃という発振モジュールも見た覚えがある。AVR で どうなのかについては、見当が付かない。ここはまぁ 込みで 校正するということで気にしないことにしよう。

レギュレータは、普通のもので ± 100 ppm/℃ ぐらい。

WDT が電圧によってどれぐらい変動するかというと、25℃のとき 3V で 100.5 kHz , 4V のとき 99.6 kHz ぐらいに読めるから -0.9 kHz / V 。-0.9 % / V ぐらい。

で、レギュレータが ±100 ppm/℃ だとすれば、その影響は ± 0.9 ppm/℃ 。これぐらいなら無視できるだろう。

さてどうやって 校正 すれば良いのだろう?

グラフは曲線だから 3 点の温度は測定したい。測定するには、基準となる 温度計が必要。
どうせなら精度が高いセンサを使いたい。

調べてみると 、LM75 の互換らしき IC が多種類あることが分かった。インターフェイスは、I2C 。値段は デジキーの 1個の単価。


    LM75 互換チップ (SOIC-8)

    TCN75A 84 円 ±1℃ (Typ)
    STCN75 203 円 ±0.5℃ (Typ)
    TCN75 145 円 ±0.5℃ (Typ)
    LM92 403円 ±0.33℃ (Typ)
    AD7414 252 円 ±0.5℃ (Typ)
    MCP9801 134 円 ±0.5℃ (Typ)

MCP9801 が安くて良さそう。ちなみにプロトコルなどは調べていない。互換なのはピンアサインだけかも。

これを ターゲットにつないで、校正する。仮組み の状態でも良いが、レギュレータ や 水晶と 組みにしておかないと いけない。

低温は、フリーザと冷蔵庫で なんとかするとして、高温はどうしよう。常温と 使い捨てカイロ?

まぁどうにかするとして、これで 4 点 取れるわけだ。

グラフにしたときに ひどい形でなければ、それぞれの区間の直線近似でも良いかもしれない。あるいは、PC でデータを処理して 処理しやすいようなデータに変換するのも面白そう。

なんというか、校正するために 本物の 温度センサを使うのは結構おバカなわけだが ... ひとつ基準温度計として持っていて使いまわすというのもアリだと思う。

    I2C マスター用に 2 pin 空けておくだけ。ここにセンサを接続して、校正用ソフトに書き換えて 動作させれば良いはず。

あと、内蔵RC発振器を使った場合も同じようにすれば良さそう。込みで考えるならば、同じチップ内で温度が同じことが保証されるので、こちらの方がむしろ都合がよい。

うまくすれば、内蔵RC発振器の校正もできるかも知れない。

    3.3V のところを 読み取ると、30℃で 8.05 MHz 、80℃で 8.24 MHz ぐらい。計算すると、+469 ppm/℃。見事に 特性が逆。

    これを信用するとすれば、30℃〜80℃の範囲では、上記のカウンタ値がある一定の値になるように、 OSCCAL の値を調整すれば良い。ただし低い温度では、クロックが低めに調整されてしまう。

    信用しないとすれば、OSCCAL をデフォルトに一旦戻して、計測し、そのときのカウンタ値から 目標とするカウンタ値を出す関数を作れば良いはず。

    ただ、これだと、周波数が不連続で上がったり下がったりするから面白くないし精度も高くできない。誤差だけ出す関数にして、補正するのが良いかも。

    校正するには、周波数を測定するための外部クロックが必要。水晶の精度で十分だから 別の AVR で作るのが良いかも知れない。

    ついでに書いておこう。電圧を微調整すると 周波数も変わるわけだが、その方法。

    余計な機能がない 3端子レギュレータ の GND にゲタをはかせるとその分電圧が上がる。ダイオードを入れて Vf 分だけ電圧を上げるとかは、本で見たことがある。

    超低消費電流の 3端子レギュレータ では、VCC → GND に流れる電流もわずかなワケで、分圧抵抗で ゲタをはかせることも出来る。(S-812C33AY-B-G: 8個で100円!のデータシートにも記載されている。) 

    それが出来るのなら、PWM でも OK なわけだ。周波数など関係ないから、16bit の PWM で 少し電圧を上げるなんて使い方ができるはず。仮に +0.9 % (9000 ppm) /V とすると 1ステップあたり 0.45 ppm ぐらいの計算。

さらに、水晶自体の キャリブレーションとか。

より高い精度の 周波数カウンタがあれば 、内蔵RC発振器の校正と同じように水晶自体を キャリブレーションできるかも知れない。

たとえば、VHF 用の容量可変コンデンサ を水晶につけるコンデンサの代わりに付ける。(片側だけ)

    TOKOのページを見ると TKV1790AS3 が良さそうな感じ。... だが新しいらしいし入手は困難かも。

    東芝だと、カタログ(pdf)を見ると 1SV322(デジキー) が TCXO/VCO 用だそうだ。シングルのは、確か 0.01u とかと直列にして... カソードに電圧かけるんだっけか。

で PWM で 電圧制御してやれば、内蔵RC発振器を使った校正と似た感じの制御でできるはず。... まぁそこまでしなくとも 誤差知っていて温度補正ができるとなにかと便利なはず。

より高い精度の 周波数カウンタ... というのは今は 1PPS 出力がある GPS で作るとか。1PPS で±1us とかだそうで、1秒の計測で 6 桁。100 秒なら 8 桁? ... なんか GPS が欲しくなってきた。

本題から外れてしまうのだが、TCXO で検索して DS32B35というチップを見つけた。基本は、I2C インターフェイスの リアルタイムクロック(RTC) なのだが、クロック出力(32.768 KHz) とか 1PPS 出力とかがある。max で ± 3% の温度計 もついている。おまけに 不揮発性 RAM (FRAM) 2KB も付いている。

例えば、2 個の AT90USB162 の USART 同士をつないで、インターリンクケーブルを作り、余ったピンで I2C マルチマスターにして、このデバイスを接続すると、クラスタ制御するのに嬉しいかも。

どちらが、マスターかの情報とか、IPアドレスの設定とかを覚えておくこともできるし、NTP なしでも とりあえず時刻は同期できる。FRAM なので、書き換え制限は気にしなくて良い。定期的に FRAM を書き換えて、ノードが動作していることを 相手に知らせるような Heartbeatの機能も入れられる。同一ソースの時刻があるので、書き換えるデータとして最後に動いた時刻情報にすることも可能。

あと、他の余ったピンで相手の状態が分かれば完璧。電源が入っていないとか、USB の SOFパケットがこなくなったとか、そういうレベルの情報は 直接ピンを接続した方が良さそう。あと相手のリセットとか。

ただ、こういうのを手配線で作りたくはない。作るのが面倒というだけでなく、信頼性の問題。接続されている線が切れたりすることは考えたくない。

DS3232は、普通の SRAM で 236B しかないが、764 円とずいぶん安い。これでいいかという気もする。

    そういえば、USB切り替え器なんてものがある。機械的なスイッチだったり、リレーだったり、電子的なスイッチだったりするのだろうか? 少なくとも コレは 自動で切り替える機能があるから、機械的なスイッチではなさそう。電子的なスイッチだとすれば、専用 IC があるのだろうか?

    電子的なスイッチなら是非欲しい。USBハードディスクを 2台の NAS で 切り替えるのに 使いたいのだ。
posted by すz at 01:32| Comment(0) | TrackBack(0) | 日記

2010年01月12日

CPLD で何を作ろうか

デジキーで買い物するついでに CPLD CoolRunner II XC2C64A-7VQG44C 1 個 245 円 を買ってしまった。

XMEGA の DMA と合わせてなにか面白いものが出来ないかと思ったのだが、具体的な計画はない。


    ちなみに XC2C32A-6VQG44C はさらに安く 1個 125 円。

    CoolRunner II には、1.8V が必要だが、MCP1700が安い。消費電流は心配なさそう。XC2C64A は、25Mhz で 1.8mA , 240 Mhz で 17.77 mA だそうだ。


まず思いついたのは、Xmega 用の FullSpeed USB のフロントエンド。NZRI の処理をした後のビットストリームを SPI でやりとりするとか SPI は 16MHz までいけるし DMA もできるし .. 頑張れば作れるような気がするのだが、専用 IC 使った方が良さそうだし 意味が見いだせない。例えば AT90USB162 でインターフェイスするのと比べてメリットがあるのかどうか?

自分としては、実用・非実用は別にして、CPLD を使う意味が見いだせないと面白くない。

あまりにつきなみだが、CPU は意味がある。FPGA ならもちろん作れるわけだが、安い CPLD で実現すること自体が楽しい。非実用的だと割り切れるから USB の場合と違う。

さて ググってみたら OpenCores に MCPU - A minimal CPU for a CPLD というのがあることが分かった。

ドキュメントの PDF を見てみると、4 命令しかない。

    命令 オペコード 説明
    NOR 00AAAAAA Accu = Accu NOR mem[AAAAAA]
    ADD 01AAAAAA Accu = Accu ADD mem[AAAAAA],update carry
    STA 10AAAAAA mem[AAAAAA] = Accu
    JCC 11DDDDDD Set PC to DDDDDD when carry == 0, clear carry

これですべてを説明している。データを保持するのは、Acc 8bit / carry 1bit / PC 6bit / アドレスラッチ 6bit で 21 bit だけ。これなら 32 マクロセルに入っても不思議はない。

これに入出力のポートと RAM を付ければ動いているのが確認できるはず。ちなみに、RAM のプログラミングは JTAG のバウンダリスキャンを使うことで 機能として組み込まなくとも一応はできる。

実用性はなさそうだが、面白そうではある。

OpenCores には、1bit CPU なんてのもある。MC14500Bの エミュレーションだそうだ。

データシートを見てみると、命令は 16 個で、4 bit 。オペランドはない ... というか外部回路で好きにできる。

基本は外部のプログラムカウンタを +1 してメモリを読み出し、4bit を 命令として 入力する。条件スキップ はあるので、JMP を実装せずとも プログラムは作れる。JMP は、JMP という ピンを ↑↓するので、オペランドを PC にロードすれば良いのではないかと思う。


    ピン
    I0-I3 I : 命令
    RR O : Resule Reg 出力
    DATA I/O
    WRITE O
    JMP Flag O
    RTN Flag O
    Flag O O
    Flag F O

    IEN Reg (Internal) : DATA is allways 0 if 0
    OEN Reg (Internal) : WRITE is allways 0 if 0

     命令    説明
    NOPO 0000 Flag O → ↑↓
    LD 0001 DATA → RR
    LDC 0010 ~DATA → RR
    AND 0011 DATA AND RR → RR
    ANDC 0100 ~DATA AND RR → RR
    OR 0101 DATA OR RR → RR
    ORC 0110 ~DATA OR RR → RR
    XNOR 0111 ~(DATA XOR RR) → RR
    STO 1000 RR → DATA , Write → ↑↓
    STOC 1001 ~RR → DATA , Write → ↑↓
    IEN 1010 DATA → IEN
    OEN 1011 DATA → OEN
    JMP 1100 JMP Flag → ↑↓
    RTN 1101 RTN Flag → ↑↓, skip next inst.
    SKZ 1110 Skip next inst if RR == 0
    NOPF 1111 Flag F → ↑↓

まとめてみたが、どう使えば良いものやら。

それはともかく、こういうのがアリなら、命令用メモリに SPI シリアル FLASH を使うのはどうだろう。

JMP は、恐ろしく遅そうだが 連続しての実行がメインなら、ものによっては 100MHz x2bit で ロードできる。命令が 16bit でも 10Mips は超える。データは 1 bit でも良いのかも知れないが、余裕があれば 8bit とか。データ用メモリも SPI のシリアル SRAM 23K256(162 円)にしてしまうと面白いかも知れない。

まぁ 64 マクロセルでできる範囲は知れている。工夫してもこの程度だろう。ちなみに、PicoBlaze は、xapp387 によると XC2C256 でようやく載るらしい。XC2C64A 程度では全然無理。

他のものだと ... フレームバッファとか 逆にキャプチャするようなもの?

ロジアナ? 

カウンタがあってメモリに書き込むだけだから、基本機能は簡単そうな気がする。が、安い製品もあるし、自作するなら 遅い代わりに大容量とか特徴づけたいし ... ただ、あまり遅いと ATAVRXPLAINで出来てしまって、作る意味がなくなるかも知れない。

    ちなみに mouser で \3,253.3

    ATxmegaA1 の PortA と PortD の 16bit が ピンヘッダとして外部に出ている。PortA は、ADC と DAC があり、PortD は、USART / SPI / TWI があるらしい。外部メモリとして 64Mbit(16Mx4bit) SDRAM がついている。

あと、メモリは ピン数が多い。基板を作るならともかく、手配線は面倒で嫌。2 chip 以上だと とても嫌... というか無理。

とりあえず扱えそうな SRAM を探すと、256Kx8 だと、高速な IDT71V124SA10PHG8 358 円とか 低消費電力でそこそこ速い CY62128EV30LL-45SXI 322円とか。

SRAM は良いのだが、大容量を満たすために、SDRAM とか 使えないのかな。一応調査。

64Mbit (4M x 16) は、MT48LC4M16A2P が 435 円。
256Mbit (16M x 16) は、MT48LC16M16A2Pが 835円。
ちなみに 64Mbit の IS42S16400F(481 円)、256Mbit の IS42S16160D(1036 円) というのも扱っている。

DDR はさらに扱いが難しそうだが、一応。

128Mbit (8M x 16) は、MT46V8M16Pが、543 円。
512Mbit (32M x 16) は、MT46V32M16Pが 891円。

使えるものなら DDR の方が良いのだろうなぁ。

ちなみに、XAPP384 - Interfacing to DDR SDRAM with CoolRunner-II CPLDs というのがある。XC2C128 を使っているが、使用マクロセルは 60 だそうだ。シーケンシャルに READ または WRITE するだけなら 単純化できるだろうし、意外にも可能性があるのかも知れない。... ここまでしたいならすなおに XC2C128 を使えば? という気もするが ... 0.5mm ピッチはちょっと嫌。可能なら 0.8mm ピッチまでが嬉しい。XC2C128 1つよりは、XC2C64A x 2 を選びたい。

ところで、XAPP785 - Level Translation Using Xilinx CoolRunner-II CPLDsとかXAPP429 - 5V Tolerance Techniques for CoolRunner-II Devicesなんてのもある。入力側のラッチにも使えそう。

そんなことより、もっと大きな問題があった。使っている PC は、eeePC で 16GB の SSD しか積んでいない。C: は 8GB 。ISE WebPack 11.1 を インストールできそうにない。... 困った。

追加:

そういえば、PLL 発振器 も定番かも。参考→ PLL発振器の製作

カウンタは CPLD の得意分野 (l規模が小さいほど高周波数で動作する:XC2C32A なら )だし、位相比較器 もロジック回路。VCO と基準周波数は、外付けの必要がある。

posted by すz at 19:06| Comment(0) | TrackBack(0) | 日記

2010年01月11日

デジキーで買い物

デジキーでパーツを発注した。(前回の購入は、デジキーでチップ抵抗の記事)。

ATmega32u2 1 個 387 円。

AT90USB162 で いろいろ作ってきたが、コード領域が足りなくなる心配があった。ブートローダ領域を 4KB 取るので、12KB → 28KB 。これなら当面余裕だろう。

リセットIC (1.8V) NCP300HSN18T 1個 58円
Pch MOSFET DMG3415U 10個 332円

これで NiMH 2cell 用 過放電保護回路を組むのだ。

ついでに、リポ電池用に 3.0V のリセット IC NCP302HSN30T と Nch MOSFET DMG3414U 10個 360円も。(3.0V を買ってしまったが、2.7V で良かったかも)

インダクタ CB2518T 10 個 170 円 から 4.7uH (R), 6.8uH , 10uH, 22uH , 47uH 。
インダクタ NRG4026T 10 個 430 円 から 6.6uH, 22uH。

CB2518T が安いのでストック。NRG4026Tはちょっと電流を流したいとき用。

今回の購入のきっかけは、CB2518T。なんかとても欲しくなってしまった。

同期型昇圧 IC SC120SKTRT 1 個 68 円。

ダイオードがいらなくて周波数がたかい。出力は可変 / 3.3V 。
CB2518Tに合わせて買ってみた。

(PPS) フイルムコン ECH-U01103GX5 0.01uF 10個 310円。
(PPS) フイルムコン ECH-U1C473GX5 0.047uF 10個 479円。

0.01uF はフィルタ用。0.047 uF は、なんとなく。これ実は、千石で扱っている。0.01 uF だけで良かった。

ちなみに、メタライズド・ポリエステル は、温度や周波数で容量がずいぶん変化するようだ。メタライズド・ポリプロピレン は 周波数特性は良いが、温度特性がいまひとつ。PPS は安定している。

X7R 積セラ GRM21BR71H474KA88L 0.47uF 50V 10個 327円。
X7R 積セラ CC0805KKX7R8BB474 0.47uF 25V 10個 91円。

アンプの入力のカップリング用。耐圧が高いと、電圧の変化に対する容量変化が小さい。耐圧の差で値段が全然違う。

レギュレータ XC6221B152MR 10個 420円。
レギュレータ MCP1700T-1202E 10個 370円。

基準電圧に使おうと思って購入。XC6221B152MR (1.5V) は、2.3V 以下で使うとき用。MCP1700T-1202E (1.2V) は、2.3V 以上用。

MCP1700 はついでに、1.8V と 3.0V も購入。(3.3V は購入済)

CPLD XC2C64A-7VQG44C 1 個 245 円。

XMEGA の DMA と合わせてなにか面白いものが出来ないかと思って購入。だが、結局なにも作らないかも。まぁ安いので。

    ちなみに XC2C32A-6VQG44C はさらに安く 1個 125 円。1.8V が必要だが、MCP1700 が使えるし。

    MCPU - A minimal CPU for a CPLDというのがあって、32 Macrocell CPLD にフィットするらしい。XC2C64A なら倍だから、意外に実用的なものが作れるかも知れない。

    そういえば、メモリは買ってない。とりあえず、どんなのが買えるか検索。256Kx8 だと、高速な IDT71V124SA10PHG8 358 円とか 低消費電力でそこそこ速い CY62128EV30LL-45SXI 322円とか。

    SPI のシリアル SRAM 23K256 162 円てのもあるのか。

あと抵抗。
MCR10EZPJ ±5% 50個 119円。
MCR10EZPF ±1% 10個 38円。

から前回書い忘れたものを購入。±5%も±1%も値段はあまり変わらないのだが、精度が必要ない用途は ±5%にしている。理由は 4 桁の数字が読みにくいから。
posted by すz at 13:16| Comment(6) | TrackBack(0) | 日記

2009年12月19日

USB電池BOX EP-024CHA

100均で USB コネクタの電池BOX (単三 x2)があるのを知り、入手しようと思っている。型番は EP-024CHA 。JR7CWK'sぶろぐ で詳しく紹介されている。販売店はシルクだそうだが、通販で扱っている店もあるようだ。

使用 IC は、BL8530 。aitendo で 3.0V タイプを扱っている。HT77xxA と同じようなもの。ピン互換性はあるが、周波数が違うため、最適なインダクタも違う。

自己消費が少ない(負荷なしで 12 uA)ので電源スイッチなしでも問題なさそうだし、完全に空になるまで動作する(起動電圧は、0.8-0.9 V)から 一次電池で使うのに向いている。

    LX の電流制限が 0.7A なので、肝心の 携帯充電に向いているかどうかは分からない。500mA 流すのは無理だと思う。自作機器のバッテリーとかにするのなら良さそう。

ただ 二次電池を使うのはどうだろう。HT77xxA も同じだが、過放電が怖い。なにか対策は出来ないのだろうか?

リセットICを使う方法(まとめ)


必要なもの
1) 1.8V以下 で 出力を H にする (Active-High) 低消費電流(数 uA以下)の リセットIC

2) 低電圧で動作する Pch MOSFET


リセットIC の出力を MOSFET の GATE に接続する。MOSFET が ON のときは、数十 mΩ の抵抗が 入っているのと等価。OFF になった場合 HI-Z 。低消費電流のリセットIC を選べば この状態での電池の減りは気にしなくて良くなる。(自己放電の方が多そう)

(充電とかで) 高い電圧を 入力すると FET 内のダイオードを通して電流が流れる。(ある程度充電されて) 電池の電圧が 1.8+α になると ON になる。

リセットICは入手が難しい。1個単位で買えるものは限られる。特に Active-High のものは 品種が少ないので、さらに入手が難しい。
Active-Low なら GND 側に Nch MOSFET を付けることになる。

必要なもの2
1) 1.8V以下 で 出力を L にする (Active-Low) 低消費電流(数 uA以下)の リセットIC

2) 低電圧で動作する Nch MOSFET




ちなみに、リポ電池も、 2.85 - 3.0V のリセットIC を使えば同じように過放電保護が出来そう。

ちなみに、TrustFire Protected 10440の場合、こんな保護機能が入っている。

    - With integrated PCB Protection
    - Over current protection current: 4A
    - Over current protection voltage: 0.2V
    - Over charging protection voltage: 4.25V +/- 25mV
    - Over discharging protection voltage: 2.5V +/- 50mV

過放電保護以外に過充電保護と過電流保護があるようだ。過電流を流すと危険なので、保護することは重要かも知れない。MOSFET の性能で電流を流せないだけという気もちょっとする。

意外だったのは、過放電保護が 2.5V なこと -- 2.85V を死守しないといけないかと思っていた。なら、リポ電池で、2.7V のNCP300HSN27Tも使えそう。

AVRを使う方法



リセットICは入手が難しいし 電圧毎に用意しないといけない。ADC 付きの AVRで、低消費電流になるように使えば、良いのでは?

とは思う。... だが、AVR の内蔵基準電圧は、精度が悪い ± 10% ぐらい。

外付けの基準電圧を付けるにしても結構高い。しかも 最低電圧も結構あり 1.8V で動くようなものは 入手できない。たとえば MAX6001の最低電圧は、2.5V 。

レギュレータを探してみると ... XC6221の 1.5V のものが安くて良さそう。消費電流も 25uA と割と少ない。SHUTDOWN も出来るから、さらに減らすこともできる。

ちなみに、2.3V 以上で良いなら MCP1700が良さそう。安いし 精度も高く、さらに 消費電流が 1.6 uA 。

結局のところ、基準電圧も入手が難しいので リセットIC で 過放電保護回路を作って完結させてしまうのが良さそう。

充電機能も付けるには



MyCharger Stick のような製品がある。こういった機能を付けるにはどうしたら良いのだろう。

ここでは、2 cell NiMH だけを考えることにする。

最も簡単そうなのは、電流制限付きの 2.8V 定電圧回路。MC34063A とかで 作れることは作れる。

  • ピン 6-7 間 の抵抗値で ピーク電流を 制限する。ピーク電流 /2 が 最大出力電流。300 mV だから、0.33 Ωで 1A 。ただし精度はあまり高くない。± 20% ぐらい?
  • ピン 5 が FB (1.25V) 精度は ± 2% (25℃)
  • インダクタのインダクタンスは、電流が大きいほど、入力電圧と出力電圧の差が小さいほど、小さな値にできる。

  • セリアで売っている 片山利器製USBポート付シガーソケット専用DC充電器 をバラして インダタクタと一緒に流用するのもアリかも知れない。

    まず、電流検出抵抗(R1)が、0.15Ω なので、0.3 Ωに変更。これで Ipk が 1.0A (最大出力 500mA) に制限できる。インダクタは 変更する必要はないが、計算してみると 5V 入力の場合 22 uH まで小さくできる。... というか小さくしないと (制限値まで)電流を流せないかも。

    出力電圧の調整は難しい。精度のよいテスターで 小負荷で 2.8V になるように 調整しないといけないのはもちろんだが、温度が変化しても 2.8V を超えないようにしないといけない。

    AVR とかで制御する場合は、FB を H レベルにすることで 出力を止める。定電流駆動だけ使えば良いから 2.8V きっかりにこだわらなくても良さそう。


2.8V が上限になるようにちゃんと調整さえできれば、過充電の心配はしなくて良さそう。ただし、電池が変になっていないという前提があるし、充電完了が分からないという問題もある。

AVR を使って PWM で 充電回路を作る方法もあるが、管理だけするのも アリだと思う。充電回路などは危険なので 確実に作れないとマズい。

AVR での処理は、

  • 充電時間の上限の管理。
  • (できたら)電池の温度の管理。
  • 定期的に充電を止めて、電圧の測定。
    正確に電圧を測定して、ある電圧になったら完了とかで良いのではないかと思う。もっとちゃんと作るには、たとえば MCP73831/2 のデータシート (pdf/日本語)のアルゴリズムを参考にしたら良いと思う。
    この場合は 基準電圧として TL431 などを使っても 問題ないと思う。


ところで、AVR を使うなら やはり AVR で充電したいような気もする。どうするのが良いのか考えておこう。

まず、定電流の充電。

Pch MOSFET 22uH
5V 1.8V 〜 2.8V
Vin --------+- S D --+---- L ----+--- Vout
R1 G | |
PWM ----R2 -+-----+ D↑ C
| |
--+-- --+---
Vf = 0.4V


とりあえずこんな回路を考える。インダクタは 22uH を使うことを前提にしてしまう。
電圧の範囲も 入力 5V 、出力 1.8V 〜 2.8V を前提にしてしまう。
この条件で L に流す最大電流を 1A にするには、どうするのか?

MC34064A のデータシートを見ていると


    Ton : Toff = Vout + Vf : Vin - Vsat - Vout

という関係になるらしい。
Vsat = 0 としてあてはめると

    Ton : Toff = 1.8 + 0.4 : 5.0 - 1.8 = 2.2 : 3.2
    = 2.8 + 0.4 : 5.0 - 2.8 = 3.2 : 2.2

あと、

    Ton(max) = L x Ipk / (Vin - Vsat - Vout)

という関係もある。L = 22uH , Ipk = 1A とすると、

Ton(max) = 22 / 3.2 (uS) = 6.9 (uS) (Vout = 1.8V)
(Ton + Toff) = 16.9 (us) (59.3 kHz)
Ton(max) = 22 / 2.2 (uS) = 10 (uS) (Vout = 2.8V)
(Ton + Toff) = 16.9 (us) (59.3 kHz)

たとえば、8MHz で動かしていれば 1周期 135 クロック。Vout によって L 時間 55 〜 80 クロックで変化させる。
    注意)これはあくまで目安。実際のL が 22 uH より小さい場合 1A より電流が流れてしまうかも知れない。誤差を考慮しないといけない。

こんな感じの処理で良いが、時々充電を止めて 電圧をちゃんと測定する前提なら、もっと 単純化しても良さそう。

ところで、充電回路 だが、電源につながっていない場合、Pch MOSFET のボディダイオードを通して バッテリーから電流が流れ込む。逆流防止用のダイオードが別に必要。


ちょっと検討してみたのだが、逆流防止用のダイオードを入れるのなら、最初からトランジスタにした方が良いような気がしてきた。
あと、3.3V レギュレータの S-812C33AY-B-G を 基準電圧に使うのが安くて良いかも。

    2SA1160 は、TO-92形の背が高いタイプ。耐圧は10V しかないが パルスで -4A 流せる。hFE も大きめ。似たタイプだと TO-92 の 2SA1300 がある。マルツで扱っている。ちなみにコンプリは、2SC2500(2SA1160),2SC3279(2SA1300)

    この回路の通りだと、電源につながっていないときに、バッテリー から ADC3 を通じて AVRに電流が流れ込む、ちょっとまずい。ADC3 と BAT(+) の間に 100K Ωを入れるのが良さそう。


(以下 発散しすぎなメモ)


前にも書いたのだが、Pch MOS FET を使って スイッチを作り、1.8V 以上でないと On にしないという保護回路を付ける。自作するなら、ADC 付きの マイクロコントローラがあれば簡単。電池の電圧を (1秒に1回とか)ときどき測定して 1.8V 以下になったら FET を OFF にする。待機しているときは、電力を消費しないように工夫する。
    補足:
    ディスクリート で組むのは難しい。原理は簡単でも、低消費電力の基準電圧とか入手性が悪い。ときどきしか 基準電圧を ON にしないようにして、平均の消費電力を減らしたほうが自作には向いているのだ。

この程度の処理なら、Tiny13(A) で十分。秋月で120円だし入手性も問題ない。

ただ、低電圧で駆動できる Pch MOS FET の入手が難しい。秋月なら IRLML6402がなんとか使えるかも知れない。ただし、09/12/19 現在は在庫切れ。デジキーならPMV65XPとかが買えるが...

具体的に検討してみよう。まず、コントローラを Tiny13A と決める。AVR の VCC は電池に直結。Pch FET は、470k Ωで プルアップして AVR の PORT につなぐ。

    PORT を 出力にして L にすると、電源 ON 。このとき 2.4V なら プルアップだけで 5uA 消費する。BL8530 が 12 uA だから馬鹿にできない。... もう少し大きな値にした方が良いかも。

さて、あとは 電池電圧を測定する回路。1.1V 基準電圧使うとして、VCC を 100K , 33K ぐらいで 分圧して ADC に入力することにする。... 抵抗値はあまり大きくできない。これでも大きすぎかも知れないぐらい。常時接続はできないので VCC ではなく、PORT に接続することにする。PORT を H にしたときだけ 測定可能ということになる。

この基本回路で 3 pin 使った。あと 2 pin 使える。

付けるなら、スイッチ + LED 。

    __
    VCC --- R --- LED -+-o o--- GND
    |
    PORT

こうかな。SW 押しても LED が点灯しなければ 本当に電池がない。SW の 長押しで 電源 On/Off 。SW 付けない場合もあるし、初期状態は On 。

On にした後、数秒は LED を付ける。あと Off にしたら やはり数秒点滅。

あと 1pin あるが、CE 付きの昇圧 IC 用に On にしたら H にするようにしたら良いと思う。CE = L にしても 昇圧を止めて 電池電圧 - αの出力にするだけだが、Pch MOS FET の代替としての意味は多少あるだろう。

    HT77XX や BL8530 でも 5pin タイプのものがあり、それには CE が付いている。BL8530 では、0.9V 以上にならないと On にしないようだ。HT77XX では 2V と書いてある。... がこんなところで基準電圧を使うわけでなさそうだから鵜呑みには出来ない。

    aitendo で 扱っている PT1301 はピン配置も周波数も全然違うのだが、LX に 最大 1.5A も流す。これで USB電池 BOX を作れば、5V 500mA (以上の)の出力にできるかも。こいつにも CE は付いている。ただ、負荷なしの消費電流は若干多く 56 uA (+ FB 用分圧抵抗分)


回路はこんなもの。あとはプログラム。いかに電力を削減できるかやってみるのは面白そう。

ちなみに、BOD は使わない方が良い。使うと 内部基準電源が使われて消費電流が 20uA 弱増える。WDT(+ 4uA) のがマシ。AVR 全体として平均 10uA なら上出来で、50uA ぐらいを取り敢えずは目指せば良いと思う。

さらに書いておくと、電池BOXの EP-024CHA は、 USB 側に抵抗が入っている。USBの Battery Charging v1.1 規格に沿って いるのだと思う。(pdfのzip) 。ちゃんと理解できていないが、結果として 100 uA ほどの消費電流になっているらしい。対応機器を充電するのでなければ、取ってしまった方が待機時の電流消費が減って嬉しいかも。

EP-024CHA の改造ネタはこんなところ。いずれ挑戦したい。

追記:

いろいろ書いたのだが、デジキーで NCP303LSN16T1というのを見つけた。

NCP303 は、いわゆるリセットIC で消費電流が 0.4 uA と非常に小さい。ある電圧以下になると、オープンドレイン出力を On にする。だが、逆の論理の出力も持っていて、ある電圧以下になると、H を出力できる。この型番は、1.6v 以下を検出するものだが、1.8V の NCP303LSN18T1などもある。LSN の部分が HSN になると 論理が逆になる。NCP300-302 もあってなかなかヤヤコシイ。

それはともかく、これに Pch MOS FET を直結するだけで バッテリーの 過放電保護ができそう。PMV65XPと合わせて買うと良いかも。

まぁ、AVR で組めば応用ができるので、意味がなくなったとまでは思わない。... だがしかし。

追記: 同期型 昇圧 IC を探してみた。

NCP303 を買うとしたら、ついでに 同期型 昇圧 IC というのも買えば、外付けの Pch MOS FET なしでも off に出来て嬉しいのではないか? ..と思って探してみたら、SC120SKTRT というのが見つかった。一個 68円と安い上に、外付けのショットキーバリアダイオードも不要。3.3V 固定のモードと 1.8V 〜 5.0V 可変のモードを持っていて応用範囲も広い。

最大入力電流は、1.2A だそうだ。インダクタは、4.7hH 。2.4V → 5V 昇圧で 200mA まで 効率 80% 。300mA ぐらいが限界のような感じ。

    なんか勘違いしていたかも。同期型でも off のとき 電池の電圧分は出力に流れるはず。

さらにさらに、これに合うインダクタを探してみたら... 太陽誘電の CB2518T4R7MRとか、CB2518T4R7M とかが見つかった。10個で 170円! ... デジキーってインダクタは高いものばかりだと思っていた。CB2518T4R7MR は、4.7 uH 1.2A 、Rなしは、1.1A 。

CB2518T で検索すると いろいろ出てくる。あと安そうなのは、CBC3225T の 10個 305円 とか NRG4026TNR4018T の 10個 430 円とか。

ここから、ちょっと脱線して、デジキーついでメモ

CB2518T220K は、22uH , max 580mA 。aitendo で扱っている XZ5121は、LX が 300mA のようなので、十分使えそう。デジキーで買える同じピン割り当ての AP5724(78円) は、750 mA 。...なのだが推奨インダクタに、22uH , 510mA のものがあるので 使えるはず。BL8530 も 最大 700mA で、インダクタンスが 10uH 〜 100uH (標準 27uH)と なっているので大丈夫そう。

    XZ521, AP5724, BL8530 , PT1301 は LX の電流を検出して制御している。だから最大絶対定格は関係なく制限値が重要。インダクタに流れる電流はノコギリ状なので、平均値は制限値 より小さい。インダクタの最大絶対定格より、制限値が 1-2 割大きくても問題ないらしい。

HT77xxA は周波数が低いから 22uH では小さすぎる。... ただし使えないとまでは行かないようだ。CB2518T470K だと 47uH, 420 mA で、ちょっと不安。NRG4026T470M の 47uH, 650mA ぐらいが良さそう。

    HT77xx は、LX の電流制限をしていないように見える。HT77xxA では、その機能が入り周波数が、115kHz → 200kHz になった。ただ、電流の制限値が書かれていない。

まとめると

    4.7uH 10uH 22uH 47uH
    CB2518T 1.1A 0.82A 0.51A 0.42A
    CB2518T(R) 1.2A x x x
    NRG4026T 1.6A 1.3A 0.9A 0.65A

    SC120(1.2MHz,1.2A)
    PT1301E(500kHz,1.5A)
    XZ5121(1MHz, 0.3A)
    AP5724(1.2MHz, 0.75A)
    BL8530(350kHz, 0.7A)
    HT77xxA(200kHz, ?)
    HT77xx(115kHz,-)

    注) XZ5121,AP5724 が高い周波数にもかかわらず、高インダクタンスなのは、高電圧向け(LED 6直列)のため。電圧を低くして電流を流す場合は 10uH, 4.7uH とかにすべきだと思う。
    ...たぶん。

こんな感じか。

色々調べてみて、SC120が気に入った。安いし、ダイオードもいらない。過放電保護を入れる場合でも Pch MOSFET がいらない。 電圧は可変にできるが 3.3V で良いなら分圧抵抗もいらない。同期式で効率も良いし。マッチするインダクタも安そうだし。

ちょっと SC120 をどう使うか検討してみよう。

1)LED ライトとか昇圧付き電池BOXの過放電保護

2セルの NiMH 前提として、1.8v 以下になったら自動的に OFF

NCP300LSN18T1/NCP302LSN18T1 の Reset Output を EN に接続。

    他の CE 付きの昇圧 IC の場合も同じ。Pch MOS FET をつなぐなら、HSN にする。

    リチウムイオン用に Pch MOS FET をつなぐ ならNCP300HSN30T1 ?

    NCP301/NCP303は、オープンドレインなので、Reset Output をプルアップする。(抵抗値は、1MΩ とか)


2)AVR の電源として使う


    __
    BAT+ ---------o o----+--- C ---GND
    |
    +--- R -- GND
    |
    PORT(ADC) --+-- EN
    R 1M
    C 1u

こうかな?

ボタンを押すと 電源が入る。1 秒以内に勝手に Off になるので
起動したら とりあえず PORT を pull-up 。

電源を切る場合は、HI-Z にすればしばらくして off になる。

ボタンのセンスは ADC 。通常は ほぼ VCC レベルだが、ボタンを押せば BAT+ まで落ちる。

過放電保護をしたければ、AVR で処理を入れれば良い。


    他の CE 付きの昇圧 IC の場合は、電源側に Pch MOSFET を入れて...

    __
    GND ---------o o----+--- C ---BAT +
    |
    +--- R -- BAT +
    |
    PORT ----+-- GATE

    PORT --------- EN(CE)
    R 1M
    C 1u

    こうかな? ... ちょっと適当。電源 On はできるけど、センスはできない。昇圧 On はPORT でするか、常に On。


さらに ...バッテリーの過放電保護ができる 昇圧 IC を探してみた。

見つけたのは、NCP1421。1 個 198 円もするのだが、バッテリーの電圧が ある電圧以下だと OFF にできる機能付き。これはちゃんと OUT を切り離す。あと1.2V ±1.5% 電圧リファレンス出力もある。
nch は、1.5A 制限で 1.2 MHz 。ただ 0.65mm ピッチ 8pin で気軽に使えないかも。


    ちなみに電圧リファレンスも探してみたが、MAX6006(A/B) (1.25V), とか TLV431(A/B) (1.24V) があるものの 100円とか それ程安くない。消費電流も 55uA とか常に On するにはちょっと多い。
    レギュレータの方が安いぐらい。1.2V なら MCP1700T-1202E とか NCP585HSN12T1G とか。

    そういえば、SOT-23-5 タイプのレギュレータで BYPASS 端子があるものがある。調べてみると、内部リファレンス電圧がそのまま出力されている。電圧は定義されていないが、実測して使えば使えそうな気がする。秋月だと、SI91841DT-285 2.85V ±1.5% 5個 100円。あと、TAR5SB33 3.3V ±3% 10個 280円とか TAR5SB50 5.0V ±3% 10個 300円 とかは NOISE と書いてあるけど 同じみたい。

    デジキーで探すと、TC1015-3.3V 3.3V 100mA ±0.5% 10 個 360円 とかもある。(他に TC1014,TC1185 も)。ただし、こっちは 470PF 標準で、上のチップの 1/20 の容量しか付けないので、リファレンス電圧の出力電流も一桁低そう。AVR の AREF に付けても大丈夫なのか不明。

    規格外の使い方なので、危険ではある。特に VCC として利用した上で BYPASS を AVR の AREF に接続する場合、設定を間違えるとレギュレータがスルーになって回路全体がダメージを受けるかも知れない。注意が必要。
posted by すz at 14:30| Comment(3) | TrackBack(0) | 日記

2009年11月18日

AVRに関する雑記

いまは、作った基板で遊ぶのに忙しく、当面他のものには手を出さないつもりなのだが、ちょっとメモ。

P板.com関係



P板.com ではアナウンスしていないのだが、アマゾンで、【P板.com】オーダーメイドプリント基板(120.0 × 120.0 mm寸法)ワークサイズパッケージ!という製品がある。

ゆきさんのつれづれ日記を通してで知ったわけだが、基板を作ったときのアンケートで、”通常価格では無理。キャンペーンに期待している。”みたいなことを書いたら、教えてくれたので、秘密にしている .. というほどではないみたい。

いまの基板はバグがあるので、一通り使ったら、ちゃんとしたのに作り直したい。面付けは ルータなら 3面までだが、Vカットなら 5 本なので、1/2 C 基板に統一すれば 面数は稼げるような気がする。

そのときは是非これで作りたい。

XMEGA



一年以上前に XMEGA はそろそろかなんて記事を書いたのだが、全然買えなかった。

最近気が付いたのだが、ぼちぼち A3/A4 が買えるようになってきた。メモを ↑の記事に追記していこうと思う。

作った基板が片付いたら次は XMEGA で なにか作りたい。

0.5 mm ピッチしかも 100 pin の A1 は私には無理。0.8mm ピッチの A3 か A4を使うつもり。

HERO'S Download にある、AVRxmega.ZIPとかもぼちぼち見ているのだが、zip に含まれる AVR1003.pdf を見ると、クロック周りは(も)格段に進化しているようだ。

内部 RC 発振器には、2MHz と 32MHz があるが、PLL で 1-31 倍にできるらしい。そして 内部 RC 発振器 に自動校正機能(DFLL) があって、32.768 KHz の RTC 用 CLOCK に同期することが出来るらしい。

32MHz までが仕様だが 50MHz まで動いたという情報もあるし、結構楽しめそう。

AT90USB162



dfu-programmer (0.5.2) をビルドしたは良いものの、ブートローダを 消去してしまったりするのが怖くて 使えてなかった。

どうも プログラムで、シグネチャーとかヒューズとかが読めるらしいので、まずは確認。


    uint8_t read_fuse(uint16_t addr) {
    SPMCSR |= (1<<SPMEN) | (1<<BLBSET);
    return __LPM(addr);
    }

    uint8_t read_signature(uint16_t addr) {
    SPMCSR |= (1<<SPMEN) | (1<<SIGRD);
    return __LPM(addr);
    }

    :
    :

    usbcdc_put_pstr(PSTR("signature:"));
    usbcdc_put_hex(read_signature(0));
    usbcdc_putc(' ');
    usbcdc_put_hex(read_signature(2));
    usbcdc_putc(' ');
    usbcdc_put_hex(read_signature(4));
    usbcdc_putc(' ');
    usbcdc_put_hex(read_signature(1)); // CALIB
    usbcdc_put_pstr(PSTR("\r\n"));

    usbcdc_put_pstr(PSTR("fuses:"));
    usbcdc_put_hex(read_fuse(1)); // Lock bit
    usbcdc_putc(' ');
    usbcdc_put_hex(read_fuse(0)); // FUSE Lower
    usbcdc_putc(' ');
    usbcdc_put_hex(read_fuse(3)); // FUSE upper
    usbcdc_putc(' ');
    usbcdc_put_hex(read_fuse(2)); // FUSE ext
    usbcdc_put_pstr(PSTR("\r\n"));


こんなコードでちゃんと読めた。データシート通りだった。

それはともかく、このページを見て

    # dfu-programmer at90usb162 erase
    # dfu-programmer at90usb162 flash test5.hex


とすることで問題なく書けた。

シリアルフラッシュ



A25L080の使い方の記事で書いたが、ミニフォトフレームからの取り外し品の A25L080 と AT26DF081A しか考えてなかったが、M25P80 とかも 同じコマンド体系だった。

ただし、4KB 消去 (0x20) コマンド と シグネチャーを読み出す RDID (0x9f) コマンドがない。

4KB 単位の消去をしても FAT ではうまく使えないみたいだし、64KB 単位の消去に変更することにして、RDID で 判らなかったら RES コマンドを使うようにすれば、まぁサポートできそう。

posted by すz at 20:55| Comment(0) | TrackBack(0) | 日記

2009年10月06日

NEWランチャーライト



普段行かない 100円ショップに立ち寄ってみたら、NEWランチャーライト という 3灯 LED ライトに目が留まった。

アルミ削り出しの ケースで 底はネジ込み式で ゴムの電源ボタンが付いている。電池は 単四 x 3。

とても 100円のものとは思えないので、買ってみた。

後でググると 旧製品の LAUNCHER LIGHT が有名で、その 改良版らしい。気の迷いさんところで両方の紹介があった。

パッケージには、40時間なんて書いてあるが、平均 100mA 流すとしたら 10時間も持たないはず。40時間後なら相当暗くなるのではないかと思える。

さて電子工作ネタとしては、これを素材にどんな工作ができるだろう?

1)秋月の OSPW5111A-Z3などで明るくする。

まぁ、無難そうな改造。

    あまり詳しくないのだが、日亜の NSPW500DS(pdf) とか NSPW500GS-K1(pdf) とか が良さそう。

    あと、pdf を見ていると、並列で使う場合でも 個別に電流制限抵抗を入れたほうが良いらしい。それだけ Vf がばらつくということ。といっても抵抗値が大きい場合で、ギリギリの場合はどうしたってばらつく。

      10 個とか買って Vf で選別とかした方が良いかも。

      定電流回路は、2SC1815 2個と 10K の抵抗。あと、33 Ω (+ 5V 電源) で 作れる。

      で、LED の両端の電圧を測って 電圧の近いグループを選ぶ。



2)秋月の OSPW5161Pで明るくする。

この LED は、OSPW5111A-Z3 などとはちょっと違う。まず、広角60°。あと 定格 100mA と 電流が流せる。Vf も 3.6V と高め。足の形状も放熱のためかちょっと違う。単純には置き換えられないものの、抵抗を低い値のものにして ( or 場合によっては外して直結 ) 、NiMH 専用にするとかすると面白いかも。

注意点としては、放熱には気をつけなければならない。劣化が早くなる。足が太くなっているのはカソードなので、すずめっき線でぐるぐる巻いてケースに接触させるとか?

Vf はばらつきがあるらしい。抵抗値は、個別に調整しないといけない。

3)昇圧 DC-DC コンバータを付けて、電池 2 個(または 1 個)で、一定の明るさになるようにする。

電池を直接つなげると、電池の消耗にしたがって 暗くなる。それはそれで電池の交換の時期が分かって良いのだが、やはり電池を最後まで使えるようにしたい。

一番良いのは、高めの電圧で 直列にし定電流駆動。だが、そうなると回路は 電池カートリッジ側に仕込むのではなく、LED 側に付けるなどしないといけない。

やはり、HT7737 などで 定電圧駆動して、抵抗で調節が簡単で良さそう。

    ちょっと OSPW5161P 1 灯 + HT7733 で試してみた。(コイルは 350mA 47uH)。出力と LED を直結。3.3V だと、かなり明るく光った。次に 出力と HT7733 の VCC の間に ダイオードを入れて電圧を 3.7V ぐらいに上げてみたところ、さらに明るく。OSPW5161P の足はしばらくすると 結構熱くなってくる。最後に HT7733 の VCC を外してみた ... これでも うっすらと点灯。...

    1灯なら HT7733 + (350mA のコイル) でも余裕。3灯はさすがに無理そう。2並列、3並列にするしかないか。

    OSPW5111A-Z3 は今手元にないが、ATmega328P とともに購入中。こちらは たぶん 3 灯いける。電圧は 3.3V か むしろ落とす。
 
4)昇圧 DC-DC コンバータを付け、さらに Tiny13 などで PWM 駆動。

2本駆動にすると、単四のスペースが空く。10mmφ x 5cm 弱 ぐらいで結構ある。秋月の 16ホールユニバーサル基板なら 4連 が入る。ただし高さが厳しい。IC ソケットは無理そう。(基板を使わないならなんとかなる)

ちょっと実装を工夫すれば、この程度あれば楽勝なはず。うまくすればタクトスイッチ 1 個ぐらいならなんとかなるかも。

あるいは、充電回路を仕込むとか。

ライトとして使うのなら、この程度しか思いつかない。

それ以外だと、防水加工してみるとか。部品を取り出して ケースを本当にケースとして使うとか.. 。

    18 mmφ x 5cm の過放電保護回路つき 18500 リチウムイオン電池 を入れるという改造?があるらしい。若干細いので、100均で買えるアルミヘアカーラー (20mmφ) をスリーブとして使うと良いらしい。

    なるほど、過放電保護回路つき というのは、ライトに最適なのか。HT7733 だと ほぼ 残 0 になるまで光ってしまうから 一次電池専用。 過放電保護回路を自分で組むのは難しそうだから、二次電池用なら、ATtiny13 あたりで PWM かなあ。

    ググってみたら、気の迷いさんとこのページが見つかった。ただ、常時 ON で低電圧のとき出力だけ On/Offという回路にしないといけないので、出力 ON/OFF にかからず、自己消費が 数 uA とかにするのには使えなさそう。


追記:OSPW5111A-Z3 の Vf を測定してみた。



定電流回路を組み、10 個の Vf を測定した。電流は、18.7 mA 。
一旦測定して、並べ替えたのを再度測定しているので、絶対値はともかく相対的にはかなり信用できそう。


    2.990
    3.000

    3.024
    3.028
    3.056

    3.060
    3.075
    3.075

    3.135
    3.200


最大と最小では、0.2V も違った。これで並列にしたら明るさが違うのが分かってしまう。

上下の 2 つづつを除いて 6 個で 2組にしようと思う。

さて、HT7733A を使って、2 cell を昇圧するつもりなのだが、データシートを見ると、±2.5% の精度。電圧にして ±0.08V 。

あと、もとから付いている 抵抗は、6.8 Ω。20mA x3 での電圧降下は、0.4V 。これは使えない。

ところで、スイッチは、LED の ON/OFF だけ。HT7733Aは、常に ONになってしまう。HT7733A自体の消費電流は、5uA なので、まぁ問題なさそう。

製作:

まず、LED が付いている基板を取り出さなければならない。これは内側から押し出す。手でやってもうまく行かなかったので、割り箸を当てて金槌でトントンやったら上手くできた。

次に選択した LED を取り付け。カソード側を切り取らないで、外側に曲げて、すずめっき線でぐるぐるやってみた。結局抵抗を外して直結したので、少しでも放熱するのが目的。ケースに接触するように作れれば良かったのだが、そこまではしっかり作れなかった。

さて、HT7733A 。これは、P板.com に発注していた基板が届いたのでそれを使うことに。

適当に作ったやつなので、実装のじゃまになるようなところに VIA があったりして、ちょっと困ったりしたが 回路は、OK。


    基板はこんな感じ。つかった部品は、HT7733A 表面実装タイプ@共立(10個 504円)。VLF4012AT-470MR30 (20個 200円@秋月)、ショットキーバリアダイオード HN2S01FU (10個 100円@秋月)、コンデンサ 入力出力とも 積セラ 10uF 6.3V(20個 100円@秋月)。

    VLF4012ATは、半田付けする場所がよくわからなくてコツがいるみたい。HN2S01FU は、マークが見えない。しょうがないので、片側だけ付けた状態でテスターで確認。コンデンサ 入力出力とも 10uFなのは、負荷変動がないので容量は小さくとも良いと勝手に判断。



    これは、組み立て後。VLF4012AT は、マークが 45 °になるようにすれば良いみたいだ。

ちゃんと昇圧できてLED が付くことを確認して、組み込み。

30 分ほど連続点灯させてみた。ケースはこころもちあったかい程度。中を空けて LED まわりを触ってみたが問題ない。だがしかし、インダクタが触れないぐらい熱くなっていた。350mA 47uH では無理がありそう。

とりあえず、様子を見ることにした。



OSPW5161P 編



調子にのって、OSPW5161Pでも作ることにした。まずは、Vf の調査。18.7 mA だから 定格 100mA 時はずっと高い。目的がグループ分けなのでこれでいいのだ。


    3.099
    3.124

    3.135
    3.163
    3.166

    3.179
    3.179
    3.185

    3.244
    3.259


やはり、やたら低いのとやたら高いのがある。同じように選択。

このLEDは、カソード側の足が太くなっているので、そのままでは基板に刺さらない。1.5mm のドリルで穴を広げた。そうするとランドが当然のようになくなってしまう。

すずめっき線で、ぐるぐる巻いて、ベタになっているところのレジストを剥離・半田付けし、すずめっき線をまず固定。次にカソード側の足をすずめっき線に半田付け。剥離には、ダイソーで見つけた半丸刀という彫刻刀を使ってみた。安全に作業できそうで良いかんじ。

次に点灯テスト。3 cell をそのまま直結してみたところ、一応光る。だが色が青っぽい。さらに点滅している。なんかやばそうなので、すぐやめて HT7733A を仕込んだカートリッジでやってみた。

それなりに光る。色もだいぶ白に近くなった。周囲を照らす感じで良いのだが、3.3V ではあまり明るくない。Vf が高めなのだから当然といえば当然。

次は、2連 の HT7733A モジュールの製作。ダイオードを付けて電圧を 3.7V にするのだ。

一応できました。なんというか、作った基板の出来が悪くて 変なところにある VIA とショートしたりしてちょっと面倒だったり。

電圧は、3.75V ぐらい。点灯させてみると、すごく明るい 2つは。1つは、点滅したりして暗い。

3.3V にもどすと、暗かったのがどれか判らない状態で問題なし。

Vf まで合わせたのに..

しばらく様子をみてから、電流制限抵抗をいれるか、LED をいれるかしよう。

とりあえず、LED交換 3.244V のやつ。

しばらく点灯してみたが、予想以上に電池が持つ。熱くなっているのは、インダクタだけ。オーバドライブなのはインダクタで、そんなに電流流せないのかも。

電流制限抵抗はパス。劣化したのは、半田付けのときで、熱を加えすぎたのかも。

ずっと点灯させてどうなるか見てみた。暗くなっていって、最後には点いているだけで、まったく明るくない状態まで行ったがなかなか完全に消灯しない。しばらく Off にするとまた復活するし。

HT77xx は、電池を絞りつくすみたいな表現をいくつか見たが、なるほどと思った。

追記:

RFAD のサイトで、パワーLED用アルミ基板を扱ってた。秋月の1W/3W出力LEDが付けられるようだ。



改造ネタに良いかも。

実際ランチャーの内部にマウントするにはどうしたら良いだろう?


秋月で売っている 24mm x 18mm x 17mm の放熱器を 使うことを検討してみる。

まず、24mm で両脇に 板が伸びているが スター型のアルミ基板は 20mm ぐらいなので 2mm 厚だとしても 入るはず。できたらネジを切って ネジ止めするようにしたら良いのではないかと思う。

次に、ランチャーの内径は φ 22mm ぐらいで、この放熱器の 対角の長さは 30mm 。(ピンを抜いてから) 4mm づつぐらい角を削る。削ったところしかランチャーと接触しないから、圧入するつもりで 調整しながら削る。

スプリングが付いている、ランチャーの基板は活かす。LED とか抵抗を取って、LED の反対側(放熱側)に貼り付け配線する。

    現物に合わせてみたら全然ダメ。深さが足りなく、フィン部分しか入らない。

電源は、2 セルから昇圧。とりあえず エコプラス製USB充電用電池BOXから部品を外すことを前提にする。

この IC は、2.4V から昇圧したとして、350mA を流して 5V まで昇圧する能力はない。4.0V 止まり。だが、3.0V なら 4.5V まで上がる。基本的に 350mA なら 1.6V の昇圧と考えれば良いのではないかと思う。

アルカリ電池を使うことを考えると、
4.7Ωを 3 パラで 放熱器のフィンに挟むように 付けると良いかも。350mA なら 0.54V の電圧降下。

HT7733A22uH 電源用インダクタ で自作しても良いかも。

インダクタは、直径 7.7mm なので、単四より細く 単四1 本分のスペースに入れられる。

問題は、どこまで電流が流れるか。

定格の 3.3V ではたぶん電圧が十分でない。無理やり電圧を上げるには、VCC 端子を 出力から ダイオードを通して接続する。

こうやって電圧を上げようとしても、流せる電流に上限があるのは、エコプラス製USB充電用電池BOX で使っている BL8530 と同じ。IC 内部で 制御している。ただ、個体差があるし インダクタとの組み合わせでも変わる上、LED の個体差で 電圧まで変わる。

要するに 実際に組んでみないと わからない。そういう意味では、エコプラス製USB充電用電池BOX であたりを付けてからバラして組み直す方が面倒が少ないように思う。

追記:
秋月でも 放熱基板付白色パワーLED(300円)パワーLED用放熱基板(50円)を扱いだした。




RFAD のサイトで、パワーLED用アルミ基板を扱ってた。
posted by すz at 23:00| Comment(3) | TrackBack(0) | 日記

2009年09月03日

RFADテクノロジーのケース

千石でケースを物色していたら、ガラス窓付きプラケースというのに目が止まった。

これは RFADテクノロジーというところが出しているケースだった。



中(MK8260)と小(MK6040)があり、RFADテクノロジー で買えば 小 180 円、中 260 円とリーズナブルな価格。千石で買うと若干高くなって 小 221円、中 326 円。

  • 中(MK8260)のサイズは、外寸:82×60×20 内寸:76×54×12(ガラス付蓋部分を除く実測値)。
    適合基板は、サンハヤト ICB-86 (47 x 72 mm)

  • 小(MK6040)のサイズは、外寸:60×41×20 内寸:55×36×12(ガラス付蓋部分を除く実測値)
    適合基板は、タカチ電機工業 TNF34-49 (34 x 49 mm - SW-55 用)

サイズをみてピン!ときた。このケースは、秋月 C 基板がちょうど入る!


いままで、いろいろ探したが、C 基板がちょうど入るケースはなかった。それが、ガラス窓 で 側面の加工が簡単なケースが安価に手に入る! ( ちなみに、ガラスが気に入らなければ、アクリル板とかを嵌め込めば良いはず )

C 基板 愛好家としては、とても嬉しい。

その上 ... 小さい方も SW-55 用基板が適合 -- ということは、1/2 C 基板 (縦 47〜48mm 横 35mm)も 適合するということだ。



このケース、これから愛用していきたい。

追記:楽天ショップがあるのを見落としていた。なにやら 結構種類があるみたい。



これがフタをあけたときの写真(中:MK8060)。

追記:

フタの部分は、ガラスをはめた後、おさえの枠を瞬間接着材で付けたような感じ。彫刻刀の平刀でこじったら(そこだけ)分離できたので、多分分解できる。

    瞬間接着剤のはがし液(アセトン)は使えない。ケースが ABS 樹脂なのでケースも溶かしてしまう。

裏には、TOKYO SCIENCE CO.LTD. のマークと 6 PS のリサイクルマーク。

ひょっとして、TOKYO SCIENCE CO.LTD. って ここ ( http://www.tokyo-science.co.jp ) ? え? 化石?鉱物?

あ、本来 標本ケースなのか。

追記(2011/1/11): 東京サイエンスで扱っている標本ケースは、中薄ケ−ス( 82× 60×h20mm) 250円 小薄ケ−ス( 60× 41×h20mm)170円 以外に 大厚ケ−ス(118× 82×h40mm)500円、中厚ケ−ス( 82× 60×h40mm) 290円 丸型プラケース(52φmm×h22mm 上面ガラス)なんてのがある。

もし、千石や RFADテクノロジーの直販で買えなくなっても、ここがある。

丸型プラケースも興味深い -- 基板を作ってみようかという気になる。中厚ケ−スは、MK8260 の 2 倍厚。これも興味がある。
posted by すz at 12:24| Comment(0) | TrackBack(0) | 日記

2009年07月23日

業務連絡

私の不注意で レンタルサーバーの契約が切れてしまい、サーバ移行することになりました。

バックアップも適当にしかとってなかったので、5/15 以降の記事・コメントも消えてしまいました。コメントを頂いた方には申し訳なく思います。

移行にあたって、

  • もの置き場のサイトが nmj.sakura.ne.jp → nmj.sumomo.ne.jp になります。
  • 復活した記事の URL が変わっているかも知れません。(よくわかりません)


リンクしていただいている方には申し訳ありませんが、リンクの変更をお願いします。
posted by すz at 19:12| Comment(0) | TrackBack(0) | 日記

2009年05月12日

DSLite 用のタッチパネル

電子工作ネタとして面白そうなものを見つけたので紹介。

ゲーム系のショップで、DSとかの保守部品を取り扱っているところがいくつかある。たとえば、ゲームツールというショップでは、


なんてものを売っている。

これを使ってなにか面白いものを作れるのではないだろうか?

たとえばトレース用の 小型タブレット? とか 底に印刷したシートを敷いて キーボードもどき とか。あと、純粋に 自作機器用の入力装置として使えるかもしれない。

仕様はわからないが、写真を見ると 4pin 。おなじゲームツールで売っている eeePC 用 (というより汎用) タッチパネルも 4pin だし似たようなものに違いない。

ちなみに、eeePC 用(というより汎用) は、X 方向 と Y方向の それぞれ 2pin 間の抵抗値 (数百Ω)を測定するようになっている。

なお、eeePC 用(というより汎用) タッチパネルのほうで なにか作るのは、あまりお勧めしない。薄いガラス製で 割れやすい。

追記: 09/11/26

スイッチサイエンスで、Nintendo DSのタッチスクリーン用ピッチ変換基板が売っている 420 円。コネクタ単体だと 100 円。タッチスクリーンも売っていて、1100 円。

posted by すz at 06:26| Comment(0) | TrackBack(0) | 日記

2009年01月17日

お気に入りのカードリーダー

いままで、お気に入りのカードリーダは、このタイプだった。安いし、信頼性もある。microSD耐久テストでは、4連USBハブにこれを装着して使ってきた。

しかし、気に入らない点もある。コネクタの部分がやわく、抜き差しを繰り返すと壊れてくるのだ。また小さすぎるのも良し悪し。もうすこし大きい方が無くさなくて良いかも知れない。

そういうわけで機会があると、良さそうな安カードリーダがないか探してきたのだが、ついに気にいったものを見つけた。

ものは、GENO で 399円の[RCR-SDHC/MS]

写真をみると、USB はまともなAタイプコネクタ。カード側も金属性のまともそうなスロットを使用している。そして緑色の基板が見えている。

ここで期待したのは、改造の可能性。中身を取り出して 4連ハブに仕込めないか?ということ。

ただ、そうするためには、カードのホットプラグに対応している必要がある。金属の部分に切りかきみたいなのが見えるので、いけるんではないかと思い、5つばかり買ってみた。

入手してみると、期待どおりホットプラグ対応だった。ただ Push-Push タイプでなかったのは残念。ケースは接着されていなくて、工具なしに割れ、そのままでも4連ハブに装着できた。しばらく使ってみて 問題なさそうなら ハブに仕込んでやろうと思っている。

電子工作ネタ:

ヒロセ・マイクロSDカードコネクタ(140円) と交換できると Push-Push になるような ...

Power/アクセス ランプが赤色でかつ明るく、なかなか目立つ。たとえば、秋月のチップLED -- 1608 サイズの オレンジとか黄色とかと交換してみるのはどうだろう。




追記1 Linux (puppy 4.1.1-JP) で確認:

確認してみたら、同じメーカのチップを使用していた。MA8123 と呼ぶことにする。
あと、残念なことに linux ではカードのホットプラグができなかった。なんとかしないと、HUB に組み込めない。
これ見るとパッチは存在するみたい。
→ puppy だと、ドライブマウンタを使うか /sbin/probedisk2 の実行で 手動で(再)認識した。M121 も OK。


いままでのお気に入り M121

Vendor=14cd ProdID=6700 Rev= 2.01
Manufacturer=SDMMC M121
Product=USB 2.0 SD/MMC READER

新たなお気に入り MA8123

Vendor=14cd ProdID=8123 Rev= 2.01
Manufacturer=SDMMC MA8123
Product=USB 2.0 SD MMC READER

追記2: eeePC 701SD-X で性能比較

手持ちの microSD で比較的速い SanDisk 8GB (old?) を使って性能を比較してみた。

SR SW 4KRR 4KRW
17.072 9.815 3.229 0.038 M121
17.720 10.186 3.355 0.037 MA8123

16.740 12.687 2.900 0.038 eeePC 701-X スロット
23.772 14.134 5.971 0.038 Aspire One スロット

( CrystalDiskMark 2.2 で測定 ,単位は MB/sec)

旧型 M121 と比べると若干だが性能up。ただし、SDカードの性能をフルには生かせないレベル。

あと、チップメーカが分かった。MOAI (奇岩) http://www.moai.com.tw




追記:

買った 5 つをチェックしてみたのだが ... なんと そのうちの 2つは、M121 だった。

Windows では、カードを入れないで挿すと、リムーバブルディスクと出て、後でカードを入れると 両方とも 設定したボリューム名に変わる。カードを抜くと リムーバブルディスクに戻る。

どちらも、ちゃんとホットプラグに対応しているようだ。 で、MA8123 が当たりかというと、どうも微妙。

耐久テストを(実は)始めているのだが、どうも MA8123 で I/O エラーが起きて止まってしまう。そしてプログラムが止まってもアクセスランプが点滅しているという現象が起きている。HUB の問題かドライバの問題のような気もするので、関係ない可能性はあるのだが、ちょっとやばいかも。

追記:4連 HUB に、4 つカードリーダをつけて全部に負荷をかけると、特定のスロットに挿した カードリーダにエラーが起きるかんじ。特に このカードリーダで起きやすいのかも?

追記2: どうも、2 つの MA8123 を挿すとおかしくなるようだ。1つだけ挿して問題が起きたことはない。
同じ HUB に挿す場合最初は認識するが、しばらく使っていると I/O エラーになる。これは Windows でも再現した。そして、もっとひどい事に ... 別の HUB に挿すとブルースクリーンになった。
シリアルナンバーが同一(812822222789)なのが原因なのか?

実は、M121 の中にも 812822222789 があった。... と思ったら、カードが入っているとき カードのシリアルナンバー(らしきもの)が見えるようだ ... 予想外。

で、M121 は 2 枚挿しても全然問題ない。要するに 何枚も同時に使いたい目的では MA8123 はハズレ。1 つだけ使うなら問題ない。

ちなみに、Windows での見分け方。プロパティのハードウェアの一覧で、SD/MMC READER と / が入っているのが M121 。SD MMC READER になっているのが MA8123 。

ついでなので ...
このタイプのカードリーダも M121 であることが多いようだ。手持ちのものは、カードのホットプラグは全然だめ。後からカードを入れても認識せず ”ディスクを挿入してください”というメッセージが出る。

M121 以外に "Mass Storage Device" と出るタイプのものがある。(Vend:Prod 058f:6335) 。これはちゃんとカードのホットプラグに対応しているのだが ... とにかく遅い。Read で 4MB/sec 弱しか出ない。




お気に入りの HUB --

別にお気に入りではないのだが、持っているのが、たまたま 同じ LSI だったのでメモ ...

一つは、グリーンハウスの GH-UHK204SS。グッドメディアで入手 850 円。

電源が弱い 玄箱/HG で使うので、AC アダプタ付きで安いのを探したらこれになった。

Linux で見ると、ベンダー Genesys (0x05e3) 製品 GL850A(0x0606 ? 0x0608 ?) 。データシートも手に入る。

もうひとつは、ESHUB4S 399 円。

ググると、分解写真が 見つかった。

そのまま使っても良いけど、AC アダプターをつなげられるようにしてみたり、バラして RCR-SDHC/MS(MA8123) と一緒にケースに組んだり、改造のベースにと考え中。

メモ:

グリーンハウスのGH-UHK204SSは、電圧区分1(内芯0.7φ、外径2.35φ)のようだ。( 電圧は 5V )。

ESHUB4Sに、DCジャックの基板パターンがあるが、サイズからみて、これも電圧区分1じゃないかと思う。基板には、2mm ピッチの3 つの穴が直列にあいている。この穴から ケースの外側までの長さは 11〜12 mm ぐらい。

秋月に、1.3mmDCジャック(基板取り付けタイプ)というのがある。写真で見る限り配列が似ている。サイズが分からないし極性も分からないが、適合するかも。
posted by すz at 00:37| Comment(4) | TrackBack(0) | 日記

2008年08月29日

Aspire One 買いました

Acer Aspire One を買いました。

これから AVR の開発は、Aspire One の Vine Linux 4.2 と Windows XP でやろうと思っています。

Aspire One の話題は、別ブログ すzのAspireOne研究で書いていこうと思いますので、よろしくお願いします。
posted by すz at 16:54| Comment(0) | TrackBack(0) | 日記

2008年05月12日

不正アクセスって?

ずいぶん前になるが、不正アクセスをしたとして、office氏が有罪になった事件があった。office氏がした行為がなぜ不正アクセスに該当するのか? 正直いってかなりの違和感を感じた。

なにがおかしいと思えたのか、不正アクセス禁止法の条文をひもといて説明してみようと思う。

第三条には、何人も、不正アクセス行為をしてはならない。 と書いてある。なぜなのかは、第一条に書いてあり、不正アクセス行為の定義は、第二条と第三条でなされている。

大幅に要約すれば、不正アクセス行為とは、

(不正な方法で)アクセス制御機能により制限されている特定利用をし得る状態にさせる行為

で、アクセス制御機能とは

(あるしくみで)特定利用の制限の全部又は一部を解除するものをいう。

ということで、第三条の一、二、三で、不正な方法とは何という定義づけがされている。

さて、個人情報を読むという特定利用がアクセス制御機能により制限されているのであれば、office氏の行為はアクセス制御機能になんらかの働きかけをしたはずである。そうでなければ特定利用は制限されていないということになる。

第三条の二に、制限を免れることができる情報(識別符号であるものを除く。)又は指令を入力するという働きかけは不正であると書いてあってそれに該当したことになったらしいのだが、そうであるとすると、CGI のパラメータをいじる以外の行為をしていないわけだから、CGI のパラメータ自体でアクセス制御がなされていることになる。

それは変じゃないか?と条文をざっと見ただけで思ったのだ。

当時の議論では、こういう主張はなかった。裁判での議論も微妙に違う。

なぜに?と思ったのだが、どうも

アクセス制御機能になんらかの働きかけをしなければ特定利用の制限の全部又は一部を解除できるはずはない

という考えが普通の人には自然ではないらしい。

上のようなことはどこにも書いていないではないかと思う人がいるかも知れない。しかし...である。それを認めないとどこかに矛盾が生じて、相当におかしい結論でも出せてしまうのだ。




別の理解のしかたも紹介しておこうと思う。

何人も、不正アクセス行為をしてはならない... その行為は悪である。

法律で行為そのものを禁止するのだから、誰にでもすみやかに理解できる概念があるはずである。

さて、実社会でアクセスを制限する機能をもったものはなにか?

それは鍵である。鍵にたとえるとすみやかに理解できるはず。

第三条の一は合鍵を作って勝手に鍵を開けてならないということで、第三条の二はピッキングあるいは鍵を壊してはならないということだ。

ひょっとしたら裁判官の目には、office 氏の行為がピッキングに写ったのかも知れない。しかし...である。いったいどういう鍵をピッキングしたのか? 鍵とまでいえるものがあったのか?そうでなければ、ピッキングのような行為でもピッキングではない。それを明らかにする必要があったと思う。




おわりに

また、電子工作とは関係ないことを書いてしまった。が、このような考え方があるということを紹介したかった。

こういう主張を見たことはないので、かなりユニークなものだと思う。ひょっとしたら、こういう考え方は、プログラミングを読むあるいはデバックする手法を応用した結果なのかも知れない。

できれば、主張の是非だけではなく、発想について深く考えてみてほしい。
posted by すz at 04:47| Comment(0) | TrackBack(0) | 日記