# คู่มือผู้ใช้ Python SerialMaster

## การเตรียมการ

1. &#x20;Install python (version≥ 3.6, such as Anaconda3-5.2.0-Windows-x86\_64.exe)
2. &#x20;Install pyserial library (version 3.5)

## เชื่อมต่อซีเรียลพอร์

โดยปกติแล้วการใช้ [USB adapter](https://docs.petoi.com/communication-modules/usb-downloader-ch340c) ในการเชื่อมต่อกับหุ่นยนต์จะต้องเห็นพอร์ทแค่อันเดียวหากไม่ได้เชื่อมต่อกับสิ่งอื่น

![USB serial port number](/files/h5h8zHi5rrfXFKgkPgtu)

แต่เมื่อเชื่อมต่อผ่านทาง Bluetooth จะเห็นพอร์ตที่เชื่อมต่อ 2 พอร์ตดังรูป

![Bluetooth serial port number](/files/YP3mYdSq7jxfLgPqEs70)

เปิด Terminal (เช่น Anaconda Prompt) ใส่พาธที่สคริปต์ตั้งอยู่ (\*\*\*\serialMaster) คุณสามารถใช้คำสั่งต่อไปนี้ในการเรียกใช้สคริปต์ สคริปต์จะตรวจสอบหมายเลขพอร์ตซีเรียลโดยอัตโนมัติตั้งแต่ต้นและเสร็จสิ้นการเชื่อมต่อ

## **Run the script**

### **Method 1**: Run the **ardSerial.py**

```
***\serialMaster>python3 ardSerial.py kbalance
```

Parameters: **kbalance** เป็น [serial command](https://docs.petoi.com/serial-protocol) บ่งบอกถึงสกิลของหุ่นยนต์

แน่นอน คุณยังสามารถเรียกใช้สคริปต์นี้โดยไม่ต้องใส่พารามิเตอร์ใด ๆ:

```
***\serialMaster>python3 ardSerial.py
```

เมื่อระบบตรวจสอบว่ามีหมายเลขพอร์ตซีเรียลหลายตัว สคริปต์จะตรวจสอบหมายเลขพอร์ตซีเรียลทั้งหมดที่เชื่อมต่อกับหุ่นยนต์อย่างปกติ (คุณสามารถส่งคำสั่งซีเรียลไปยังหุ่นยนต์หลายตัวพร้อมกัน) เมื่อสคริปต์เริ่มทำงาน และพิมพ์ข้อมูลเตือนดังต่อไปนี้:

```python
__main__ - INFO - port[0] is COM11
__main__ - INFO - port[1] is COM5
__main__ - INFO - port[2] is COM10
Waiting for the robot to booting up
Waiting for the robot to booting up
['b', '\n* Start *\nBittle\nReady!\np\n']
Adding COM5
['b', '\n* Start *\nBittle\nReady!\np\n']
Adding COM11
__main__ - INFO - Connect to usb serial port:
__main__ - INFO - COM5
__main__ - INFO - COM11
```

เมื่อสคริปต์เริ่มทำงานอย่างเป็นทางการ ข้อมูลเตือนต่อไปนี้จะถูกพิมพ์ออกมา:

**คุณสามารถพิมพ์ 'quit' หรือ 'q' เพื่อออก**

ต่อไปนี้คุณสามารถป้อนคำสั่งซีเรียลใน Terminal เพื่อควบคุมหุ่นยนต์ให้ดำเนินการต่าง ๆ ที่น่าสนใจ 😃 เช่น

```
Kbalance        # Command to control the robot to stand normally
m 0 -30 0 30    # Command to control the robot head to swing left and right
```

### **Method 2**: Run the custom scheduler, **example.py**

```
***\serialMaster>python3 example.py
```

รายการ **testSchedule** ใน example.py ใช้เพื่อทดสอบคำสั่งพอร์ตซีเรียลต่าง ๆ ให้เรียกใช้โค้ดสคริปต์ต่อไปนี้เพื่อดูผลของการดำเนินการของคำสั่งพอร์ตซีเรียลในรายการ:

```
for task in testSchedule:
    wrapper(task)
```

คุณยังสามารถอ้างอิงเนื้อหาของรายการ **stepUpSchedule** (ใน **\*\*\*\serialMaster\demos\stepup.py**) เขียนรายการพฤติกรรมตามความต้องการจริงของคุณ และเปิดเผยความคิดสร้างสรรค์ของคุณ 🤩

<mark style="color:red;">**หมายเหตุ**</mark>: เมื่อเรียกใช้สคริปต์ที่อยู่ในพาธ **\serialMaster\demos** คุณต้องใช้คำสั่ง "**cd demos**" เพื่อเข้าสู่พาธที่สคริปต์ตั้งอยู่ (**\serialMaster\demos**) ก่อน แล้วจึงใช้คำสั่ง python3 เพื่อเรียกใช้สคริปต์ (เช่น **"python3 stepup.py**")

**\['kbalance', 2]**

* 'kbalance' หมายถึงคำสั่งในการควบคุม Bittle ให้ยืนอยู่ในท่าปกติ
* 2 หมายถึงเวลาที่หน่วงหลังจากเสร็จสิ้นคำสั่ง หน่วยเป็นวินาที

**\['d', 2]**

* d หมายถึงคำสั่งในการวางหุ่นยนต์ลงและปิดเซอร์โว
* 2 หมายถึงเวลาที่หน่วงหลังจากเสร็จสิ้นคำสั่ง หน่วยเป็นวินาที

**\['c', 2]**

* c หมายถึงคำสั่งในการเข้าสู่โหมดการคาลิเบรท (calibration mode)
* 2 หมายถึงเวลาที่หน่วงหลังจากเสร็จสิ้นคำสั่ง หน่วยเป็นวินาที หลังจากที่คำสั่งเคลื่อนไหวเหล่านี้เสร็จสิ้น คำสั่งถัดไปจะถูกดำเนินการหลังจากหน่วงเวลา 2 วินาที

**\['c', \[0, -9], 2]**

* c หมายถึงคำสั่งในการเข้าสู่โหมดการคาลิเบรท (calibration mode)
* 0 หมายถึงหมายเลขดัชนีของเซอร์โวข้อต่อ (joint servo)
* -9 หมายถึงมุมการหมุน, หน่วยเป็นองศา
* 2 หมายถึงเวลาที่หน่วงหลังจากเสร็จสิ้นคำสั่ง หน่วยเป็นวินาที

โดยใช้รูปแบบนี้คุณสามารถเข้าสู่โหมดการปรับแต่งเพื่อปรับแต่งมุมของเซอร์โวข้อต่อบางตัวได้\
&#x20;<mark style="color:red;">**หมายเหตุ**</mark>: หากคุณต้องการให้ค่าการแก้ไขในคำสั่งนี้มีผลให้เกิดผล คุณต้องป้อนคำสั่ง "s" หลังจากดำเนินการคำสั่งนี้

ตัวอย่างนี้หมายถึง เซอร์โวข้อต่อที่มีหมายเลขซีเรียลเป็น 0 หมุน -9 องศา หลังจากที่คำสั่งการเคลื่อนไหวเหล่านี้เสร็จสิ้น คำสั่งถัดไปจะถูกดำเนินการหลังจากหน่วงเวลา 2 วินาที

**\['m', \[0, -20], 1.5]**

* m หมายถึงคำสั่งในการควบคุมการหมุนของเซอร์โวข้อต่อ
* 0 หมายถึงหมายเลขดัชนีของเซอร์โวข้อต่อ (joint servo)
* -20 หมายถึงมุมการหมุน (มุมอ้างอิงจากจุดเริ่มต้น ไม่ใช่มุมเพิ่มเติม), หน่วยเป็นองศา
* 1.5 หมายถึงเวลาที่หน่วงหลังจากเสร็จสิ้นคำสั่ง หน่วยเป็นวินาที สามารถเป็นตัวเลขทศนิยมได้

**\['m',  \[0, 45, 0, -45, 0, 45, 0, -45], 2]**

โดยใช้รูปแบบนี้คุณสามารถส่งคำสั่งหมุนของเซอร์โวข้อต่อหลายตัวพร้อมกัน และคำสั่งการหมุนเหล่านี้จะถูกดำเนินการลำดับการไปเรื่อย ๆ ไม่ใช่พร้อมกัน มุมของข้อต่อถูกจัดเก็บเป็นตัวอักษร **ASCII** ดังนั้นสามารถป้อนโดยตรงโดยมนุษย์ได้

ตัวอย่างนี้หมายถึง หมุนเซอร์โวข้อต่อที่มีหมายเลขดัชนีเป็น 0 ไปยังตำแหน่งมุม 45 องศาก่อน จากนั้นหมุนไปยังตำแหน่งมุม -45 องศา และเช่นนี้ต่อไป หลังจากที่คำสั่งการเคลื่อนไหวเหล่านี้เสร็จสิ้น คำสั่งถัดไปจะถูกดำเนินการหลังจากหน่วงเวลา 2 วินาที

**\['i', \[ 8, -15, 9, -20], 2]**

โดยใช้รูปแบบนี้คุณสามารถส่งคำสั่งหมุนของเซอร์โวข้อต่อหลายตัวพร้อมกัน และคำสั่งการหมุนเหล่านี้จะถูกดำเนินการพร้อมกัน มุมของข้อต่อถูกจัดเก็บเป็นตัวอักษร **ASCII** ดังนั้นสามารถป้อนโดยตรงโดยมนุษย์ได้

ตัวอย่างนี้หมายถึง หมุนเซอร์โวข้อต่อที่มีหมายเลขดัชนีเป็น 8 และ 9 ไปยังตำแหน่งมุม -15 และ -20 องศา พร้อมกัน หลังจากที่คำสั่งการเคลื่อนไหวเหล่านี้เสร็จสิ้น คำสั่งถัดไปจะถูกดำเนินการหลังจากหน่วงเวลา 2 วินาที

**\['M', \[8, 50, 9, 50, 10, 50, 11, 50, 0, 0], 3]**

* M หมายถึงคำสั่งในการหมุนของเซอร์โวข้อต่อหลายตัว โดยจะทำการหมุนข้อต่อลำดับที่กำหนดไว้ มุมของข้อต่อถูกเข้ารหัสเป็น**เลขฐานสอง**เพื่อเพิ่มประสิทธิภาพในการส่งข้อมูล
* 8, 9, 10, 11, 0 หมายถึงหมายเลขดัชนีของเซอร์โวข้อต่อ (joint servos)
* 50, 50, 50, 50, 0 หมายถึงมุมการหมุนของข้อต่อ (มุมอ้างอิงจากจุดเริ่มต้น ไม่ใช่มุมเพิ่มเติม) หน่วยเป็นองศา
* 3 หมายถึงเวลาหน่วงหลังจากเสร็จสิ้นคำสั่ง หน่วยเป็นวินาที

**\['I', \[20, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 36, 36, 36, 36], 5]**

* I หมายถึงคำสั่งในการหมุนของเซอร์โวข้อต่อทั้งหมดพร้อมกัน (ในปัจจุบันคำสั่งรองรับจำนวน 16 ข้อต่อ) มุมของข้อต่อถูกเข้ารหัสเป็นเลขฐานสองเพื่อเพิ่มประสิทธิภาพในการส่งข้อมูล
* 20, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 36, 36, 36, 36 หมายถึงมุมการหมุนของข้อต่อแต่ละตัวที่สอดคล้องกับหมายเลขดัชนี 0-15 (มุมอ้างอิงจากจุดเริ่มต้น ไม่ใช่มุมเพิ่มเติม) หน่วยเป็นองศา
* 5 หมายถึงเวลาหน่วงหลังจากเสร็จสิ้นคำสั่ง หน่วยเป็นวินาที

**\['b', \[10,2], 2]**

* b หมายถึงคำสั่งในการควบคุมบัซเซอร์ให้ส่งเสียงเป่าวิทยุ (beep)
* 10 หมายถึงเสียงดนตรี (music tone) ที่ใช้ในการสั่งให้บัซเซอร์ส่งเสียง
* 2 หมายถึงความยาวของการเล่นเสียง (duration) ต่อเป็นเวลา 1/duration วินาที
* 2 หมายถึงเวลาหน่วงหลังจากสิ้นสุดการเล่นเสียง หน่วยเป็นวินาที

**\['b',\[0, 1, 14, 8, 14, 8, 21, 8, 21, 8, 23, 8, 23, 8, 21, 4, 19, 8, 19, 8, 18, 8, 18, 8, 16, 8, 16, 8, 14, 4],3]**

* b หมายถึงคำสั่งในการควบคุมบัซเซอร์ให้ส่งเสียงเป่าวิทยุ (beep)
* 0, 14, 14, 21... หมายถึงเสียงดนตรี (music tone) ที่ใช้ในการสั่งให้บัซเซอร์ส่งเสียง ตามลำดับเสียง
* 1, 8, 8, 8 หมายถึงความยาวของการเล่นเสียง (duration) ต่อเป็นเวลา 1/duration วินาที โดยเรียงตามเสียงดนตรีที่กำหนด ในที่นี้คือ 0, 14, 14, 21...
* 3 หมายถึงเวลาหน่วงหลังจากเสียงดนตรีเล่นเสร็จ หน่วยเป็นวินาที

ใช่ ด้วยคำสั่ง tone คุณสามารถสร้างเสียงดนตรีง่าย ๆ หรือเล่นทั้งหมดในครั้งเดียวกันได้ โดยใช้รูปแบบดังตัวอย่างที่กล่าวมาก่อนหน้านี้

ความหมายของตัวอย่างนี้คือ: เล่นทั้งหมดของสัมผัสด้วยเสียงดนตรีแบบง่าย ๆ และหน่วงเวลา 3 วินาทีหลังจากที่สัมผัสด้วยเสียงดนตรีเสร็จสิ้น

ck = \[

&#x20;   -3, 0, 5, 1,

&#x20;   0, 1, 2,

&#x20;   45,   0,   0,   0,   0,   0,   0,   0,  45,  35,  38,  50, -30, -10,   0, -20,     6, 1, 0, 0,

&#x20;  -45,   0,   0,   0,   0,   0,   0,   0,  35,  45,  50,  38, -10, -30, -20,   0,     6, 1, 0, 0,

&#x20;    0,   0,   0,   0,   0,   0,   0,   0,  30,  30,  30,  30,  30,  30,  30,  30,     5, 0, 0, 0,

&#x20;       ]

**\['K', ck, 1]**

* 'K' หมายถึงข้อมูลทักษะ (skill data) ที่ส่งให้กับ Bittle ในเวลาเดียวกัน (realtime) โดยต้องใช้ฟอร์แมตของสตริงและรหัสของทักษะที่ต้องการส่งขึ้นไปใน Bittle
* อาเรย์ของทักษะจะถูกส่งไปยังหุ่นยนต์และทำงานโดยการประมวลผลที่ตัวหุ่นยนต์ (execute locally on the robot) โดยไม่ต้องส่งข้อมูลกลับมายังคอมพิวเตอร์หรืออุปกรณ์อื่น ๆ อาทิเช่น Raspberry Pi หรือเซิร์ฟเวอร์
* คุณสามารถแทรกทักษะลงในไลบรารีของทักษะ (skill library) หรือ InstinctX.h โดยใช้รูปแบบนี้

สำหรับคำอธิบายของคำสั่งอื่น ๆ บนพอร์ตซีเรียลโปรต์ โปรดอ้างอิงตามเอกสาร [Serial Commands](https://docs.petoi.com/arduino-ide/serial-commands#arduino-ide-as-an-interface). นี้

Pleaseขอให้นี่เป็นแรงบันดาลใจสำหรับการช่วย Nybble และ Bittle ในการค้นหาแรงบันดาลใจของพวกเขา และขอให้คุณมีความสุขกับการเล่น! 😍


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.petoi.com/thai/api/python-serialmaster.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
