แกะกล่อง myCobot 280 Pi
myCobot 280 Pi หุ่นยนต์แขนกลอเนกประสงค์ มีการทำงานข้อต่อแบบ 6 แกน ออกแบบและพัฒนาโดย Elephant Robotics โดยใช้ บอร์ด Raspberry Pi 4 เป็นส่วนประกอบหลักในการควบคุม มีขนาดกะทัดรัดและมั่นคง สำหรับการทำงานในพื้นที่ที่จำกัด อีกทั้งสามารถเขียนได้หลากหลายภาษา ใช้งานง่าย ฟังก์ชั่นครบครัน เหมาะสำหรับผู้ที่สนใจจะเริ่มเรียนรู้การเขียนโปรแกรมควบคุมหุ่นยนต์แขนกล เอาไว้ใช้ทำงานทดแทนหรือทำโครงงานวิศวกรรมศาสตร์ก็ถือว่าเหมาะสมเลยทีเดียว
myCobot 280 Pi มีระยะพื้นที่การทำงานเส้นผ่านศูนย์กลาง 280 มิลลิเมตร มีน้ำหนัก 850 กรัม รับน้ำหนักในการยกของได้ 250 กรัม ขับเคลื่อนด้วยเซอร์โวมอเตอร์แต่ละแกนรวม 6 แกน มี LED แสดงผลแบบ Matrix 5×5 อีกทั้งยังสามารถเชื่อมต่อกับชิ้นส่วน Lego ได้อีกด้วย
ควบคุมด้วยคอมพิวเตอร์ขนาดเล็ก Raspberry Pi 4B ในการประมวลผล สามารถเชื่อมต่อกล้อง MyCobot 280 ในการใช้งานด้าน Image Processing มีพอร์ต USB 4 ช่อง สามารถรับสัญญาณ WiFi อีกทั้งยังเชื่อมต่อการแสดงผลออกจอด้วยพอร์ต Micro-HDMI ได้ รวมถึงพอร์ต Input/Output 40 Pin ที่เชื่อมต่ออุปกรณ์ต่างๆ อีกมากมาย ส่วนการเปิด-ปิดหุ่นยนต์สามารถกดได้เพียงปุ่มเดียว รวมถึงมีช่องต่ออะแดปเตอร์แปลงไฟอีกด้วย
ช่องใส่ SDCard อยู่ด้านใต้ของหุ่นยนต์ myCobot 280 Pi
อะแดปเตอร์แปลงไฟ Input 100-240 โวลล์ กระแสไฟฟ้าแบบสลับ โดยแปลงกระแสเป็นไฟฟ้ากระแสตรง Output 8.4 โวลล์ 5.0 แอมป์ 42 วัตต์ ซึ่งรองรับการใช้งานแบบต่อเนื่องได้
และอุปกรณ์เสริมต่างๆในชุดประกอบด้วย
- แผ่นฐานยึด myCobot : Base-Flat
- สกรูยึดแบบแรงดูด myCobot : Screw Fixing
- กล้องเว็บแคม myCobot
- ชุดหัวดูดปั้มลมแรงสูง myCobot : SuctionPump
- อะแดปเตอร์แปลงไฟ
- สายไฟเชื่อมต่อต่างๆ
- ตัวต่อ LEGO Connector
วิธีติดตั้งแผ่นฐานกับหุ่นยนต์ myCobot 280 Pi
อุปกรณ์เสริมแผ่นฐานยึดสกรูแบบตัวดูดสูญญากาศกับหุ่นยนต์ myCobot 280 Pi
ในการประกอบแผ่นฐานยึดกับหุ่นยนต์ myCobot 280 Pi หมุนสกรูลงไปกับรูที่อยู่บริเวณตรงมุมทั้ง 4 ด้าน
เสร็จเรียบร้อยจะได้หน้าตาแบบนี้ครับ
ตัวต่อ LEGO Connector สามารถติดตั้งอุปกรณ์เสริมได้อย่างง่ายดายกับหุ่นยนต์ myCobot 280 Pi
จากนั้นนำ ตัวเชื่อมต่อ LEGO มาใส่ในช่องของแผ่นยึด สามารถออกแบบการติดตั้งได้ตามต้องการ
จากนั้นนำหุ่นยนต์ myCobot 280 Pi มาติดตั้งตามตำแหน่ง ในการติดตั้งเพื่อการยึดติดแบบสูญญากาศโดยสามารถหมุนสกรูลงไปให้แน่น เพียงเท่านี้ หุ่นยนต์ myCobot 280 Pi ก็สามารถยึดติดกับพื้นได้แล้ว และแนะนำว่าวัสดุที่จะติดได้ดี คือ กระจก, หินอ่อน, วัสดุที่เป็นผิวเรียบ
ระบบปฎิบัติการ Ubuntu
myCobot 280 Pi ถูกติดตั้งระบบปฎิบัติการ Ubuntu แบบ Linux มีโปรแกรมสามารถเขียนคำสั่งควบคุมได้ทั้งแบบ Block-Base Programming คือ myBlockly และ Python ด้วย VSCode
Python
myCobot 280 Pi สามารถเขียนโปรแกรมด้วยภาษา Python ได้ซึ่งเพิ่มความสามารถในการใช้กล้องเพื่อตรวจจับวัตถุต่างๆ ใช้งานร่วมกับ Library OpenCV ในทางด้านปัญญาประดิษฐ์ Image Processing, Machine Learning
ROS
Robot Operating System (ROS) โดยใช้ Rviz เพื่อจำลองการเคลื่อนที่ของแขนกล และสามารถควบคุมระยะไกลผ่าน ROS ได้อีกด้วย
คำสั่งโปรแกรมควบคุมหุ่นยนต์ MyCobot 280 Pi ด้วย MyBlockly
MyBlockly คือ เครื่องมือพัฒนาโปรแกรมแบบจำลอง (Visual) โดยใช้สัญลักษณ์ภาพแบบจิ๊กซอล แทนคำสั่งมาเรียงต่อกันตามเงื่อนไขที่ต้องการ ในเครื่องมีอนี้มีกลุ่มของสัญลักษณ์ที่ประกอบด้วย Logic, Loops, Math, Text, Lists, Colour, Variables, Functions ที่เป็นแบบพื้นฐานและยังมีฟังก์ชั่นในการควบคุมแขนกลและยังมีฟังก์ชั่นต่าง ๆ ที่ครบครันที่สำคัญเขียนง่ายมากครับ ส่วนในการ Run โปรแกรมที่เขียนสามารถคลิ๊กที่ Run ที่หัวมุมด้านขวา ที่นี้ เรามาดูคำสั่งที่น่าสนใจกันครับ
Time
เป็นคำสั่งการหน่วงเวลาโดยใช้คำสั่ง Sleep มีหน่วยเวลาเป็นวินาที
Raspi-GPIO
เป็นคำสั่งควบคุม gpio ย่อมาจาก general purpose input/output เรียกเป็นง่ายๆว่า พอร์ตเอนกประสงค์ คือเราสามารถควบคุม คอนโทรลให้เป็น HIGH หรือ LOW ได้ โดยที่จะสามารถควบคุมได้แต่ละ Pin ของบอร์ด Raspberry Pi
ATOM IO
เป็นคำสั่งควบคุม LED Matrix 5×5 ของหุ่นยนต์ที่อยู่บริเวณแขน โดยสามารถเปลี่ยนค่าได้ตามไฟ RGB โดยจะมีค่าที่ให้ป้อน 3 ค่า คือแม่สีทั้ง 3 สี ได้แก่ สีแดง สีน้ำเงิน สีเขียว ครับ อีกทั้งยังสามารถใช้ PWM Control ได้อีกด้วยครับ
สีของ LED จะเปลี่ยนตามคำสั่งที่เราป้อนลงไปครับ
Status
คำสั่งเปิด – ปิด สถานะการทำงานของหุ่นยนต์ MyCobot 280 Pi
MDI – Model and Operation
เป็นคำสั่งการควบคุมองศาการเคลื่อนที่ของแขนกลแต่ละแกน ได้ด้วยบล๊อคเดียว อีกทั้งสามารถป้อนข้อมูลได้พร้อมกันรวมถึงการควบคุมความเร็วได้ หรืออยากจะใช้โหมด Coordination ก็สามารถใช้งานได้ครับ เรียกได้ว่าเป็นการเขียนโปรแกรมที่ง่ายมาก ๆ ครับ
JOG Model and Operation
เป็นคำสั่งการควบคุมองศาการเคลื่อนที่ของแขนกลแต่ละแกน แบบแยกบล๊อคการทำงาน เพิ่มความหลากหลายในการใช้งานมาก ๆ ครับ
Running Status and Setting
เป็นคำสั่งการควบคุมความเร็วการเคลื่อนที่ของแขนกล รวมถึงบล๊อคคำสั่งในการเคลื่อนที่ไปยังองศาสูงสุดถึงต่ำสุดด้วยครับ
การหาค่าตำแหน่งองศาต่างๆ ของหุ่นยนต์ในแต่ละแกน
ในการหาค่าองศาของแต่ละแกนโดยการอ่านค่าจากโปรแกรม ฟังก์ชั่นนี้เรียกได้ว่าเป็นฟังกชั่นที่ดีมาก ๆ ช่วยในการลดเวลาในการหาองศาต่าง ๆ โดยคลิ๊กไปที่มุนด้านขวา
จะมีหน้าต่างขึ้นมาในหัวข้อ Quick Move จากนั้นเราสามารถปรับองศาได้ด้วยมือแล้วคลิ๊กที่ปุ่ม Read Angles ค่าที่ได้จะถูกป้อนเข้าไปในบล๊อค Set Angle แบบ อัตโนมัติ
ทดสอบความแม่นยำของ MyCobot 280 Pi
ผมได้ทดสอบความแม่นยำการเคลื่อนที่ของหุ่นยนต์ myCobot 280 Pi ซึ่งผลการทดลองมีความแม่นยำ + – 5 % ให้ทำงานตามสีเป็นขั้นตอนและเปลี่ยนการแสดงผลของ LED Matrix 5×5 ให้ตรงกับสีนั้นตามวิดีโอที่อยู่ด้านล่างครับ
myCobot SuctionPump
ปั้มดูดที่สามารถเพิ่มความสามารถของหุ่นยนต์แขนกล myCobot 280 Pi เพิ่มความสามารถในการยกและเปลี่ยนตำแหน่งโดยการดูด วัตถุสามารถยกแล้วย้ายไปยังตำแหน่งอื่นได้ น้ำหนักสูงสุดของวัตถุที่ยกด้วย myCobot Suck Pump คือ 250 กรัม
รายละเอียดปั๊มดูด
- ฟังก์ชัน: ดูดวัตถุเพื่อยก เคลื่อนย้ายตำแหน่ง
- น้ำหนักสูงสุดของวัตถุที่จะยก: 250 g
- วัสดุ: photopolymer / ไนลอน 7100
- สี: ขาว
- ขนาด: 94 x 74 x 51 mm
- น้ำหนัก: 220 กรัม
การติดตั้ง myCobot SuctionPump กับ myCobot 280 Pi
ใช้ ตัวต่อ LEGO Connector ใส่เข้ากับ myCobot SuctionPump
เพียงเท่านี้ก็สามารถติดตั้ง myCobot SuctionPump กับ myCobot 280 Pi ได้อย่างง่ายดาย
การเชื่อมต่อสายไฟระหว่าง myCobot SuctionPump กับ myCobot 280 Pi
ทำได้โดยการเสียบสาย Connector ไปยัง GPIO ของตัว Raspberry Pi โดยมีสายอยู่ 4 เส้น ได้แก่ 5V, GNd, G2 (GPIO21), G5 (GPIO22)
การเสียบสายจะใช้สายไฟแบบ Dupoint แบบตัวผู้ เสียบเข้าไปที่จุดเชื่อมต่อ GPIO โดยจะเสียบสายอยู่ 4 เส้น ได้แก่ 5V, GNd, G2 จะเชื่อมต่อกับ (GPIO21), G5 จะเชื่อมต่อ (GPIO22)
การใช้คำสั่งการทำงานของ myCobot SuctionPump ด้วย myBlockly
โดยไปที่หัวข้อ Rasp GPIO อันดับแรกเราจะต้องใช้บล๊อคคำสั่ง Set Mode BCM ก่อนเพื่อเป็นการทำงานของ Pin GPIO จากนั้นเราจะใช้ บล๊อคคำสั่ง Set pin Mode 20 และ 21 Set เลือกเป็น OUT เพื่อ ตั่งค่าการทำงานของ Pin 20 และ 21 เป็นโหมดแบบ OUTPUT
ในการสั่งงานจะใช้ 2 บล๊อคในการควบคุม myCobot SuctionPump
โดย สั่งให้ทำงาน ใช้บล๊อคคำสั่ง Set pin 20 Output เลือกเป็น HIGH และ Set pin 21 Output เลือกเป็น HIGH
สั่งให้หยุดทำงาน ใช้บล๊อคคำสั่ง Set pin 20 Output เลือกเป็น LOW และ Set pin 21 Output เลือกเป็น LOW
เพียงเท่านี้ก็สามารถเปิด – ปิด การทำงานของ myCobot SuctionPump ได้แล้วครับ
ทดสอบการทำงานในการยกและเปลี่ยนตำแหน่งโดยการดูดชิ้นงาน
ผมได้ทดสอบแขนกลทำงานร่วมกันกับปั้มดูด ในการเคลื่อนย้านตำแหน่งไปยังจุดที่ต้องการตามสีของชิ้นงานที่กำหนดตามลำดับ ซึ่งผลจากการทดสอบในการทำงานของปั้มดูดจะใช้เวลานานให้การดูดชิ้นงาน และหากชิ้นงานมีน้ำหนักเบาจะใช้เวลาในการปล่อยพอสมควร แต่การทำงานของแขนกลสามารถทำงานได้แม่นยำเป็นอย่างดี ดูได้จากวิดีโอการทดสอบครับ
MyCobot 280 Camera
น้ำหนักเบา ติดตั้งบนแขนหุ่นยนต์ในเวลาไม่กี่นาที Plug-and-play สะดวกและรวดเร็วมาก การออกแบบที่กะทัดรัดและไดรฟ์ข้อมูลขนาดเล็กช่วยให้คุณไม่ต้องกังวลกับการใช้พื้นที่มากเกินไป กล้องไมโคร USB ขนาดเล็กพิเศษ ใช้สีมุมกว้างความละเอียดสูง 720P ด้วยการเชื่อมต่อความเร็วสูง USB2.0 มาตรฐาน ใช้งานได้หลากหลาย เหมาะสำหรับการจดจำใบหน้า, หน้าจออัจฉริยะ, การจัดส่งด่วนอัจฉริยะ, ตู้หยอดเหรียญอัตโนมัติ, รหัสสแกน, การควบคุมการเข้าใช้งาน, อุปกรณ์ทางการแพทย์และอื่น ๆ
การติดตั้ง myCobot SuctionPump + myCobot 280 Camera + myCobot 280 Pi
ที่นี้ผมจะใช้ MyCobot 280 Camera ร่วมกับ myCobot SuctionPump โดยใช้ตัวต่อ LEGO Connector ใส่เข้ากับ myCobot SuctionPump
จากนั้นนำ MyCobot 280 Camera มาประกบกันกับ myCobot SuctionPump
จากนั้นนำตัวต่อ LEGO Connector ใส่เข้ากับ MyCobot 280 Camera แล้วมาติดตั้งกับ MyCobot 280 Pi ครับ
เสร็จสมบูรณ์ครับเรียกได้ว่าง่ายมากๆครับ
การติดตั้ง OpenCV and Numpy โดยใช้ pip
ในการเตรียมความพร้อมในการเขียนโปรแกรม Image Processing จะต้องทำการติดตั้ง Library 2 ตัว ครับ นั่นคือ Opencv และ Numpy
โดยสามารถติดตั้งได้ผ่าน Terminal ใน OS ของหุ่นยนต์ครับ
OpenCV คือไลบรารีที่นิยมสำหรับการประมวลผลภาพขั้นพื้นฐาน เช่น การเบลอภาพ การผสมภาพ การเพิ่มคุณภาพของภาพ เพิ่มคุณภาพของวิดีโอ การรู้จดจำวัตถุต่าง ๆ ในภาพ หรือ การตรวจจับใบหน้าหรือวัตถุต่าง ๆ ในภาพและวิดีโอ และการแยกสีที่เรานำมาใช้ในโปรเจคนี้
1 |
pip install opencv-python |
Numpy เป็นโมดูลส่วนเสริมของ Python ที่มีฟังก์ชัน เกี่ยวกับคณิตศาสตร์และการคำนวณต่างๆ มาให้ใช้งาน โดยทั่วไปจะ เกี่ยวกับการจัดการข้อมูลชุด (Array) และเมทริกซ์
1 |
pip install numpy |
Image Thresholding
Threshold คือ หนึ่งในเทคนิคการคัดแยกวัตถุออกจากภาพพื้นหลัง โดยการรับภาพสีเทามาแปลงเป็นภาพไบนารีที่มีค่าพิกเซลเป็น 0 หรือ 255 ด้วยการกำหนดค่าคงที่ขั้นต่ำมาเทียบกับค่าพิกเซลในแต่ละพื้นที่ของภาพสีเทา เพื่อทำการเปลี่ยนค่าพิกเซลนั้นเป็น 0 หรือ 255 โดยผมเขียนโปรแกรมด้วยภาษา Python ผ่าน VSCode ซึ่งจะใช้วัตถุ 3 สีในการตรวจจับ ในขั้นต่อนี้จะต้องทำการหาวัตถุสีแดงก่อนครับ ค่าที่ได้จะไม่มีตายตัวนะครับ ขึ้นอยู่กับแสงแต่ละพื้นที่ด้วยครับ ก็จะได้ค่าตามนี้ครับ lowerR = np.array([142, 114, 181]) upperR = np.array([194, 255, 255])
หาค่าของวัตถุสีน้ำเงินค่าที่หาได้ดังนี้ครับ lowerB = np.array([83, 228, 206]) upperB = np.array([106, 255, 255])
หาค่าของวัตถุสีเขียวค่าที่หาได้ดังนี้ครับ lowerG = np.array([54, 82, 228]) upperG = np.array([81, 255, 255])
โค้ดตัวอย่างการหาค่า Thresholding (Python)
โดยมีการ import โมดูล 2 ตัว ได้แก่ cv2 ในการจัดการภาพ และ numpy ในการจัดการข้อมูลชุด (Array) และเมทริกซ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import cv2 import numpy as np def nothing(x): pass cv2.namedWindow("Tracking") cv2.createTrackbar("LH", "Tracking", 0, 255, nothing) cv2.createTrackbar("LS", "Tracking", 0, 255, nothing) cv2.createTrackbar("LV", "Tracking", 0, 255, nothing) cv2.createTrackbar("UH", "Tracking", 255, 255, nothing) cv2.createTrackbar("US", "Tracking", 255, 255, nothing) cv2.createTrackbar("UV", "Tracking", 255, 255, nothing) vs = cv2.VideoCapture(0) while True: _, frame = vs.read() hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) l_h = cv2.getTrackbarPos("LH", "Tracking") l_s = cv2.getTrackbarPos("LS", "Tracking") l_v = cv2.getTrackbarPos("LV", "Tracking") u_h = cv2.getTrackbarPos("UH", "Tracking") u_s = cv2.getTrackbarPos("US", "Tracking") u_v = cv2.getTrackbarPos("UV", "Tracking") l_b = np.array([l_h, l_s, l_v]) u_b = np.array([u_h, u_s, u_v]) mask = cv2.inRange(hsv, l_b, u_b) res = cv2.bitwise_and(frame, frame, mask=mask) cv2.imshow("frame", frame) cv2.imshow("mask", mask) cv2.imshow("res", res) key = cv2.waitKey(1) if key == 27: break cv2.destroyAllWindows() |
การทำงาน myCobot 280 Pi ร่วมกับ สายพานลำเลียง เพื่อคัดแยกสีของวัตถุ (Color Sorting)
ในการทำงานระหว่าง myCobot 280 Pi ร่วมกับสายพานลำเลียงเพื่อคัดแยกสีของวัตถุ แยกเป็น 2 ส่วน
- ส่วนของสายพานใช้บอร์ด Arduino ในการควบคุมมอเตอร์ของสายพานและเขียนโปรแกรมตรวจสอบเงื่อนไขเซนเซอร์วัดระยะในการหยุดของวัตถุให้ตรงตามตำแหน่งของสายพาน
- ในส่วนของ myCobot 280 Pi จะทำการตรวจจับสีที่คัดได้จากการ Image Thresholding และเขียนเงื่อนไขหากตรวจพบเจอสีที่ต้องการจำนวน 3 สี ได้แก่ สีแดง สีน้ำเงิน สีเขียว จากนั้นจะทำการดูดยกด้วย myCobot SuctionPump เคลื่อนย้านไปใส่ในถังสีตามที่ถูกต้อง โดยผมตั้งค่าตำแหน่งของแขนกลไว้ 4 ตำแหน่ง 1. ตำแหน่งกล่องสีแดง 2. ตำแหน่งกล่องสีน้ำเงิน 3. ตำแหน่งกล่องสีเขียว 4. ตำแหน่งเริ่มต้นในการตรวจจับวัตถุสี ซึ่งความสะดวกสบายในการหาตำแหน่ง ของ myCobot 280 Pi สามารถใช้มือจับแขนกลเคลื่อนที่ไปยังตำแหน่งนั้นแล้วอ่านค่าจาก Serial Monitor ได้เลย และนำค่าที่ได้มาใส่ในโปรแกรมซึ่งเป็นจุดที่ดีมาก ๆ ในการหาตำแหน่งต่าง ๆ
โค้ดตัวอย่าง myCobot 280 Pi Color Sorting
โดยมีการเรียกใช้ library MyCobot ในการใช้คำสั่งควบคุมองศาแขนกลของหุ่นยนต์แต่ละแกน มีการใช้ library GPIO ในการสั่งงานเปิด-ปิด myCobot SuctionPump ใช้ library cv2 ในการจัดการภาพ และ numpy ในการจัดการข้อมูลชุด (Array) และเมทริกซ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
from pymycobot.mycobot import MyCobot from pymycobot import PI_BAUD, PI_PORT import RPi.GPIO as GPIO import numpy as np import time import cv2 GPIO.setmode(GPIO.BCM) GPIO.setup(20, GPIO.OUT) GPIO.setup(21, GPIO.OUT) vs = cv2.VideoCapture(0) print("Camera On: {}".format(vs.isOpened())) lR = np.array([142, 114, 181]) uR = np.array([194, 255, 255]) lG = np.array([54, 82, 228]) uG = np.array([81, 255, 255]) lB = np.array([83, 228, 206]) uB = np.array([106, 255, 255]) def pump(state): if state == 1: #On print('Pump on') GPIO.output(20, 0) GPIO.output(21, 0) elif state == 0: #Off print('Pump off') GPIO.output(20, 1) GPIO.output(21, 1) def findContour(mask): minArea = 10000 found = False x, y, w, h = 0, 0, 0, 0 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for pic, contour in enumerate(contours): area = cv2.contourArea(contour) if area >= minArea: x, y, w, h = cv2.boundingRect(contour) found = True break return x, y, w, h, found camera = [7.82, -15.82, -110.12, 37.7, -19.59, -123.04] preTrash = [29.0, -4.21, -78.75, -1.75, -23.2, -150.46] trashAngle, comebackAngle = [], [] pickup = [ [33.92, -5.53, -117.94, 39.63, -21.79, -133.5], [32.69, -17.57, -121.46, 52.73, -20.83, -123.31] ] trashR = [-79.27, -16.25, -85.95, 16.78, -15.11, -139.83] trashG = [-37.0, -35.41, -55.01, 13.44, -15.73, -136.66] trashB = [-55.72, -17.4, -78.83, 15.55, -12.04, -134.56] comebackR = [-75.93, -17.49, -57.04, -9.58, -21.0, -136.93] comebackB = [-51.85, -17.22, -60.29, -0.26, -20.3, -136.93] comebackG = [-35.77, -31.02, -41.3, -3.69, -19.95, -164.44] mc = MyCobot("/dev/ttyAMA0", 1000000) pump(0) time.sleep(1) while True: try: mc.set_color(255, 255, 255) mc.send_angles(camera, 40) time.sleep(2) dR, dG, dB = False, False, False while True: # Clearing buffer for i in range(30): _, frame = vs.read() _, frame = vs.read() #cv2.imwrite("a.jpg", frame) hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) maskR = cv2.inRange(hsv, lR, uR) maskG = cv2.inRange(hsv, lG, uG) maskB = cv2.inRange(hsv, lB, uB) xr, yr, wr, hr, dR = findContour(maskR) xg, yg, wg, hg, dG = findContour(maskG) xb, yb, wb, hb, dB = findContour(maskB) if dR: trashAngle = trashR comebackAngle = comebackR mc.set_color(255, 0, 0) print("Detected Red Block") cv2.rectangle(frame, (xr, yr), (xr+wr, yr+hr), (0, 0, 0), 2) elif dG: trashAngle = trashG comebackAngle = comebackG mc.set_color(0, 255, 0) print("Detected Green Block") cv2.rectangle(frame, (xg, yg), (xg+wg, yg+hg), (0, 0, 0), 2) elif dB: trashAngle = trashB comebackAngle = comebackB mc.set_color(0, 0, 255) print("Detected Blue Block") cv2.rectangle(frame, (xb, yb), (xb+wb, yb+hb), (0, 0, 0), 2) cv2.imshow("frame", frame) cv2.waitKey(1) if dR or dG or dB: break for angle in pickup: mc.send_angles(angle, 40) time.sleep(1.5) pump(1) time.sleep(1) mc.send_angles(preTrash, 40) time.sleep(1) mc.send_angles(trashAngle, 40) time.sleep(3) pump(0) time.sleep(3.5) mc.send_angles(comebackAngle, 40) time.sleep(1.5) except KeyboardInterrupt: break pump(0) time.sleep(1) mc.send_angles(pickup[1], 40) time.sleep(3) mc.release_all_servos() GPIO.cleanup() vs.release() cv2.destroyAllWindows() time.sleep(1) |
วิดีโอตัวอย่าง myCobot 280 Pi Color Sorting
Highlight myCobot 280 Pi Color Sorting
ผมต้องขอขอบคุณบริษัท Elephant Robotics ที่ส่งชุดหุ่นยนต์ myCobot 280 Pi พร้อมอุปกรณ์เสริมมาให้รีวิวและได้ทดลองเล่น
myCobot 280 Pi ยังมีลูกเล่นอีกมากมาย เหมาะสำหรับผู้ที่เริ่มต้นในการเรียนรู้การศึกษาเกี่ยวกับหุ่นยนต์แขนกลในราคาเริ่มต้น $799 (~30,000฿) สามารถนำไปใช้ในการเรียนการสอนในห้องเรียนในชั้นการศึกษาระดับมัธยมไปจนถึงระดับมหาวิทยาลัย เพื่อต่อยอดนำไปใช้งานด้านอุตสาหกรรม ถือว่า myCobot 280 Pi ตอบโจทย์มากๆ ในการเรียนรู้ อีกทั้งยังเขียนโปรแกรมได้ง่ายมาก ๆ สามารถอ่านค่าองศาได้ อีกทั้งยังสามารถศึกษาการคำนวณการเคลื่อนที่ด้วย Foward – Inverse Kinematics ได้อีกด้วย
หากท่านใดที่สนใจสามารถศึกษาเพิ่มเติมร้านค้า Elephant Robotics
กรรมการผู้จัดการของโรงเรียนเกี่ยวกับหุ่นยนต์ในจ.เชียงใหม่, ชนะเลิศการแข่งขันหุ่นยนต์ต่างๆ ทั้งในและต่างประเทศ ได้แก่ Robocon และ Makerthon