(實習)機械手臂-利用遙桿模組控制機械臂夾物

 (實習)機械手臂-利用遙桿模組控制機械臂夾物

繼這篇文章-(實習)機械手臂-利用最原始的方式回圈做特定動作

接下來我想用遙桿來控制手臂抓取物品。

心得:

先說一下心得,不知什麼原因,夾子的部份(SG90S)
很燙以致燒壞了,換了一個SG90勉強還可以,但有時
一樣會發燙。整個部份比較要花腦筋的是觀察和設定每個舵機
的最大和最小值,夾子的話一開始起始值可以設定抓緊(最小值)
才不會抓過頭以致舵機卡死。

控制原理:

利用analogRead()取得遙桿的數值,轉換成角度,再規範遙桿的x,y
來對應動作,但我不想讓遙桿放開時機械臂跟著歸位,所以還得弄
一個變數來讓它每測到數值+10度或—10度。

程式碼:

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
//x 150~600
const int x=A0;
const int y=A1;
const int z=A2;
const int grad=A3;
int xpos=450;
int ypos=450;
int zpos=450;
int gradpos=200;
int X_VAL; //left/right
int Y_VAL; //forward/back
int Z_VAL; //up/down
int grad_VAL;

void setup(){
    Serial.begin(9600);
    Serial.println("Servo value is diplay");
    pwm.begin();
    pwm.setOscillatorFrequency(27000000);
    pwm.setPWMFreq(60);
    pwm.setPWM(00380);
    pwm.setPWM(10380);
    pwm.setPWM(20380);
    pwm.setPWM(30200);
    delay(10);
}

void loop(){
    X_VAL=analogRead(x);
    X_VAL=map(X_VAL, 01023150600);
    Y_VAL=analogRead(y);
    Y_VAL=map(Y_VAL, 01023150600);
    Z_VAL=analogRead(z);
    Z_VAL=map(Z_VAL, 01023150600);
    grad_VAL=analogRead(grad);
    grad_VAL=map(grad_VAL, 01023150600);

    if (X_VAL<200){
      delay(50);
      if (xpos>150){
        xpos-=10;
        pwm.setPWM(00, xpos);
        Serial.print("THE xpos is = ");
        Serial.println(xpos);
      }
    }else if (X_VAL>500){
      delay(50);
      if (xpos<600){
        xpos+=10;
        pwm.setPWM(00, xpos);
        Serial.print("THE xpos is = ");
        Serial.println(xpos);
        
      }
    }

    if (Y_VAL<200){
      delay(50);
      if (ypos>270){
        ypos-=10;
        pwm.setPWM(10, ypos);
        Serial.print("THE ypos is = ");
        Serial.println(ypos);
      }
    }else if (Y_VAL>500){
      delay(50);
      if (ypos<600){
        ypos+=10;
        pwm.setPWM(10, ypos);
        Serial.print("THE ypos is = ");
        Serial.println(ypos);
      }
    }

     if (Z_VAL<280){
      delay(50);
      if (zpos>280){
        zpos-=10;
        pwm.setPWM(20, zpos);
        Serial.print("THE ypos is = ");
        Serial.println(zpos);
      }
    }else if (Z_VAL>500){
      delay(50);
      if (zpos<600){
        zpos+=10;
        pwm.setPWM(20, zpos);
        Serial.print("THE zpos is = ");
        Serial.println(zpos);
      }
    }
    
    if (grad_VAL<200){
      delay(50);
      if (gradpos>200){
        gradpos-=10;
        pwm.setPWM(30, gradpos);
        Serial.print("THE gradpos is = ");
        Serial.println(gradpos);
      }
    }else if (grad_VAL>500){
      delay(50);
      if (gradpos<450){
        gradpos+=10;
        pwm.setPWM(30, gradpos);
        Serial.print("THE gradpos is = ");
        Serial.println(gradpos); 
      }
    }
}

實驗結果:





留言

這個網誌中的熱門文章

平衡小車(balance-Robot)-基本平衡-Arduino