(實習)機械手臂-利用遙桿模組控制機械臂夾物
(實習)機械手臂-利用遙桿模組控制機械臂夾物
繼這篇文章-(實習)機械手臂-利用最原始的方式回圈做特定動作
接下來我想用遙桿來控制手臂抓取物品。
心得:
先說一下心得,不知什麼原因,夾子的部份(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(0, 0, 380);
pwm.setPWM(1, 0, 380);
pwm.setPWM(2, 0, 380);
pwm.setPWM(3, 0, 200);
delay(10);
}
void loop(){
X_VAL=analogRead(x);
X_VAL=map(X_VAL, 0, 1023, 150, 600);
Y_VAL=analogRead(y);
Y_VAL=map(Y_VAL, 0, 1023, 150, 600);
Z_VAL=analogRead(z);
Z_VAL=map(Z_VAL, 0, 1023, 150, 600);
grad_VAL=analogRead(grad);
grad_VAL=map(grad_VAL, 0, 1023, 150, 600);
if (X_VAL<200){
delay(50);
if (xpos>150){
xpos-=10;
pwm.setPWM(0, 0, xpos);
Serial.print("THE xpos is = ");
Serial.println(xpos);
}
}else if (X_VAL>500){
delay(50);
if (xpos<600){
xpos+=10;
pwm.setPWM(0, 0, xpos);
Serial.print("THE xpos is = ");
Serial.println(xpos);
}
}
if (Y_VAL<200){
delay(50);
if (ypos>270){
ypos-=10;
pwm.setPWM(1, 0, ypos);
Serial.print("THE ypos is = ");
Serial.println(ypos);
}
}else if (Y_VAL>500){
delay(50);
if (ypos<600){
ypos+=10;
pwm.setPWM(1, 0, ypos);
Serial.print("THE ypos is = ");
Serial.println(ypos);
}
}
if (Z_VAL<280){
delay(50);
if (zpos>280){
zpos-=10;
pwm.setPWM(2, 0, zpos);
Serial.print("THE ypos is = ");
Serial.println(zpos);
}
}else if (Z_VAL>500){
delay(50);
if (zpos<600){
zpos+=10;
pwm.setPWM(2, 0, zpos);
Serial.print("THE zpos is = ");
Serial.println(zpos);
}
}
if (grad_VAL<200){
delay(50);
if (gradpos>200){
gradpos-=10;
pwm.setPWM(3, 0, gradpos);
Serial.print("THE gradpos is = ");
Serial.println(gradpos);
}
}else if (grad_VAL>500){
delay(50);
if (gradpos<450){
gradpos+=10;
pwm.setPWM(3, 0, gradpos);
Serial.print("THE gradpos is = ");
Serial.println(gradpos);
}
}
}
留言
張貼留言