机械臂与Arduino入门演示(一)

逆运动学(Inverse Kinematics)是虚拟角色运动控制的一种基本方法,它根据用户指定肢体末端的位置计算出虚拟角色各个关节的旋转.

本示例将利用迷你机械臂和Arduino对IK算法做个简单的演示,并通过游戏摇杆进行操控。

首先,我们需要准备一下配件:

  • 迷你机械臂(meArm),详细资料请查看《迷你机械臂安装手册》,或直接在奇果派网店购买
  •  arduino主板
  • 16路pwm舵机驱动板(可通过奇果派商店购买)
  • 游戏摇杆
  • 杜邦线若干条

示例一:用Arduino控制机械臂

 

 

  机械臂与Arduino的引脚接线说明:

Arduino引脚

底部舵机舵机

右侧舵机

左侧舵机

钳子舵机

GND

GND(棕色)

GND(棕色)

GND(棕色)

GND(棕色)

5V

5V(红色)

5V(红色)

5V(红色)

5V(红色)

11

信号线(黄色)

10

信号线(黄色)

9

信号线(黄色)

6

信号线(黄色)

演示程序代码:

#include "meArm.h"

#include <Servo.h>   //引入系统舵机驱动程序

int basePin = 11;   //底部舵机

int shoulderPin = 10;//肩部(右侧)舵机

int elbowPin = 9;    //肘部(左侧)舵机

int gripperPin = 6; //钳子舵机

meArm arm;

void setup() {

  arm.begin(basePin, shoulderPin, elbowPin, gripperPin);

}

void loop() {

  //首先鼓鼓掌—钳子开合

  arm.openGripper();

  arm.closeGripper();

  arm.openGripper();

  arm.closeGripper();

  arm.openGripper();

  delay(500);

  //转到左上方抓点东西

  arm.gotoPoint(-80,100,140);

  arm.closeGripper();

  //再把东西放到右前方

  arm.gotoPoint(70,200,10);

  arm.openGripper();

  //回到起始点

  arm.gotoPoint(0,100,50);

  delay(2000);

}

 

示例二:用一对摇杆控制机械臂

需要添加一个游戏摇杆,如图

 

 

 

机械臂与Arduino的引脚连接方式如下:

Arduino

Stick1

Stick2

底部舵机舵机

右侧舵机

左侧舵机

钳子舵机

GND

GND

GND

GND(棕色)

GND(棕色)

GND(棕色)

GND(棕色)

5V

VCC

5V(红色)

5V(红色)

5V(红色)

5V(红色)

A0

HOR(X)

A1

VER(Y)

A2

HOR(X)

A3

VER(Y)

11

信号线(黄色)

10

信号线(黄色)

9

信号线(黄色)

6

信号线(黄色)

示例程序:

#include "meArm.h"

#include <Servo.h>

int basePin = 11;

int shoulderPin = 10;

int elbowPin = 9;

int gripperPin = 6;

int xdirPin = 0;

int ydirPin = 1;

int zdirPin = 3;

int gdirPin = 2;

meArm arm;

void setup() {

  arm.begin(basePin, shoulderPin, elbowPin, gripperPin);

}

void loop() {

  float dx = map(analogRead(xdirPin), 0, 1023, -5.0, 5.0);

  float dy = map(analogRead(ydirPin), 0, 1023, 5.0, -5.0);

  float dz = map(analogRead(zdirPin), 0, 1023, 5.0, -5.0);

  float dg = map(analogRead(gdirPin), 0, 1023, 5.0, -5.0);

  if (abs(dx) < 1.5) dx = 0;

  if (abs(dy) < 1.5) dy = 0;

  if (abs(dz) < 1.5) dz = 0;

  if (!(dx == 0 && dy == 0 && dz == 0))

    arm.goDirectlyTo(arm.getX() + dx, arm.getY() + dy, arm.getZ() + dz);

  if (dg < -3.0)

    arm.closeGripper();

  else if (dg > 3.0)

    arm.openGripper();

  delay(50);

}

实例代码:点击下载