- ส่วนประกอบที่จำเป็น
- เตรียม Robotic ARM ที่พิมพ์ 3 มิติให้พร้อม
- แผนภูมิวงจรรวม
- ขั้นตอนที่เกี่ยวข้องในการเขียนโปรแกรม LPC2148 สำหรับแขนหุ่นยนต์
- คำอธิบายการเข้ารหัส
- การเลือกเซอร์โวมอเตอร์เพื่อหมุนโดยใช้ปุ่มกด
- การทำงานของแขนหุ่นยนต์ Pick and Place
Robotic Arms เป็นหนึ่งในการสร้างสรรค์ทางวิศวกรรมที่น่าสนใจและเป็นเรื่องที่น่าสนใจเสมอที่จะดูสิ่งเหล่านี้เอียงและแพนเพื่อทำสิ่งที่ซับซ้อนเช่นเดียวกับแขนมนุษย์ แขนหุ่นยนต์เหล่านี้สามารถพบได้ทั่วไปในอุตสาหกรรมที่สายการประกอบซึ่งทำงานเชิงกลที่รุนแรงเช่นการเชื่อมการเจาะการทาสีเป็นต้นแขนหุ่นยนต์ขั้นสูงที่เพิ่งมีความแม่นยำสูงยังได้รับการพัฒนาเพื่อดำเนินการผ่าตัดที่ซับซ้อน ดังนั้นในบทช่วยสอนนี้เรามาสร้างแขนหุ่นยนต์แบบง่ายๆโดยใช้ไมโครคอนโทรลเลอร์ ARM7-LPC2148สำหรับการหยิบและวางวัตถุโดยการควบคุมโพเทนชิโอมิเตอร์ด้วยตนเอง
ในการกวดวิชานี้เราจะใช้ 3D พิมพ์แขนหุ่นยนต์ที่ถูกสร้างขึ้นโดยทำตามขั้นตอนในthingiverseARM ใช้เซอร์โวมอเตอร์ 4 ตัวสำหรับการเคลื่อนที่ของแขนหุ่นยนต์ หากคุณไม่มีเครื่องพิมพ์คุณสามารถสร้างแขนของคุณด้วยกระดาษแข็งแบบง่ายๆเช่นที่เราสร้างขึ้นสำหรับโครงการ Arduino Robotic Arm ของเรา สำหรับแรงบันดาลใจคุณสามารถอ้างถึง Record and Play Robotic Arm ที่เราสร้างขึ้นก่อนหน้านี้โดยใช้ Arduino
ตอนนี้เรามาเตรียมของให้พร้อมสำหรับโครงการของเรา
ส่วนประกอบที่จำเป็น
- เครื่องพิมพ์ 3D แขนหุ่นยนต์
- ARM7-LPC2148
- เซอร์โวมอเตอร์ SG-90 (4)
- โพเทนชิออมิเตอร์ 10k (4)
- ปุ่มกด (4)
- ไฟ LED (4)
- อะแดปเตอร์ไฟ DC 5V (1A)
- ตัวต้านทาน (10k (4), 2.2k (4))
- เขียงหั่นขนม
- การเชื่อมต่อสายไฟ
เตรียม Robotic ARM ที่พิมพ์ 3 มิติให้พร้อม
แขนหุ่นยนต์พิมพ์ 3 มิติที่ใช้ในบทช่วยสอนนี้สร้างขึ้นโดยทำตามการออกแบบที่กำหนดโดยEEZYbotARMซึ่งมีอยู่ใน Thingiverse ขั้นตอนที่สมบูรณ์ในการสร้างแขนหุ่นยนต์พิมพ์ 3 มิติและรายละเอียดการประกอบพร้อมวิดีโอมีอยู่ในลิงค์ thingiverse ซึ่งแชร์ไว้ด้านบน
นี่คือภาพแขนหุ่นยนต์ที่พิมพ์ 3 มิติของฉันหลังจากประกอบกับเซอร์โวมอเตอร์ 4 ตัว
แผนภูมิวงจรรวม
ภาพต่อไปนี้แสดงการเชื่อมต่อวงจรของแขนหุ่นยนต์ที่ใช้ ARM
การเชื่อมต่อวงจรสำหรับโครงการทำได้ง่าย ตรวจสอบให้แน่ใจว่าได้จ่ายไฟให้เซอร์โวมอเตอร์ด้วยอะแดปเตอร์ไฟ DC 5V แยกต่างหาก สำหรับโพเทนชิโอมิเตอร์และปุ่มกดเราสามารถใช้ 3.3V จากไมโครคอนโทรลเลอร์ LPC2148
ที่นี่เรากำลังใช้พิน ADC 4 ตัวของ LPC2148 พร้อมโพเทนชิโอมิเตอร์ 4 ตัว และยังมีหมุด PWM 4 ตัวของ LPC2148 ที่เชื่อมต่อกับหมุด PWM ของเซอร์โวมอเตอร์ เราได้เชื่อมต่อปุ่มกด 4 ปุ่มเพื่อเลือกมอเตอร์ที่จะทำงาน ดังนั้นหลังจากกดปุ่มโพเทนชิออมิเตอร์ที่ได้รับการยอมรับจะมีการเปลี่ยนแปลงตำแหน่งของเซอร์โวมอเตอร์
ปุ่มกดปลายด้านหนึ่งที่เชื่อมต่อกับ GPIO ของ LPC2148 จะดึงลงผ่านตัวต้านทาน 10k และปลายอีกด้านหนึ่งเชื่อมต่อด้วย 3.3V นอกจากนี้ยังเชื่อมต่อ LED 4 ดวงเพื่อระบุว่าเซอร์โวมอเตอร์ใดถูกเลือกเพื่อเปลี่ยนตำแหน่ง
การเชื่อมต่อวงจรระหว่าง 4 Servo Motor และ LPC2148:
LPC2148 | เซอร์โวมอเตอร์ |
P0.1 | SERVO1 (PWM- สีส้ม) |
P0.7 | SERVO2 (PWM- สีส้ม) |
P0.8 | SERVO3 (PWM- สีส้ม) |
P0.21 | SERVO4 (PWM- สีส้ม) |
การเชื่อมต่อวงจรระหว่าง 4 โพเทนชิออมิเตอร์และ LPC2148:
LPC2148 | โพเทนชิออมิเตอร์เซ็นเตอร์พิน ซ้าย - 0V GND ของ LPC2148 พินขวา - 3.3V ของ LPC2148 |
P0.25 | โพเทนชิออมิเตอร์ 1 |
P0.28 | โพเทนชิออมิเตอร์ 2 |
P0.29 | โพเทนชิออมิเตอร์ 3 |
P0.30 น | โพเทนชิออมิเตอร์ 4 |
การเชื่อมต่อวงจรของ LED 4 ดวงกับ LPC2148:
LPC2148 | แอโนด LED (แคโทดของ LED ทั้งหมดคือ GND) |
P1.28 | LED1 (แอโนด) |
P1.29 | LED2 (แอโนด) |
P1.30 น | LED3 (ขั้วบวก) |
P1.31 | LED4 (แอโนด) |
การเชื่อมต่อวงจรของปุ่มกด 4 ปุ่มพร้อม LPC2148:
LPC2148 | ปุ่มกด (พร้อมตัวต้านทานแบบดึงลง 10k) |
P1.17 | ปุ่มกด 1 |
หน้า 1.18 | ปุ่มกด 2 |
P1.19 | ปุ่มกด 3 |
P1.20 | ปุ่มกด 4 |
ขั้นตอนที่เกี่ยวข้องในการเขียนโปรแกรม LPC2148 สำหรับแขนหุ่นยนต์
ก่อนที่จะเขียนโปรแกรมสำหรับ Robotic Arm นี้เราจำเป็นต้องรู้เกี่ยวกับการสร้าง PWM ใน LPC2148 และการใช้ ADC ใน ARM7-LPC2148 สำหรับสิ่งนั้นให้อ้างอิงโครงการก่อนหน้าของเราเกี่ยวกับ Interfacing Servo motor กับ LPC2148 และวิธีใช้ ADC ใน LPC2148
การแปลง ADC โดยใช้ LPC2148
เนื่องจากเราจำเป็นต้องระบุค่า ADC สำหรับการตั้งค่ารอบการทำงานสำหรับการสร้างเอาต์พุต PWM สำหรับควบคุมตำแหน่งเซอร์โวมอเตอร์ เราต้องหาค่า ADC ของโพเทนชิออมิเตอร์ เนื่องจากเรามีโพเทนชิโอมิเตอร์สี่ตัวสำหรับควบคุมเซอร์โวมอเตอร์สี่ตัวเราจึงต้องการช่อง ADC 4 ช่องของ LPC2148 ในบทช่วยสอนนี้เรากำลังใช้หมุด ADC (P0.25, P0.28, P0.29, P0.30) ของช่อง ADC ที่ 4,1,2,3 ตามลำดับใน LPC2148
การสร้างสัญญาณ PWM สำหรับเซอร์โวมอเตอร์โดยใช้ LPC2148
เนื่องจากเราจำเป็นต้องสร้างสัญญาณ PWM เพื่อควบคุมตำแหน่งเซอร์โวมอเตอร์ เราจำเป็นต้องกำหนดรอบการทำงานของ PWM เรามีเซอร์โวมอเตอร์สี่ตัวที่เชื่อมต่อกับแขนหุ่นยนต์ดังนั้นเราจึงต้องการ 4 ช่องสัญญาณ PWM ของ LPC2148 ในบทช่วยสอนนี้เรากำลังใช้หมุด PWM (P0.1, P0.7, P0.8, P0.21) ของช่องสัญญาณ PWM ที่ 3,2,4,5 ตามลำดับใน LPC2148
การเขียนโปรแกรมและการกระพริบไฟล์ Hex เป็น LPC2148
ในการเขียนโปรแกรม ARM7-LPC2148 เราจำเป็นต้องใช้keil uVision & เพื่อแฟลชโค้ด HEXเป็นเครื่องมือ LPC2148 Flash Magic สาย USB ใช้ที่นี่เพื่อตั้งโปรแกรมARM7 Stickผ่านพอร์ต micro USB เราเขียนโค้ดโดยใช้ Keil และสร้างไฟล์ฐานสิบหกแล้วไฟล์ HEX เป็นประกายไป ARM7 ติดโดยใช้แฟลชเมจิกหากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้ง keil uVision และ Flash Magic และวิธีการใช้งานให้ไปที่ลิงค์เริ่มต้นใช้งานไมโครคอนโทรลเลอร์ ARM7 LPC2148 และตั้งโปรแกรมโดยใช้ Keil uVision
คำอธิบายการเข้ารหัส
โปรแกรมที่สมบูรณ์ สำหรับโครงการแขนหุ่นยนต์นี้มีให้ในตอนท้ายของบทช่วยสอน ตอนนี้เรามาดูการเขียนโปรแกรมโดยละเอียด
การกำหนดค่า PORT ของ LPC2148 สำหรับการใช้ GPIO, PWM และ ADC:
การใช้การลงทะเบียน PINSEL1 เพื่อเปิดใช้งานช่อง ADC - ADC0.4, ADC0.1, ADC0.2, ADC0.3 สำหรับพิน P0.25, P0.28, P0.29, P0.30 และสำหรับ PWM5 สำหรับพิน P0.21 (1 << 10)
#define AD04 (1 << 18) // เลือกฟังก์ชัน AD0.4 สำหรับ P0.25 #define AD01 (1 << 24) // เลือกฟังก์ชัน AD0.1 สำหรับ P0.28 #define AD02 (1 << 26) / / เลือกฟังก์ชัน AD0.2 สำหรับ P0.29 #define AD03 (1 << 28) // เลือกฟังก์ชัน AD0.3 สำหรับ P0.30 PINSEL1 - = AD04 - AD01 - AD02 - AD03 - (1 << 10);
การใช้การลงทะเบียน PINSEL0 เพื่อเปิดใช้งานช่อง PWM PWM3, PWM2, PWM4 สำหรับพิน P0.1, P0.7, P0.8 ของ LPC2148
PINSEL0 = 0x000A800A;
การใช้การลงทะเบียน PINSEL2 เพื่อเปิดใช้งานฟังก์ชันพิน GPIO สำหรับพินทั้งหมดใน PORT1 ที่ใช้สำหรับการเชื่อมต่อ LED และปุ่มกด
PINSEL2 = 0x00000000;
ในการทำให้พิน LED เป็นพินเอาต์พุตและพินปุ่มกดตามที่ใช้การลงทะเบียน IODIR1 (0 สำหรับ INPUT & 1 สำหรับ OUTPUT)
IODIR1 = ((0 << 17) - (0 << 18) - (0 << 19) - (0 << 20) - (1 << 28) - (1 << 29) - (1 << 30) - (1 << 31));
ในขณะที่หมายเลขพินถูกกำหนดเป็น
#define SwitchPinNumber1 17 // (เชื่อมต่อกับ P1.17) #define SwitchPinNumber2 18 // (เชื่อมต่อกับ P1.18) #define SwitchPinNumber3 19 // (เชื่อมต่อกับ P1.19) #define SwitchPinNumber4 20 // (เชื่อมต่อกับ P1. 20) #define LedPinNumber1 28 // (เชื่อมต่อกับ P1.28) #define LedPinNumber2 29 // (เชื่อมต่อกับ P1.29) #define LedPinNumber3 30 // (เชื่อมต่อกับ P1.30) #define LedPinNumber4 31 // (เชื่อมต่อกับ P1.31)
การกำหนดค่าการตั้งค่าการแปลง ADC
ถัดจากโหมดการแปลง ADC และนาฬิกาสำหรับ ADC ถูกตั้งค่าโดยใช้การลงทะเบียน AD0CR_setup
AD0CR_setup ยาวที่ไม่ได้ลงนาม = (CLKDIV << 8) - BURST_MODE_OFF - PowerUP; // การตั้งค่าโหมด ADC
ในขณะที่ CLCKDIV โหมดถ่ายต่อเนื่องและ PowerUP ถูกกำหนดเป็น
#define CLKDIV (15-1) #define BURST_MODE_OFF (0 << 16) // 1 สำหรับเปิดและ 0 สำหรับปิด #define PowerUP (1 << 21)
การตั้งค่านาฬิกาสำหรับการแปลง ADC (CLKDIV)
ใช้ในการผลิตนาฬิกาสำหรับ ADC นาฬิกา ADC 4Mhz (ADC_CLOCK = PCLK / CLKDIV) โดยที่ "CLKDIV-1" ถูกใช้จริงในกรณีของเรา PCLK = 60mhz
Burst Mode (Bit-16):บิตนี้ใช้สำหรับการแปลง BURST หากตั้งค่าบิตนี้โมดูล ADC จะทำการแปลงสำหรับช่องทั้งหมดที่เลือก (SET) เป็นบิต SEL การตั้งค่า 0 ในบิตนี้จะปิดใช้งานการแปลง BURST
โหมดปิดเครื่อง (Bit-21):ใช้สำหรับเปิดหรือปิด ADC การตั้งค่า (1) ในบิตนี้จะทำให้ ADC ออกจากโหมดปิดเครื่องและทำให้ทำงานได้ การล้างบิตนี้จะปิด ADC
การกำหนดค่าการตั้งค่าการแปลง PWM
ขั้นแรกให้รีเซ็ตและปิดใช้งานตัวนับสำหรับ PWM โดยใช้การลงทะเบียน PWMTCR และตั้งค่า PWM Timer Prescale Register ด้วยค่า prescaler
PWMTCR = 0x02; PWMPR = 0x1D;
ถัดไปตั้งจำนวนสูงสุดของการนับในหนึ่งรอบ ทำได้ใน Match Register 0 (PWMMR0) เนื่องจากเรามี 20000 เนื่องจากเป็นคลื่น PWM 20msecs
PWMMR0 = 20000;
หลังจากนั้นตั้งค่าสำหรับรอบการทำงานในการลงทะเบียนการแข่งขันเรากำลังใช้ PWMMR4, PWMMR2, PWMMR3, PWMMR5 เรากำลังตั้งค่าเริ่มต้นเป็น 0 msec (Toff)
PWMMR4 = 0; PWMMR2 = 0; PWMMR3 = 0; PWMMR5 = 0;
หลังจากนั้นตั้งค่า PWM Match Control Register เพื่อทำให้เกิดการรีเซ็ตตัวนับเมื่อเกิดการลงทะเบียนการแข่งขัน
PWMMCR = 0x00000002; // รีเซ็ตการจับคู่ MR0
หลังจากนั้นสลัก PWM เปิดใช้งานการลงทะเบียนเพื่อเปิดใช้งานการใช้ค่าที่ตรงกัน (PWMLER)
PWMLER = 0x7C; // เปิดใช้งาน Latch สำหรับ PWM2, PWM4, PWM4 และ PWM5
รีเซ็ตตัวนับตัวจับเวลาโดยใช้บิตใน PWM Timer Control Register (PWMTCR) และยังเปิดใช้งาน PWM
PWMTCR = 0x09; // เปิดใช้งาน PWM และตัวนับ
ถัดไปเปิดใช้งานเอาต์พุต PWM และตั้งค่า PWM ในโหมดควบคุมขอบเดียวในทะเบียนควบคุม PWM (PWMPCR)
PWMPCR = 0x7C00; // เปิดใช้งาน PWM2, PWM4, PWM4 และ PWM5, PWM แบบควบคุมขอบเดียว
การเลือกเซอร์โวมอเตอร์เพื่อหมุนโดยใช้ปุ่มกด
เรามีปุ่มกดสี่ปุ่มซึ่งใช้สำหรับหมุนเซอร์โวมอเตอร์สี่ตัว เมื่อเลือกปุ่มกดหนึ่งปุ่มและเปลี่ยนโพเทนชิออมิเตอร์ที่สอดคล้องกันค่า ADC จะกำหนดรอบการทำงานและเซอร์โวมอเตอร์ที่เกี่ยวข้องจะเปลี่ยนตำแหน่ง เพื่อรับสถานะของสวิตช์ปุ่มกด
switchStatus1 = (IOPIN1 >> SwitchPinNumber1) & 0x01;
ดังนั้นโดยขึ้นอยู่กับว่าค่าสวิตช์ใดที่มีค่าสูงการแปลง ADC จะเกิดขึ้นและหลังจากการแปลงค่า ADC (0 ถึง 1023) สำเร็จแล้วจะมีการแมปในรูปของ (0 ถึง 2045) จากนั้นค่ารอบหน้าที่จะถูกเขียน พิน PWM (PWMMRx) เชื่อมต่อกับเซอร์โวมอเตอร์ นอกจากนี้ไฟ LED จะเปิดเป็น HIGH เพื่อระบุว่าสวิตช์ใดถูกกด ต่อไปนี้เป็นตัวอย่างสำหรับปุ่มกดแรก
ถ้า (switchStatus1 == 1) { IOPIN1 = (1 <
การทำงานของแขนหุ่นยนต์ Pick and Place
หลังจากอัปโหลดรหัสไปยัง LPC2148 แล้วให้กดสวิตช์ใด ๆ และเปลี่ยนโพเทนชิออมิเตอร์ที่เกี่ยวข้องเพื่อเปลี่ยนตำแหน่งของแขนหุ่นยนต์
สวิตช์และโพเทนชิออมิเตอร์แต่ละตัวควบคุมการเคลื่อนที่ของเซอร์โวมอเตอร์แต่ละตัวซึ่งเป็นการเคลื่อนที่ไปทางซ้ายหรือขวาการเคลื่อนที่ขึ้นหรือลงไปข้างหน้าหรือข้างหลังจากนั้นกริปเปอร์จะจับและปล่อยการเคลื่อนไหว รหัสที่สมบูรณ์พร้อมวิดีโอการทำงานโดยละเอียดมีให้ด้านล่าง