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#)はレベル変換の必要がある。

この回路で以下のようなスケッチを組み、初期設定をした。
Arduinoスケッチ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#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();
 
}