RS485/云台控制(PTZ)学习文档
zxf
一.项目任务:
二.学习步骤
1.验证串口,云台等硬件
2.熟悉linux下的串口编程
1.
2.
这三个参数通常放在一起配置,databits是数据位,stopbits是停止位,parity是校验位。Termios成员中共定义c_cflag 控制项 c_lflag 线路项 c_iflag 输入项 c_oflag 输出项 c_cc 控制字符 c_ispeed 输入波特 c_ospeed 输出波特 那么多项,对于每一项都有很多的配置,比较复杂,但就一个通用的串口框架,主要进行奇偶校验,数据,停止位的配置。而其他的一些控制项。函数原型:
int set_Parity(int fd,int databits,int stopbits,int parity)
3.
三.云台控制协议pelco-D/P
PELCO-D:
数据格式:1位起始位、8位数据、1位停止位,无效验位。波特率:2400B/S
命令格式:
1.该协议中所有数值都为十六进制数
2.同步字节始终为FFH
3.地址码为摄像机的逻辑地址号,地址范围:00H–FFH可以在设备中设置。
4.指令码表示不同的动作
5.数据码1、2分别表示水平、垂直方向速度(00-3FH),FFH表示“turbo”速度
6.校验码 = MOD[(字节2 + 字节3 + 字节4 + 字节5 + 字节6)/100H]
命令字1和命令字2设置如下:
Sence码与Bit4和Bit3有关。在Bit4和Bit3为1的情况下,如果Sence码为1,则命令就是自动扫描和和摄像机打开;如果Sence码为0,则命令就是手动扫描和摄像机关闭。当然如果Bit4或Bit3为0的话那命令就无效了。
数据1表示镜头左右平移的速度,数值从$00(停止)到$3F(高速),另外还有一个值是$FF,表示最高速。
数据2表示镜头上下移动的速度,数值从$00(停止)到$3F(最高速)。
校验码是指Byte2到Byte6这5个数的和(若超过255则除以256然后取余数)。
Pelco-D的命令码和数据码的参考命令:
以地址码0x01为例的部分指令:
{0xff,0x01,0x00,0x08,0x00,0xff,0x08,}//上
{0xff,0x01,0x00,0x10,0x00,0xff,0x10,}//下
{0xff,0x01,0x00,0x04,0xff,0x00,0x04,}//左
{0xff,0x01,0x00,0x02,0xff,0x00,0x02,}//右
{0xff,0x01,0x00,0x20,0x00,0x00,0x21,}//变倍短
{0xff,0x01,0x00,0x40,0x00,0x00,0x41,}//变倍长
{0xff,0x01,0x00,0x80,0x00,0x00,0x81,}//聚焦近
{0xff,0x01,0x01,0x00,0x00,0x00,0x02,}//聚焦远
{0xff,0x01,0x02,0x00,0x00,0x00,0x03,}//光圈小
{0xff,0x01,0x04,0x00,0x00,0x00,0x05,}//光圈大
{0xff,0x01,0x00,0x0b,0x00,0x01,0x0d,}//灯光关
{0xff,0x01,0x00,0x09,0x00,0x01,0x0b,}//灯光开
{0xff,0x01,0x00,0x07,0x00,0x01,0x09,}//转至预置点001
{0xff,0x01,0x00,0x03,0x00,0x01,0x05,}//设置预置点001
{0xff,0x01,0x00,0x05,0x00,0x01,0x07,}//删除预置点001
以上对应的停命令均是:
{0xff,0x01,0x00,0x00,0x00,0x00,0x01,}//停命令
Pelco-P:
数据位1-4意义:
停止码是固定值 $AF 。校验码是 Byte2 到 Byte6 这 5 个数的异或值(XOR)。地址码是从 0编起的,所以地址码$00表示第一台设备。
以地址码0x01为例:
{0xa0,0x01,0x00,0x08,0x00,0x30,0xaf,0x39,}//上
{0xa0,0x01,0x00,0x10,0x00,0x30,0xaf,0x21,}//下
{0xa0,0x01,0x00,0x04,0x10,0x00,0xaf,0x15,}//左
{0xa0,0x01,0x00,0x02,0x10,0x00,0xaf,0x13,}//右
{0xa0,0x01,0x00,0x40,0x00,0x00,0xaf,0x41,}//变倍短
{0xa0,0x01,0x00,0x20,0x00,0x00,0xaf,0x21,}//变倍长
{0xa0,0x01,0x02,0x00,0x00,0x00,0xaf,0x03,}//聚焦近
{0xa0,0x01,0x01,0x00,0x00,0x00,0xaf,0x00,}//聚焦远
{0xa0,0x01,0x08,0x00,0x00,0x00,0xaf,0x09,}//光圈小
{0xa0,0x01,0x04,0x00,0x00,0x00,0xaf,0x05,}//光圈大
无命令字发送//灯光关
无命令字发送//灯光开
{0xa0,0x01,0x00,0x96,0x00,0x20,0xaf,0xb7,}//自动巡航
{0xa0,0x01,0x00,0x99,0x00,0x20,0xaf,0xb8,}//关闭自动巡航
{0xa0,0x01,0x00,0x07,0x00,0x01,0xaf,0x07,}//转至预置点001
{0xa0,0x01,0x00,0x03,0x00,0x01,0xaf,0x03,}//设置预置点001
{0xa0,0x01,0x00,0x05,0x00,0x01,0xaf,0x01,}//删除预置点001
以上对应的停命令均是(上下左右、变倍、聚焦、光圈均有停命令):
{0xa0,0x01,0x00,0x00,0x00,0x00,0xaf,0x01,}
云台控制(PTZ)命令控制说明:
⒈ 当控制云台水平、上下方向动作或“IRIS”、“FOCUS”、“ZOOM”时需要使相应的控制位为“1”,不用控制的相应位置为“0”
⒉ 当需要云台PAN/TILT两方向同时动作时,只需将PAN/TILT的相应控制位置“1”即可,PAN/TILT 的速度控制由WORD5/WORD6决定
⒊将WORD3、WORD4的所有位置为“0”可以停止云台的动作
5、扩充命令
四.编写并调试Linux环境下的云台控制程序
全局变量:int ptz_protocol, baudrate,ptz_fd云台所采用的协议和波特率,串口句柄。
数据结构:考虑到pelco-D和pelco-P协议命令消息格式的规定,
对于pelco-D定义命令消息:
static struct st_message {
} send_msg;(消息各部分的含义和规定见本文档第三部分)
对于pelco-P定义命令消息:
static struct st_message {
} send_msg;(消息各部分的含义和规定见本文当第三部分)
*str_cmd为传参,此字符串中应包括需要实现的功能,操作,速度等信息。功能命令应包括:
PT_RIGHT_UP 右上
可以将要实现的各种功能定义成枚举类型,然后将各个功能下的具体操作动作也定义成枚举类型。
程序模块设计:
1.
2.
3.
ptz_message_handle模块:
*str_arg参数需要规定一下格式以便解析函数能够正确解析它可以根据自己需要的进行规定,例如各项参数间采用@符号隔开等。