2010/02/17からのアクセス回数 3701

Macintoshとの出会い

はじめてMacintosh(以下Macと書きます)を見たのは、入社して2年目でした。 Macの優れたユーザインタフェースを習得すればきっとばらしい ソフトを作れるに違いない、そう思った私は一念発起してMacを買いました*1 。 当時のMacは軽自動車と同じくらいの価格で、今のパソコンよりも遙かに高価 でした。

Macが届いてから、ソフトウェアの無限の可能性に胸躍らせ夢中でプログラミングを学びました。

当時は、Macのプログラミング環境はMDS(Macintosh Development System)と 呼ばれるアセンブラをベースとした開発環境とInside Macintoshのセット、 Mac PascalというPascalのインタプリタしかありませんでした。

Macintoshのプログラムは、当初Lisa上でアセンブラとPasacal言語によって 開発されていた経緯から、マックのツールボックスとのインタフェースはPascal で記述されていましたので、PascalがMacの標準言語となったのは自然な流れで した。

THINK Pascalの登場によってMac上で本格的なプログラミングが可能となりました(図1 *2)。

その後、Appleから正式な開発環境MPW(Macintosh Programmer's Workshop) が提供され、UNIXライクなコマンドと汎用のエディタを使った開発環境にC言語が本格的に導入されました。 UNIXの普及に伴い、時代はC言語の全盛期となりました。

THINK Pascal.png

Macのプログラミングは独特

開発言語とInside Macintoshiを読んだけでは、Macのプログラムを作るには 不十分でした。 少ないMacのプログラミング本のなかで、

  • How to Write Macintosh Software*3
  • Macintosh Revealed*4
  • Mac Tutor(雑誌)

をむさぼり読みました。

特に、How to Write Macintosh Softwareに紹介されていたデバッグ方法はすばらしく、 今も大切にしています。

  • バグと思わしき箇所を見つけたら、すぐにバグを修正するのではなく、
  • デバッガでバグの箇所に正しい値をセットし、後の処理が正常に動作することを確認してからバグを修正する

というものでした。

RS232C

外部の機器と接続することで創作の範囲が広がります。 初期のMacには外部機器と接続するインタフェースとして、 モデムポートとプリンタポートの2つのシリアルポートがあるのみでした。

クロス変換ケーブル

シリアル通信では、モデムと接続する場合にはパラレルケーブル、別の PCや外部機器と接続する場合にはクロスケーブルを使用します。 私が入社して初めてハンダゴテを持ったのは、パラレルケーブルをクロス ケーブルに変換するケーブルの作成でした(図2)。

モデムケーブルとこの変換ケーブルがあれば、すべての機器と接続する ことができるのでとても重宝しました。

クロスケーブル.png

小型スキャナー・プリンターの接続

80年台にブームとなったシステム手帳ですが、多くの種類のリフィルが 売られていました。 そのような中、リコーからシステム手帳対応のハンディタイプのスキャナー ・プリンターCuvax(図3)が発売されました。

しかもCuvaxにはPCとの接続して 画像の転送ができるコントーラーがオプションとして用意されていました。 自分だけのリフィルをつくりたい、Macのデータをリフィルに印刷したいと いう私の願望とマッチし、すぐにMacとCuvaxを接続するソフトを作成しま した。これが私の最初のMacintoshアプリケーションであり、 自分の欲しいものを作った始まりでした。

Cuvax.png

ハード的な接続テスト

Cuvaxとの接続テストでは、クロス変換ケーブルが活躍しました。 もっとも簡単な通信がクリアすれば、後はコントーラーの仕様に合わせて データを交換するプロトコルを実装するだけですから、ソフト屋の私の得意 とするところです。問題を自分の領域に持ち込めば、こちらのものです!

MacらしいGUIを付ける

Cuvaxコントローラと正常に通信ができたところで、Mac風のユーザインタフェース を作成ました(図4)。 スキャナーで読み取った画像がリアルタイムで表示された時には、とても感動 しました。

Cuvaxダイアログ.png

Java

私には、2つのこだわりがありました。

  • Mac上で開発できること
  • マシン依存しない環境を持つこと

そこで、2001年から開発言語をCからJavaに切り替え、開発環境もEclipseで統一することにしました。 JVM上で動くJavaはマシンやOSに依存しないことが私には魅力でした。

Javaから制御

サンマイクロシステムズから販売されたSun Spot(図4)は、大福くらいの本体に無線、温度、加速度等のセンサーを搭載した機器で、すべてJavaで制御されていました。

Sun Spotの徹底したこだわりはセンサーモジュールに搭載されたMPUをオブジェクト化し、Javaでセンサーをコントロールしているところにも現れていました。

SunSpot.png

ICタグをJavaから制御したい

Sun Spotに刺激された私は、本棚に山積みになっている本を簡単に見つけられないかと、JavaからICタグを使って本を管理しようと考えました。

組み込みプレスに掲載された「ICタグを使った書籍管理システムの構築」は、こうして作られました。

Javaのシリアル通信

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タグ リーダ・ライタ)。

ICタグ.png

ターミナルの通信ソフトで、ICタグとの接続を確認した後、JavaからICタグを制御するアプリケーションを 作り始めました。

実際に本を管理するには、書籍のタイトル、著者などを入力しますが、これもAmazonの検索サービスを使って ISBN番号から取り込んで処理しました。 入力GUIもEclipseのVisual Editorを使って作成したので、あっという間に書籍登録画面が完成しました。

例え不慣れな外部機器との接続でも、自分の得意なところに持ち込めれば、簡単に使いこなすことができるようになります。 様々な機器と接続できるレベルコンバータが、「魔法の杖」のように感じました。

USB

シリアル通信の成功に勢いづいて、JavaからオリジナルのUSB装置への接続を試みました。

雑誌で紹介されているUSB制御は、ICメーカーの提供するWindows用のドライバーとVisual Basicを使った例が多く、 Macユーザの私にはほとんど役に立ちません。

そんな時「インターネット・ガジェット設計」*5

  • libusb:オープンソースのUSB制御ライブラリ *6
  • V-USB:AVR用のUSBプロトコルスタック *7

を使った記事が紹介されていました。

JavaからオリジナルUSB機器への接続

次にJavaからオリジナルのUSB機器に接続しようと試みました。 世の中には同じようなことを考えている人がいるもので、libusbとjavaで検索すると、 LibusbJava *8 というlibusbのjavaラッパーが見つかりました。

USB機器との通信は、usb_control_msgメソッドのbRequest, wValue, wIndex, wLengthの中に7バイトの情報を 埋め込んで行います。USBのルールには沿っていませんが、プロトコルスタックを使うことでJavaからも USB機器と接続できることが確認できました。

JavaからオリジナルHID機器に接続

MPUの進歩でUSBドライバが内蔵されているものが増えてきました。USBプロトコルに準拠したHIDでは、 先で紹介したusb_control_msgにデータを埋め込む方法は使えません。

HIDを処理する汎用のライブラリを調べたところLibhid *9 が見つかりました。 Libhidは、Libusbの上にHIDのディスクリプタを解析する関数を載せたものです。

Libhidのソースを調べると、HIDのレポートIDとレポートIndexの値が分かれば、usb_control_msgを 使ってHIDと通信できることが分かりました。特にオリジナルのHIDの場合、レポートIDとレポートIndexは 固定で、Libhidに含まれるテストプログラムtest_libhidで簡単に調べることができます。

そこで、LibusbJavaを使ってHIDと通信するクラスをJavaで作成してみました。 テストに使ったのは、「ARMマイコンパーフェクト学習基板(図7)です。 *10

簡単なプログラムを使って基板のLEDを点滅させ、一定時間で増えるカウンタの 値を受信したときの例です。

学習基板.png

ethernet

RS232C, USBときたら次は、ethernetですね。

組み込みでethernetに対応しているチップが少なかったとき、オプティマイズ *11 から、SPIを使ってethernetに接続するキット(図8)が 発売されました。

早速、EZ-ARM7 と SPIイーサネットを購入し、ethernetへの接続を試みました。

SPIイーサネット.png

MacでARMの開発

まずは、MacでARMの開発環境を整えることから始めました。

Windows, Linuxでも同様に使えるような環境を考え、以下のようにしました。

  • 必要最低限のツールbinutils, gccを自分でコンパイルしてみる
  • その他のnewlib, gdbをインストール
  • Eclipse上の組み込みC開発プラグインZylin CDTをインストール
  • オンチップ・デバッガOpenOCDのインストール

OpenOCD

開発環境で最も困ったのが、OpenOCDでした。

OpenOCDはオープンソースのオン・チップ・デバッガで、多くの種類のJTAG ICEに対応しており、 プログラムの書き込みやデバッグが簡単にできる優れものです。

しかしながら、MacではFT2232チップを搭載したJTAG ICEを接続した時に、OSがシリアルポートの デバイスとして登録するため、OpenOCDは接続時に失敗し、動作しません。

そこで、FT2232以外のJTAGであるUSB BlasterでOpenOCDを使った記事をブログで紹介したところ、 「もなか」さんからFT2232チップのVID/PIDを書き換えれば、 そのままOpenOCDで使えるとの情報を頂きました。

本物のJtagkeyでいきなり実験するのは怖いので、「 Eclipse-ARMプロセッサによる組込み開発」 *12 で紹介されていた、 ツール工房のUSB2232(USBデュアル変換基板)を使って試してみたところ、問題なくOpenOCDでデバッグすること ができるました(図9)。

JTAG接続.png

ライブラリを使う

ソフト屋がいきなり、組み込み用MPUを使おうとしても難しいものがあります。 自分の使っているMPUのライブラリが公開されていないか調べてみるとよいでしょう。

  • Procyon ARMlibは、LPC2000、AT91シリーズに対応 *13
  • CodeBaseは、LPC1114、LPC1343に対応 *14

等があります。

ethernetへの接続

ARMlibに含まれているイーサネットライブラリを使って、簡単な接続試験をしました。 残念なことに、ARMlibのイーサネットライブラリは、ルータからIPアドレスを取得する ことができないため、固定アドレスを使った接続しかできませんでした。 それでも、小さなMPUからでもイーサネットに接続することができると分かったことは 収穫でした。

プロトタイプツールとしてのmbed

mbedは、Ethernet, USB, RS232C等多くのインタフェースを備え、それらを 使うためのC++のクラスが用意されています。

mbed用に設計されたスターボード・オレンジ *15 と組み合わせることで、簡単にインターネットサイトに 接続し、情報を取得するようなオリジナルの機械を作ることができます。

mbedではクラウドを使ってプログラムのコンパイル、マニュアル、ライブラリの閲覧、ユーザのブログの公開 ができるようになっているため、Macでも簡単にmbedの開発ができます。

mbedで私が気に入ったことは、クラウド内のユーザのブログページを使って自分の作品を公開したり、 新しいデバイスの情報交換が行われていることです。 自分の使おうとしているデバイスをクラウドで検索し、公開されているライブラリを使えば 簡単にそのデバイスを試すことができます。

図10は、安価なタッチスクリーン付き液晶表示機器をmbedに接続 *16 したときの様子です。

液晶表示機器.png

まとめ

ここまでRS232C, USB, Ethernet(インタフェース)との接続とそれを助けてくれたもの「魔法の杖」 についてつぶやいてきました。 自分はソフトが専門でハードは関係ないと「自分を枠にはめる」のではなく、 ハードとのインタフェースをつなぐことで、新しい世界を見つけて欲しいと願います。

また、Macと共通プラットフォームへのこだわりを続けていたら、知らないうちに標準のスタイルである Java、Eclipse、GCC, OpenOCDにたどり着いたように、諦めずこだわることで道は開けてくると思います。



*1 もちろんローンです
*2 MacJapan No.15 1990, 著者の記事 p29 図4より引用
*3 ISBN: 0-8104-6564-7
*4 ISBN: 0-8104-6561-2
*5 ISBN: 4274501868
*6 http://libusb.wiki.sourceforge.net/
*7 http://www.obdev.at/products/vusb/
*8 http://sourceforge.net/projects/libusbjava/
*9 http://libhid.alioth.debian.org/
*10 この学習基板では、学習に使用する様々な外部デイバイスをジャンパ線で接続するように作られているため、他のMPUの接続テストにも活用できます
*11 http://optimize.ath.cx/ARM7/index.html
*12 ISBN: 4798115843
*13 オリジナルは、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はミラーと思われます
*14 http://www.microbuilder.eu/Projects/LPC1343ReferenceDesign/LPC1343CodeBase.aspx
*15 http://www.switch-science.com/products/detail.php?product_id=483
*16 「じぇーけーそふと」さんのご厚意で、液晶表示機器のライブラリを使用させて頂きました

添付ファイル: fileSPIイーサネット.png 517件 [詳細] fileJTAG接続.png 508件 [詳細] file学習基板.png 557件 [詳細] file液晶表示機器.png 546件 [詳細] fileクロスケーブル.png 522件 [詳細] fileTHINK Pascal.png 545件 [詳細] fileSunSpot.png 509件 [詳細] fileICタグ.png 518件 [詳細] fileCuvaxダイアログ.png 554件 [詳細] fileCuvax.png 528件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-09-19 (月) 13:19:52 (2106d)
SmartDoc