RS485/云台控制(PTZ)学习文档

来源:互联网 发布:番茄工作法软件 编辑:程序博客网 时间:2024/05/21 14:47
RS485/云台控制(PTZ)学习文档

zxf

一.项目任务:

       在linux环境下通过RS485串口实现对云台镜头的各种控制(包括摄像头的打开,关闭,各个方向的运动及运动速度,预设点,自动扫描,变倍,调焦,光圈,视角宽窄等等的各项控制)。

二.学习步骤

 

     

1.验证串口,云台等硬件

       考虑先在windows环境下运行串口调试精灵等软件,采用RS232-RS485的接口转换器将PC机与云台相连,通过串口调试精灵向云台发送命令(根据具体云台所采用的协议pelco-d或是pelco-p),验证云台能否正常工作,以保证后续工作顺利进行。

2.熟悉linux下的串口编程

       串口是电脑上一种很通用设备通信的协议,常用PC机上包含的是RS232规格的串口,当然,除了RS232 ,还有RS485和RS422两种规格,用于不同的设备通信;linux环境下万物皆文件,都是文档,串口是设备文档,配置好后,其他东西就当成文档进行操作。

       串口编程中比较重要的是串口的设置,需要配置的部分包括波特率,数据位,停止位,奇偶校验等。关于linux下串口设置的例子和程序网上有很多,而且基本上内容大同小异。

       可以采用如下方法来验证自己在linux下的串口程序:准备PC机两台(一台装Linux系统,另一台装windows即可),用串口线分别和两台计算机的串口相连,在windows机下运行串口调试软件,并打开com1(linux下对应串口ttyS0)等待操作。在linux机下运行自己的串口程序,注意打开的串口和波特率,校验位等设置要和windows机一致,可以将自己的串口程序运行在接收数据状态,并打印信息,在windows机下用串口调试精灵发送数据,验证在linux机下接受是否正确,同样可以验证发送数据是否正确。

       关于串口设置程序:

 1.              配置波特率:注意每台机器都有输出输入接收信息的速度,所以用cfsetispeed和cfsetospeed来分别设置。Linux串口设置过程中有一个非常重要的结构体struct termios ,它包括了串口端的任何配置,在termios.h中被定义。系统为波特率专门准备了一张表用B38400,B19200…代替。实际上传出的是38400和19200这些值。函数原型:Void set_speed(int fd,int speed).

 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.              配置好串口后,就可以打开串口,并不断的从串口读数据,并打印出这些数据进行验证自己的程序。此部分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,0x40,0x00,0x00,0x21,}//变倍短

  {0xff,0x01,0x00,0x20,0x00,0x00,0x41,}//变倍长

  {0xff,0x01,0x01,0x00,0x00,0x00,0x81,}//聚焦近

  {0xff,0x01,0x00,0x80,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向云台写命令(符合云台控制协议),查看命令是否执行正确,如果正确则编写云台控制程序将这些命令封装成函数,以供上层函数调用。

全局变量:int ptz_protocol, baudrate,ptz_fd云台所采用的协议和波特率,串口句柄。

数据结构:考虑到pelco-D和pelco-P协议命令消息格式的规定,

对于pelco-D定义命令消息:

static struct st_message {

       char stx;

       char address;

       char command1, command2, data1, data2;

       char checksum;

} send_msg;(消息各部分的含义和规定见本文档第三部分)

对于pelco-P定义命令消息:

static struct st_message {

       char stx;

       char address;

       char data1, data2, data3, data4;

       char etx;

       char checksum;

} send_msg;(消息各部分的含义和规定见本文当第三部分)

 

*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  停止

可以将要实现的各种功能定义成枚举类型,然后将各个功能下的具体操作动作也定义成枚举类型。

程序模块设计:

       设计过程中分为三个大模块:




 

 1.     ptz_init 模块主要完成打开串口,并对串口进行设置,设置波特率,数据位,校验位等

 2.     ptz_exit 模块主要来关闭串口操作。实现比较简单

 3.     ptz_message_handle模块是主要实现部分,实现命令的解析,根据要实现的功能设置send_msg.结构体,并将此结构体,通过RS485串口发送给云台。此部分大体的流程设计如下:

ptz_message_handle模块:




 

 *str_arg参数需要规定一下格式以便解析函数能够正确解析它可以根据自己需要的进行规定,例如各项参数间采用@符号隔开等。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2地交社保怎么办退休 驾驶证脱审3月怎么办 a1一次性扣12分怎么办 驾照在外地掉了怎么办 在外市考的驾照怎么办 驾照过期3个月怎么办 驾照过期6个月怎么办 b本扣分了6分怎么办 b2驾照提前换证有扣分怎么办 酒驾驾驶证被扣怎么办 驾驶证被扣了分怎么办 c1驾照扣了12分怎么办 结婚证丢了怎么办离婚手续 结婚证不见了怎么办离婚手续 科目一身份丢了怎么办 考驾照身份证过期了怎么办 酒驾发交通事故致人死亡怎么办 车保险快到期了怎么办 车保险贴掉了怎么办 小车撞凹进去了怎么办 被代位追偿了怎么办 车被别人抵押了怎么办 朋友没驾照借车怎么办 车子被朋友撞了怎么办 电车被交警扣了怎么办 e照扣了12分怎么办 驾驶证被扣33分怎么办 a2驾驶员扣33分怎么办 驾驶证被扣48分怎么办 驾照扣了33分怎么办 车辆被扣36分怎么办 车被朋友借走了怎么办 在中国终身禁驾怎么办 c驾驶证忘年审了怎么办 驾驶证脱审1年多怎么办 驾驶证脱审四个月怎么办 驾照b2过期没审怎么办 a照驾照过期没审怎么办 驾照扣60多分怎么办 无证违章被扣分怎么办 变味的牛奶喝了怎么办