设计一个设备:使用一个安装在云台上的距离传感器来测量墙壁,并用可见激光在墙上显示用户自定义的一组点
扫描二维码
随时随地手机看文章
用手在墙上测量和布置点是很困难的,这是我们大多数人都曾在某些时候挣扎过的事情。一个人可能不得不使用梯子从天花板开始测量,或者他们可能需要在墙壁的整个宽度上创造均匀间隔的洞。由于结构的不对准,气泡水准仪和铅锤等基于重力的调平工具可能不准确。目前可用的计算机化激光调平装置非常昂贵。我在这个项目中的目标是创造一个轻量、低成本的设备,可以放置在墙前,计算墙上的点,而不管设备相对于结构的方向如何。这是CNM Ingenuity提供的物联网/快速原型训练营的顶点项目。
功能
五个组件是该设备功能的关键(除了粒子光子2微控制器)-步进电机,2轴模拟操纵杆,OLED显示器,可见激光二极管和ST微电子的VL53L1X飞行时间距离传感器。云台由两个步进电机驱动(每个轴一个)。马达采取的每一步都以一个已知的角度旋转万向节,这是用于布置点的三角函数的关键之一。另一个是法向量到壁的长度,由VL53测量。操纵杆允许用户将万向节驱动到墙的角落,消除了计划的角落检测方法,这与项目组件固有的精度水平是不可能的。激光二极管直观地表示万向节指向的位置。操作过程中指令显示在OLED显示屏上。
VL53L1X飞行时间距离传感器
这种传感器使用一种叫做“飞行时间”(ToF)的原理来测量光子发射、反射和探测所需的时间。接收器有一个可配置的视场(通过与API交互,从默认的27°降至15°)。它提供相当精确的点距离测量(在传感器的最大范围内误差约为5cm,约为4米)。它通过I2C进行通信,允许无缝集成到物联网设备中。它的低成本和小占地面积使其成为轻量级应用的理想选择。
28BYJ-48步进电机
本项目采用的低成本步进电机有32个内部位置。为了减少每一步的角度旋转,1/64的传动比是内置的。完成一个完整的旋转需要2048步,这意味着每一步将电机旋转约0.176°。这对于这个应用程序来说是相当准确的。然而,这些电机有一个问题,导致这个项目的重大问题(下面讨论)。
2轴模拟操纵杆
这些操纵杆通常在游戏主机控制器中被用作拇指控制。我把我的安装在一个由切特·约翰斯顿设计的3d打印的房子里(在Thingiverse上可以找到——非常感谢切特的伟大设计!)操纵杆包含一个按钮和2个电位器(每个轴一个),返回0-4095的模拟值,这取决于他们在运动范围的哪一边。操纵杆是这个设备的唯一控制装置。它允许用户手动驱动万向节,点击操纵杆允许用户通过程序流程进行操作。我还编写了允许用户在布局模式设置期间选择和输入值的代码。
OLED显示器
这个128x64显示器通过I2C进行通信。有限的屏幕尺寸需要简明的说明。Switch/case语句控制在程序运行的任何给定点显示哪些指令。
可见激光二极管
这个小的激光二极管从Adafruit运行在3V3电源,可以很容易地打开或关闭使用数字输入通过TIP120晶体管。它的小尺寸,低价格,和体面的光束质量使它非常适合这种应用。
程序流
归一化
打开设备后,万向节开始一个正常化的过程。首先,它扫过x轴,寻找ToF传感器测量到的最短距离。一旦找到这个点,在x最小值上下的y轴上重复这个过程。X和Y距离最短的点表示从云台到墙壁的法向量(垂直向量)。这个点是云台坐标系的原点。测量的距离被储存起来供计算。
Manualdrive
找到法向量后,用户必须使用操纵杆将万向节驱动到房间的左下角、左上角和右上角。因为原点(0,0)在法线点上,所以到达X和Y上每个角的步数是已知的(因此到达这些角的角度也是已知的)。
Wallcalculations
在确定了墙上的点之后,计算就开始了。要更全面地了解这个项目背后的数学原理,请查看GitHub的repo。
模式选择和用户输入
系统提示用户选择一种模式并使用拇指杆输入值。目前只支持Free Grid模式。该模式允许用户输入X和Y偏移量、行和列的数量以及行和列之间的间隙。
点计算
然后,该设备使用归一化向量计算这些点在墙上的位置。然后用可见激光一次显示一个这些点。用户点击操纵杆进入下一个点。完成后,最后的点击驱动万向节回到法向量。
限制和潜在的解决方案
步进电机坡度
当旋转方向改变时,齿轮齿之间的小空间导致运动损失。这就是所谓的反弹,发挥,或倾斜。
我使用的马达有正常的斜率,我用橡皮筋把x轴拉向一个方向。对于y轴,悬挂在云台上的金属丝的重量通常会使y轴向上拉。
然而,在这些电机中存在第二个“斜坡”或死区,通常发生在电机方向改变后的20°或更多。由于传动系统的进动,这个死区可能会延迟。正常的斜坡不是什么大问题,但死区给这个设备带来了严重的问题。处理污水的方法有很多,但大多数都假定污水会立即被处理掉。事实上,它在我的马达运动的不同点上占用,使得上面描述的规范化过程变得困难。
VL53L1X准确性
尽管VL53L1X在规模、精度和成本方面令人印象深刻,但它并不完美。Adafruit创建了一个轻量级的库,它从ST创建的API中暴露了一些基本的测量函数。ST API包含许多方法,可用于提高某些应用程序的精度。不幸的是,我缺乏必要的C经验,无法深入研究SPAD/ROI配置和其他校准功能等API。这是在不使用更昂贵的激光雷达传感器的情况下提高该项目精度的主要方法之一。
当使用这些传感器时,环境光条件和表面反射率是重要的考虑因素。房间可能暴露在阳光下,这会对准确性产生负面影响。表面反射率和纹理也有影响。传感器返回的值在某种程度上是可变的,所以我对多次测量进行了一些平均,以减少误差。平均后,传感器在我用于测试的尺度(高、宽约1米的模拟墙)上的精度在1-2mm以内。这种差异使得归一化变得困难,因为传感器可能会在几个度的弧度上读取相同的值。由于时间限制,我实现了一个临时解决方案,导致在寻找法向量时误差约2cm。这种方法检查至少两个连续的距离读数大于或等于前一个,然后将电机步进到类似值范围的中间点。
线拖
因为这个设备是一个原型,我有几个星期的时间来完成,电线布线不是一个考虑因素。6根电线连接到云台- 4用于ToF传感器和2用于可见激光器。目前,这些电线从万向架的背面摇摆,是相当僵硬的,因为我没有获得非常小规格的电线。由于马达很快,如果我的步进代码出错,很容易把万向架包裹在电线中。在开发过程中,设备甚至在我拔掉插头之前就把自己的电线拔掉了。
对于万向节来说,没有电线的解决方案是最好的,但它不适合这样的项目。在这个设备的未来迭代中,我将使用滑环通过万向节传输能量和数据。这将允许它自由旋转,给它一个完整的运动范围,使像房间扫描模式成为可能。
激光/传感器校准
我遇到的另一个困难是确保可见激光的位置实际上是指向万向节“看”的地方。我设计了这样的框架,激光和传感器安装是平行的。传感器安装在由Adafruit创建的分断板上,所以我创建了一个平面来安装它。我把橡胶管周围的螺丝,我用来连接它,并收紧了管板下来。油管的反弹将木板推到螺丝的背面,使我能够对拐角进行微调。由于传感器的红外激光在没有红外相机的情况下是看不见的,因此不可能获得真正的对齐。相反,我使用参考曲面使其接近真正的平行线。
我用固定螺丝把可见激光器安装在一个挂在传感器下面的桶里。激光和传感器的光束彼此相距约1厘米,这是我在不可能在传感器的断线板上钻洞的情况下尽可能接近它们的距离。我接受这个偏移量作为项目的一个怪癖,如果这真的是一个精确的应用程序,我会在我的计算中使用偏移量每当激光点的位置重要(手动驱动和点显示)。
三维投影
这是我第一次使用万向节。在我看来,只需要几个已知的值就可以完全描述墙与传感器的关系。不幸的是,事实并非如此。当接近法向量时,云台的行为正常,但当它远离时,相对于云台的观点,墙壁的倾斜变得明显。当激光沿着壁面顶部的x轴直线驱动时,所描述的直线是一个圆锥截面。因此,计算出的点也相对于墙的倾斜度发生了倾斜。
为了获得一条真正的直线(物理上和计算上),需要在传感器坐标和墙壁坐标之间进行3D投影/转换。这超出了我的能力范围(目前)。这个问题是我在设计和构建这个项目的后期才发现的,所以我不能完全解释清楚。我能够通过绘制接近法向量的点得到一个不错的结果,这证明我至少能够计算相对于墙的角落的点。
未来的改进
•正确的3D投影
如果我弄清楚了这一点,这个项目就会运行得非常好(考虑到所有其他挑战)。
•更好的组件
更好的步进电机
移除中距离盲区将大大改善功能。
更好的距离传感器(如激光雷达)。
由于误差范围较小,准确测量正常值将更容易,我还可以使用提高的精度来获得点测量,完全消除了手动驾驶的需要。滑环可以消除电线的阻力,并允许不受限制的运动。
使它自导向——几种可能的方法:
•使用霍尔传感器检测万向节位置
•用陀螺仪测量螺距,使y轴水平
•使用EEPROM存储并返回到一组已知步骤(从最后一个位置,它是在被关闭之前)
更多的模式
螺柱模式:找到一个螺柱,驱动到它,并用激光线二极管显示所有其他螺柱。
边缘/角落检测-用于房间映射和其他类似的应用。
多房间模式-用于确定房间之间的连续性。房间尺寸和相对位置(通过加速度计收集)可以存储在内存中,以创建连接内部空间的工作模型。
本文编译自hackster.io