ラベル DRO の投稿を表示しています。 すべての投稿を表示
ラベル DRO の投稿を表示しています。 すべての投稿を表示

2009年4月10日金曜日

Thin Fax Line (Olimexプリント基板発注記2)

2月19日 19:00。ツベタンくんから新しい発注書をもらったので、これに必要事項を記入します。記入は発注書PDFをドロー系ソフトに取り込んで、上からテキストを貼り付けました。フォントもタイプライターフォントを使って、いかにもという感じです。決済カードにJCBが使えるってのはよほど日本人客が多いのでしょうか。


一番下のシグネチャーは手書きで書いて、さあ、FAXです。FAX…国際FAXか!そんなのやったことないぞ。大慌てで国際FAXの仕方を調べて、部屋のFAXから送信!
…プルプル…
お、かかった。向こうのベルが鳴ってる。
…ブッ、ピーガーピーガー…
お、ネゴシエーション始めた。行ける!
…ギョワー…
行ってる行ってる!これで安心。数秒後…
…(シ~ン)…
…ピー。グガガガ(紙の排出される音)。「通信エラー」
うっそぉ~。途中で通信がぶった切られました。なんでだろう?回線状況がたまたま悪かったのだろう。では、気を取り直してもう一度……全く同じ現象が。困った。ブルガリアまでって通信料金が高い。アメリカに送るのとはわけが違うのです。何度もトライはできない。何しろ回線接続まではできちゃうわけだからその分料金はかかる。コンビニで送るっていう手もあるらしいけど、なんだか癪だし、めんどくさいし、きちんと送れる保証はないし。

で、思いついたのが、SkypeでFAXできないだろうかということ。Skypeの"SkypeOut"サービスはヨーロッパにあるVoIPゲートウェイから電話回線につなぐことができるから、回線品質は日本から直接つなげるよりもきっとずっといいはずだ。ただし、SkypeOutは安いながらも有料で、「Skypeクレジット」という仮想チケットを前払いで購入しておかなければならない。最低料金は750円ですが、今後も何回かOlimexには発注するかもしれないし、長距離電話をSkypeからかけてもいいし、無駄にはならないと思いました。

Skype用のアドオン(Skype用語で"Extra"という)で、"PamFax"というものがすぐに見つかりました。インストールするとプリンタとして登録され、どのソフトウェアからでもPamFaxに向かって印刷をするだけというものです。料金はページごとの課金でSkypeクレジットからの引き落としです。うまく送れた場合のみ課金されるはずで、こちらのリスクは低いと思われます。…が本当にうまくできるかどうか怪しい…。心配しつつもトライすると…

2月19日 21:30。送信成功です。苦闘2時間半。とりあえずPamFax上では送信完了となりました。送信完了通知をメールで受け取ることもでき、そちらもきちんと通知が来ました。
Hazieさん、.
TSVETAN/OLIMEX (+35932621270) 様宛のPamFaxが送信されました。
ポータル画面でFAXの履歴を見ることができます。
PamFaxをご利用いただきありがとうございます。
PamFax Service より
やった、届いた。届いたはず…だよね?Skypeクレジットは119円だけ減っておりました。これ、たぶん安いよね。ブルガリアだもんね。普通に送ったら大変なことになるよね。(後日、立て続けに2回失敗した国際回線での送信で320円かかったことが判明しました。失敗しただけで1回160円だもんね。成功してても500円超えてたかもなあ。今回はこれでよしと。)

2月20日 9:30。ツベタンくんに何か反応してもらいたいので確認のメール。12時間前にFAXしたけど届いてる?
Dear Tsvetan,

I placed the order through fax about 12 hours ago.
Did you receive it? If you didn't do so and inform about it,
I'm ready to re-send it again.
…待てど暮らせど返事が来ない。その12時間後、来ました。
fax received
そ、そんだけかよ?1行だけ?文にもなってないよ?返事が遅くなってすみませんとかもなしかよ。ちょっと憤りを覚えつつも一安心。まあ、忙しいんだろうけどさ。分かってあげようか。FAXが届く=注文完了なので、製造が始まるわけですが、一番安いコースの"3-5 working days"なので1週間くらいは見ておきましょう。

3月3日 2:00。キター。ツベタンくんからメール!FAX入れてから12日だ。
shipped
また1行野郎だ、コノヤロー。でも出荷されたのね。よかったよかった。しかし、時差を考慮しても6 working daysかかっとるな。まあ、仕事じゃないから我慢しよう。その分安いんだから。

さて、無事にツベタンくんの手を離れて、ブツは国際エアメールのパフォーマンスにゆだねられました。いつ届くのか?こいつも怪しい。

3月16日…ポストイン。待ちましたよー、待ちました。首がこんなに長くなっちゃったよー。13日かかった。ほんとにエア?なのか?1週間、長くて10日くらいに想像してたのに甘かった。で、記念撮影。


中身は3枚まとめてシュリンクラップしてありました。そうか、金フラッシュ仕上げだったのか。半田レベラーにしてもっと安くなんないかな…。


ということで、めでたく完成!いきなりジャンパ入ってますが…。


※PamFaxのインストールと使い方が分かりやすく載ってるページがこちらにありましたので紹介しておきます。

2009年4月9日木曜日

よし、ブルガリアにしよう。(Olimexプリント基板発注記1)

前から気になっていました。東欧のある国には激安でプリント基板を作ってくれる業者があるのです。その名はOlimex(たぶんそのまま「オリメックス」と読むのでしょう)。所在地はブルガリア…ブ、ブルガリア?どこ?ヨーグルトの国としか認識していませんでした。それでもトラ技に紹介されていたり、検索すれば多くの日本人がトライしていたり、もうずいぶん有名になりました。「TinyでDRO!」の基板はXYZ軸で3枚いるし、手張りだとLEDの配線が手間だし、密度も高くないし、ここのところ空前の円高ユーロ安だし、今まさにブルガリアを試してみるチャンス。Eagle(回路CAD)のファイルがそのまま使えるのもうれしい。今回はそのOlimexにDROの基板を発注して届くまでの顛末を書こうと思います。

発注前。EagleでDROのパターン設計を終える。今回はOlimex言うところの"DSS"サイズ、すなわち両面板のユーロカードサイズ160mm×100mmにジャスト3枚面付け(同じパターンを1枚の基板に割りつけること。英語で"panelize")することにしました。Olimexは既定のカードサイズ以内なら無料で面付けして、希望によりカット("de-panelize")もしてくれるのです。私なりに要点をまとめたので紹介します。
注文を意識した設計のTIPS

[1] 基板外形サイズを160mm×100mm以内に入れる。外形線は10milの幅で引き、面付けする場合には切り代を10milとる。
[2] OLIMEX用DRCを走らせる。DRCエラーを修正する。
[3] 非標準ドリルを抽出する。0_OLIMEX_DRILL.ulpを実行。現在プロジェクトの直下にできるOLIMEX_DRILL.scrを実行。
[4] ドリル径をOLIMEX仕様に標準化する。
ライブラリに標準ドリル版のパッケージを追加する。0_OLIMEX_LIB.ulpを実行。変更を受けるライブラリを指定。現在プロジェクト直下にできるOLIMEXLIB.scrを実行。ライブラリを保存。基板エディタでライブラリをアップデート。ドリル変更をするすべてのパーツでパッケージ変更(change package)。
[5] シルク幅の変更。OlimexAllSilk.ulpを実行。すべて10mil幅になる。
[6] ドリル穴数のカウント。drillinfo.ulpまたはcount.ulp(面付け後500穴を超えると割増料金)
[7] 半田マスク層(tStop, bStop)を含めてOLIMEXが使うすべての層に任意の文字列を入れる。基板外形の外でよい。(これを自動化するスクリプトがあるらしいが、当時存在を知らなくて使わなかった。)
[8] .brdファイルとREADME.TXTファイルをZIP圧縮する。
[9] ZIPファイルを添付して注文メールを送る。データの出し直しは3ユーロのペナルティを取られる。

2月18日。上記[8]のZIPファイルを添付して、最初のメールを送る。
From: hazie@mydomain.jp
To: fastpcb@olimex.com
Subject: PCB ORDER
---
Dear

I would like to order PCB with attached files.

Regards,

Hazie
これだけ。本当にこんなんで大丈夫か?かなり心配する。
すると、発信からたった45分で返信が来た。
From: "Olimex Ltd Support"
To: hazie@mydomain.jp
Subject: Re: PCB ORDER
---
Hi
attached is your po form
Best regards
Tsvetan / Olimex
ををっ!早い!担当者は"Tsvetan"…「ツベタン」ですね。かの有名な「ツベタン」くんとはキミか。発注書が添付されているので中を見ると…

45.5ユーロね。ん?こちらの見積りよりちょっと高いな。あれ?"Non Standard drill sizes 4pce Euro 4.00"って何?非標準のドリルが4種類もあるって。実は、この時点ではドリル径の標準化を知らずに発注してしまったのでした。うーん、このまま発注すれば4ドルのプラス、修正して出し直せば3ドルのプラス。これは、修正したほうがわずかに安く済むな。もしかしたら、初めてってことで無償で対応してくれたりして…と淡い期待をいだきつつ、ネット情報で確認しつつ修正です。

2月19日、(こちらの)朝一。修正しますとツベタンに一報。
Dear Tsvetan,

I have to say I'm sorry that I attached wrong data.
I didn't check enough for your standard drill sizes.
The data standardized will be made and I will place another order.
ごめんね、チェック不足で間違っちゃったから、すぐに直すねって、かわいく聞こえただろうか?んなわけないなぁ…。

その日の昼前、11時ごろ、修正済みファイルを添付して送信。
I would like to order PCB with attached files.
Please cancel previous order PO#xxxxxxx and send another PO form.
今度は4時間半後。ツベタンから返事が。
Hi
please note in this case file re-processing charge EUR 3.00 will be add to your order
Thanks
Tsvetan
ううぅ、許してくれなかった…無慈悲にも追加料金が。まあ、こちらが悪いのであきらめて…
Dear Tsvetan,

Oh, I didn't know it. But I agree re-processing the data with the extra-charge EUR 3.00. Please send another PO.

I will be more careful next time. Thanks.
即、受け入れることにしました。今読むとここまでへりくだる必要はないかも。

その3時間後、例のそっけない文面で新しい発注書が届いた。
Hi
attached is your po form
Best regards
キミは無口だなあ。ま、"Best regards"がついているだけいいか。ちなみに、修正したデータの場合は注文番号に「X」がつくようです。なんか落第点とったみたいでへこむなあ。でもきっちり1ユーロ安くなりました。

さあ、ここからまた一騒動ありました。つづきは次回へ。


2009年4月1日水曜日

TinyでDRO!(ソフトウェア2)

データの頭出しは、データ送出の時間間隔が約0.3秒開いているという仕様に頼ります。0.3秒と仕様にしてはやや甘いので、実際のプログラムでは「0.25秒以上開いたら」という条件に置き換えます。

このタイミングはTimer1を使って計ります。システムクロックを256分周した周波数でカウントアップします。カウントアップの最大値が0.25秒で訪れるように比較一致レジスタOCR1Aを設定し、最大値に達したら自動ゼロクリアするようにCTC動作にします。

下図のタイミングチャートでは、データビットの送出タイミングに合わせてTimer1のカウント値がどのように変化するかを示しています。「絶対座標のデータ」または「相対座標のデータ」の下の部分を見て分かる通り、データビットを取り込むタイミング(INT1のハンドラ内)でTimer1をクリアしています(図の「エッジ割り込みでクリア」と書いてある部分)。0.25秒未満の短い間隔では決して最大値には達しません。

ところが、データを送出し終わってしばらくデータが来ないとTimer1を強制クリアする機会がなく、そのまま増加し続け、0.25秒経過の後ついには最大値=比較一致レジスタの値に達します(図の「比較一致」)。つまり、この時点でデータの区切りが訪れたと認識するのです。プログラムでは比較一致割り込みを起こさせるようにしてあり、そのハンドラの中でバッファポインタを先頭に持ってくる、つまりデータの頭出しをすることになります。以下は再び"interrupt.c"の該当部分です。(行間が空いているのはCPUタイプによるIF-DEFを消して見やすくしたためです。)

// スケールのデータ送信間隔を測る



ISR(TIMER1_COMPA_vect)

{
Rbufp = Rbuf; /* バッファポインタを先頭へ */
}

2009年3月27日金曜日

TinyでDRO!(ソフトウェア1)

ソフトウェアの説明です。例によってSourceForgeで公開します。


ヒューズの設定はZIPファイルの中のFuseMapping.jpgにAVRStudioの(中のAVRProgの)設定画面のスクリーンショットを入れてありますので参考にしてください。また、ソースコード中にもコメントで書き込んであります。要は内蔵RC発振器をONにして、1/8分周をOFFにするということです。

今回のプログラムの要点は、スケールから送られてくるデータをクロックに同期して取り込むこと、そして直列で送られてくるデータを切り出し---つまり頭出し---することです。

まずマクロな視点から。データブロックは約0.3秒の間隔でスケールから出力されています。


クロック(CLK)は出っぱなしではなく、データ(DATA)が送られるときのみ出ているのが分かります。クロックが出ていないときは論理"0"(-1.5V電位)にスタックしています。データブロックの部分をクローズアップしてみます。


クロックはデータ出力開始直前に"1"(GND電位)となり、しばらくしてからクロッキングを始めます。クロック周期は約12usですので、周波数にすると約83kHzです。

データは2種類送られてきます。先に絶対座標のデータ、後に相対座標のデータです。絶対座標はそのスケール固有の位置情報で、原点が絶対にずれることはありません。相対座標はスケールのゼロクリアボタンを押すごとに原点を設定するもので、通常はこちらが使われることになります。

これらのデータは24ビット長で、クロックパルスに同期して順次最下位ビットから送り出されます。図でA0~A23が絶対座標、R0~R23が相対座標です。R24(ダミー)と書いてあるビットがありますが、これは本来は取り込まないビットで、後ほど説明します。

図で分かる通りクロックの立下りエッジでデータを取り込むとよさそうな感じです。実際のプログラムでは、AVRに入ってくるときにレベルシフタにより論理反転していますので、クロックの立ち上がりエッジで捉えることにしています。ここでファイル"interrupt.c"の該当部分。(コメント部分で改行されてしまい読みにくいのでコメントをちょっといじってあります。)

// スケールからのデータ取り込み。検出エッジは立上がりエッジ。
ISR(INT1_vect)
{
*Rbufp++ = SCALE_PIN; /* 読んでバッファにためる */
if (Rbufp >= Rbuf + sizeof(Rbuf)) {/*バッファ端*/
Rbufp = Rbuf + sizeof(Rbuf) - 1;
Updated = 1; /* main()に更新を通知 */
}
TCNT1 = 0; /* 送信間隔タイマーをクリア */
}
INT1は立ち上がりエッジを検出するように設定されています。重要なことは割り込みセンスから割り込みプログラムが起動されるまでの時間がかなりかかることです。あまり時間がかかるとデータを読みそこなってしまいます。割り込み処理のシーケンスは、
  1. INT1エッジ認識
  2. 割り込みハンドラに分岐
  3. 使用するレジスタ群を退避
  4. ユーザの定義した割り込み処理プログラムを実行
上記の1.から2.までで約4クロックかそれ以上かかり、これはAVRハードウェアによるオーバーヘッドですので回避不能です。3.はコンパイラの出力するコードによるオーバーヘッドが含まれ、アセンブラで書かない限りは制御はやっかいです。コンパイラのアセンブラ出力を見るとここに16クロックかかっていることが分かります。そこでこの割り込み処理では、スケールのDATAがつながっている入力ポート(上記リストの"SCALE_PIN"=PIND)を何はともあれ読み込んで、バッファにためることだけを行っています(52行目)。その際にそのビットを抽出するなど余計なことはやっていません。ちょっとでも複雑なことをしようとすると、コンパイラはためらうことなくたくさんのレジスタを使おうとして、それらを退避するコードを割り込み処理の冒頭に突っ込んでくるからです。

今回データ読み込みはすべてクロックの立ち上がりエッジ(タイミング図上では立下り)で検出しているので、前出のタイミング図では、データ送出終わった後にクロックが"0"スタックする時点でもうひとつ検出エッジが来てしまいます。これが「R24(ダミー)」と書いてあるゆえんです。プログラムではこの部分も愚直に読み込んでしまうことで、割り込みプログラム中の無用な条件判定を回避しています。読み込んだとしても値を集計するときに使わなければいいのです。

2009年3月25日水曜日

TinyでDRO!(ハードウェア2)

このプロジェクトで何が一番難しかったかって、デジタルスケールにどうやってケーブルを接続するか考え出すことでした。プラグインできる汎用のコネクタなどありませんし、かといってケーブルをじかに出すのは気が引けるし。逡巡したあげく結局どこかのサイトで見た、コネクタヘッダをはんだ付けする方法を取りました。出来上がりはこんな風になります。



スケールを完全に分解する改造です。メーカー保証はあきらめましょう。分解して基板をむき出しにしたら基板用コネクタヘッダをはんだ付けします。基板エッジにでている接点パターンは、きちんと計測すると1.65mmピッチくらいだということが分かるのですが、ここでは2.0mmピッチのこれを使いました。4ピンなのでぎりぎりこれでも大丈夫です。ただ、このコネクターは非常に熱に弱くて少しでも余分に長くこてを当てようものならコネクタハウジングが融けてピンが泳ぎだすのが難点です。少々高くても他のメーカーのものを使うのが賢明でしょう。なお、分解しないで無理やりはんだ付けする方法もありますが、スケールのケースが溶けるのでお勧めはできません。後述のコネクタカバーが閉まらなくなってしまいます。



組み立てる前にスケールのプラスチックカバーの加工をします。下の写真の緑の四角で囲んである部分を削り落します。こうしないとコネクタヘッダの下半分が干渉してしまうからです。



組み立てた後はこうなります。


このままだとコネクタカバーが閉まりませんのでこいつも加工します。左下から11.0mm×2.5mmだけ削り込んでやると…

下側の「ツメ」がぎりぎり0.5mmほど残ります。このおかげでパチンと小気味よくカバーが閉まります。このポストの最初の写真がカバーを閉めたところです。

2009年3月19日木曜日

TinyでDRO!(ハードウェア1)

このシステム全体は+5V電源で動作するようになっています。5V出力のACアダプターで直接給電です。それを前提に回路の説明です。

図の左端にはスケールからのクロックおよびデータの信号入力があります。スケールの電源は電位の高いほうがフレーム=GND電位で、低いほうが-1.5Vと通常とは逆の電位になっているので、C3およびC4による容量結合で4049(hex inverter, IC1)でレベルシフト、増幅しています。4049から出力された両信号は元の信号の反転になっています。これらはTiny2313のポート入力につながります。

左上のNチャンネルMOSFET uPA2753GR(Q7)はゼロクリアをスケールに対して送るためにあります。ポート出力でスケールのGNDとクロック線を(抵抗を介して)ショートさせます(スケール本体のZEROボタンを押したのとまったく等価と思われる)。

図の上半分はLEDドライブ回路です。Tiny2313の少ないポートでこれだけのLEDセグメントを駆動するためダイナミック点灯をさせることにします。数字が6桁すなわちデューティ1/6なので、見掛け上の明るさを稼ぐために1セグメントあたり20mAずつ流します。1コモン端子あたりの最大電流は、7セグメント+1DPで8素子ですから×8で、160mAです。ドライブ用トランジスタをポピュラーな2SA1015ではなく2SA950にしたのはこのためです。実は160mAというのはTiny2313の「全ポートのIOLの合計が60mAを超えるべきではない」という注意書きから外れています(前モデルの90S2313にすればこの条件が100mAと若干軽減されます)。本来ならばドライバトランジスタを挿入するべきでしょう。…が、とりあえず動いているのでまあいいかと。

LEDコモンのドライバトランジスタの選択に74HC138(3-to-8 decoder, IC3)を使用しています。Tiny2313のピン数が足りないための苦肉の策。リセット直後のポート出力が確定していない時期に、特にフラッシュ書き込みを行っている最中に変な表示が出ないように、リセットが利いている間は出力を禁止するようHC138のG1にリセット線を接続しています。

図の右下にダイオードを介してスイッチがつながっているのが見えます。LEDの(ダイナミック点灯のための)スキャンをキーのスキャンにも利用しているのです。これもやはりポートが足りないのが理由です。LEDはダイナミック点灯により約360Hz周期で切り替えますので約60Hzで1周します。キーのスキャンにはちょうど良いくらいの周期です。この方法ならばあと4つもスイッチを増やすことも可能です。なおダイオードと反対側のスイッチの端子は1つの入力ポートに集められます。この入力ポートはプルアップされてなければいけません。ダイオードの役割は2つのスイッチが同時にONになったときHC138の出力同士がショートしてしまうのを防ぐためにあります。逆流防止ダイオードとかいいますね。

Tiny2313にはセラロックが接続されているように書いてありますが、内蔵のRC発振回路で十分だということが分かりましたので、実際は接続しません。ただ、90S2313を使用する場合は必要です。RC発振回路が内蔵されていないからです。

回路の簡単な説明でした。次は基板を設計してOLIMEXに発注するのですが、先人が苦労されてきたとおりやはり最初は一筋縄ではいかずちょっと苦労しました。その話はまたいずれ。

基板が届くまでにずいぶんと時間がありますから、その間にソフトのコーディングとブレッドボードによるプロトタイピングです。これはそのときの様子です。ここまでちゃんと動くのに結構悩みました…。

2009年3月18日水曜日

TinyでDRO!(概要)

以前このブログでデジタルスケールをフライスに装着した話を載せました。その中で、「そのうちLEDの表示器作ろっと」と書いたとおり作ってしまいました。

まずは先例の調査から。ググるためにはまずキーワードが必要です。「デジタルスケール」ちゅう言葉は実は「デジタル式の秤」--つまりキッチンスケール--の意味のほうが(英語でも)一般的らしい。いろいろ探し回ったところ、こういうのは「DRO (Digital Read-Out) 」と言うのだということが分かりました。NCフライスなどを使ったことのある人にとっては当たり前のことかもしれませんが、知らなかったなぁ…。あと、まったく同じメカニズムを持つ「デジタルノギス」「Digital Caliper」なども検索キーワードとしては役に立ちました。

果たして信号の解説をしているサイト(ここここ)や製作例を掲げるいくつかのサイト(ここここ)が見つかりました。信号の解説をしているサイトによれば、また、自身で測定してみたところこのデジタルスケールの信号は以下の特徴があることが分かります。
  • クロック線と1本のデータ線を持つ同期式シリアルである。
  • 電源はGNDと-1.5V。GNDはフレームに落ちている。
  • データは24ビットの2の補数で、最下位ビット(LSB)から送られてくる。
  • 1回のデータ送信で2つのデータ--先に絶対座標、後に相対座標--がつながって送られる。
  • データの送信間隔は約0.3秒。
  • クロックの周波数は約80kHz。データ送信していない間は-1.5Vに固定されている。
  • データの取り込みはクロックの立下りエッジで行うのが妥当。
  • 外からクロック線をGNDレベルに落とすことでゼロクリア信号入力となる。つまりZEROボタンを押したのと同じ。
  • 外からデータ線をGNDレベルに落とすことでモード切換え入力となる。これ相当のボタンは本体にはない。
  • スケール本体の電源がOFFでも信号だけは出力され続ける(液晶画面は消えている)。
負電圧になっているのが嫌だなあと思いつつ、ここは挑戦です。以下の目標を掲げて突進です。
  • とにかく安い部品を使って仕上げる。そのためATTiny2313を使う。できれば部品箱に眠っているAT90S2313でも動くようにする。
  • 軸ごとの独立とする。つまり、X・Y・Z軸それぞれに1基板を使う。
  • ボタンはゼロクリアとミリ/インチ切り替えのみ。
  • 枚数の少ない試作基板では一番安価と思われるブルガリアのOLIMEXに基板を発注する。
  • 最近になって秋月で販売し始めたプラスチックケース(195×110×76mm)に収める。これは500円で非常に安価だ。
  • スケール本体から出すケーブルにはUSBケーブルのデバイス側をちょん切って使う。切ったところに2mmピッチ×4ピンのコネクタをつける。
  • スケール本体から出るケーブルとDROの接続はUSB(A-Type=ホスト側)を使う。安く上げるため。A-Typeメスのパネル取り付け用ケーブルが2本入りで280円(@千石)。
  • 基板以外は1軸あたり1,000円程度に抑える。
写真は完成して動作させているところです。上からX軸、Y軸、Z軸なのですが、Z軸にはスケールそのものがついていない(まだ買ってない…)ので消えたままになっています。次回はハードウェアの説明をします。