本篇文章由 VeriMake 旧版论坛中备份出的原帖的 Markdown 源码生成
原帖标题为:简易 Arduino 铝片机械爪的设计与制作
原帖网址为:https://verimake.com/topics/85 (旧版论坛网址,已失效)
原帖作者为:ThatDanielWu(旧版论坛 id = 38,注册于 2020-05-03 22:18:29)
原帖由作者初次发表于 2020-05-04 18:44:57,最后编辑于 2020-05-04 18:44:57(编辑时间可能不准确)
截至 2021-12-18 14:27:30 备份数据库时,原帖已获得 1434 次浏览、5 个点赞、0 条回复
1 序言
博主是一名英属哥伦比亚大学工程系的准大二学生一枚,在刚刚过去的一个学期里的工程课中学生们进行了一场机械爪的设计与制作比赛。所有的学生被分为5-6人左右的小组。从数张毫米厚的铝片开始,通过小组内的交流,设计,动手制作,程序编写来完成每个小组的机械爪,最终进行比赛的争夺。本篇就来给各位唠唠整个设计的流程,结果,以及从中我学到了什么。
2 比赛&设计规则
比赛一共分为两个回合,第一回合为小组通过控制自己设计的机械爪将特定物品从指定地点抓取并被要求抬高规定的高度再放置于指定落点。物品包括铅笔,铝罐,骰子,海绵,乒乓球,高尔夫球,羽毛球等等。机械爪在比赛过程中需要自己判断并且完成抓取以及释放的动作。

第一回合的抓取物品
最终分数以规定时间内抓取物品数量计算。第二回合同样为指定起落点抓取,不过物品变为很细小的螺纹意大利面。

第二回合的抓取物品:螺纹意大利面

最终比赛时的操作方式
材料与工具
制作机械爪的材料非常简单,动力部分仅包含一块充电宝作为电源,一组Arduino Uno开发套件(包含舵机,超声波等)。其余的所有传动结构,框架,都要从铝片开始通过基础的物理工具进行弯折,铆钉,打洞嵌入滚轴等等操作从零开始制作。这样的设计与制作的过程对于初学者还是相当具有挑战性的。

制作过程中使用的手工工具
3 设计
在设计初期,我们六位小组成员通过brain storming的方式分别构思出了数种结构,经过团队讨论,决定了我们的机械爪结构设计(如下图),并从纸板尝试搭建基础传动结构开始,一路改进。



最终成品
结构详解
机械爪的传动结构,也就是如何将舵机旋转所产生的扭矩转换为爪部的外扩以及内收的圆周运动是机械爪设计中的核心部分。一个有用并且有效的传动结构对于机械爪的最终比赛表现是至关重要的。我们小组使用了金属线传动的方法。将两根金属线分别铆接在两片金属爪片上,同时在另一端固定在舵机的旋转结构上,使得舵机旋转时所产生的扭矩通过金属线的弹力驱动机械爪的抓取与松开的运动。
自动抓取结构
由于机械爪在比赛过程中需要自由判断并且完成抓取以及释放的动作,因此小组需要给机械爪添加一套可以自动识别当前环境并作出相对应判断动作的识别方案。在比赛的环境中,最稳定最实用的方案就是通过判断机械爪与地面的相对高度来决定收放动作。完成这样的方案在不同团队中大致有两种方法:
- 通过超声波模块识别机械爪与地面的距离,到达规定距离时做出相应动作
- 在机械爪的底部设置一个触点开关装置,接触到地面时接通电路,完成收&放动作
根据我们的设计,我们小组使用了超声波测距的方法。代码如下:
#include <NewPing.h> // include the NewPing library for this program
#include <Servo.h>
#define VCC_PIN 13
#define TRIGGER_PIN 12 // sonar trigger pin will be attached to Arduino pin 12
#define ECHO_PIN 11 // sonar echo pint will be attached to Arduino pin 11
#define GROUND_PIN 10
#define MAX_DISTANCE 200 // fmaximum distance set to 200 cm
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // initialize NewPing
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
int state = 0;
void setup() //do the following things once
{
myservo.attach(9);
Serial. begin(9600); // set data transmission rate to communicate with computer
pinMode(ECHO_PIN, INPUT) ;
pinMode(TRIGGER_PIN, OUTPUT) ;
pinMode(GROUND_PIN, OUTPUT); // tell pin 10 it is going to be an output
pinMode(VCC_PIN, OUTPUT); // tell pin 13 it is going to be an output
digitalWrite(GROUND_PIN,LOW); // tell pin 10 to output LOW (OV, or ground)
digitalWrite(VCC_PIN, HIGH) ; // tell pin 13 to output HIGH (+5V)
}
void loop() // do the following things forever
{
int count = 0;
int times = 0;
int angle = myservo.read();
double average=0;
delay(2000);
while(times <= 10){
int DISTANCE_IN_CM = sonar.ping_cm(); // read the sonar sensor, using a variable
Serial.print("Ping: "); //print “Ping:" on the computer display
Serial.print(DISTANCE_IN_CM); //print the value of the variable next
Serial.println("cm"); //print "cm" after that, then go to next line
count += DISTANCE_IN_CM;
times++;
}
average = count/10;
Serial.print("average: "); //print “Ping:" on the computer display
Serial.println(average);
if(average < 20 && average > 1){
if(angle != 25){
//close
delay(1000);
myservo.write(25);
state = 1;
}
}
delay(2000);
if(average < 20 && average > 1){
if(angle != 100){
//open
delay(1000);
myservo.write(100);
state = 0;
}
}
}
程序的基础思想就是通过超声波判断距离完成收放动作,并且通过读取舵机实时角度来判断应该收还是放。
在设计过程中也遇到了一些小问题,比如Arduino附带的超声波识别不是很准确,导致机械爪会经常在半空中意外收放。不过我们最终通过读取10次超声波识别数据并取平均值的方法来获得相对稳定的距离判断。
3 设计过程中的挑战
其实这个项目对于我们所有的大一学生来说,手工以及编程上的挑战与提升只是最基础的,每个人只要有一定的动手能力都可以做出一台有效的机械爪。但是从项目的整体上而言更有挑战性的是如何从六个独立个体所组成的团队中进行有效的交流,并得出一致的小组的设计。也就是人们常说的“团队合作”。
每一个小组都是临时分配的六名工程学生,因此并不存在一个绝对的领导核心来主导整个团队的设计思路与想法。并且每个人都是第一次接触这样的机械爪设计,没有人有绝对的信心可以保证自己的设计最终可行。
当每一个人都有自己所认为可行的想法时,每个组员该如何有效地与队员进行沟通,并且得出最终的设计方案其实是非常具有挑战性的。而在一整年工程学科中的学习中,我们也学到了许多工程项目中的决策方法,这些方法在很大程度上帮助了我们的决策过程,但是团队的交流效率与决策还需要很多合作经验与个人能力的提升才能最终一步一步慢慢提升。