arduino3-机械臂

meArm机械臂安装与使用

这只是一个简单的说明文档,仅罗列了核心的代码和一些出现问题的地方.

1. 使用伺服电机

1.1伺服电机转动脚本:

#include <Servo.h> //arduino内置的伺服电机的库

Servo myservo;  // create servo object to control a servo 创建一个控制伺服电机的对象
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position 一个存储当前伺服电机位置的变量

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 将9号pwm引脚关联
  Serial.begin(9400); //创建一个串口
}

void loop() {
  for (pos = 0; pos <= 360; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 360; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

1.2.连接

  • 伺服电机红色线是-vcc ---与arduino的+5v相连
  • 伺服电机棕色线-gnd ---与arduino的 gnd(接地)相连
  • 伺服电机橙色线是-pwm ---与arduino的9号引脚相连

实例图:


2.串口通讯

2.1 串口通讯

引脚0 RX 接收 Receive

引脚1 TX 发送 Transmit

通讯的过程是TX--->RX

2.2 电脑和arduino通讯

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Please enter serial data");
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()>0){
    char serialData = Serial.read();// 读取完暂存的数据后会,暂存区会被清空
    Serial.println(serialData);
  }
}

3. 组装机械臂

3.1 机械臂组装

百度,搜多meArm安装 即可找到相关视频和文章,内容太长不再罗列,组装好之后大致是这样的:

3.2 初始化:

#include <Servo.h>
Servo base, fArm,bArm,claw;// 初始化四个对象,分别是底座电机,前臂电机,后臂电机和爪子电机
void attachPin(Servo obj, int num, int delayTime=200);
void initPosition(Servo obj, int num, int delayTime=200);
int start;//开始位置
int end; //结束位置
void setup(){
     //绑定引脚
     attachPin(base,10);
     attachPin(fArm,10);
     attachPin(bArm,10);
     attachPin(claw,10);
     //初始化
     initPosition(base,90);
     initPosition(fArm,90);
     initPosition(bArm,90);
     initPosition(claw,90);
}
void loop(){
    //nothing ...
}
void attachPin(Servo obj, int num, int delayTime=200){
    obj.attach(num);
    delay(delayTime);
}
void initPosition(Servo obj, int num, int delayTime=200){
  obj.write(num);
  delay(delayTime); 
}

3.3调整电机的转动速度

调整电机转动速度的核心原理是,将一个的转动通过for循环切割成一个个小的肉眼无法察觉的停顿动作

下面是示例:

int start;//开始位置
int end; //目标位置
...
Servo base;
base.attach(10);
...
if(start>end){ // 因为循环涉及 i++ 或i--,所以有正转和倒转的区别
	//实现控制速度,可以通过控制delay的时间和i自增的数量来实现
	for(int i=start;i>=end;i--){
		base.write(i);
		delay(20);
	}
}else{
	for(int i=start;i<=end;i++){
		base.write(i);
		delay(20);
	}	
}

3.4 电脑控制机械臂

电脑控制机械臂是通过Serial这个库来实现的

  • 通过电脑传输信息:

    Servo base, fArm,bArm,claw;// 初始化四个对象,分别是底座电机,前臂电机,后臂电机和爪子电机
    void setup(){
        //电机初始化
        ...
        Serial.begin(9400); //创建串口通讯端口
        Serial.println("Serial begin...");
    }
    void loop(){
        if(Serial.available()>0){
            char machine = Serial.read();//读取传过来的串口数据--此处读取的是机器字母
            int degree = Serial.parseInt();//转动的角度
            processCmd(machined,degree);//自定义函数用于处理电机转动
        }
        
    }
    ...
    
    void processCmd(char machine,int degree){
        //根据machine 获取不同的电机对象
        if(machine=='b'){
            //base对象
            int local = base.read();//base的当前位置
            int target = degree;
            //根据上面的控制速度
            if(start>end){ 
    		for(int i=start;i>=end;i--){
                    base.write(i);
                    delay(20);
                }
            }else{
                for(int i=start;i<=end;i++){
                    base.write(i);
                    delay(20);
                }	
            }
        }else if(machine=='c'){
            //...跟上述一样
        }
    }
    
       
    

    tip: serial.availabel()

    //官方描述如下
    Get the number of bytes (characters) available for reading from the serial port. This is data that’s already arrived and stored in the serial receive buffer (which holds 64 bytes).
    //这段话的意思是,arduino在接受到数据后,会被存贮到一个64bytes 的buffer缓存区,通过这个方法可以获得缓存区中的数据大小,如果不为0说明有数据传来了.
    
原文地址:https://www.cnblogs.com/callmelx/p/13869447.html