ラベル KOZOS EXPBRD #00 の投稿を表示しています。 すべての投稿を表示
ラベル KOZOS EXPBRD #00 の投稿を表示しています。 すべての投稿を表示

2014年7月27日日曜日

KOZOS for Blackfin "BlacKOZOS"の設計方針

UOS-LPC800

UOS-LPC800を公開してから早くも一年が経ちました。
思いっきり遊びでしか使えない感じのOSが一部の方に好評で、ここでも述べたようにadafruitでも紹介されたりもしています。


本当は公開後に色々機能追加する事を考えていましたが、LPC-810と組み合わせて紹介されているので、彼に入りきらなくなるのは可哀想です。どうしようかな?と考えていたら1年が経過していました。あらら。

KOZOS

UOS-LPC800は、坂井さんがお作りになったKOZOSが制作のきっかけになっています。


KOZOSは、完全ホビー向けOSでありながらソフトウェア割り込みを使ったシステムコールによる操作を実現するなど、とても興味深い作り込みになっています。坂井さんによるユニークなキャラクタであるニジマス君も見逃せません。

坂井さんの書籍が販売されてから私も早速購入して色々な活動に取り組みました。

"BlacKOZOS" - KOZOS for Blackfin

あれから二年ほど経ち、現在は主にBlackfinを使って色々遊んでいます。
私の場合、新しいプロセッサをいじる場合には、クラスの中で小さいものを選んで使う事にしています。現在はBF592というプロセッサで離散的に遊んでいるのですが、この小さなプロセッサでキビキビ動作するOSを書いてみたくなりました。

名前も決めてあって、BlackfinとKOZOSをかけて、BlacKOZOSです。
とてもブラックな感じ。「ブラッコゾス」です。「ブッコロス」ではありません。

本体OSは何もないのに、キャラクタはもうあります。
完全に順番を間違っています。


"BlacKOZOS"の設計方針

設計は以下のように進める事にしました。

①普通に動作するだけのプログラム

普通に動作するだけのプログラムが、どうしてOSに発展するのか理解できないかもしれませんが、最初のタスクしか実行できないところから"BlacKOZOS"の開発をスタートさせる事にしました。これは、まさにOSを使うことで解決したい問題を提示した形です。ざっくり言うと、複数の仕事を並行し、かつ効率的に処理させたい、複数の仕事を協調動作させたい、という課題。


②割り込み関数でレジスタの退避と復旧

次に、①で動作している仕事を一切阻害する事なく、割り込み処理の中で①で使っているレジスタを退避、復旧させます。ここでは、コンテキストスイッチ、つまりタスクの切り替えは行わず、退避したレジスタをそのまま復旧させます。レジスタ周辺の操作は少しでも間違えると動作しません。このコンテキストスイッチなしのレジスタ退避復旧処理は、正しく実装できた時点で、みかけ上①と同じ処理を提供する事になります。つまり、レジスタの退避と復旧を正しく行いながら、依然としてかなり単純な実行モデルを維持できます。


③コンテキストスイッチを追加する

レジスタの退避復旧が実現できたら、コンテキストスイッチを追加します。②を先行させる事にはもうひとつ別の理由があり、②が実現できた時点でコンテキストスイッチは基本的にC言語で記述できるようになっています。どういうことかと言うと、レジスタ退避作業によって実行中のコンテキストを復旧するためのレジスタは保存されているので、それらをかなり自由に使うC言語を使ってレジスタを汚しても、レジスタ復旧で必要な値へ復旧できるわけです。リンクリストを辿ったりする作業をアセンブラで書くのも面倒なのでうってつけというわけです。


まとめ

今回は大雑把な設計方針について明らかにし、作業の道筋を立てました。
Blackfinの場合、割り込みマスクの取り扱いが1つのポイントかもしれません。
その辺りも後々触れていければと思います。

2012年9月30日日曜日

「茶室で楽しむKOZOS拡張基板」企画の開催報告 ~少し優しい気持ちになって、いつもと違うく組み込み開発を!~

「茶室で楽しむKOZOS拡張基板」企画の開催報告です。

2012年09月30日追記:
@kanpapaさんが別途レポートをまとめてくれました。
雰囲気がよく出ているのでそちらもお楽しみ下さい。
ウェブサイトきょうのかんぱぱ「茶室で楽しむKOZOS拡張基板に参加してきました」のページです。

まずは、なぜ会場に都筑民家園を選んだのか?について。
キーワードは「少し優しい気持ちになれる」です。


駅周辺は商業施設でごちゃごちゃしています。
しかし、少し離れるだけで田舎の雰囲気を味わえるという場所。




弥生時代の集落がそのまま復元されています。



都筑民家園は、約200年前の家を移築したもの。
私のお気に入りは屋根の構造です。





で、ここをぶらりと訪れた時に繋がったのがKOZOS拡張基板だったわけです。


皆様にいつもと違う環境で組み込み開発して頂ければという企画でした。


茶室を除けばそこは組み込み開発室。(プライバシーに配慮してぼかしてあります。)


茶室の横を流れる水の音を楽しみながらの開発は、今までに味わったことのない楽しさを提供してくれました。


こんな感じで、茶室と組み込み開発の不思議なコラボレーションとなりました。


ちなみに、KOZOS拡張基板は当然ながら全て無事に動作しました。
まぁこれが当たり前なのですが、主催者としては一安心というところ。
(KOZOSのブログ:オープンソースカンファレンスでの展示の様子も是非!)


参加された皆様には、後からでも楽しめるようにちょっとした資料も一緒にお渡ししました。


組み込み開発は、どうしても世知辛い事になりがちです。
開発の性質上仕方のない事ですが、常に違う視点も取り入れる工夫を続けたいですね。

お忙しい中御参加頂いた皆様、ありがとうございました。
はるばる遠方(大阪府!福島県!)からお越しいただいた方、ありがとうございました。

2012年9月23日日曜日

小規模組み込みシステムで使えるBASICインタプリタをKOZOSと同時に楽しむ! (NT-Basic on KOZOS)

先の記事「NT-Basic on KOZOSのために・・・ (NT-Basicの改良)」では、小規模組み込みシステムで使用可能なBASICインタプリタであるNT-Basicの改良を行ないました。

やっとこさ使えそうな物になってきたので、NT-Shellと組み合わせてKOZOS上で動作させてみました。

[フレーム]

デモの中で流れている音楽は、KOZOS EXPBRD上に搭載されたマイクロSDカードから再生しています。
と同時に、シリアルコンソールからBASICインタプリタを楽しむ事ができるというのが今回のデモです。

何かオペレーティングシステムを使っているからこその動作が欲しかったので作ってみました。

端末の処理はNatural Tiny Shell (NT-Shell)の処理系を使用しています。
自然な入力が可能で、入力処理が破綻せずスムーズにプログラムの編集ができます。

KOZOS EXPBRDには、グラフィックLCDや入力スイッチが搭載されています。
NT-Basicに命令を追加してグラフィック制御などもできるようにするとゲームも作れそう。

NT-Basicの拡張でKOZOSも使うからKZ-Basicなんていうのも洒落ています。
KZ-Basic (拡張NT-Basic)という名称で拡張していく事を考えています。

今回のソースコードは「茶室で楽しむKOZOS拡張基板」でもお渡しする予定です。

2012年9月22日土曜日

NT-Basic on KOZOSのために・・・ (NT-Basicの改良)

NT-Basic on KOZOS(NT-Basicの改良)

SWEST14での刺激を受けた結果、インタプリタの実装に興味が出てきてNT-Basicなるものを出力しました。

それではという事でKOZOSと組み合わせて使おうと思ったのですが、実際にあまり使い勝手が良くなかったのでNT-Basicの改良から行うことにしました。

エディタが必要だ

KOZOS上で実際に動作させる場合、単にファイルシステムからコードを読み込んで動作させるだけでは面白くありません。ターミナルエミュレータから実際にコードを入力して実行するようなインタラクティブな動作を実現したいのです。

この時に必要になるのが実用的なエディタです。入力を間違えても再編集できて、昔ながらのBasicシステムに似たような動作を提供できるのが理想です。viのように本格的なエディタを設計する気分にはなれなかったので、以下のような戦略をとることにしました。
  1. 行編集機能はNT-Shellを用いて機能提供する。
  2. プログラムは新たに作るtexteditモジュールが保持する。
  3. ターミナルにrunコマンドを与えた時点でイタンプリタを動作させる。
こうする事でtexteditモジュールのみを設計実装すれば済みます。
texteditモジュールのインターフェースは以下のようにしました。

int textedit_init(textedit_t *p);
int textedit_clear(textedit_t *p);
int textedit_insert(textedit_t *p, const int line_number, const char *text);
int textedit_delete(textedit_t *p, const int line_number);
int textedit_fetch(textedit_t *p, const int line_number, char *text, const int maxsize);

NT-Basicはプログラムを文字列として受け取ります。
エディタを設計するならば、内部データは双方向リンクリストで構成する行データの集合として表現したいのですが、NT-Basic側の都合に合わせて単純な一つの文字列で複数の行編集が可能なtexteditモジュールとして設計しました。

これでプログラムの編集は実現できます。

プログラムエラー発生時の挙動修正

初版のNT-Basicでは、プログラムエラーが発生した時に最終的にハードウェア抽象化層のhal_halt関数を呼び出していました。この関数は無限に処理を返さない関数として実装する事を想定しており、「プログラムエラー=処理を永遠に返さない」というあんまりな挙動を提供する結果を生んでいました。

「それはないだろう」という事で、エラーを検出した時点で、そこから最終的にntbasic_executeまでエラーを伝搬させるようにしました。HAL層にhaltがあると意味がわからないので、hal_haltは削除しました。ちなみに、c89で上位にエラーを伝搬させるのは丁寧に実装するしかない、みたいな感じの実装になっています。

上位でエラー発生時の行番号の取得も可能です。

NT-Basicの実行方法

初版の実装でもう一つ致命的に使いにくいのが、実行方法でした。ntbasic_executeは、実行したらプログラム終了まで処理を返さないという仕様だったのです。が、これではベアメタルシステムで使いにくくて仕方ありません。NT-Basicでチョコチョコ処理をしながら、別の作業をさせたい事もあるわけです。

実際に使ってみると、先ほどのエラー時の挙動と合わせて組み込みシステムで実質使えないような挙動になっていました。

そこで、改良したNT-Basicでは、ntbasic_executeを呼ぶ度に1ステートメントのみ処理するように仕様を変更しました。こうする事でベアメタルシステムでもNT-Basicを導入しやすくなります。

 ntbasic_t ntbasic;
 ntbasic_error_t error;
 /*
 * Setup and execute.
 */
 error = ntbasic_setup(&ntbasic, program);
 while (error == NoError) {
 error = ntbasic_execute(&ntbasic);
 }
 /*
 * Check the termination code.
 */
 if (error != EndOfTheProgram) {
 core_error_message(&ntbasic, error);
 }

上記のような簡単なコードを上位に加えれば従来のような使い方もできます。

辛かった変数名の制限

最初の実装では変数名はAからZまでの26文字という小さなBasicではありがちの制限を持っていました。

実際にプログラムを組んでみるとわかるのですが、これがかなり辛い制限です。
「あれ?この変数は何を入れてるんだっけ?」みたいにすぐに迷子になれます。
「えーと、Rはアレの略にしたから・・・、で、Aは・・・何だっけ?」みたいに脳内記号表を使う羽目になるわけです。本来、これは機械にやらせるべき作業内容です。

そこで、自由に変数名を付けられるような仕様変更を行いました。


内部設計と実装は至ってシンプルです。
小さな記号表モジュールを作って対応しました。

記号表の考え方は非常に面白いものです。
ここでハッシュ法を使った動作を簡単なモデルで紹介しましょう。

ハッシュ法を用いた記号表の実現

記号表は、変数名や型、長さやその他属性を管理するテーブルです。
NT-Basicの場合、変数は内部的にintしか持たないので型や長さは存在しません。
記号表における一番シンプルな例という事になります。

で、与えられた変数名から実際の値を取りだす場合、テーブルを探索する事になります。
線形探索した場合、最悪の場合テーブルのサイズ分の文字列比較作業が必要になります。


上記の図でGHIという変数を探索した場合、先頭から3番目で探索完了になりますが、実際にテーブルの最後に存在した場合、テーブルサイズ分の探索作業を行なう事になります。

これでは変数にアクセスする度に膨大な時間が必要になるので効率的とは言えません。
そこで考えられたのがハッシュ法です。

基本的な考えは非常にシンプルです。

まず、与えられた文字列から導出可能なハッシュ値を得ます。
このハッシュ値は文字列から得られる値で、同じ文字列からは毎回同じ値が得られます。


次に、この得られたハッシュ値を元にテーブルの参照先インデックスを決定します。
例えば、参照先インデックスとして28という数値が得られたら、記号表のインデックス28を参照するという仕組みです。

有限長のテーブルの場合、「参照先インデックス % テーブルサイズ」などとして参照先インデックスを決定します。


整理すると「文字列からハッシュ値」、「ハッシュ値からテーブル参照先インデックス」という過程で、変数名を与えるだけで一意に決まる(ように見える)インデックス番号が求まりました。

さて、ここで疑問が沸いてきます。
仮にテーブルのサイズが16だったとして、ハッシュ値0と16の結果はどうなるでしょうか?

先ほどの例では「参照先インデックス % テーブルサイズ」なのでテーブルの参照先がどちらも0になってしまいます。

変数名として与えられた文字列が異なるものなので、理想的には得られたハッシュ値は異なる結果となります。それにも関わらずテーブルの参照先が同じになってしまいました。

安直な実装の場合、参照先インデックスに格納されている変数名と照合して、合致すれば期待する変数が格納されているものとして処理します。

そして、期待する変数名でなければ近い位置のテーブルを探します。
これにより、線形探索よりも遥に少ない処理で期待する変数値を得ることができます。

実際には、ハッシュ値自身の衝突も考える必要があります。
ハッシュ値自身の衝突の場合も、上記のように期待する変数でなければ近い位置のテーブルを探索するという方法を取ります。

ちなみに、流石に上限なしで対応させるとメモリが幾らあっても足りないので、デフォルトの定義では変数名8文字、変数32個までにしてあります。これはヘッダファイルを書き換えるだけで大きくする事ができます。組み込むシステムに合わせて定義を修正すれば良いでしょう。

この改良によって、以下のようなプログラムが見違えるように判りやすく書けるようになります。
以下はアリスとボブとキャロルの年齢を総計として出力する例です。(ちょっと無理矢理な例)

改良前
INPUT "A=",A
INPUT "B=",B
INPUT "C=",C
T = A + B + C
PRINT "T=",T

改良後
INPUT "Alice=",Alice
INPUT "Bob=",Bob
INPUT "Carol=",Carol
Total = Alice + Bob + Carol
PRINT "Total=",Total

まとめ

今回は小規模組み込みシステムで楽しむためのNT-Basicの改良として、実行方法、エラー時の挙動、変数名の制限について改良した内容について示しました。

ちなみに、NT-Basicは総行数が約2000行とコンパクト。
1人で簡単に読み切れるサイズです。

--------------------
LinesFile
--------------------
438core.c
281expression.c
109hal.c
106main.c
157ntbasic.c
269ntlibc.c
443statement.c
111tinyrand.c
135variable.c
--------------------
2049Total

最新のリリースは以下からダウンロードできます。
http://shinta.main.jp/firmware/ntbasic/ntbasic_ja.html

2012年9月17日月曜日

KOZOS拡張基板KOZOS EXPBRDを使ったミュージック・プレイヤー

いよいよ2012年9月29日に「茶室で楽しむKOZOS拡張基板」を開催します。

例えばどんな事ができる拡張基板なのかイメージが掴んで頂く為に、応用例としてミュージック・プレイヤーを仕立ててみました。

[フレーム]

アプリケーションはブートローダ経由でDRAM上に展開してブートしています。
SDカードからブートできるのでパソコンなしでKOZOSの実行が可能!

ブートローダもアプリケーションもソースコードを公開しますので御安心下さい。
どんどん改造して自分好みに仕立て上げる事ができます。

既に定員に達している本企画ですが、見学も大歓迎です。
http://atnd.org/events/30481で見学希望の旨を書いて登録して下さい。

2012年7月23日月曜日

秋の特別企画「茶室で楽しむKOZOS拡張基板」の基板実装を完了させました

一点一点お家で手作り

ATNDで大募集していた「茶室で楽しむKOZOS拡張基板」 の実装を完了させました。
ミスタードーナツさんではないですけど、本当に一点一点お店で、じゃなくてお家で手作りしました。


この基板は、総部品点数が68で、半田付け箇所は300箇所を超えます。
今回は10台製造したので、総部品点数は680個、半田付け箇所は3,000箇所を超えるということになります。これはしんどいわけです。

たった10台、されど10台。
意外に動作確認も大変なのでブートローダ側も機能検証用の機能を盛り込みました。
スタートアップ時の動作を見ると基本機能が動作しているのかわかる仕組みです。

LEDを点灯させ、音声を出力し、SDカードの有無を検出し、SDカードからデータを読み、ディスプレイに表示を行ない、と初期化の後であれこれのデバイスを使うようになっています。

ブートローダの段階で基板の基本機能検証ができますから、わざわざOSをブートさせなくても済むという仕組みです。

後はエイジングと最終機能検証を行って、「茶室で楽しむKOZOS拡張基板」 に挑む事になります。


この基板実装を外注に出した時の試算

これを外注さんに出した時の事を考えて(出す予定はありませんけど)、P板さんの実装サービスで試算してみました。



なるほど。
昨今、思ったほどの驚き価格ではないのですね。

パッケージ

ちょっと余談ですが、半田付けに飽きた時に現実逃避でパッケージも考えました。
皆様にお届けするのに「基板だけぽーん」とか「段ボール箱にボコン」なんてしません。



こんなパッケージに収めて参加者の皆様にお届けします。
お楽しみに!

2012年7月21日土曜日

KOZOSのタスク間通信を可視化するツールを作ってみた (ipcrvt.sh : KOZOS IPC Relationship Visualization Tool)

概要

先週はKOZOS EXPBRDのサンプル・ファームウェアを設計と実装を行なっていました。

サンプル・ファームウェアでは、SDカード上にあるmp3ファイル読み込みながら、mp3デコーダを制御し、赤外線リモコンやユーザ入力を受け付け、ディスプレイの表示をし・・・と沢山の仕事をKOZOSを使ってこなしています。


組み込みシステムでは、システムが提供する機能をある処理単位に分け、複数のタスクに分割した上で所望の機能を実現するために協調動作させるように設計します。
一見複雑な制御も、単純な動作になるまで分けて考えていく事で設計と実装を容易にする事が出来ます。

組み込みシステムの場合、ある出来事(イベント)を中心に動作を実行するイベント駆動型としてファームウェアを設計するのが通例です。タスクは基本的に他のタスクから受けたイベントを起点に動作します。あるタスクが他のタスクにイベントを伝える事を、「タスク間通信(Inter Process Communication)」と言ったり、OSによっては「メッセージ・パッシング」と呼びます。

上記のように設計する事で、タスクとタスクの間の依存関係は非常に緩いものにする事ができる他、新たな機能を付け加えやすくなったり、デバッグが容易になったりします。

しかし、設計文書でいくら図示してあったとしても、実際にコードに落とし込んだ段階でそれらの情報は失われてしまうため、後からコードを見た第三者がファームウェア全体の挙動を把握するのには非常に時間がかかります。

今回は、このような時に便利な方法として内部タスク間コミュニケーションを可視化するツールを作ってみましたのでご紹介します。

今回は茶室で楽しむKOZOS拡張基板の企画もあるので、KOZOSを題材に実装してみました。

実例1

KOZOSの作者である坂井さんがお作りになったTCP/IPアプリケーションを題材にしました。
http://kozos.jp/kozos/h8_2_06.html

まずは下の図をクリックして大きくしてご覧下さい。


KOZOSのタスク間通信は、kz_sendとkz_recvとkx_sendから構成されています。
図を見てわかるように、タスク(及びそれっぽいもの)が丸枠で囲われたもので表現されています。
メッセージ通信の橋渡しとなるメッセージボックスが長方形で表現されています。

それっぽいものと書いたのは、ソースファイル名で抽出しているので必ずしもタスク名とイコールでないこともあるからです。

上記を見てわかるように、ソースコードを眺めて関係性を把握するよりも遥かに直感的です。
実行方法は簡単でシェル・スクリプトをKOZOSアプリケーション・ディレクトリで実行するだけ。

実例2

ちなみにKOZOS EXPBRDのサンプル・ファームウェアにも適用してみました。
こちらは少し改造したシェル・スクリプトですが、だいたい同じものです。


こんな感じでKOZOSで構成した各タスク間のタスク間通信の関係をひと目で把握できます。

実行方法

リソースからサンプル・コンテンツをダウンロードして下さい。
ipcrvt.shをKOZOSアプリケーション・ディレクトリで実行して下さい。
外部依存は幾つかのコマンドとGraphviz/dotのみ。
簡単なシェルで構成されているので改造も容易です。
オプションは取りません。


リソース

坂井さんが実装されたTCP/IPアプリケーションのコードと、可視化スクリプトipcrvt.shを同梱したパッケージです。
ipcrvt.tar.gzをダウンロード

まとめ

現状のipcrvt.shは、まだまだ表示したい情報が欠けいていますし、随分と荒削りな設計と実装です。

しかし、ソースコードを目視で把握するよりも遥かに早いスピードで関係性の概要を把握する事ができるという点で、第1段階のアプローチとしてはまずまずな結果と言えるでしょう。
このツールを使って関係性の概要を把握した上で、ソースコードを読み解いていけば理解が素早く理解を深める事ができる気がします。

また、組み込みシステムで特に意識する必要のあるタスク間通信の学習においても、有用なツールの一つとして役立てることができそうです。

今回はKOZOS向けにシェル・スクリプトを構成していますが、同様の考えを使って他のRTOSでも使用する事ができます。

2012年6月24日日曜日

茶室で楽しむKOZOS拡張基板 (田舎のゆったりした雰囲気とKOZOSのワクワクする世界を同時に楽しむ!)

先月から取り組んでいたKOZOSを32倍くらい楽しむための拡張基板を使った新しいお楽しみ企画を実現する方向で検討しています。


「茶室で楽しむKOZOS拡張基板」という一風変わった企画なのですが、いつもと違う環境でエンジニアリングに取り組んで頂ける上、ゆったりした雰囲気で心も体もリフレッシュという算段です。


詳細は決まるまでお話できないのですが、場所は神奈川県内です。


チラシ原稿を作ってみました。こちらをご覧ください。

2012年6月12日火曜日

KOZOS EXPBRDの最終組み立て (廣杉計器さんのスペーサが届いたので組み立てた)

先日のアクリル発注に引き続き、廣杉計器さんからスペーサを購入しました。
廣杉計器さんは、個人相手でも取引してくれる上、最小発注数は50からと敷居はとても低いです。
今回で言うと、豊富なスペーサの中から選んで発注できるのが嬉しいです。

水平方向の検討は先日の記事のとおりですが、今回は高さ方向です。
今回はひとまずノギスで測って実測ベースでスペーサを選定しました。


以下のように、どこに何が入るのかを整理します。
きちんと書いておかないと、発注漏れとか平気で起きてしまいます。



発注して翌営業日には届いていました。

最小発注数は50ですが、例えば4箇所止める設計で10台も作れば40個です。
個人でも使いきれる数量ですね。


KOZOS EXPBRD #00は、秋月電子通商のH8/3069Fネット対応マイコンLANボードを裏返して使う設計です。
土台が以下のような感じで完成します。


その上にKOZOS EXPBRD #00が載ります。


組み立て完成時の写真がこちら。


結構分厚いです。


基板設計だけならまだしも、外装を考え始めると色々と別の事も考えなくてはいけません。
電気と機械の関係を考える事で、今まで出来なかった新しい事も出来そうだなぁと考えています。

暫くは「外装を考える価値を見出せない基板設計はしない」というポリシーを持とうかと考えているところです。

2012年6月6日水曜日

SDカードからブートしたKOZOSを使ってニジマス君を動かす

KOZOS EXPBRD #00のハードウェアデバッグのためにジャンクコードを量産しましたが、
集大成として(←何の?)ニジマス君をロータリーエンコーダーを使って動かすテストをしました。

まぁ、テストというよりもネタです。
すみません。

[フレーム]

SDカードからブートできるようになったので、パソコンいらずでKOZOSを起動させる事ができます。
テストプログラムでは、DRAMを使っていますので巨大なプログラムでも余裕でロード可能。

mp3デコーダチップを使ってスプラッシュサウンドを出力したり、赤外線リモコンを使えます。
ありきたりですがmp3プレイヤーとかを作ってみるのが楽しいかも。

デバッグ用の基板実装にスイッチサイエンスさんから入手したリフローグッズを使おうと思ったのですが、「部品実装のデバッグ」より「基板設計のデバッグ」を優先させたので、結局できませんでした。

何台か作る時には是非試したいなぁ。

2012年6月5日火曜日

EAGLEの図面からアクリ屋ドットコムさんに頼むアクリル外装部品のサイズを簡単に得る方法

この記事あの記事で外装に関する話題に触れたわけですが、基板との関係に触れていない事に気付いて簡単に紹介してみたくなりました。

EAGLE V6からは、新しく基板上のコンポーネントのサイズが計測できるようになりましたが、実際に試してみたところ、現状では実際の設計に役に立つ動作をしているように思えませんでした。
EAGLE内で完結して外装まで注文できる形になると良いのですが、あまりうまくいきません。

ここではEAGLEで基板設計した後で、アクリ屋ドットコムさんに頼むアクリル外装部品のサイズを簡単に得る方法を紹介する事にします。

まず初めに、EAGLE上でボードファイルを開き、dxf.ulpを実行します。


オプションダイアログが表示されます。
3つのチェックボックスの全てのチェックを外して下さい。
これは、後で用いるRootPro CAD Freeの動作と関連があります。


OKボタンを押したら書き出しが実行されます。
次に書き込んだファイルをRootPro CAD Freeで読み込みます。


オプション選択ダイアログが表示されますが、デフォルトのままで構いません。


読み込みが完了すると以下のようにEAGLEのボードファイルで見たような画面が表示されます。
これで下準備は完了です。


さて、アクリ屋さんですが、セミオーダー加工時に指定可能なサイズは0.5mm単位となっています。

基板設計時に明確に決めておかないとズルズルとインチ系のままになっている事が多いわけですが、今回の基板も例にもれずインチ系のグリッドに穴やら基板外形が乗っています。あらら。

この場合、完璧主義に陥ってインチ系でぴったり合うようにフルオーダーしても良いのですが、費用対効果がバランスしないでしょう。

今回の場合、基板設計時点でぼんやりと外装アクリル付けようかなぁと考えていました。
以下がその時のスケッチです。


スケッチと言うにはお粗末ですが、それでもスケッチはスケッチです。
このスケッチは「アクリ屋ドットコムさんのセミオーダー加工で対応可能な範囲だ。」という事を示唆しています。

さて、アクリルの穴位置と外形は、先に述べたように0.5mm単位での指定になっています。
先ほどインポートしたCADデータとスケッチを基にサイズを決めていきます。

図形メニューの寸法から長さ寸法を選択します。


インポートした図面の穴位置中央にカーソルを持っていくと、センターが取り出されます。
うーん、これは便利だ。

基板端からの計測ももちろん可能です。
もし、基板端が図形として期待通りに認識されなかった場合、EAGLEでの書き出し時にチェックボックスの選択を外したかどうかを確認して下さい。


ここからがポイントです。
セミオーダーフォームから色々試してみたところ、以下の事がわかりました。
アクリル板端からの話はどこにも書いていなかったような・・・。
  • アクリル板端から4mmの位置に対して、直径3.2mmの穴をあける事ができない。
  • アクリル外形や穴位置の指定は0.5mm単位である。
  • 穴系は0.1mm単位で幅広く選ぶ事ができる。
上記を踏まえて、以下のような基板に対してどうすべきか考えました。

  • 基板外形はいったん無視。穴位置の関係さえ守れば基板とアクリル板は結合可能である。
  • 0.5mmグリッドに乗らない穴は、近い位置に丸めてアクリル加工穴とする。
  • 近い位置に丸めた穴は、本来の位置とのズレを吸収する意味で穴径を大きくする。
以下が設計した内容です。

今回は基板の中心を原点と見做してアクリル外形サイズを少し大きめにとりました。
期待した穴位置には設計ルール上の制限で穴が開けられない事がわかったからです。

重要なのは、基板にあいている穴の相対位置の関係を維持する事ですね。
これさえ外さなければ、絶対に作ったアクリル板の穴位置とズレる事はありません。

最後にアクリ屋ドットコムさんのサイトで設計した後、出てきた図面を基に検証します。
いくら安いとはいえ、加工枚数が少なければ一枚1000円近くします。
一発で決めたいですよね?

試しに検証してみましょう。

例えば、水平方向を見ると基板側では96.52mmとなっています。
概ね96.5mmと見做す事ができるので、設計したアクリルの穴位置を計算して
110.5 - (7.0 * 2) = 96.5mmとなり、期待通りというわけです。


垂直方向を見ると、50.80mmなので、概ね51.0mmと見做します。
設計したアクリルの穴位置を見ると61.0 - (5.0 * 2) = 51.0mmとなります。
本来の穴位置に対しての誤差は51.00 - 50.80 = 0.2mmとなります。

中心位置が外側に0.1mmずつ広がっていると考え、穴径は基板側の3.2mmに対して
0.1mm拡げた3.3mmを直径とすれば、「まぁ入るでしょ」という計算です。

ロータリーエンコーダーの穴位置は、止め穴から内側へ5.08mmという基板設計側の情報を基に決めてあります。
これも双方の穴位置の関係が命なので、アクリル外形に惑わされないようにするのがポイント。

ずいぶんといい加減なもんですが、こんな感じで
  • EAGLEからRootPro CADにデータを渡して
  • RootPro CAD上で手軽にサイズ測定して
  • アクリ屋ドットコムさんに発注
という一連の流れが完成です。

切断端面の加工に細目仕上げを選択して5枚の製造を依頼しました。
お値段は以下のように一枚約800円です。


私は自宅に機械加工の道具を持ち合わせていません。
自分で苦労しながら穴をあけて残念な感じになる事を考えると安いものです。

AltStyle によって変換されたページ (->オリジナル) /