如何使用 Arduino 控制 4 DOF 机械臂?
How to control a 4 DOF robotic arm using Ardunio?
我最近买了一个 4 DOF (自由度) 机械臂套件。我成功组装了它,现在我想对 arduino 进行编程来控制它。
我知道如何使用 arduino 使伺服系统工作,但无法弄清楚如何将手移动到特定位置。
我尝试手动创建一个二维数组,其中包含每个电机的旋转值(以度为单位)。这可行,但很难获取值并创建数组。目前我通过反复试验调整了这些值。
我手动创建的数组:
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(){}
我想要一些函数来计算任何给定坐标或类似坐标的数组值。(即每个伺服器的移动以将臂的末端定位在该点)
手臂照片:
这是实际手臂的产品页面:
https://www.amazon.in/gp/product/B07LDNY9J3/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1
我终于解决了这个问题!我试着找出手臂的逆向运动学,但我发现这非常困难,而且由于硬件的不确定性,它也不能很好地工作。实际的解决方案是使用传感器。我将距离传感器(超声波)放在手臂上,这样我就可以实时测量手臂部位之间的距离。因为我知道手臂每个部分的长度(我不必担心这里的不确定性。)以及它们之间的距离,我可以做简单的三角函数来计算手臂尖端的坐标。这意味着我可以简单地使用反馈回路以不可磨灭的精度定位手臂并克服硬件的限制。
我知道这不是所问问题的确切答案,但根据我的经验,我发现这种方法最适合这种情况(与根据问题进行的尝试相比)。
我最近买了一个 4 DOF (自由度) 机械臂套件。我成功组装了它,现在我想对 arduino 进行编程来控制它。 我知道如何使用 arduino 使伺服系统工作,但无法弄清楚如何将手移动到特定位置。
我尝试手动创建一个二维数组,其中包含每个电机的旋转值(以度为单位)。这可行,但很难获取值并创建数组。目前我通过反复试验调整了这些值。
我手动创建的数组:
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(){}
我想要一些函数来计算任何给定坐标或类似坐标的数组值。(即每个伺服器的移动以将臂的末端定位在该点)
手臂照片:
这是实际手臂的产品页面:
https://www.amazon.in/gp/product/B07LDNY9J3/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1
我终于解决了这个问题!我试着找出手臂的逆向运动学,但我发现这非常困难,而且由于硬件的不确定性,它也不能很好地工作。实际的解决方案是使用传感器。我将距离传感器(超声波)放在手臂上,这样我就可以实时测量手臂部位之间的距离。因为我知道手臂每个部分的长度(我不必担心这里的不确定性。)以及它们之间的距离,我可以做简单的三角函数来计算手臂尖端的坐标。这意味着我可以简单地使用反馈回路以不可磨灭的精度定位手臂并克服硬件的限制。
我知道这不是所问问题的确切答案,但根据我的经验,我发现这种方法最适合这种情况(与根据问题进行的尝试相比)。