目录
EOS5000(基础协议)
AE*记忆键
物镜38-76焦距76mm的帧值(手动焦距)
帧操作和解码命令
指令0x0A:请求物镜可用
指令0xA0、B0、B2、90和F0:光学特性和AF状态
指令0x80-0A:请求物镜的物理特性
指令0xC2:物镜焦距
回调操作目标定位编码器
物镜手动AF开关
EF 50/1.8 Stm
EF 38-76
38-76和50/1..8 STM帧值比较
PDC键
指令0x12:光圈电机
光圈运动持续时间
自动聚焦扫描(AF)
帧值(提取)
指令0x05、0x06和0x0C:AF移动到极限位置。
0xC0和0xE0指令:AF定位信息
0x90指令:自动对焦状态
指令0x50+参数:设置AF速度
物镜70-200和300/2.8
这篇文章基于此前写过的三篇文章上继续。前三篇文章的链接是:
佳能镜头EOS系统EF协议逆向工程(一)转接环电路设计_佳能ef自动对焦协议_岬淢箫声的博客-CSDN博客本文属于专栏——工业相机。此专栏首先提供我人工翻译的法语文档部分,然后通过STM32F103C8T6控制佳能镜头,最后协同上位机或者NVIDIA Xavier实现自动对焦。还有一个用处不大的River文档,它知道如何让相机和镜头通信,也许对当前的摄影实践几乎没有帮助。尽管如此,一些应用程序可能需要独立订购物镜的主要功能。撇开工业世界及其特殊机器不谈,在另一个品牌的图像采集系统上安装佳能光学元件是不可能的,而且是有罪的,无论是出于经济原因还是纯粹的技术原因,获得的组合提供了其他不可用的功能。https://blog.csdn.net/caoshiying/article/details/127609884?spm=1001.2014.3001.5502
佳能镜头EOS系统EF协议逆向工程(二)逻辑分析仪测试_岬淢箫声的博客-CSDN博客本章描述了用于解密EF协议函数的思想和分析,如果其读数是可选的,则所获得结果的摘要将在专用章节中进行汇编,这仍然是正确理解EF协议函数的必要来源。随着函数的测试和逐步解码,它们的描述和列表中使用的注释将在过程中变得越来越精确,因为以前的分析或推理错误不会被强制纠正。所使用的逻辑分析仪是一个小型号的低成本8输入TTL USBEE AX Pro,所使用的软件是制造商的标准套件,可免费下载。软件不允许编辑或删除部分结果,某些读数或时钟意外激活,因为通电会导致SPI字解码不同步。https://blog.csdn.net/caoshiying/article/details/129057004?spm=1001.2014.3001.5502佳能镜头EOS系统EF协议逆向工程(三)解码算法_岬淢箫声的博客-CSDN博客逻辑分析仪没有特别要求,某宝上的大部分逻辑分析仪可以用。分号开头表示注释,第一列是时间,这个时间是相对开始捕获的时间,用单词elapse表示列标题更合适。这款逻辑分析仪软件导出数据的表头就是这么写的,无所谓了。第二列是CLK信号,CLK是时钟的简写,搞硬件的同学是不是很熟悉呢?第三列是DLC信号。DLC是Data Lens to Camera的首字母缩写。第四列是DCL,DCL是Data Camera to Lens首字母缩写。所有信号用1表示高电平,0表示低电平。佳能相机的电平为3.3V。https://blog.csdn.net/caoshiying/article/details/129057831?spm=1001.2014.3001.5502
EOS5000(基础协议)
AE*记忆键
逻辑分析器软件不允许从记录的数据中删除一部分随机时钟信号转换,这会干扰每个字节值的解码。当然,通过分析手动解码是可能的,但有时会很麻烦和昂贵,因此,在不控制任何执行器的情况下,按MEMO AE键“唤醒”物镜将用于分析整个对话的结构。
镜头和相机之间的对话是一个长序列,在按下按钮的时间内,然后是一系列相同的短帧,持续约4秒。
无论变焦的焦距、焦点环的位置或盒子上的光圈(滑动镜头光圈)对话框的结构都保持完全相同,只有帧数4随按下按钮的时间而变化*。来自物镜的值仅随控制环的物理位置而变化。
用其他模型代替镜头也不会影响这种对话结构,有一些细节。
物镜38-76焦距76mm的帧值(手动焦距)
(8帧表格交互数据,当前没有必要整理,有时间再整理)
帧操作和解码命令
遇到了两种类型的命令,第一种命令后面大部分是零,关联的命令有一个可变的响应,第二种命令单独使用,并有自己的响应值。可以很容易地得出结论,前者是对可变长度目标的信息请求,通过发出零来获得下一个值。返回值表示已考虑的命令的秒数。
提示:SPI总线的操作意味着发出命令和接收命令响应是交错的。与发出命令同时接收的字节不属于该命令的响应,但可能属于前一个。读取一个命令响应的每个字节将需要为该响应的下一个字节发出一个零或一个新命令。
指令0x0A:请求物镜可用
此命令通常是在发布帧时遇到的第一个命令。然后重复此操作,直到物镜发出0xAA响应,然后可以执行其他命令。这种操作方法是典型的响应无罪释放测试,例如在与ENQ/ACK(或TCPIP与SYN/ACK)的ASCII串行通信中使用的方法,但在1987年设计协议时,它的实用性要低得多。
这一原则可以在以前的无物镜测试中找到,或者在放弃或进一步尝试之前发布了大量的0x0A指令集。在EOS 5000中,这些0x0A命令集后面跟着0x09、0E、0F指令,这可能意味着它们对应于初始化或重置命令。请注意,以后只会遇到0x0E,物镜设置为手动自动对焦。
指令0xA0、B0、B2、90和F0:光学特性和AF状态
通过将其中一些指令与其他物镜和多种配置进行分析,可以获得易于识别其含义的结果。下表提供了返回值(十进制)的摘要。
-
指令0xA0:继续执行此指令,返回两个字节,其值与物镜的当前焦点相对应。第一个字节为强权重值,仅用于超过256mm的焦距,在70-200x2(1x256+144=400mm)或300x2(2x256+88=600mm)中可见
-
指令0xB0:所遇到的3个字节的值仅随物镜孔径的变化而变化,这取决于物镜的型号或滑动孔径光学元件的焦距变化。下表列出了根据遇到的不同F/N值返回的值,以说明返回值与AV开口值之间的直接和线性关系。字节1和2表示当前镜头光圈和最大可能光圈(或相反),字节3表示其最小可能光圈。
通过按数字顺序对开口值和返回值进行分类,可以看出隔膜的差异对应于这些值的8个单位的变化。因此,该系统使用1/8的光圈精度来表示光圈值,这可以包括通常具有以¼直径运行的步进电机的虹膜。如果孔径用AV(顶点线性表示法)表示,则很容易找到数学关系。
在计算四舍五入时,理论RET的计算值与物镜返回的值相对应。完整的表格和转换公式将在订单摘要一章的末尾给出。
-
指令0xb2和f0:这些指令以非线性方式返回随焦距变化的值,而且变化规律似乎随物镜模型而变化。对于某些物镜,如50/1.8 STM,B2值也会随着焦距的变化而变化。其意义的一个假设可能是与焦距相关的自聚焦校正参数。在使用Arduino测试台进行测试时,将进行更深入的研究,以便更快地利用结果。
-
指令0x90:第二个字节的第7位随镜头AF/MF开关的位置而变化。假设该指令与镜头自动对焦系统有关是有意义的,这将在以下测试中确认和完成。
焦点环或其他物镜开关(范围限制器、IS、MEMO AF)位置的变化不影响本表中的值。
指令0x80-0A:请求物镜的物理特性
然后是一个零序列,其响应随物镜模型的变化而变化,从而形成了一组描述该序列的值。
对该字符串的分析有一个陷阱,因为构成该字符串的第二个字节也是物镜可用性指令ENQ的值,因此可以将其视为0x80、0x0a和0x03+00s指令套件,或者将其视为0x80指令,然后是参数0a和03。如果没有额外的测试,第二个解决方案的唯一指标是0x0a的响应值与0xaa不同。通过Arduino工作台单独发送这些指令将确认这一假设的有效性,返回到0x03的值是指令的值,没有其他后续值,这是简单指令的典型响应。
请注意,参数0x03仅适用于相关的机箱,从网络上检索到的帧(EOS500)或Arduino测试表明,可以用值0x00代替它,而不必担心…。我们将在下文中看到,这并不总是正确的。
返回的值仅取决于物镜的物理特性,不受物镜的各种设置(变焦焦距、焦距、开关等)的影响。仅使用70-200/2.8 II检测到TC的存在。
-
字节1-镜头类型:一个非常古老的佳能白皮书指出镜头类型(固定、缩放、宏、软焦点……)是提供给Boiter的信息的一部分。此字节值的微小变化有利于此解释。此外,位5仅为缩放类型的镜头设置为1。
-
字节2-lensid:此值是一个常量,仅与物镜类型相关,不存在重复项,这表明存在标识码。一个带有“canon lensid”标签的网络搜索找到了一个数组,它在照片的exif中使用的值与遇到的值完全匹配
-
字节3-6-最大/最小焦距:这4个字节的意义是显而易见的,镜头允许的最小和最大焦距值的编码用明文表示。只有比300/2.8 IS更新一代的70-200/2.8 IS II在有遥控器的情况下改变这些值。
-
字节7,8-功能:无论物镜配置如何,这些字节的值都是恒定的,其含义不太明显,但从上下文来看,它们确实是关于物镜提供的功能的信息。
下表比较了以二进制模式写入的字节7和字节8的结果与一些物理物镜(稳定、USM AF引擎)或逻辑特征(高速传输A 500kHz、实际MAP距离信息C2、物镜名称82、扩展到12字节的高级版本指令80)的结果。相关性可以找到,但由于样本量小,不确定,包括:
- Bit0 - Byte7: C2指令的可用性(在Tamron上可用,但未使用)。
- Bit2 - Byte7:存在编码器焦距。
- Bit4 - Byte7: IS存在,由与7D一起使用的50STM(而不是其他容器)取消。
- Bit7 - Byte8: NV协议生成,时钟500kHz,指令82等。
- Bit0 et 2 - Byte8:超级电视,带存储卡和AF按钮。
请注意,使用其他boiter的测试和ef协议的发展使得使用0x0a03以外的参数成为可能,这些参数的值取决于外壳模型,然后可以修改指令响应,尤其是字节5和6(参见ef50stm和eos 7d)。
指令0xC2:物镜焦距
此物镜仅在某些物镜的初始化帧中出现,可能是通过将0x80物镜获得的字节5的位1设置为1来报告的。
此物镜返回4个字节,其值随焦距变化。使用EF 50/1.8 STM物镜进行了多次测试。下表给出了通过手动改变从无穷远到迷你贴图再到无穷远的焦点距离而获得的值。
两个值A和B似乎都与焦距成线性关系。单位为厘米,官方值为0.35m,作为最小焦距。在70-200/2.8上进行的一项带有地图距离显示窗口的测试验证了这一发现的准确性。
无论测试或行驶方向如何,发送的两个值总是相同的,或者A大于AB。认为物镜发出的不是绝对焦距,而是SI所处的距离范围是有意义的,从而降低了焦距编码器分辨率低的不确定性。这种工作模式当然是由编码器直接管理的,编码器的编码系统相对复杂。
回调操作目标定位编码器
焦点设置的绝对位置由一个经典的编码器来确定,该编码器通过与焦点透镜组机械相关联的导电梳将印刷电路板上的导线连接起来。下面是17-85上使用的编码器的照片,显示了梳子在宏(白色)和无限(黑色)位置的位置,轨迹根据极性着色。
作为整个光学系统的参考,通常只精确地提供无限位置,在组装接触梳时进行调整。其他焦点位置和距离的精度明显较低,编码器分辨率较低,在用于测试的EF 50/1.8 STM中,只能提供14个不同的焦点距离值。
物镜手动AF开关
这篇文章的意义在于,这是为数不多的几个案例之一,否则对话的主动性将不再是一纸空文,而是物镜。当物镜MF按钮的状态发生变化时,物镜MF将其DLC信号切换到低状态,这将导致箱子唤醒并初始化事务。
该序列由初始帧组成,然后重复信息帧2到3秒。
两个测试物镜之间的操作略有不同,如果EF 50/1.8 STM在空位后直接向Boiter发送值,则旧物镜EF38-76正在等待来自Boiter的0x0A指令的轮询操作。
EF 50/1.8 Stm
EF 38-76
38-76和50/1..8 STM帧值比较
这些帧之间几乎没有区别,除了出现了命令C2和EF50/1.8,它取代了一组命令A0、B2、80。
PDC键
PDC键允许独立操纵光圈,理论上限制了分析范围,仅激活光圈电机。
与先前遇到的帧结构类似,具有初始化帧、光圈关闭命令帧、一组相同的帧、光圈打开和结束帧以及持续3或4秒的信息帧。
指令0x12:光圈电机
此命令通过发送0x12命令,然后发送引擎在有符号字节上执行的移动值来执行。与第13页视图中0xB0命令的光圈信息一样,该值表示为AV孔径值的1/8。使用后一个命令可以知道全光圈值。只需减去所需的光圈值,就可以知道使用0x12发送的值。通过发送值0x80,返回到全开状态。下表提供了一些使用的值示例。
通过接收0x12命令及其参数的反馈值0x12,验证光圈转动顺序的正确执行或至少正确理解。
此命令始终由0x09命令组成,这些命令似乎指示初始化过程。
请注意,命令0xb0在光圈关闭顺序之后对光圈特性的请求总是返回与全光圈相同的值,这使得一些网络源分配了一个字节的响应的当前实际光圈值无效。
光圈运动持续时间
膜片光圈电机控制命令0x12具有一个特殊性,即在第8个脉冲后处于低时钟信号状态的开关在镜头的主动性很好,并指示操作员其占用和不可用,以接收其他命令。这个低位的持续时间取决于光圈电机必须执行的步进数,从验证标准值(4到80µs,取决于镜头)到40毫秒,请参阅更多关于某些光学元件的信息。
自动聚焦扫描(AF)
由于测试系统是用两个独立的适配器设计的,因此镜头不再与外壳及其AF传感器进行光学连接,因此无法正常聚焦。因此,当对触发器按钮的第一个进行操作时,箱子将进行搜索扫描,将AF电机从一个极端位置移动到另一个极端位置,这将是不成功的。
帧值(提取)
测试是在AF初始位置无限远的情况下进行的,因此,对触发器的持续操作会导致AF系统从无限远的起始位置移动到最小对焦距离位置,然后在大约300 ms后返回无限远。只显示了初始化帧和无限迷你路径,返回帧保持不变,除了运行时命令变成0x05而不是0x06。
测试了几个不同迭代的物镜(EF 38-76、TAMRON 17-50、EF 50/1.4 USM和EF 50/1.8 STM),几乎没有差异,帧结构保持不变,只有少数命令随光协议的发展而增加。
这些差异将在下面列表的注释部分根据颜色进行排序。
简化流程图
指令0x05、0x06和0x0C:AF移动到极限位置。
因此,以前从未出现过的没有参数0x05和0x06的指令对应于启动一个循环,导致AF电机启动,并将焦点镜头从其当前位置移开,这是一个极端位置,无论起始位置如何。这些指令前面总是有一个0x0c指令,该指令也出现在物镜初始化序列中,因此有理由假设该指令允许初始化专用的自动对焦进程并将其工作寄存器重置为零。
使用Arduino进行的直接测试可以确认此操作。对于某些物镜,如50STM,这些指令没有足够的动作来执行全行程,需要发送第二个指令,包括使用与EOS 5000相同的帧。我找不到这种现象的解释,如果需要,有必要用0x90指令确认停止位置。
0xC0和0xE0指令:AF定位信息
这两个指令都返回两个字节的编码值,因为上下文和值的变化对应于自动对焦系统的计数器或操作寄存器。 从0xC0输出的值始终具有从无穷远到迷你方向的0xFFFF值作为初始值,而从另一个方向输出的0x0000值将根据焦距的物镜和起始位置进行更改。因此,这是一个有符号的16位计数器,当然是由调焦电机的位置编码器直接递增的(见下图)。
从0xE0输出的值取决于焦距,测试A焦距和可变起始位置总是根据该位置返回相同的值。与前面看到的0xC2指令一样,该值来自MAP环位置编码器,除了无限位置外,分辨率和精度都很低。例如,在50/1.4 USM或无限停止位置的小位移下,这一点尤其明显,使该值从0x4000增加到0x3FFF,而在3M到1M的范围内,它在0x3FF9下保持恒定。有些没有编码器的镜头会看到这个值变得恒定,有时会随着焦距的变化而变化。
下表列出了这些价值观的结果,这些价值观来自不同的背景和物镜。
对于两个止动块之间的位移,无论移动方向如何,0xC0指令产生的计数值保持不变,精确到物理误差。如果50/1.8 STM和Tamron退出批次,计数步距的精度将随着设计和物镜年龄的变化而显著变化,旧的50/1.4的USM技术没有比35-70这样的老式Tracassins带来更多。
另一方面,0xE0返回的值仍然是个谜,它们随焦距和焦距的变化规律当然与0xB0函数返回的参数有关,但并不明显。
0x90指令:自动对焦状态
使用MEMOAE键进行的测试表明,0x90指令返回的第二个字节的值随手动AF开关的位置而变化。AF扫描测试为该参数提供其他值,这些值随聚焦过程的变化而变化,下表总结了这些值。
因此,该指令是对自动对焦状态的查询,其含义由第二个字节中每个位的位置给出。
在无限PU Mini停止时,将位设置为1自动对焦的操作因物镜而异。如果使用50STM,此操作与AF块的物理位置检测相关,则其他如50USM使用内部逻辑管理。在后一种情况下,该标志的位置仅随发动机行驶控制装置的变化而变化,与手动对焦环上的操作无关。
指令0x50+参数:设置AF速度
此指令仅存在于协议的某个版本中,绑定到自动对焦系统,在0x05或0x06指令之前发送,并与变量参数关联。如果某些物镜使用参数的值作为返回值,50 STM将返回指令0x50的值,从而消除对该函数语法的任何怀疑。
如果指令0x50后的参数通常为0x2c,则有时会使用0x2d或0x2e,无明显原因,直到使用70-200和遥控器进行试验,以研究其对AF电机速度的影响。
众所周知,在弱光条件下,遥控器会降低转速。箱子的AF传感器被遮挡或亮起(清除)。对获得的帧进行比较表明,唯一的差异(除了返回的光圈和焦距值)是0x50使用的参数。
因此,除了AF模块的初始化功能外,0x50指令还可以确定电机的运行速度(对于接受该指令的物镜),这当然要归功于后面参数的前两位。
物镜70-200和300/2.8
这些物镜的问题是,这个指令不再使用一个参数,而是使用两个参数。确定要使用的参数数量当然与0x80指令返回的值有关,但没有任何确定性。