Arduino 如何使用Ardunio控制4自由度机械臂?
我最近买了一个4自由度的机械臂套件。我成功地组装了它,现在我想对arduino进行编程以控制它。 我知道如何使用arduino使伺服系统工作,但不知道如何将手移动到特定位置 我尝试手动创建一个二维数组,每个马达的旋转值以度为单位。这是可行的,但很难获得值并创建数组。目前,我通过反复试验来调整这些值 我手动创建的数组:Arduino 如何使用Ardunio控制4自由度机械臂?,arduino,arduino-uno,robotics,robot,Arduino,Arduino Uno,Robotics,Robot,我最近买了一个4自由度的机械臂套件。我成功地组装了它,现在我想对arduino进行编程以控制它。 我知道如何使用arduino使伺服系统工作,但不知道如何将手移动到特定位置 我尝试手动创建一个二维数组,每个马达的旋转值以度为单位。这是可行的,但很难获得值并创建数组。目前,我通过反复试验来调整这些值 我手动创建的数组: short first[] = { 180 , 80 , 0 , 90 }; short pos[][4] = { { 180 , 80 , 00 , 85 }, { 1
short first[] = { 180 , 80 , 0 , 90 };
short pos[][4] =
{
{ 180 , 80 , 00 , 85 },
{ 180 , 85 , 00 , 80 },
{ 180 , 90 , 00 , 75 },
{ 180 , 95 , 00 , 75 },
{ 180 , 100 , 0 , 70 },
{ 180 , 110 , 0 , 70 },
{ 180 , 115 , 0 , 70 },
{ 180 , 120 , 0 , 65 },
{ 180 , 125 , 0 , 65 },
{ 180 , 130 , 0 , 65 },
{ 180 , 135 , 0 , 65 },
{ 180 , 140 , 0 , 65 },
{ 180 , 145 , 0 , 65 },
{ 180 , 150 , 0 , 65 },
{ 180 , 150 , 0 , 70 },
{ 180 , 150 , 0 , 75 },
{ 180 , 150 , 0 , 80 },
{ 180 , 150 , 0 , 90 },
{ 180 , 145 , 0 , 90 },
{ 180 , 140 , 0 , 90 },
{ 180 , 135 , 0 , 90 },
{ 180 , 130 , 0 , 90 },
{ 180 , 125 , 0 , 90 },
{ 180 , 120 , 0 , 90 },
{ 180 , 115 , 0 , 90 },
{ 180 , 110 , 0 , 90 },
{ 170 , 110 , 0 , 90 },
{ 160 , 110 , 0 , 90 },
{ 150 , 110 , 0 , 90 },
{ 140 , 110 , 0 , 90 },
{ 130 , 110 , 0 , 90 },
{ 130 , 115 , 0 , 90 },
{ 120 , 120 , 0 , 90 },
{ 120 , 125 , 0 , 90 },
{ 120 , 130 , 0 , 90 },
{ 120 , 135 , 0 , 90 },
{ 120 , 137 , 0 , 90 },
{ 120 , 139 , 0 , 90 },
{ 120 , 140 , 0 , 85 },
{ 120 , 140 , 0 , 80 },
{ 120 , 140 , 0 , 75 },
{ 120 , 140 , 0 , 70 },
};
我编写的完整代码:
/*
* claws - 90 close 75 open
* elbow - 0 to 100
* sholder - 30 to 180
*/
Servo Servos[4];
void setup()
{
Servos[0].attach(3);
Servos[1].attach(5);
Servos[2].attach(9);
Servos[3].attach(11);
reset();
run();
Servos[0].detach();
Servos[1].detach();
Servos[2].detach();
Servos[3].detach();
}
void run()
{
for(int i=0; i<sizeof(pos) / sizeof(short) /4 ; i++)
{
for(int j=3; j>=0; j--)
{
Servos[j].write(pos[i][j]);
delay(15);
}
delay(15);
}
for(int i=-1+ sizeof(pos) / sizeof(short) /4;i>=0 ; i--)
{
for(int j=3; j>=0; j--)
{
Servos[j].write(pos[i][j]);
delay(15);
}
delay(15);
}
delay(3000);
}
void reset()
{
for(int i=3; i>=0; i--)Servos[i].write(first[i]);
}
void loop(){}
/*
*爪-90关闭75打开
*肘部-0到100
*支架-30至180
*/
伺服系统[4];
无效设置()
{
伺服[0]。连接(3);
伺服装置[1]。连接(5);
伺服装置[2]。连接(9);
伺服装置[3]。连接(11);
重置();
run();
伺服[0]。分离();
伺服[1]。分离();
伺服系统[2]。分离();
伺服系统[3]。分离();
}
无效运行()
{
对于(int i=0;i=0;j--)
{
伺服[j].写(pos[i][j]);
延误(15);
}
延误(15);
}
对于(int i=-1+sizeof(pos)/sizeof(short)/4;i>=0;i--)
{
对于(int j=3;j>=0;j--)
{
伺服[j].写(pos[i][j]);
延误(15);
}
延误(15);
}
延迟(3000);
}
无效重置()
{
对于(inti=3;i>=0;i--)伺服[i]。写入(第一[i]);
}
void loop(){}
我需要一些函数来计算任意给定坐标或类似坐标的数组值。(即每个伺服的移动,以将手臂末端定位在该点)
手臂照片:
这是实际arm的产品页面:
我终于解决了这个问题!我试图找出手臂的反向运动学,但我发现这非常困难,而且由于硬件的不确定性,它也不能很好地工作。实际的解决方案是使用传感器。我在手臂上安装了距离传感器(超声波),以便实时测量手臂各部分之间的距离。因为我知道手臂每一段的长度(这里我不必担心不确定性)以及它们之间的距离,所以我可以用简单的三角法来计算手臂尖端的坐标。这意味着我可以简单地使用一个反馈回路来精确定位手臂,并克服硬件的限制
我知道这不是问题的确切答案,但根据我的经验,我发现这种方法最适合这种情况(与根据问题进行的尝试相比)。您需要找到机器人配置的反向运动学方程。也许,因为它是一个工具包,其他人已经计算了它们,你可以在网上找到它们。如果不是这样,您需要获取配置的Denavit Hartenberg参数,然后获取每个DOF的矩阵。我搜索了,但只能找到3或6 DOF版本的教程和文档。该套件的销售商不是一个成熟的供应商,甚至没有提供良好的文档来构建它。我是一个初学者,如果有人能帮我解出这些方程,那将是非常有帮助的。第四度是夹持器,你可以不用它来计算逆运动学。如果物理尺寸匹配,可能可以使用3自由度手臂的IK。3自由度版本将其第三度作为夹持器。