当初开始做这个项目时,我们希望救活一个已死的机器人。若说我从Bender那里学到了什么,那就是若想使一个机器人复原,没有比让它去开啤酒瓶盖更好的办法了。 控制一个机器人,让它和特殊形状的物体进行互动并操作重物,这项任务富有挑战性,且需要象征性的原型设计和建模。经过多次试验和无数次失败,我们很高兴能够看到机器人成功地操纵手臂去打开啤酒瓶。现在我们可以放松一下了,此时我们的机器人也打开了几瓶啤酒,来答谢我们的辛苦工作! 步骤1:设备及材料
我们建立的机器人设备是由Rhino机器人构成的。用来控制它的代码是通用的,足以适用于任何类型的直流电动机机器人。 电子设备: • 直流电机(见大图,我们对电动机没有规范) • Arduino Duemilanove(或任何Arduino板) • Arduino继电器保护 • 1个单刀单掷继电器(12V,1A) • 1个2N3904 NPN晶体管(或类似的) • 1个LED指示灯(任何颜色) • 3个限位开关 • 4个10K欧姆的电阻 • 1个330欧姆的电阻 • 带DC插孔的12V电源 • 导线 硬件: • 扎带 • 螺母、螺栓和垫圈(1/4”) • 用于安装的短螺丝 • 8听锡罐头 • 用于安装的各种金属废料和焊条 工具: • 烙铁 • 电钻/ Dremel • 用于测试的电压表 • 剥线钳/切刀 • 扳手 • 六角键 步骤2:硬件
为机器人配备硬件,有四项主要任务: 1. 减轻机器人手臂的重量,以使其能够产生最大扭矩/力; 2. 装啤酒瓶的支座。我们把啤酒瓶放入被掏空的锡罐头中,再将这些锡罐头安装到机器人设备的旋转盘上; 3. 为机器人安装开瓶器和限位开关; 4. 将机器人部件安装于中纤板(MDF)上并保持一致。 减重 为减轻手臂的重量,我们简单地摘下机器人臂的最后两个电动机,使托架头部更轻。这给我们带来了一只更容易被有效控制的机器人手臂,同时该手臂能够提供足够打开瓶盖的扭矩。 酒瓶支座 我们清空8个锡罐,并在其底部钻出间隔为5cm(底座上的间距)的孔。在螺栓头部和锡罐底部之间放入垫圈,以防止摆动。把螺母装于底部并收紧,但如果我们再次这样做的话,我们会采用锁紧螺母或垫圈,以防止螺母在运行时松动。 安装开瓶器及开关 借助于定位棒,用扎带把开瓶器捆绑在机械手臂的前部。以一个安全的方式捆绑开瓶器,除了使它方向朝上,并没有其他特别的安装要求。 限位开关在它们被安装的地方也有一些变化。打开瓶盖后,代码通过开关来找到可靠位置(这有时会导致电机打滑而失去位置记忆),然后在它需要的方向上继续移动电机。因此,限位开关被安装在一个特殊位置,该位置能够让机器人先拉回手臂,然后再移回至起始位置,同时避免再次碰到瓶子。关于旋转底座上的限位开关,固定锡罐的螺栓被用于触发该开关,以便于它们在旋转过程中每转过22.5度就碰一次开关。由于每罐间隔45度分开,所以每2次触发开关意味着下一个瓶子已经就位。 安装机器人 我们使用了一块2’×4’中密度纤维板(MDF)来固定机器人手臂和旋转底座板。使用4”的螺栓和螺钉来组装这两部分。 步骤3:电子设备
该电路是都是由Arduino的9个引脚所控制。这里用到了3个数字输入引脚和6个数字输出引脚。引脚使用情况详述如下: • Arduino的引脚0 - 输出 ——控制旋转平台 • Arduino的引脚1 - 输入 ——控制头部倾斜的限位开关 • Arduino的引脚2 - 输入 ——手臂的限位开关 • Arduino的引脚3 - 输入 ——旋转平台的限位开关 • Arduino的引脚4 - 输出 ——头部向下倾斜 • Arduino的引脚5 - 输出 ——头部向上倾斜 • Arduino的引脚6 - 输出 ——控制手臂下降 • Arduino的引脚7 - 输出 ——控制手臂上升 • Arduino的引脚8 - 输出 ——控制一个LED指示灯 引脚4—7控制继电器保护以操控机器人的手臂和头部。所有的电子产品都内置到继电器保护中。在继电器保护中,继电器1的公共引脚被连接到手臂电机的正线上。继电器2的公共引脚被连接到手臂电机的负线上。每个继电器的常闭(NC)触点接地,常开(NO)触点连接到12V。12V电源必须由二次电源通过导线提供,或者以12V电压为Arduino供电,并在该12V电压在Arduino上被调节之前采用它。电动机的挂接方式意味着电动机可以在任意一个方向上启动,这取决于哪个继电器接通12V电源并且触点接地。如果两个继电器同时打开或关闭,那么电机不会转动。注意:具有两个继电器可能是不稳定的,因为在通过一个继电器的12V线路与通过另一个继电器的12V线路之间, 仍然存在微小变化,该变化通过继电器开关产生不稳定的电流。 旋转轮以类似的方式运行,除非只有一个继电器被打开或关闭,所以电机仅在一个方向上运行。如下图所示,继电器可以接通或断开通往电机的12V线路。 步骤1的LED指示灯已经告诉我,当它一切OK时就插入12V的电源线路。当Arduino开启并运行通过其设置周期时,我把它断开,因为一些电机会在设置期间随机开启。因此,LED指示灯在代码中给出一个4秒钟的暂停,其中指示灯亮起则通知我是时候插上12V电源了。在此之后,LED不再有任何目的。 限位开关都遵循相同的电路来连接到Arduino。机器人使用数字读取来通知何时开关被触发,并且使用该信息来完成对准每个电机。 步骤4:软件
下面的代码是为Arduino IDE控制机械手臂而编写的。值得注意的是,它充分利用了电路的优势,由于带状电缆连接件的不同,它本来不应该用于指挥Rhino机器人手臂的! 代码以建立所有的输入/输出引脚为开端,并将它们全部设为低电平。然后,它会短暂打开LED,让我们知道我们可以插入12V电源插头。然后开始循环,其中每个周期通过校准手臂和头部开始。校准后,头部被留在将去除瓶盖的位置上。然后电机按照我们预先定义的一组动作抬起并向前倾斜开瓶器。然后为了下一个酒瓶,重复校准并且旋转转盘,这样一切又重新开始! 在下面的代码中,“motor 1A”意味着继电器控制电动机引脚一侧,而“motor 1B”则是控制电机引脚的另一侧。例如,你将需要通过1A “HIGH”和1B “LOW”在一个方向上驱动电机,或1A “LOW”和1B “HIGH”在另一个方向上驱动电机,抑或两者皆“LOW”停运电机。 /* motor 1A (relay 1) on digital pin 7 motor 1B (relay 2) on digital pin 6 motor 2A (relay 3) on digital pin 5 motor 2B (relay 4) on digital pin 4 */
void setup() { pinMode(8, OUTPUT); // LED pinMode(7, OUTPUT); // arm up pinMode(6, OUTPUT); // arm down pinMode(5, OUTPUT); // head up pinMode(4, OUTPUT); // head down pinMode(3, INPUT); // wheel switch pinMode(2, INPUT); // arm switch pinMode(1, INPUT); // head switch pinMode(0, OUTPUT); // wheel
digitalWrite(7,LOW); digitalWrite(6,LOW); digitalWrite(5,LOW); digitalWrite(4,LOW); digitalWrite(0,LOW);
digitalWrite(8,HIGH); // turn on LED to indicate ready delay(2000); digitalWrite(8,LOW); delay(2000); // insert 12V source during this pause }
void loop() { calibrate(); digitalWrite(4,HIGH); // tilt head down delay(500); digitalWrite(7,HIGH); // lift arm up delay(2000); digitalWrite(7,LOW); delay(3000); digitalWrite(4,LOW); delay(10); digitalWrite(4,HIGH); digitalWrite(7,HIGH); delay(1000); digitalWrite(7,LOW); digitalWrite(4,LOW); delay(10); }
void calibrate() { while(!digitalRead(3)) // rotate wheel 22.5 degrees so that bottle isnt in the way { digitalWrite(0,HIGH); delay(10); } delay(100); digitalWrite(0,LOW);
while(digitalRead(1)) // move head away from bottle { digitalWrite(5,HIGH); delay(10); } digitalWrite(5,LOW); digitalWrite(4,HIGH); delay(2000); digitalWrite(4,LOW); delay(10);
while(!digitalRead(2)) // calibrate arm { digitalWrite(6,HIGH); delay(10); } delay(50); digitalWrite(6,LOW);
while(digitalRead(1)) // calibrate head { digitalWrite(5,HIGH); delay(10); } digitalWrite(5,LOW); digitalWrite(4,HIGH); delay(250); digitalWrite(4,LOW); delay(10);
while(!digitalRead(3)) // rotate wheel 22.5 degrees into position for next bottle { digitalWrite(0,HIGH); delay(10); } delay(100); digitalWrite(0,LOW); } 步骤5:测试
我们的测试成功了!我们在第一次尝试中打开了7、8瓶酒哦! 译自:http://www.instructables.com/id/Robot-Bottle-Opener/
本文版权属于研发埠所有,如需转载请注明出处!
|