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

2023-05-16

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参数需要规定一下格式以便解析函数能够正确解析它可以根据自己需要的进行规定,例如各项参数间采用@符号隔开等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RS485/云台控制(PTZ)学习文档 的相关文章

  • CAN总线电平(隐性与显性)

    nbsp nbsp nbsp nbsp CAN2 0B规范定义了两种互补的逻辑数值 显性和隐性 同时传送显性和隐性位时 总线呈现显性状态 同时传送显性状态位时 总线呈现显性状态 同时传送隐性状态位时 总线呈现隐性状态 显性数值表示逻辑0 隐
  • STM32之通用定时器计数器模式

    include stm32f10x h RCC时钟配置 void RCC config ErrorStatus HSEStartUpStatus RCC寄存器设置为默认配置 RCC DeInit 打开外部高速时钟 RCC HSEConfig
  • STM32之通用定时器编码器模式

    1 编码器原理 如果两个信号相位差为90度 则这两个信号称为正交 由于两个信号相差90度 因此可以根据两个信号哪个先哪个后来判断方向 根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前行走的距离 如果再加上定时器的话还可以计算出速度
  • Modbus寄存器地址规则

    Modbus协议定义的寄存器地址是5位十进制地址 xff0c 即 xff1a 线圈 xff08 DO xff09 地址 xff1a 00001 09999 触点 xff08 DI xff09 地址 xff1a 10001 19999 输入寄
  • 电赛TI处理器入门

    文章目录 电赛常用微处理器及评估板入门一 写在前面的话二 平台介绍1 TIVA C Series TM4C123G Lauchpad Evaluation Kit处理器芯片TM4C123GH6PM MCUARM架构处理器核心 Process
  • c++中的struct和class的区别

    1 struct与class的区别 1 继承权限 xff1a struct默认为public xff0c 而class默认的为private 2 访问权限 xff1a struct默认的成员变量访问控制权限是public xff0c 而cl
  • 常用字符串库函数总结

    本文转自https blog csdn net sharon 1987 article details 50022855 本文与原文内容没有差别 xff0c 但是由于本人比较注重颜值还有阅读体验 xff08 自认为这样可能阅读起来会舒服点
  • win7+linux双系统下删除linux系统

    装了Windows和linux双系统的朋友 xff0c 在后期要删除linux是个比较头痛的问题 xff0c 因为MBR已经被linux接管 xff0c 本文的目的是如何在windows 和linux双系统下 xff0c 简单 xff0c
  • 迭代器详解

    迭代器 前言一 可迭代对象 xff08 Iterable xff09 xff08 一 xff09 遍历对比 xff08 二 xff09 可迭代对象 xff08 Iterable xff09 1 确定可迭代对象2 确定共同属性3 错误 二 迭
  • GD32F130移植FreeRTOS

    最近淘到一块板子 xff0c 板载GD32F130C8T6 Cortex M3内核 xff0c 64KBFalsh 8KBSRAM 最近正在看FreeRTOS 就拿它来练练手 一 下载GD库文件 习惯了用STM32 xff0c 对GD3 1
  • Cy7c68013A速度测试教程

    手里有一个cypress的CY7C68013A模块 xff0c 一直没空玩 今天便测一下 xff0c 这个模块的USB2 0速率 1 开发工具下载 在cypress下载如下开发工具包 xff08 开发工具包下载地址 xff09 2 工具包安
  • Linux kernel编译

    bin bash echo 34 Configure the kernel 34 until echo 34 1 make the am335x lierda defconfig 34 echo 34 2 make the menuconf
  • Openwrt二级路由获取IPV6

    由于没有公网IPV4 便研究了一下公网IPV6 网上大部分是将光猫改为桥接 xff0c 然后路由拨号 xff0c 获取公网IPV6地址 xff0c 但目前不想这样做 研究一下 xff0c 二级路由下的IPV6获取 按照网上的说明 xff0c
  • 从RK3399的安卓系统中提取dts

    不久前淘到一块RK3399的板子 xff0c 安卓7 1的系统 xff0c 可是翻遍全网没有任何资料 便想着从系统中提取设备树文件 xff0c 自行适配linux系统 1 系统备份 参考该RK3328系统备份文章 xff0c 安装好驱动 x
  • MATALB 卷积神经网络 图片二分类

    正忙着写论文的时候 xff0c 突然看到她的询问 xff0c 连续两晚失眠 xff0c 有了这个程序 以前没用过神经网络 xff0c 所有代码都是基于别人基础上修改 xff0c 仅限于能实现自己需要的功能 从GitHub找到一个创建用于图像
  • MATLAB调用训练好的卷积神经网络

    上一篇链接 xff1a MATALB 卷积神经网络 图片二分类 上一篇已经介绍了如何对数据通过CNN进行深度学习分类 xff0c 并将训练好的模型保存下来 这里将介绍一下如何调用自己已经训练好的模型进行数据分类 1 加载模型 clear c
  • Unity URP DOTS Pathfinding+Local avoidance

    Unity URP DOTS Pathfinding 43 Local avoidance RVO2的效果还是蛮好的
  • 使用Python+Scrapy爬取并保存QQ群空间帖子

    首先声明 xff0c 在Python和爬虫这方面 xff0c 我是业余的那一卦 xff0c 只是平时玩一玩 xff0c 不能当真的 xff0c 请各位大佬轻拍 虽然爬虫与传统意义上的大数据技术不属于同一类 xff0c 但大概也只能放在大数据
  • SLAM 多点导航功能包发布

    SLAM 多点导航功能包 navi multi goals pub rviz plugin 描述 xff1a 该功能包为SLAM 建图导航提供可发布多个目标点任务的导航方式 要求 必须基于 Autolabor SLAM导航使用 一 安装与配
  • 步进电机学习笔记

    扩充的理论知识 xff1a 步进电机的细分技术实质上一种电子阻尼技术 xff0c 其主要目的是减弱或消除低频振动 不同厂家的细分驱动器精度可能差别很大 xff0c 还取决于细分电流控制精度等因素 细分数越大 xff0c 精度越难控制 xff

随机推荐

  • 错误:AttributeError: module ‘cv2.cv2‘ has no attribute ‘TrackerCSRT_create‘ 解决

    OpenCV目标跟踪运行出错 xff1a AttributeError module cv2 cv2 has no attribute 39 TrackerCSRT create C 问题 xff1a 直接上错误代码 xff1a 上我的代码
  • STM32系列(HAL库) ——使用串口打印的3种方式

    一 前期准备 1 硬件 xff1a STM32C8T6最小系统板USB TTL串口模块ST Link下载器 2 软件 xff1a keil5 IDEcubeMX 二 cubeMX配置 1 配置RCC 选择外部时钟源 2 配置SYS Seri
  • C#多线程编程:线程基础

    原文链接 xff1a https www cnblogs com wyt007 p 9486752 html 创建线程 static void Main string args Thread t 61 new Thread PrintNum
  • ROS 控制Innfos机械臂简单例子

    include lt ros ros h gt include lt image transport image transport h gt include lt sensor msgs image encodings h gt incl
  • 使用CMake和Visual Studio搭建工程并引入OpenCV库

    前言 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 在之前的Windows平台下OpenCV的编译与安装 Mega Li的博客 CSDN博客 nbsp 中介绍了Windows平台中使用CMake编译Open
  • UART通信中流控RTS和CTS的理解

    一 流控 xff0c 顾名思义就是流量控制的意思 目的是协调收发双方 xff0c 使数据不会丢失 如果UART只有RX TX两个信号 xff0c 要流控的话只能是软流控 xff1b 如果有RX xff0c TX xff0c CTS xff0
  • JVM虚拟机栈

    虚拟机栈 每个线程在创建时都会创建一个虚拟机栈 xff0c 其内部保存一个个栈帧 xff0c 对应一次次java方法的调用 xff08 线程私有 xff09 生命周期与线程一致 作用 xff1a 主管java线程的运行 xff0c 保存局部
  • C++之串口通讯

    C 43 43 串口操作 简介代码头文件源码文件 示例创建两个虚拟串口用串口调试助手连接COM2来接数据编写测试代码发送数据结果 总结 简介 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff
  • 用keil写程序时出现“C(162): error C249: 'DATA': SEGMENT TOO LARGE“的错误

    如果定义的数组不用更改就用 uchar code XX 10 61 根据数据的用处 xff0c 可以有以下几种选择 xff1a data xff1a 直接寻址 的片内RAM区低128B xff08 00H 7FH xff09 bdata x
  • ROS 与 Box Turtle、C Turtle、Indigo Igloo 、Jade Turtle 、Kinetic Kame 、Melodic Morenia、Noetic Ninjemys关系

    如果没有错的话相当于这个些都是ros的版本 xff0c 就是不同时期叫的名字不一样 xff0c 用于区别不同的版本 因为也是初学者 xff0c 都还没入门 xff0c 也是网上找的资料 xff0c 并根据自己的理解写的 xff0c 如果有错
  • C语言——VS编译器下程序运行结果闪退解决方法

    C语言 VS编译器下程序运行结果闪退解决方法 学习C语言的过程中可能会遇到这样的问题 xff0c 程序调试的时候没有错误 xff0c 可是在运行结果的时候会发现程序结果闪退 xff0c 导致看不到结果 在此 xff0c 本文总结对比了几种有
  • Gazebo 加载xacro文件和URDF文件的方式

    版权声明 xff1a lt 本博客所有内容均为自己在学习工作中的总结 摘录等 转载请注明出处 如有侵权请联系删除 gt https blog csdn net xuehuafeiwu123 article details 71108959
  • Gazebo显示加载xacro模型文件---改变模型的颜色注意事项

    在xacro文件中 xff0c 有下列语句是修改模型颜色的 xff1a 例 xff1a lt link name 61 34 base link 34 gt lt visual gt lt geometry gt lt box size 6
  • Gazebo中sdf文件和urdf和xacro文件的区别

    sdf文件 urdf文件和xacro文件都是模型文件 xacro文件是urdf文件的改进版 xff0c urdf文件只能在rviz等中显示 xff0c 不能在仿真器中显示出来 xacro文件可以在gazebo仿真器中显示出来 xff0c 相
  • Gazebo的xacro文件添加各种plugins

    官网地址 xff1a http gazebosim org tutorials tut 61 ros gzplugins Tutorial Using Gazebo plugins with ROS Gazebo plugins give
  • ROS中spawn_model方式加载xacro文件,设置模型的位置(xyz,rpy)

    例如加载turtlebot机器人launch文件如下 xff1a 在gazebo仿真中最后都是通过这种方式加载xacro文件的 lt launch gt lt arg name 61 34 base 34 gt lt arg name 61
  • BT1120

    BT1120是高清晰度电视 HDTV 演播室信号数字接口 图像数据是怎么用二进制数据组织在一起的呢 xff1f 个人理解 xff1a 在BT1120标准中说明的图像数据指的是图像的有效尺寸的数据 因为我们看到编码信号包括图像数据和图像基准码
  • 2021-10-22 常用的串口通讯协议

    串口通讯是什么 学术解释是 xff0c 通过总线在一个时间点连续发送一位数据的方法 如同弓箭手频繁射出弓箭一般 xff0c 嗖 嗖 嗖 串口通讯协议是什么 说的大白话一点 xff0c 就是串口通信时所使用的协议传输方式 串口通讯协议有几种呢
  • curl 命令详解

    curl 是一种命令行工具 xff0c 作用是发出网络请求 xff0c 然后获取数据 xff0c 显示在 34 标准输出 34 xff08 stdout xff09 上面 它支持多种协议 xff0c 下面列举其常用功能 一 查看网页源码 直
  • RS485/云台控制(PTZ)学习文档

    RS485 云台控制 xff08 PTZ xff09 学习文档 zxf 一 项目任务 xff1a 在linux环境下通过RS485串口实现对云台镜头的各种控制 xff08 包括摄像头的打开 xff0c 关闭 xff0c 各个方向的运动及运动