คู่มือการเขียนโค้ด
เอกสารนี้อธิบายเกี่ยวกับ RobomationLAB ซึ่งเป็นแพลตฟอร์มการศึกษาการเขียนโค้ดหุ่นยนต์ หนึ่งใน 'เอนจินการทำงานและสภาพแวดล้อมการสร้างงานแบบบูรณาการสำหรับบริการสตรีมมิงการเคลื่อนไหวของหุ่นยนต์' ที่พัฒนาโดย Robomation
เนื้อหาอธิบายโดยละเอียดตามลำดับดังนี้:
- คุณลักษณะสำคัญของ RobomationLAB
- วิธีการเขียนโปรแกรมหุ่นยนต์ของ RobomationLAB
- ระบบไวยากรณ์พื้นฐานในการเขียนโค้ดหุ่นยนต์ของ RobomationLAB
สารบัญ
แพลตฟอร์มการศึกษาการเขียนโค้ดหุ่นยนต์ RobomationLAB
1-1) โปรแกรมเขียนโค้ดหุ่นยนต์
1-2) การแปลงสองทางแบบเรียลไทม์ระหว่างบล็อกกับ Python
1-3) คุณลักษณะสำคัญของโปรแกรมเขียนโค้ด
1-4) วิธีควบคุมหุ่นยนต์แบบเรียลไทม์วิธีการเขียนโปรแกรมหุ่นยนต์ของ RobomationLAB
2-1) การทำงานตามลำดับและการทำงานแบบขนาน
2-2) ฟังก์ชัน setup
2-3) ฟังก์ชัน loopระบบไวยากรณ์พื้นฐานในการเขียนโค้ดหุ่นยนต์ของ RobomationLAB
3-1) การนำเข้าแพ็กเกจ robomation
3-2) การสร้างอินสแตนซ์ของหุ่นยนต์
3-3) เมธอดควบคุมหุ่นยนต์
3-4) การอ่านค่าเซ็นเซอร์และสถานะ
3-5) การตรวจจับเหตุการณ์
3-6) การรอให้การทำงานเสร็จสิ้น (wait)
3-7) ฟังก์ชันอรรถประโยชน์ (Utils)
แพลตฟอร์มการศึกษาการเขียนโค้ดหุ่นยนต์ RobomationLAB
RobomationLAB เป็นแพลตฟอร์มที่ออกแบบมาเพื่อ การศึกษาซอฟต์แวร์ AI โรโบติกส์ โดยเฉพาะ
และให้สภาพแวดล้อมการสร้างงานแบบบูรณาการบนเว็บเบราว์เซอร์ Chrome สำหรับการศึกษาการเขียนโค้ดหุ่นยนต์ของนักเรียนระดับประถมและมัธยมต้น
RobomationLAB มีโปรแกรมสำหรับการศึกษาการเขียนโค้ดหุ่นยนต์หลากหลายรูปแบบ เช่น การเขียนโค้ดด้วยบล็อก และ การเขียนโค้ดด้วยสคริปต์
ไม่เพียงแต่ได้เรียนรู้ทฤษฎีของการเขียนโค้ด แต่ยังได้ขยับและควบคุมหุ่นยนต์จริงด้วยผลิตภัณฑ์ของ Robomation
จึงเป็นโอกาสให้เรียนรู้การเขียนโค้ดและหุ่นยนต์ไปพร้อมกัน
โปรแกรมเขียนโค้ดหุ่นยนต์
Block Composer
Block Composer เป็นเครื่องมือที่ควบคุมหุ่นยนต์ของบริษัทได้อย่างง่ายและรวดเร็วผ่านการเขียนโค้ดด้วยบล็อก และเรียนรู้พื้นฐานของการควบคุมหุ่นยนต์ได้
สภาพแวดล้อมการสร้างงานที่เหมาะกับฟิสิคัลคอมพิวติ้ง
เขียนโค้ดได้ง่ายแม้เป็นผู้เริ่มต้น ด้วยวิธีลากและวางบล็อก
ให้สภาพแวดล้อมการเรียนรู้ที่ไม่มีข้อผิดพลาดทางไวยากรณ์ตั้งแต่แนวคิดพื้นฐาน
แปลงเป็นโค้ดสคริปต์ Python โดยอัตโนมัติ
มีชุดบล็อกที่กำหนดฟังก์ชันไว้ล่วงหน้าสำหรับหุ่นยนต์แต่ละตัว และตัวอย่างให้ทดลองหลากหลาย
ดูผลลัพธ์แบบเรียลไทม์ได้ด้วยการรันโค้ด
พัฒนาความสามารถในการแก้ปัญหาและความคิดสร้างสรรค์ด้วยการประกอบบล็อก
ให้ข้อเสนอแนะที่เหมาะสมที่สุดผ่านการวิเคราะห์โค้ดสคริปต์ด้วย AI
Script Composer
Script Composer เป็นเครื่องมือที่ควบคุมหุ่นยนต์ของบริษัทได้อย่างง่ายและรวดเร็วผ่านการเขียนโค้ด Python และเรียนรู้พื้นฐานของไวยากรณ์ Python และการเขียนโค้ดหุ่นยนต์ได้
มีตัวแก้ไข Python ให้ใช้งาน
มีฟังก์ชันเติมโค้ดอัตโนมัติและแทรกโค้ดตามภาษา
มีโค้ดตัวอย่างให้ทดลองหลากหลายสำหรับหุ่นยนต์แต่ละตัว
ดูผลลัพธ์แบบเรียลไทม์ได้ด้วยการรันโค้ด
ให้ข้อเสนอแนะที่เหมาะสมที่สุดผ่านการวิเคราะห์โค้ดสคริปต์ด้วย AI
คุณลักษณะสำคัญของโปรแกรมเขียนโค้ด
คุณลักษณะสำคัญของโปรแกรมเขียนโค้ดหุ่นยนต์ที่ RobomationLAB ให้บริการมีดังนี้
- ทำงานบนเว็บเบราว์เซอร์ Chrome จึงไม่ถูกจำกัดด้วยระบบปฏิบัติการ (OS)
- ควบคุมฮาร์ดแวร์หุ่นยนต์โดยตรงผ่านดองเกิล USB บนพื้นฐานการสื่อสาร Web Serial
- รองรับการควบคุมหุ่นยนต์หลายตัวพร้อมกัน โดยไม่จำกัดชนิดและจำนวนหุ่นยนต์
- เมื่อบันทึกไฟล์ ผลงานจะถูกแปลงและบันทึกเป็นไฟล์ข้อความ JSON
วิธีควบคุมหุ่นยนต์แบบเรียลไทม์
โปรแกรมเขียนโค้ดหุ่นยนต์ที่ RobomationLAB ให้บริการจะควบคุมหุ่นยนต์แบบเรียลไทม์ผ่านขั้นตอนดังนี้
- เขียนโค้ดที่กำหนดค่าของอ็อบเจกต์ Effector และ Command เพื่อควบคุมหุ่นยนต์ หรือใช้ค่า Sensor และการเกิด Event ของหุ่นยนต์ ผ่านการเขียนโค้ดด้วยบล็อกหรือการเขียนโค้ดด้วยสคริปต์
- รันโค้ด
- รับแพ็กเก็ตที่บรรจุข้อมูล Sensor และ Event จากหุ่นยนต์ผ่านการสื่อสาร Web Serial แล้วนำไปปรับใช้กับอ็อบเจกต์ Device ของหุ่นยนต์
- ตีความโค้ดแบบเรียลไทม์ แล้วเขียนทับข้อมูลลงในอ็อบเจกต์ Effector, Command หรืออ่านค่าจากอ็อบเจกต์ Sensor, Event
- สร้างแพ็กเก็ตที่สะท้อนข้อมูลของอ็อบเจกต์ Device ของหุ่นยนต์ แล้วส่งไปยังหุ่นยนต์ผ่านการสื่อสาร Web Serial เพื่อตรวจสอบว่าหุ่นยนต์ทำงานจริงหรือไม่
- ขณะที่โค้ดกำลังทำงาน ขั้นตอนที่ 3 ~ 5 จะถูกทำซ้ำทุก ๆ ประมาณ 10 ~ 20ms
การแปลงสองทางแบบเรียลไทม์ระหว่างบล็อกกับ Python
RobomationLAB มีทั้งตัวแก้ไขการเขียนโค้ดด้วยบล็อกและตัวแก้ไขการเขียนโค้ด Python และตัวแก้ไขทั้งสองจะซิงค์กันสองทางแบบเรียลไทม์
- เมื่อเพิ่ม แก้ไข หรือลบบล็อกในตัวแก้ไขการเขียนโค้ดด้วยบล็อก การเปลี่ยนแปลงนั้นจะสะท้อนไปยังโค้ด Python แบบเรียลไทม์
- ในทางกลับกัน เมื่อแก้ไขโค้ดในตัวแก้ไขการเขียนโค้ด Python การเปลี่ยนแปลงนั้นจะสะท้อนไปยังบล็อกแบบเรียลไทม์
เนื่องจากบล็อกกับโค้ด Python สอดคล้องกันแบบหนึ่งต่อหนึ่งและแปลงกันได้สองทาง
จึงเขียนโค้ดได้อย่างยืดหยุ่นข้ามไปมาระหว่างการเขียนโค้ดด้วยบล็อกและการเขียนโค้ดด้วยสคริปต์
เช่น สร้างโครงสร้างทั้งหมดด้วยบล็อกอย่างรวดเร็วแล้วปรับรายละเอียดด้วย Python หรือเรียนรู้ไวยากรณ์ Python ด้วยการเทียบกับบล็อก
อย่างไรก็ตาม การแปลงจาก Python → บล็อก จะทำได้เฉพาะโค้ดที่แสดงด้วยบล็อกได้เท่านั้น
(ถ้าไวยากรณ์ไม่ถูกต้องหรือเป็นโค้ดที่แปลงเป็นบล็อกไม่ได้ อาจสลับไม่ได้
ดูรายละเอียดได้ที่เอกสาร กฎการเขียนโค้ด)
วิธีการเขียนโปรแกรมหุ่นยนต์ของ RobomationLAB
การทำงานตามลำดับและการทำงานแบบขนาน
วิธีการเขียนโปรแกรมหุ่นยนต์มีทั้งแบบทำงานตามลำดับและแบบทำงานขนาน
การทำงานตามลำดับคือวิธีที่ทำงานถัดไปหลังจากการทำงานหนึ่งเสร็จสิ้นแล้ว ซึ่งเหมาะกับการเขียนโค้ดพฤติกรรมอย่างง่าย
ตัวอย่างเช่น ถ้าต้องการให้หุ่นยนต์เคลื่อนที่ไปข้างหน้าแล้วหยุดเพื่อเปิดไฟ LED ก็ต้องเขียนโค้ดของแต่ละการทำงานเรียงตามลำดับให้ทำงานตามเวลาได้ จึงจำเป็นต้องมีวิธีทำงานตามลำดับ
การทำงานแบบขนานคือวิธีที่ทำหลายการทำงานพร้อมกัน ซึ่งจำเป็นสำหรับการเขียนโปรแกรมพฤติกรรมที่ซับซ้อนและก้าวหน้ายิ่งขึ้น
ตัวอย่างเช่น ถ้าต้องการสร้างการเดินของหุ่นยนต์สองขา จำเป็นต้องขยับเท้าและขาของหุ่นยนต์พร้อมกันจึงจะเดินได้ ดังนั้นจึงต้องเขียนโค้ดแบบทำงานขนานได้
โปรแกรมเขียนโค้ดหุ่นยนต์ที่ RobomationLAB ให้บริการ
รองรับทั้งการทำงานตามลำดับและการทำงานแบบขนานพร้อมกัน บนพื้นฐานโครงสร้างโค้ด setup / loop ที่คล้ายกับสภาพแวดล้อมพัฒนา H/W ของ Arduino

เมื่อเข้าใช้งาน Block Composer ครั้งแรก จะเห็นบล็อกฟังก์ชันว่างสองบล็อกแสดงอยู่ในพื้นที่ทำงานดังนี้
บล็อก 'ฟังก์ชัน setup' แทนฟังก์ชัน setup และบล็อก 'ฟังก์ชัน loop' แทนฟังก์ชัน loop
บล็อกจะถูกแปลงเป็นโค้ด Python แบบเรียลไทม์
และโค้ดมีโครงสร้างพื้นฐานดังนี้
# โครงสร้างพื้นฐานของโค้ด Python
from robomation import *
# ใส่โค้ดตั้งค่าที่นี่ เพื่อให้ทำงานครั้งเดียว:
def setup():
pass
# ใส่โค้ดควบคุมที่นี่ เพื่อให้ทำงานซ้ำ:
def loop():
passหากต้องการควบคุมหุ่นยนต์ ให้วาง
from robomation import *ไว้บนสุดของโค้ด แล้วประกาศหุ่นยนต์ที่จะใช้เป็นอินสแตนซ์ (เช่นhamster_s = HamsterS(0))
ฟังก์ชัน setup
ฟังก์ชัน setup จะทำงานเพียงครั้งเดียวในตอนที่ 'รันโค้ด'
ในฟังก์ชัน setup มักเขียนโค้ดสำหรับกำหนดค่าเริ่มต้นของตัวแปร หรือตั้งค่าโหมดและฟังก์ชันของหุ่นยนต์
ตัวอย่างเช่น เมื่อควบคุมหุ่นยนต์ที่เคลื่อนที่ด้วยล้อ สามารถตั้งความเร็วเริ่มต้นของล้อในฟังก์ชัน setup ได้
ถ้าจำเป็นต้องหน่วงเวลาภายในฟังก์ชัน การใช้ฟังก์ชัน Utils.wait(...) จะทำให้เขียนโค้ดที่ทำงานตามลำดับเวลาได้เสมือนแบบซิงโครนัสUtils.wait(...) จะรอตามเวลาที่กำหนด (วินาที) แล้วจึงทำโค้ดถัดไป จึงตื่นขึ้นหลังเวลาหรือการทำงานที่กำหนดแล้วทำโค้ดถัดไปต่อ
เมื่อใช้ความสามารถนี้ จะเขียนโปรแกรมหุ่นยนต์ได้อย่างทรงพลัง ไม่ใช่เพียงการทำงานตามลำดับอย่างง่าย แต่ยังใช้ร่วมกับฟังก์ชัน loop ซึ่งทำหน้าที่ทำงานแบบขนานได้ด้วย
ต่อไปนี้เป็นตัวอย่างการเขียนโค้ดให้หุ่นยนต์ HamsterS เดินหน้า 1 วินาที แล้วถอยหลัง 1 วินาที
ถ้าจะสร้างการทำงานข้างต้นภายในฟังก์ชัน loop ซึ่งทำงานแบบขนาน โค้ดคำนวณเวลาและโค้ดควบคุมจะปะปนกันจนโค้ดซับซ้อนมาก
แต่ถ้าใช้ฟังก์ชันหน่วงเวลา Utils.wait ภายในฟังก์ชัน setup จะเขียนโค้ดที่ทำงานตามลำดับเวลาได้เสมือนแบบซิงโครนัส
( ฟังก์ชัน Utils.wait จะอธิบายอีกครั้งใน ฟังก์ชันอรรถประโยชน์ (Utils) ต่อไป )
ตัวอย่างโค้ด (Python)
from robomation import *
hamster_s = HamsterS(0)
# ใส่โค้ดตั้งค่าที่นี่ เพื่อให้ทำงานครั้งเดียว:
def setup():
# ตั้งความเร็วล้อทั้งสองข้างเป็น 50 เพื่อเคลื่อนที่ไปข้างหน้า
hamster_s.set_wheel_speed('both', 50)
Utils.wait(1) # รอ 1 วินาที
# ตั้งความเร็วล้อทั้งสองข้างเป็น -50 เพื่อเคลื่อนที่ถอยหลัง
hamster_s.set_wheel_speed('both', -50)
Utils.wait(1) # รอ 1 วินาที
hamster_s.stop()
# ใส่โค้ดควบคุมที่นี่ เพื่อให้ทำงานซ้ำ:
def loop():
pass( ไวยากรณ์ของอินสแตนซ์และเมธอดของหุ่นยนต์จะอธิบายอีกครั้งใน ระบบไวยากรณ์พื้นฐานในการเขียนโค้ดหุ่นยนต์ของ RobomationLAB ต่อไป )
ฟังก์ชัน loop
ฟังก์ชัน loop รองรับการทำงานแบบขนาน และจะทำซ้ำทุก ๆ ประมาณ 10ms ตลอดเวลาที่โค้ดทำงาน
ในฟังก์ชัน loop มักเขียนโค้ดสำหรับตั้งค่าตัวแปรซ้ำ ๆ หรือตรวจจับและจัดการเหตุการณ์ที่เกิดขึ้นกับหุ่นยนต์
ต่อไปนี้เป็นตัวอย่างการเขียนโค้ดให้ความเร็วล้อและสีไฟ LED ของหุ่นยนต์ HamsterS เปลี่ยนไปตามเวลา
( เมื่อจะเปลี่ยนค่าตัวแปรที่ประกาศไว้นอกฟังก์ชัน setup / loop ภายในฟังก์ชัน ให้ประกาศด้วยคีย์เวิร์ด global )
from robomation import *
hamster_s = HamsterS(0)
frame = 0
# ใส่โค้ดตั้งค่าที่นี่ เพื่อให้ทำงานครั้งเดียว:
def setup():
global frame
frame = 0
# ใส่โค้ดควบคุมที่นี่ เพื่อให้ทำงานซ้ำ:
def loop():
global frame
frame += 1 # เพิ่มค่าตัวแปร frame ทีละ 1 ทุกครั้งที่ฟังก์ชัน loop ถูกเรียก
# ใช้ค่า frame ที่เปลี่ยนไป ตั้งความเร็วล้อทั้งสองข้างและค่า RGB ของ LED ทั้งสองข้าง
hamster_s.set_wheel_speed('both', frame % 100)
hamster_s.set_led_color('left', frame % 256, 0, 0)
hamster_s.set_led_color('right', 0, 0, frame % 256)( ไวยากรณ์ของอินสแตนซ์และเมธอดของหุ่นยนต์จะอธิบายอีกครั้งใน ระบบไวยากรณ์พื้นฐานในการเขียนโค้ดหุ่นยนต์ของ RobomationLAB ต่อไป )
ต่อไปนี้เป็นตัวอย่างการเขียนโค้ดให้เปิดไฟ LED เป็นสีแดงเมื่อเกิดการเคาะ (Tap) ที่ตัวหุ่นยนต์ HamsterS เบา ๆ
from robomation import *
hamster_s = HamsterS(0)
# ใส่โค้ดตั้งค่าที่นี่ เพื่อให้ทำงานครั้งเดียว:
def setup():
pass
# ใส่โค้ดควบคุมที่นี่ เพื่อให้ทำงานซ้ำ:
def loop():
# ตรวจจับการเกิดเหตุการณ์ในช่วงที่เกิดการเคาะ (Tap)
if hamster_s.tap(): # เมื่อตรวจจับเหตุการณ์ได้ จะเป็น True
hamster_s.set_led_color('both', 'red') # เปิดไฟ LED ทั้งสองข้างเป็นสีแดง
else:
hamster_s.turn_off('both') # ปิดไฟ LED ทั้งสองข้าง( ไวยากรณ์อย่างการตรวจจับเหตุการณ์ (tap()) จะอธิบายอีกครั้งใน ระบบไวยากรณ์พื้นฐานในการเขียนโค้ดหุ่นยนต์ของ RobomationLAB ต่อไป )
ระบบไวยากรณ์พื้นฐานในการเขียนโค้ดหุ่นยนต์ของ RobomationLAB
ระบบไวยากรณ์พื้นฐานที่ต้องปฏิบัติตามเมื่อเขียนโค้ดในโปรแกรมเขียนโค้ดหุ่นยนต์ที่ RobomationLAB ให้บริการมีดังนี้
การควบคุมหุ่นยนต์ทำผ่านแพ็กเกจ Python ชื่อ robomation
โดยเขียนโค้ดในรูปแบบสร้างหุ่นยนต์เป็นอินสแตนซ์แล้วเรียกใช้เมธอดของอินสแตนซ์นั้น
การนำเข้าแพ็กเกจ robomation
หากต้องการใช้คลาส (หุ่นยนต์) และอรรถประโยชน์ (Utils) ที่จำเป็นต่อการควบคุมหุ่นยนต์ ให้ใส่บรรทัดต่อไปนี้ไว้บนสุดของโค้ด
from robomation import *การสร้างอินสแตนซ์ของหุ่นยนต์
ประกาศหุ่นยนต์ที่จะใช้เป็นอินสแตนซ์
ชื่อคลาสแทนชนิดของหุ่นยนต์ และตัวเลขในวงเล็บแทนดัชนีอินสแตนซ์ (เริ่มจาก 0)
hamster_s = HamsterS(0) # HamsterS 1 ตัวชื่อคลาสและชื่อตัวแปรเริ่มต้นของหุ่นยนต์แต่ละตัวมีดังนี้
| หุ่นยนต์ | ชื่อคลาส | ชื่อตัวแปรเริ่มต้น |
|---|---|---|
| HamsterS | HamsterS | hamster_s |
| Hamster | Hamster | hamster |
| Piobot | Pio | pio |
| Turtle | Turtle | turtle |
| Beagle | Beagle | beagle |
| RaccoonBot | RaccoonBot | raccoon |
| Cheese Stick | CheeseStick | cheesestick |
เมื่อใช้หุ่นยนต์ชนิดเดียวกันหลายตัว ให้เพิ่มดัชนีเป็น 0, 1, 2 … แล้วประกาศ
hamster_s = HamsterS(0)
hamster_s_1 = HamsterS(1)เมธอดควบคุมหุ่นยนต์
เมื่อจะควบคุมหุ่นยนต์ ให้เรียกใช้เมธอดของอินสแตนซ์
เมธอดจะทำการทำงานของหุ่นยนต์ เช่น ตั้งความเร็วล้อ เคลื่อนที่ ไฟ LED และเสียง
hamster_s.set_wheel_speed('both', 50) # ตั้งความเร็วล้อทั้งสองข้าง
hamster_s.move_distance(10, 'cm') # เคลื่อนที่ไปข้างหน้า 10cm
hamster_s.set_led_color('both', 'red') # ตั้งไฟ LED ทั้งสองข้างเป็นสีแดงรายการเมธอดที่ใช้ได้และพารามิเตอร์ของหุ่นยนต์แต่ละตัว ดูได้จากเอกสารของหุ่นยนต์นั้น ๆ (เช่น 'HamsterS')
การอ่านค่าเซ็นเซอร์และสถานะ
เมื่อจะอ่านค่าเซ็นเซอร์หรือสถานะของหุ่นยนต์ ก็เรียกใช้เมธอดเช่นกัน โดยเมธอดจะคืนค่านั้นกลับมา
left = hamster_s.floor('left') # อ่านค่าเซ็นเซอร์พื้นด้านซ้าย
dist = hamster_s.proximity('right') # อ่านค่าเซ็นเซอร์ตรวจจับวัตถุด้านขวาการตรวจจับเหตุการณ์
เหตุการณ์ที่เกิดจากการเปลี่ยนแปลงสถานะหรือสภาพแวดล้อม จะตรวจจับได้จากการที่เมธอดของเหตุการณ์นั้น
คืนค่า True ในช่วงที่เกิดเหตุการณ์
if hamster_s.tap(): # เป็น True ในช่วงที่เกิดเหตุการณ์เคาะ (Tap)
hamster_s.set_led_color('both', 'red')การรอให้การทำงานเสร็จสิ้น (wait)
เมธอดที่ใช้เวลาจนเสร็จสิ้น เช่น การเคลื่อนที่ การหมุน และการเล่นเสียง จะมีพารามิเตอร์ wait
wait=True(ค่าเริ่มต้น): รอจนกว่าการทำงานจะเสร็จสิ้นแล้วจึงทำโค้ดถัดไปwait=False: เริ่มการทำงานแล้วทำโค้ดถัดไปต่อทันที
hamster_s.move_distance(10, 'cm', wait=True) # รอจนการเคลื่อนที่สิ้นสุด
hamster_s.move_distance(10, 'cm', wait=False) # เริ่มเคลื่อนที่แล้วทำโค้ดถัดไปทันทีฟังก์ชันอรรถประโยชน์ (Utils)
ความสามารถร่วมที่ไม่ขึ้นกับชนิดของหุ่นยนต์ เช่น การหน่วงเวลา การเล่นเสียง การแสดงบันทึก และสี จะใช้ผ่านเมธอดของคลาส Utils
Utils.wait(1) # รอ 1 วินาที
Utils.speak('สวัสดี') # เล่นเสียงพูดจากข้อความ (TTS)
Utils.log(0, '', '') # แสดงบันทึกในคอนโซล