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个。
B.结构组装
通过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 servoServo myservorhip;Servo myservolhip;Servo myservorankle;Servo myservolankle;// setting the servo angle to 90° for startupbyte LlegAngle = 90;byte RlegAngle = 90;byte LnetAngle = 90;byte RnetAngle = 90;// Setup functionvoid 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 emptyvoid 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 根据前方物体的距离,跳出不同的舞蹈。
【总结拓展】 本次BOB的外形比较中规中矩,如果你有不错的创意可以发挥出来,打造个性化的BOB。另外在功能上,我们也可以进行拓展,本例中我们只是给BOB制定了两种动作,你可以修改程序代码玩出更多的花式。让BOB伴随音乐起舞。(加个MP3播放模块),或则你想用手机控制你的BOB,那么换块Bluno Beetle主控板来玩蓝牙BOB。(完结)
不够详细 再萌哒哒的 大连林海 发表于 2015-7-2 20:20
不够详细 再萌哒哒的
还没有写完你就跟上了。 写完了,你又不来了 写得很赞!我又看到你微信里的小视频~萌萌哒~有空放上来啊! BOB长出犄角会是什么样呢?
hnyzcj 发表于 2015-7-5 21:27
BOB长出犄角会是什么样呢?
看到这个 我来了 好梦 你换一个颜色 长犄角的Bob好奇怪 看到视频~~摩擦摩擦~魔鬼的步伐
hnyzcj 发表于 2015-7-5 21:27
BOB长出犄角会是什么样呢?
你确定不是手吗? luna 发表于 2015-7-6 09:53
你确定不是手吗?
确定以及肯定不是手,是犄角,哈哈 其实BOB也可以是这样子的 hnyzcj 发表于 2015-7-6 10:37
其实BOB也可以是这样子的
T T 你到底把他怎么了…… 为什么瘦了这么多……为什么脸变尖了~~ 很不错,我也做一个
页:
[1]