2007年11月05日

セリア充電器

近所にセリアがオープンしているのを発見したので、電気・電池コーナを物色してきた。有名なセリア充電器を発見したので、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) | 日記

2007年06月14日

USB910のJTAG拡張案

デザインウェーブマガジン 2007年7月号 (2480円)には、付録に 250K ゲート相当 のFPGA Spartan-3E XC3S250E 基板が付いて来る。いままで、FPGA の付録は買ってきたが、実際になにかを作ったり動かしたりしたことはなかった。今度こそなにか動かしたいものだと思う。
FPGA のプログラミングはともかくとして、その前に USB910 を拡張して JTAG ケーブル 機能をつけてみたい。

USB の JTAG 関係で 参考になるものはないかと思い、sourceforge を JTAG で 検索すると ... xilprg というものが見付かった。
xilprg is a Xilinx FPGA/PROM/CPLD JTAG programmer tool for Win32/Linux.
Supports Parallel III cable, Digilent USB. cblsrv is a Open-Source CableServer for Xilinx Impact.

だそうだ。Digilent の
JTAG-USB
を サポートしていて、コンフィグレーションできるだけではなく、CableServer を使うと Xilinx のツールである iMPACT から直接書き込みできるようになるらしい。

というわけで、TAG-USB がどのようなプロトコルで通信しているか興味をもった。それは、xilprg の コードを見ればわかるわけだ。
前置きが長くなってしまったが、この JTAG-USB のプロトコルを紹介。

この JTAG-USB は、バルク転送で パケットをやりとりする。パケットの形式は、フラグ 4bit/コマンド 4bit , サイズ 16bit , データ (61 バイト)で、パケット全体が 64 バイトになるようになっている。 サイズの 16bit は、ビッグエンディアン で HI - LO の順。データ転送の場合、サイズには bit 数を入れる。データ転送でない場合は、バイトのようだ。

送信パケットのコマンドは、6 種類で 、受信パケットのコマンドは 1種類(0x06 固定)。送信パケットは、16 個まで連続して送ることができる。

送信パケット詳細

コマンド NULL (0x00)
サイズ 0
データ 0 バイト

受信パケット要求のコマンド。このコマンドを発行
したときだけ、受信パケットが送られてくる。

コマンド ENABLE (0x01)
サイズ 1
データ 1 バイト
0 : DISABLE
1 : ENABLE

初期化と終了コマンド

コマンド SET (0x02)
サイズ 1
データ 1 バイト
ビットマップになっていて bit の意味は以下のとおり
1 : TDI を HI
2 : TMS を HI
4 : TCK を HI

コマンド PUT_TDI_BITS (0x03)
フラグ RECIEVE(0x40) , TMS_HIGH(0x20)
サイズ bit数
データ (bit数 + 7)/8

TDI にビット列を送り込む。バイト内の並び順は
    LSB first
フラグには、受信データを用意する要求(?) の
RECIEVE と TMS の状態をセットする TMS_HIGH がある。
RECIEVE フラグを立て、コマンド NULL で要求して
はじめて、受信できる。

コマンド PUT_TMS_TDI_BITS (0x04)
フラグ RECIEVE(0x40)
サイズ bit数
データ (bit数 + 3)/4
PUT_TDI_BITS より高機能で、TMS の状態も 1bit
書き込み毎に設定する。(データの並び順は、TDI TMS
.... で 総bit数は、サイズで指定した bit数x2)

データには、TDI の状態 と TMS の状態が含まれる。

コマンド GET_TDO_BITS (0x05)
フラグ TDI_HIGH(0x10) , TMS_HIGH(0x20)
サイズ bit数
データ 0
TDI/TMS の状態を設定して TDO を読み取る。
受信するためのコマンドで、RECIEVE フラグは必要ない
が、コマンド NULL で要求してはじめて、受信できる。

こういうプロトコルなら、USBの遅延を隠蔽できるので、かなりのスループットが実際に出ると思う。また、JTAG だけでなく (標準的な)SPI にも使える。
よく考えられていると思うので、参考にして、USB910 の拡張をしようと思う。
コマンドは 数字('0' 〜 '5') を使いパケットは可変長にする。bit 数の 最大は 64 バイト分(512bit)かもうすこし大きめ。bitmap は USIを使う場合も考えて、MSB first。
こうやって USB910 を拡張して、xilprg を digilent 版ベースで改造すれば、iMPACT で使えるものになるはずだ。

それは良いのだが ... Digilent のものは、専用の USB インターフェイスがあるので、高速だ。それに対して、USB910 は 最大でも 80kbps ぐらいしか出ない。FPGA のコンフィグレーションとかは、それでがまんするしかないのだが、JTAG のバウンダリスキャン を使ってバスの状態を設定して、バスの上の FLASH ROM を書き換える用途などでは遅くて使えない。

たとえば、bit 数が 512 ほどあって、1 バイトのデータを書くのに
3 回 512 bit 送らなければならないとすれば、80kbps 出たとしても FLASH の書き込みは、52 バイト/sec になってしまう。FLASH が 4MBでも 22 時間もかかってしまう。

もうひとひねり必要だ。... 更新するデータだけを送り、複数の JTAG 転送をしてくれるような機能がないと使えない。そしてメモリもあまりない。
この部分は、まだどうしたら良いか思い付いていない。

なんだか USB910で無理やり機能をつけているからこうなってしまう気もする。AVRでの電子工作にこだわったとしても、ATmega88 と、FT245RL USBパラレル変換モジュールを組み合わせれば高速なものが作れると思うし、AT90USB162(pdf) なら、デジキーで購入可能で自由に高速なものを作れそうだ。そもそも、実用的かつ安価なものを求めるなら、Digilent の
JTAG-USB
を買うのも良いわけだ。

それでも、USB910(と AVR-CDC) にこだわりたい、USB910はいつも傍らにあるし、プログラムを作るだけでよいのだ。(ただし、Spartan-3E のJTAG は、2.5V なので、レベル変換は必要)。このブログのネタにもなるし、工夫の余地があって楽しくもある。


とはいえ、ATtiny861/ATtiny44 はまだどこでも入手できるチップではないので、いまは他の人に使ってもらうという立場ではない。
付録基板を USB から使いたい and/or I2CSND を使いたいという人のために、なにか考えようかと思う。
今のところFT245RL USBパラレル変換モジュール+ATtiny2313 を使って、USB910から I2C と JTAG拡張だけ抜き出したものが良さそうだと思っている。秋月で全部そろうし、USB910よりずっとJTAG の性能が良さそうだ。プロトコルをあわせておいて、xilprgの改造もする。あと、AVRDUDE とか UISP も改造すれば、AVR910の機能がなくともライタとして使えるはず。もしくは、ATmega88向けに USB910+JTAG拡張機能を BUILD できるようにするか... I2CSND 向けに シングルエンド ADC 機能と周波数カウンタ機能は移植したいところだ。


おわりに

デザインウェーブマガジン 付録の話題は、ネタふりにだけ使ってしまった。まぁ、実際なにか作りたいとは思う。だけれども、FPGA ならではのもので、あまり複雑な外付け回路を必要とせず、なにかの役に立つという条件を付けるとあまり作れるものがない。最近 I2CSND を作っているので、思いついたのだが、256〜384オペレータの FM音源で USBかMIDIインターフェイスを持っていてΣΔで DA変換(ウィキベディアの説明)してサウンドを出力する..とかはどうだろう。...といってもそこまでのものは、設計できる実力はない。設計する能力さえあれば、Spartan-3E XC3S250E はハード的にこれぐらいは可能だと思う。18bit 乗算器とブロックメモリが 12 個もあるし、PicoBlaze 12 個乗せてそれぞれ 32 オペレータ担当させれば、意外と簡単に作れるのかも知れない。が、なにしろ未経験なのでよくわからない。
posted by すz at 00:31| Comment(0) | TrackBack(0) | 日記

2007年04月06日

AVR-CDCの性能(2)

今回は、通信に使うコマンドを変えて send:recv の比率が 1:2 または 2:1になるようにして、I/O サイズによってどれぐらい性能が変わるのかを測定してみました。

I/OサイズとTAT


I/Oサイズとスループット


これをみると、すくなくともこの条件では Windows の方が圧倒的に早い。スループットで、2-3倍もあります。

I/Oサイズを大きくしていけば性能が上がっていく、レイテンシ(遅延)を隠すことができるので当然といえば当然ですが、実は他にレイテンシを隠す方法があります。



それは、ソフトウェアパイプライニングという手法で、一般にはCPUのチューニングに使われているものです。send と recv をずらすことで、レイテンシを隠すやりかたです。
さて、これを使うと性能がどうなるか見てみることにします。

I/OサイズとTAT (Linux)


I/Oサイズとスループット(Linux)


これは Linux の場合。TAT が短くなっています。スループットでみるとI/Oサイズが小さくてもピーク性能が出るようになりました。

I/OサイズとTAT (Windows)


I/Oサイズとスループット(Windows)


Windows の場合も 同じような効果はあるようです。

このパイプライングのコードを avrdude で試してみました。早くなったかというと ... Windows では全然変わらず。Linux では、Read(ベリファイ)は早くなったものの、Write は逆に遅くなってしまいました。

こういったことをいろいろやっていたのは、Windows で avrdude が遅いのをなんとかしようとしたためです。残念ながら、なかなか思うようにいかない結果になってしまいました。

追記

タイミングを変えてみようと思い、ISP書き込みのクロック周波数を上げてみたところ、Windows で (ISP書き込みの時間短縮以上に)高速化できることがわかりました。Windows は、↑のテストのようにすぐさまレスポンスを返す場合は早いけれども、ちょっとレスポンスに時間がかかる場合はかえって遅くなってしまう特性なのかも知れません。Linux では、なにやっても書き込み時間はこれ以上早くならない感じですが、読み込みは、まだ高速化できるようです。
パイプライニングの効果も確認できています。


書き込み ベリファイ
Windows 高速化版(100kHz) 14.05s 5.28s
Windows 高速化版(200kHz) 9.31s 3.25s
Windows パイプライニング(200kHz) 9.72s 3.19s
Linux 高速化版(100kHz) 6.58s 3.49s
Linux 高速化版(200kHz) 6.85s 2.40s
Linux パイプライニング(200kHz) 6.54s 1.81s
posted by すz at 01:44| Comment(2) | TrackBack(0) | 日記

2007年03月23日

AVR-CDCの性能

Low Speed とはいえ 1.5Mbps なんだから転送のオーバヘッドなんて気にしなくて良い ... なんて思っていませんか? それは大きな間違いです。

Low Speed では 1 パケットで最大 8 バイトしか送受信できないので、プロトコルのオーバヘッドの方が大きいのです。AVRusb.ZIPに含まれているAVR309補足を読むと、8 バイトで だいたい 2000 CPUクロックのようです。1byte = 10bit として bps 換算してみると、だいたい 480k bps になります。理論的な上限はだいたい 1/3 になる計算です。

さて、USB910 では、コマンドを送ってリプライを受け取る..というハンドシェークをしています。こういう使い方をする場合、遅延がものすごく大きくて、上の理論値など関係ないようなレベルの性能になってしまいます。

というわけで、いったいどれぐらいの実効性能が出るのか調べてみました。OS は Linux を使い、3 バイトのコマンドを送って Nバイト受信するテストと Nバイトのコマンド+データを送って 1バイト受信するテストをしています。



このグラフは、送信-受信の時間です。もう何バイト転送しようがあんまり関係ないという感じです。



こちらは、送受信のスループットを bps に換算したもの。こういう使い方だと1.5Mbps の1/50 出れば良いほうですね。

AVR910プロトコルと性能

AVR910プロトコルでは、Flash などの書き込みは、1 バイトづつ行います。コマンド+データの 2バイトを送信して、1バイトの結果を受け取るのです。そうすると...上のグラフで 5000 bps のレンジを使っていることになります。計算すると 1KBの書き込みデータを送るのに 4秒かかることになります。実際の書き込み時間は、7KBで30秒弱だったので、ほとんど転送時間が占めていることになります。

AVR910プロトコルは、バッファリングしないことが前提なのでこれを守る限り書き込み時間は早くなりません。ですが、たとえば 8バイト分のデータを一度で書いて、8バイト分の結果を一度に読み込むようにしたら... だいたい 25000 bpsのレンジになり 5倍近く高速化されることになります。もし、ページサイズ分のコマンドを連続して送って結果を一度で読み込むようなことができれば、さらに数倍になりそうです。できるかどうかわかりませんが、一度試してみようと思います。
追記:試してみました。

usb910a のコード 6918バイトの書き込み時間・読み込み時間
(uisp 使用 , コマンド起動時間を含む)

書き込み
uisp オリジナル: 29.129秒
ページ(64バイト)単位書き込み版: 5.729 秒
uisp パラレルポートライタ: 4.763 秒(参考値)

読み込み(ベリファイ)
uisp オリジナル: 13.939秒
64バイト単位読み込み版: 3.551 秒
uisp パラレルポートライタ: 4.212 秒(参考値)



コマンド実行時間で5.08 倍になりました。このうち 1.09秒は書き込み待ちで転送時間は 6.0 倍ぐらい?。-- さらに数倍というのは期待しすぎたようです。が、パラレルポートライタにだいぶ近い値。これ以上転送時間をチューニングしても全体の性能はあまりあがらなさそうです。

読み込みはもともと転送量が少ない(コマンド送信+2バイト受信)し書き込み待ちもないので書き込みよりは高速でした。でも十分遅いので、64バイト単位で読み込むようにしたら 3.9 倍に高速化されました。

でも、転送量を元に計算すると 1948 byte/sec -- たいした性能ではありません。ISP の最高クロックを 100 kHz にしているので、ISPの処理の上限が -- 3125 byte/sec。こっちの方がネックかも知れません。
posted by すz at 22:26| Comment(0) | TrackBack(0) | 日記

2007年03月20日

AVR Studio 4 + WINAVR を使ってみた

前にも書きましたが、私の開発環境は Linux です。しかも実は古い。いまだに gcc-3.4 を使っています。AVR Studio + WINAVR を使っているひとが圧倒的に多いと思いますので、AVR Wikiの情報をもとに いまさらながら Windows で build してみることにしました。

tar.gz のファイルを全部コンバートして、Project を作って、Makefile を修正して... 結構面倒ですね。

それだけでなく、typeB のバイナリが4158バイトになって4KBに収まらないという大問題が...

オブジェクトのサイズを比べると、小さくなっていたり大きくなっていたり... avr-libc で使っている部分も 32バイトほど大きくなっているようです。usb910conf.h を修正して機能を削れば小さくはできるんですが、あまり削りたくない。... でどうしたか。usbdrv.c のオブジェクトだけがかなり大きくなっているので、gcc-3.4 で作ったアセンブラファイルを持ってきて置き換えたら、なんとか 4094 バイトとぎりぎり収まるようになりました。

こういうことをするのは手間なので、これから zip 版も作ろうと思います。

というわけで、最新版は、usb910-0.3.tar.gzusb910-0.3.zipです。
最新版には、aps ファイルも入れておきます。上で説明したワザを使ってbuild するときは、typeBx.aps を使ってください。あと、RC発振器のキャリブレーションで使ったコードもサンプルとして添付しました。(こっちはASIS)
posted by すz at 23:57| Comment(0) | TrackBack(0) | 日記

作ってみようと思っている装置

いまのところ単なるアイディアメモ

(1)UNIX もどき USB Key
実はUSB910では、オリジナルのAVR-CDCに手を入れて getc/putc でプログラミングできるようにしていて、USB シリアル装置を手軽に作れるようにしている。で、なにか便利(そう)なものを作ってみようと考えていて思いついたもの。
この装置をUSBにつないでターミナルソフトを立ち上げ、ENTER を入力するとlogin: なんて出る。本当に login できて、いくつかのコマンドが使える。使えるコマンドは、ls と cat ファイル名と cat > ファイル名。あと rm ファイル名 は必要か。なんに使えるかというと、(他の)パスワードとか忘れそうだけれども秘密にしたいものの覚書。ファイルデータは、1件 1KB 以内で、32件までにして、I2C ROM に入れる。I2C ROM だけ抜かれたりしたときの対策に暗号化が必要で、暗号化のキーは本体のEEPROMに覚えさせてロックビットで保護する。最大の問題はコードのサイズ。 4KB に入れるのは無理そうだが、8KB には収めたい。装置単体でのパスワードの変更は無理だろう。で、どうするかというと、データをいったん全部吸い出して、あらためて パスワードと暗号化キーデータを生成して、EEPROM に書き込みデータを書き戻す...そういうホストプログラムがあれば問題ない。

(2)USB アイキャッチャー
LinkStationとか玄箱とかを愛用しているのだが、単体ではほとんど何も出力できないし、入力できない。ちょっとした情報でよいので入出力できるデバイスをつけたい。LCDキャラクタ/グラフィックディスプレイとかももちろん良いのだが、もっと小さくて目立つものにしたい。8x8 のドットマトリックスLEDを使ってボタンも2つほどつけて SW-55 のケースに収めることを目標にする。
AVRは、ATmega48 が良いんじゃないかと思う。ホストからコントロールするので、表示はどうにでもなりそう。
USB LCDキャラクタディスプレイを作るならLCD2USBがお勧め。プロトコルをこれにあわせたいとは思っているのですが、どうなるかはまだわかりません。

(3)I2C 高機能電源
PWM で降圧型DC/DC コンバータを作り、定電圧と定電流の機能を持たせてホストから機能設定とか電圧/電流をモニタできるようにする。できれば、NiMHの充電器として使えるようにしたいし、逆に充電したNiMHから昇圧できる機能もつけたい。コイルは共用できるはずでスイッチには Pch+NchのMOS FET を使う。AVR は 手持ちのATtiny26L..でできるとうれしい。なにを選択するにせよ、昇圧時は、自己消費が大きいとあまりうれしくないので、そのあたり工夫してみたい。

(4)I2C で制御する音を出すなにか
電子工作のテーマとして音を出すものを作るのは楽しい。I2Cドライバも作ったので、ATtiny45 (かひょっとすると 85) を複数個つかって音を出すなにかを作ってみたい。プログラム次第で簡単なものから高度なものまで作れると思うが、バーチャルアナログシンセなんてものにもトライしたい。外部クロック入力にして正確な音程を目指すのも良いが、RC発振器をキャリブレーションして使うというのも味があってよいかも知れない。電源ノイズが載るのだけは避けたいので、電源だけは専用の レギューレータをつけてやりたい。
posted by すz at 00:14| Comment(2) | TrackBack(0) | 日記

2007年03月16日

ケースと基板について

USB910を作るときコンパクトなケースに入れたいと思いました。最初に選択したのは、タカチ SW-55S です。秋月のC基板(ガラスエポキシ 片面/両面)を 1/2 弱 (33mm x 47mm) に切ったものを愛用しているのですが、このケースに、 それがちょうど入ります。

これは、TypeB 試作1号機ですが、フタに2箇所ネジ止めしています。こうすると配線が保護されるので、触って線が外れたり動かなくなるおそれが(ほとんど)なくなります。高さも 20mm (内寸は13mm) あって、USB B コネクタがぎりぎり収まります。


これは、TypeA 試作1号機なんですが、コネクタを横につけてしまい、ケースがちゃんと止まらないことに後で気づきました。あと無理に押し込んだので、改造とかがやりにくくなってしまいました。

もっと大きな基板でゆったり作った方が良さそうですが、タカチ SWシリーズには 20mm高 のものがなく収まりが悪そうで困っていました。で...千石で見つけたのがテイシンの TB-55シリーズ。現在テイシンのホームページには載っていませんが、20mm高で具合がよさそうです。中でも良さそうなのが、TB-55B(80x50) と TB-56B (95x65) 。TB-55Bのほうは、C 基板を 2mm ぐらい削れば入りそうです。基板を削りたくなけば、TB-56B が良さそう。TB-56B なら秋月で250円で売っているブレッドボードを乗せて試作ベースにするのも良さそう。

さて、基板を削ったり切るのに何を使っているか ... 前は三角のダイヤモンドやすりを使っていたのですが、とっても面倒でした。ホーザンのPCBカッターなんてのもあることは知っていますが、ちと高いうえ場所をとりそう。少しパワーのあるリュータに切断砥石をつけるというのも良いのですが、端を削るならともかく、基板中央を切るのは本体がじゃまで難しいです。あと回転数が高くて粉塵がけっこう出ます。
なにか良いものはないかと思って探して見つかったのが、電動飛行機用のギアダウンユニット -- OK模型 ギヤボックス GBX400 。プロペラ側に 3mm のネジが切ってあるので、ダイソーの 切断砥石とかダイヤモンドカッターをつけることができます。これを使って楽に基板を切ることができるようになりました。


(注意: 試すのは個人の責任でお願いします。試す場合には、メガネと防塵(or花粉症向けフィルター入り)マスクを付けることを強くお勧めします。手袋をする場合、軍手はまきこまれるおそれがあるので避けて、皮か厚手のビニール手袋にしましょう。)
posted by すz at 23:39| Comment(0) | TrackBack(0) | 日記

2007年03月14日

大失敗

i2c rom (at24c256) を使ってキャプチャーするものを作ってみましたが、
うまくいかないのでデータシートをよーく読んでみたら、64バイトのページを書き込む毎に、10ms も待たなければならないことに気が付きました。たとえば 64 バイトの書き込みで、400kbps だとすれば、転送時間はだいたい 1.5ms 。転送時間より書き込み待ちのほうがはるかに長くて、これを加えると 64 バイトで 11.5 ms と桁がかわってしまう。そうなると.. 8bit でデータをとっても 5.5K sps ぐらいでしかロギングできない。しかも 64バイト毎に 待ちが発生するので、バッファは 128B ぐらいはもたないとダメそう。
せっかく作ったので、とりあえず完成はさせたいとは思いますが、だいぶやる気が失せてしまったので、ペースが落ちそう。シリアル ROM だと配線量が少ないので、手軽に作れて良いと思ったんだけど...かなり甘かった。
代替案としては、M25P40 pdfを使うのが良さそうとも思うのだけれども、デジキーで買えるもののチップの入手性がいまいちだし。いっそのこと、AT91SAM7S にしちゃえば、32KのRAMと 533kSPS の ADC と USBデバイスが1チップに内蔵されていて便利そうなんだけども、それはAVRでないし。
posted by すz at 01:02| Comment(0) | TrackBack(0) | 日記

2007年03月07日

Tiny系BootLoader のアイディア

Google Code Searchで、ATTiny2313_bootloaderというものを見つけた。これを見ていて考えついたもの。
とりあえずターゲットは8KBのATtiny861とする。普通にプログラムを作りリンク(ld)のオプションに、-Ttext 0x1000 -Tdata 0x800160 とつけると何が起きるか... というと プログラム全体が 4KB のところに移動して、データのアドレスも 256B 後ろにずれる。スタックはメモリの最後を使うようになっているので、前半分は一切使わないようなものになる。もちろん割り込みベクタのアドレスも 後ろにずれるので、できたプログラムを書き込んだだけでは動かない。それは当然だが、たとえば ベクターの部分をコピーして 0 番地から書き込めばどうか。ベクターは rjmp が入っているので、単純なコピーではだめでアドレスも + 0x1000 しておく必要がある。そうするとそのプログラムはちゃんと動くはず。さて、アプリケーションプログラムをATtiny461としてプログラムする。そうすると 4KB以内のプログラムメモリ、(スタックも含めて)256B以内のRAMを使うようにリンクされる。これでお互いにまったく干渉しない2つのプログラムを突っ込めるようになったわけだ。
このままでは、後ろ半分にあるシステムプログラムには制御がわたらない。どうやって制御を渡すか。ひとつは、アプリケーションプログラムが、後ろのシステムプログラムをcallする。0x1000番地にベクタがあって、最初のものは初期化関数へのrjmpになっていることは判っているわけだから、0x1000 番地に jmp すればよい。いったんシステムプログラムに制御がわたれば、アプリケーション側のベクターを書き換えてしまえばよい。そういうやりかたがひとつ。システムプログラムでは、ベクターの領域はいくつかしか使わないのでそのうちのひとつをシステムコール関数へのrjmpにしてしまう。システムコール関数の第一引数を機能番号ということにしておいて、機能番号 0 を 最初のシステムプログラムの呼び出しということにしても良い。こちらの方法ならいくつか機能をいれることができる。また、このrjmp に細工をしてスタックも変更するようにしておけば、アプリケーションのリソース(スタック)を使わずに機能を実行できて都合が良いかも知れない。
いずれにしてもアプリケーションがシステムプログラムをコールしなければならないのは自由度が低いというデメリットがある。システムプログラム側がブートローダー機能をもっていれば、アプリケーションを書き込むときにベクターを最初からフックするようにできるのでアプリケーション側はシステムプログラムの存在を無視して作成することも可能になる。
さて、USBに対応したブートローダーというものを考えてみる。USBの機能を使うためには、INT0 (もしくはINT1)は、ブートローダが占有する必要がある。応答時間の制限という問題があり、アプリケーション側でUSBのコードを入れるのは不可能。また、USBのコードは2.6KB程度あり二重に持つのはコードの無駄。システムコール関数の機能の中にUSBの機能も入れるのが妥当ということになる。アプリケーションがUSB機能を使いたければ、enable する指示を出せばよいし、使いたくなければなにもしなければ良い。ただし、INT0とINT1はアプリケーションでは使えないという制限はつく。
さて、いつブートローダ機能を enalbe にするか。これが問題。アプリケーションが call してくれれば良いが、まったく動かないアプリケーションを作ってしまうこともあり得る。ブートローダenableのpinをひとつアサインしてボタンかなにかをつけ、それを押しながらUSBに挿すといったやりかたがないとマズそう。となると、Port はUSB機能の2pin を加えて 計3 pin ブートローダ側が占有することになる。それ以外ではアプリケーションがなにか明示的に機能をcallする。指示のひとつとして、WDTタイムアウトで ブートローダ機能 enable というのも良いかも知れない。ブートローダ機能の中にRAMの読みだし機能があれば、デバッグにも役に立ちそうだ。
こういうものはいったいどれぐらいのメモリを消費するのか?もともとアプリケーションでUSB機能を使うのならば、USB機能を移動しただけだからメモリを消費するとはいえない。ブートローダ機能だけならば、だいたい1.5KB ぐらいで済みそう。

...ということを考えていて、いつかUSB910A で USBブートローダ機能を実装してみたいと思っています。ただ、ブートローダenableのpinをどうするかというのが問題。いまのところ、VCC 電圧読み取り用のpin と兼用にしようかと...
posted by すz at 05:54| Comment(0) | TrackBack(0) | 日記

チップ初期化器のアイディア

AT90S1200用 内部RC発振回路有効化ボードの製作というのを参考にして、高電圧パラレル/シリアルプログラミングで、チップを初期状態にするものが作れないか。
これを使うケースは、RESET pin まで使いたいとか、ヒューズビット の設定を間違えたとかで、あんまり使用頻度は高くなさそうなので、チップはもっとも安い ATtiny2313 を使いたいし、電源も 5V 単一電源にしたい。
+12V 昇圧の部分は PWM で適当に昇圧して、TL431で+12V までに制限をかければフィードバックもいらず回路が簡単になる。インダクタは、秋月で扱っている マイクロインダクタ LAL02 47uH 専用ということにして、PWM の周波数と Duty を決めうち(250kHz , On-Duty 20%)にすることにすれば、再現性はかなり高くて、電圧が上がりすぎるとかの問題もおきにくいはず。具体的には、次の回路で十分ではないか。


書き込みについては、パラレルとシリアルの両方を試して、正しいシグネチャを返してくるほうでプログラムすることにしてシリアル・パラレル両方とも対応する。
で、問題はピンの数、かなり厳しい。信号線14と VCC, PWM, +12V出力で17pin になってしまう。+12V 出力をあきらめて、PWM スタート = +12出力ということにすれば 1 pin 減らせるが、立ち上がりの時間に条件があるかもしれないので無理かも知れない(大丈夫だと思うが自信なし)。プログラム中インジケータは PWM を流用することにする。+12V 出力制御がなければ +12V までの電圧がかかってしまうが VCCがOffなら問題ないだろう。OK のインジケータは、信号線のどれかを使うことにする。書き込みできれば HI-Z になっているはずなので問題ない。エラーの場合は PWM で点滅させればよいかも知れない。チップを初期状態にするだけなので、電源いれたら自動スタートでよくボタン類も一切なしにしてしまえば、一応 16(or 17) pin で作れることになる。
もし、ATtiny2313 で作れないとなると、ATmega48 が次の候補。ただし、そこまでいくと、ピンもメモリもあまるので、USB で接続して、まともなパラレルプログラマにしたいなんて考え出すことになる。結局作るのが面倒になってしまいそう。

... というのを作ってみたいとは思っているのですが、あんまり必要性がないので、アイディアのみで終わるかも。

Tiny2313 専用ですが、Tiny2313リセッターというのがあるようです。同じ チップを使って亀の子にするのは手軽でよさそう。

この昇圧回路、電流はほとんど流せません。2-3 mA ってとこみたいです。高電圧プログラミングには、それで十分みたいですが他の目的には使えないでしょう。ちなみに、20% Duty 固定なら、8MHz クロックで、6:30とかすればよいので、どのAVRでも問題ないはず。
posted by すz at 04:09| Comment(0) | TrackBack(0) | 日記

鶏と卵

AVR でUSBプログラマを作っても、それ自体にプログラムを書き込むために別のプログラマが必要になってしまいます。プログラマがないとプログラマが作れない... 鶏と卵の関係ではありませんが、困ったことです。

ここでは、ものすごく簡単にできるプログラマを紹介しておきます。

なひたふさんのNAXJPのページで紹介されている ダウンロードケーブル
がオリジナルです。このケーブルのGND以外の信号線に 150Ωぐらいの抵抗をいれれば、3.3V電源でも 5V電源でも使えます。DSUB25 pin オスコネクタは、秋月で50円で買えますし、ケーブルには、カモンの USB-05USB-08を使うのが便利です。シールドされているので、80cm の USB-08 でも問題なく書き込みできます。抵抗は1/4Wタイプの大きめのものを使い。ケーブルと半田付けしたあと熱収縮チューブで絶縁+強化しておきます。信号名は、TDO = MISO,TCK = SCK, TDI = MOSI, TMS = RESET と読み替えます。



このケーブルを xilinx JTAGケーブルとして使えばOK。uisp を愛用していますが、これだと -dprog=xil と指定します。

このケーブルは1つあると便利なのですが、パラレルポートを使うので PCによっては使えないかも知れません。また、なんらかのミスでパラレルポートを壊してしまうかも知れません。パラレルポートはあんまり使わないので壊してもあまり困らないかも知れませんが、このケーブル自体が使えなくなってしまいます。だからやっぱりUSBのプログラマが便利なのです。

AVR の世界では、パラレルポートのピンの割り当てが違うSTK200ケーブルというのがあるようですね。ChaNさんのAVR ライタ作品集にある Stk200の簡易版のほうが良いかもしれません。


追記 avrdude で使うには

オプションに、-c xil をつけます。


# avrdude -p t861 -c xil -t
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e930d
avrdude> q
avrdude: safemode: Fuses OK

avrdude done. Thank you.
posted by すz at 02:16| Comment(0) | TrackBack(0) | 日記

2007年03月05日

ソースコード公開

ソースコード usb910-0.5.tar.gzusb910-0.5.zipを置きました。

ついでに作った装置の写真を載せときます。

TypeA 試作1号機

秋月C基板を1/2 にして タカチSW-55 に入れようとコンパクトに作ってみたのですが ... ちゃんとケースに入れるのは失敗。それはそれとして、結構いろいろな実験に使えて重宝しています。

TypeB 試作1号機

Tiny44 を使ってみたかったので、機能を省いてコンパクトにしたものを作りました。タカチSW-55 にもきっちり入ってなかなか外観は良いのですが...実験ではTypeA ばかり使うので、まだあまり出番がありません。

実験ボードその1

I2C ROM(左下) の読み書き、8pin AVR (Tiny13,45V) (左上) と Tiny44 (右)の書き込み用のボードです。TypeA を使うと、RC発振器 のキャリブレーション、ADC のキャリブレーションもできます。

実験ボードその2

こちらは、Tiny26/Tiny861 の書き込み、各種キャリブレーション用ボード。それだけでなくて、+12V 昇圧回路と 8pinAVR, Tiny44 の 高電圧シリアルプログラミングの実験ができるようにしています。
posted by すz at 16:36| Comment(0) | TrackBack(0) | 日記

2007年03月01日

USB910のパーツについて

入手が難しいパーツやお勧めのパーツについてのコメント

ATtiny44-20PC , ATtiny861-20PC デジキーで取り扱い開始
ATtiny861はずっと買えるようになるのを待っていたのです。買ったら早速使いたくなってUSB910Aという形になりました。それに対してATtiny44 はおまけ的存在。小さいだけがメリットかも知れません。

QIコネクタ、QI片端圧着済ワイヤー 共立
ISPケーブルを作るのによさそうです。1x5 も 2x3 もあります。圧着は面倒なので、QI片端圧着済ワイヤーも一緒に買うと良いと思います。

カモン USB-05 千石で 231円
カモン USB-08 千石で 263円
両端に QIコネクタ1P x 5がついたシールドケーブルが2本セットになっています。ISPケーブルを作るのに便利。半分に切って中のコードを抜けば、QIコネクタつきケーブルが 16本も得られます。

3.6V ツエナーダイオード 千石でHZ4A−2が10本210円、100本630円。デジキーで 1N5227B が10個95円、共立で 0.5W 15円
低電圧のツエナーダイオードは千石が扱っているのを知らずデジキーでチップタイプを買ってしまいました。

超小型スライドスイッチ IS-1250 秋月で 4 個100円
とても便利です。お勧め

片面ガラスエポキシ・ユニバーサル基板Cタイプ 秋月で60円
スルーホールユニバーサル基板より作りやすいかも。

3端子レギュレータTA48M033F 秋月でコンデンサをセットして100円
定番だと思います。

12MHz 水晶 秋月では、10個500円。
10個もいらないならデジキーでついでに買うという手がありますが、電子工作するなら10個ぐらい買っておいたほうが良いと思います。

ピンソケット(1×14)秋月で50円
基板取付用USBコネクタ(Bタイプ)秋月で50円
在庫切れのこともあるようです。買えるときにいくつか買っておくと良いかも

抵抗 1Ω 1/6W 秋月で 100個100円
 
電流測定用で、1/6Wなら400mA まで。これぐらいがちょうどよさそう。電流測定の精度はあまり期待できないので、5% ぐらいで十分。10uF のチップ積層セラミックコンデンサをパラにつなぐと cutoff 16kHz のLPF になるので、ノイズ対策によさそう。


実験で使うかも知れず特殊かも知れないパーツ

TL431 秋月で10個100円 基準電圧キャリブレーション用
チップ積層セラミックコンデンサ 10 μF [3216] 6.3 V 秋月で10個100円 基準電圧キャリブレーション用
TL431は、10uF ぐらいをつけないと発振する場合があります。3216サイズなら手配線しやすいので入手しておきましょう。

電流測定用に必要になりました。

チップ積層セラミックコンデンサ 4.7 μF [3216] 25V 秋月で20個100円 12V昇圧回路実験用
16V 耐圧では不安なので、25V 耐圧のこれを買っておくと良いと思います。

マイクロインダクタ 47μH 秋月で10個100円 12V昇圧回路実験用
実験では、高電圧シリアルプログラミングのテストで使ってみました。あまり電圧が高くなるとコンデンサがやばいので、これぐらいからテストするのが良いと思います。ものは、LAL02NA470K max 70mA / 5.8 Ω

LHLZ06NB 100μH 0.57A とか 47μH 0.82A とか。千石で10個270円 
旧製品のLHL06NBと同じ大きさで3倍近い電流が流せる。安いしコンパクトなのでお勧め。実験でも使ってみるつもり。

I2CROM AT24C256(2.7〜5.5V) 秋月で 160円 
I2Cマスタのテストでまず使いました。あと、波形をキャプチャーする一時メモリに使う予定です。


SI91841DT-285 秋月で売っている2.85Vチップレギュレータ。中途半端な電圧ですが、150mA Ultra Low-Noise LDO Regulator だそうです。PWMで音を鳴らしたり、可変の基準電圧を作ってみたりしたいのですが、PWM は電源電圧の変動にもろに影響されるので、こういうので電源供給したらどうかと考えています。
posted by すz at 06:57| Comment(0) | TrackBack(0) | 日記

USB910Aの設計とデザイン

USB910A は、ソフトウェアには詳しいがハードウェアはあまり知らない ... そういう人が電子工作の世界に入るときに敷居が低くなるようにできないかということを考えて設計しています。(それはなぜかということは、また別の機会に書こうと思います。)

敷居を低くするには、したいこと以外のことはお手軽にできること...これが重要です。そういう意味で、USBで書き込みができて電源も供給できるプログラマがまず必要だろうと思います。 そういう装置が安く簡単に作れるということも大事です。このような理由で、AVR だけでUSB シリアルデバイスになるファームウェア AVR-CDCをベースにして、プログラマを作ることにしました。有名なAVRプログラマのプロトコルには、Stk500とAVR910そして、ブートローダ向けのAVR109の3つがあります。その中で最も簡単なAVR910互換にしました。その代償としてやや書き込みが遅くなってしまいました。AVR109互換の拡張をすれば数倍の高速化が可能なのはわかっているので今後改良していきたいと思います。

ちなみに高機能なプログラマ機能だけが必要ならば、製品を買うのが手っ取り早いです。Atmel が出している AVR Dragon が低価格で機能も高くお勧めです。AVR-Dragon は、オプティマイズ/ITプラザでも扱っているようです。自分で作ってみたいなら AVR Doperも良さそうです。

2007/5/24: AVR Doper のサブセット版の基板が つれづれ日記のゆきの研究室から出ました。→ AVR-Doperの小型基板製作。書き込み済み ATmega8 も分けてくれるので、これから AVR を始めたいひとにお勧め。
一方、 AVR Dragon は、電源部分が煙を出して壊れるロットもあるようです。情報収集をした上で購入するかどうか決めたほうが良さそうです。

2007/7/5: ゆきの研究室で USBaspが発表されています。キットになって出るようなので、これから AVR を始めたいひとにお勧め。avrdude-GUIもあり、AVR Studio 4 から直接使えます。あと、#173 COM-SPI ブリッジ AVRライタもお勧めです。こちらは、シリアルポートが必要ですが、USB-シリアル ケーブルでの接続でも 問題ないので、ノートPCでも使えるはず。


さて、プログラミングできて、電源も用意できた後は何が必要か..というと(作ろうとする装置はもちろん必要ですがそれを別にすると)デバッグ手段です。デバッグでは、ホストとお手軽に通信できることが重要です。LED を光らせるのも良いですが、それで得られる情報には限りがあります。そこから進んでいくとやはり大量のデータを見る手段がほしくなります。お手軽にするには、ISP ケーブルをつないだままプログラムを動かせばホストと通信できる必要がありそうです。

それが可能な通信手段は、ターゲットを AVR Tiny シリーズということにすれば、SPI と I2C に絞られます。一見 SPI が良さそうに思えますが、3 本だけで通信するのは実は面倒です。ISP や JTAG 、SDカードといったものは、SPI を採用していますが、信号線は4 本です。SPI はビット列を送るものなので、同期のために もうひとつ信号線が必要なのです。
それに対し I2C は、2 本の線で データのかたまり -- パケットを送受信できます。ということで、I2C でホストと通信する手段を提供することにしました。デバイス側のプログラムも提供しないと実際には通信できませんから、テンプレートを元にしてプログラムをかけば、したいことを簡単にできるような、I2C スレーブドライバの提供も合わせて検討することにします。

さて、それをさらに進めるとどういうものがあると良いでしょう?オシロスコープとかロジックアナライザなんていう以前に動作中にテスタを当てるのが実に面倒です。多くの ADC 入力があってそれらをターゲットに配線してしまえればどうでしょう。いったん配線してしまえば、あとはホストの操作だけで電圧を読み取れるとお手軽ではないでしょうか? そう考えて できるだけ多くの(といっても4本ですが)ADC 入力を提供することにしました。そのうち1つは、周波数も読み取れます。PWMを使って周波数を変更することで状態をホストで読み取るなんてワザも可能です。

さらに進むと、オシロスコープとは言わないまでも 波形が見たくなります。
USB910A は、メモリが少ないので波形を見るレベルにはできませんが、オプションで、波形をキャプチャーするデバイスを装着することを検討しています。

AVR の ADC で キャプチャーしたデータをI2C ROMに一時格納するものを予定しています。あまり性能は高くありませんが、ローコストかつ簡単に作れて音声領域ぐらいの波形は見れるようにしたいと思います。I2C はバスなので、こういうデバイスを追加できるという利点があります。


こうやって設計した USB910A を 実際に使った実験を ぼちぼち紹介していきたいと思います。

予告

電圧と温度を変えて、OSCCAL の値を変化させると どのようにクロックの周波数が変わるかの実験の紹介を予定しています。



こんなグラフも書けています。温度が10℃変わったときの違いより、電圧が 3.3V か 5V かの違いの方が大きいなんてことも分かります。


次に 温度計のテスト。Tiny45 や Tiny44 の温度計は信用できないなんてこと
をデータで見せたいと思います。第三は、昇圧DC/DC コンバータの試作と
高電圧シリアルプログラミングの実験。.... あとはまだやっていませんが、
内部基準電圧のキャリブレーション、DCブラシモータの回転数制御の実験とそれに必要なオプションキャプチャーユニットの製作を予定しています。USB910A/B のソフトの公開が先ですが。
posted by すz at 04:12| Comment(0) | TrackBack(0) | 日記

2007年02月28日

ブログはじめました。

AVR というワンチップマイコンを中心にした電子工作やらプログラミングやらの話題を書きたいと思いブログを立ち上げました。

日記 というカテゴリは、雑多な電子工作についての話題。
USB910A,USB910B というカテゴリは、同名の自作ツールを使った電子工作についての話題で、ある程度 まとまったものを載せていこうと思います。
posted by すz at 18:49| Comment(0) | TrackBack(0) | 日記