【USBからUSBで制御】Marionette(マリオネット)
Marionetteって何すか?
マリオネッテと書いてマリオネットと読みます。マリオネットはいわゆる操り人形のことですね。
もともと1台のパソコンからUSB経由で複数の相手機器を遠隔コントロールするために作ったものです。
このシステムは、制御する側(マスタ側)・制御される側(スレーブ側)の2つ分のArduino Leonardoが入っている、ちょっと変わったハードウェアになっています。
たとえば制御する側(マスタ側)に繋がるUSBポートはUSB-COM、制御される側(スレーブ側)につながるUSBポートはHIDキーボード(=スレーブ側は普通のHIDキーボードに見える)、という構成にすると、マスタ側のUSB-COMでスレーブ側をキーボード制御する、なんてことができます。
作った後の注意事項
いきなり事後の話かよ、と思われるかもですが、大事なことなので最初に書きます。
部品を買ってきて回路を組んだだけの状態では、ATMEGA32U4のDFUブートローダーだけが書き込まれている状態です。この状態では Arduinoとして動作しません。
Arduino Leonardoの互換ハードウェアとして使用する場合、AVRISPmkIIなどの書き込み装置を利用してArduinoのブートロー ダーを書き込む必要があります。
Marionetteの回路だけでArduinoのブートローダーの書き込みを完結させることはできないので、あらかじめ買うなり作るなり 必ず何かしらのプログラム書き込みツールを準備してください。
自信がない方は、Arduino Leonardoを2つ買ってきてつなげた方がよいでしょう。
Marionetteはその使用にあたり、ある程度のハードウェアやファームウェアに関する専門知識が必要です。
専門知識を持たない方が使用された場合、ハードウェアの機能・性能が発揮されないのはもちろん、ハードウェアが永続的な損傷 を受けたり、火災などの重大な損害が発生する可能性があります。
…要するに、このページに書いてあることがよくわからない人は作らない方が身のためだ、てことです。
製作データ
製作データは下記です。色々あってPWB化しましたが、Arduino Leonardoを2つ買って同じように繋げても良いでしょう。
ちなみにPWBはArduino Unoと同じ外形サイズに詰め込むという謎の努力をしています。でも基板屋に発注するには、基板データを多少加工した方が効率が良いです。(何の電気的知識もない業者がこのまま商品化すると危ないので、データを加工しないと効率が悪すぎて商品として成立しないようにしてます。)
| Link | |
|---|---|
| 回路図 | mn_circuit.pdf |
| 部品リスト | mn_bom.csv |
| 基板レイアウト図 部品面 | mn_pwb_f.pdf |
| 基板レイアウト図 半田面 | mn_pwb_b.pdf |
| その他データ(Github) | Github - tmct |
| おすすめプロジェクト | NicoHood/HID |
回路ブロック図
何度も書いている通り、MarionetteはArduino Leonardoの2枚分の回路が実装されています。
2枚分の回路はそれぞれマスタ(MASTER)とスレーブ(SLAVE)と呼び、各々別のプログラムでまったく別の動作をさせることができます。ハードウェア構成に関する特徴を以下に示します。
マスタ側とスレーブ側はシリアル通信によって情報のやり取りを行うことができます
Arduinoの開発環境では Serial1 で相互に通信を行うことができます。また、外部にPullUp抵抗を実装すればI2Cによる通信も行えます。
マスタ側とスレーブ側は電源が分かれています
マスタ側はマスタ側、スレーブ側はスレーブ側のUSB端子から供給された電源で動作します。それぞれの電源ラインは100mAのポリスイッチで保護されています。
マスタ側はある程度の入出力端子が外部に引き出されており、Arduino Leonardoとある程度の互換性があります。
マスタ側は一部の入出力端子にディップスイッチが接続されていたり、マスタ・スレーブ間の通信用に接続されている以外はArduino Leonardoとほぼ同じです。
以下にハードウェアのブロック図を示します。
外部機器とのインターフェイス
既述の通り、マスタ側はある程度の入出力端子が外部に引き出されており、Arduino Leonardoとある程度は互換性があります。
外部に引き出されている端子とその接続を以下に示します。
外部に機器を接続するにあたり、とくに注意した方がよい点を参考までに示しておきます。
VCC・VDDから外部に電源を供給する場合
Arduinoと同様、VCC端子・VDD端子から外部機器に電源を供給することができます。
この電源はパソコンのUSBポートから供給を受けるので、ホストシステムを保護するためにポリスイッチ(過電流保護素子)で保護されています。
回路図通りの部品を使った場合、0.2A(200mA)で過電流保護が働きます。これは万が一Marionetteシステムに異常が発生した場合の保護として重要な動作ですが、外部に接続した機器が電流を大食いする場合は問題になることがあります。
外部機器の動作におおむね50mA以上の電流が必要な場合、外部機器は別の電源で駆動することをお勧めします。血迷っても普通のモーターなんか繋がないように。
VCCまたはVDDからの電源によって外部の電源を制御する例を以下に示します。(回路定数などは参考です。使用するトランジスタやMOS-FETに応じて変更してくださいませ。)
また、ポリスイッチに限らず保護部品はその動作が絶対的な精度で保証されているものではありませんし、的確に動作したとしてもシステムが完全に保護されるとは限りません。
あはは家が燃えちゃったよ!とかならないためにも、ポリスイッチの電流制限動作を期待するような設計をしないことをお勧めします。
VCC・VDDに外部から電源を供給する場合
パソコンからのUSB給電ではなく、VCC・VDD端子に直接外部から電源を供給することもできます。ただし、USB給電とVCC・VDDからの外部給電など複数の電源ノードから給電を行うと、たいていの場合は下記のような極端な状態になるのでお勧めしません。
※複数の電源から均等に動作電流が負担されるんだろうなー…などと淡い期待を抱いても、残念ながらそんな穏やかな状態で安定することはまずありません。
- ほんの少しでも電圧が高い電源ノードのみから集中的に動作電流が供給される。(負荷に極端な偏りが生じる)
- ほんの少しでも電圧が高い電源ノードから、ほかの電源ノードに対して大電流が流れる。
ほかの電源ノードから見ると電流が逆流して来るので、最悪の場合は電源がこんがり焼けます。
電源の焼損を防ぐためにダイオードによって電流の逆流を防止することは有効ですが、それでも単一の電源ノードのみから集中的に動作電流が供給されるのを防ぐことはできません。
また、もし応答特性が悪い電源を接続した場合は電源電圧が不安定になったりと安定させることが困難なので、できるだけ避けたほうが良いでしょう。
GND接続の重要性
GND接続は電子回路が正常に動作するためにとても重要です。MarionetteシステムのGND端子は、必ず外部機器のGNDに直接接続してください。
GNDは外部機器とMarionetteが信号をやり取りする際の基準電圧となります。GNDが正しく接続されない場合、それらは正しい信号をやり取りできないので正常に動作しません。最悪の場合、システムが永続的なダメージを受ける可能性があります。
AREF端子からA/Dコンバータのリファレンス電圧を供給する場合
AREF端子からA/Dコンバータのリファレンス電圧を供給する場合は下記にご注意ください。これに従わない場合、ハードウェアが永続的な損傷を受ける場合があります。
5kΩ程度の抵抗を介して接続してください
万が一ファームウェアの記述を間違えたりファームウェアが暴走してリファレンス電圧の設定状態が書き換わった場合、この抵抗によって電流が制限されハードウェアが保護されます。
AREFの設定を適切に行ってください
例えばArduinoの開発環境を利用している場合、setup()に以下の記述を行ってください。この設定を行うことでA/D変換器のリファレンス電圧が適切に切り替わります。
analogReference(EXTERNAL);
絶対に下記の設定を行ってはなりません。下記の設定を行った場合ICの内部で電源同士が直結されるので、大電流が流れてハードウェアが永続的な損傷を受ける可能性があります。(※振りじゃないので本当にやらないように。)
// AREF端子はATMEGA32U4に内蔵されている1.1Vのリファレンス電源に接続される
analogReference(INTERNAL);
// AREF端子はATMEGA32U4内部でAVCC(マスタ側に供給されている電源)に接続される
analogReference(DEFAULT);
D0/D1端子を使用する場合
D0/D1端子はマスタ・スレーブ間の通信に使用されるため、Arduino Leonardoとは異なる回路構成になっています。外部に別のデバイスなどを接続する場合は以下にご注意ください。
- D0は入力専用端子です。出力端子として使用することはできません。
外部にデバイスなどを接続して使用する場合、R6に0Ωの抵抗を実装してください。
また、必要に応じてR8を除去してください。(R8が実装されたままだと、外部からHighを入力しない限りD0がずっとLowになります。) - D1は出力専用端子です。入力端子として使用することはできません。
また、Nチャンネルオープンドレイン出力になっています。Highレベルは出力できないので、必要に応じて外部でPullUpしてください。
Arduinoの開発環境を利用する場合、LEDが自由に制御できない
Arduinoの開発環境を利用する場合、ボード上のLEDはArduinoの通信モジュール(Serial)の制御下にあるので、点灯・消灯をユーザーが自由に制御することはできません。通信を行っていない場合に限り、以下の記述である程度は制御することができます。
TXLED0; // TXLEDを消灯
TXLED1; // TXLEDを点灯
RXLED0; // RXLEDを消灯
RXLED1; // RXLEDを点灯
ただし、たとえばTXLED1;でLEDを点灯状態にしている場合であっても、Serialで通信を行うと通信モジュールによってLEDの状態が上書きされるので通信終了と同時に消灯してしまいます。これは Arduino を利用している限りはどうにもなりません。
未使用端子の処理
使用しない端子はデジタル出力端子としてLowを出力するか、デジタル入力端子として内蔵PullUpをONしてください。デジタル入力端子としてPullUpを有効にしない場合、静電気などでシステムが永続的なダメージを受ける場合があります。
ピンと機能
マスタ側について、端子と機能について示します。
| Arduino | ATMEGA32U4 | Marionette | ||||||
|---|---|---|---|---|---|---|---|---|
| Analog | Digital | PWM(TimerCh.) | INT | Other | Pin | Port | ADC | |
| A0 | D18 | 36 | PF7 | ADC7 | ||||
| A1 | D19 | 37 | PF6 | ADC6 | ||||
| A2 | D20 | 38 | PF5 | ADC5 | ||||
| A3 | D21 | 39 | PF4 | ADC4 | ||||
| A4 | D22 | 40 | PF1 | ADC1 | ||||
| A5 | D23 | 41 | PF0 | ADC0 | ||||
| A6 | D4 | 25 | PD4 | ADC8 | ||||
| A7 | D6 | 488Hz(Ch.4*1) | 27 | PD7 | ADC10 | |||
| A8 | D8 | 28 | PB4 | ADC11 | DipSW bit0*2 | |||
| A9 | D9 | 488Hz(Ch.1*1) | 29 | PB5 | ADC12 | DipSW bit1*2 | ||
| A10 | D10 | 488Hz(Ch.1*1) | 30 | PB6 | ADC13 | DipSW bit2*2 | ||
| A11 | D12 | 26 | PD6 | ADC9 | ||||
| D11 | 976Hz(Ch.0*1) | 12 | PB7 | DipSW bit3*2 | ||||
| D13 | 488Hz(Ch.4*1) | 32 | PC7 | |||||
| D5 | 488Hz(Ch.3*1) | 31 | PC6 | Always'High'*3 | ||||
| D7 | INT4 | 1 | PE6 | |||||
| D1 | INT3 | TX | 21 | PD3 | ||||
| D0 | INT2 | RX | 20 | PD2 | ||||
| D2 | INT1 | SDA*5 | 19 | PD1 | ||||
| D3 | 976Hz(Ch.0*1) | INT0 | SCL*5 | 18 | PD0 | |||
| D15 | SCK | 9 | PB1 | |||||
| D16 | MOSI | 10 | PB2 | |||||
| D14 | MISO | 11 | PB3 | |||||
*1:Ch.0とCh.1はArduinoの下記機能と共用されているので、PWM出力を使用する際に制約が生じます。
Ch.0 = mills, micros, delay, delayMicroseconds
Ch.1 = Servo
*2:必ず入力端子に設定し、PullUpを有効にしてください。
*3:マスタとスレーブの識別用端子として使用しているので、必ず入力端子に設定してください。
digitalReadで端子状態を取得した際、マスタ側は常にHigh・スレーブ側は常にLowが取得されます。
*4:マスタ・スレーブ間通信用に接続されているので、外部機器を接続する際は回路を確認してください。
*5:I2C通信を行うためのPullUp抵抗は内蔵されていないので追加が必要です。
まとめ
Marionetteシステムについて仕様っぽいものを記載しました。
細かい部分までは記載していないので、同じものを作りたい!という方は回路図などを参考にしてくださいね。