สารบัญ:

แขนหุ่นยนต์ที่เรียบง่ายและชาญฉลาดโดยใช้ Arduino !!!: 5 ขั้นตอน (พร้อมรูปภาพ)
แขนหุ่นยนต์ที่เรียบง่ายและชาญฉลาดโดยใช้ Arduino !!!: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: แขนหุ่นยนต์ที่เรียบง่ายและชาญฉลาดโดยใช้ Arduino !!!: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: แขนหุ่นยนต์ที่เรียบง่ายและชาญฉลาดโดยใช้ Arduino !!!: 5 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: เรียนรู้การควบคุม หุ่นยนต์แขนกล ด้วย Arduino 2024, พฤศจิกายน
Anonim
Image
Image
สิ่งที่คุณต้องการ
สิ่งที่คุณต้องการ

ในคำแนะนำนี้ ฉันจะสร้างแขนหุ่นยนต์แบบง่ายๆ ที่จะถูกควบคุมโดยใช้แขนหลัก แขนจะจำการเคลื่อนไหวและเล่นตามลำดับ แนวคิดนี้ไม่ใช่เรื่องใหม่ ฉันได้ไอเดียจาก "แขนหุ่นยนต์ขนาดเล็ก - โดย Stoerpeak" ฉันต้องการทำสิ่งนี้มาเป็นเวลานาน แต่ในตอนนั้น ฉันเพิ่งหัดเล่นและไม่มีความรู้เกี่ยวกับการเขียนโปรแกรมเลย ในที่สุด ตอนนี้ฉันกำลังสร้างมันขึ้นมา ทำให้มันง่าย ราคาถูก และแบ่งปันกับพวกคุณทุกคน

ดังนั้นเรามาเริ่มกันเลย….

ขั้นตอนที่ 1: สิ่งที่คุณต้องการ:-

สิ่งที่คุณต้องการ
สิ่งที่คุณต้องการ
สิ่งที่คุณต้องการ
สิ่งที่คุณต้องการ

นี่คือรายการของสิ่งที่คุณต้องการ:-

1. เซอร์โวมอเตอร์ x 5 ลิงค์สำหรับอเมริกา:- https://amzn.to/2OxbSH7Link สำหรับยุโรป:-

2. Potentiometers x 5 (ฉันใช้ไปแล้ว 100k.)Link for US:- https://amzn.to/2ROjhDMLink for Europe:-

3. Arduino UNO (คุณสามารถใช้ Arduino Nano ได้เช่นกัน) ลิงค์สำหรับสหรัฐอเมริกา:- https://amzn.to/2DBbENWLink สำหรับยุโรป:-

4. เขียงหั่นขนม (ฉันแนะนำชุดนี้)ลิงก์สำหรับสหรัฐอเมริกา:- https://amzn.to/2Dy86w4Link สำหรับยุโรป:-

5. แบตเตอรี่ (ไม่บังคับ ฉันใช้อะแดปเตอร์ 5v)

6. กระดาษแข็ง/ไม้/ซันบอร์ด/อะคริลิค ที่มีอยู่หรือหาง่าย

และคุณจะต้องติดตั้ง Arduino IDE ด้วย

ขั้นตอนที่ 2: การสร้างแขน:-

ทำแขน
ทำแขน
ทำแขน
ทำแขน

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

ฉันเพิ่งใช้เทปสองหน้าติดเซอร์โวกับแท่งไอติมแล้วขันให้แน่นด้วยสกรู

สำหรับแขนมาสเตอร์ ฉันติดโพเทนชิโอมิเตอร์กับแท่งไอติมและทำแขน

การอ้างถึงรูปภาพจะทำให้คุณมีความคิดที่ดีขึ้น

ฉันได้ติดตั้งทุกอย่างบนกระดานผ้าใบขนาด A4 ที่ใช้เป็นฐาน

ขั้นตอนที่ 3: การสร้างการเชื่อมต่อ:-

การเชื่อมต่อ
การเชื่อมต่อ
การเชื่อมต่อ
การเชื่อมต่อ
การเชื่อมต่อ
การเชื่อมต่อ

ในขั้นตอนนี้เราจะทำการเชื่อมต่อที่จำเป็นทั้งหมด โปรดดูรูปภาพด้านบน

  • ขั้นแรกให้เชื่อมต่อเซอร์โวทั้งหมดขนานกับแหล่งจ่ายไฟ (สายสีแดงถึง +ve และสายสีดำหรือสีน้ำตาลถึง Gnd)
  • ถัดไปเชื่อมต่อสายสัญญาณเช่นสายสีเหลืองหรือสีส้มกับขา PWM ของ Arduino
  • ตอนนี้เชื่อมต่อโพเทนชิโอมิเตอร์กับ +5v และ Gnd ของ Arduino แบบขนาน
  • เชื่อมต่อขั้วกลางกับขาอนาล็อกของ ardunio

ที่นี่ Digital Pins 3, 5, 6, 9 & 10 ใช้สำหรับควบคุมเซอร์โว

Analog Pins A0 ถึง A4 ใช้สำหรับอินพุตจากโพเทนชิโอมิเตอร์

เซอร์โวที่เชื่อมต่อกับพิน 3 จะถูกควบคุมโดยโพเทนชิออมิเตอร์ที่เชื่อมต่อกับ A0

เซอร์โวที่เชื่อมต่อกับพิน 5 จะถูกควบคุมโดย pot บน A1 และอื่นๆ….

หมายเหตุ: - แม้ว่าเซอร์โวจะไม่ได้ขับเคลื่อนโดย Arduino ตรวจสอบให้แน่ใจว่าได้เชื่อมต่อ Gnd ของเซอร์โวกับ Arduino ไม่เช่นนั้นแขนจะไม่ทำงาน

ขั้นตอนที่ 4: การเข้ารหัส:-

การเข้ารหัส
การเข้ารหัส

ลอจิกของรหัสนี้ค่อนข้างง่าย ค่าของโพเทนชิโอมิเตอร์จะถูกเก็บไว้ในอาร์เรย์ จากนั้นเรคคอร์ดจะถูกสำรวจโดยใช้ลูป for และเซอร์โวทำตามขั้นตอนตามค่า คุณสามารถตรวจสอบบทช่วยสอนนี้ที่ฉันใช้สำหรับการอ้างอิง "Arduino Potentiometer Servo Control & Memory"

รหัส:- (ดาวน์โหลดไฟล์แนบด้านล่าง)

ขั้นแรก เราจะประกาศตัวแปรที่จำเป็นทั้งหมดทั่วโลก เพื่อให้เราสามารถใช้งานได้ตลอดทั้งโปรแกรม ไม่จำเป็นต้องมีคำอธิบายพิเศษสำหรับสิ่งนี้

#รวม

//เซอร์โวอ็อบเจ็กต์ Servo Servo_0; เซอร์โวเซอร์โว_1; เซอร์โว เซอร์โว_2; เซอร์โว เซอร์โว_3; เซอร์โวเซอร์โว_4; //โพเทนชิออมิเตอร์วัตถุ int Pot_0; int Pot_1; int Pot_2; int หม้อ_3; int Pot_4; //ตัวแปรเก็บตำแหน่งเซอร์โว int Servo_0_Pos; int Servo_1_Pos; int Servo_2_Pos; int Servo_3_Pos; int Servo_4_Pos; //ตัวแปรเก็บค่าตำแหน่งก่อนหน้าใน Prev_0_Pos; int ก่อนหน้า_1_Pos; int Prev_2_Pos; int Prev_3_Pos; int Prev_4_Pos; //ตัวแปรเก็บค่าตำแหน่งปัจจุบันใน Current_0_Pos; int ปัจจุบัน_1_Pos; int Current_2_Pos; int Current_3_Pos; int Current_4_Pos; int Servo_Position; //เก็บมุมใน Servo_Number; //เก็บหมายเลขของการจัดเก็บ int ของเซอร์โว [600]; //อาร์เรย์เพื่อเก็บข้อมูล (การเพิ่มขนาดอาร์เรย์จะใช้หน่วยความจำมากขึ้น) int Index = 0; // ดัชนีอาร์เรย์เริ่มต้นจากตำแหน่งที่ 0 ข้อมูลถ่าน = 0; //ตัวแปรในการเก็บข้อมูลจากอินพุตแบบอนุกรม

ตอนนี้เราจะเขียนฟังก์ชันการตั้งค่าที่เราตั้งหมุดและหน้าที่ของมัน นี่คือฟังก์ชันหลักที่ดำเนินการก่อน

การตั้งค่าเป็นโมฆะ ()

{ Serial.begin(9600); //สำหรับการสื่อสารแบบอนุกรมระหว่าง Arduino และ IDE // วัตถุเซอร์โวถูกแนบกับหมุด PWM Servo_0.แนบ(3); Servo_1.แนบ(5); Servo_2.แนบ(6); Servo_3.attach(9); Servo_4.attach(10); // เซอร์โวถูกตั้งค่าเป็น 100 ตำแหน่งเมื่อเริ่มต้น Servo_0.write(100); Servo_1.write(100); Servo_2.write(100); Servo_3.write(100); Servo_4.write(100); Serial.println ("กด 'R' เพื่อบันทึกและ 'P' เพื่อเล่น"); }

ตอนนี้ เราต้องอ่านค่าของโพเทนชิโอมิเตอร์โดยใช้พินอินพุตแบบอะนาล็อกและแมปพวกมันเพื่อควบคุมเซอร์โว สำหรับสิ่งนี้ เราจะกำหนดฟังก์ชันและตั้งชื่อมันว่า Map_Pot(); คุณสามารถตั้งชื่ออะไรก็ได้ที่คุณต้องการให้เป็นฟังก์ชันที่ผู้ใช้กำหนด

เป็นโมฆะ Map_Pot()

{ /* เซอร์โวหมุนที่ 180 องศา แต่การใช้มันเพื่อจำกัดไม่ใช่ความคิดที่ดี เพราะจะทำให้เซอร์โวส่งเสียงดังอย่างต่อเนื่อง ซึ่งน่ารำคาญ เราจึงจำกัดเซอร์โวให้เคลื่อนที่ระหว่าง: 1-179 */ Pot_0 = analogRead(A0); // อ่านอินพุตจาก pot และเก็บไว้ใน Variable Pot_0 Servo_0_Pos = แผนที่ (Pot_0, 0, 1023, 1, 179); //แมปเซอร์โวตามค่าระหว่าง 0 ถึง 1023 Servo_0.write(Servo_0_Pos); // ย้ายเซอร์โวไปที่ตำแหน่งนั้น Pot_1 = analogRead (A1); Servo_1_Pos = แผนที่ (Pot_1, 0, 1023, 1, 179); Servo_1.write(Servo_1_Pos); Pot_2 = analogRead (A2); Servo_2_Pos = แผนที่ (Pot_2, 0, 1023, 1, 179); Servo_2.write(Servo_2_Pos); Pot_3 = analogRead (A3); Servo_3_Pos = แผนที่ (Pot_3, 0, 1023, 1, 179); Servo_3.write(Servo_3_Pos); Pot_4 = analogRead (A4); Servo_4_Pos = แผนที่ (Pot_4, 0, 1023, 1, 179); Servo_4.write(Servo_4_Pos); }

ตอนนี้เราจะเขียนฟังก์ชันลูป:

วงเป็นโมฆะ ()

{ Map_Pot(); // เรียกใช้ฟังก์ชันเพื่ออ่านค่า pot ขณะที่ (Serial.available () > 0) { data = Serial.read (); if (data == 'R') Serial.println("การบันทึกการเคลื่อนไหว…"); if (data == 'P') Serial.println("กำลังเล่นการเคลื่อนไหวที่บันทึกไว้…"); } if (data == 'R') // ถ้าป้อน 'R' ให้เริ่มบันทึก {//เก็บค่าในตัวแปร Prev_0_Pos = Servo_0_Pos; ก่อนหน้า_1_Pos = Servo_1_Pos; Prev_2_Pos = Servo_2_Pos; Prev_3_Pos = Servo_3_Pos; Prev_4_Pos = Servo_4_Pos; Map_Pot(); // ฟังก์ชั่นแผนที่ถูกเรียกคืนสำหรับการเปรียบเทียบหาก (abs(Prev_0_Pos == Servo_0_Pos)) // ค่าสัมบูรณ์ได้มาจากการเปรียบเทียบ { Servo_0.write(Servo_0_Pos); // หากค่าที่ตรงกับเซอร์โวจะถูกเปลี่ยนตำแหน่งหาก (Current_0_Pos != Servo_0_Pos) // หากค่าไม่ตรงกัน { Storage[Index] = Servo_0_Pos + 0; // ค่าถูกเพิ่มในอาร์เรย์ Index++; // ค่าดัชนีเพิ่มขึ้น 1 } Current_0_Pos = Servo_0_Pos; } /* ในทำนองเดียวกัน การเปรียบเทียบค่าจะทำกับเซอร์โวทั้งหมด +100 จะถูกเพิ่มทุกๆ รายการเป็นค่าส่วนต่าง */ ถ้า (abs (Prev_1_Pos == Servo_1_Pos)) { Servo_1.write (Servo_1_Pos); ถ้า (Current_1_Pos != Servo_1_Pos) { ที่เก็บข้อมูล [ดัชนี] = Servo_1_Pos + 100; ดัชนี++; } Current_1_Pos = Servo_1_Pos; } ถ้า (abs (Prev_2_Pos == Servo_2_Pos)) { Servo_2.write (Servo_2_Pos); ถ้า (Current_2_Pos != Servo_2_Pos) { ที่เก็บข้อมูล [ดัชนี] = Servo_2_Pos + 200; ดัชนี++; } Current_2_Pos = Servo_2_Pos; } ถ้า (abs (Prev_3_Pos == Servo_3_Pos)) { Servo_3.write (Servo_3_Pos); ถ้า (Current_3_Pos != Servo_3_Pos) { ที่เก็บข้อมูล [ดัชนี] = Servo_3_Pos + 300; ดัชนี++; } Current_3_Pos = Servo_3_Pos; } ถ้า (abs (Prev_4_Pos == Servo_4_Pos)) { Servo_4.write (Servo_4_Pos); ถ้า (Current_4_Pos != Servo_4_Pos) { ที่เก็บข้อมูล [ดัชนี] = Servo_4_Pos + 400; ดัชนี++; } Current_4_Pos = Servo_4_Pos; } /* ค่าถูกพิมพ์บนมอนิเตอร์แบบอนุกรม '\t' ใช้สำหรับแสดงค่าในรูปแบบตาราง */ Serial.print(Servo_0_Pos); Serial.print(" \t "); Serial.print(Servo_1_Pos); Serial.print(" \t "); Serial.print(Servo_2_Pos); Serial.print(" \t "); Serial.print(Servo_3_Pos); Serial.print(" \t "); Serial.println(Servo_4_Pos); Serial.print ("ดัชนี = "); Serial.println (ดัชนี); ล่าช้า (50); } if (data == 'P') // IF 'P' ถูกป้อน ให้เริ่มเล่นการเคลื่อนไหวที่บันทึกไว้ { สำหรับ (int i = 0; i < Index; i ++) // สำรวจอาร์เรย์โดยใช้ for loop { Servo_Number = Storage / 100; // ค้นหาจำนวนเซอร์โว Servo_Position = Storage % 100; // ค้นหาตำแหน่งของสวิตช์เซอร์โว (Servo_Number) { กรณี 0: Servo_0.write (Servo_Position); หยุดพัก; กรณีที่ 1: Servo_1.write (Servo_Position); หยุดพัก; กรณีที่ 2: Servo_2.write (Servo_Position); หยุดพัก; กรณีที่ 3: Servo_3.write (Servo_Position); หยุดพัก; กรณีที่ 4: Servo_4.write (Servo_Position); หยุดพัก; } ล่าช้า (50); } } }

เมื่อรหัสพร้อมแล้ว ให้อัปโหลดไปยังบอร์ด Arduino

สมาร์ทอาร์มพร้อมทำงาน ฟังก์ชั่นยังไม่ราบรื่นเหมือนที่ทำโดย Stoerpeak

หากคุณสามารถทำให้โค้ดดีขึ้นหรือมีข้อเสนอแนะใดๆ ให้ฉัน โปรดแจ้งให้เราทราบในส่วนความคิดเห็น

จากที่กล่าวไปแล้ว เรามาทดสอบกันต่อ….

ขั้นตอนที่ 5: การทดสอบ:-

หลังจากอัปโหลดรหัสไปยังบอร์ดเรียบร้อยแล้ว เปิด 'Serial Monitor' คุณจะพบได้ในตัวเลือกเครื่องมือ เมื่อมอนิเตอร์แบบอนุกรมเริ่มทำงาน Arduino จะรีเซ็ต ตอนนี้คุณสามารถควบคุมแขนหุ่นยนต์โดยใช้แขนหลักได้ แต่ไม่มีอะไรถูกบันทึกไว้

ในการเริ่มบันทึก ให้ป้อน 'R' ในจอภาพ ตอนนี้คุณสามารถทำการเคลื่อนไหวที่คุณต้องการบันทึกได้

หลังจากย้ายเสร็จแล้วคุณต้องป้อน 'P' เพื่อเล่นการเคลื่อนไหวที่บันทึกไว้ เซอร์โวจะทำการเคลื่อนไหวต่อไปตราบเท่าที่บอร์ดไม่ได้ถูกรีเซ็ต

แนะนำ: