実験 RS-485 (4) ArduinoでRS-485に対応する その3 PTZ
これまで、RS-485につながる電力と温度のデータ収集装置をつなぎました。ここでは、監視カメラの回転台PTZを利用します。PTZはパン・チルト・ズームの頭文字ですが、入手した「Electrical Auto Rotate Pan PTZ RS485 Control Bracket CCTV Analog HD IP Cameras」は、左右の回転PANだけができます。
●PTZのおもなスペック
- 動作電圧; 12V、100mA
- RS-485信号;黄色 A+ 青色 B-
- 通信プロトコル;PELCO-D
- デフォルト・ボーレート;2400bps
- デフォルト・アドレス;0x01
●通信プロトコルPELCO-D
アスキ・コードです。
◆書き込みフォーマット
byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 |
0xFF | アドレス | コマンド1 | コマンド2 | データ1 | データ2 | チェックサム |
◆主なコマンドとデータ
コマンド1 | コマンド2 | データ1 | データ2 | |
---|---|---|---|---|
STOP | 0x00 | 0x00 | 0x00 | 0x00 |
LEFT | 0x00 | 0x04 | Pan Speed | Tilt Speed |
RIGHT | 0x00 | 0x02 | Pan Speed | Tilt Speed |
PAN Speedの最大値は0x3Fですが、このPTZはすべての値で速度は同じです。
●接続
12V AC-DCアダプタをつなぎます。特にLEDインジケータなどが光りません。電源が入ると、約半周分回転し、元の位置に戻るという動作をします。
RS-485の2本の線は、黄色のケーブルに黄色のカバー、白色のケーブルに青色のカバーの組み合わせと、赤色と黒色の組み合わせの2種類が市販されているようです。黄色と青色の結線情報は見つかりませんでした。赤色と黒色の組み合わせは赤色がA+のようです。
黄色カバーをA+、青色カバーをB-にRS-485アダプタとツイスト・ペア線でつなぎました。複数つないだ端っこのRS-485デバイスには120Ωの終端抵抗を付けます。
●スケッチ
左に回転、ストップ、右に回転というコマンドを送ります。通常は、PTZ専用のコマンド指令装置を使って動作をプリセットして、それを呼び出して動作させるという使い方が想定されているようです。
#include <SoftwareSerial.h> // Software serial port
#define rxPin 10
#define txPin 11
#define MAX485_DE 3
#define MAX485_RE_NEG 2
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
int counter=0;
void preTransmission() {
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission() {
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup(){
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
Serial.begin(9600); // console Baudrate 9600
mySerial.begin(2400); // Pelco baud rate 1200,2400(default) or 4800
}
void loop() {
//Sync byte = 0xff , 0x01 is address
byte checkStop = (0x01 + 0x00 + 0x00 + 0x00 + 0x00) % 256;
byte checkLeft = (0x01 + 0x00 + 0x04 + 0x3F + 0x00) % 256;
byte checkRight = (0x01 + 0x00 + 0x02 + 0x00 + 0x00) % 256;
byte stop[7] = {0xFF,0x01,0x00,0x00,0x00,0x00,checkStop} ;
byte left[7]= {0xFF,0x01,0x00,0x04,0x3F,0x00,checkLeft};
byte right[7]= {0xFF,0x01,0x00,0x02,0x00,0x00,checkRight};
preTransmission() ;
delay(50);
counter=0;
while(counter<7) {
mySerial.write(left[counter]);
Serial.print(String(left[counter],HEX) + " ");
counter+=1;
}
postTransmission();
Serial.println("-LEFT");
delay(5000);
preTransmission() ;
delay(50);
counter=0;
while(counter<7) {
mySerial.write(stop[counter]);
Serial.print(String(stop[counter],HEX) + " ");
counter+=1;
}
postTransmission();
Serial.println("-STOP");
delay(100);
preTransmission() ;
delay(50);
counter=0;
while(counter<7) {
mySerial.write(right[counter]);
Serial.print(String(right[counter],HEX) + " ");
counter+=1;
}
postTransmission();
Serial.println("-RIGHT");
delay(5000);
}
実行結果です。
●実行中の波形
(※)参考URL
PELCO-Dプロトコル http://bruxy.regnet.cz/programming/rs485/pelco-d.pdf
PELCO-D PROTOCOL TUTORIAL https://www.commfront.com/pages/pelco-d-protocol-tutorial#2
PELCO-D protocol command list https://www.epiphan.com/userguides/LUMiO12x/Content/UserGuides/PTZ/3-operation/PELCODcommands.htm
Arduino.ccのフォーラム Receive Pelco commands from cctv system, move servo's
http://forum.arduino.cc/index.php?topic=230959.0
Arduino-and-PelcoD https://github.com/cakoch10/Arduino-and-PelcoD/blob/master/M1_D_controller.ino