先回、VDIP1をデータモードで使用したが、コマンドモードではVinculumデバイスの各種設定を行う事が出来る。「VDIP1の使い方」の回路図を見ると、DATA-RQ(ADBUS5)がプルダウンされているが、これをHにするとコマンドモードとなる。この状態でTeraTerm経由でコマンドを送出した様子が以下の通り。
コマンドの詳細はFTDI社のマニュアル、「Vinculum Firmware User Manual」を参照。
回路図は以下の通り。
VDIP1の信号ピンの論理レベルは3.3Vであるが、データシートによると「5V safe bidirectional data」と明記してあるピンもあるので、それらは回路図の通り直結が可能である。そうでない信号(上図の場合、RS#)はレベル変換の必要がある。
この回路で以下のようなスケッチを組み、初期設定をした。
- IPA
Vinculumデバイスへのコマンド送出は、バイナリモードとASCIIモードがある。このコマンドでASCIIモードへ切り替える。 - QP2
USBポート2へ接続されているデバイス種類の問合せ。
VDIP1ボードに実装されているUSB-Aコネクタはポート2である。この例ではFTDI社のFT232RLが接続されているので、その旨($01)返信されている。 - FBD #9C8000
FT232RLが接続されている場合、そのBaud rateを変更する事が出来る。このコマンドで19200bpsに設定される。 - SBD $9C8000
Vinculumデバイスとの通信Baud rateを設定。このコマンドで19200bpsに設定される。
コマンドの詳細はFTDI社のマニュアル、「Vinculum Firmware User Manual」を参照。
Arduinoマイコンと接続
予備的な実験が終わったので、本来の目的であるCDC class deviceのUSB出力を持つセンサをArduinoマイコンへ接続する。回路図は以下の通り。
VDIP1の信号ピンの論理レベルは3.3Vであるが、データシートによると「5V safe bidirectional data」と明記してあるピンもあるので、それらは回路図の通り直結が可能である。そうでない信号(上図の場合、RS#)はレベル変換の必要がある。
この回路で以下のようなスケッチを組み、初期設定をした。
#define DATA_RQ 8 #define VDIP_RS 9 String rcvData; //********************************************************************************** // 初期化処理(リセット後一度だけ実行) //********************************************************************************** void setup() { char chkChr = '\0'; // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial); // wait for serial port to connect // IO settings pinMode(DATA_RQ,OUTPUT); digitalWrite(DATA_RQ,HIGH); //初期値はコマンドモード pinMode(VDIP_RS,OUTPUT); // VDIP1 Reset digitalWrite(VDIP_RS, LOW); delay(100); digitalWrite(VDIP_RS, HIGH); // Waiting for VDIP1 start up // VDIP1起動後、"Ver 03.64VDAPF On-Line:"→"Device Detected P2"受信待 chkChr = '\0'; rcvData = ""; do { if (chkChr=='\r') rcvData = ""; if (Serial.available()>0){ chkChr = Serial.read(); if (chkChr!='\r') rcvData.concat(chkChr); } } while (rcvData != "Device Detected P2"); //VDIP1 初期設定 Baoud rate を変更する Serial.write("IPA\r"); do { if (Serial.available()>0) chkChr = Serial.read(); } while (chkChr != '\r'); //応答待ち Serial.write("SBD $34C000\r"); //57600bps //一旦ArduinoのSerialPortをClose、VDIP1のbaud rateに合わせて再開 delay(100);Serial.end(); // ウェイトを入れないとうまくいかなかった。 delay(100);Serial.begin(57600); while (!Serial); // wait for serial port to connect. //VDIP1データモードへ移行 digitalWrite(DATA_RQ,LOW); } //********************************************************************************** // メインループ(この処理を繰り返し実行) //********************************************************************************** void loop() { char rcvChr; //VDIP1経由でCDC class deviceへ送信 Serial.write("xxxxxxx\r"); //VDIP1経由でCDC class deviceから1文字受信 if (Serial.available()>0) rcvChr = Serial.read(); }