実験 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

前へ

実験 RS-485 (3) ArduinoでRS-485に対応する その2 熱電対ADAM-4011

次へ

Arduino夏休み<架空>ワークショップ 3回で読み切りの1回目「これだけあればOK」