14687| 13
|
[3D+Arduino课程(中学生)] 3D+Arduino——精舞堂BOB(详细教程) |
本帖最后由 hnyzcj 于 2015-7-5 09:27 编辑 【项目介绍】 想不想在你的书桌上放一个呆萌可爱的小机器人呢?在无聊的时候,控制它来为你“跳个舞”,缓解一下百无聊赖的心情。今天这里给大家分享案例是精舞堂BOB。它是一个根据前方物体远近距离,改变舞蹈动作的3D打印机器人。 样图 视频 http://www.tudou.com/programs/view/Qlfs4aYtFZI/ 广告之后马上回来……有网友想了解DF新机Overlord的打印质量,我也答应了下来。为了兑现承诺就在这里做一下DM 和OL的打印效果对比。为了能够让广大网友对打印效果有个清晰的对比,我准备从视觉和触觉两个方面做对比。 触觉:(打出来自己摸吧) 细腻、光滑。 【项目器材】 1.75mm PLA (1公斤) 3D打印耗材 (橙色) DFBeetle控制器 1 DFBeetle住控制器扩展板 1 DFrobot SG90舵机 4 Risym HC-SR04超声波模块 1 DFrobot 3.7V锂电池 1 DFrobot 3.7V锂电池充电器 1 单芯杜邦线(10根母-母) 1 基础焊接工具套装 1(选配) 【制作步骤】 第一部分机械结构 A.3D打印模型 本次3D打印机器人共有4部分组成:头部、底板、腿部、脚部。经过多次试验测试分析BOB在运动过程中的稳定性、可靠性以及打印所需的时间、原材料的消耗,以及强度等综合考虑。对打印的部件设置了不同的填充率,其设置为头部20%,底板20%,腿部100%,脚部50%。部件数量:头部和底板各1个,腿部和脚部各2个。 通过3D打印机打印完成四个部分的组件,如下图所示 底板机械部分安装 取出两只舵机,按下图所示方向安装,作为机器人腿根部的关节控制部分。(注意:打印件仍然需要适当修模,使用锉刀,简单清理一下舵机的槽位,以便轻松的安装舵机) 腿部机械部分安装 取出舵机的单向舵盘,按下图所示的方向安装好以后,用螺丝固定。(注意,固定舵盘旋转轴的地方使用较长点的螺丝,保证舵机在转动过程中,腿部与其能够同步转动。) 脚部机械部分安装将上述组合件翻身,用螺丝将2个单向舵盘固定在腿部的垂直面内侧, 再取出两只舵机安放在两只脚上如下图所示。 将上述组合件与左右脚部分组合为一整体,此时BOB下半身已经完成机械结构的安装。 头部组合安装 头部的安装比较简单,只要按正确的方向将头部卡在下半身上即可。整体效果如下图所示。可以看到BOB已经初具雏形了。 第二部分BOB电子部分 此次推荐使用 的控制板是Beetle控制器和Beetle主控器拓展板,说起Beetle大家一定不陌生。作为DFRobot全新一代微型控制器Beetle了它只有硬币大小!但是它的功能依然强大:10个数字口,4个PWM,5个模拟输入,2组电源端口,满足你对Leonardo的高要求。相信各位小伙伴在制作一个小巧美观的互动作品时,常常为选择合适大小的主控器而苦恼。现在你可以把Beetle隐藏到任何作品当中,例如本例中的BOB。 Beetle引脚定义 Beetle主控器PWM口分别为(3,9,10,11)。(注意:数字口3对应SCL,而在Beetle 扩展板上是没有SCL的,因此需要我们自己焊接一根线将SCL引出如下图所示) 再将Beetle主控器安装在Beetle扩展板上,依次焊接各引脚。 BOB眼睛部分使用的是HC-SR04超声波测距传感器,其四根引脚VCC、TRIG、 ECHO 、 GND分别用红、蓝、黄、绿四根杜邦线引出。 电路连线: 舵机连线:左右脚部舵机(左脚接数字口11,右脚接数字口3,由于数字口3是我们引出的,所以将引出的SCL引脚引入右脚舵机的数字口,再将其VCC和GND接入拓展板)左右腿部分舵机左腿接数字口10,右腿接数字口9。 超声波连线:超声波传感器的VCC\GND\Echo\Trig引脚分别接扩展板的VCC\GND\A0\A1口。 连线接好以后烧录一下程序,调整舵机初始位置为90度。(注意Beetle控制器的Board类型为Arduino Lenardo) #include <Servo.h> // creating the servo objects for front, rear and mid servo Servo myservorhip; Servo myservolhip; Servo myservorankle; Servo myservolankle; // setting the servo angle to 90° for startup byte LlegAngle = 90; byte RlegAngle = 90; byte LnetAngle = 90; byte RnetAngle = 90; // Setup function void setup(){ myservorhip.attach(9); myservolhip.attach(10); myservorankle.attach(3); myservolankle.attach(11); // move servos to center position -> 90° myservorhip.write(LlegAngle); myservolhip.write(RlegAngle); myservorankle.write(LnetAngle); myservolankle.write(RnetAngle); delay(2000); } // The loop remains empty void loop(){ } 上述程序烧录以后,修正BOB腿部和脚部,使其成为正直姿态。再次烧录下列程序代码:该代码的功能当超声波测距测得的距离小于100时,脚部舵机转动,BOB做45度角倾斜动作;当距离大于100时,BOB左右腿做扭动舞蹈。 #define ECHOPIN A0 // Pin to receive echo pulse #define TRIGPIN A1 // Pin to send trigger pulse #include <Servo.h> // 声明调用Servo.h库 Servo myservorhip; // 创建一个舵机对象 Servo myservolhip; // 创建一个舵机对象 Servo myservorankle; // 创建一个舵机对象 Servo myservolankle; // 创建一个舵机对象 int pos = 0; // 变量pos用来存储舵机位置 void setup(){ Serial.begin(9600); pinMode(ECHOPIN, INPUT); pinMode(TRIGPIN, OUTPUT); myservorhip.attach(9); // 将引脚9上的舵机与声明的舵机对象连接起来 myservolhip.attach(10); myservorankle.attach(3); myservolankle.attach(11); } void loop(){ myservorankle.write(90); myservolankle.write(90); myservorhip.write(90); myservolhip.write(90); digitalWrite(TRIGPIN, LOW); // Set the trigger pin to low for 2uS delayMicroseconds(2); digitalWrite(TRIGPIN, HIGH); // Send a 10uS high to trigger ranging delayMicroseconds(10); digitalWrite(TRIGPIN, LOW); // Send pin low again int distance = pulseIn(ECHOPIN, HIGH); // Read in times pulse distance= distance/58; // Calculate distance from time of pulse if (distance<100){ for(pos = 90; pos < 120; pos += 1){ myservolhip.write(pos); myservorhip.write(pos); delay(30); // 延时30ms让舵机转到指定位置 } // 舵机从180°转回到0°,每次减小1° for(pos = 120; pos>=90; pos-=1) { myservorhip.write(pos); myservolhip.write(pos); // 写角度到舵机 delay(30); // 延时30ms让舵机转到指定位置 } } else{ for(pos = 80; pos>=60; pos-=1) { myservorankle.write(pos);// 写角度到舵机 myservolankle.write(pos);// 写角度到舵机 delay(30); // 延时30ms让舵机转到指定位置 } for(pos = 60; pos < 80; pos += 1){ myservorankle.write(pos); // 写角度到舵机 // 给舵机写入角度 myservolankle.write(pos);// 写角度到舵机 delay(30); // 延时30ms让舵机转到指定位置 } } Serial.println(distance); delay(50); // Wait 50mS before next ranging } 现象: Beelte正常使用,加载新程序后,在电脑上找不到Beetle的虚拟串口? 原因: 在排除接线问题后,此现象一般是新程序影响了USB通讯导致。Beetle/Leonardo的USB转串口是由相应的软件实现的(Arduino IDE中实现),它和用户程序都在ATMEGA32U4中,如果用户程序影响了USB的相关操作将导致看不到USB虚拟串口。此时需要重新加载可用的用户程序(比如Blink)。 由于Beetle/Leonardo已经和电脑失去联系,不能自动复位,需要人工复位方式进行加载。Beetle的复位需要通过跳线短接ICSP接口中的RESET和GND来实现。 注意Beetle/Leonardo上电启动时将直接运行用户程序,因此通过插拔USB不能使其进入Bootloader。 方法: 手动复位下载程序过程: 1)在Arduino IDE中打开blink程序,单板类型选择为“Leonardo”,点击“upload”上载程序; 2)当IDE中显示“uploading”时,用跳线进行软复位(将ICSP接口中的RESET和地短路一下后断开); 3)等待程序加载完毕。 【测试运行】 将3.7V锂电池 的正负极插在Beetle扩展板的电源接口上,按下开关。BOB 根据前方物体的距离,跳出不同的舞蹈。 |
165.82 KB, 下载次数: 9026
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed