用Photoshop自制34等分光电编码盘:从绘图到Arduino测速全攻略
1. 项目概述与设计思路最近在捣鼓一个智能小车项目需要给轮子加装一个速度传感器。市面上的光电编码器要么太贵要么尺寸不合适于是琢磨着自己动手做一个简易的红外反射式光电编码器盘。核心思路很简单在轮子内侧贴一个黑白相间的圆环码盘用一对红外发射管和接收管去“数”经过的黑白条纹数量再结合时间就能算出转速。听起来不难对吧但真动手做第一个拦路虎就是怎么精确地画出这个码盘。我需要一个内径21mm、外径25mm的圆环并且把这个环等分成34份。为什么是34份这得从我的传感器说起。我手头用的红外反射式光电传感器正面尺寸是2.5mm宽、3.5mm长。为了让传感器能稳定、清晰地识别黑白交替的变化每个黑白条纹的宽度需要略大于传感器的感光面宽度同时整个码盘的周长要能容纳足够多的条纹以提高测量精度。经过一番计算和试验34等分在这个尺寸下是个不错的平衡点既能保证每个扇区足够宽让传感器可靠触发又能提供不错的角度分辨率。画这个图最直接的工具就是PhotoshopPS虽然我不是专业美工但PS的矢量绘图和精确选区功能对付这个正好。网上搜了一圈找到一篇讲PS快速等分圆的文章给了我很大启发。但那是7等分我需要的是34等分方法得调整。整个绘制过程说白了就是跟PS的“多边形工具”、“选区”、“图层”这些功能斗智斗勇的过程。下面我就把这次从零摸索、踩坑、到最后成功打印出码盘的完整经历和详细步骤分享出来希望能帮到同样想DIY传感器或者需要精确绘制等分图形的朋友。2. 核心工具与原理为什么选择PS可能有人会问画个圆环等分图用CAD比如AutoCAD、Fusion 360或者专业的矢量绘图软件比如Illustrator、CorelDRAW不是更专业吗确实那些工具在精度和参数化控制上更有优势。但我选择PS主要是基于以下几点现实考量2.1 工具普及性与学习成本对于大多数电子爱好者、创客甚至学生来说电脑里装一个PS的可能性远大于安装一套正版CAD软件。PS的普及度很高即使是老版本的CS2像我用的其核心的绘图和选区功能也完全够用。学习曲线方面虽然PS功能庞杂但我们只用到其中很小一部分——形状工具、选区、图层操作和填充。目标明确学起来就快本次教程本身也是一个极佳的PS基础功能实战。2.2 像素级精度与控制我们的最终输出是打印在纸上。打印机的分辨率通常是300 DPI每英寸300点这意味着在A4纸上我们可以实现大约0.085mm的像素级控制精度。对于内径21mm约247像素、外径25mm约295像素的码盘来说这个精度完全满足要求。PS在处理这种基于像素的图像和精确选区方面非常直观比如用键盘方向键微调选区位置这是很多矢量软件在操作体验上不那么直接的地方。2.3 流程的可视化与容错性PS的图层功能是本次制作的一大“神器”。我们可以把基准线、34边形、每一个填充的黑色扇区都放在不同的图层上。这样做的好处是任何一步操作失误都可以通过关闭或删除对应图层来快速回退而不会毁掉整个图形。这种“非破坏性编辑”的思路对于需要反复尝试和调整的DIY项目来说极大地降低了心理负担和时间成本。2.4 从设计到输出的无缝衔接我们的目标是得到一张可以直接打印的、黑白分明的图片。PS在图像处理、格式转换如保存为高对比度的PNG或BMP以及打印预览方面非常成熟。画完即可打印流程顺畅。注意这里必须强调PS并非工程制图软件其绝对精度依赖于文档的尺寸和分辨率设置。我们的方法本质上是“用图像处理软件解决一个几何作图问题”其优势在于灵活和易得而非参数化驱动。对于需要批量生产或对尺寸公差有严格要求的场合还是推荐使用专业的CAD软件。3. 详细实操步骤手把手绘制34等分编码盘下面进入最核心的部分我会以PS CS2版本为例详细拆解每一步操作。即使你从未打开过PS跟着做也能画出来。我使用的版本比较老但新版本PS如CC系列的界面和工具位置可能略有不同核心逻辑完全一致请灵活对应。3.1 前期准备与画布设置打开Photoshop我们的第一步不是直接开画而是搭建一个合适的“工作台”。新建文件点击“文件” - “新建”。在弹出窗口中进行关键设置名称可以命名为“34等分编码盘”。预设选择“国际标准纸张”。大小选择“A4”。这是因为我们最终要打印A4纸是最常见的。分辨率设置为300 像素/英寸。这是保证打印精度的关键分辨率太低打印出来的图形边缘会模糊、有锯齿。颜色模式选择“RGB颜色”即可我们最终是黑白图。背景内容选择“白色”。 点击“确定”一张空白的A4画布就创建好了。显示标尺和参考线精确作图离不开参考。按下快捷键Ctrl RMac上是Cmd R画布的上边缘和左边缘会出现标尺。如果没有可以在“视图”菜单中勾选“标尺”。从上方标尺按住鼠标左键向下拖拽可以拉出一条水平参考线。将它拖到画布垂直方向的大致中心位置比如对于A4竖版大约在14.85cm高度的一半即7.4cm附近。从左侧标尺按住鼠标左键向右拖拽可以拉出一条垂直参考线。将它拖到画布水平方向的大致中心位置比如A4宽度21cm的一半即10.5cm附近。这两条线交汇的点就是我们整个图形的中心基准点。后续所有操作都围绕这个中心进行。3.2 绘制核心正34边形这是实现34等分的几何基础。PS的多边形工具可以轻松创建任意边数的正多边形。在左侧工具栏找到“多边形工具”。如果没看到它可能隐藏在“矩形工具”或“直线工具”的图标下长按那个图标就能展开选择。选中多边形工具后注意顶部选项栏。这里有几个关键设置确保选择的是“形状图层”按钮通常是一系列图标中最左边那个像一个带了蒙版的矩形。这很重要它创建的是矢量形状方便后续调整。在“边”的输入框里将数字改为34。将鼠标移动到我们刚才设定的两条参考线交叉点中心点附近。按住Shift键和Alt键不放然后按住鼠标左键向外拖拽。Shift键约束多边形为正多边形各边相等。Alt键从中心开始绘制。 拖拽出一个大小合适的34边形。多大合适因为我们最终的外圆直径是25mm在300DPI下约295像素所以这个34边形的外接圆半径可以略大于125像素。不必一次精确后面还可以用自由变换调整。画好后图层面板会多出一个“形状 1”的图层。3.3 建立精确的基准线光有中心点还不够我们需要一条水平的基准线来定义0度起始位置。在左侧工具栏选择“直线工具”。在顶部选项栏同样选择“形状图层”模式。将“粗细”设置为几个像素比如2px颜色选一个醒目的红色或蓝色。将鼠标移动到中心点按住Shift键保证画出来是绝对水平或垂直的向右水平拖动画出一条穿过中心点的水平线。这条线就是我们角度计算的基准0度线。同理可以再画一条穿过中心的垂直线作为辅助。现在你的画布应该有一个34边形以及十字基准线。3.4 转换选区与图层管理我们需要对34边形的区域进行操作所以要先把它变成可编辑的选区。在图层面板确保选中“形状 1”图层即34边形所在的图层。按住Ctrl键同时用鼠标单击“形状 1”图层的缩略图那个有小形状的图标。你会看到34边形的边缘变成了闪烁的虚线这就是载入了它的选区。现在我们需要把这个选区里的图形“抠”到一个新的普通图层里以便进行填充等操作。快捷键Ctrl C复制。在图层面板底部点击“创建新图层”图标新建一个空白图层默认名可能是“图层 1”。选中这个新图层。按下快捷键Ctrl V粘贴。现在图层面板里“形状 1”图层矢量形状下面多了一个“图层 1”里面是同样的34边形但现在是像素信息。我们可以暂时隐藏或锁定“形状 1”图层以免干扰。3.5 巧用多边形套索进行间隔填充这是整个过程中最需要耐心的一步目标是间隔地选中34个三角形扇区中的17个并填充为黑色。在左侧工具栏选择“多边形套索工具”。我们需要放大视图以便精确操作。使用快捷键Ctrl 放大画布或者用缩放工具放大镜图标点击画布。开始勾选第一个扇区从34边形的中心点也是两条基准线的交点单击鼠标左键作为起点。然后移动鼠标到34边形的一个角点顶点单击再移动到相邻的另一个角点单击最后移回中心点单击形成一个三角形的闭合选区。注意我们是从中心点到两个相邻顶点勾出一个等腰三角形扇区。选区闪烁后我们需要将它填充为黑色。首先确认前景色是黑色。可以按D键将前景/背景色恢复为默认前景黑背景白然后按X键可以交换前景/背景色确保前景色为黑色。有了黑色选区按下快捷键Alt DeleteMac上是Option Delete即可用前景色黑色快速填充当前选区。你会看到这个三角形扇区变成了黑色。填充后选区还在。我们直接进行下一步关键操作按下快捷键Ctrl J。这个命令的意思是“通过拷贝的图层”它会自动将当前选区内的内容即刚刚填充的黑色三角形复制到一个全新的图层中比如“图层 2”。这样做的好处是每个黑色扇区都是独立的图层万一某个画错了可以单独修改或删除而不会影响其他部分。完成第一个扇区后按Ctrl D取消当前选区。然后跳过相邻的一个扇区去勾选下一个需要填充的扇区。重复步骤3到6用多边形套索勾选中心点 - 顶点A - 顶点B - 中心点- 填充黑色 (AltDelete) - 复制到新图层 (CtrlJ) - 取消选区 (CtrlD)。如此循环操作直到你间隔地填充并复制了17个黑色扇区。这个过程比较枯燥但务必仔细确保是“隔一个填一个”并且每次都是从中心点出发保证所有扇区共用一个中心。实操心得在勾选扇区时可以先将34边形的“形状 1”图层暂时隐藏只显示“图层 1”白色34边形轮廓和基准线这样顶点看得更清楚。填充时再打开黑色扇区所在的图层查看效果。另外频繁切换工具时记住“多边形套索工具”的快捷键是L按ShiftL可以在套索工具组里切换。熟练后整个过程会快很多。3.6 合并与清理当我们完成了17个黑色扇区的独立图层创建后图层面板会变得很乱。首先可以删除或隐藏最初的“形状 1”图层和“图层 1”那个白色的34边形轮廓。因为我们需要的黑色扇区已经分别保存在17个独立的图层里了。现在需要把这些分散的黑色扇区合并到一个图层上以便后续统一处理。点击图层面板底部的“创建新图层”按钮新建一个空图层命名为“合并层”或“码盘”。确保选中这个新建的“合并层”然后按下 Photoshop 中非常实用的一个快捷键Ctrl Shift Alt E。这个命令叫做“盖印可见图层”它会将当前所有可见图层的内容合并复制到当前选中的图层中同时保留原有的各个图层不变。操作后“合并层”上就拥有了所有17个黑色扇区的完整图像。此时你可以选择隐藏原先那17个独立的黑色扇区图层点击图层前面的眼睛图标只保留“合并层”和背景层可见。这样图层面板就清爽了。3.7 挖出圆环制作内圆与外圆现在我们有了一朵黑色的“太阳花”需要把它修剪成内外径精确的圆环。绘制内圆选区选择“椭圆选框工具”。在顶部选项栏将选区样式从“正常”改为“固定大小”。在宽度和高度里都输入4.2 厘米。因为我们的内圆直径是21mm即2.1厘米。注意单位是厘米与之前设置的A4画布和分辨率匹配。将鼠标移动到画布中心参考线交叉点附近单击一个直径4.2厘米的正圆形选区就出现了。它的位置可能不居中。微调选区位置确保当前工具是“椭圆选框工具”或任何选区工具。然后使用键盘上的上下左右方向键轻轻移动这个圆形选区直到它的圆心与参考线交叉点完全重合。可以放大视图仔细对齐。删除内部选区对准后确保当前选中的图层是“合并层”我们的黑色太阳花。直接按下键盘上的Delete键。你会看到圆形选区内部的内容被删除了露出了白色的背景这就形成了圆环的内孔。按Ctrl D取消选区。绘制外圆选区并删除外部再次选择“椭圆选框工具”在选项栏将固定大小改为5.0 厘米外圆直径25mm。同样在中心点附近单击创建选区并用方向键微调到绝对居中。这次我们不要圆环内部而是要圆环外部。所以需要“反选”。按下快捷键Ctrl Shift IMac上是Cmd Shift I或者点击菜单“选择” - “反向”。此时选区变成了除中间5厘米圆以外的所有区域。再次按下Delete键删除圆环外围多余的部分。按Ctrl D取消选区。3.8 最终输出与打印一个黑白相间、34等分的精密圆环码盘就绘制完成了保存点击“文件” - “存储为”。为了获得最好的打印效果且没有背景干扰建议保存为PNG格式。在PNG保存选项中确保勾选“交错”为“无”这样可以获得更小的文件。打印在PS中点击“文件” - “打印”。或者用其他图片查看器打开保存的PNG文件打印。关键一步在打印设置中务必取消“适应边框”或“缩放以适合”之类的选项选择“实际大小”或“100%”打印。这样才能保证打印出来的圆环直径是精确的25mm。可以用尺子测量一下打印稿上的圆环直径进行验证。制作用剪刀或笔刀仔细沿外圆剪下在内圆部分也小心抠出圆孔。一个自制的光电编码器盘就做好了。用双面胶或胶水将其平整地粘贴在小车轮子的内侧确保圆心与轮子轴心对齐。4. 传感器安装、调试与信号处理要点画完码盘只是成功了一半要让它在小车上真正跑起来还需要正确的安装、调试和简单的电路。4.1 红外反射式传感器安装我使用的是一种常见的红外反射式光电传感器模块通常包含一个红外发射管和一个红外接收管或一体化接收头。安装位置将传感器固定在车体上使其发射/接收窗口正对着轮子内侧贴好的码盘表面距离大约在2-5mm为宜。距离太远信号弱太近容易刮擦。对齐与角度确保传感器光轴尽量垂直于码盘平面。码盘旋转时黑白条纹应从传感器窗口前平稳经过。可以手动转动轮子观察传感器输出信号的变化。固定方式传感器最好能用可微调位置的支架比如用螺丝固定的L形支架或热熔胶临时固定但可调整固定方便后续精细调节。4.2 电路连接与信号调理传感器模块通常有三根线VCC电源正极一般3.3V或5V、GND电源负极、OUT信号输出。基础连接将VCC和GND连接到小车单片机系统如Arduino、STM32的对应电源引脚。OUT信号线连接到单片机的一个数字输入引脚如果传感器输出是数字信号或模拟输入引脚如果输出是模拟信号。数字信号处理很多模块集成了比较器直接输出高低电平的数字信号黑色吸收红外输出高电平白色反射红外输出低电平或者相反。这种最方便单片机可以直接用外部中断或高速轮询来捕获上升沿/下降沿进行计数。模拟信号处理如果传感器输出是模拟量电压随反射光强度变化则需要单片机进行AD采样。你需要先测试码盘在黑白区域下对应的电压值然后在程序中设置一个合适的阈值来判断是黑还是白。例如if (adc_value threshold) { 判定为黑条纹; } else { 判定为白条纹; }。这种方式抗干扰能力稍弱但成本可能更低。4.3 单片机测速程序思路以Arduino为例如果使用数字输出传感器并将其OUT引脚接到支持外部中断的引脚如Arduino Uno的2或3号引脚。// 示例代码框架 volatile long pulseCount 0; // volatile 关键字很重要在中断中修改的变量需用此声明 int sensorPin 2; // 传感器连接引脚 void setup() { Serial.begin(9600); pinMode(sensorPin, INPUT_PULLUP); // 使用内部上拉电阻 // 配置中断当引脚2发生下降沿时假设白变黑触发中断函数 countPulse attachInterrupt(digitalPinToInterrupt(sensorPin), countPulse, FALLING); } void loop() { long currentCount; noInterrupts(); // 暂时关闭中断安全地读取脉冲计数值 currentCount pulseCount; interrupts(); // 重新开启中断 // 假设码盘有34个黑白周期即34个条纹 // 轮子转一圈 pulseCount 会增加 34 float revolutions currentCount / 34.0; // 计算转速例如每100ms计算一次转速 static unsigned long lastTime 0; unsigned long currentTime millis(); if (currentTime - lastTime 100) { float timeInterval (currentTime - lastTime) / 1000.0; // 转换为秒 float rpm (currentCount / 34.0) / timeInterval * 60.0; // 转/分钟 Serial.print(RPM: ); Serial.println(rpm); pulseCount 0; // 重置计数器为下一个周期准备 lastTime currentTime; } // 其他控制逻辑... } // 中断服务函数 void countPulse() { pulseCount; }这段代码提供了一个基本的框架。pulseCount变量记录了传感器检测到的条纹边沿变化次数。在主循环中我们定期如每100ms计算这段时间内轮子转过的圈数进而推算出转速RPM。5. 常见问题、调试技巧与优化建议在实际制作和调试过程中你几乎一定会遇到下面这些问题。这里把我踩过的坑和解决办法总结一下。5.1 打印尺寸不准问题打印出来的圆环直径不是25mm。排查检查PS文档设置确认新建文档时分辨率是300DPI且视图比例是100%可以按Ctrl1切换到实际像素视图检查。检查打印设置这是最常见的原因。在打印对话框里绝对不要勾选“适应边框”、“缩放以适合介质”等选项。必须选择“实际大小”或“100%缩放”。不同打印机驱动界面不同请仔细寻找相关选项。物理验证用游标卡尺测量打印稿。如果偏差在0.5mm以内对于很多应用可以接受。如果偏差大重新检查上述步骤。5.2 传感器信号不稳定抖动问题单片机计数时会出现重复计数或漏计数导致转速计算错误。原因与解决机械抖动码盘粘贴不平整旋转时上下或左右摆动导致与传感器距离变化。解决重新粘贴确保码盘平整且与轮面紧密贴合。可以在粘贴前将码盘贴在一张稍厚的卡纸上增加刚性。环境光干扰强烈的环境光特别是日光灯、太阳光中含有红外成分会干扰接收管。解决给传感器做一个遮光罩用黑色热缩管或胶带包裹传感器头部只留出正对码盘的小窗口。电气噪声电源噪声或信号线过长引入干扰。解决在传感器VCC和GND之间并联一个10uF电解电容和一个0.1uF瓷片电容进行滤波。尽量缩短传感器到单片机的连线。阈值问题模拟传感器黑白条纹的反射电压差不够大或阈值设置不合理。解决用单片机读取AD值分别打印对准黑条和白条时的数值取其中间值作为阈值并留有一定余量滞回比较。5.3 计数方向判断与提高精度问题如何知道轮子是正转还是反转如何提高角度分辨率解决双路正交编码这是工业编码器的标准做法。你需要安装两套传感器它们在空间上错开1/4个条纹周期即90度相位差。通过判断两路信号A相和B相的相位先后关系就能判断旋转方向。同时对A、B相的上升沿和下降沿都进行计数可以将分辨率提高4倍4倍频。这对于需要精确位置控制的小车至关重要。软件去抖对于低速应用可以在中断服务函数或信号检测函数中加入简单的延时去抖例如检测到边沿变化后延时几毫秒再读取一次引脚状态确认。5.4 码盘设计与材料优化问题打印的纸质码盘不耐用容易磨损或受潮变形。优化建议材料升级将打印好的码盘图纸用激光打印机打印在不干胶贴纸上然后粘贴到更坚固的基材上如薄亚克力板、塑料片甚至废弃的CD光盘上。CD光盘的中心孔和圆形非常标准是极佳的码盘基材。工艺升级如果有条件可以使用激光雕刻机直接在黑色亚克力板上雕刻出白色条纹或者相反这样制作的码盘精度高、非常耐用。设计变通如果34等分画起来太麻烦可以考虑使用更易等分的数目如32或36。32等分可以用“多边形工具”直接画32边形再通过“旋转复制”功能轻松做出。在单片机程序里修改一下每圈的脉冲数常量即可。5.5 单片机资源与性能考量问题高速旋转时中断过于频繁导致单片机主程序被阻塞影响其他任务如电机PID控制、通信。解决使用硬件编码器接口如果单片机有硬件正交编码器接口如STM32的TIMx的Encoder模式一定要用它硬件接口自动处理A、B相计数和方向判断不占用CPU资源速度极高。优化中断服务函数中断函数里只做最必要的操作通常是增减一个计数器变量。避免在中断中进行复杂计算、打印调试信息或调用可能阻塞的函数。降低码盘分辨率如果速度极高可以适当减少码盘的条纹数量以降低中断频率。但会牺牲角度分辨率需要权衡。通过以上从软件绘图到硬件调试的全流程拆解相信你已经掌握了自制光电编码器盘的核心技能。这个过程不仅让你得到了一个可用的传感器更重要的是你深入理解了从原理图到实物、从信号采集到软件处理的完整链条。这种解决问题的能力才是DIY和工程实践中最宝贵的部分。