建立自己的机器人手臂-遥控器
在本微型系列的前一部分中,我讨论了一次控制所有伺服器的方法。 以编程方式,无需任何外部交互。 这只是不会做。 该项目的最后一步显然是远程控制,它将增加另一个层次的复杂性并且也很有趣。 和我一起,看看将MeArm机械臂连接到PlayStation 4控制器需要些什么。 如果您错过了该手臂编程的介绍,请查看我以前的文章“ 构建自己的机器人手臂-编程” 。
你需要什么
再一次,您将需要一些额外的硬件以方便对伺服器进行远程控制。 对于初学者而言,好消息是该项目的这一部分不需要焊接。
- USB Host shield 2.0( 在这里可用–大约23欧元)
- 蓝牙适配器(像这样的适配器–大约8欧元,但可以从中国便宜地购买)
- PlayStation 4控制器(在亚马逊上可用-大约50欧元,但可能已成为游戏系统的一部分:))
- Arduino IDE
USB主机屏蔽
USB Host防护板是现阶段必不可少的部分。 这款盾牌的优点在于它的多功能性。 您既可以使用有线模式,也可以使用可充电的USB电缆将控制器插入屏蔽层,也可以插入蓝牙适配器并以无线模式使用它。 另一个很棒的事情是您还可以以相同的方式使用Xbox控制器。 鉴于这些防护罩的体系结构,您将要堆叠这些防护罩。 首先,此屏蔽层位于Arduino板上。
根据您的连接类型,您现在应该插入蓝牙适配器。 现在,将伺服护罩堆叠在顶部,并将所有伺服器连接到其上。 基座上有Kong用于安装Arduino板,以防您的构建获得一些额外的稳定性。 正确连接并连接好所有组件后,即可继续进行下一步-编程。
程式设计
在深入研究代码之前,让我们概述一下最终设计的构想。 我个人非常喜欢PS4控制器的设计方式以及在我手中的感觉。 在这项技术提供的众多功能中,我将使用从顶部可见的以下控件:
- 左棒
- 沿Y轴移动
- 右棒
- 沿X轴移动
- X键
- 将手臂重置为其初始位置
- 隆隆
- 当达到任何物理极限(在“ 研究与开发”一章中确定)时打开
以及从前面可见的以下控件:
- 触发器
- 左扳机
- LED灯
- 因为我们都知道,除非它像疯了似的那样闪烁,否则还不够酷:)
放在一起
图书馆再次为我们完成了所有繁重的工作。 我们将需要Circuits @ Home 用于Arduino的USB主机库的修订版2.0 。 特别要感谢Kristian Sloth Lauszus和他周围的团队,以及该项目的所有贡献者 ,他们创建并维护了使用此盾牌的真正精美的库。 签出该库的GitHub存储库,下载并添加到Arduino IDE中的库集合中。 与往常一样, 示例部分是您最好的朋友,熟悉新的库或框架。
我最终得到的草图较大,因此请分解。 我们需要4个变量来准确跟踪每个伺服器的当前位置及其默认位置,以达到静止的目的。 首先,我决定在开发过程中使用USB作为连接控制器的方式,因此setup方法将启动连接并设置初始值。 然后,我为每个伺服器定义了一种专用方法来控制其运动并在达到物理极限时进行检查。 我知道可以减少此代码,但是为了清晰起见和易于维护/易读性,我采用了4种专用方法(我的电路板具有足够的内存来处理此问题,因此尺寸没有问题)。
循环方法处理来自控制器的输入,并根据达到机械臂的物理极限来触发/关闭隆隆声和状态LED。 您应该对后两位很熟悉,因为在我之前的文章中已经提到了它们。 首先,将臂复位到其初始位置的方法和实用方法可以简化对任何伺服器的控制。 就是这样! 使用组装好的机械臂,正确堆叠的防护罩和正确布线的伺服器,您可以上传草图,连接控制器并享受游戏时间:)。
通过USB草图使用PS4控制器进行机械臂控制
#include
#include
#include Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
USB Usb;
PS4USB PS4(&Usb);#define BASE 0
#define HEIGHT 1
#define LENGTH 2
#define GRIP 3float base_init = 1440;
float height_init = 1675;
float length_init = 1440;
float grip_init = 2155;float base_current = base_init;
float height_current = height_init;
float length_current = length_init;
float grip_current = grip_init;float SERVOFREQ = 50;
float pulseconstant;
boolean limit_reached = false;void setup() {Serial.begin(9600);if (Usb.Init() == -1) {while (1);}pulseconstant = (1000000/SERVOFREQ)/4096;pwm.begin();pwm.setPWMFreq(SERVOFREQ);servoWrite(BASE, base_init);servoWrite(HEIGHT, height_init);servoWrite(LENGTH, length_init);servoWrite(GRIP, grip_init);PS4.setLed(Green);
}void handleBase() {// check to stop the servoif (base_current - 10 <= 525 && PS4.getAnalogHat(RightHatX) > 220) {limit_reached = true;return;} else if (base_current + 10 >= 2355 && PS4.getAnalogHat(RightHatX) < 35) {limit_reached = true;return;} else { // handle movementif (PS4.getAnalogHat(RightHatX) < 35) {base_current += 10;}if (PS4.getAnalogHat(RightHatX) > 220) {base_current -= 10;}}
}void handleReach() {// check to stop the servoif (length_current - 10 <= 525 && PS4.getAnalogHat(LeftHatY) > 220) {limit_reached = true;return;} else if (length_current + 10 >= 2355 && PS4.getAnalogHat(LeftHatY) < 35) {limit_reached = true;return;} else {// handle movementif (PS4.getAnalogHat(LeftHatY) < 35) {length_current += 10;}if (PS4.getAnalogHat(LeftHatY) > 220) {length_current -= 10;}}
}void handleHeight() {// check to stop the servoif (height_current - 10 <= 1100 && PS4.getAnalogButton(L2) > 220) {limit_reached = true;return;} else if (height_current + 10 >= 2250 && PS4.getAnalogButton(R2) > 220) {limit_reached = true;return;} else {// handle movementif (PS4.getAnalogButton(L2) > 220) {height_current -= 10;} if (PS4.getAnalogButton(R2) > 220) {height_current += 10;}}
}void handleGripper() {// check to stop the servoif (grip_current - 10 < 1800 && PS4.getAnalogHat(RightHatY) < 220) {return;} else if (grip_current + 10 > 2155 && PS4.getAnalogHat(RightHatY) > 35) {return;} else {// handle movementif (PS4.getAnalogHat(RightHatY) < 35) {grip_current -= 10;} if (PS4.getAnalogHat(RightHatY) > 220) {grip_current += 10; }}
}void loop() {Usb.Task();if (PS4.connected()) {limit_reached = false;if (PS4.getButtonClick(CROSS)) {resetMeArm();}handleBase();handleReach();handleHeight();handleGripper();if (!limit_reached) {PS4.setLed(Green);PS4.setRumbleOff();PS4.setLedFlash(0, 0);} else {PS4.setLed(Red);PS4.setRumbleOn(RumbleHigh);PS4.setLedFlash(10, 10);}}delay(5);servoWrite(BASE, base_current);servoWrite(LENGTH, length_current);servoWrite(HEIGHT, height_current);servoWrite(GRIP, grip_current);
}void resetMeArm() {servoWrite(BASE, base_init);servoWrite(HEIGHT, height_init);servoWrite(LENGTH, length_init);servoWrite(GRIP, grip_init);base_current = base_init;height_current = height_init;length_current = length_init;grip_current = grip_init;
}void servoWrite(uint8_t n, float pulse) {float pulsetick = pulse/pulseconstant;pwm.setPWM(n, 0, pulsetick);
} 独立电源
该项目中要考虑的最后一件事是电源。 除非您能绑定一些有线插头为伺服屏蔽罩供电,否则我建议您使用电池。 这里不需要做任何花哨的事情,简单的电池座就可以了。 我正在使用4节AA电池,其电池座如下图所示。 我仅用4个电池就可以完成此项目,而不会耗尽所有汁液。 而且由于伺服护罩具有螺钉接线盒,因此连接和断开电池组非常简单。 结合了无线操纵杆,使该机械臂非常便于携带(我把它带到咖啡店看给朋友看-您应该已经看到坐在我们桌子旁边的人的脸了:))。
最终结果
在这一点上,除了享受劳动成果,别无他法。
叠起来!
连线!
用它!
结论
所以这是我关于该项目的最后一篇文章,我必须说我对结果很满意。 我期望这将花费我更多的时间,因为这是我第一次处理伺服,焊接和远程处理。 但是,最大的延迟是由于等待单个零件的交付而引起的。 我决定一次上一个阶段,这样我就不会订购伺服护罩,直到我组装好手臂并且对控制伺服器等感到满意为止。
如果您有孩子,并且想让他们玩一些不太常见甚至是教育性的事情,这是一个值得追求的项目。 不论是年轻的还是年长的观众,都有很多东西要学。 由于使用Raspberry Pi可以控制手臂,因此很容易设置Scratch,因此即使是小孩也可以自己编程,看看它如何影响机器。 完成此项目后,您可以像我一样将其出售/转让给其他人,这样可以与他人分享这种学习的乐趣。
如果您决定去做并开始这个项目,请在评论部分让我知道它的进展。
翻译自: https://www.javacodegeeks.com/2015/07/build-your-own-robot-arm-remote-control.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
