如何使用Ardunio控制4自由度机械臂?

时间:2019-03-30 07:17:49

标签: arduino arduino-uno robotics robot

我最近购买了4自由度(自由度)机器人手臂套件。我成功地组装了它,现在我想对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(){}

我想要一些函数来为任何给定坐标或类似的东西计算数组的值。(这是每个伺服器将手臂末端定位在该点的移动)

手臂照片

Robotic Arm Robotic Arm

这是实际手臂的产品页面

https://www.amazon.in/gp/product/B07LDNY9J3/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题!我试图弄清楚手臂的逆运动学,但是我发现这很困难,并且由于硬件的不确定性,它也不起作用。实际的解决方案是使用传感器。我将距离传感器(超音速)放在手臂上,以便可以实时测量手臂各部分之间的距离。由于我知道手臂的每个部分的长度(这里不必担心不确定性。)以及它们之间的距离,因此我可以使用简单的三角函数来计算手臂尖端的坐标。这意味着我可以简单地使用反馈回路以无法消除的精度定位手臂并克服硬件的局限性。

我确实知道这不是所提问题的确切答案,但我从经验中发现,这种方法最适合这种情况(与根据问题进行的尝试相比)。