VDIP1の使い方(2)

先回、VDIP1をデータモードで使用したが、コマンドモードではVinculumデバイスの各種設定を行う事が出来る。「VDIP1の使い方」の回路図を見ると、DATA-RQ(ADBUS5)がプルダウンされているが、これをHにするとコマンドモードとなる。この状態でTeraTerm経由でコマンドを送出した様子が以下の通り。
  1. IPA
    Vinculumデバイスへのコマンド送出は、バイナリモードとASCIIモードがある。このコマンドでASCIIモードへ切り替える。
  2. QP2
    USBポート2へ接続されているデバイス種類の問合せ。
    VDIP1ボードに実装されているUSB-Aコネクタはポート2である。この例ではFTDI社のFT232RLが接続されているので、その旨($01)返信されている。
  3. FBD #9C8000
    FT232RLが接続されている場合、そのBaud rateを変更する事が出来る。このコマンドで19200bpsに設定される。
  4. 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();

}