คำอธิบาย
แขนกลจับชิ้นงาน Linear Slide Mechanical Arm เพื่อการทดลองและเรียนรู้ ประยุกต์ใช้งานแขนกลจับชิ้นงาน
การทำงาน
- เริ่มจาก เซนเซอร์โฟโตอิเล็คทริคอินฟราเรด Infrared Photoelectric Sensors ตรวจจับขวดน้ำ
- จากนั้น แขน ที่ติดตั้งมือจับ Gripper เซอร์โวมอเตอร์ 500g ซึ่งแขนนั้นติดตั้งบนรางสไลด์ยาว 1 เมตร
- ขับเคลื่อนด้วยสเต็ปปิ้งมอเตอร์ สไลด์เพื่อนำพาชิ้นงานจากจุดต้นทางไปยังปลายทาง
- การยกแขนกระทำด้วยเซอร์โวมอเตอร์ High torque 110Kg.cm
- มือจับ Gripper จับขวด ประกอบด้วย เซอร์โวมอเตอร์ 500g
- ควบคุมการทำงานทั้งหมดด้วยบอร์ด Arduino
มีอะไรเตรียมไว้ให้ในชุด
- รางสไลด์ยาว 1 เมตร พร้อมสเต็ปมอเตอร์
- เซอร์โวมอเตอร์ High Torque 110Kg.cm สำหรับยกแขน
- ชุดมือจับชิ้นงาน Gripper 4 พร้อมเซอร์โวมอเตอร์ MT0601 เซอร์โวมอเตอร์ แรงบิดสูง Digital High Torque RC Servo Motor 20kg 180D TD-8120MG
- ชุดควบคุม Arduino Shield + Driver A4988
- เซนเซอร์โฟโตอิเล็คทริคอินฟราเรด Infrared Photoelectric Sensors
- สวิตชิ่งพาวเวอร์ซัพพลาย +5VDC, +12VDC
- ลิมิตสวิตช์พร้อมสาย Limit Switch
Source Code // Test Step Motor
#include <AccelStepper.h>
AccelStepper stepper(AccelStepper::DRIVER, 2, 5);
// pin 2 = Step
// pin 5 = Dir
void setup()
{
pinMode(8, OUTPUT);
digitalWrite(8,LOW);// enable
stepper.setMaxSpeed(1000);
stepper.setSpeed(500);
}
void loop()
{
stepper.runSpeed();
}
Source Code Linear Slide Mechanical Arm Gripper Robot V2
#include <AccelStepper.h>
#include <Servo.h>
Servo MyGripper; // create servo object to control a servo
Servo MyARM; // create servo object to control a servo
// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::DRIVER, 5, 2);
const int HomeSW = 9;
int buttonState = 0;
char OK_flag=0;
int State=0;
int MaxDistance = 2500;
const int Gripper_servo = 13; // มือจับ
const int Arm_servo = 12; // แขน
int arm_Up = 75;// ตำแหน่งยกแขนขึ้น
int arm_Down = 55;// ตำแหน่งวางแขนลง
int Gripper_ON = 100; // มือจับ
int Gripper_OFF = 30; // ปล่อยมือ
int SensorA6=0; // เซนเซอร์ตรวจจับขวดว่ามีหรือไม่
int pos = arm_Up;
int SetSpeedArm = 100;
void setup()
{
pinMode(8, OUTPUT);
digitalWrite(8,LOW);// enable
pinMode(A6, INPUT_PULLUP );//เซนเซอร์
stepper.setMaxSpeed(1000.0); //ปรับความเร็ว
stepper.setAcceleration(2000.0);
pinMode(HomeSW,INPUT_PULLUP);
MyGripper.attach(Gripper_servo); // attaches the servo on pin 9 to the servo object
MyGripper.write(Gripper_OFF);
MyARM.attach(Arm_servo); // attaches the servo on pin 9 to the servo object
MyARM.write(arm_Up);
stepper.setCurrentPosition(MaxDistance);
Serial.begin(9600);
delay(1000);
}
void loop()
{
switch (State)
{
case 0: // เคลื่อนเข้า home มอเตอร์แกนนอน มอเตอร์1
// อ่านค่าสวิตช์ Home
buttonState = digitalRead(HomeSW);
if (buttonState == HIGH) //ยังไม่ชนสวิตช์
{
stepper.setSpeed(-500); //ให้เคลื่อนที่ต่อไป
stepper.runSpeed();
MyARM.write(arm_Up);//ยกแขน90องศา
MyGripper.write(Gripper_OFF);//ปล่อยมือ
}
else //ชนสวิตช์3
{
stepper.stop();// ให้หยุดมอเตอร์
stepper.setCurrentPosition(0);// เคลืยร์ค่าเป็น 0 นี่คือตำแหน่ง Home
stepper.moveTo(MaxDistance); // จากนั้นเคลื่อนที่ไปยังตำแหน่งไกลสุด เพื่อรอจับขวด
stepper.setMaxSpeed(1200);
stepper.setAcceleration(1200);
State = 10;
delay(300);
buttonState = digitalRead(HomeSW);
if (buttonState == HIGH)
{
State = 0;// home again
}
else
{
State = 10;
}
}
break;
case 10: //เคลื่อนไปจนสุด ที่ตำแหน่ง MaxDistance
{
if (stepper.distanceToGo() == 0)//เช็คว่าระยะทางที่เหลือเป็น 0 แล้วหรือยัง
{
stepper.moveTo(-stepper.currentPosition());
State = 15;
}
stepper.run(); //รอให้แขนเคลื่อนมาตำแหน่งที่ต้องการแล้วจึงเปลี่ยนเป็น state ถัดไป
}
break;
case 15: // เช็คเซนเซอร์ตำแหน่งขวด ว่ามีหรือไม่
{
SensorA6 = analogRead(A6);
if (SensorA6 < 200)
{
State = 16;
Serial.print("\t SensorA6 = ");
Serial.println(SensorA6);
}
}
break;
case 16: // หน่วงเวลา
{
delay(1000);
State = 20;
}
break;
case 20: // วางแขนลง แล้วจับของ
{
//ค่อยๆ วางแขน
for (pos = arm_Up; pos >= arm_Down; pos -= 1)
{ // goes from 0 degrees to 180 degrees
// in steps of 1 degree
MyARM.write(pos); // tell servo to go to position in variable 'pos'
delay(SetSpeedArm); // waits 15ms for the servo to reach the position
}
State = 21;
}
break;
case 21: // หน่วงเวลา
{
delay(1000);
State = 22;
}
break;
case 22: // จับของ
{
MyGripper.write(Gripper_ON);//มือจับ
State = 23;
}
break;
case 23: // หน่วงเวลา
{
delay(1000);
State = 24;
}
break;
case 24: // ยกแขนขึ้น
{
//ค่อยๆ ยกแขน90องศา
for (pos = arm_Down; pos <= arm_Up; pos += 1)
{ // goes from 0 degrees to 180 degrees
// in steps of 1 degree
MyARM.write(pos); // tell servo to go to position in variable 'pos'
delay(SetSpeedArm); // waits 15ms for the servo to reach the position
}
State = 25;
}
break;
case 25: // หน่วงเวลา
{
delay(500);
State = 30;
}
break;
case 30: // เคลื่อนเข้า home แกนตั้ง มอเตอร์3
{
stepper.moveTo(200); //ตำแหน่งที่ห่างจากตำแหน่ง Home = 200 (ตำแหน่งที่มีลิมิตสวิตช์ =0)
stepper.setMaxSpeed(1200);
stepper.setAcceleration(1200);
State = 31;
}
break;
case 31: // เคลื่อนเข้า home แกนตั้ง มอเตอร์3
{
if (stepper.distanceToGo() == 0)
{
stepper.moveTo(-stepper.currentPosition());
State = 40;
}
stepper.run();
}
break;
case 40: // วางแขนลง
{
//ค่อยๆ วางแขน
for (pos = arm_Up; pos >= arm_Down; pos -= 1)
{ // goes from 0 degrees to 180 degrees
// in steps of 1 degree
MyARM.write(pos); // tell servo to go to position in variable 'pos'
delay(SetSpeedArm); // waits 15ms for the servo to reach the position
}
State = 45;
}
break;
case 45: // หน่วงเวลา
{
delay(1000);
State = 46;
}
break;
case 46: // ปล่อยมือ
{
MyGripper.write(Gripper_OFF);//มือปล่อย
State = 47;
}
break;
case 47: // หน่วงเวลา
{
delay(1000);
State = 48;
}
break;
case 48: // ปล่อยมือ
{
//ค่อยๆ ยกแขน90องศา
for (pos = arm_Down; pos <= arm_Up; pos += 1)
{ // goes from 0 degrees to 180 degrees
// in steps of 1 degree
MyARM.write(pos); // tell servo to go to position in variable 'pos'
delay(SetSpeedArm); // waits 15ms for the servo to reach the position
}
State = 49;
}
break;
case 49: // หน่วงเวลา
{
delay(1000);
State = 50;
}
break;
case 50:
{
stepper.moveTo(MaxDistance);
stepper.setMaxSpeed(1200);
stepper.setAcceleration(1200);
State = 10;
}
}
}
Wiring
https://oshwlab.com/s2insupply/2200-linear-slide-mechanical-arm-v2






รีวิว
ยังไม่มีบทวิจารณ์