白板ソフトとArduinoUSB通信について              

2016/05/20

2017/01/13 Aruduino LittleBits についてのサンプルを追加しました。

 

白板ソフトからUSBケーブルを使って、Arduinoと通信する方法について説明します。

 

1)接続方法

2)USB通信用部品の使い方

3)USB通信用部品のカスタマイズ方法

 

1)接続方法

 

WindowsPCに以下のソフトをダウンロードしてインストールまたは実行します。

 

     白板ソフト http://www.mbrain.com/wb/

     Arduino Software (windows installer) https://www.arduino.cc/en/Main/Software
Arduino
にスケッチ(プログラム)を書き込むのに使用します。

     Firmataのテストプログラム  http://firmata.org/wiki/Main_Page
動作テストを行うために使用します。

     USBドライバ
互換ボードを使う場合には、Ardino Softwareに入っているドライバでUSBが正しく認識されない場合があります。Arduinoのボード上のチップに合わせたUSBドライバが必要になります。使っているボードの資料を見て、必要なドライバをインストールして下さい。

 

ソフトウェアのインストールが終わったら、USBケーブルでArduino を接続します。その後、Arduino Softwareを起動します。起動してしばらく待つとArduino Softwareの画面が表示されます。ツール/ポートから、接続中のArduinoを選択します。接続中のArduinoが表示されない場合には、USBケーブルやUSBドライバ(一度USBケーブルを抜いてから再度差し込んでドライバが起動しているか等)を確認して下さい。このCOMポートを使って通信します。COMポートの番号はUSBケーブルを抜いてから差し込んだときに別の番号に変わる場合もあります。

USBの接続でArdinoへスケッチ(プログラム)が送れるようになりました。次はUSB通信でArdinoを動かすためのスケッチ(プログラム)をArdinoに書き込みます。ファイル/スケッチの例/ Firmata/ StandardFirmataを選択してスケッチを呼び出します。

 

 

読み込んだスケッチをマイコン(Arduino)に書き込みます。左上の2番目の矢印のボタンを押すとコンパイルと書き込みが行われます。少し時間がかかる場合もあります。書き込みが終わるとFirmataのスケッチが動きます。書き込みは一度だけで、次回からはボードの電源を入れるだけでFirmataのスケッチが動きます。開いているArduino Softwareを閉じて下さい。

 

Firmataの動作テスト

 

 

 

Firmataが起動したら、動作テストを行います。この動作テストはやらなくても良いのですがボードが正しく動いているかの確認のために行うことを推奨します。ダウンロードしたFirmata testを起動します。起動したらPortを設定します。ここでのPort番号は先ほどArduino Softwareで使用した番号と同じ番号を設定して下さい。標準のArudino以外の場合、うまく表示されない場合もあるので、その場合はスキップして白板ソフトでの動作を試してみて下さい。

 

 

接続が行われるとテスト画面からピンの状態を設定する事が出来るようになります。Pin13がボード上のLEDと接続されているので、OutputHLに切り換えてボード上のLEDON/OFFすることを確認して下さい。それ以外のピンも接続してテストする事も出来ます。動作が確認できたらFirmata testを閉じて下さい。Firmata testが開いたままだと白板ソフトからのUSB接続に失敗します。


白板ソフトのサンプルでの動作確認を行います。

 

USB通信用サンプルファイル http://www.mbrain.com/usb_sample.zip をダウンロードして開きます。zipファイルを解凍しサンプルファイルStandardFirmataUSB_20160520R.jpeg を白板ソフトで開きます。四角の部品がUSB通信用の部品になります。この部品の種類は実行部品でUSB用の変数を含むことでUSB通信がおこなれます。最初はUSB通信開始前の状態です。

次にUSBのポート番号に合わせてCOMxx:57600xx部分の数値を編集します。はさみを選択して部品上をクリックCOM15:57600の部分を2回クリックして選択し、表示されるポップアップボタンの真ん中の部品ダイアログボタンをクリックします。部品ダイアログが表示されます。

 

 

部品ダイアログのテキスト編集ボタンを押してテキストを編集します。

COMポート番号を接続中のArudinoボートに合わせた番号に変更してからOKボタンをクリックします。これで接続先のCOMポートの設定が更新されました。

 

 

 

 

 

矢印を選択して、USB通信用部品をクリックすることで通信が開始します。サンプルではdout[1]がデジタル出力、Pin5,Pin6をサーボ出力、ain[5]がアナログ入力5に設定しています。dout[1]32の値をドラッグしてpin13LEDON、0の値をドラッグでOFFにして動作の確認が出来ます。また、サーボのコントロールをPin5Pin6に接続することでサーボモータを動作させることが出来ます。アナログPin5に電圧を入れることでアナログ入力の動作の確認が出来ます。

 

2)USB通信用部品の使い方

 

 

USB通信部品には、Firmataとの通信プログラムとデータが入っています。参照したい変数を参照する部品を作成して部品間での通信を行います。参照したい変数名のテキストを作成して計算ボタンを押して変数参照の部品を作成してから、それを通信用部品の子部品として配置することで表を通して通信を行うことが出来ます。不要になった子部品は選択して削除出来ます。COM15:57600のようにポートを設定している子部品は削除すると設定出来なくなるので削除しないで下さい。子部品として設定した表の値を変えることでサーボやディジタル出力を行うことが出来ます。アナログ入力に関しては、入力の変化に合わせて値が変化します。共にUSB通信部品内のローカル変数の値と接続されています。

 

 

 

 

3)USB通信用部品のカスタマイズ方法

Firmataのピンのモードの変更も部品の変数の設定で行います。外部からの変数設定もしくは関係式を直接編集する事でも行えます。設定を変えた後は一度クリックして接続を切ってから再度接続して下さい。関係式の編集は通信用部品を選択してからポップアップボタンで部品ダイアログを表示して部品情報ウィンドウを開くことで行います。

 

 

右上が関係式(プログラム)部分で、その下がメッセージを変数になります。右上の式を修正してから、Ctrl+Enterキーで更新されます。ウィンドウを閉じた場合にも更新されます。

int PinMode[20] = 1; はピンモードです。最初は1のデジタル出力になっていますので、モードを変更したいピンの値を変更します。サンプルではPin5,Pin6がサーボ、Pin14から19がアナログ入力になっています。これらの設定はFirmata のプロトコルに合わせた設定になっています。変数din[2]はデジタル入力用、dout[2]はデジタル出力用変数で1データが8bitの2要素の配列になっています。ain[6]はアナログ入力用の変数です。aout_3からaout_11はアナログ出力用の変数です。_USBDevice$変数は、USBの通信ポートを示し、子部品のテキストから設定されます。_USBDevice$変数に値が設定されていることで部品(実行部品)のUSB通信が有効になり、@Tで値を送信し@Dで受信します。@D[0]が受信データ数で@D[1]移行が受信データになっています。以下にUSB通信部品の式を示します。

 

//

// USB通信コード(StandrdFirmata 2016/04/19

// ページ0で動作開始、ページ1で停止。

// @Tによる送信,@dの受信は実行部品でのみ有効

//

@R=(@P>=1)?255:128;

_USBDevice$;     // 接続用 COMポート情報

int din[2]; // ディジタル受信データ 8*2 16ch

int ain[6]; // アナログ受信データ6ch

int dout[2]=-1; // ディジタル送信データ 8*2 16ch

int aout_3=-1; // PWM.Servo送信データ6ch

int aout_5=-1; // PWM.Servo送信データ6ch

int aout_6=-1; // PWM.Servo送信データ6ch

int aout_9=-1; // PWM.Servo送信データ6ch

int aout_10=-1; // PWM.Servo送信データ6ch

int aout_11=-1; // PWM.Servo送信データ6ch

int PinMode[20] = 1; // ピンモード 0:In,1:Out,2;Analog,3:PWM,4:Servo

PinMode[5] = 4;  // Servo ここを変更することでピンのモードを変えます。

PinMode[6] = 4;  // Servo ここを変更することでピンのモードを変えます。

PinMode[14:19] = 2; // Analog  ここを変更することでピンのモードを変えます。

 

if((@d[0] >= 3)&&((@d[1] & 0xF0) == 0x90)){  // ディジタルデータ受信

  din[@d[1] & 0x0f] = (@d[2] & 0x7f) | ((@d[3] & 0x01) << 7),@d[0] -= 3;

}

if((@d[0] >= 3)&&((@d[1] & 0xF0) == 0xE0)){  // アナログデータ受信

  ain[@d[1] & 0x0f] = (@d[2] & 0x7f) | ((@d[3] & 0x7f) << 7),@d[0] -= 3;

}

if((@d[0] >= 1)&&((d[1] & 0xF0) != 0x90)&&((d[1] & 0xF0) != 0xE0)){

  @d[0] -= 1; // それ以外のデータ

}

if((@d[0] >= 1)&&((@d[1] & 0x80) == 0)){ // 途中データが残った場合

  @d[0], @d[0] -= 1;

}

@SimStart?InitReq=0;      // 開始時に@P>=1ならば初期化

@SimStart?InitReq=1;

if((@p >= 1)&&(InitReq)){ // 初期化データ送信

  @t=0xf4,@t=@,@t=PinMode;        // PinMode送信

  @(16),@t=0xc0+@,@t=1,@t=0xd0+@,@t=1; // set reporting by pin

}

if(dout >= 0){ // ディジタル出力

  @t=0x90+@,@t=dout&0x7f,@t=((dout&080)?1:0);

}

if(aout_3 >= 0){ // PWM,Servoアナログ出力

  @t=0xe3,@t=aout_3&0x7f,@t=((aout_3&0x3f80)>>7);

}

if(aout_5 >= 0){ // PWM,Servoアナログ出力

  @t=0xe5,@t=aout_5&0x7f,@t=((aout_5&0x3f80)>>7);

}

if(aout_6 >= 0){ // PWM,Servoアナログ出力

  @t=0xe6,@t=aout_6&0x7f,@t=((aout_6&0x3f80)>>7);

}

if(aout_9 >= 0){ // PWM,Servoアナログ出力

  @t=0xe9,@t=aout_9&0x7f,@t=((aout_9&0x3f80)>>7);

}

if(aout_10 >= 0){ // PWM,Servoアナログ出力

  @t=0xea,@t=aout_10&0x7f,@t=((aout_10&0x3f80)>>7);

}

if(aout_11 >= 0){ // PWM,Servoアナログ出力

  @t=0xeb,@t=aout_11&0x7f,@t=((aout_11&0x3f80)>>7);

}

 

 

LittleBits用のサンプル:

LittleBitsのArudinoボードのポート配置に合わせた部品を使ったサンプルを用意しました。入力3つと出力3つで動作します。ArudinoにStandardFirmataを書き込んでUSBで接続し、Commポート番号をテキスト編集して動きます。Aruduino_LittleB2.zip