RS485云台控制学习文档Word文件下载.docx
《RS485云台控制学习文档Word文件下载.docx》由会员分享,可在线阅读,更多相关《RS485云台控制学习文档Word文件下载.docx(12页珍藏版)》请在冰点文库上搜索。
在linux机下运行自己的串口程序,注意打开的串口和波特率,校验位等设置要和windows机一致,可以将自己的串口程序运行在接收数据状态,并打印信息,在windows机下用串口调试精灵发送数据,验证在linux机下接受是否正确,同样可以验证发送数据是否正确。
关于串口设置程序:
1.
配置波特率:
注意每台机器都有输出输入接收信息的速度,所以用cfsetispeed和cfsetospeed来分别设置。
Linux串口设置过程中有一个非常重要的结构体structtermios,它包括了串口端的任何配置,在termios.h中被定义。
系统为波特率专门准备了一张表用B38400,B19200…代替。
实际上传出的是38400和19200这些值。
函数原型:
Voidset_speed(intfd,intspeed).
2.
配置奇偶校验,数据,停止位。
这三个参数通常放在一起配置,databits是数据位,stopbits是停止位,parity是校验位。
Termios成员中共定义c_cflag控制项c_lflag线路项c_iflag输入项c_oflag输出项c_cc控制字符c_ispeed输入波特c_ospeed输出波特那么多项,对于每一项都有很多的配置,比较复杂,但就一个通用的串口框架,主要进行奇偶校验,数据,停止位的配置。
而其他的一些控制项。
intset_Parity(intfd,intdatabits,intstopbits,intparity)
3.
配置好串口后,就可以打开串口,并不断的从串口读数据,并打印出这些数据进行验证自己的程序。
此部分Down了个串口程序来熟悉linux下的串口编程。
三.云台控制协议pelco-D/P
云台有水平云台,旋转云台和万向云台等多种类型,水平云台和旋转云台的运动速度是恒定的。
只有上下左右四个方向,每个方向都有一个限位开头,因而每一方向行程的距离固定,而万向云台运动速度是可变的,且运动方向是任意,控制比较复杂。
对与云台的工作原理和电路进行了基本了解,由于实际应用时只需通过串口向云台发送其能识别的命令来完成相应的控制即可。
云台测的东西没有进一步的深入了解。
云台控制系统设计时要选协议,每个云台都有协议可以选择,要么自动识别,要么通过拨码开关来选择。
具体要看设备说明书。
每个厂家的拨码方式不一样。
协议选好后,就可以向云台发送命令控制云台,控制云台时发送一个指令,都要在发送一个停止指令,否则云台将一直执行那一操作。
查资料发现大多数云台都支持pelco-D和pelco-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:
PELCO-P协议一般采用RS-485传输,波特率为4800,1位起始位和停止位,8位数据位,无校验位。
格式:
起始码是固定值$A0。
地址码是设备的逻辑地址,可由接收设备上的DIP开关来设定?
?
。
数据位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环境下的云台控制程序
首先在linux环境下编写简单的程序验证命令的正确性,例如利用write函数直接通过RS485向云台写命令(符合云台控制协议),查看命令是否执行正确,如果正确则编写云台控制程序将这些命令封装成函数,以供上层函数调用。
全局变量:
intptz_protocol,baudrate,ptz_fd云台所采用的协议和波特率,串口句柄。
数据结构:
考虑到pelco-D和pelco-P协议命令消息格式的规定,
对于pelco-D定义命令消息:
staticstructst_message{
charstx;
charaddress;
charcommand1,command2,data1,data2;
charchecksum;
}send_msg;
(消息各部分的含义和规定见本文档第三部分)
对于pelco-P定义命令消息:
chardata1,data2,data3,data4;
charetx;
(消息各部分的含义和规定见本文当第三部分)
*str_cmd为传参,此字符串中应包括需要实现的功能,操作,速度等信息。
功能命令应包括:
TILT_UP上TILT_DOWN下PAN_RIGHT右PAN_LEFT左:
PT_LEFT_UP
左上
PT_LEFT_DOWN左下
PT_RIGHT_UP右上
PT_RIGHT_DOWN
右下
Z_ZOOM_IN:
Z_ZOOM_OUT:
FOCUS_FAR:
调焦远
FOCUS_NEAR调焦近
IRIS_OPEN
光圈开
IRIS_CLOSE:
光圈关
SET_PRESET设置预制点
GOTO_PRESET运动到预置点
CLE_PRESET删除预置点
PAN_AUTO自动扫描
PAN_AUTO_STOP停止自动扫描
PTZ_STOP
停止
可以将要实现的各种功能定义成枚举类型,然后将各个功能下的具体操作动作也定义成枚举类型。
程序模块设计:
设计过程中分为三个大模块:
ptz_init模块主要完成打开串口,并对串口进行设置,设置波特率,数据位,校验位等
ptz_exit模块主要来关闭串口操作。
实现比较简单
ptz_message_handle模块是主要实现部分,实现命令的解析,根据要实现的功能设置send_msg.结构体,并将此结构体,通过RS485串口发送给云台。
此部分大体的流程设计如下:
ptz_message_handle模块:
*str_arg参数需要规定一下格式以便解析函数能够正确解析它可以根据自己需要的进行规定,例如各项参数间采用@符号隔开等。