ทำแขนกล Robot ARM ด้วย Arduino แถมยังบันทึกตำแหน่งแบบง่ายๆ

กำลังจะทำครับ 555

อยากทำครับ แต่คงต้องศึกษาอีกนาน ถ้าแอดทำเสร็จเอามาสอนเป็นวิทยาทานด้วยครับ

กำลังจะซื้อสามดีปริ้นมาเพื่อการนี้เลยครับ เดียวได้แนวทางจะเอามาทำเป็นพาสๆ ลงให้ มีอุปกรณ์ขายให้ครบเลย ครับ

1 Likes

ช่วงนี้จะหายหน้าหายตาไปสักนิด ติดโปรเจคอื่นอยู่นะครับ 555

ทำตัวใหญ่ ใช้stepper moterเหมือนฝรั่งทำนะครับ อยากเห็น

ถามตั้งในกระเป๋าผมสักนิดนะคร้าาาพ 555

ของจริงระบบเทพมาก

พัฒนาถึงไหนกันแล้ว น่าจะปรับปรุงแบบแขนกลให้สวยกว่านี้และแข็งแรงมีพลัง

มีพลังอย่างเดียวไม่ได้ต้องมีตังด้วยครับ 555

เครื่องปริ้น3D ราคาไม่ถึงหมื่นแต่ความสามารถไม่มีข้อมูลมีใครเคยใช้บ้าง เอามาทำชิ้นส่วนแขนกลได้ง่ายเลย ราคาคงถูกลงเรื่อยๆเหมือนปริ้นเตอร์สีออกมาใหม่ๆแพงมาก

พบกันเร็วๆ นี้ครับ อิอิ

ตอนนี้กำลังทดสอบการทำงานของแขนกลใช้โค้ดตามที่มีให้แต่ต้องปรับค่าต่างๆให้เหมาะกับเซอร์โวที่ใช้ครับ
แขนรุ่นนี้ยังมีแต่โครงกระดูกไม่มีเสื้อใส่ให้สวยงาม
มีความรู้เรื่องโค้ดแนะนำด้วยครับ
จะถ่ายวีดีโอดูการทำงาน

 /*  Arduino Robotic Arm with Grab
 *  More info: http://www.ardumotive.com/
 *  arduino pro mini 328 broad 
 *  Dev: Michalis Vasilakis Data: 12/12/2016 Ver: 1.1 */

#include <Servo.h>

//Create servo objects to control servo motors
Servo up_down;  //servo3
Servo forward_backward;//servo6
Servo rotate;//servo2
Servo grab;//servo1

//เพิ่มเซอร์โว4,5
Servo up_down4;//servo4
Servo up_down5;//servo5

//Constants
const int startBT = 7;
const int teachBT = 8;

//2562-09-06 const int buzzer = 9;
const int buzzer;
 
const int potForwardBackward = A3;//servo6
const int potUpDown = A2;//servo3
const int potRotate = A1;//server2
const int potGrab = A0;//เซอร์โว1

//เพิ่มเซอร์โว2ตัว
const int potUpDown4 = A4;//เซอร์โว4
const int potUpDown5 = A5;//เซอร์โว5

//Max and Min values for servos ! Change them to meet your setup !
const int minGrab=180;
const int maxGrab=126;
const int minRotate=0;
const int maxRotate=100;
const int minUpDown=5;
const int maxUpDown=100;
const int minForwardBackward=160;

//const int maxForwardBackward=80;
  const int maxForwardBackward=20;//25620911ทำให้องศาการหมุนเซอร์โวเพิ่มจาก90เป็น180องศาโดยประมาณ

//เพิ่มเซอร์โว4,5
const int minUpDown4=5;
const int maxUpDown4=100;
const int minUpDown5=5;
const int maxUpDown5=100;
//
  
//-------------------------------------//
//Variables ประกาศตัวแปร
int readUpDown,readForwardBackward,readRotate,readGrab,readTeach,readStart,readUpDown4,readUpDown5;
int teachUpDown[100],teachForwardBackward[100],teachRotate[100],teachGrab[100],teachUpDown4[100],teachUpDown5[100];
boolean started =false;
int index = 1;

//int stepSpeed = 20; //Change this to fo faster!
int stepSpeed = 10;//25620910

void setup() {
  //Attach Servo motors
  forward_backward.attach(3);
  up_down.attach(4);
  rotate.attach(5); //portokali xontro
  grab.attach(6);
   
  //เพิ่มเซอร์โว4,5
  up_down4.attach(2);//servo4
  up_down5.attach(9);//servo5
   
  //Inputs-Outputs
  
  pinMode(teachBT, INPUT_PULLUP);//pin8
  pinMode(startBT, INPUT_PULLUP);//pin7
  pinMode(buzzer, OUTPUT);//no pin
  
  //Do a smooth movement on startup, from home potion to pot position:
  
  readInputs();
  goHome();
  goPot();
  Serial.begin(9600);
}

void loop() {
  if (!started){
readInputs();
moveServos();
if (readTeach==LOW){
  savePosition();
  tone(buzzer,500);
  delay(500);
  noTone(buzzer);
}
if (readStart==LOW){
  tone(buzzer,700);
  started=true;
  delay(1000);
  noTone(buzzer);
 }
}
  else{
goHome();
runTeach();
  }
}

void readInputs(){
  //Read potentiometers of servo1-servo6 อ่านค่าปัจจุบันของตัวต้านทานปรับค่าได้
  readUpDown = analogRead(potUpDown);//servo3

  Serial.print("potUpDown="); 
  Serial.println(potUpDown);
  //delay(1000);
  
  readUpDown = map(readUpDown,0,1023,minUpDown,maxUpDown);

  Serial.print("readUpDown="); 
  Serial.println(minUpDown);
  Serial.println(maxUpDown);
  //delay(1000); 
  
  readForwardBackward = analogRead(potForwardBackward);//servo6

  Serial.print("readForwardBackward="); 
  Serial.println(readForwardBackward);
  Serial.println(potForwardBackward);
  //delay(1000);
  
  readForwardBackward = map(readForwardBackward,0,1023,minForwardBackward,maxForwardBackward);
  
  Serial.print("readForwardBackward=");
  Serial.println(readForwardBackward); 
  Serial.println(minForwardBackward);
  Serial.println(maxForwardBackward);
  
  //delay(1000);
  
  
  readRotate = analogRead(potRotate);//servo2
  readRotate = map(readRotate,0,1023,minRotate,maxRotate);
  
  readGrab = analogRead(potGrab);//servo1
  readGrab = map(readGrab,0,1023,minGrab,maxGrab);
 
  //เพิ่มเซอร์โว4,5
  readUpDown4 = analogRead(potUpDown4);//servo4
  readUpDown4 = map(readUpDown4,0,1023,minUpDown4,maxUpDown4);
  
  readUpDown5 = analogRead(potUpDown5);//servo5
  readUpDown5 = map(readUpDown5,0,1023,minUpDown5,maxUpDown5);
  
  //Read buttons
  readTeach = digitalRead(teachBT);
  readStart = digitalRead(startBT);
  delay(50);
}
void moveServos(){
  up_down.write(readUpDown);
  forward_backward.write(readForwardBackward);
  rotate.write(readRotate);
  grab.write(readGrab);

  //เพิ่มเซอร์โว4,5
  up_down4.write(readUpDown4);  
  up_down5.write(readUpDown5);
}

void savePosition(){
  teachUpDown[index] = readUpDown;
  teachForwardBackward[index] = readForwardBackward;
  teachRotate[index] = readRotate;
  teachGrab[index] = readGrab;
  //เพิ่มเซอร์โว4,5
  teachUpDown4[index] = readUpDown4;
  teachUpDown5[index] = readUpDown5;
  
  index++;
}

void runTeach(){
  for (int i=0; i<index-1; i++)
  {
    
//servo2 Rotate
    
if (teachRotate[i] < teachRotate[i+1])
{
  for (int j = teachRotate[i]; j<= teachRotate[i+1]; j++)
  {
    rotate.write(j);
    delay(stepSpeed);
  }
}
else if (teachRotate[i] > teachRotate[i+1]){
  for (int j = teachRotate[i]; j>= teachRotate[i+1]; j--){
    rotate.write(j);
    delay(stepSpeed);
  }  
}
else{
  rotate.write(teachRotate[i]);
}

//servo1 Grab

if (teachGrab[i] < teachGrab[i+1]){
  for (int j = teachGrab[i]; j<= teachGrab[i+1]; j++){
    grab.write(j);
    delay(stepSpeed);
  }
}
else if (teachGrab[i] > teachGrab[i+1]){
  for (int j = teachGrab[i]; j>= teachGrab[i+1]; j--){
    grab.write(j);
    delay(stepSpeed);
  } 
}
else{
  grab.write(teachGrab[i]);
}

//servo6 ForwardBackward

if (teachForwardBackward[i] < teachForwardBackward[i+1]){
  for (int j = teachForwardBackward[i]; j<= teachForwardBackward[i+1]; j++){
    forward_backward.write(j);
    delay(stepSpeed);
  }
}
else if (teachForwardBackward[i] > teachForwardBackward[i+1]){
  for (int j = teachForwardBackward[i]; j>= teachForwardBackward[i+1]; j--){
    forward_backward.write(j);
    delay(stepSpeed);
  }
}
else{
  forward_backward.write(teachForwardBackward[i]);
}

//servo3 UpDown

if (teachUpDown[i] < teachUpDown[i+1]){
  for (int j = teachUpDown[i]; j<= teachUpDown[i+1]; j++){
    up_down.write(j);
    delay(stepSpeed);
  }
}
else if (teachUpDown[i] > teachUpDown[i+1]){
  for (int j = teachUpDown[i]; j>= teachUpDown[i+1]; j--){
    up_down.write(j);
    delay(stepSpeed);
  }
}
else{
  up_down.write(teachUpDown[i]);
}

//servo4 UpDown4

if (teachUpDown4[i] < teachUpDown4[i+1]){
  for (int j = teachUpDown4[i]; j<= teachUpDown4[i+1]; j++){
    up_down4.write(j);
    delay(stepSpeed);
  }
}
else if (teachUpDown4[i] > teachUpDown4[i+1]){
  for (int j = teachUpDown4[i]; j>= teachUpDown4[i+1]; j--){
    up_down4.write(j);
    delay(stepSpeed);
  }
}
else{
  up_down4.write(teachUpDown4[i]);
}

//servo5 UpDown5

if (teachUpDown5[i] < teachUpDown5[i+1]){
  for (int j = teachUpDown5[i]; j<= teachUpDown5[i+1]; j++){
    up_down5.write(j);
    delay(stepSpeed);
  }
}
else if (teachUpDown5[i] > teachUpDown5[i+1]){
  for (int j = teachUpDown5[i]; j>= teachUpDown5[i+1]; j--){
    up_down5.write(j);
    delay(stepSpeed);
  }
}
else{
  up_down5.write(teachUpDown5[i]);
}

  }  
  started=false;
}

//Change values if it's necessary...

void goHome()
{

//servo6 ForwardBackward 160-80

  if (readForwardBackward < 80){
  for (int j = readForwardBackward; j<=80; j++){
    forward_backward.write(j);
    delay(stepSpeed);
  }
}
else if (readForwardBackward > 80){
  for (int j = readForwardBackward; j>=80; j--){
    forward_backward.write(j);
    delay(stepSpeed);
  }
}
else{
  forward_backward.write(80);
  
}

//servo3 UpDown 5-100

if (readUpDown < 32){
  for (int j = readUpDown; j<=32; j++){
    up_down.write(j);
    delay(stepSpeed);
  }
}
else if (readUpDown > 32){
  for (int j = readUpDown; j>=32; j--){
    up_down.write(j);
    delay(stepSpeed);
  }
}
else{
  up_down.write(32);
}

//servo2 Rotate 0-100

if (readRotate < 0){
  for (int j = readRotate; j<=0; j++){
    rotate.write(j);
    delay(stepSpeed);
  }
}
else if (readRotate > 0){
  for (int j = readRotate; j>=0; j--){
    rotate.write(j);
    delay(stepSpeed);
  }
}
else{
  rotate.write(0);
}

//servo1 Grab 180-126

if (readGrab < 148){
  for (int j = readGrab; j<=148; j++){
    grab.write(j);
    delay(stepSpeed);
  }
}
else if (readGrab > 148){
  for (int j = readGrab; j>=148; j--){
    grab.write(j);
    delay(stepSpeed);
  }
}
else{
  grab.write(148);
}

//servo4 UpDown4 5-100

if (readUpDown4 < 32){
  for (int j = readUpDown4; j<=32; j++){
    up_down4.write(j);
    delay(stepSpeed);
  }
}
else if (readUpDown4 > 32){
  for (int j = readUpDown4; j>=32; j--){
    up_down4.write(j);
    delay(stepSpeed);
  }
}
else{
  up_down4.write(32);
}


//servo5 UpDown5 5-100

if (readUpDown5 < 32){
  for (int j = readUpDown5; j<=32; j++){
    up_down5.write(j);
    delay(stepSpeed);
  }
}
else if (readUpDown5 > 32){
  for (int j = readUpDown5; j>=32; j--){
    up_down5.write(j);
    delay(stepSpeed);
  }


//Always start from home position จุดเริ่มต้นไปตำแหน่งใหม่

teachForwardBackward[0]= 80;
teachUpDown[0]=32;

teachRotate[0]=0;

teachGrab[0]=148;

//เพิ่มเซอร์โว4,5
teachUpDown4[0]=32;
teachUpDown5[0]=32;

 }
}

//ไปยังตำแหน่งที่ต้องการ

void goPot(){

//servo2 Rotate
if (0 > readRotate){
  for (int j = 0; j>=readRotate; j--){
    rotate.write(j);
    delay(stepSpeed);
  }
}
else if (readRotate > 0){
  for (int j = 0; j<=readRotate; j++){
    rotate.write(j);
    delay(stepSpeed);
  }
}
else{
  rotate.write(readRotate);
}

//servo1 Grab 
if (readGrab > 148){
  for (int j = 148; j<=readGrab; j++){
    grab.write(j);
    delay(stepSpeed);
  }
}
else if (readGrab < 148){
  for (int j = 148; j>=readGrab; j--){
    grab.write(j);
    delay(stepSpeed);
  }
}
else{
  grab.write(readGrab);
}

//servo6 ForwardBackward  
if (80 > readForwardBackward){
  for (int j = 80; j>=readForwardBackward; j--){
    forward_backward.write(j);
    delay(stepSpeed);
  }
}
else if (80 < readForwardBackward){
  for (int j = 80; j<=readForwardBackward; j++){
    forward_backward.write(j);
    delay(stepSpeed);
  }
}
else{
  forward_backward.write(readForwardBackward);
}

//servo3 UpDown
if (32 > readUpDown){
  for (int j = 32; j>=readUpDown; j--){
    up_down.write(j);
    delay(stepSpeed);
  }
}
else if (readUpDown > 32){
  for (int j = 32; j<=readUpDown; j++){
    up_down.write(j);
    delay(stepSpeed);
  }
}
else{
  up_down.write(readUpDown);
}

//เพิ่มเซอร์โว4,5

//servo4 UpDown4

if (32 > readUpDown4){
  for (int j = 32; j>=readUpDown4; j--){
    up_down4.write(j);
    delay(stepSpeed);
  }
}
else if (readUpDown4 > 32){
  for (int j = 32; j<=readUpDown4; j++){
    up_down4.write(j);
    delay(stepSpeed);
    
    //25620910เพิ่มหน่วยเวลา
    delay(stepSpeed);
  }
}
else{
  up_down4.write(readUpDown4);
  
  //25620910เพิ่มหน่วยเวลา
  delay(stepSpeed);
    delay(stepSpeed);
}

//servo5 UpDown5
if (32 > readUpDown5){
  for (int j = 32; j>=readUpDown5; j--){
    up_down5.write(j);
    
    //25620910เพิ่มหน่วยเวลา
    delay(stepSpeed);
    delay(stepSpeed);
  }
}
else if (readUpDown5 > 32){
  for (int j = 32; j<=readUpDown5; j++){
    up_down5.write(j);
    
    //25620910เพิ่มหน่วยเวลา
    delay(stepSpeed);
  }
}
else{
  up_down5.write(readUpDown5);
  
  //25620910เพิ่มหน่วยเวลา
    delay(stepSpeed);
  
 }
}
1 Likes

1

สนใจครับ คิดถึงโทนี่ สตาร์ก ภาคแรก ประมาณวางของบนโต๊ะไม่เป็นที่ แล้วให้ Arm Robot เก็บให้เอง

รอชมครับ ติดปัญหาตรงไหน บอกได้เลยเดียวช่วยกัน แก้ ส่วนเนื้อหาตั้งกระทู้ใหม่เลย ก็ดีครับ จะได้ focus เนื้อหา รู้สึกกระทู้นี้ยาวละ 555


พรุ่งนี้จะถ่ายการเคลื่อนไหว
โค้ดใช้งานได้จริงครับแต่มีปัญหาหลังอับโหลดโค้ดจะมีการเคลื่อนไหวเองทันทีไม่สวยงามถ้าแก้ได้จะควบคุมให้สวยกว่านี้
2.เมื่อสอนการเคลื่อนที่ของแขนไปตำแหน่งที่ต้องการเมื่อกดให้แขนเริ่มทำงานจะมีการเคลื่อนของแขนเกินกว่าที่สอนใว้เสียเวลาและเคลื่อนที่เกินแนวที่กำหนดใช้งานจริงอาจจะชนได้
3.เซอร์โวส่งกำลังโดยตรงอายุใช้งานสั้นพังเร็วถ้ามีโครงแขนกลแข็งแรงส่งกำลังผ่านเฟือง ลิงค์ มีความแม่ยำ ราคาไม่เเพง แนะนำ ด้วยและการปรับแต่โค้ด
ต้นแบบ4ตัว ผมใช้6ตัวเพิ่มโค้ด 60กก3ตัว35กก3ตัว
User ใหม่ ระบบไม่ให้อับโหลดvdo พรุ่งนี้จะถ่ายและส่งทันทีอาจจะได้ครับ
รุ่น1ทดสอบการควบคุมใช้ขาบอร์ดA0-A5,2,3,4,5,6,7,8,9 เหลือขาA6-A7,10,11,12,13
รุ่น2จะแข็งแรงว่องไวกว่านี้
4.อยากให้สามารถเก็บค่าที่เราสอนใว้ได้เมื่อเปิดสวิทช์ให้ทำงานทันที
5.การเคลื่อนของแขนถ้ามีการสอนช้ำโดยไม่ปิดสวิทช์จะมีการบันทึกต่อจากข้อมูลเดิมทำให้แขนกลทำงานหลายรอบถ้าเพิ่มโค้ดรีเซตข้อมูลโดยไม่ปิดสวิทช์น่าจะดี
6. คำสั่ง Serial Moniter มีประโยชน์มาก มีเทคนิคการใช้งานแนะนำด้วยครับ
มีข้อมูลดีๆแนะนำด้วยครับ

1 Likes

ยกทั้งชุดนี้ ตั้งกระทู้ใหม่เลยครับ น่าจะดีเบตกันยาว วีดีโอตอนี้ยังไม่ได้เปิดให้อัพยาวๆ ครับ เพราะมันหนัก server เลยให้ใช้วิธี อัพลง youtube แล้วเอาลิ้งค์มาแปะ ดูได้เหมือนกันครับ

ได้ครับตั้งกระทู้ใหม่

พี่ครับ มีไลหรอเฟส ติดต่อมั้ยครับ ผมขอสอบถามเรื่องแขนกลได้ไหมครับ ผมไม่รู้ว่าต้องใช้อุปกรเสริมยังไงบ้าง

คือจะเสริมยังไงครับ

ออกความเห็นได้เลยครับ ผมจะได้หาแนวทางเริ่มพัฒนาต่อ