怎么运行的
该项目由两部分组成。Arduino 端处理所有伺服运动并从激光雷达传感器获取测量读数。Java 端将球形点转换为笛卡尔点并将它们呈现为 3D。它们通过串行端口相互通信。用户可以使用类似游戏的 fps 控件在场景中移动以获得更好的体验。
数学
项目中有两个舵机。一个将用作平移 (Phi) 角,另一个用作倾斜 (Theta) 角。我们从激光雷达传感器获得的读数将成为半径。这意味着设备本身将位于点 (0,0,0)。从 Arduino 发送到 Java 程序的每个数据集都由这三个数字(半径、phi、theta)组成,前导零以保持一致性。
从这里我们必须将这些球面点转换为 Cartesian(x, y, z) 以便我们可以在我们的 Java 程序中正确地绘制它们。
我们可以使用这些公式实现这些转换。
注意:如果您查看 Java 代码并注意到 x、y 和 z 的某些值被交换,有时甚至设置为负数,那是因为计算机坐标系也不同。例如,在计算机坐标系中,x 是水平的,而不是 y。Y positive 下降,而不是上升。像这样的东西。对公式所做的这些修改只是为了让 Java 在正确的位置呈现点。
串口通讯
我用 Arduino Uno 开始了这个项目,但遇到了串行端口与伺服系统冲突的问题。他们不能同时工作。当数据来回发送时,舵机会不断抖动。从研究中我了解到这是使用 SoftwareSerial 的常见问题。我找到了一些解决这个问题的方法,但它们太麻烦了,甚至对我来说都没有完全奏效。我决定改用 Arduino Mega,它解决了抖动问题。这是因为 Mega 有多个串口。
沟通的步骤
Java 必须等待的原因是因为即使您告诉 Arduino 发送 9 位数字和 2 个逗号,通过串行发送数据也不能那样工作。只要有可能,它就会发送它想要的任何数据片段。所以我们希望 Java 直到接收到的所有数据看起来都像它可以识别的东西。
我使用 USB 电缆作为串行连接,但我相信如果需要无线,也可以使用蓝牙模块。
为项目提供动力
我用一块 5v 的墙砖来运行伺服系统,因为我只是讨厌处理电池并尽可能避免使用它们。激光雷达传感器通过 Arduino 5V 供电。当然,Arduino 使用用作串行端口的相同 USB 电缆供电。
请随时发表有关该项目的评论或问题。谢谢!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !