2012年11月2日金曜日

複数PCの楽器アプリ同士を繋ぐUSB MIDIケーブルを作ってみた

AndroidタブレットとMacを接続して演奏してみたかったので、USB MIDIクライアントを2つ結合したものを作ってみました。
近い将来、これを使ってAndroidタブレット用のPCDJコントローラでも作れたらいいな、という感じです。

方針

今回は、AVRのV-USBを使って、USB MIDIを扱います。ソースコードはMICO-MOCOを参考にしました。

MICO-MOCOではUSB MIDI→レガシーMIDIに変換する必要があったので、送受信を含めるとATtiny2313のメモリには収まらなかったのですが、今回のものは「USB MIDIのプロトコルをそのままブリッジする」という作りになっているため、プロトコル変換処理をばっさり省略できています。
MIDIを介さない利点として「31250baudでシリアル通信する必要がない」という点が挙げられます。クロックが最速20MHzのものを選択できるので、取りこぼしが少なくなることが期待できます(今回の試作では、16MHz/125000baudで通信しています)。送受信用のバッファは短かいですし、USB MIDIのプロトコルそのままなので、MIDIのパケット長はレガシーMIDIよりも長くなっていますが…。

回路

適当に描いた回路図はこんな感じです。一組のものがUSARTで対称に接続されている感じです。

ブレッドボードで試作してみました。たまたまツェナーダイオードの手持ちが無かったので青LEDで代用ドしています。Androidタブレット用の拙作ライブラリ「Android USB MIDI Driver」のサンプルを起動して、Mac側のGarageBandを演奏できました。

基板の設計をしてみる

USB MIDIブリッジを実装するにあたって、どうせなら専用基板にしてしまいたいという思いがあり、以前日本橋のものづくりガレージさん(当時はものづくりカフェ、だったような…?)を見学したときに教えてもらったFusionPCBさんに発注してみることにしました。
FusionPCBは5x5cm・二層・10枚で、送料込みで1000円ちょいで作ってくれるという、けっこうお手軽に利用できるサービスです。SeeedStudioさんによるサービスです。

基板CADソフトの選択

基板CADソフトはいろいろと調べていたんですが、どれもしっくりくるものがなく…。KiCadのMac版は、なんだかたくさんエラーが出たり落ちるのでメゲるし、Eagleは操作がわけわからないし…。CSiEDAというソフトを紹介して頂きましたが、Windows環境が必要ということで、試すのは後回しに…。

…という具合に悩んでいたのですが、前に後閑さんのEagle本を買っていたので、まぁ参考書があるならなんとかなるだろうということで、今回はEagleにしました。

複数オブジェクトの移動

Eagleは一般的なドロー系アプリとは違って、なんじゃこりゃという感じの操作体系です。一筋縄ではいかないです。ツールボックスを多用するのかと思いきや、一部ではコマンド直打ちだったり。コマンド名も意味がわからなかったりして、参考書なしに習得するのは困難かもしれません。

まず最初にハマったのが複数オブジェクトの移動でした。

複数オブジェクトの移動は、まず「範囲選択ツール」で複数のオブジェクトを選択します(ドラッグで矩形を選択。もしくは、クリックでポリゴンを描いて選択)。
次に、選択されてハイライトになっているオブジェクト達をドラッグすると、オブジェクトが移動できません。なんと、ハイライトの状態から右クリックして「Move Group」を選ぶことで、初めてそれらオブジェクト達が一緒に移動するのです。

ここで安心してはいけません。移動の結果、配線がピンに繋がってしまうと、なんとその箇所が接続されてしまったりするのです。厄介なことにならないようにするには、常に整理しつつ、なにもないところを選んで移動させる、という手順が必要のようです。

回路図のチェック

「Erc」というコマンドをツールボックスから選択すると、回路図のエラーや警告が表示されます。値が入力されていなかったり、配線がクロスしているのに接続していなかったり、といった問題を修正していきます。

部品の配置

続いて部品の配置です。部品配置モードに切り替えるボタンを押すと、回路図上にある全部品が適当に配置された実態配線図が表示されます。
意図しない大きさの部品などがあれば、部品上の十字のマークで右クリックして「Replace」を選んで、違うものを選びます。
このとき、部品図と同時に回路図のほうも開いておかないと、その変更が反映されません。Macなら、BetterTouchToolなどで2つのウィンドウを隣に並べて表示すると良いかも知れません。

今回はお試し作成ということもあって安くしたいので、5x5cmのサイズに収まるようデザインしました。グリッドの幅をmm単位に変えて、基板サイズを示す矩形を5x5cmに変更します。(ぴったり5x5cmじゃないとダメだと思っていたのですが、5x5cmに収まっているなら小さい基板サイズでも良いみたいです)。
このとき、うっかりinch単位に戻し忘れると部品の配置がズレてしまうので気をつけます。一旦そうやって位置がズレてしまった部品は、グリッド幅を戻してもグリッドに合ってくれません。そんなときは「command」キーを押しながらクリックすると直せます。mmとinchが共存してるの、厄介な感じです…。

そんな感じで部品を配置していきます。最初はざっくりな配置で。同じような部品がどれに対応しているか分からなくなるので、回路図を見ながらやります。
部品の配置を変更すると「黄土色の細い線」がくっついたまま移動します。これは回路図の配線がそのピン同士で繋がっている、というのを表わしています。こいつらを最近傍のピンに接続しなおすには「ripup;」というコマンドを入力します。コマンド一覧とか、どこかにあるのでしょうが、どうやって表示させるのかもわからないので、いずれ必要になったらググることにします。あと、末尾の「;」というのが大事のようで、これがないとコマンドとして認識されません。

部品がざっくりと配置できたら、ツールバーの「Auto」というボタンを選ぶと自動配線されます。自動で配線しきれなかった分は「黄土色の細い線」のまま残ります。
「黄土色の細い線」の部分は「Route」ボタンを選んで手動で配線します。「Via」を使って表面と裏面を貫通させることで、直接つなげない部分を配線できます。このほか、自動配線では気に食わない細々とした部分を修正しておきます。

部品の値や名前を、変更とか削除したいときは、部品を右クリックして「Smash」を選ぶと、部品名などがバラバラに分解されます。分解されたものを個別に選んで「Properties」なり「Delete」を選んで変更します。

ベタGNDを作るときは、基板の四隅をPolygonツールで囲んだのち、再びその線を右クリックして「Ratsnest」というコマンドを選びます。
「Drc」というコマンドをツールボックスから選択すると、配線のエラーや警告が表示されます。配線同士の隙間が足りてなかったり、穴の上を配線していたり、といった問題を修正していきます。

できた基板のレイアウトはこんな感じです。完全な対称じゃなかったり、配線ごちゃごちゃしてたり、納得いかない感じがありますが…めんどうなので妥協してみました。

基板を発注する

FusionPCBのサイトに、提出ファイル生成用のツールがあるので、ダウンロードしてEagleの「cam」フォルダに入れて、使用します。
プロジェクトのところに表示されるので、とりあえず開いて実行してみると「ファイルが指定されてないわー」的なエラーが出ます。どうも、このツールを開いた状態で、改めて「部品配置のファイル(brdファイル)」を開いてやる必要があるみたいです。

ツールが完了すると同じディレクトリにファイルが10個くらいできます。ここで安心して発注するとアレなものが出来てしまう場合があるということなので、「Viewplot」というソフトを使って表示チェックします。しかし、チェックの観点が分かってないので結局…ですが。

ViewPlotはWindowsアプリですが、Wineのパッケージャ「WineBottler」というソフトでインストールしてみたところ、Macでもすんなり起動できました。
ちなみに、Viewplotの類似アプリとしてはGerbvというものがあるようで、これはMacPortsからインストールできるようです。

FusionPCB(SeeedStudio)のアカウントと、PayPalのアカウントを用意して、一旦FusionPCBから「購入」するとOrderNo.を取得できます。この番号を基板の欄外にシルクなどのデータとして埋めこんでおいて、camツールから出力します。
ファイル一式をzipで固めて、ファイル名を指定のものに変えて、メールで送り付けます。

FusionPCBのステータスは、「Confirmed」「Processing」「In production」「Shipped」「Traceable」と遷移します。Tracableになってからは配送業者のサービスから位置が確認できました。

USB MIDIブリッジ基板が到着

発注してから三週間強ほど待って、基板が届きました。丁度中国の長期休暇時期と重なったために、到着までにちょっと掛かりました。

10枚発注したところ、サービスなのか12枚入っていました。
50%テストで依頼しましたが、サービスなのか全部テストされているようでした。

初設計した基板。個人で、無料のツールでここまでできる。なかなか感動的です。
しかし、シルクの抜けがありました…。どうもcamツールを使うときにレイヤを指定してやらないと、出力されないようです。

部品を実装してみました。ピッチが細かいのはUSB mini-Bくらいで、半田付けは簡単です。
ATtiny2313にファームウェアを流し込んで、Mac同士を繋いでテストしてみたところ、無事認識されて動きました。GND/VCC両方とも繋いでいた(ブレッドボードのときはGNDのみ共有だった)ので、ちょっとだけ心配でしたが大丈夫でした。
この写真では16MHzのセラミック発振子を使っていますが、水晶振動子+コンデンサでも動くはずです。

ソースコード

今回の記事で作成したEagleのファイル、AVRのファームウェアを下記に置いています。
同じようなものを作ってみたい方は参考にしてみてください。

https://github.com/kshoji/USB-MIDI-Link

ツッコミ所はいっぱいあると思うので、コメントとかPull Requestとか頂けたら嬉しいです。

今後の予定

今回のとちょうど逆の、USB MIDIをホストするモノを作りたくて、PIC開発のセットと参考書を入手しましたが、まだ手が動いていません…。
完成したらUSB MIDIな楽器同士が直結できるようになる、予定です。