ชุดหุ่นยนต์จากบริษัท SunFounder มีชื่อเรียกว่า GalaxyRVR เป็นหุ่นยนต์ที่ออกแบบให้เลียนแบบหุ่นยนต์สำรวจดาวเคราะห์ต่างๆ ของ NASA มาเป็นชุดหุ่นยนต์เพื่อเรียนรู้การเขียนโปรแกรมสำหรับผู้ที่สนใจหรือนักเรียนในห้องเรียนเกี่ยวกับเทคโนโลยี ในชุดหุ่นยนต์ GalaxyRVR มาพร้อมกับโมดูลกล้องความละเอียดสูงส่งสัญญาณผ่านเครือข่าย WiFi สามารถทำให้เหมือนกับการสำรวจดาวเคราะห์จริงผ่านหน้าจอ มีโมดูลการหลบหลีกสิ่งกีดขวางด้วยโมดูล Ultrasonic มีเซอร์โวมอเตอร์ในการปรับยก-ลง ของกล้องหน้าได้ มีระบบหมุนเวียนพลังงานด้วยแผงโซล่าเซลล์อีกด้วย
หุ่นยนต์สำรวจดาวอังคารของ NASA
ในปัจจุบัน NASA ใช้หุ่นยนต์ Perseverance หรือที่รู้จักกันในชื่อ Percy เป็นหุ่นยนต์สำรวจดาวเคราะห์รุ่นล่าสุดที่มาถึงดาวอังคาร ได้รับการออกแบบมาเพื่อสำรวจปล่องภูเขาไฟ Jezero ซึ่งเป็นส่วนหนึ่งของภารกิจ Mars 2020 ของ NASA นอกเหนือจากเครื่องมือทางวิทยาศาสตร์แล้ว Perseverance ยังมี Ingenuity ซึ่งเป็นเฮลิคอปเตอร์ทดลองขนาดเล็กบนดาวอังคาร ซึ่งถือเป็นครั้งแรกในการสำรวจดาวอังคาร
โดยชุดหุ่นยนต์ GalaxyRVR จำลองโครงสร้างการเคลื่อนที่ด้วยระบบ Rocker-Bogie Mechanism แบบเดียวกับที่ใช้ในรถสำรวจดาวอังคารของ NASA โดยสามารถสำรวจภูมิประเทศได้ทุกประเภท ไม่ว่าจะเป็นภูเขาหิน หาดทราย หรือทุ่งหญ้า มีระบบกันสั่นสะเทือนช่วยให้เคลื่อนที่ได้อย่างราบรื่น
Rocker-Bogie System
ระบบ Rocker-Bogie แสดงให้เห็นว่าเป็นกลไกที่สามารถก้าวข้ามอุปสรรคด้านสิ่งแวดล้อมได้ โดยการออกแบบของระบบนี้ เพื่อรองรับกับสภาพภูมิประเทศที่คาดเดาไม่ได้ของดาวอังคาร รวมถึงทางลาดชันและก้อนหินขนาดใหญ่ ระบบนี้จะสามารถข้ามอุปสรรคและใช้ประโยชน์จากล้อทั้ง 6 ล้อ เพื่อพิชิตภูมิประเทศที่ยากลำบากในการเข้าไปสำรวจในพื้นที่ต่างๆของดาวเคราะห์
อุปกรณ์ภายในชุดหุ่นยนต์ SunFounder Galaxy RVR
ชิ้นส่วนการประกอบหุ่นยนต์ SunFounder Galaxy RVR โดยผู้เรียนจะต้องประกอบด้วยตัวเองเริ่มจากชิ้นส่วนต่างๆ ที่อยู่ภายในชุดมากกว่า 300+ ชิ้น สามารถดาวน์โหลดรายละเอียดอุปกรณ์ได้จาก Github
วิดีโอในการประกอบ
ในการประกอบหุ่นยนต์ SunFounder Galaxy RVR สามารถชมวิดีโอการประกอบของบริษัท SunFounder ทีละขั้นตอนได้จากวิดีโอด้านล่างนี้
บอร์ดควบคุมหลักของหุ่นยนต์ SunFounder Galaxy RVR
บอร์ด SunFounder R3 เป็นบอร์ดไมโครคอนโทรลเลอร์ที่ใช้ ATmega328P มีพอร์ต I/O แบบดิจิตอลจำนวน 14 พอร์ต (ซึ่ง 6 พอร์ตสามารถใช้เป็นเอาต์พุต PWM ได้) มีอินพุตอะนาล็อกจำนวน 6 พิน มีการเชื่อมต่อกับคอมพิวเตอร์ด้วยสาย USB ในการ Upload โปรแกรม สามารถจ่ายไฟด้วยอะแดปเตอร์ AC-to-DC หรือแบตเตอรี่ 7 -12V เพื่อเริ่มต้นการใช้งาน
ข้อมูลจำเพาะของบอร์ด SunFounder R3
- Microcontroller: ATmega328P
- Operation voltage: 5V
- Input Voltage (Recommended): 7-12V
- Input Voltage (Limit): 6-20V
- Digital I/O Pins: 14 (0-13, of which 6 provide PWM output(3, 5, 6, 9-11))
- PWM Digital I/O Pins: 6 (3, 5, 6, 9-11)
- Analog Input Pins: 6 (A0-A5)
- DC Current Per I/O Pin: 20 mA
- DC Current For 3.3V Pin: 50 mA
- Flash Memory: 32 KB (ATmega328P) of which 0.5 KB used by bootloader
- SRAM: 2 KB (ATmega328P)
- EEPROM: 1 KB (ATmega328P)
- Clock Speed: 16 MHz
- LED_Builtin: 13
- Length: 68.6 mm
- Width: 53.4 mm
- Weight: 25 g
- I2C Port: A4(SDA), A5(SCL)
บอร์ดขยาย SunFounder Galaxy RVR
บอร์ดขยายการเชื่อมต่ออุปกรณ์โมดูลต่างๆของหุ่นยนต์ SunFounder Galaxy RVR ที่ออกแบบมาสำหรับบอร์ด Arduino ของบริษัท SunFounder ซึ่งมีพอร์ตการเชื่อมต่อโมดูลต่างๆ เช่น มอเตอร์, ไฟ RGB, เซนเซอร์ IR Obstacle Avoidance , บอร์ด ESP32 CAM และโมดูล Ultrasonic
โดยบอร์ดขยายนี้ยังมีวงจรชาร์จในตัวซึ่งสามารถชาร์จแบตเตอรี่ด้วยพอร์ตแบบ PH2.0-3P และเวลาในการชาร์จเต็มโดยประมาณ 130 นาทีต่อการชาร์จแบตเตอรี่ชนิด 18650 7.4V 2000mAh ในแต่ละครั้ง
รายละเอียดของพอร์ตต่างๆมีดังนี้
- Charge Port
- เมื่อเสียบสาย USB-C port 5V/2A เข้าที่ช่อง USB Port จะสามารถชาร์จแบตเตอรี่ได้
- Battery Port
- ใช้ไฟเลี้ยงประมาณ 6.6V~8.4V ด้วยพอร์ต PH2.0-3P
- Reset Button
- สามารถกด Reset โปรแกรมบอร์ด Arduino ได้
- Indicators
- ไฟแสดงสถานะการชาร์จ: แสงสีแดงเมื่อชาร์จผ่านพอร์ต USB-C
- ไฟแสดงสถานะ: แสงสีเขียวเมื่อสวิตช์ไฟอยู่ในตำแหน่ง “ON”
- ไฟแสดงสถานะแบตเตอรี่: ไฟแสดงสถานะสีส้ม 2 ดวงแสดงถึงระดับแบตเตอรี่ที่แตกต่างกัน โดยจะกะพริบระหว่างการชาร์จและจะปิดเมื่อแบตเตอรี่แบตเตอรี่อ่อน
- Power Switch
- เลื่อนไปที่ “ON” เพื่อเปิดหุ่นยนต์ GalaxyRVR
- Camera Servo
- เซอร์โวที่ใช้ในการแพนกล้องขึ้นลงให้เสียบที่ช่องนี้
- สายสีน้ำตาลเชื่อมต่อกับ “-” สายสีแดงเชื่อมต่อกับ “+” และสายสีเหลืองเชื่อมต่อกับขา 6
- Motor Port
- พอร์ตมอเตอร์ (ขวา): สามารถเชื่อมต่อมอเตอร์ได้ 3 ตัว แต่มอเตอร์ทั้ง 3 ตัวถูกควบคุมโดยสัญญาณเดียวกันคือ Pin 2 และ Pin 3
- พอร์ตมอเตอร์ (ซ้าย): สามารถเชื่อมต่อมอเตอร์ได้ 3 ตัว แต่มอเตอร์ทั้ง 3 ตัวถูกควบคุมโดยสัญญาณเดียวกัน Pin 4 และ Pin 5
- ประเภทพอร์ต: XH2.54-2P
- RGB Strip
- พอร์ตสำหรับการเชื่อมต่อแถบ LED RGB
- ประเภทพอร์ต: ZH1.5-4P
- LEFT/RIGHT IR
- ใช้สำหรับเชื่อมต่อโมดูล IR 2 ตัว
- โมดูล IR ด้านซ้ายเชื่อมต่อกับ Pin 8
- โมดูล IR ด้านขวาเชื่อมต่อกับ Pin 7
- ประเภทพอร์ต: ZH1.5-3P
- CAMERA
- พอร์ตสำหรับ ESP32 Cam Adapter Board
- ประเภทพอร์ต: ZH1.5, 5P
- SONAR
- ในการเชื่อมต่อโมดูล Ultrasonic โดย Pin Trig และ Pin Echo ทั้งสองจะเชื่อมต่อที่ Pin 10 ของบอร์ด Arduino
- ประเภทพอร์ต: ZH1.5, 4P
- Mode Switch
- ESP32-CAM และบอร์ด Arduino ใช้ RX (รับ) และ TX (ส่งสัญญาณ) Pin เดียวกัน
- การอัพโหลดโปรแกรม จะต้องเลื่อนสวิตช์นี้ไปทางด้านขวาเพื่อยกเลิกการเชื่อมต่อกับ ESP32-CAM
- หากเมื่อต้องการใช้กล้อง ให้เลื่อนสวิตช์นี้ไปทางซ้ายเพื่อให้ ESP32-CAM สามารถสื่อสารกับบอร์ด Arduino ได้ปกติ
- SOLAR
- พอร์ตสำหรับแผงโซลาร์เซลล์ ซึ่งสามารถชาร์จแบตเตอรี่ได้เมื่อเสียบเข้ากับแผงโซลาร์เซลล์
- ประเภทพอร์ต: XH2.54, 2P
ESP32 CAM
ESP32-CAM เป็นโมดูลกล้องขนาดเล็ก ที่มีชิปประมวลผลด้วย ESP32-S โดยมีกล้องชนิด OV2640 และ GPIO 10 ตัว สำหรับเชื่อมต่ออุปกรณ์ต่างได้อีก อีกทั้งยังมีช่องเสียบการ์ด microSD เพื่อใช้ในการจัดเก็บภาพที่ถ่ายด้วยกล้องหรือการจัดเก็บไฟล์ มีขนาดเพียง 27 x 40.5 x 4.5 มม. และกินกระแสไฟต่ำเพียง 6mA
ESP32 Cam Adapter Board
บอร์ด ESP32 Cam Adapter คือบอร์ดขยายสำหรับ ESP-32 CAM ซึ่งใช้ในการขยาย Pin เพื่อให้สามารถเชื่อมต่อกับหุ่นยนต์ Galaxy RVR ได้ง่ายขึ้น
การเชื่อมต่อพอร์ต ESP32 Cam Adapter Board กับ บอร์ดขยาย SunFounder Galaxy RVR ใช้ช่อง Camera ช่องเสียบขั้วต่อชนิด ZH 1.5 – 5P
Ultrasonic Module
เซ็นเซอร์วัดระยะ Ultrasonic HC-SR04 ใช้วัดระยะทางแบบไม่สัมผัสตั้งแต่ 2 ซม. ถึง 400 ซม. โดยมีช่วงความแม่นยำสูงสุด 3 มม.
โดยมีคุณสมบัติดังนี้
- แรงดันใช้งาน: DC5V
- กระแสในการทำงาน: 16mA
- ความถี่ในการทำงาน: 40Hz
- ระยะสูงสุด: 500 ซม
- ช่วงต่ำสุด: 2 ซม
- ตัวเชื่อมต่อ: XH2.54-4P
- ขนาด: 46 x 20.5 x 15 มม.
การเชื่อมต่อพอร์ต Ultrasonic Module กับ บอร์ดขยาย SunFounder Galaxy RVR ใช้ช่อง Sonar ช่องเสียบขั้วต่อชนิด XH2.54-4P
IR Obstacle Avoidance Module
โมดูลการหลีกเลี่ยงอุปสรรคแบบ IR เป็นโมดูลหลีกเลี่ยงสิ่งกีดขวางอินฟราเรดที่สามารถตรวจจับวัตถุที่อยู่ข้างหน้าได้ โดยทั่วไปจะใช้ในหุ่นยนต์ ระบบอัตโนมัติ ช่วงระยะของการตรวจจับตั้งแต่ 2 ซม. ถึง 40 ซม. และวัตถุที่มีสีแตกต่างกันมีระดับการสะท้อนแสงต่างกัน ดังนั้น ยิ่งวัตถุมีสีเข้ม ระยะการตรวจจับก็จะยิ่งสั้นลง
โมดูล IR ประกอบด้วยส่วนของการส่งและรับ IR หนึ่งคู่ โดยทั่วไปจะส่งสัญญาณแสงอินฟราเรดออกมา เมื่อแสงอินฟราเรดที่ปล่อยออกมากระทบกับวัตถุสะท้อนกลับมายังตัวรับแสง และเมื่อตรวจพบไฟบนบอร์ดเซนเซอร์จะแสดงสถานะ และมันจะส่งสัญญาณระดับต่ำออกมายังขา OUTPUT
การเชื่อมต่อพอร์ต IR Obstacle Avoidance Module กับ บอร์ดขยาย SunFounder Galaxy RVR ใช้ช่อง IR LEFT และ IR RIGHT ช่องเสียบขั้วต่อชนิด ZH1.5-3P ทั้ง 2 ช่อง
RGB LEDs Strip
แผงไฟ LED RGB ชนิด R5050 จำนวน 4 ดวง สามารถสร้างเฉดสีใดๆ ก็ได้ ด้วยการรวมแม่สีทั้งสามสีเข้าด้วยกัน ได้แก่ แดง น้ำเงิน และเขียว
การเชื่อมต่อพอร์ต RGB LEDs Strip กับ บอร์ดขยาย SunFounder Galaxy RVR โดยใช้ช่อง RGB Strip ช่องเสียบขั้วต่อชนิด ZH1.5-4P ทั้ง 2 เส้น
TT Gear Motor
เป็นมอเตอร์ที่มาพร้อมกับชุดเกียร์ โดยเกียร์ทั้งหมดอยู่ในโครงสร้างพลาสติกที่ทนทาน โดยมีอัตราทดเกียร์ 1:120 มาพร้อมกับสายไฟขนาด 250 มม. จำนวน 2 เส้นพร้อมขั้วต่อ XH2.54-2P สามารถจ่ายไฟ 3VDC ได้
คุณสมบัติของ TT DC Motor
- แรงดันไฟฟ้าที่ใช้: 3V ~ 4.5V DC
- จำนวนเพลา: เพลาเดี่ยว
- อัตราทดเกียร์: 1:120
- กระแสไฟฟ้าที่ไม่มีโหลด: 130mA
- ความเร็วรอบขณะมีโหลด: 38rpm±8%rpm
- แรงดันไฟฟ้าเริ่มต้น: 2V (สูงสุด) เมื่อไม่มีโหลด
- แรงบิดเอาท์พุต: 3V ≥ 1.2 kgf.cm
- อายุการใช้งาน: 70-120H
- ทิศทางการหมุน: สองทิศทาง
- ขนาด: 70 x 22.5 x 36.6 มม
- สายไฟ: สีเทาและสีดำ 24 AWG ยาว 250 มม.
- ขั้วต่อ: สีขาว XH2.54-2P
- น้ำหนัก: 28.5ก
การเชื่อมต่อพอร์ต TT Gear Motor กับ บอร์ดขยาย SunFounder Galaxy RVR ใช้ช่อง Motor Port(Left) และ (Right) ช่องเสียบขั้วต่อชนิด XH2.54-2P
Wheels
ล้อที่ใช้กับหุ่นยนต์ SunFounder Galaxy RVR มีจำนวน 6 ล้อ มีขนาดเส้นผ่าศูนย์กลาง 75 มม หน้ากว้าง 37 มม วัสดุยางสังเคราะห์สามารถลุยบนพื้นทุกชนิด
Servo Motor
เซอร์โวมอเตอร์ SunFounder ใช้ในการควบคุมตำแหน่งเชิงมุมmujมีความแม่นยำสูง แตกต่างจากมอเตอร์ทั่วไปที่จะหมุนอย่างต่อเนื่อง แต่เซอร์โวมอเตอร์สามารถเคลื่อนที่ไปยังตำแหน่งที่ต้องการและล็อคตำแหน่งไว้ได้อย่างแม่นยำ โดยเซอร์โวมอเตอร์ในชุดหุ่นยนต์เป็นเฟืองโลหะ ใช้กำลังไฟที่ 4.8 – 7.4 โวลล์ หมุนได้ 180 องศา โดยทั่วไปเซอร์โวมอเตอร์จะถูกใช้งานต่างๆ ที่ต้องการควบคุมตำแหน่งของวัตถุหรือกลไกอย่างแม่นยำ
คุณสมบัติของเซอร์โวมอเตอร์
- ประเภทมอเตอร์: มอเตอร์แกน
- แรงดันไฟฟ้าที่ใช้งาน: 4.8 ~ 6V DC
- กระแสไฟสแตนด์บาย: ≤4 mA
- กระแสการบริโภค (ที่ 4.8V ไม่มีโหลด): ≦50mA
- การบริโภคปัจจุบัน (ที่ 6 V ไม่มีโหลด): ≦60mA
- แผงลอยปัจจุบัน (ที่ล็อค 4.8V): ≦550mA
- แผงลอยปัจจุบัน (ที่ล็อค 6V): ≦650mA
- แรงบิดสูงสุด: 4.8V, ≥0.6 kgf·cm; 6V, ≥0.7 กก.เอฟ·ซม
- สูงสุด แรงบิด: 4.8V, ≥1.4 กก.ซม.; 6V, ≥1.6 กก.ซม
- ความเร็วรอบขณะโหลด: 4.8V, ≦0.14sec/60°; 6V, ≦0.12วินาที/60°
- หมายเหตุ: การป้องกันแรงบิด: ≥0.9 kgf.cm การป้องกันไฟฟ้าขัดข้องหลังจากต่อเนื่องเป็นเวลา 5 วินาที
- ช่วงอุณหภูมิในการทำงาน: -10 ℃ ~ + 50 ℃
- ช่วงอุณหภูมิในการจัดเก็บ: -20 ℃ ~ + 60 ℃
- ช่วงความชื้นในการทำงาน: ≤ 90% RH
- น้ำหนัก: 10± 0.5ก
- วัสดุ: เอบีเอส
- มุมการทำงาน: 180°±10°(500~2500us)
- มุมจำกัดทางกล: 360°
- มุมการเดินทางซ้ายและขวา: ≤ 6 °
- ส่วนเบี่ยงเบนตรงกลาง: ≤ 1°
- ขนตาด้านหลัง: ≤ 4 us
- ประเภทเครื่องขยายเสียง: ดิจิตอล
- วัสดุสายเคเบิล: Ф1.08,19 PVC
- ความยาวสายเคเบิล: 245 ± 5 มม. (Exsert ไม่มีปลั๊ก)
- ประเภทตัวเชื่อมต่อ: JR2.54mm/3Pin
แผงโซลาร์เซลล์
แผงโซลาร์เซลล์เป็นอุปกรณ์ที่แปลงพลังงานแสงอาทิตย์เป็นพลังงานไฟฟ้า ประกอบด้วยเซลล์สุริยะ (PV) ซึ่งทำจากวัสดุเซมิคอนดักเตอร์ เช่น ซิลิคอน เมื่อแสงแดดกระทบเซลล์ PV มันจะผลักอิเล็กตรอนออกจากอะตอม อิเล็กตรอนเหล่านี้ไหลผ่านเซลล์ทำให้เกิดกระแสไฟฟ้า แผงโซลาร์เซลล์สามารถนำไปใช้ผลิตไฟฟ้าเพื่อวัตถุประสงค์ที่หลากหลาย รวมถึงการจ่ายไฟให้กับบ้าน ธุรกิจ และแม้แต่ชุมชนทั้งหมด เป็นแหล่งพลังงานที่สะอาดและหมุนเวียนได้ซึ่งสามารถช่วยลดการพึ่งพาเชื้อเพลิงฟอสซิลได้
คุณสมบัติแผงโซล่าเซลล์
- กำลังขับ: 6V/660mA
- เวลาในการชาร์จแบตเตอรี่ให้เต็ม: 7.2 ชม. (ตามทฤษฎี สมมติว่ามีแสงแดดจ้า)
- ขนาด: 170มม.x 170มม
- สายไฟ: สีเทาและสีดำ 24AWG 200 มม
- ขั้วต่อ: สีขาว XH2.54-2P
Battery
ชุดแบตเตอรี่ผลิตโดยบริษัท SunFounder ซึ่งประกอบด้วยแบตเตอรี่ 18650 สองก้อนที่มีความจุ 2000mAh ขั้วต่อคือ XH2.54 3P ซึ่งสามารถชาร์จได้โดยตรงหลังจากใส่เข้าไปในบอร์ดขยาย SunFounder Galaxy RVR
คุณสมบัติ
- การชาร์จแบตเตอรี่: 5V/2A
- เอาท์พุทแบตเตอรี่: 5V/5A
- ความจุแบตเตอรี่: 3.7V 2000mAh x 2
- อายุการใช้งานแบตเตอรี่: 90 นาที
- เวลาในการชาร์จแบตเตอรี่: 130 นาที
- ตัวเชื่อมต่อ: XH2.54 3P
การจัดการด้านพลังงานของหุ่นยนต์ SunFounder Galaxy RVR
ส่วนประกอบหลักของระบบพลังงานนี้คือแบตเตอรี่และแผงโซลาร์เซลล์สามารถชาร์จไฟได้ด้วยแสดงอาทิตย์ ซึ่งมีการทำงานควบคู่กันหุ่นยนต์ GalaxyRVR จึงสามารถทำงานได้ตลอดเวลาทั้งกลางวันและกลางคืน
การเริ่มต้นใช้งานหุ่นยนต์ SunFounder Galaxy RVR
การเขียนโปรแกรมหุ่นยนต์ Galazy RVR จะเป็นการเขียนโปรแกรมด้วยภาษา C โดยในที่นี้จะใช้ Arduino IDE ในการเขียนโปรแกรมและอัพโหลดโค้ดลงไปในหุ่นยนต์ โดยการติดตั้งโปรแกรม Arduino IDE สามารถดาวน์โหลดและติดตั้งได้ที่ >>> Link <<< นี้
การติดตั้งไลบารี่ชุดคำสั่งของหุ่นยนต์ SunFounder Galaxy RVR จะมีทั้งหมด 3 ชุดคำสั่ง
โดยชุดคำสั่งแรก คือ Servo ให้เข้าไปที่ Library Manager >>> พิมพ์ในช่องค้นหา “Servo” จากนั้นคลิ๊ก “Install” ตามภาพด้านล่าง
โดยชุดคำสั่งที่สอง คือ SoftPWM ให้เข้าไปที่ Library Manager >>> พิมพ์ในช่องค้นหา “SoftPWM” จากนั้นคลิ๊ก “Install” ตามภาพด้านล่าง
โดยชุดคำสั่งที่สอง คือ SunFounder AI Camera ให้เข้าไปที่ Library Manager >>> พิมพ์ในช่องค้นหา “SunFounder AI Camera” จากนั้นคลิ๊ก “Install” ตามภาพด้านล่าง
การอัพโหลดโปรแกรมเข้าบอร์ด SunFounder UNO จะต้องเลื่อนสวิตช์นี้ไปทางด้านขวาเพื่อยกเลิกการเชื่อมต่อกับ ESP32-CAM
เลื่อนไปที่ “ON” เพื่อเปิดหุ่นยนต์ GalaxyRVR
ทดสอบเขียนโปรแกรมแสดงไฟ LED แบบ RGB
ในการทดสอบไฟ LED RGB เราได้ทำการทดสอบด้วยการเปลี่ยนสีไฟหลายๆสีวนลูปไปเรื่อยๆ ดูโค้ดตัวอย่างได้จากด้านล่าง
โค้ดที่ใช้ในการทดสอบ
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 |
#include <SoftPWM.h> // Include the SoftPWM library // Define the pin numbers for the RGB strips const int bluePin = 11; const int redPin = 12; const int greenPin = 13; /* Calibrate brightness */ #define R_OFFSET 1.0 #define G_OFFSET 0.25 #define B_OFFSET 0.45 void setup() { SoftPWMBegin(); // Initialize software-based PWM on all pins } void loop() { // Set different colors with a delay of 1 second (1000 ms) in between setColor(255, 0, 0); // Set the color to red delay(1000); setColor(255, 128, 0); // Set the color to orange delay(1000); setColor(255, 255, 0); // Set the color to yellow delay(1000); setColor(0, 255, 0); // Set the color to green delay(1000); setColor(0, 0, 255); // Set the color to blue delay(1000); setColor(0, 255, 255); // Set the color to lightblue delay(1000); setColor(255, 0, 255); // Set the color to purple delay(1000); setColor(255, 255, 255); // Set the color to white delay(1000); } // Define a function to set color void setColor(int red, int green, int blue) { SoftPWMSet(redPin, red * R_OFFSET); // Set red color SoftPWMSet(greenPin, green * G_OFFSET); // Set green color SoftPWMSet(bluePin, blue * B_OFFSET); // Set blue color } |
ทดสอบเขียนโปรแกรมควบคุมเซอร์โวมอเตอร์ยกขึ้น-ลงของกล้อง ESP32
ในการทดสอบเราได้เขียนโค้ดทดสอบขึ้น – ลงโดยเริ่มจาก 0 องศาถึง 180 องศา หน่วงเวลาในการเปลี่ยนองศาทุกๆ 100 มิลลิวินาที ดูโค้ดตัวอย่างได้จากด้านล่าง
โค้ดที่ใช้ในการทดสอบ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <Servo.h> Servo myServo; // create a servo object void setup() { myServo.attach(6); // attaches the servo on pin 6 Serial.begin(9600); // initialize serial communication at a baud rate of 9600 } void loop() { for (int i = 0; i <= 180; i++) { // loop from 0 to 180 degrees Serial.print("The angle is: "); // print angle information Serial.println(i); // print the current angle value myServo.write(i); // control the servo to move to the current angle delay(100); // delay for 100 milliseconds } } |
ทดสอบเขียนโปรแกรมการเคลื่อนที่ของหุ่นยนต์ SunFounder Galaxy RVR
ในการทดสอบเราได้เขียนฟังก์ชั่นการเคลื่อนที่ เดินหน้า, เลี้ยวซ้าย, เลี้ยวขวา, ถอยหลัง, หยุดหุ่นยนต์, โดยมีสั่งการทำงานแบบลำดับขั้นตอน ดูโค้ดตัวอย่างได้จากด้านล่าง
โค้ดที่ใช้ในการทดสอบ
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 |
#include <SoftPWM.h> // Define the pins of motors const int in1 = 2; const int in2 = 3; const int in3 = 4; const int in4 = 5; void setup() { // Initialize SoftPWM SoftPWMBegin(); } void loop() { moveForward(200); // Move the Rover forward delay(1000); turnLeft(200); // Turn the Rover to the left delay(1000); moveForward(200); // Move the Rover forward delay(1000); turnLeft(200); // Turn the Rover to the left delay(1000); moveForward(200); // Move the Rover forward delay(1000); moveBackward(200); // Move the Rover backward delay(1000); turnRight(200); // Turn the Rover to the right delay(1000); stopMove(); // Stop the Rover delay(5000); } void moveForward(int speed) { // Set the left motors rotate counterclockwise SoftPWMSet(in1, speed); SoftPWMSet(in2, 0); // Set the right motors rotate clockwise SoftPWMSet(in3, 0); SoftPWMSet(in4, speed); } void moveBackward(int speed) { // Set the left motors rotate clockwise SoftPWMSet(in1, 0); SoftPWMSet(in2, speed); // Set the right motors rotate counterclockwise SoftPWMSet(in3, speed); SoftPWMSet(in4, 0); } void turnLeft(int speed) { // Set al motors to rotate clockwise SoftPWMSet(in1, 0); SoftPWMSet(in2, speed); SoftPWMSet(in3, 0); SoftPWMSet(in4, speed); } void turnRight(int speed) { // Set all motors to rotate counterclockwise SoftPWMSet(in1, speed); SoftPWMSet(in2, 0); SoftPWMSet(in3, speed); SoftPWMSet(in4, 0); } void stopMove() { // Stop all the motors SoftPWMSet(in1, 0); SoftPWMSet(in2, 0); SoftPWMSet(in3, 0); SoftPWMSet(in4, 0); } |
ทดสอบเขียนโปรแกรมการหลบหลีกสิ่งกีดขวางด้วยเซนเซอร์ Ultrasonic
ในการทดสอบเราได้เขียนฟังก์ชั่นการอ่านค่าเซนเซอร์ Ultrasonic และเขียนเงื่อนไขว่า
- ถ้าเซนเซอร์อ่านค่าได้มากกว่า 50 เซนติเมตร ให้หุ่นยนต์เดินหน้า
- หรือถ้าเซนเซอร์อ่านค่าน้อยกว่า 15 เซนติเมตร และอ่านค่ามากกว่า 1 เซนติเมตร ให้หุ่นยนต์ถอยหลังเป็นเวลา 500 มิลลิวินาที และถอยหลังเฉพาะล้อซ้ายเป็นเวลา 1.5 วินาที
- หรือนอกเหนือจากเงื่อนไขอื่นๆให้หุ่นยนต์เดินหน้า
สามารถดูโค้ดตัวอย่างได้จากด้านล่าง
โค้ดที่ใช้ในการทดสอบ
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 |
#include <SoftPWM.h> // Define the pin for the ultrasonic module #define ULTRASONIC_PIN 10 // Define the pins of motors const int in1 = 2; const int in2 = 3; const int in3 = 4; const int in4 = 5; void setup() { // Initialize SoftPWM SoftPWMBegin(); //Serial.begin(9600); } void loop() { // Read distance from ultrasonic sensor float distance = readSensorData(); //Serial.println(distance); // Output distance for debugging // Control rover based on distance reading if (distance > 50) { // If it's safe to move forward moveForward(200); } else if (distance < 15 && distance > 1) { // If there's an obstacle close moveBackward(200); delay(500); // Wait for a while before attempting to turn backLeft(150); delay(1000); } else { // For distances in between, proceed with caution moveForward(150); } } float readSensorData() { // A 4ms delay is required, otherwise the reading may be 0 delay(4); //Set to OUTPUT to send signal pinMode(ULTRASONIC_PIN, OUTPUT); // Clear the trigger pin digitalWrite(ULTRASONIC_PIN, LOW); delayMicroseconds(2); // Trigger the sensor by sending a high pulse for 10us digitalWrite(ULTRASONIC_PIN, HIGH); delayMicroseconds(10); // Set the trigger pin back to low digitalWrite(ULTRASONIC_PIN, LOW); //Set to INPUT to read pinMode(ULTRASONIC_PIN, INPUT); // pulseIn returns the duration of the pulse on the pin float duration = pulseIn(ULTRASONIC_PIN, HIGH); // Calculate the distance (in cm) based on the speed of sound (340 m/s or 0.034 cm/us) float distance = duration * 0.034 / 2; return distance; } void moveForward(int speed) { // Set the left motors rotate counterclockwise SoftPWMSet(in1, speed); SoftPWMSet(in2, 0); // Set the right motors rotate clockwise SoftPWMSet(in3, 0); SoftPWMSet(in4, speed); } void moveBackward(int speed) { // Set the left motors to rotate clockwise SoftPWMSet(in1, 0); // Stop SoftPWMSet(in2, speed); // Full speed // Set the right motors to rotate counterclockwise SoftPWMSet(in3, speed); // Full speed SoftPWMSet(in4, 0); // Stop } // Function to turn to the back left void backLeft(int speed) { SoftPWMSet(in1, 0); SoftPWMSet(in2, 0); SoftPWMSet(in3, speed); SoftPWMSet(in4, 0); } |
ทดสอบเขียนโปรแกรมการหลบหลีกสิ่งกีดขวางด้วยเซนเซอร์ IR Obstacle Avoidance Module
ในการทดสอบเราได้เขียนเงื่อนไขการอ่านค่าเซนเซอร์ IR ว่า
- ถ้าเซนเซอร์ IR ด้านขวาตรวจจับเจอวัตถุและเซนเซอร์ IR ด้านซ้ายไม่เจอวัตถุ ให้หุ่นยนต์เลี้ยวถอยหลังขวาด้วยความเร็ว 150
- หรือถ้าเซนเซอร์ IR ด้านขวาตรวจจับไม่เจอวัตถุและเซนเซอร์ IR ด้านซ้ายเจอวัตถุ ให้หุ่นยนต์เลี้ยวถอยหลังซ้ายด้วยความเร็ว 150
- หรือถ้าเซนเซอร์ IR ด้านขวาตรวจจับเจอวัตถุ และเซนเซอร์ IR ด้านซ้ายเจอวัตถุ ให้หุ่นยนต์เลี้ยวถอยหลังพร้อมกันด้วยความเร็ว 150
- หรือนอกเหนือจากเงื่อนไขอื่นๆให้หุ่นยนต์เดินหน้า
สามารถดูโค้ดตัวอย่างได้จากด้านล่าง
โค้ดที่ใช้ในการทดสอบ
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 |
#include <SoftPWM.h> // Define the pins of motors const int in1 = 2; const int in2 = 3; const int in3 = 4; const int in4 = 5; // Define the pins for the IR modules #define IR_RIGHT 7 #define IR_LEFT 8 void setup() { // Initialize SoftPWM SoftPWMBegin(); // Set the IR module pins as inputs pinMode(IR_RIGHT, INPUT); pinMode(IR_LEFT, INPUT); } void loop() { // Read values from IR sensors int rightValue = digitalRead(IR_RIGHT); int leftValue = digitalRead(IR_LEFT); // Based on IR sensor readings, control rover's movements if (rightValue == 0 && leftValue == 1) { // Right path blocked backRight(150); } else if (rightValue == 1 && leftValue == 0) { // Left path blocked backLeft(150); } else if (rightValue == 0 && leftValue == 0) { // Both paths blocked moveBackward(150); } else { // Paths clear moveForward(150); } delay(100); } // Function to move the rover backward void moveBackward(int speed) { // Set the left motors to rotate clockwise SoftPWMSet(in1, 0); // Stop SoftPWMSet(in2, speed); // Full speed // Set the right motors to rotate counterclockwise SoftPWMSet(in3, speed); // Full speed SoftPWMSet(in4, 0); // Stop } void moveForward(int speed) { // Set the left motors rotate counterclockwise SoftPWMSet(in1, speed); SoftPWMSet(in2, 0); // Set the right motors rotate clockwise SoftPWMSet(in3, 0); SoftPWMSet(in4, speed); } // Function to turn to the back right void backRight(int speed) { SoftPWMSet(in1, 0); SoftPWMSet(in2, speed); SoftPWMSet(in3, 0); SoftPWMSet(in4, 0); } // Function to turn to the back left void backLeft(int speed) { SoftPWMSet(in1, 0); SoftPWMSet(in2, 0); SoftPWMSet(in3, speed); SoftPWMSet(in4, 0); } |
ทดสอบเขียนโปรแกรมส่งภาพจากกล้องแสดงบน Web Browser
ในการทดสอบการ Streaming ภาพจากกล้อง ESP32 ขึ้นบน Web Browser จะต้องทำการเชื่อมต่อเครือข่าย WiFi และทำการเปิด Web Browser ตาม IP ของตัวหุ่นยนต์เช่น 192.168.1.xxx สามารถดู IP ได้จาก Terminal ของ Arduino IDE หลังจากอัพโหลดโปรแกรมเสร็จ สามารถดูโค้ดตัวอย่างได้จากด้านล่าง
โค้ดที่ใช้ในการทดสอบ
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 |
#include "SunFounder_AI_Camera.h" // Wifi configuration and credentials // AP Mode // #define WIFI_MODE WIFI_MODE_AP // #define SSID "GalaxyRVR" // #define PASSWORD "12345678" // STA Mode #define WIFI_MODE WIFI_MODE_STA #define SSID "YOUR SSID" #define PASSWORD "YOUR PASSWORD" // Device configuration #define NAME "GalaxyRVR" // Device name #define TYPE "AiCamera" // Device type #define PORT "8765" // Port for the SunFounder Controller APP // Create AiCamera Object AiCamera aiCam = AiCamera(NAME, TYPE); void setup() { // Initialize Serial(optional, if you need to debug) Serial.begin(115200); // Initialize AiCamera aiCam.begin(SSID, PASSWORD, WIFI_MODE, PORT); // Set command timeout (optional, default 100) aiCam.setCommandTimeout(100); } void loop() { // AiCamera loop. must put it in loop(). And more importantly, every time loop // runs, a perioad of data send receive runs, so loop must be fast enough. // or it will be laggy or even stuck by other code. aiCam.loop(); } |
ทดสอบการควบคุมหุ่นยนต์ผ่าน Application
ในการทดสอบควบคุมหุ่นยนต์ผ่าน App คือการรวมโค้ดทุกคำสั่งที่ใช้งานกับหุ่นยนต์สามารถเลือกเปิดการทำงานได้ผ่าน App ได้ อีกทั้งยังสามารถส่งภาพจาก ESP32 Cam ขึ้นมายัง UI ของ APP ได้อีกด้วย สามารถดูโค้ดตัวอย่างได้ด้านล่าง
โค้ดที่ใช้ในการทดสอบ
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 |
#include "SunFounder_AI_Camera.h" #include <Servo.h> #include <SoftPWM.h> // Create a Servo object Servo myServo; // Wifi configuration and credentials // In AP Mode #define WIFI_MODE WIFI_MODE_AP #define SSID "GalaxyRVR" #define PASSWORD "12345678" // Device configuration #define NAME "GalaxyRVR" // Device name #define TYPE "AiCamera" // Device type #define PORT "8765" // Port for the SunFounder Controller APP // Create an AiCamera object AiCamera aiCam = AiCamera(NAME, TYPE); // Define the pins of motors const int in1 = 2; const int in2 = 3; const int in3 = 4; const int in4 = 5; void setup() { // Initialize Serial for debugging Serial.begin(115200); // Attach the servo on pin 6 myServo.attach(6); // Initialize the AiCamera aiCam.begin(SSID, PASSWORD, WIFI_MODE, PORT); // Set the function to execute when data is received aiCam.setOnReceived(onReceive); // Set the command timeout aiCam.setCommandTimeout(100); // Initialize SoftPWM SoftPWMBegin(); // Stop all the motors SoftPWMSet(in1, 0); SoftPWMSet(in2, 0); SoftPWMSet(in3, 0); SoftPWMSet(in4, 0); } void loop() { // Must include this in the loop. Handles data sending and receiving from the Controller. aiCam.loop(); } // Function to execute when data is received from the Controller void onReceive() { // Get the value of the slider in region D int16_t sliderD = aiCam.getSlider(REGION_D); // Move the servo to the angle indicated by the slider myServo.write(int(sliderD)); // Get the throttle values for the left and right int throttle_L = aiCam.getThrottle(REGION_K); int throttle_R = aiCam.getThrottle(REGION_Q); // Set the power for the motors carSetMotors(throttle_L, throttle_R); } // Function to set the power of the motors void carSetMotors(int8_t power_L, int8_t power_R) { // Set power for the left motor if (power_L >= 0) { SoftPWMSet(in1, map(power_L, 0, 100, 0, 255)); SoftPWMSet(in2, 0); } else { SoftPWMSet(in1, 0); SoftPWMSet(in2, map(power_L, 0, -100, 0, 255)); } // Set power for the right motor if (power_R >= 0) { SoftPWMSet(in3, 0); SoftPWMSet(in4, map(power_R, 0, 100, 0, 255)); } else { SoftPWMSet(in3, map(power_R, 0, -100, 0, 255)); SoftPWMSet(in4, 0); } } |
เชื่อมต่อ WiFi กับ SmartPhone
ทำการค้นหาชื่อตาม SSID ที่เราอัพโหลดโปรแกรมลงไป ในที่นี้เราใช้ชื่อ GalaxyRVR
ทำการเชื่อมต่อเรียบร้อย
SunFounder Controller APP
โดยสามารถค้นหา “SunFounder Controller” สามารถดาวน์โหลดได้ทั้งระบบ Android และ IOS
เปิด App ขึ้นมาเลือก Connect หัวมุมขวาด้านบน
หลังจากเชื่อมต่อหุ่นยนต์สำเร็จจะขึ้นชื่อหุ่นยนต์ GalaxyRVR ขึ้นมา
จากนั้นกดไอคอน + ทำการเลือก User Interface “GalaxyRVR”
จากนั้นกด Play ที่หัวมุมบนด้านขวาเพื่อทำการแสดงภาพจากกล้อง ESP32 Cam
จากนั้นก็สามารถทำการควบคุมหุ่นยนต์ GalaxyRVR ได้ครบทุกฟังก์ชั่น ไม่ว่าจะเป็น แสดงไฟ RGB, การเคลื่อนที่ควบคุมผ่าน Application, การหลบหลีกสิ่งกีดขวาง, สั่งการหุ่นยนต์ด้วยเสียง สามารถดูเพิ่มเติมได้จากวีดีโอด้านล่าง
วิดีโอการทดสอบ
สรุป
ชุดหุ่นยนต์ชุด GalaxyRVR เรียกได้ว่าเรียนรู้ถึงความแปลกใหม่ ปกติเราจะเห็นหุ่นยนต์ที่คล้ายๆรถ แต่กับหุ่นยนต์ชุดนี้ได้เรียนรู้ระบบ Rocker-Bogie รวมถึงระบบต่างๆที่ใกล้เคียงหุ่นยนต์สำรวจดาวเคราะห์ของ NASA อีกทั้งยังมีฟังก์ชั่นต่างๆ มากมาย ไม่ว่าจะเป็นการหลบหลีกสิ่งกีดขวาง การแสดงไฟ RGB รวมถึงการแสดงภาพส่งสัญญาณด้วยเครือข่าย WiFi เหมาะกับผู้ที่สนใจในการเรียนรู้เขียนโปรแกรมด้วย Arduino หรือนำไปใช้การเรียนในการสอนในห้องเรียนวิทยาศาสตร์หรือ วิชาดาราศาตร์ ที่นำเอาเทคโนโลยีหุ่นยนต์เข้าไปร่วมในการเรียนการสอนสมัยใหม่ได้เป็นอย่างดีผู้ที่สนใจสามารถดูรายละเอียดของหุ่นยนต์ GalaxyRVR เพิ่มเติมได้ที่เว็ปไซด์ของบริษัท
ผมต้องขอขอบคุณบริษัท SunFounder ที่ส่งชุดหุ่นยนต์ GalaxyRVR มาทดสอบ ผู้ที่สนใจสามารถหาซื้อชุดหุ่นยนต์ GalaxyRVR ด้วยราคา $129.99(~4,600฿) บนร้านค้าออนไลน์ของบริษัท หรือบน Amazon
กรรมการผู้จัดการของโรงเรียนเกี่ยวกับหุ่นยนต์ในจ.เชียงใหม่, ชนะเลิศการแข่งขันหุ่นยนต์ต่างๆ ทั้งในและต่างประเทศ ได้แก่ Robocon และ Makerthon