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說明有數據傳來了.
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM