2008年04月11日

XMEGAの日本語データシート

XMEGAの日本語データシートが、3/31 に出ていたことをいまさらながら知った。

Atmel の XMEGAのページからたどれるオリジナルの ATxmega A Manual Preliminary の忠実な翻訳なわけだが、正直日本語版でないと読む気がしない。

英語じゃなく日本語というのも大きな理由だが、理由はそれだけではない。表や図がカラーになっていたり、見やすいよう枠を入れたり、配置を変えたりしてあって読みやすいのだ。

ちなみに、WinAVR での対応は次のバージョンだそうだ。でも、チップがいついくらで入手できるかは不明。

先に発表された AVR32 の ワンチップ AT32UC3Bシリーズはデジキーに登録された。128KB の AT32UC3B1128が 1069円で、リードタイムが7/13。ATxmega128A4が、これより早く入手できることはないだろうし、これより高いこともないだろう。
posted by すz at 02:45| Comment(0) | TrackBack(0) | 日記

2008年02月27日

電子工作と FLASHメモリ

電子工作で大容量のデータを扱いたい場合のひとつの選択枝は、SD/MMC カードを使うことだ。

  • MMCの使い方のページがいちばん判りやすくかつ詳しいと思う。この中の端子処理と活線挿抜も要チェック。

  • SD/MMC カードの接続例(OLIMIX SAM7-P256の回路図より)

    - この回路でも、VCC に LC フィルタを入れて対策している。このとおりの回路にする必要はないが、対策はした方が良さそうだ。


いまは、ビット単価がすさまじく下がっているので、実際に使うのは microSD が良いと思う。microSD のほうが一般に消費電力が少ないらしい。実際に調べたわけではないが、突入電流も少ないのではないだろうか。

SD のスロットでよいなら、秋月でも取り扱っている。-- (150円の安い方は)あまりよい品ではないらしい。220 円の ヒロセ製の方が安心。

microSD 専用にしたいなら、コネクタもデジキーで入手できる。DM3AT-SF-PEJとかDM3B-DSF-PEJとか。microSD は、1.1mm ピッチだから手半田でもなんとかなるかも知れない。

西川部品でも DM3A-SF-PEJを扱っている(315円)。-- ゆきの研究室つれづれ日記より

秋月でも DM3AT-SF-PEJを扱いだした。200円。
ちなみに MINI-SD 用スロット(DM2A-SFW-PEJ-S)も。200円。


さて、そんなに大容量である必要がなく、PCからの読み書きも必要ない場合はどうだろう。

残念ながら、あまり選択枝はない。特に ADC からキャプチャーするなど、高速かつ定期的にデータを書き込みたい場合は、ダブルバッファが必要でさらに選択枝が少なくなる。

以前さがして、そういう目的に合いそうなデバイスを1つ見つけたので紹介しようと思う。

それは、AT45DB081D -- デジキーで 213円

インターフェイスは SPI で 8-soic パッケージがあるので、秋月の変換基板で DIP としても使える。

1MB だから GBクラス の microSD の 1/1000 以下だが、目的によっては大きすぎる場合もあるはず。書き換えも 10万回できる。

書き込みに向いていると思ったのは、256B の ページWrite が比較的早い(2ms Typ/4ms Max) だけでなく、バッファを 2組持っているためだ。

バッファを 2 つ持っていると、ページWrite している間も書き込みができるので、AVR 側にバッファを持たずにすむし書き込み時間も隠蔽されてしまう。ページWriteの時間だけが、書き込み性能を規定する。

4ms あたり 256B 書けることが保証されているのであれば、8bit ならば、64k sps でデータを書き込みしてもデータ落ちがないということである。AVR のADC の 上限 77 k sps にかなり近い。10 bit だと、15 k sps でしか取れないから、2バイトづつ書いても十分間に合う。

ちなみに、AT45DB081B というデバイスもあるが、ページWriteが遅い。AT45DB041D は容量だけ違うので良いのだが、すぐ買えないかも知れない。AT45DB021D は、バッファを 1つしかもっておらずキャプチャーに向いていない。
AT45DB161D も 276 円と安く良い。ページサイズが 512B で ページWrite時間が 3ms Typ/6ms Max なので、若干帯域が高い。

上記は、Write だけをする場合。Erase には時間がかかるのであらかじめ Erase しておくのを前提にしている。Erase and Programming だと、Typ 14ms/Max 35ms になる。この場合の上限は、7.3KB/sec ほど。

Write と違って Read は制限がほとんどない。バッファに読み出す時間は 0.2 ms でしかも 2つあるから無視できそうだ。SPI クロックの上限は 66Mhz で 純粋に AVR 側の SPI 性能で決まる。たとえば ATmega88 とか AT90USB162 とかは、SPI を持っていて、さらに USART も SPI として使える。上限は 1/2 CPU CLOCK なので、CPU CLOCK が16MHz だとすれば、8MHz 。連続で読み出す場合 1MB/sec 弱で読み込めるはずだ。

まぁ、書き込みが高速といってもこの程度だし入手性も問題がある。1MB ほどしか必要なくても、いっそのこと microSD にしてしまうのも良いのではないかと思う。

SD/MMC カードを使う場合、FAT をサポートするのが望ましい。1MB しか必要ないのに 1GB 全体を占有するのは気がひける。
でも AVR などコード領域が少なく FAT をサポートしきれない場合はどうしたらよいのだろう。

案1)あらかじめ用意した固定名のファイルの中だけを使う。

FAT16のみを使用して、アロケーションサイズも 32KB 固定にすることを前提にしてみる。

- こういうことは、Linux では簡単にできる。mkfs.msdos のパラメータを設定するだけだ。

- Windows XP だと 2GB(弱)なら FAT を選択するだけで自動的に 32KB になる→ 参考 : FAT および NTFS のデフォルトのクダスタサイズ
- 1GB だと 16KB になるだけで、残念ながら普通の方法では無理。
面倒だが、コントロールパネル→ コンピュータの管理→DISKの管理→領域選択→プロパティで FAT とアロケーションユニットサイズ を選択することで FAT16で32KB に設定可能。
- 4GB の microSD は存在しない。microSDHC になる。


こういうことを前提にできるなら、1MB でも 32個 64B の変換マップを作れば良いので なんとかなるのではないだろうか?

ちなみに、microSD の 1GB と 2GB のみを対象とした理由

- メモリカードの販売価格の推移を見ていると 1000円を大幅に切るまで安くなったものは、やがて市場から消えていく運命にある。
- 1GB の価格はすでに 600円台。たぶんやがて消える。
- 2GB は SD 規格の最大容量だから、結構しぶとく残るのではないか? (ただし、どこまでも安くなるとは思えない。500円〜1000円のどこかで安定するような気がする。) 
- そうだとして microSD は miniSD/SD に変換できるから、2G 以下の miniSD/SDもやがて消えていくのではないか? 
- そういうわけで、今からものを作るのであれば、2GB のみを対象にすれば良さそう。(1GB はおまけ)



案2) パーティションの隙間を使う。

案1を実装するだけのコード領域がないから FAT を無視して連続した領域を使いたいという場合でも 先頭から使うのだけはやめたほうが良い。

先頭の 512B さえあければパーティションをずらして作ることで、他の領域を他の目的に使えるからだ。

- これも Linux なら実に簡単だ、fdisk するときにパーティションの先頭をデフォルトから変更するだけ。
- Windows ではどうしたらよいのだろう? 商用ソフトなら、いくつか存在するのだろう。しかし、これだけのために商用ソフトを進めるわけにはいかない。
- FIPS かつては定番ツールだったらしい。今使えるのかどうか不明。
→ (MD5) 0e69615d799a6dc7309cbc07a4539426 fips20.zip
ソース付きなので、いろいろできるかも。


さて、どれだけずらせばよいのだろう? 一応 16セクタ(先頭から 16x 512B) ずらすことをお勧めする。

なぜか? たいした理由ではないのだが、あるシステムと同じだから。-- あるシステムって何? 誰でも知っているものだけど秘密です。


追記:09/10/02

SD/MMC カードの接続なのだが、ELM: 8ピンICで作る SDオーディオ・プレーヤ回路図を見ると .. プルアップが全部省略されている。DAT1/DAT2/CD が無接続。プルアップ必須だとばかり思っていたので、少々驚いた。

それはともかく、最近の microSD は 2GB/4GB でも MLC 化しているようだ。そうなると 内部の消去ブロックのサイズが 大きくなる。これが実に 2MB ぐらいありそうだ。

microSDの耐久テストをしていて思ったのだが、このサイズ 2MB 内なら 一気に書けるようだ。

キャプチャーするには最適かも知れない。

ちなみに、お勧めは SanDisk 。ウェアレベリングが効くので あまり寿命を心配する必要もない。
posted by すz at 21:28| Comment(0) | TrackBack(0) | 日記

2008年02月26日

秋月取り扱いパーツだけを使って作る何か

秋月で ATmega164p, ATmega644p, ATmega88 が低価格で購入できるようになった記念にこれらのどれかと、秋月で入手できるパーツを使ったなにかを作ってみたい。(いまのところあくまで願望)

で、考えていたのだが、SD カードを USB Floppy にするアダプタなんてのはどうだろう。USB の UFI という仕様を満足すれば良いはず。

動機その1

実は数週間前 、Windows XP マシンがおかしくなってクリアインストールする羽目に陥った。インストールした後、必要なアプリケーションをインストールしたりさらにアップデートしたりする必要があったのだが、非常に苦痛だった。もうクリアインストールだけは絶対したくない。...というわけで、はじめて Windows XP 付属のもバックアップを使ってみたのだが、なんとフロッピーが必要だった。PC 自体も古いのでドライブは付いているのだが、メディアがない。私はフロッピー自体あまり信用していないので、たとえメディアがあったとしてもあまりうれしくない。メディア全体をファイルにして、バックアップすることになる。

そういうことが簡単にできる装置がほしいと思った。

動機その2

これも Windows マシンがおかしくなったことが発端なのだが...
VMware Player に目をつけた。仮想マシンならバックアップは非常に楽だ。ホスト OS には、あまりアプリケーションを入れずにすむし、セカンド Linux マシンにもなる。qemu を使って disk image を作ることで、VMware Player に OS をインストールできることもググってわかった。

VMware Player で扱えるストレージは、 disk image 以外は、DISK 以外の実際の装置のみ、具体的には、CD と USB ストレージ。Vine-4.2 をインストールしてみたのだが、実際の CD を用意する必要があった。

仮想マシンのインストールをするのに、実際の CD を用意するのは、なんだか馬鹿馬鹿しい。といって AVR とかで 仮想CD を作るのは性能的に無理がある -- AT90USB162 を使ったとしても、 1倍速CD ぐらいが限界のように思える。でも、network インストールできる OS なら、仮想 Floppy でも十分だ。やったことがないのでわからないが、ひょっとしたら、Windows の バックアップを仮想マシンにリストアできるかも知れない。


どんなものにしようか

とりあえず動機付けはできた。あれば便利に違いない。

さて、どんなものにしよう。まず、SD カードについて考えてみる。今はビット単価が落ちすぎて、1000円以下で買える最大の容量が 1GB になってしまった。不要になった SD でも 128MB になった。(64MB はテストで壊してしまったし)。できれば SD に書き込んだ FD イメージを 1 枚の FD として扱えて、メディア切り替えができるものが、望ましい。

ファイル名は固定にして、空のFD を定義する場合も FD のサイズのファイルを用意することにする。こうすることで、ファイル生成の機能が必要なくなる。ルートディレクトリエントリから、shortname でファイルを検索し、ファイルサイズを取得して、メディアのサイズとする。そして、FAT を手繰って 1FD分のマップを作る。あとはマップにしたがって I/O コマンドを実行する。...こんな処理で良いはずだ。

マップを作ると簡単に書いてしまったが、ATmega88 では無理かも知れない。どうせフロッピーだし、無理なら、いちいちFATを手繰っても良いかも知れない。


問題はサポートできる FDの数。1枚ではチョットもったいない。複数ならオペレーションのためのインジケータとボタンが必要だ。数枚なら、LED で 2進数表示というのもアリだが... ピンがずいぶん余るはずなので、2桁の 7セグと、セレクト用の UP/DOWN ボタンを付けるということでどうだろう。...ということは サポートできるFD数は、最大 99。実際にこんなに使うとは思えないのだが、Windows 95 の時代は、本当に数十枚のFloppy を使っていたし、オーバスペックとまでは言えないかも知れない。

あとは、メディア切り替えを OS に知らせるためのオペレーションが必要。専用のボタンにするか、あるいは UP/DOWN ボタンを操作し終わった 5秒後とかでも良いかも知れない。どちらにするかは、ピンの数と、操作性と、レイアウトデザインで決めることにする。

さて、(メモリと余力があれば)もうひとつ付けたい機能がある。それは、FDD の シーク音。ここまでやれば、この装置が実際に役に立つのかどうかなどどうでも良くなるに違いない。

主要部品

シーク音機能がなければ、たぶん ATmega88 で実装できるはず。

SDカードスロットも水晶も 2桁 7seg も全部秋月で購入可能なはず。
ちなみに水晶は、最新版の usbdev を使えば 12MHz/16MHz のどちらも OK。

基板は C 基板。うまくレイアウトすれば 1枚に入るかも知れない。

おわりに

まぁ、いまのところ妄想です。シーク音機能はどう作るか想像できていないけど、メインの機能は、まじめに mass-storage を調べれば作れそうなレベルだと思います。

追記:設計メモ

ほんとうに作る気になったら、カテゴリを作ってあらためて書くつもりだが、まだ作る気が起きていない。とりあえず設計メモとして追記していこうと思う。

付けるパーツと pinの数の確認

もう ATmega88-20PU(250円) で作ろうと思っている。これで作れなければ、作らない。

さて、ATmega88 で作った場合、どういうパーツを選択するか。使用する pin の数にも気を付けなければならないので、pin数を確認しながら決めていく。

ATmega88 は、28 pin そのうち ~RESET , VCC, AVCC, AREF, GND x2 の 6 pin は(普通)信号線には使えない。だから pin の数は 22 からスタートということになる。

SDカードスロット(150円/220円) まぁこれは必須だ。

OLIMIX SAM7-P256の回路図

を参考にすると、信号線は、4 pin 必要ということになる。SCK/MISO/MOSI/~SS の 4 pin を割り当てて、ISP にも使う。-- まあこれは常識的な割り当てだろう。残り 18 。

USB 用ピンの割りあて INT0/PD2 とそのとなり INT1/PD3 -- これも必須だ。水晶も必要だから 4 pin 。残り 14。

水晶は、表面実装タイプ クリスタル 16MHz (5個入り 200円)にしようと思う。12 MHz でないのは、usbdev が他の周波数に対応した記念に使ってみようと思ったから。12MHz でも OK なようにはしておく。ちなみに、表面実装タイプだが、いっても PIN を引き起こせば 普通に使える。台座が付いている分だけ手配線するのは楽。

USB は、3.3V で動かす。レギュレータは、TA48M033F( 3.3V 500mA,コンデンサ付き 100円) 。SD カードは多少消費電流が多いそうなので、コネクタにには、電流が取れる USB B コネクタ(50円)を選択する。ひょっとしたら、A タイプ(50円)を使って 延長ケーブルを使うほうが使いやすいかも知れない。

表示装置は、手配線が楽な、3桁 7seg (200円)を選択することにする。ドットを使わないことにして、3 + 7 = 10 pin を使う。残り 4 。

表示は、1 つ1つ点灯するようにする。VF 1.7V として 最大 20mA とすると 80Ω。電流制限抵抗は、コモン側を使い 75 Ω x 3 ということにしよう。

残りは 4 しかない。まずはボタン。とりあえず 2 個で信号線も 2 本とする。もし 3 個にするとしても 2 本でなんとかすることにする。ちなみに通販だと、タクトスイッチ 100個セット 700円しか選択枝がない。一応通販でも売っているし、店頭なら1個単位で買えるから、”秋月取り扱いパーツだけ”というのを外していないとしよう。

残り 2 。これは機能拡張用(一応サウンド用のつもり)。何を残すべきかが難しい。シリアル RX/TX を残すこともできるし、2 つの PWM を残すこともできる。あるいは、ADC+I2C(TWI) を残すこともできる。-- もう少し設計が進むまで保留ということで。

ちなみに、LED をダイナミック点灯させると、電源にかなりのノイズが載る。ADC を使うのも PWM を使うのも精度を出すのは、結構厳しいと思う。

その他のパーツについて

基板は、両面ガラス・ユニバーサル基板 72x47mm(1枚 100円・10枚 900円) を選択する予定。SD カードスロットを上面に付けたいというだけの理由。

あとは、ケースそれに、配線材とコンデンサ・抵抗・インダクタ、それに ICソケット・ピンヘッダ。基本的にこういうものまではケアしないが...どうしよう。

できるだけ秋月取り扱いパーツを紹介するが、無理な面もある。

まずケース。
ケースに入れられるように作る場合は テイシン電機 TB-55Bから検討する。ひょっとしたら基板を削ってもパーツの配置の問題で入らないかも知れないし決定ではない。これに入らないなら、すなおにレイアウトするつもり。一応スペーサを勧めておこう。

コンデンサ・抵抗は秋月のものだけで良いのだが、SD用 インダクタは無理かも。一応 マイクロインダクタ 47uH を付けてみて、動けば OK ということにしよう。

他の目的に使う

仮想FD として使えることを第一に考えるけれども、他の目的に使えても良いかも知れない。SD カードも付くし ブートローダも使ってみたいし。-- ただ、プログラム本体も 6KB 以内という条件になってしまう。無理なら諦めるつもりだが、少しばかり検討だけはしておこう。

まずは Writer 機能ということになりそう。拡張用信号線は 2 つしかない。... のだが ボタンをさわらないことにすれば 4 本。SD カード用の信号線を使うことは考えたくないので、この 4 本を使えるように少し考えておこう。

それ以外? 7 seg 3桁ながら表示装置とボタンが付いていて USB も付いていれば意外にも有用なものが作れるかも。3桁ロックつきUSBメモリとか? PCの画面ロックとか? 秒表示 ラーメンタイマとか?。まぁ本体で作れるものは、拡張用信号線は関係ない。

2 本しかないが、ADC が使えるのはメリットかも知れない。

7seg をやめて液晶ディスプレーにする

うーん。入れ替えて使える機能を考え出すとこういうことをしたくなる。あくまでおまけと考えたほうが良さそうだ。まぁ、基板を起こすぐらい気合が入ったなら、7seg と 超小型LCDキャラクタディスプレイモジュールのどちらを使うか選べるようにしても良いかも知れない。
posted by すz at 19:40| Comment(0) | TrackBack(0) | 日記

私がAVRを選んだ理由

いますぐPICをやめてAVRに移行すべき10の理由に触発された。このブログを作った理由にも関係するので、私がAVRを選んだ理由を書いてみようと思う。


  • gcc が使える
    2KB のプログラムメモリと 128B のRAM のチップで、C でプログラミングが出来るのはいったいどういうことなのか? どの程度のことまで出来るのだろう? という興味を持ったのが、AVRを使ってみようと思った最大の理由。
  • ELM - Atmel AVRについてを知ったこと
    このページで、日本語ドキュメントがあり、ライタも簡単に作れることを知った。このページがなければ、単に興味を持っただけで終わったかも知れない。
  • 秋月で ATtiny26L が入手可能になったこと
    秋月で早くから AT90S8535 や AT90S8515 などを扱っていたのは知っていたのだが、そのころは興味を持てなかった。
    ELM を知り、ATtiny26L が買えることを知って初めてプログラミングをすることにしたことを覚えている。


私がAVRを選んだ理由は、こういったことだが、考えてみれば既に過去の話で今も選び続けている理由ではない。

今AVRを選び続けている理由というのも書いてみよう。


  • gcc と avr-libc が使え、 日本語ドキュメントがある
    たとえ 2KB でも gcc で思うようにプログラミングできることを知ってしまった以上、もう gcc のないチップを選択する気はまったくおきない。avr-libc も気にいっている。データシートを見ればプログラミングできるし、ソースコードを見てどういう処理をしているのか調べることもできる。
  • アーキテクチャが洗練されている
    AVRはまともな RISC だ。mips に通じるところもあり、今まで経験してきたプログラミング流儀を生かせたりして非常に気に入っている。また、パイプライン処理をしていて 1clock あたり 1命令を実行できるほど高速であるのに、あるコードが何 clock で実行されるのか容易に計算できるところも気に入っている。
  • レベルの高いアプリケーションが公開されている
    CPUでの USB 処理や バーチャルアナログシンセなどが公開されていることは、プログラミングにチャレンジしようという気を起こさせる。
  • ADC や PWM などのデバイスの使い勝手が良い
    使い勝手が良いと言い切ってしまうのは少々抵抗があるが、ワンチップマイコンである以上デバイスがどこまで使えるかがすべてである。たとえアーキテクチャが洗練されていて gcc が使えても デバイス周りがダメダメなら使えない。そういう意味で必要な水準は超えているといえる。


さて、今AVRを選んでいるわけだが、ブログのタイトルから判るように AVR only である。なぜ他のチップを(少なくとも当面は)選ばないのか? その理由も書いておこう。


  • AVR で十分である
    AVR でかなりのことはできる。AVR で出来るのに他のチップを選ぶ理由はない。PIC24F は RAM が 8KB もあったりデバイスが充実していたりして、AVR で出来ないことが出来そうで、かなり魅力的なのだが、gcc やライブラリの条件をクリアしていないので選択する気がおきない。PIC24F を選ぶぐらいなら ARM や AVR32 など 32bit に移行してしまうと思う。
  • AVRで出来ないようなものは面倒である
    AVRで出来ないことをするということは、回路の規模が大きくなったり、プログラムの規模が大きくなるということでもある。なにか作ってみたいという気持ちはあるのだが、そういうものを作るには、(私にとっては)面倒を乗り越えるだけの動機が必要でそれはまだ見つけられていなかったりする。


追記

ゆきの研究室 - つれづれ日記で知ったのだが、もうひとつ AVR しか選ばない理由が増えた。

それは、XMEGA シリーズが発表されたこと。

3.6V までしか動作しなくなったけれども、32MHz まで高クロック化され、ADC が 12bit (2Msps) まで高機能化された。さらに 12 bit DAC (1Msps)まで付き、DMA までできるようになった。AES/DES エンジンというのも嬉しい場合があるかも知れない。

たぶん実際に使うデバイスは、ATxmega16/32/64/128A4 シリーズ。TQFP44 なら、アイテムラボの変換基板も使えるし、0.8mm ピッチで半田付けも楽。

gcc,binutils,avr-libc,avrdue の対応。そして実際に入手可能になるのを待たなければ使えないが、相当に魅力的だ。DMA も持っているから、へたな 32 bit より早いかも知れない。RAM が 最大 8KB しかないことだけが不満か。
posted by すz at 02:44| Comment(2) | TrackBack(0) | 日記

2008年01月10日

『もう俺は限界かもしれない』を読んで

遅らばせながら、『ブラック会社に勤めてるんだが、もう俺は限界かもしれない』を知り読んだ。

深く感情移入できたし、いろいろ考えさせる内容であったので紹介しておく。ググれば数多くログが見つかるだろうからリンクはしない。

実話認定

2ch に投稿されたものだが、実話をベースにしていることを私は信じる。創作かも知れないと疑わずにすなおに読んでほしい。

藤田さんの言動を通じて浮かび上がるキャラを書き手本人が理解していない。そのことが読み取れるし、実際本人が雑談スレでそう書いている。これが、決定的な理由。

感想

この話あまりにリアルだ。書き手本人が意識しないことまでにじみ出てきている。だからこそ、読み手ひとりひとりが、さまざまな感想を持つことだろう。

このブログの真のテーマと関係しそうな感想までありそうに思えるので、いくつか自分の思いを書いてみようと思う。

プログラミングについて

デスマや人間関係について凄惨な現状が描かれているが、プログラミング自体については、まったくネガティブな表現が見当たらない。

そもそもの動機が、タイトルから想像できるように現状から逃げ出したいという思いを吐き出したいというものだろう。それでも(はじめのやりとりから推察して)違う職業につきたいとは考えていないように見える。

この話を読んで PG あるいは SE を目指すのはやめようと思う人がいるかも知れない。でも次のことも考えて欲しい。

プログラミングという行為は楽しいのだ。そして、この話で出てくるプログラミングがすべてではない。

AVR に限った話題しか扱わないつもりでこのブログを始めても、MinGW/MSYS や gcc の改造、さらには Linux のドライバの改造まで出てきてしまう。そして、プログラミングの世界はまだまだ広い。

プログラミングあるいはデバッグするという行為は、効率よく論理的思考を身に付ける手段でもある。論理的思考といってもレベルがある。説明できないが、自分があるレベルについて理解できても、それが頂点ではない。それ以上のレベルがあり得るのだといういうことを、考えて欲しい。

すこし解説しようと思う。でもこれが、分からないからといってこれ以上説明を求めないで欲しい。

まず、プログラムというのは、だれでも理解できる非常に簡単な論理の組み合わせである。だれでも理解可能であるはずなのに、理解しがたいのは複雑だからだ。

プログラムを理解するというのは、あちこち省略された論理を読み解くのに似ている。省略された論理というのはサブルーチンのことだ。

あちこち省略された論理など論理ではない。理解できるわけがないと思う人もいるだろう。

でも、そういうことを当たり前のように出来る人もいるわけだ。論理的思考が出来ると思っている人でもこれが出来ないならば、レベルの差がある。

生活の場で感情論としか思えないものに、正論をぶつけて紛糾する...そういう場面はありがちだ。正論をぶつける側は、相手が論理思考ができないと思うかも知れない。でも、感情論側にも省略された論理があるかも知れない。レベルが違う人は当たり前のようにそれを見つけることができる(かも知れない)。


藤田さんについて

多くの人が、藤田さんがリーダにならない。そして、恋人がいた会社に行ってしまう理由が分からないと書いている。

こう考えたらどうだろう。

藤田さんは、挫折から立ち直り切っていない。新たな人生の目標を見つけ出せていないのである。上原さんや雇ってくれた社長を見捨てることはできないから職場に縛られていたが、問題がクリアになれば新たな人生の目標を模索したいのだ。そのために恋人がいた会社に行くというのは、自然な発想のように思える。

そして、人生の目標を喪失したままの人物は理想の人物ではない。藤田さんを理想の人物として描きたいなら、新たな人生の目標を模索に出ることは必然といえよう。

...ということを書いた本人が意識していないようなのだ。これ(意識していないように見せること)が表現の一手段というのはありうべかざることだ。実話であって理解せず観察だけによってこういうことを読者に伝えたとしても、驚くべきセンスである。

日本人は弱いのか?

藤田さんであれマ男であれ、脱却したとはいえ NEET 時代があったのだから、よく言えば繊細な、悪く言えば弱い人物として描かれている。木村くんが自分の意見を押し通すことに驚く場面さえある。それゆえにリアルティを感じるし、NEET であるような人の共感もえられるのかも知れない。

正直もっと強くなって欲しい。たとえば司馬遼太郎が描く戦国時代や幕末の日本人は信じがたいほどアクティブだ。繊細なだけが日本人の特質ではない。

おわりに

ついに感想文まで書いてしまった。これや前の記事は、例外である。この手のものは、もう書かないつもり。
posted by すz at 21:50| Comment(0) | TrackBack(0) | 日記

2008年01月08日

このブログの著作権について

著作権について少し考えることがあったので記しておこうと思う。

このブログの著作権は、すzが持っている。しかし、私がたとえば事故で急に死んでしまったら、どうなってしまうのだろう?

おそらく、比較的すみやかに このブログは自動的に閉鎖される。そして私が誰かなのかを、さらには私の遺族が誰なのかをつきとめてかつ、許諾を得ないと二度とこのブログは見ることができなくなる。死後 70年(でたらめだ)無名・変名なので、公表後 50年もの権利があるから、ログを取っていた人がいたとしても不特定多数の人に見せることはできないだろう。

別に死ななくても、このブログが閉鎖されてしまう理由はいくつもありそうだ。

ほとんどの人にとってつまらない内容かも知れないが、せっかく書いたものなので、有用だと思う人が一人でもいる限り公開できたらと思う。

というわけで、宣言だけはしておく。

もし、このブログの内容がインターネットのどこにも見られない状態になったら、誰でも良いから、私に代わってこのブログの内容を公開してかまわない。公開を妨げる権利は放棄する。ただし、このブログの内容(文章)に限る。

文章以外に、プログラムもあるが、それは GPL として扱って欲しい。


公開してくれる人がいるかどうか分からないが、宣言しておかないと消えてしまうのは確実なので記した。

こういうことを考えた理由も書いておこうと思う。

こんなもの(このブログ)でも著作物であり、著作権というありがたい権利が与えられる。しかし、他の財物とは違って、著作権は、文化の発展を目的としている。

誰一人として欲しないなら別だが、自分の都合だけで消滅させて良いのか?それは、著作権の目的にそぐわないだろう。権利だけもらって義務を果たさないように思えてきたのだ。

デジタルデータは、コピーするのは簡単にできる。しかし、メディア(ここの URL自体もメディアかも知れない)に縛られてしまうといとも簡単に消滅する。(少なくとも今の技術レベルでは)コピーされ続けることによってのみ残りうる。そういう性質がある。(と私は思う)

そういうことを考え出すと、これを書かずにはいられなくなってしまった ... というのが本意なわけだ。

おわりに

このブログはあくまでも、趣味の電子工作のブログです。この記事については、必要性があったから書いたまでで、著作権について議論することは本意ではありません。

申し訳ありませんが、この記事についての議論はここではご遠慮ください。
posted by すz at 00:11| Comment(2) | TrackBack(0) | 日記

2007年12月20日

libusb と HID

Windows 流にいえば COM ポート (Linux なら tty )で通信できる CDC は便利ではある。でも、AVRの コードが大きくなったり、約束ごとを決めないと、その装置がどんな装置か判別できないというデメリットもある。また、汎用インターフェイスなので遅い .. かも知れない。

USB ライターでいうと、AVR-DoperUSBasp あと USBtinyはみな libusb や (HID インターフェイス)でアクセスするので、デバイスの種類は指定しても、(COMポートの番号など)デバイスそのものを指定しなくとも使える。

こういう ことができるのが、USBのメリットだが、CDC を使いつつ、どんな装置か判別することはできないだろうか?

というわけで、まずは、AVR-Doper や USBtiny そして USBasp がどんな風に使うのか調べてみた。これらは avrdude でサポートされている。avrdude のコードを見ればだいたいのことは分かる。

libusb の open/close

接続されているすべてのデバイスをスキャンして、VENDOR_ID と PRODUCT_ID が一致するものを選ぶのが普通のやり方らしい。
CLASS とかで判断する方法もあるらしいが、汎用デバイスを作るわけではないので、知る必要もないだろう。


usb_init();
usb_find_busses();
usb_find_devices();
for(bus=usb_get_busses(); bus; bus=bus->next){
for(dev=bus->devices; dev; dev=dev->next){
if(dev->descriptor.idVendor == VENDOR_ID
&& dev->descriptor.idProduct == PRODUCT_ID){
handle = usb_open(dev);
       break;
}
}
}


open したあとさらにオマジナイが結構必要。列挙すると、

usb_set_configration(handle,...);
usb_claim_interface(handle,...);
-- 失敗したとき usb_detach_kernel_driver_np() などで
    ドライバを解放する。


close もそう単純ではない。

usb_release_interface(handle,...);
usb_reaet(usb_handle);
usb_close(usb_handle);


usb_release_interface() はともかく、usb_reset() までしなければならないのか? なぜそうするかよく分からない。

libusb での制御方法

コントロールエンドポイント に対して、ベンダー依存のリクエストを usb_control_msg() で送って制御する方法がある。これは、USBtiny や USBasp のやりかた。ファームウェアが簡単なのがメリット。

そして、コントロールエンドポイント に対してusb_control_msg() を使って制御するのは同じだが、HID クラスを定義し、HID の GET_REPORT / SET_REPORT で制御する方法がある。これは、AVR-Doper が使っているやりかた。この範囲で使うならば、WIN32API を使っても制御できるのがメリットだが、HID の定義が面倒そう。

さらに、usb_bulk_read()/usb_bulk_write() を使って バルクエンドポイントに対して送受信することで制御する方法もある。avrdude の jtagmkII(含 AVRDRAGON) や stk500v2 の制御をみると .. COM ポート以外に、libusb を使って制御する方法を提供している。

ちなみに、usb_control_msg() は、ほとんど SETUP パケットを自分で組み立てるイメージ。GET_DESCRIPTOR とかを直接 CALL したりできるかわりに、SETUP の通信について知識が必要。

WIN32API での制御方法

AVR-Doper での open の方法は次のようになっている。


HidD_GetHidGuid();
SetupDiGetClassDevs();
for(i=0;; i++) {
SetupDiEnumDeviceInterfaces();
SetupDiGetDeviceInterfaceDetail();
CreateFile();
HidD_GetAttributes();
if (deviceAttributes.VenderID == VENDOR_ID
&& deviceAttributes.ProductID == PRODUCT_ID) {
break;
}
}


関数の機能も名前も違うが、libusb の open の仕方と良く似ている。

デバイスとの送受信は、HidD_SetFeature()/HidD_GetFeature() を使用する。libusb 版では、usb_control_msg()をつかって同じ機能を実現している。

さらに説明しておくと、AVR-Doper は HidD_SetFeature()/HidD_GetFeature() を 使って COM ポートのような ストリーム(というか擬似シリアルデバイス?)を実装している。その上で 上位の STK500V2 プロトコルが流れるようだ。

そういう処理をするのも面倒そうだが、HID でベンダー依存の情報を流すためには、デスクリプタの定義が必要でそれも面倒そうだ。AVR-Doper では、定義が 60バイトぐらいある。

CDC を使いつつ、どんな装置か判別できるか?

すくなくとも、Linux ではできないようだ。/dev/ttyACMXX というデバイスと libusb で得られる情報のマッピングができない。

WIN32API だと、API は知らないが、分かるような気がする。
しかし、libusb とは関係ない API だと思う。

Linux で出来ない以上 WIN32API で出来てもあまり嬉しくはない。今度は逆を考えてみる。


libusb を使って、CDC のように使えるか?

まず、AVRCDC や USB162 のドライバのデスクリプタだけを ベンダークラスに 変更したファームウェアを作って、普通に使えるか確認してみた。多少怪しいところがあるが、usb_bulk_read()/usb_bulk_write() でちゃんと送受信できた。

usb_detach_kernel_driver_np() を使ってドライバを解放すると、
(変更しない)AVRCDC や USB162 そのものでも送受信できる。

しかし... usb_bulk_read()/usb_bulk_write()を使った制御は、遅かった。カーネルドライバだと、複数の要求を submit して非同期に処理することができたが、libusb だと同期型になるので遅い。
性能は、2.4 オリジナル CDC ドライバ並かそれ以下 ... 処理の内容を考えてみれば当然かも知れない。

CDC のようには使えるが、非同期での処理が出来ない。スレッドを使えば read と write を非同期でできるのかも知れないのだが、複数の read , 複数の write 要求を同時に出すことは難しいのではないかと思える。

結論

性能を求めるなら、専用のドライバを用意するのが一番だろう。普通そこまでやれないので、チューニングした CDC ドライバを使うのが次善だと思う。USB ならではの便利な機能はあきらめるしかない。

しかし、性能が必要なければ、CDC ベースのファームウェアのデスクリプタだけ変えて、ベンダークラスにすることで、装置の判別や その他付加機能を簡単に付けることができる。

USBasp 流に、バルクエンドポイントをなくしてしまって、usb_control_msg()だけで制御するのも簡単で良いかも知れない。


ただ、HID を汎用に使うのは、すごく面倒。本来の目的どおりボタンを作ったり、キーボード・マウスを作るのでなければ、無理して HID を使う必要はないと思う。


(補足)この記事の最初の版は、自分でも何が書いてあるかわからないぐらいひどかったので、書き直しました。
posted by すz at 21:25| Comment(3) | TrackBack(0) | 日記

AVR Studio4 SP2 と新デバイス

ATtiny43Uが気になって.. 調べてたら AVR Studio4 SP2 が 12月に出ているのを知ったので早速インストールしてみた。

で、Program Files/Atmel/AVR Tools/Partdescriptionfiles を見てみたら ... ATtiny43U.xml とか ATtiny48.xml があった。よくよく見ると avr-libc-1.4.7の include/avr にもかなりの数の新デバイスが定義されている。

ATtiny43U:

xml の PINアサインを見てみると ATtiny43U は ATtiny461 とほぼ同じ。

avr-libc のヘッダの _vect を比べてみると、番号がずれていて数が減っている。INT1 も削られているし、PCINT も 2個→ 1個になっている。TIMER0_CAPT もないし、TIMER1_COMPD もない。それ以外には、 ADC の定義が減っている。

ATtiny461 の機能を削減した廉価版らしい。

ATtiny48:

ATtiny28 の機能拡張版というより、ATmega48 の機能縮小版のような感じ。

SPI,TWI,ADC はあるのだが、USART がない。TIMER2 がない。あと PCINT3 もなくなっている。

Tinyシリーズだから当然 乗算命令もないはずだ。


微妙に機能削減したチップが出るのは、オリジナルの ATtiny26系 、ATmega8系 の2つの系統に人気があるということだろう。

ただ、電子工作でそういうチップを使いたいとは思わない。
...というわけでこれらのチップへの興味はなくなってしまった。

ついでなので書いておくと、ATmega48/88/168 シリーズに加えて ATmega48P/88P/168P/328P シリーズというのが出ている。avr-libc のヘッダを比較したら BODS/BODSE というのがMCUCR に追加されているだけのようだ。機能が増えたというより、328P があるというのがメリットか。
posted by すz at 19:30| Comment(0) | TrackBack(0) | 日記

2007年12月18日

gcc-3.4.6 にデバイスを追加するには

AT90USB162 を使うために gcc-4.2 にあげてみたのだが、どうもおかしい。さらに ATtiny861とか USB910 も動かなくなってしまった。

しょうがないので、gcc-3.4.6 にデバイスを追加することにした。

準備)

前提として、binutils-2.18 を使うことにするので先にインストールしておく必要がある。

また、avr-libc-1.4.7 を使う。avr-libc でサポートされていないデバイスまで gcc に組み込むと 面倒なので、サポートされていることを確認しておく。

gcc へのデバイス追加)

gcc にデバイスを追加するには、gcc/config/avr の avr.c , avr.h t-avr の3つのファイルを編集する。基本的には他のデバイスのマネをすればよい。

avr.c :

○ avr_mcu_types にデバイスを追加する。デバイス名とデバイスの define は、avr-libc と一致させる必要がある。

ATtiny は、ARCHタイプ 2 にする。ATmega は普通 4 or 5 。8KB を超えるものは、5 を使う。

ちなみに、gcc-4.X では ARCHタイプ 25 が追加されている。このARCHタイプ は、新しいATtinyシリーズのように movw があるものに使用する。

ARCHタイプ3は、乗算命令がないが、8KBを超えるものに使用する。AT90USB162 はこれに該当。


8KB を超えると RCALL/RJMP命令が届かない場合が出てくる。同一ファイルにない関数呼び出しは、CALL命令を使用しなけばならないので、ARCH2 と ARCH3 , ARCH4 と ARCH5 の違いが必要。

AT90USB162 用に本当は、ARCH35が欲しいところだが、ないものは仕方がないので、ARCH3 にするわけだ。

avr.h :

○ LINK_SPEC にデバイスを追加する。-m avr1 〜 -m avr5 のどれかに追加し、さらに ATmega や AT90USB , AT90PWM などは、-Tdata =0x800100 のところにも追加する必要がある。

○ CRT_BINUTILS_SPECS に crtXXX.o の名前を追加する。適当に付けてはいけない。必ず avr-libc と同じ名前を付けること。

t-avr :

○ MULTILIB_MATCHES にデバイス名を追加する。


avr-libc-1.4.7の変更)

実は、at90usb162 , at90usb82 の定義が間違っている。乗算命令を持っていないので、avr5 ではなく avr3にしなくてはならない。

(当然だが)まず、avr5 → avr3 に変更した gcc をインストールしてから、次の変更をした avr-libc をビルドしなければならない。

○ at90usb162 と at90usb82 を avr/lib/avr5 から avr/lib/avr3 に移動した上で、avr/lib/avr5 , avr/lib/avr3 の Makefile.* および at90usb162 と at90usb82 の Makefile.* を書き換える必要がある。

○ さらに、configure.ac , configure も avr5 → avr3 の変更が必要。


この問題は、WinAVR-20070525 でも存在する。at90usb162 で期待どおりに動かない場合、乗算命令を使っている可能性がある。
生成した xxx.elf ファイルに対して、avr-objdump -d でアセンブルリストを作成し、mul を grep することでチェックすべし。


おまけ)

参考までにパッチを提示しておく。このパッチはあくまで参考。動作確認もできていないし、デバイスも適当に選択している。

gcc-3_4_6-avr-new-devs2.patch
avr-libc-1.4.7-usb162.patch
注)ディレクトリを移動したので patch のサイズが大きくなっている。パッチを当てた上で avr5 のもとの Makefile.* と比較すると変更点が分かる。


おまけ2)

WinAVR-20070525 で at90usb162 を正しく コンパイルするには、コンパイルのオプションを次のように変更する。ただし、リンクは、-mmcu=at90usb162 のまま変更しない。


-mmcu=at90usb162

-mmcu=avr3 -D__AVR_AT90USB162__


乗算命令を使用しているライブラリを使わないことが前提なので注意。

なお、WinAVR プロジェクトには、このバグについて だいぶ前に報告されている。次のリリースでは修正されると思う。


追記:WinAVR と同じ gcc を作るには

WinAVR は、ソースを管理しているのではなく、パッチを管理している。CVS から取らなくても ブラウズしてちまちま取ってくれば OK 。ちなみに、00/10/11 は WinAVR 固有なので、Linux では必要ない。


おまけ: WinAVR (gcc-4.1.2) の at90usb82/162 を avr4/avr5 → avr3 に変更するパッチ。
99-gcc-4.1.2-usb162.patch


おわりに

これで、WinAVR ベースの gcc-4.1.2 と 独自拡張の gcc-3.4.6 で USB910 TypeA (attiny861) , at90usb162 が動くようになった。

3.4.6 のほうを avr-gcc にしてメインに使うつもりだが、4.1.2 も avr-gcc4 で使えるようにしている。avr-libc-1.4.7/binutils-2.18 は共通でよいようだ。

普通は、4.1.2 の方がコードが小さくなるし、特に ATtiny で MOVW 命令を使ってくれるので高速なはずだ。でも、コードによってサイズが大きくなる場合がある。USB910 TypeB (ATtiny44) は、4.1.2 ではサイズがオーバしてビルドできない。というわけで両方のバージョンを使える環境が欲しかったのだ。

ちなみに、CVS から取ってきた WinAVR ベースの 4.2.2 はまだダメ。新しいチップに対応する必要があるなら、4.2.2へのパッチと上記を参考にして 4.1.2 に追加していくほうが良いと思う。


パッチを見ていると、ATtiny43U とか 知らないチップ名がいくつか見える。ひょっとしたら、新しい WinAVR が出る前に使いたくなるかも...
posted by すz at 00:22| Comment(0) | TrackBack(0) | 日記

2007年12月03日

USB ミニBコネクタ

ちょっと思い立って、FT232RL のボードを作ってみた。

写真:


アイテムラボの変換基板を使い、FT232RL と 10uF のコンデンサ 2 個、それに USBミニBコネクタを載せて、それだけで使えるようにしてみた。

苦労したのは、ミニBコネクタ周り



0.65 mm ピッチで、自分の技量ではケーブルをハンダ付けできそうにない。しょうがないので、1,3,5 pin を立てて みたら、うまくハンダ付けできた。

ピンの接続は

1 VBUS
2 D-
3 D+
4 NC
5 GND


浮かした 1,3,5 pin は外れても 直せるが、2 pin は難しいのでしっかり付ける必要がある。ちなみに、下に見えている黄色いのは、絶縁に使ったポリミドテーブ。熱を加えないので耐熱である必要はないのだが、持っているので使ってみた。
ちなみに、ポリミドテープは、 例えば 電子電気店で入手可能。
(本題とは関係ないが 電子電気店は意外にも、電子部品セットが充実している。抵抗セット、セラミックコンデンサセットあたりはお勧め。)

使ったミニBコネクタは、モレックス製だが、秋月で ヒロセ電気製が 3 個 200円で 入手可能


後記

一応作ってみたが、FT232RL を使う場合は、秋月のFT232RL USBシリアル変換モジュール 950円の方が良いかも知れない。
posted by すz at 19:29| Comment(0) | TrackBack(0) | 日記

2007年11月20日

オーディオ帯域オシロ(その3)

安価なヘッドセット用のUSBオーディオアダプタは、CM109とかを使っていてマイク入力しかなく、2ch 同時に取り込むことはできないようだ。

やはり、PCM2904/6 で自作というのが良いようだ。...といっても直流付近は扱えない。

いっそのこと、AT91SAM7S に 好きな ADC つなげて 2ch 同時に取り込みとかできないかググッたところ、ARM MP3/AAC Player - www.mikrocontroller.netなんてページを見つけた。

これは、MP3プレイヤーだが、AUDIO DAC として、TLV320AIC23Bを使っている。デジキーでも扱っていて、745円と安価なようだ。

データシートを見てみると、24bit 96kHz ステレオ DAC 以外に、24 bit 96kHz ステレオ ADC も持っている。デジタルのHPFは入っていないように思える。ひょっとしてどこかに書いてあるのかも知れないし、常識化していて書くまでもないことになっているのかも知れないとも思うが、直流が扱えると嬉しい。
後記:
ADC high-pass fileter に関する(親切な)説明はないが、Digital Audio Path Control レジスタの ADCHP で disable にできるようだ。

AT91SAM7SやAT32UC3B(AT91SAM7S の AVR32版(概要、日本語pdf))と組み合わせて MP3Player とか 高機能なUSBオーディオアダプタ=オーディオ帯域オシロを作るのも面白いかも知れない。

といっても、このクラスはお手軽にというわけにはいかないし、このブログでは扱わないのだ。でも、せっかく調べたので、報告ということで。

(後記)
TLV320AIC23Bは、HPF を Off にでき、普通のADC のように使えるかもしれないということで、がぜん気に入ってしまった。
0.65 mm ピッチの 28-TSSOPなので、安価な変換基板で DIPにもでき扱い易いし、安価。

さて、普通は、32bit のプロセッサで扱うものだと思うが、フル機能でなくても良いから AVR でお手軽に扱えないだろうか。

コントロールは、Port ベースの I2C (or SPI)で扱えるので問題ない。
TLV320AIC23Bは、master/slave 両方できる。ADC の場合は、同期が一度とれてしまえば、バイト単位で受信するだけでよい SPI スレーブを使うのが良いかもしれない。(CPUCLOCK > BCLK x 4 に注意)

SPI を持っているATmega88 系+FT245RLでなんとかなるかも知れない。

(後記2)

TLV320AIC23Bは、4種類のフォーマットを扱える。I2S もあるが、DSP モードというのがある。そして、DSP モードは、SPI そのものに思える。SPIスレーブで ADC データを受信するのは楽そうなのだが、DAC は無理。SPI マスターの方で実装すれば、DAC も扱えそう。

FT245RL で使うことを想定すると、ATtiny2313 では pin 数が足りないので、ATmega88 を使うことにする。クロックは一応 12MHz 水晶として検討してみる。

TLV320AIC23Bは、外部クロックも受け付けるので、ATmega88 の CLKOUT を 使う。同じクロックソースにすれば、タイミングを完全に合わせられる。TLV320IAIC23B は、クロック 12MHz or 24MHz のとき、USB モードというのを使用する。タイミングは、48ksps = 250clock , 44.1ksps = 272 clock。

SPI は CPUCLOCK/4 の 3MHz にすると、48ksps = 62.5 clock 。16bit x 2 でも 24bit x 2 でも 間に合う計算になる。AVR の処理も 24 clock で 1 バイトの処理をすればよいので、間に合うと思う。間に合わなければ 24MHz にすれば大丈夫だし、間に合えば 24MHz で 96ksps も OKということになる。

以上は、AVR 側の話。FT245RL がデータを切らさずに送受信できるかどうかというのは別になる。96ksps で 24bitx2 だと、ADC だけでも 567kbyte/sec 出せないといけない。仮想COMポートは無理だと思う。48ksps で 16bit x 2 なら 192 kbyte/sec で仮想COMポートでもいけるのではないかと思う。

(後記3)

基準電圧は、AVDD で決まる。AVDD/2 が仮想グラウンドになるし、3.3V のとき 入出力ともフルスイングで 1.0Vrms = 2.828 Vp-p だそうだ。
LINEIN は、内部に 32段階のプログラマブルゲインアンプがあり、+12.0db 〜 -34.5 db まで -1.5db 刻み。(デフォルトは 0db)

ブロック図をみるかぎり、AVDDは、基準電圧を決めているだけのように見える。2.7V〜3.6V ということになっているが、TL431を使った2.5Vでも良いのではないだろうか? キャリブレーションにも使えるし。ちなみに、どうせならTL431の高精度版? LT1009CLPとか使ったらどうだろう。
電源をどうするのが良いかついては、やはりよくわからない。Ultra Low-Noise とうたっている 2.85V レギュレータ SI91841DT-285でアナログ系全部供給した方が良いかも知れないし、すなおに 3.3V レギュレータ MCP1700-3302Eとかで全電源供給して、AVDD だけ LC フィルタ入れるだけでも良いのかも知れない。

(後記4)
ひょっとしたら、FT232RL + ATtiny2313でも扱えるかも知れない。pin の数は足りると思し、処理自体は単純だから 2K に入るかも知れない。USIで取り込みUSARTに直接書き込む処理を割り込み禁止で回せば、48ksps 16bit x 2 なら間に合うかも知れない。間に合わなければ 32ksps とかサンプリングレートを落とせばよいだろう。

FT232RL は、3Mbps に設定するが、その速度でコマンド処理はできないので、コマンドは、2バイトまでにしてハンドシェークする。このあたりは、AVR910とかと同じ考えで良さそう。送信は、3Mbps でほとんど連続して送ることになるはず。FT232RL 側でそれができないと難しいかも知れない。

(後記5)
できたら、AT90USB162 を使ったものを作りたいと思っているのだが、その前に ...FT245RL + ATmega48 で実験してみたいと思っている。SPI マスターにする場合、SPI より USART で代替したほうが性能が出せるのではないかという気がしている。それを実験してみたい。うまくいくなら、SERJTAG も作り直したい。
posted by すz at 19:29| Comment(4) | TrackBack(0) | 日記

2007年11月12日

オーディオ帯域オシロ(その2)

とりあえず、近所のPCパーツ屋を扱っている店で エレコムの USB-SAV51 を買ってみた。(それしかなかったので) 。買って気が付いたのだが、マイク入力しかないから ADC は 1ch のみ。

Windows XP では何の問題もなく使えそうだ。Linux は微妙。2.4.31 では、Mixer が使えないっぽいし、前に使ったプログラムで出力してみると 1ch でしか 出力できない。(ioctl がエラーになる。)。入力はプログラムも持っていないので、これから。

さて、どんな回路でどんなICなのか調査。

VID/PID 0x0d8c/0x000c -- C-Media CM109 だった。データシート(pdf)

マイク入力周りはこんな回路。



1.0uF を介して、マイク入力端子に直接接続されている。内部で +20db(10倍) のアンプを通りさらに +22.5〜0db(16ステップ)のPGAを通って 16bit ADC(44kHz/44.1kHz サンプリング)に接続される。
VREF は、2.25V となっている。VREF が ADCの基準電圧そのものかどうか分からないが、そうだとすれば、入力範囲は最大で 0.225V P-P 最小なら 16.8 mV P-P ということになる。

出力の方は、220uF のコンデンサを通して、ヘッドホーン出力に接続されていた。外付けアンプ用に VREF をボルテージフォワードした出力 LOBS もある。これを 仮想グラウンドにしてアンプを接続すればよいらしい。

入力特性もデータシートにある。マイク入力用にチューニングされているのかフラットではない。微妙に右肩上がり。HPF が入っているらしく、200 Hz 以下になると だんだん落ちて 25Hz あたりで -3db になる。

とりあえず波形がどんな形なのか見るだけなら、これでも十分かも知れない。

ところで、データシートを見ていたら、CM109は結構いろいろな機能を持っていることに気が付いた。ひとつは、I2C スレーブ機能。I2C マスター機能があるコントローラと、CM109 (+USBホスト)間で通信できる。あと 5x4 のキーバッド。興味を引いたが単品では入手できそうにないし、0.5mm ピッチなので、ピンを引き出すのも面倒 -- とりあえず使ってみるのはあきらめる。ただプロトコルの参考にはなるかも知れない。
posted by すz at 16:30| Comment(0) | TrackBack(0) | 日記

2007年11月09日

PCM2906 オーディオ帯域オシロ

電波時計や各種センサなどアナログ系の電子工作をしていると、波形を見たくなる。AVR は 8 bit なら 80kHz でサンプリングできて波形入力は精度が低いものの一応できるのだが、それを外部に出力するとなるとメモリが少なかったりして面倒なことになる。そのうえソフトも自分で作らないといけないという問題がある。

PCのオーディオ入力を使うと、ハンディ・オシロスコープをはじめとするソフトが使え、高精度でしかも 2ch 同時サンプリングができる。
安くなった ヘッドセット用のUSBオーディオデバイス( HAMU02とか)を使ってマイク入力の部分を改造して、測定用に使えるものにできるかも知れない。

ただどんなチップを使いどんな回路になっているか分からないので、いっそのこと 1000円前後で手にはいる USB オーディオチップを使って自作を考えてみようと思う。

PCM2906/PCM2904 は、デジキーで入手可能。 S/PDIF は使わないので、PCM2904 でも OK。0.65 mm ピッチだが、変換基板がアイテムラボ秋月で入手できるから、手配線でもなんとかなりそうだ。

データシートを見てみると、基準電圧そのものはないようだ。その代わり、内部で使用している仮想グラウンドが出力されていて(VCOM)、ADC/DAC の電源を分離できるようになっている(VCCCI: 3.3V?レギュレータ出力なので、それ以上の電圧を入力する)。

入力範囲は、1/2 VCCCI(= VCOM) を中心にして、± 0.3 x VCCCI 。VCCCI = 3.6V とすれば、± 1.08V 。反転増幅器を使い、たとえばゲインを 1/5 にすれば VCOM を中心に ± 5.4V が入力できるから、-3.6V〜7.2Vが入力範囲。 そのときの分解能は、0.165 mV これがこのまま精度というわけではないが、ゲイン切り替えを付けなくても十分だと思う。また、交流結合のコンデンサは外して、直流結合にする。
ちなみに、反転増幅器が1つのみだと、反転された値が PC への入力になる。その上 VCOM 分 オフセットされているので注意。
後記:IC内部にHPFが内蔵されていて、直流成分はカットされるとのこと。交流結合のコンデンサは外す意味はない。入力オペアンプの入力にも交流結合のコンデンサを入れて単に 10.8V P-P としたほうが良いかもしれない。

ぐぐって参考になりそうな自作例も発見できた。→ PCM2906, USBオーディオ(2) LPFの効果

この回路から、まず DAC 部分は全部外してしまう。

LPF が必要になった理由はアナログ電源のような気がする。データシートのサンプル回路では、VCOM に 10uF を入れることになっているが、なにも入っていない。VCCCI の方も 10uF と書いてあるが、1uF になっている。

VCCCI に入るアナログ電源部分は、PQ20RX11を使ったらどうか。低ドロップ型なので、3.8V まで上げても問題ないし、電流を流せる。温度特性は、25℃→75℃で 基準電圧が -5mV ぐらい下がる(-1.3%)。あと USB 側にある LCフィルタを VCCCI 側に移動したら良いのではないか。


回路図案(一部)


ここまで考察してきて、 HAMU02とかの回路がどうなっているか気になってきた。PCM2904そのものを使っていたとしてもおかしくない。違うチップだとしても DAC 側にオペアンプが入っていれば、VCOM 相当はあるはず。だとすれば、入力側に反転増幅器を入れるのも難しくないように思う。
posted by すz at 18:49| Comment(2) | TrackBack(0) | 日記

2007年11月05日

電波時計

いまのところアイディアのみ。

PSoCをつかったワンチップ電波時計の製作なんてものがある。なるほど PSoC を使えば ほとんど外付け回路なしで作れるのかも知れない。

では、AVR で、できるだけ外付け回路なしで済ませるには、どうしたらよいのだろうと考えてみた。

PC用では、Soft66 なる ソフトラジオがある。CQ出版の付録にも付いたので知っている人もいるだろう。それをまねすることを考える。



アナログスイッチで アンテナ出力を 39 kHz の周波数で、IN/VGND , VGND/IN になるよう切り替える。2つの出力を 差動入力 ADC で受けると... IN / -IN が入力になる。この入力は 40kHz (+ 38kHz)を 1kHz に周波数変換したものになっている。差動入力なので、ATtiny861 なら ゲインも一応 4 段階に切り替えられる。

5 kHz ぐらいで データを取り込んでデジタル処理してやれば、電波時計の 1/0 の信号ぐらいはなんとかなるに違いない。
ちなみに、オペアンプを2個追加して、ATmega88を使うという手もある。1 個は 差動増幅器。もう一個は ゲイン切り替えつき増幅に使う。ゲインの切り替えはあまった 4066 で 4段階が可能。
例:

追記:
この差動増幅器は万能ではない。他の回路で使う場合は、電子回路の豆知識がわかりやすいので参照のこと。

Soft66 では、RFアンプがなく、アンテナ入力を直接アナログスイッチに入力している。高周波の増幅をしないで、オペアンプだけで済ますというのが Soft66 のキモのひとつではあるが、はたしてこれで大丈夫なのか?という不安がある。ただ、アンプを付ければ済む話なので、ダメと分かってから考えればよいだろう。

アナログスイッチの ON抵抗は、ものによって違うが 200〜300 Ωほどである。これが 初段のアンプの入力についていると思えばよい。
増幅率は、5.1K/(200〜300) なので、17〜25倍程度。この程度で十分なのか?という疑問もある。PC の 16bit とか 24bit の ADC ならば、ダイナミックレンジが広いので問題ないのかも知れない。ATtiny861 だと x8,x20,x32 の増幅が内部でできるのでたぶん大丈夫だとは思うが、5.1kHz を 10kΩとかにした方がよいかもしれない。これだと cut-off 周波数も 1kHz になる。

あと、これがうまくいくようであれば、AM ラジオにも応用可能だと思う。PWM で 1MHz 前後の周波数は精度は悪いが発振できる。そして、どれぐらいずれているか分かっているので、デジタル処理の方で補正できる。ただ、40kHz に変換するとしても、それを AVR でデジタル処理をするのは相当に厳しそう。

後記:

こういう電子工作をしていると、オシロスコープで波形を見たくなる。PC の オーディオ入力を利用したものはないかと思い、ぐぐってみたらHandyOscillo というのがあることがわかった。... →PCM2906 オーディオ帯域オシロに移動
posted by すz at 23:40| Comment(0) | TrackBack(0) | 日記

セリア充電器

近所にセリアがオープンしているのを発見したので、電気・電池コーナを物色してきた。有名なセリア充電器を発見したので、3つばかり購入。もちろんこんな怪しげなものを実用として使うつもりはまったくない。

まずは、1つ分解。回路図はつぎのようなもの



これが開放電圧 約 AC 4.3V のトランスに接続されているだけ。
ダイオード1つで半波整流して電流制限の抵抗がはいるだけ。面白いのは、もうひとつの電池は、逆に接続していること。それはともかく、こんなしょぼい回路では、過充電が怖い。
追記:
過放電してしまった電池は高速充電器では充電できないときがある。そういうときにこれでちょっと充電してやると高速充電器にかかるらしい。こんなものでも 役に立つ状況はあるものだ。

実用として使わずに何に使うかというと、充電器用 電池ケースとして使うつもり。上半分を別のケースにマウントして、高機能の 充放電器を作るのだ。

回路案として2つ考えてみた。

案1)2つの電池を別々に制御する充放電器。



上の回路を 2 つ作り、AREF にちゃんとした基準電圧を入れる。全部で 9 pin 必要。ATtiny44 なら 2pin あまるので、I2C スレーブを付けられる。ATtiny861 なら、6 pin あまるので、USB 制御ができる(clock 2 + USB 2)。あまった 2pin は、LED か、温度センサに使えばよいだろう。温度センサを使う場合は、サーミスタを使い、電池のー側の電極を付けているハンダあたりに貼り付ける。

Pch の FET には、FDS4675か、デュアルのFDS4935を使い、Nch の FET には、uPA2753GRを使う。
22uH の インダクタは、TSL0709S-220Kを使う予定。これは、86mΩ 定格電流 1.3A(飽和するのは 1.4A)。最大 1.4A。充電電流は 1/2 の最大 700mAまでしか流せないことになる。

ON してから 最大の 1.4A になる時間は、(内部抵抗を無視すると)
 i = Vt/L 
 の関係を使って、1.4 * 22 / ( 5 - 1.2) で 8.1 uS 。出力電圧は ON Duty 比で決まるらしいので、ON 1.2 : ON+OFF 5 、8MHz として ON 時間 65clock , ON+Off 時間 270 clock を目安にして設計する。電流を減らす場合は、ON 時間固定で Off 時間を長くする。

案2)1系統しかないかわり高機能な充放電器

上の回路は、1セル急速充放電ができるだけのものだが、3セルのNiMHを充放電したいのと、デサルフェータ機能 or バルス充電機能を付けてみたいので、こんな回路を考えてみた。
鉛バッテリーではないので、サルフェーションそのものはあり得ない。デサルフェータ機能というのは変。リフレッシュ機能というべきなのか? ただ、普通リフレッシュ機能というのは、深放電する放電機能のことらしいのでややこしい。

ちなみに、ニッカド電池にメモリ効果というものがあり、これは復活できないらしい。NiMH の場合は、深放電と充電を繰り返せば普通復活するので、ニッカド電池とおなじ意味のメモリ効果はない。
ここでいうデサルフェータ機能とは、10kHz ぐらいの高い周波数で充電と放電を繰り返すもので、サルフェーションで弱った鉛バッテリーを復活させるには有効らしい。NiMH でも同じことをすれば、復活できるかも知れないので試しに作ろうとしているもの。効果があるかどうかは、作って試すのだ。



デサルフェータとして使う場合は、電源供給を Off にして、昇圧回路を動かす。電池から電源を供給して、昇圧して返す。パルス充電の場合は、電源も供給して、昇圧回路の 周波数を上げる。 B-C 間の電流(と向き)を測定すれば、うまく制御できるのではないかと思う。放電機能は、電池側に移動し、負荷抵抗も外付けにしようと思う。

820uH は、手持ちの LHL10TB821K を使おうと思う。これは以前 現品.com で入手したもので、1.4Ω 定格電流 420 mA 。昇圧回路を動かさずに普通に充電するときは、420mAまでにしなければならない。
ちなみに LHLC 10NB 102J は、1mH / 1.8Ω / 480mA になっているので、こちらの方がよいかも知れない。

パルス側のPWM は、最大 ON 時間 1.4 * 22 / 5 = 6.16 uS ( 49 clock) を目安にする。電流を流したければ、ON 時間固定で Off 時間を短くする。ただし ON Duty は 6/7 ぐらいまで。
パルスをどのように制御しようが、流れこんだ電流は出て行くので、パルス側の出力が低ければ上の L を通って電池に流れる。パルス側の出力が上がりすぎれば、逆に上のLを通って電池から流れ込んでくるはず。充電しているときにそうなってしまうのはやりすぎだが、B-C 間の電圧と向きで制御すればよいのだろう。

ちなみに電圧のセンスは、ADC に直接接続せずに、抵抗で分圧したものを入力する。3セルで精度良く測定したいというのも理由だが、パルス充電中に 電池がはずれたときの保護も理由。
posted by すz at 15:11| Comment(2) | TrackBack(0) | 日記

2007年10月31日

ATtiny861,ATtiny44 が買える店

USB910A/B で使用している ATtiny861,ATtiny44 が買える店を紹介しておこうと思う。

マルツパーツ館WepShop ATtiny44(DIP) 388円

マイクロファン ネットショップ ATtiny861/861V(DIP) 420円

残念ながら、この両方を扱っているところは国内では、なさそうだ。(07/11現在)


もちろん デジキーでは、両方扱っている。ATtiny44(DIP) 261円、ATtiny861/861V(DIP) 376円 (07/11)。
ただし、送料・手数料が高いので 注意
posted by すz at 13:00| Comment(0) | TrackBack(0) | 日記

2007年10月17日

作ってみたい装置(その2)

以前、作ってみようと思っている装置という記事を書いたが、今回はちょっと弱く作ってみたい装置。作らないかも知れないので、ネタとして紹介。

(1) USB制御 ファンコン

センサ付きのファンの制御をするもの。あまり有用ではないかも知れないが、簡単そうなので作ってみるのも面白いかも知れない。

以下メモ

センサの出力について
センサの出力は、ただのオープンコレクタ出力らしい。プルアップすることで、デジタル入力できる。注意する点としては、1回転に付き 2回の ON/OFF になること。

PWM 制御について
DCブラシレスファンは、内部に回路があって制御しているので、単純な PWM 制御ではダメ。降圧型 DC/DC コンバータにしなければならない。といっても、回転数でフィードバックをかけるので、電圧センスなどは必要ない。スイッチングは、500mA ぐらい流せる PNP トランジスタを使い、インダクタには、LHLZ06NB 100uH 0.56Aあたりを使うのが良いのではないかと思う。

制御について
温度計とペアにして、温度によって回転数を制御するものにしたい。で、USB でパラメータ設定と、温度、回転数のセンスができるようにする。複数のファンを制御したいところだが、ATtiny861 を使うとして、2ch ぐらいが妥当かも知れない。温度センサは、カモン MB用温度センサ OND-S(千石で 263円)を使えるようにすると装着が楽になりそう。ちなみにこれの素子は、石塚電子 103JT-025(千石で 137円)と同じJTサーミスタではないかと思う。自分で加工するなら、特性のはっきりした(25℃で 10.0KΩ・85℃で1.451KΩ B定数3435K)こちらを使ったほうが良いかも知れない。

OND-S:

103JT-050:(自分で加工したもの)


ところで、サーミスタは 抵抗値を測定して logを取るなど面倒な計算をしないと正しい温度は得られないらしい。ただ、近似値でよいなら、サーミスタの使い方2の通りにやれば四則演算だけでなんとかなるらしい。... と思ったのだが、1つの直線で近似するのは無理がありそう。すなおに、R/(R + Rth) の値と 温度の対応表を作り、N 個の直線で近似したほうが良さそうに思える。ちなみに、対応表はデータシートに載っているが、B定数を元に計算することもできる。


おまけ:サーミスタの温度計測方法について
石塚電子 103JT 用(たぶん カモン MB用温度センサ OND-Sも同じ)

1) 次の回路で分圧比を測定する。分圧比を測定するだけなので、VCC=Vref で十分。


2) 次の式を使って、作った表にもとづいて 温度に変換。
1/32, 2/32 , 30/32の分圧比と温度のグラフができるので、1/32 〜 30/32 の範囲の値は、それぞれの区間で線形補完する。(0〜1/32, 30/32〜1の範囲は変換できない。)
#include <math.h>
#include <stdio.h>
#define RES 32
#define R10K (10000.0)
main() {
int i;
double r1,r2,t1,t2,b;

r1 = 10000.0;
t1 = 25.0 + 273.15;
for (i=1; i<(RES-1); i++) {
if (i < RES/2)
b = 3238.6;
else
b = 3435.4;
r2 = R10K * RES/i - R10K;
t2 = 1.0 / ( (log(r2) - log(r1)) / b + 1/t1 );
printf("%4.3f %10.4f\n"
,1.0 /RES * i, t2 - 273.15);
}
}


上の計算式で作成した値とデータシートにある実測値のグラフ


注意とコメント)
上のグラフは、B定数を2つ使用している。25℃以上は 25℃,85℃のデータから作成したB定数。25℃以下は、-40℃,25℃から作成したB定数。B定数の算出は次のプログラムを使った。
#include <math.h>
#include <stdio.h>
main() {
double r1,r2,t1,t2,b;

t1 = -40.0 + 273.15;
t2 = 25.0 + 273.15;
r1 = 204.7 * 1000;
r2 = 10.0 * 1000.0;
b = (log(r2) - log(r1)) / ( 1/t2 - 1/t1);
printf("b = %10.4f\n",b);
}


注意点:
10K の抵抗値はできるだけ精度を良くして、25℃のとき 0.5 になるようにすること。抵抗の値を精度良く測定できるなら、その値をもとに表を作り直しても良い。
校正方法案:
もし、カモン OND-SのB定数が全然違うならたとえば次のようにする。0 ℃と 100℃の サーミスタ抵抗値と(室温での)10Kの分圧測定用抵抗を同じテスターで測定する。次に その2つの値からB定数を算出して、最初のプログラムの t1,r1,b,R10Kを差し替えて表を作り直す。

校正方法案2:
25℃前後の室温と100℃の2点の方が使用範囲での精度が良いと思えるので、信頼できる温度計を1つ用意して、室温と抵抗値を測定する。そしてこの2点だけで、全部のパラメータを決める。
基準にする温度計については、DE-20W 500円が安価でお勧め(低消費電力タイプは反応がすごく悪いので、実験用には高速応答タイプがおすすめ)。100℃の方は、沸騰したお湯に付けて 抵抗値を測定する。ただ 正確に100℃なのかどうか分からない。ちなみに DE-20Wは 99.8 ℃を示した。

誤差について

上のグラフは、B定数 3400K(0℃,90℃)赤, 3435K(25℃,85℃)緑,3238K(-40℃,25℃)青 で近似したときの実測値との差。2つのB定数を使った最初のグラフは、青と緑を 0.5 で切り替えている。全域で±1℃には入りそうだが そんなに高い精度ではないようだ。赤は、0℃,100℃で校正したらどのようになりそうか見るために作成した。-20 ℃以下を除けば一応±1℃に入っているようだが、校正したとしても、これ以上精度を上げるのは難しいようだ。

(2) USB 電力計

サンワ ワットチェッカー TAP-TST5 というのが商品として有名で、そんなに高いものではない(5−7千円) 。それを買えばよいのだが、高機能(多チャンネル、PC との通信)なものを作ってみるのも良さそう。
(技術資料)交流電流センサの基本コンセプトをみると、交流電流センサはすごい簡単な構造だとわかる。復活した 現品.com にも 非接触 電流検出ユニットとして単価 70円で売っているし、適当なノイズフィルタ用のコアで自作することすらできそうだ。ただし注意点がある。(技術資料)交流電流センサ解説1(出力特性図の見方)にあるように、飽和領域と微小電流領域で直線性が悪くなること。特にフェライトコアを使った場合、微小電流は測定できないと思ったほうが良さそう。
自作するにせよ、現品.com のを使うにせよ 出力特性など判らないから、カットアンドトライで調整しないといけない。そのこと自体を楽しみとできないと、まともなものを作ることは厳しそうだ。
あと、出力も交流なので、交流電圧を測定するための回路も必要だ。50-60Hz と周波数が低いので、オペアンプを使った 絶対値回路か理想ダイオードで整流し、RC フィルタを通して ADコンバータに入力すればよさそうだ。
回路案:

回路図で説明してみることにする。理想ダイオードはダイオードが2つ入っている中央のブロック。低周波数ならリニアな半波整流をしてくれる。(参考:電子回路の豆知識)2段目のブロックは反転した出力をさらに反転させるためのもの(なんとなく入れてみたけど増幅しないなら必要ない)、最後にRCフィルタを通して差動入力のADCで受ける。こんな感じでよいのではないかと思う。オペアンプは、たぶん何でも良い。RC フィルタは 1Hz とかの cut-off で良いと思う。R1 は現物にあわせで決めるしかない。

この回路あまり良くないかも知れない。まず、センサ入力の片側が仮想GNDになっているが、GND にして、R2の手前にコンデンサを入れて交流結合にしたほうが良さそう。あと、入力は微分したものなので、積分器を入れると良いかも知れないが必要らしい。具体的には、二段目の反転増幅器を一段目の前にもってきて、R5 と並列にコンデンサを入れる。また、R1 の値は小さいほうが良さそうなので、一段目、二段目でゲインをかけたほうが良さそう。

ちなみに、ちゃんとした部品を使うならば、上で紹介した技術資料を載せている U_RD というメーカのものが結局は安いらしい。それでも単価1000円ぐらいで結構高いものだそうだ。
参考:現品.com に出ている 交流電流センサ(らしきもの)07/10/18 現在

 非接触 電圧検出ユニット 単価 70円

 コイル 13.3 x 9.8 x 2.1 単価 50円
(注意)買ってみたがサイズは、もっと大きい -- 厚さ6mm / 直径16 mm 、貫通穴径φ6 、最大幅 24mm ぐらい。

現品.com のコイル↑を試してみた。抵抗を取り付け テスタで 抵抗の AC 電圧を測定してみると、50Ωの場合、11W で 7mV , 100Ωの場合 , 11W で 16 mV という感じだった。
400W では、50Ωのとき 0.25V ぐらい、100Ωのとき 0.30V ぐらいだった。ただし、100Ωのときは飽和している。50Ωのときも飽和しているかもしれない。あまり高い電力の測定はできないようだ。10Ωぐらいまで抵抗値を下げるべきかも知れない。
さらに、機器によっては ワットチェッカーと全然違う低い値になる場合があった。かんがえてみれば、電流の変化(微分したもの)を測定しているだけなので、波形が崩れればそうなるのかも知れない。なかなか奥が深い。

測定用に製作した電源コード:


(3) 温度特性測定用 簡易恒温槽

アナログ系の電子工作をしていると温度特性が気になる。それを調べるために、高温・低温の環境を作りたい。いまのところ安い温冷庫 (これとか)を使えば良いのではないかと思う。ただこの手のものは制御が単純で、保温時のみサーモスタットで 65℃/OFF、50℃/ONの制御をするらしい。そのままでも使えそうに思えるけれど、きめ細やかな制御をして温度を一定に保つようにしてみたい。

(4)鉛バッテリー用 デサルフェーターと放電特性を測定する装置

効果があるかどうかわからない(わからないがゆえに効果を調べてみたい)のだが、劣化した鉛バッテリーの復活させるデサルフェーターという装置があるらしい。(参考:デサルフェーターの作り方The Low Power Desulfator)。これを設計して作ってみたい。効果を調べるには、放電特性も測定しなければならない。回路図をみると、バッテリーから LC フィルタを通してコンデンサに充電し、それを昇圧してバッテリーに戻すようなものらしい。昇圧側はコンデンサで平滑せずダイオードを通すだけにする。LC フィルタを通しているので、高電圧のパルスがバッテリーに出力されても、回路には(パルスが入力されず)定電圧が入力されるというのがミソらしい。 昇圧回路のスイッチングが 555タイマでされているために、ちゃんと調整しないとコイルが飽和して焼けてしまうという問題がある。そのような問題点は電流モード制御をすれば解決する。AVR で作れそうだが、手っ取り早く効果を確認するために、最初は、手持ちの DC/DC コンバータ IC M5291FPを使ってみようかと思う。 コイルに流す電流を制限できるし、周波数もコンデンサひとつで制御できる。そして、うまくいけば、入手性が悪い専用ICを AVR に置き換えて、機能も追加したものを作ってみたいし、NiMH とかにも有効なのか確認してみたい。放電特性を測定すること自体は セメント抵抗+放熱器を使い放電し、USB910A で電圧を計測をすればよいので問題ないが、過放電しないように終端電圧になったら放電をとめる機能は必要だろう。

M5291FP回路案:

上の説明ではイメージが伝わらないので回路例をもとに説明してみることにする。右の部分 100uF を電源としてスイッチングして、昇圧回路を通す。出力にはコンデンサがないので、かなり高圧のパルスが出力される(はず)。そして、右の部分 1000uH と 100uF(25V) で cut-off 周波数 500 Hz ぐらいの LPF になっているので、出力のパルスは入力に入らない。スイッチングには、電流モード制御ができるDC/DCコンバータIC M5291FP を使う。Rsc の電圧降下が 0.3V になると On→Off になる。たとえば 2A のコイルを使うなら Rsc を 0.15 Ωにすればそれだけで On タイムは最適になる。定格が同じなら、違うインダクタンス・性質のコイルでも動作する。Off タイムの調整は、発振周波数で行う。Ct の値によって 周波数を設定できる。10KHz 程度が良いらしいが良くわからない。またこの回路は、12V 専用ではない。24V でも、6V でも使えそうだ。3-4セルの NiMH でも使えるかも知れない。回路図には書いてないが、電圧センス機能は当然あるので、一定電圧以上になるととめる機能は付けられる。(参考ページを見ると、18V以上でとめるみたいな話があるので必要なのかも知れない。それはともかく過放電保護のために一定電圧以下でとめる機能はほしい。だが、これを作るのはちと面倒。)まぁこんな感じなのだが、大問題がある。M5291FP はかつて 現品.com で購入したものだが、入手性がすごく悪い。今どこに売っているかも分からないのだ。電流モード制御の DC/DC コンバータICなら上と同じことはできるはずなので、代替は可能。使ったことはないが、TL3842P とかが使えるのではないかと思う。(デジキーで109円) ただ、この程度の制御は、コンパレータ(と基準となる電圧)とタイマーでできる。AVR で作ることも可能なはずだ。
AVR回路案:

ちょっと説明しづらいので回路図を出すと、Rsc は、トランジスタのエミッタ側に移動させる。トランジスタに流れる電流=ONのときコイルに流れる電流なのでこれでも問題ない。で、コンパレータがONになる回数を割り込みでカウントするようにしておいて、その回数があまり増えないように PWM のパルス幅を調整する。あと、5V のレギューレーターが必要になり部品が増える。

コイルの選択と入手先:
共立エレショップ -- 各種安価なトロイダルコアがある。
千石 -- ラジアルリードのLHLC10NBシリーズが安価
いずれにしても 220uH なら1Aぐらい。2A なんてものは入手が難しいようだ。1A 用に回路設計して、いくつかのコイルを試すのが良いかもしれない。
スイッチングトランジスタの選択について:

注意)この回路例は、説明するために作成したもので動作確認したものではありません。
posted by すz at 20:47| Comment(2) | TrackBack(0) | 日記

2007年07月10日

フランクリン型発振回路

CMOS インバータを使ったフランクリン型発振回路というものがある。ググってもあまりヒットしないので、防忘をかねて紹介してみる。

回路例:

左の回路は、トランジスタ技術 Special増刊 OPアンプによる実用回路設計に載っていたもので、右の回路は、トランジスタ技術 2003年8月号に載っていたものらしい(未確認)。

ほぼ、LC共振回路の共振周波数で発振するので、LC メータとか、電波時計のアンテナ同調とかに使えるのではないかと思う。

また、LC共振回路からきれいな正弦波が出てくるので、バリキャップ(1SV149とか)と組み合わせれば、正弦波用のVCO にもなるのではないかと思う。
追記:ゆきの研究室/つれづれ日記で試してくれました。左の回路はダメで、右の回路はOKだったそうです。

回路案:


これで何を作りたいか

まず作りたいのは、LCメータ。C を測定できるテスターはあるので、温度補償用コンデンサさえあれば、安価に作れるはず。

次に作りたいのは、電波時計のアンテナ。電波時計を自作してみたかったのだが、アンテナを同調するのが面倒なので、手を付けられていなかった。できれば下の回路を使って自動で同調するものが作れたらと考えている。ただし、1SV149 は せいぜい 500 pF ぐらいなので、数十 mH のバーアンテナを自作する必要がある。

あとは、PLL用のVCO。中間タップが必要なく、市販のインダクタが使えるので、コイルを自作しなくて済み再現性の高いものができるかも知れない。
posted by すz at 19:00| Comment(2) | TrackBack(1) | 日記

2007年06月22日

オリジナル基板の検討

つれづれ日記で知ったのだが、国内では、基板PROというところが安いらしい。

いったいどういう風にすれば有効に使えるか検討してみた。

対象とするものは、タカチ SW-55(55x40x20) or テイシン TB-55B(80x50x20) に入る基板。


枚数 1 6 12 30

33 x 47 22,438円 23,245円 28,675円 45,471円
(タカチ SW-55 用)

45 x 75 23,226円 24,061円 29,682円 47,067円
(テイシン TB-55B用)


どうも 6 枚までなら、あまり値段が変わらないようだ。それにしても 1 種類の基板に 趣味で 24000 円も出すのはちょっと高い。

ルータ切り出し(面付け)というのを考えてみる。これは1枚の基板をきってくれるオプション。それぞれの基板が同じものである必要がなく、5 種類 までの基板を一度に作れる。


ルータ切り出し(5面付け)
枚数   1(5) 6(30)

(33x5+4) x 47 30,051円 30,943円
(タカチ SW-55 用)
(45x5+4) x 75 35,721円 36,817円
(テイシン TB-55B用)


ちょっと値段があがるが、5 種 6 枚つづ作れるならこの値段でもいいかなという気がしてくる。

格安なOlimexという選択枝もないわけではない。なにしろ 160mmx100mm(320mmx200mm)で $33($132) + shipping $9 (airmail) 、しかも面付けは無料。
   
DSS(160x100) DSQ(320x200)
(33+1) x 47 8 枚 36 枚
(タカチ SW-55 用)
(45+1) x 75 4 枚 16 枚
(テイシン TB-55B用)


ただ、仕上がりが雑でも良く、気長に待てる必要がある。あとクレジットカードを持っていて海外FAXできる必要もある(決してクレジットカードのIDをメールしてはいけない)。また、枚数が増えるにしたがい値段的なメリットもなくなってくる。
ファックスを持っていなくても、海外ファックスは、ローソンのファックスか、クロネコ@ファックスを使えばよいらしい。

せっかくオリジナル基板を作るなら、仕上げのきれいな 国内で頼みたいところ。問題は、5 種類もつくるべきものがあるか... というところか。

追記:
EzPCB というところもあるらしい。場所は中国。
詳しくは、EzPCBへの基板発注を参照。

オリジナル基板検討つづき

オリジナル基板を5種類作るなら、まず USB910A を作りたい。次に、単体で USBNIX を動かせるものとして、USB910B に I2CROM ソケットを追加したもの。そして、高電圧チップイレーサー(HCERASER) で とりあえず 3種 決まった。

幅というか、Y (高さ)は 47mm に統一して 1/2 C 基板をベースにする。HCERASER は、C 基板サイズになりそうだ。

あと2つはまだ決めていない。幅は 300 mm までなので、C 基板サイズ x 2 でも OK 。複数あっても困らない実用的なもの か 配線が複雑になってしまって手作りが面倒なもの が良い。前者だと いまだ影も形もない 作ってみようと思っている装置その(3) I2C 高機能電源 か。あと、Sim's blog サイキット小液晶... で知った 8x2キャラクタ液晶を使ったなにかの装置というのも良いかも知れない。このサイズなら 基板のサイズと折り合いが付きそうだ。(ちなみに、この液晶 デジキーでも扱っている(/た?) DMC-50448N の互換品のようだ。)。グラフィック液晶も心ひかれるものがあるが、別の機会に考えることにする。

ちなみに、I2C 高機能電源はかなり前から作りたかったもの。Nch+Pch 8-SOIC タイプのパワーMOS FETを使う。Pch だけ使って降圧型にしても良いし、Nch だけ使って、逆方向の昇圧ができるようにもしたい。目的はバッテリーへの充電とバッテリーからの昇圧。それ以外に電圧・定電流電源にもなってI2Cで設定や監視ができる。逆方向の昇圧が必要なければ、Pch+Pch の FDS4935とかを使っても良い。
ATtiny26Lでも、I2C スレーブと OC1A/OC1B は両立するし、OC1A 側を切り離せれば ISP にも対応できる。ただし、Pch と Nchを同時に動かすのは難しい。...とまぁこんなことを考えてチップは購入済みなのだ。ただ、8-SOIC タイプのパワーMOS FETは、(電流を流せるようにするには)手配線では厳しい。あと、パーツを変えていろいろ実験してみたいこともあって基板を作るなら是非入れたいのだ。
追記:
詳しくは、新しいカテゴリを作って I2CPWR:はじめにに書いた。

どうせ作るなら、USB 関係は、ミニ B と 標準 B コネクタを選択可能にしたい。ミニ B は、モレックスの 54819-0578 /54819-572 が入手可能。(RSオンライン / デジキー )

追記:
実は、AVR 関係でなければ作ってみたい基板はある。AT91SAM7Sシリーズ(AT91SAM7S64 〜 AT91SAM7S512) と CPLD CoolRunner 2 (VQFP44(0.8mmピッチ) の XC2C32A/XC2C64A) を組み合わせたもの。AT91SAM7S はシリアルのDMA を持っていて、これを CPLD でインターフェイスして他の装置につなげられるようにする。 たとえばグラフィック液晶(たとえばコレ:(参考)なる研)につなげれば、(CPU を使わない)フレームバッファになりそうだ。特に AT91SAM7S512は RAM を 128KB も持っていて 16bpp 400x96 ならいける。CoolRunner 2 は、1.8V 電源だが、AT91SAM7S から供給できる。その他にも面白いものが作れそうな気がしていて、基板を作るついでに作ってみたい気がする。ただ、これは AVR ではない。AVR のネタがなくなるまで手を付けないかも知れない。

(ちなみにその1)XC2C32A/XC2C64A はデジキーで扱っていて結構安い(162円/317円) 。単独で使うなら 1.8V のレギュレータが必要で NCP553 が結構安いようだ。ただ小さいので、NCP585の方がいいかも。
(ちなみにその2)AT91SAM7SをUSBからブートするには、水晶が 18.432 Mhz である必要がある。AT91SAM7S をデジキーで買うならついでに買うのが良い。
posted by すz at 13:03| Comment(0) | TrackBack(0) | 日記

2007年06月21日

FT245R/FT232R で avrdude

avrdude で FT245R/FT232R をサポートしてしまった。

鶏と卵 で書いたように、最初 の AVR ライタ をどうするかという問題があって、それは、パラレルポートを持ってさえいれば簡単に解決する。ただ今後レガシーインターフェイスがない PC も増えてくるだろうし、なにか良い方法はないかと日ごろ思っていた。SERJTAGは、FT245RL USBパラレル変換モジュール+ATtiny2313 を使った自作の高速な JTAG インターフェイスだが、作っているうちに、FT245R/FT232R BitBang 版 avrdude を作れるだけの知識が付いてしまった。鶏と卵 問題の解決にもなるし、BitBang と SERJTAG の性能比較もできるし ... ということで作ってみることにしてしまった。

BitBangMode の使い方は秘密にされていて、オープンソースになっていない。実をいうと、FTDI が供給するバイナリを使わないと使えないのが気に入らないので、積極的にサポートしたくはないのだ。..でもレガシーレスのPCで本当になにも手段がないときに使えるものは、コレぐらいしかないのだ。

追記:つれづれ日記からコメントをもらった。自分は AVR ライタをいくつも持っているのに、最初 の AVR ライタ を気にするのは、より多くの人に AVR での電子工作の世界に入ってきてほしいためだ。ローコストでAVRライタが手に入れば敷居が下がる。その結果、人が増えれば、自分の記事の有用性が増す。

ものは、serjtag-0.3.tar.gz と serjtag-0.3.zip
SERJTAG に同梱した。対応したバイナリも同梱している。(USB910 は次のバージョンで同梱する予定)

この avrdude.exe を使えば、
FT232RL USBシリアル変換モジュール(950円)FT245RL USBパラレル変換モジュールを用意するだけで、AVR へ書き込みができるようになる。ブレッドボードがあるなら、電源も AVR を書き込む程度 (30mA ?) ぐらいなら供給できるし、本当に他になにもいらない。
ちゃんとしたISP ケーブルを作るとしても、カモン USB-05を切って使えば簡単につくれる。前にも書いたと思うが、サポートしているのは、FT245R/FT232R (と FT2232) だけである。FT245BM(AM)/FT232BM(AM) は、Synchronus BitBangMode をサポートしていないので使えない。FTDI ならなんでも良いわけではないので注意。

ちなみに、ピン配置は次のようにした。(09/01/05 訂正)

FT232R FT245R chip pin# BitBang bit
  
MISO RxD D1 5 1
SCK TxD D0 1 0
MOSI RTS D2 3 2
RESET DTR D4 2 4

これは、avrdude.conf で定義しているので、ft245r の記述を参考に変更すれば、他のピン配置にも対応できる。

追記:avrdude.conf に記載したデフォルトの配置がバグってました。バグにあわせると↑になります。なお、デフォルトの配置はあくまでサンプルです。使用する装置に合わせて avrdude.conf を変更のこと。


秋月のもの以外では、ストロベリーリナックスの FT232RL USB→シリアル変換モジュールキット、wS☆Nakの#121A USB DIPアダプタ (FT232RL)などが良さそうだ。電子工作では、mini-B コネクタより、B コネクタの方が電流が流せて良い場合もある。秋月のは、ピン・プラグが最初から付いていて、ケーブルにするには、それがかえって使いにくい。アイテムラボのピッチ変換基板SOP28-P65(2)を使って作るのも良いだろう。FT245RL/FT232RL はほとんど外付け部品がいらない。必要なのは、パスコンぐらいで、それは変換基板に付けられる。

使い方は、-c オプション プログラマ名 に ft245r を指定し、-P オプション ポート名 に ft0 を指定する。あと -B ビットクロック オプションも対応していて、500 kHz 程度まで指定できる。(ただし 指定した周波数以下にするだけの意味 )

さて、例によって 4072 バイトのバイナリの書き込み/ベリファイ性能を見てみる。


書き込み ベリファイ 実効性能 (bps)
FT245R Synchronous BitBang
-B 4800 28.75 秒 27.50 秒 4738
-B 9600 14.86 秒 13.69 秒 9518
-B 19200 8.06 秒 7.00 秒 18614
-B 28800 5.67 秒 4.61 秒 28265
-B 38400 4.50 秒 3.47 秒 37551
-B 115200 2.36 秒 1.34 秒 97241
-B 230400 2.06 秒 1.08 秒 120651
-B 460800 1.63 秒 0.64 秒 203600

SERJTAG(FT245R 版)
- Linux 1.27 秒 0.27 秒 482607
- Windows 0.50 秒 0.44 秒 296145

注1)実効性能 は、バイト数 x 4 バイト/ベリファイ時間
注2)FT245R ドライバは、遅延タイマを 16ms から 5ms に設定変更


AVR ライタとしては、かなりの性能だと思う。だがしかし、SERJTAG はそれ以上の性能にできた。これでこそ作った意味があるというものだ。それはともかく、AVR ライタを持っていない人は、これを機会にぜひ AVR で遊んでみてほしい。プログラマをすでに持っている人もエマージェンシー用に使えるし、ひとつ持っていると良いかもしれない。



追記:

ここの説明は非常にいいかげんです。


  1. avrdude.conf がバグっているので修正すること
  2. 新品のチップは、クロックが遅いので、-B 4800 を指定する


この2 点に気をつけてください。

使うまえに、外付けAVRライタ無しでBootloaderを書き込む(Kimio Kosaka さん)をチェックしたほうが良いと思います。

あと、(番外) FTDI BitBang AVR-Writer と tomoの電子工作でファンコントロール:ファーム書換方法についても参考になると思います。
posted by すz at 00:55| Comment(11) | TrackBack(0) | 日記