Arduinoに接続したjpegカメラをTeratermで操作しました

Teratermで何をするの?

  • jpegカメラをPCと直結して通信ソフトTeratermを使い操作します。
  • [ArduinoをUSBシリアル変換器として使う]でArduinoをUSBシリアル変換器として使い、シリアル通信のできる部品とPCが直結できることが解りました。通信ソフトTeratermからコマンドをjpegカメラに送りjpegカメラから情報を読んだり操作したりします。

回路図は?

必要な部品・器具は?

jpeg カメラ1個
抵抗 [10KΩ] (秋月電子通商のjpegカメラの部品に付属していました。)2個
Arduino UNO R31個

Teratermでjpegカメラ操作をする設定は?

  • jpegカメラで受信できるコマンドはバイナリーのデータです。jpegカメラから送信される映像データはバイナリーデータです。Teratermがバイナリーのデータを受信・送信できるように設定します。
Teratermの通信速度の設定
  • Teratermの通信速度をjpegカメラと通信速度に同じ速度に設定します。Jpegカメラを購入した秋月電子通商のサイトからAdafruitの製品紹介[Miniature TTL Serial JPEG Camera with NTSC Video]へのリンクがあります。通信速度は「Baud rate: Default 38400」と記載されています。
  • メニューの[設定(S)] -> [シリアルポート(E)]で表示されるダイアログの[ボー・レート(B)]を「38400」とします。
Teratermのバイナリーデータ受信・送信設定
  • program filesのTera TermフォルダにあるTERATERM.INIの中の「Debug=off」を下のように「Debug=on」に書き換える。
  • 「DebugModes=all」を下のように「DebugModes=hex」に書き換える。
  • 通常の表示とhex(16進)の表示は、[Shift]+[Esc]で切り替えることができます。
; Display all characters (debug mode)
Debug=on
; Debug mode type which can be selected by user.
;   on|all   = All types
;   off|none = Disabled debug mode
;   normal   = usual teraterm debug mode
;   hex      = hex output
;   noout    = disable output completely
DebugModes=hex
Teratermのバイナリーデータ送信設定
  • メニューの[設定(S)] -> [全般(G)]で表示されるダイアログの[言語(L)]を「English」とする。
Teratermのバイナリーデータ送信方法
  • Teratermのマクロ用ファイルである拡張子がttlのテキストデータにコマンドを記述する。
  • 例えば、16進数の0x56,0x00,0x11,0x00を送信する場合は、以下のマクロとなる。このマクロを書いたファイルを例えば、version.ttlとして保存する。
send $56$00$11$00
  • メニューの[コントロール(O)] -> [マクロ(M)]とすると、マクロファイルの選択ダイアログが表示されるので、例えば、作成したマクロファイルversion.ttlを選ぶと、マクロが実行される。

jpegカメラを操作するコマンドはどこで調べるの?

  • jpegカメラプロトコルの説明に送受信のフォーマットが記載されています。

受信コマンドフォーマット:()内の数字はバイト数
[Protocol sign(1)]+[Serial number(1)]+[Command(1)]+[Data-lengths(1)]+[Data(0~16)
返信コマンドフォーマット:()内の数字はバイト数
[Protocol sign(1)]+[Serial number(1)]+[Command(1)]+[Status(1)]+[Datalengths(1)]+[Data(0~16)]
Protocol sign :受信は 0x56(‘V’), 返信は 0x76(‘v’).
Serial number :複数のデバイスが取り付けられている場合は指定する。1台の場合は 0。0 から 255の数字を使用する。
Command :コマンドごとに割り当てられた数字
Data-lengths :送信するデータの長さ
Data :すべてのコマンドは異なったデータ長を待ち 0 から16 バイトである
Status :受信データが正しいかどうかを示す。0であれば正しく、それ以外であれば正しくない

  • jpegカメラプロトコルの説明にコマンド一覧および詳細が記載されている。下記の画像はコマンド一覧。

jpegカメラを実際に操作する手順は?

  • Teratemを設定しました。jpegカメラのプロトコルが解かりました。Teratermのマクロ機能を使ってjpegカメラと通信すれば、Teratermから送信したコマンドに応じてjpegカメラからデータが返送されます。
  • [Arduinoでjpegカメラの画像をSDカードに保存しました]の記事でjpegカメラで画像撮影をしました。シリアルモニタに状況が表示されます。スケッチがどのように動いているかを調べて、Teratermで同様な操作をした時にjpegカメラからの返信データを確認します。
  • jpegカメラの接続を確認し接続されいる場合は「Camera Found:」の表示がされています。どのように判定しているかスケッチを調べると、「cam.begin()」による判定でした。
  // Try to locate the camera
  if (cam.begin()) {
    Serial.println("Camera Found:");
  } else {
    Serial.println("No camera found?");
    return;
  }
  • camがどこで定義されているか調べます。スケッチの最初のほうで「Adafruit_VC0706」のクラスとして定義されていました。
Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);
  • jpegカメラの接続の有無を「cam.begin()」で判定をしています。[Adafruit_VC0706.h]の中で「begin()」がどう定義されているかを調べると、public関数として定義されています。
  boolean begin(uint32_t baud = 38400);
  • begin()関数は[Adafruit_VC0706.ccp]の中で定義されていて、reset()を読んでいます。reset()は成功するとTrueを返し、それがbegin()からも返り、reset()が成功したらjpegカメラが接続されていると判定しているようです。
/**************************************************************************/
/*!
    @brief Connect to and reset the camera
    @param baud Camera interface baud rate
    @return True on reset success
*/
/**************************************************************************/
boolean Adafruit_VC0706::begin(uint32_t baud) {
#if defined(__AVR__) || defined(ESP8266)
  if (swSerial)
    swSerial->begin(baud);
  else
#endif
    hwSerial->begin(baud);
  return reset();
}

/**************************************************************************/
/*!
    @brief  Soft reset the camera
    @return True on success
*/
/**************************************************************************/
boolean Adafruit_VC0706::reset() {
  uint8_t args[] = {0x0};

  return runCommand(VC0706_RESET, args, 1, 5);
}
  • reset()関数の中の「runCommand(VC0706_RESET, args, 1, 5);」について調べます。VC0706_RESETは[Adafruit_VC0706.h]の中で定義されていて、0x26の値を持ちます。jpegカメラプロトコルのコマンド一覧を読むと[SYSTEM RESET]のCommand Byteは0x26なので、この定義がリセットコマンドを紐づけていることが解ります。
#define VC0706_RESET 0x26
  • [Adafruit_VC0706.h]の中のrunCommand()関数の定義を調べます。
  void common_init(void);
  boolean runCommand(uint8_t cmd, uint8_t args[], uint8_t argn, uint8_t resp, boolean flushflag = true);
  • [Adafruit_VC0706.cpp]の中でrunCommand()関数が定義されていました。runCommand()関数からsendCommand()関数を呼んでいます。sendCommand()関数の中にシリアルデータの書き込みwrite()関数が現れます。
boolean Adafruit_VC0706::runCommand(uint8_t cmd, uint8_t *args, uint8_t argn, uint8_t resplen, boolean flushflag) {
  // flush out anything in the buffer?
  if (flushflag) {
    readResponse(100, 10);
  }

  sendCommand(cmd, args, argn);
  if (readResponse(resplen, 200) != resplen)
    return false;
  if (!verifyResponse(cmd))
    return false;
  return true;
}

void Adafruit_VC0706::sendCommand(uint8_t cmd, uint8_t args[] = 0, uint8_t argn = 0) {
#if defined(__AVR__) || defined(ESP8266)
  if (swSerial) {

    swSerial->write((byte)0x56);
    swSerial->write((byte)serialNum);
    swSerial->write((byte)cmd);

    for (uint8_t i = 0; i < argn; i++) {
      swSerial->write((byte)args[i]);
      // Serial.print(" 0x");
      // Serial.print(args[i], HEX);
    }
  } else
#endif
  {
    hwSerial->write((byte)0x56);
    hwSerial->write((byte)serialNum);
    hwSerial->write((byte)cmd);

    for (uint8_t i = 0; i < argn; i++) {
      hwSerial->write((byte)args[i]);
      // Serial.print(" 0x");
      // Serial.print(args[i], HEX);
    }
  }
  // Serial.println();
}
  • sendCommand()関数の実装部で16進の文字列を作ってjpegカメラに送っているようです。
  if (swSerial) {

    swSerial->write((byte)0x56);
    swSerial->write((byte)serialNum);
    swSerial->write((byte)cmd);

    for (uint8_t i = 0; i < argn; i++) {
      swSerial->write((byte)args[i]);
      // Serial.print(" 0x");
      // Serial.print(args[i], HEX);
    }
  • reset()関数の中のrunCommand(VC0706_RESET, args, 1, 5)は16進の文字列として以下のようになります。
  • 0X56, 0x00, 0x26,0x00 この16進数の列をTeratermのマクロを使ってjpegカメラに送信します。
  • Teratermのマクロは send $56$00$26$00 です。このマクロをTeratermで起動させるとjpegカメラからデータが返信されました。
v&VC0703 1.00
Ctrl infr exist
OV7720
525
Init end
  • Arduino UNO R3を経由してPCからTeratermを使いjpegカメラの操作が出来ました。他のシリアル通信機能がある部品の動作確認や個別機能の確認をしたい時など、スケッチを作るのが面倒な場合は、このような方法も使えるかなと思います。
関連する記事は?

ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。