4D Systems uCam-IIをArduinoでまずはSYNCさせる


このエントリーをはてなブックマークに追加

シリアルカメラであるuCAM-II | 4D Systems カメラモジュール | 4D Systems 【通販RS】

ちょっと扱ってみることにしたいが

どうやって動かしたらいいかわからなかったので

コマンドの練習がてら少しずつやっていく

ひとまず, 写真を取る前に SYNC させる必要があるのでそれだけやってみる


Arduinoのライブラリは一応ある

dgtlmoon/uCamII: Arduino library for 4D System’s uCam-II

があるにはあるが、どうにも動かし方がよくわからなかったので

MBEDのサンプルコード: uCam Development | Mbed

を参考にやってみた


とりあえずSYNCさせてみる

ArduinoUNOを使用して試してみる

公式 4D Systems | uCAM-II のDocumentationを見ると

コマンドリファレンスがあるがそもそもシリアル通信させてコマンドを送るという操作を(ライブラリ抜きで)あまりやったことがなかったので

ひとまずやってみることにする

ドキュメントの13ページにあるが、まずはカメラを操作するのに同期させてやる(SYNC)させてやる必要があるのでやってみる

コードは下記, githubにも置いてる

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// #include <uCamII.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); // (3:RX, 2:TX)
const unsigned char SYNC[] = {0xAA, 0x0D, 0x00, 0x00, 0x00, 0x00};
const unsigned char ACK[] = {0xAA, 0x0E, 0x0D, 0x00, 0x00, 0x00};
byte _SYNC_COMMAND[6] = {0xAA, 0x0D, 0x00, 0x00, 0x00, 0x00};
// #define cameraDebugSerial
void setup() {
Serial.begin(57600);
while (!Serial) {
Serial.println("wait");
}
Serial.println("serial connectted");
Serial.println("");
unsigned char buf[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
mySerial.begin(57600);
Serial.println("---uCam Initailse---");
// this will give 60 attempts to syn with the uCam module
for (int i=0; i<=60; i++) {
// send out the sync sync command
Serial.print("sending out SYNC command ");
Serial.print(i+1);
Serial.println(" times");
for (int i=0; i<6; i++) {
mySerial.write(SYNC[i]);
;
}
// if you use byte array, below is also usable insted of above for repeat `mySerial.write(SYNC[i])`
// mySerial.write(_SYNC_COMMAND, sizeof(_SYNC_COMMAND));
// get response from uCam
if (mySerial.available() > 0) {
Serial.println("");
for (int i=0; i<6; i++) {
buf[i] = mySerial.read();
}
}
if (buf[0] == 0xAA && buf[1] == 0x0E && buf[2] == 0x0D && buf[4] == 0x00 && buf[5] == 0x00) {
Serial.print("ACK received: ");
for (int i=0; i<6; i++) {
Serial.print(buf[i], HEX);
}
Serial.println("");
// get response from uCam
if (mySerial.available() > 0) {
for (int i=0; i<6; i++) {
buf[i] = mySerial.read();
}
if (buf[0] == 0xAA && buf[1] == 0x0D && buf[2] == 0x00 && buf[3] == 0x00 && buf[4] == 0x00 && buf[5] == 0x00) {
Serial.print("SYNC received: ");
for (int i=0; i<6; i++) {
Serial.print(buf[i], HEX);
}
Serial.println("");
Serial.println("Sending out ACK command");
for (int i=0; i<6; i++) {
mySerial.write(ACK[i]);
}
Serial.print("SYNC complete after ");
Serial.print(i+1);
Serial.println(" attempts");
break;
} else {
Serial.println("No SYNC received... trying again...");
}
} else {
Serial.println("No ACK received... trying again...");
}
}
if (i==60) {
Serial.println("Testing failed - Too many attempts");
}
delay(5 + i);
}
}
void loop() {
}


上記コードを動かして、Arduinoのシリアルモニタで確認すると下記のようなのが出てくれば成功



注意点がいくつかあって

  • ArduinoとPCの通信シリアル速度(ボーレート)と、uCamIIに書き込む速度(ボーレート)を同じにする
    • 上記コードだと Serial.begin(57600)mySerial.begin(57600) でボーレートを揃えておく
  • SYNCコマンドの送信は60回程度繰り返す
    • ドキュメント13ページ目に書かれているが、SYNCコマンドは60回程度送るようにと書かれている
    • 自分が動かしてみた時は、2回程度送ればACK, SYNCが返ってきた
  • 繰り返しコマンドを送る際にdelayを入れる
    • これも公式のドキュメントに書いてあるが、どうやら最初にSYNCコマンドを繰り返し送る際に
      • 最初のコマンドを送った後は 5ms delayさせる
      • 次のコマンドからは、 1ms ずつ足して delay させていく
    • という操作を一応加えている (forループの最後の delay(5+i); の部分)

ひとまずこれでSYNCまでは試せたので、がんばって撮影までやってみる


このエントリーをはてなブックマークに追加