Skip to content

คู่มือการเขียนโค้ด ​

เอกสารนี้อธิบายเกี่ยวกับ RobomationLAB ซึ่งเป็นแพลตฟอร์มการศึกษาการเขียนโค้ดหุ่นยนต์ หนึ่งใน 'เอนจินการทำงานและสภาพแวดล้อมการสร้างงานแบบบูรณาการสำหรับบริการสตรีมมิงการเคลื่อนไหวของหุ่นยนต์' ที่พัฒนาโดย Robomation

เนื้อหาอธิบายโดยละเอียดตามลำดับดังนี้:

  • คุณลักษณะสำคัญของ RobomationLAB
  • วิธีการเขียนโปรแกรมหุ่นยนต์ของ RobomationLAB
  • ระบบไวยากรณ์พื้นฐานในการเขียนโค้ดหุ่นยนต์ของ RobomationLAB

สารบัญ ​

  1. แพลตฟอร์มการศึกษาการเขียนโค้ดหุ่นยนต์ RobomationLAB
    1-1) โปรแกรมเขียนโค้ดหุ่นยนต์
    1-2) การแปลงสองทางแบบเรียลไทม์ระหว่างบล็อกกับ Python
    1-3) คุณลักษณะสำคัญของโปรแกรมเขียนโค้ด
    1-4) วิธีควบคุมหุ่นยนต์แบบเรียลไทม์

  2. วิธีการเขียนโปรแกรมหุ่นยนต์ของ RobomationLAB
    2-1) การทำงานตามลำดับและการทำงานแบบขนาน
    2-2) ฟังก์ชัน setup
    2-3) ฟังก์ชัน loop

  3. ระบบไวยากรณ์พื้นฐานในการเขียนโค้ดหุ่นยนต์ของ 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 ให้บริการมีดังนี้

  1. ทำงานบนเว็บเบราว์เซอร์ Chrome จึงไม่ถูกจำกัดด้วยระบบปฏิบัติการ (OS)
  2. ควบคุมฮาร์ดแวร์หุ่นยนต์โดยตรงผ่านดองเกิล USB บนพื้นฐานการสื่อสาร Web Serial
  3. รองรับการควบคุมหุ่นยนต์หลายตัวพร้อมกัน โดยไม่จำกัดชนิดและจำนวนหุ่นยนต์
  4. เมื่อบันทึกไฟล์ ผลงานจะถูกแปลงและบันทึกเป็นไฟล์ข้อความ JSON

วิธีควบคุมหุ่นยนต์แบบเรียลไทม์ ​

โปรแกรมเขียนโค้ดหุ่นยนต์ที่ RobomationLAB ให้บริการจะควบคุมหุ่นยนต์แบบเรียลไทม์ผ่านขั้นตอนดังนี้

  1. เขียนโค้ดที่กำหนดค่าของอ็อบเจกต์ Effector และ Command เพื่อควบคุมหุ่นยนต์ หรือใช้ค่า Sensor และการเกิด Event ของหุ่นยนต์ ผ่านการเขียนโค้ดด้วยบล็อกหรือการเขียนโค้ดด้วยสคริปต์
  2. รันโค้ด
  3. รับแพ็กเก็ตที่บรรจุข้อมูล Sensor และ Event จากหุ่นยนต์ผ่านการสื่อสาร Web Serial แล้วนำไปปรับใช้กับอ็อบเจกต์ Device ของหุ่นยนต์
  4. ตีความโค้ดแบบเรียลไทม์ แล้วเขียนทับข้อมูลลงในอ็อบเจกต์ Effector, Command หรืออ่านค่าจากอ็อบเจกต์ Sensor, Event
  5. สร้างแพ็กเก็ตที่สะท้อนข้อมูลของอ็อบเจกต์ Device ของหุ่นยนต์ แล้วส่งไปยังหุ่นยนต์ผ่านการสื่อสาร Web Serial เพื่อตรวจสอบว่าหุ่นยนต์ทำงานจริงหรือไม่
  6. ขณะที่โค้ดกำลังทำงาน ขั้นตอนที่ 3 ~ 5 จะถูกทำซ้ำทุก ๆ ประมาณ 10 ~ 20ms

การแปลงสองทางแบบเรียลไทม์ระหว่างบล็อกกับ Python ​

RobomationLAB มีทั้งตัวแก้ไขการเขียนโค้ดด้วยบล็อกและตัวแก้ไขการเขียนโค้ด Python และตัวแก้ไขทั้งสองจะซิงค์กันสองทางแบบเรียลไทม์

  • เมื่อเพิ่ม แก้ไข หรือลบบล็อกในตัวแก้ไขการเขียนโค้ดด้วยบล็อก การเปลี่ยนแปลงนั้นจะสะท้อนไปยังโค้ด Python แบบเรียลไทม์
  • ในทางกลับกัน เมื่อแก้ไขโค้ดในตัวแก้ไขการเขียนโค้ด Python การเปลี่ยนแปลงนั้นจะสะท้อนไปยังบล็อกแบบเรียลไทม์

เนื่องจากบล็อกกับโค้ด Python สอดคล้องกันแบบหนึ่งต่อหนึ่งและแปลงกันได้สองทาง
จึงเขียนโค้ดได้อย่างยืดหยุ่นข้ามไปมาระหว่างการเขียนโค้ดด้วยบล็อกและการเขียนโค้ดด้วยสคริปต์
เช่น สร้างโครงสร้างทั้งหมดด้วยบล็อกอย่างรวดเร็วแล้วปรับรายละเอียดด้วย Python หรือเรียนรู้ไวยากรณ์ Python ด้วยการเทียบกับบล็อก

อย่างไรก็ตาม การแปลงจาก Python → บล็อก จะทำได้เฉพาะโค้ดที่แสดงด้วยบล็อกได้เท่านั้น
(ถ้าไวยากรณ์ไม่ถูกต้องหรือเป็นโค้ดที่แปลงเป็นบล็อกไม่ได้ อาจสลับไม่ได้
ดูรายละเอียดได้ที่เอกสาร กฎการเขียนโค้ด)




วิธีการเขียนโปรแกรมหุ่นยนต์ของ RobomationLAB ​

การทำงานตามลำดับและการทำงานแบบขนาน ​

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

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

โปรแกรมเขียนโค้ดหุ่นยนต์ที่ RobomationLAB ให้บริการ
รองรับทั้งการทำงานตามลำดับและการทำงานแบบขนานพร้อมกัน บนพื้นฐานโครงสร้างโค้ด setup / loop ที่คล้ายกับสภาพแวดล้อมพัฒนา H/W ของ Arduino

block-structure

เมื่อเข้าใช้งาน Block Composer ครั้งแรก จะเห็นบล็อกฟังก์ชันว่างสองบล็อกแสดงอยู่ในพื้นที่ทำงานดังนี้
บล็อก 'ฟังก์ชัน setup' แทนฟังก์ชัน setup และบล็อก 'ฟังก์ชัน loop' แทนฟังก์ชัน loop

บล็อกจะถูกแปลงเป็นโค้ด Python แบบเรียลไทม์
และโค้ดมีโครงสร้างพื้นฐานดังนี้

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)

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 )

python
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 เบา ๆ

python
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) ที่จำเป็นต่อการควบคุมหุ่นยนต์ ให้ใส่บรรทัดต่อไปนี้ไว้บนสุดของโค้ด

python
from robomation import *

การสร้างอินสแตนซ์ของหุ่นยนต์ ​

ประกาศหุ่นยนต์ที่จะใช้เป็นอินสแตนซ์
ชื่อคลาสแทนชนิดของหุ่นยนต์ และตัวเลขในวงเล็บแทนดัชนีอินสแตนซ์ (เริ่มจาก 0)

python
hamster_s = HamsterS(0)   # HamsterS 1 ตัว

ชื่อคลาสและชื่อตัวแปรเริ่มต้นของหุ่นยนต์แต่ละตัวมีดังนี้

หุ่นยนต์ชื่อคลาสชื่อตัวแปรเริ่มต้น
HamsterSHamsterShamster_s
HamsterHamsterhamster
PiobotPiopio
TurtleTurtleturtle
BeagleBeaglebeagle
RaccoonBotRaccoonBotraccoon
Cheese StickCheeseStickcheesestick

เมื่อใช้หุ่นยนต์ชนิดเดียวกันหลายตัว ให้เพิ่มดัชนีเป็น 0, 1, 2 … แล้วประกาศ

python
hamster_s = HamsterS(0)
hamster_s_1 = HamsterS(1)

เมธอดควบคุมหุ่นยนต์ ​

เมื่อจะควบคุมหุ่นยนต์ ให้เรียกใช้เมธอดของอินสแตนซ์
เมธอดจะทำการทำงานของหุ่นยนต์ เช่น ตั้งความเร็วล้อ เคลื่อนที่ ไฟ LED และเสียง

python
hamster_s.set_wheel_speed('both', 50)    # ตั้งความเร็วล้อทั้งสองข้าง
hamster_s.move_distance(10, 'cm')        # เคลื่อนที่ไปข้างหน้า 10cm
hamster_s.set_led_color('both', 'red')   # ตั้งไฟ LED ทั้งสองข้างเป็นสีแดง

รายการเมธอดที่ใช้ได้และพารามิเตอร์ของหุ่นยนต์แต่ละตัว ดูได้จากเอกสารของหุ่นยนต์นั้น ๆ (เช่น 'HamsterS')


การอ่านค่าเซ็นเซอร์และสถานะ ​

เมื่อจะอ่านค่าเซ็นเซอร์หรือสถานะของหุ่นยนต์ ก็เรียกใช้เมธอดเช่นกัน โดยเมธอดจะคืนค่านั้นกลับมา

python
left = hamster_s.floor('left')        # อ่านค่าเซ็นเซอร์พื้นด้านซ้าย
dist = hamster_s.proximity('right')   # อ่านค่าเซ็นเซอร์ตรวจจับวัตถุด้านขวา

การตรวจจับเหตุการณ์ ​

เหตุการณ์ที่เกิดจากการเปลี่ยนแปลงสถานะหรือสภาพแวดล้อม จะตรวจจับได้จากการที่เมธอดของเหตุการณ์นั้น
คืนค่า True ในช่วงที่เกิดเหตุการณ์

python
if hamster_s.tap():        # เป็น True ในช่วงที่เกิดเหตุการณ์เคาะ (Tap)
    hamster_s.set_led_color('both', 'red')

การรอให้การทำงานเสร็จสิ้น (wait) ​

เมธอดที่ใช้เวลาจนเสร็จสิ้น เช่น การเคลื่อนที่ การหมุน และการเล่นเสียง จะมีพารามิเตอร์ wait

  • wait=True (ค่าเริ่มต้น): รอจนกว่าการทำงานจะเสร็จสิ้นแล้วจึงทำโค้ดถัดไป
  • wait=False: เริ่มการทำงานแล้วทำโค้ดถัดไปต่อทันที
python
hamster_s.move_distance(10, 'cm', wait=True)    # รอจนการเคลื่อนที่สิ้นสุด
hamster_s.move_distance(10, 'cm', wait=False)   # เริ่มเคลื่อนที่แล้วทำโค้ดถัดไปทันที

ฟังก์ชันอรรถประโยชน์ (Utils) ​

ความสามารถร่วมที่ไม่ขึ้นกับชนิดของหุ่นยนต์ เช่น การหน่วงเวลา การเล่นเสียง การแสดงบันทึก และสี จะใช้ผ่านเมธอดของคลาส Utils

python
Utils.wait(1)              # รอ 1 วินาที
Utils.speak('สวัสดี')        # เล่นเสียงพูดจากข้อความ (TTS)
Utils.log(0, '', '')       # แสดงบันทึกในคอนโซล