すみません。投稿原稿のため、発表後3ヶ月までお待ち下さい。 #contents 2010/02/17からのアクセス回数 &counter; ** Macintoshとの出会い [#h1eca4bb] はじめてMacintosh(以下Macと書きます)を見たのは、入社して2年目でした。 Macの優れたユーザインタフェースを習得すればきっとばらしい ソフトを作れるに違いない、そう思った私は一念発起してMacを買いました((もちろんローンです)) 。 当時のMacは軽自動車と同じくらいの価格で、今のパソコンよりも遙かに高価 でした。 Macが届いてから、ソフトウェアの無限の可能性に胸躍らせ夢中でプログラミングを学びました。 当時は、Macのプログラミング環境はMDS(Macintosh Development System)と 呼ばれるアセンブラをベースとした開発環境とInside Macintoshのセット、 Mac PascalというPascalのインタプリタしかありませんでした。 Macintoshのプログラムは、当初Lisa上でアセンブラとPasacal言語によって 開発されていた経緯から、マックのツールボックスとのインタフェースはPascal で記述されていましたので、PascalがMacの標準言語となったのは自然な流れで した。 THINK Pascalの登場によってMac上で本格的なプログラミングが可能となりました(図1 ((MacJapan No.15 1990, 著者の記事 p29 図4より引用)))。 その後、Appleから正式な開発環境MPW(Macintosh Programmer's Workshop) が提供され、UNIXライクなコマンドと汎用のエディタを使った開発環境にC言語が本格的に導入されました。 UNIXの普及に伴い、時代はC言語の全盛期となりました。 &ref(THINK Pascal.png); *** Macのプログラミングは独特 [#d693e9b2] 開発言語とInside Macintoshiを読んだけでは、Macのプログラムを作るには 不十分でした。 少ないMacのプログラミング本のなかで、 - How to Write Macintosh Software((ISBN: 0-8104-6564-7)) - Macintosh Revealed((ISBN: 0-8104-6561-2)) - Mac Tutor(雑誌) をむさぼり読みました。 特に、How to Write Macintosh Softwareに紹介されていたデバッグ方法はすばらしく、 今も大切にしています。 - バグと思わしき箇所を見つけたら、すぐにバグを修正するのではなく、 - デバッガでバグの箇所に正しい値をセットし、後の処理が正常に動作することを確認してからバグを修正する というものでした。 ** RS232C [#b18e3a4e] 外部の機器と接続することで創作の範囲が広がります。 初期のMacには外部機器と接続するインタフェースとして、 モデムポートとプリンタポートの2つのシリアルポートがあるのみでした。 *** クロス変換ケーブル [#k7247513] シリアル通信では、モデムと接続する場合にはパラレルケーブル、別の PCや外部機器と接続する場合にはクロスケーブルを使用します。 私が入社して初めてハンダゴテを持ったのは、パラレルケーブルをクロス ケーブルに変換するケーブルの作成でした(図2)。 モデムケーブルとこの変換ケーブルがあれば、すべての機器と接続する ことができるのでとても重宝しました。 &ref(クロスケーブル.png); *** 小型スキャナー・プリンターの接続 [#zdbed6af] 80年台にブームとなったシステム手帳ですが、多くの種類のリフィルが 売られていました。 そのような中、リコーからシステム手帳対応のハンディタイプのスキャナー ・プリンターCuvax(図3)が発売されました。 しかもCuvaxにはPCとの接続して 画像の転送ができるコントーラーがオプションとして用意されていました。 自分だけのリフィルをつくりたい、Macのデータをリフィルに印刷したいと いう私の願望とマッチし、すぐにMacとCuvaxを接続するソフトを作成しま した。これが私の最初のMacintoshアプリケーションであり、 自分の欲しいものを作った始まりでした。 &ref(Cuvax.png); *** ハード的な接続テスト [#l019af29] Cuvaxとの接続テストでは、クロス変換ケーブルが活躍しました。 もっとも簡単な通信がクリアすれば、後はコントーラーの仕様に合わせて データを交換するプロトコルを実装するだけですから、ソフト屋の私の得意 とするところです。問題を自分の領域に持ち込めば、こちらのものです! *** MacらしいGUIを付ける [#c15849ef] Cuvaxコントローラと正常に通信ができたところで、Mac風のユーザインタフェース を作成ました(図4)。 スキャナーで読み取った画像がリアルタイムで表示された時には、とても感動 しました。 &ref(Cuvaxダイアログ.png); ** Java [#f00f55f1] 私には、2つのこだわりがありました。 - Mac上で開発できること - マシン依存しない環境を持つこと そこで、2001年から開発言語をCからJavaに切り替え、開発環境もEclipseで統一することにしました。 JVM上で動くJavaはマシンやOSに依存しないことが私には魅力でした。 *** Javaから制御 [#vdaaf93a] サンマイクロシステムズから販売されたSun Spot(図4)は、大福くらいの本体に無線、温度、加速度等のセンサーを搭載した機器で、すべてJavaで制御されていました。 Sun Spotの徹底したこだわりはセンサーモジュールに搭載されたMPUをオブジェクト化し、Javaでセンサーをコントロールしているところにも現れていました。 &ref(SunSpot.png); *** ICタグをJavaから制御したい [#i338df5e] Sun Spotに刺激された私は、本棚に山積みになっている本を簡単に見つけられないかと、JavaからICタグを使って本を管理しようと考えました。 組み込みプレスに掲載された「ICタグを使った書籍管理システムの構築」は、こうして作られました。 *** Javaのシリアル通信 [#i88ea345] PC上のJavaからTTLレベルのシリアルポートを制御するには、2つの問題がありました。 - Java用のシリアル通信クラスライブラリ - USBで接続できるTTLレベルコンバータ Java用のシリアル通信クラスライブラリとしては、Sunの提供する Java Communications API がありましたが、 実際に実装されているのは、SPARC Solaris/x86 Solaris/x86 Linux版のみなのでMacOSXやWindowsでは使えません。 そこで、Java Communications APIに準拠したオープンソースのライブラリRXTXを使用しました。 USBから接続できるTTLレベルコンバータには、秋月のAE-UM232Rを使用しました。 AE-UM232Rは、USBから外部機器に電源(5V, 3.3V)を供給し、買ってすぐにブレッドボード に接続できるすぐれもの です(図6: 右がTTLレベルコンバータ、左がICタグ リーダ・ライタ)。 &ref(ICタグ.png); ターミナルの通信ソフトで、ICタグとの接続を確認した後、JavaからICタグを制御するアプリケーションを 作り始めました。 実際に本を管理するには、書籍のタイトル、著者などを入力しますが、これもAmazonの検索サービスを使って ISBN番号から取り込んで処理しました。 入力GUIもEclipseのVisual Editorを使って作成したので、あっという間に書籍登録画面が完成しました。 例え不慣れな外部機器との接続でも、自分の得意なところに持ち込めれば、簡単に使いこなすことができるようになります。 様々な機器と接続できるレベルコンバータが、「魔法の杖」のように感じました。 ** USB [#c16a8392] シリアル通信の成功に勢いづいて、JavaからオリジナルのUSB装置への接続を試みました。 雑誌で紹介されているUSB制御は、ICメーカーの提供するWindows用のドライバーとVisual Basicを使った例が多く、 Macユーザの私にはほとんど役に立ちません。 そんな時「インターネット・ガジェット設計」((ISBN: 4274501868))で - libusb:オープンソースのUSB制御ライブラリ (( http://libusb.wiki.sourceforge.net/ )) - V-USB:AVR用のUSBプロトコルスタック (( http://www.obdev.at/products/vusb/ )) を使った記事が紹介されていました。 *** JavaからオリジナルUSB機器への接続 [#p169c6c8] 次にJavaからオリジナルのUSB機器に接続しようと試みました。 世の中には同じようなことを考えている人がいるもので、libusbとjavaで検索すると、 LibusbJava (( http://sourceforge.net/projects/libusbjava/ )) というlibusbのjavaラッパーが見つかりました。 USB機器との通信は、usb_control_msgメソッドのbRequest, wValue, wIndex, wLengthの中に7バイトの情報を 埋め込んで行います。USBのルールには沿っていませんが、プロトコルスタックを使うことでJavaからも USB機器と接続できることが確認できました。 *** JavaからオリジナルHID機器に接続 [#s05e3fe4] MPUの進歩でUSBドライバが内蔵されているものが増えてきました。USBプロトコルに準拠したHIDでは、 先で紹介したusb_control_msgにデータを埋め込む方法は使えません。 HIDを処理する汎用のライブラリを調べたところLibhid (( http://libhid.alioth.debian.org/ )) が見つかりました。 Libhidは、Libusbの上にHIDのディスクリプタを解析する関数を載せたものです。 Libhidのソースを調べると、HIDのレポートIDとレポートIndexの値が分かれば、usb_control_msgを 使ってHIDと通信できることが分かりました。特にオリジナルのHIDの場合、レポートIDとレポートIndexは 固定で、Libhidに含まれるテストプログラムtest_libhidで簡単に調べることができます。 そこで、LibusbJavaを使ってHIDと通信するクラスをJavaで作成してみました。 テストに使ったのは、「ARMマイコンパーフェクト学習基板(図7)です。 (( この学習基板では、学習に使用する様々な外部デイバイスをジャンパ線で接続するように作られているため、他のMPUの接続テストにも活用できます )) 簡単なプログラムを使って基板のLEDを点滅させ、一定時間で増えるカウンタの 値を受信したときの例です。 &ref(学習基板.png); ** ethernet [#he25959a] RS232C, USBときたら次は、ethernetですね。 組み込みでethernetに対応しているチップが少なかったとき、オプティマイズ (( http://optimize.ath.cx/ARM7/index.html )) から、SPIを使ってethernetに接続するキット(図8)が 発売されました。 早速、EZ-ARM7 と SPIイーサネットを購入し、ethernetへの接続を試みました。 &ref(SPIイーサネット.png); *** MacでARMの開発 [#sa7d1ace] まずは、MacでARMの開発環境を整えることから始めました。 Windows, Linuxでも同様に使えるような環境を考え、以下のようにしました。 - 必要最低限のツールbinutils, gccを自分でコンパイルしてみる - その他のnewlib, gdbをインストール - Eclipse上の組み込みC開発プラグインZylin CDTをインストール - オンチップ・デバッガOpenOCDのインストール *** OpenOCD [#yece547d] 開発環境で最も困ったのが、OpenOCDでした。 OpenOCDはオープンソースのオン・チップ・デバッガで、多くの種類のJTAG ICEに対応しており、 プログラムの書き込みやデバッグが簡単にできる優れものです。 しかしながら、MacではFT2232チップを搭載したJTAG ICEを接続した時に、OSがシリアルポートの デバイスとして登録するため、OpenOCDは接続時に失敗し、動作しません。 そこで、FT2232以外のJTAGであるUSB BlasterでOpenOCDを使った記事をブログで紹介したところ、 「もなか」さんからFT2232チップのVID/PIDを書き換えれば、 そのままOpenOCDで使えるとの情報を頂きました。 本物のJtagkeyでいきなり実験するのは怖いので、「 Eclipse-ARMプロセッサによる組込み開発」 (( ISBN: 4798115843 )) で紹介されていた、 ツール工房のUSB2232(USBデュアル変換基板)を使って試してみたところ、問題なくOpenOCDでデバッグすること ができるました(図9)。 &ref(JTAG接続.png); *** ライブラリを使う [#q4da42ff] ソフト屋がいきなり、組み込み用MPUを使おうとしても難しいものがあります。 自分の使っているMPUのライブラリが公開されていないか調べてみるとよいでしょう。 - Procyon ARMlibは、LPC2000、AT91シリーズに対応 (( オリジナルは、http://hubbard.engr.scu.edu/embedded/arm/armlib/index.htmlですが、現在は見つかりません。http://www.hs-augsburg.de/~hhoegl/tmp/eworld/embedded-world-2007/at91sam7s64/armlib/docs/html/main.htmlはミラーと思われます )) - CodeBaseは、LPC1114、LPC1343に対応 (( http://www.microbuilder.eu/Projects/LPC1343ReferenceDesign/LPC1343CodeBase.aspx )) 等があります。 *** ethernetへの接続 [#k8b9975d] ARMlibに含まれているイーサネットライブラリを使って、簡単な接続試験をしました。 残念なことに、ARMlibのイーサネットライブラリは、ルータからIPアドレスを取得する ことができないため、固定アドレスを使った接続しかできませんでした。 それでも、小さなMPUからでもイーサネットに接続することができると分かったことは 収穫でした。 *** プロトタイプツールとしてのmbed [#ke4798c6] mbedは、Ethernet, USB, RS232C等多くのインタフェースを備え、それらを 使うためのC++のクラスが用意されています。 mbed用に設計されたスターボード・オレンジ (( http://www.switch-science.com/products/detail.php?product_id=483 )) と組み合わせることで、簡単にインターネットサイトに 接続し、情報を取得するようなオリジナルの機械を作ることができます。 mbedではクラウドを使ってプログラムのコンパイル、マニュアル、ライブラリの閲覧、ユーザのブログの公開 ができるようになっているため、Macでも簡単にmbedの開発ができます。 mbedで私が気に入ったことは、クラウド内のユーザのブログページを使って自分の作品を公開したり、 新しいデバイスの情報交換が行われていることです。 自分の使おうとしているデバイスをクラウドで検索し、公開されているライブラリを使えば 簡単にそのデバイスを試すことができます。 図10は、安価なタッチスクリーン付き液晶表示機器をmbedに接続 ((「じぇーけーそふと」さんのご厚意で、液晶表示機器のライブラリを使用させて頂きました)) したときの様子です。 &ref(液晶表示機器.png); ** まとめ [#bc4cec01] ここまでRS232C, USB, Ethernet(インタフェース)との接続とそれを助けてくれたもの「魔法の杖」 についてつぶやいてきました。 自分はソフトが専門でハードは関係ないと「自分を枠にはめる」のではなく、 ハードとのインタフェースをつなぐことで、新しい世界を見つけて欲しいと願います。 また、Macと共通プラットフォームへのこだわりを続けていたら、知らないうちに標準のスタイルである Java、Eclipse、GCC, OpenOCDにたどり着いたように、諦めずこだわることで道は開けてくると思います。