# การคาลิเบรทด้วย Arduino IDE

{% hint style="info" %}
การคาลิเบรทเป็นสิ่งสำคัญในการทำงานของหุ่นยนต์
{% endhint %}

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

ตรวจสอบให้แน่ใจว่าคุณได้อัปโหลดเฟิร์มแวร์ฟังก์ชันหลักของ OpenCat [Main function firmware](https://docs.petoi.com/desktop-app/firmware-uploader#uploading-process) ก่อนทำการคาลิเบรท

การเข้าสู่โหมดการ calibrate ต้องมีการเตรียมการดังต่อไปนี้:&#x20;

1\. วงจรเซอร์โวทั้งหมดเชื่อมต่อกับเมนบอร์ด

2\. แบตเตอรี่ชาร์จเต็มแล้ว

3\. เชื่อมต่ออะแดปเตอร์ [USB adapter](https://docs.petoi.com/communication-modules/usb-downloader-ch340c#connect-nyboard) และสื่อสารตามปกติ

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

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FgbyNcOGhxnwV7UlfOrvf%2Fassets_bittle_wire2.jpeg?alt=media\&token=11e8370b-825e-4cdd-a72d-d9149fc58007)

การ calibrate มี 4 ขั้นตอน:

&#x20; 1.เขียนค่าคงที่ไปยัง Nyboard (สำหรับเฟิร์มแวร์ 1.0 เท่านั้น)

&#x20; 2.เปิดหุ่นยนต์ด้วยแบตเตอรี่ ปล่อยให้เซอร์โวหมุนได้อย่างอิสระจนถึงมุมศูนย์/สถานะการ calibration

&#x20; 3\. แนบส่วนต่าง ๆ ของร่างกายเข้ากับเซอร์โว

&#x20; 4\. ปรับออฟเซ็ตอย่างละเอียดบน serial monitor

ตรรกะเบื้องหลังการ [logic behind calibration](https://www.petoi.camp/forum/basic-assembly-and-setup/the-logic-behind-calibration-process) สามารถพบได้ใน OpenCat forum หลักการเหมือนกันสำหรับ Nybble และ Bittle

## 1. Write constants <a href="#id-6.1.-write-constants" id="id-6.1.-write-constants"></a>

{% hint style="info" %}
ขั้นตอนนี้ใช้สำหรับเฟิร์มแวร์ 1.0 เท่านั้น
{% endhint %}

### 1.1. มีค่าคงที่ 3 ประเภทที่จะบันทึกลงใน NyBoard <a href="#id-6.1.1.-there-are-three-types-of-constants-to-be-saved-to-nyboard" id="id-6.1.1.-there-are-three-types-of-constants-to-be-saved-to-nyboard"></a>

1. &#x20;Assembly-related เช่น การแม็ปข้อต่อ ทิศทางการหมุน และพินเซ็นเซอร์ ค่อนข้างคงที่และส่วนใหญ่กำหนดไว้ใน **OpenCat.h** และเก็บไว้ใช้กับหุ่นยนต์ในอนาคต
2. พารามิเตอร์ที่เกี่ยวข้องกับการ Calibration เช่น **MPU6050 offsets** และการแก้ไขข้อต่อ มีการวัดตามเวลาจริงและบันทึกไว้ใน **onboard EEPROM** ต้องตั้งค่าเพียงครั้งเดียว
3. &#x20;ข้อมูลที่เกี่ยวข้องกับทักษะ เช่น ท่าทาง การเดิน และพฤติกรรมที่ตั้งโปรแกรมไว้ล่วงหน้า ส่วนใหญ่กำหนดไว้ใน **InstinctNybble.h / InstinctBittle.h** คุณสามารถเพิ่มทักษะที่กำหนดเองได้เช่นกัน

### 1.2. Upload and run **WriteInstinct.ino** <a href="#id-6.1.2.-upload-and-run-writeinstinct.ino" id="id-6.1.2.-upload-and-run-writeinstinct.ino"></a>

บทบาทของ **WriteInstinct.ino** คือการเขียนค่าคงที่ลงบนบอร์ดหรือ **I2C EEPROM** และบันทึกค่าการ **calibration** จะถูกเขียนทับโดย **OpenCat.ino** ในภายหลัง

{% hint style="warning" %}
คุณต้องเปลี่ยน \* on#define NyBoard\_V\*\_\* ใน **OpenCat.h** เพื่อให้ตรงกับเวอร์ชันของ NyBoard หมายเลขเวอร์ชันสามารถพบได้บนเมนบอร์ดใกล้กับโลโก้บริษัท<br>

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FBmOGIaywTg8Xq4AZx3oE%2FNyBoardV1_1.jpg?alt=media\&token=a9a63c42-9c47-4315-afe4-8b0c0bd62eaa)
{% endhint %}

{% hint style="warning" %}
ก่อนอัปโหลด sketch ตรวจสอบให้แน่ใจว่าได้ปิดหน้าต่างที่เปิดอยู่ทั้งหมดของ serial monitor มิฉะนั้น serial port อาจถูกใช้งานและ sketch จะไม่ถูกอัปโหลด
{% endhint %}

{% hint style="warning" %}
คุณต้องหมุนสวิตช์เลื่อนบน **NyBoard** ไปยัง **Arduino** แทน **RPi**!

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FqKzGlOtsakLaPrSuhjyK%2FI2C_switch.png?alt=media\&token=a086088a-9421-4e77-85fb-79422e9a7663)
{% endhint %}

หลังจากที่คุณอัปโหลด **WriteInstinct.ino** ผ่าน Arduino IDE ให้เปิด serial monitor

{% hint style="warning" %}
ตรวจสอบให้แน่ใจว่าตั้งค่า serial monito เป็น **baud rate** **115200** และ **no line ending**
{% endhint %}

![](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LygA-EAoP4h8Q2BOGHR-887967055%2Fuploads%2FeQXJKQQHzAc5cXp5FVa2%2Fmonitor.png?alt=media\&token=60b98871-8901-46dd-8056-dcde2024320b)

คุณจะเห็นคำถามหลายข้อ:

`Reset all joint calibration? (Y/n)`

หากคุณไม่เคย calibrate ข้อต่อ หรือหากคุณต้องการ calibrate เซอร์โวใหม่โดยเริ่มต้นใหม่ ให้พิมพ์ 'Y' กับคำถาม

`Do you need to update Instincts? (Y/n)`

หากคุณได้แก้ไข **Instinct.h** ไม่ว่าด้วยวิธีใดก็ตาม คุณควรพิมพ์ 'Y' แม้ว่าจะไม่จำเป็นเสมอไปเมื่อคุณมีความเข้าใจ เกี่ยวกับการจัดการหน่วยความจำแล้ว

`Calibrate MPU? (Y/n)`

หากคุณไม่เคย **calibrate** **MPU6050** เช่น **gyro/accelerometer sensor** ให้พิมพ์ 'Y'

บางครั้งโปรแกรมอาจหยุดทำงานในขั้นตอนการเชื่อมต่อ คุณสามารถปิด **serial** **monitor** แล้วเปิดใหม่อีกครั้ง หรือกดปุ่มรีเซ็ตบน **NyBoard** เพื่อรีสตาร์ทโปรแกรม

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FGeX5BTmML0yMrPytx6LH%2FSerialStart.png?alt=media\&token=4253a3bf-b80c-4a58-9050-01f06fc05cb0)

### 1.3. Upload OpenCat.ino

คุณต้องอัปโหลด **OpenCat.ino** เพื่อบันทึกค่าคงที่ล่าสุดและเปิดใช้งานฟังก์ชันสาธิต<br>

## 2 Enter calibration mode

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

พิมพ์ 'c' ใน serial monitor เพื่อเข้าสู่โหมดการ calibration ขึ้นอยู่กับทิศทางของเพลาเริ่มต้น บางตัวอาจเดินทางในมุมที่ใหญ่ขึ้นจนกระทั่งหยุดที่จุดกึ่งกลาง จะมีเสียงรบกวนมาจากระบบเกียร์ของเซอร์โว คุณจะเห็นตารางการ calibration ดังต่อไปนี้:

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2F9uumRr3f4zPSAVFiIjac%2FcaliTable.png?alt=media\&token=ee0988a3-926e-4990-b53f-8b2cc5911664)

แถวแรกคือ index ของข้อต่อ แถวที่สองคือออฟเซ็ตการ calibration:

| **Index**  | 0  | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  | 9  | 10 | 11 | 12 | 13 | 14 | 15 |
| ---------- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
| **Offset** | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |

ค่าเริ่มต้นคือ "-1" หรือ "0" และควรเปลี่ยนภายหลังการ calibration

{% hint style="info" %}
เซอร์โวกำลังใช้ potentiometer ใน feedback loop เพื่อควบคุมตำแหน่ง เมื่อตำแหน่งคงที่ พวกเขามักจะสั่นรอบมุมเป้าหมาย อาการสั่นคล้ายพาร์กินสันจะเกิดขึ้นหลังจากใช้งานไปช่วงสั้นๆ จะไม่มีผลกระทบมากนักระหว่างการเคลื่อนไหวต่อเนื่อง เซอร์โวที่ดีกว่าไม่มีปัญหาเหล่านี้อาจมีราคาสูงกว่า 10 เท่า ดังนั้นการเปลี่ยนยูนิตที่จึงเป็นคำตอบที่คุ้มค่ากว่า
{% endhint %}

## 3 The rationale for calibration

### 3.1 เข้าใจสถานะศูนย์และระบบพิกัด

หลังจากพิมพ์ 'c' ใน serial monitor โดยเซอร์โวทั้งหมดหมุนไปที่มุมศูนย์ ตอนนี้ติดส่วนหัว หาง และขาที่เตรียมไว้ในส่วนก่อนหน้าเข้ากับลำตัว โดยทั่วไปจะตั้งฉากกับโครงร่างที่เชื่อมโยงกัน ท่าเทียบมาตรฐานแสดงไว้ด้านล่าง:

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2F4fryc2V8MN2Z4l4Adg29%2Fcalibration_Nybble.png?alt=media\&token=7b2230d7-33bb-4eef-8d00-324bfc42eb8e) ![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FwgfLtnRgkD0d0BZQ7wn4%2Fzero.png?alt=media\&token=536e61a6-4dbc-4aa9-ac4e-3400606fb9ea)

{% hint style="info" %}
หากคุณกำลังสร้างหุ่นยนต์จากชุดอุปกรณ์ ให้ติดตั้งส่วนประกอบที่เกี่ยวข้องกับเซอร์โวตามภาพด้านบน และพยายามตรวจสอบให้แน่ใจว่าชิ้นส่วนเหล่านี้ตั้งฉากกัน (ขาท่อนบนตั้งฉากกับลำตัว และขาท่อนล่างตั้งฉากกับ ขาท่อนบน) โปรดดูบทที่เกี่ยวข้องในคู่มือผู้ใช้สำหรับรายละเอียด:

* Nybble
* [Bittle](https://app.gitbook.com/s/-MPQ2vWEZUH7ol6XE55o-887967055/4-connect-the-wires#5.2-prepare-for-calibration)
  {% endhint %}

{% hint style="warning" %}
หมายเหตุ: ใส่ส่วนประกอบที่เกี่ยวข้องกับเซอร์โวโดยตรงในเพลาขาออกของเซอร์โว ห้ามหมุนเพลาขาออกในระหว่างขั้นตอนนี้
{% endhint %}

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

{% hint style="info" %}
ยกเว้นอย่างเดียวคือมุมเอียงสำหรับหัวของ Nybble เป็นเรื่องปกติที่จะพูดว่า head up เป็นผลมาจากการหมุนตามเข็มนาฬิกา
{% endhint %}

{% hint style="info" %}
แต่จากด้านขวาของตัวหุ่นยนต์ ทิศทางการหมุนที่เป็นบวกและลบนั้นตรงกันข้ามกัน
{% endhint %}

### 3.2 ช่วงมุมที่ไม่ต่อเนื่อง

หากเราพิจารณาเพลาเซอร์โวอย่างใกล้ชิด เราจะเห็นว่ามีจำนวนฟันจำนวนหนึ่ง มีไว้สำหรับติดแขนเซอร์โว และเพื่อหลีกเลี่ยงการเลื่อนไปตามทิศทางการหมุน ในตัวอย่างเซอร์โวของเรา เฟืองแบ่ง 360 องศาออกเป็น 25 ส่วน แต่ละส่วนมี **14.4** องศา (ออฟเซ็ต -7.2\~7.2 องศา) นั่นหมายความว่าเราไม่สามารถติดตั้งในแนวตั้งฉากได้อย่างสมบูรณ์แบบเสมอไป

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FFqhN0HGKzc6zAnp447zr%2Fassets_bittle_-MTLzoDqllmeUcpCu5jV_-MTM-Wiv6R3xuNmAhgrE_37.png?alt=media\&token=c3737961-b7e0-4cb6-b40d-6113ff40cbc1)

## 4 การ calibration อย่างละเอียดโดยใช้ serial monitor

### 4.1 คำสั่งควบคุมข้อต่อ

คำสั่งสำหรับการ calibration แบบละเอียด (อ้างอิงจาก  [serial protocol](https://app.gitbook.com/o/-M-_eWZUjFA4usjshHcZ/s/-MQ6a951Q6Jn1Zzt5Ajr-887967055/~/changes/DHad2hALnPq88oSLEuF1/serial-protocol)) มีรูปแบบเป็น `cIndex Offset`. โปรดสังเกตว่ามีช่องว่างระหว่าง cIndex และ Offset หมายเลขข้อต่อของหุ่นยนต์แสดงในภาพด้านล่าง:

<br>

![Nybble](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FQoWGORkCBxjmJ96TpZ6e%2FjointIndexNybble.png?alt=media\&token=23cf197a-4b20-4772-a783-3fc2d0c7bfed) ![Bittle](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FSpqk5hOwTa6YL3sZDh3h%2FBittle-joint-Index.png?alt=media\&token=968d8bf5-9106-4ba5-bfae-0c44e76117df)

ตัวอย่างเช่น :

* `c8 6` หมายถึงให้เซอร์โวตัวที่ 8 มีออฟเซ็ต 6 องศา
* `c0 -4` หมายถึงการให้เซอร์โวตัวที่ 0 (ส่วนหัว) ชดเชย -4 องศา

{% hint style="warning" %}
ความละเอียดของการแก้ไขคือ 1 องศา ไม่ใช้ทศนิยม
{% endhint %}

{% hint style="info" %}
หากคุณพบว่าค่าออฟเซ็ตมีค่ามากกว่า 9 แสดงว่าคุณไม่ได้ติดแขนขาที่ใกล้กับสถานะศูนย์ของมันมากที่สุด ซึ่งจะส่งผลให้ช่วงของเซอร์โวที่เข้าถึงได้ลดลงในด้านใดด้านหนึ่ง ถอดแขนขาออกแล้วหมุนด้วยฟันซี่เดียว มันจะส่งผลให้เกิดออฟเซ็ตมีขนาดเล็กลง
{% endhint %}

{% hint style="info" %}
ตัวอย่างเช่น หากคุณต้องใช้ -9 เป็นค่าการ calibration ให้ถอดขาออก หมุนด้วยฟันซี่เดียวแล้วติดกลับเข้าไปใหม่ ค่าการ calibration ใหม่ควรอยู่ที่ประมาณ 5 หลีกเลี่ยงการหมุนแกนเซอร์โวระหว่างการปรับนี้
{% endhint %}

ค้นหาค่าออฟเซ็ตที่ดีที่สุดที่สามารถนำแขนขาไปสู่สถานะศูนย์ได้ เป็นกระบวนการลองผิดลองถูก

หลังจากการ calibration **อย่าลืมพิมพ์ 's' เพื่อบันทึกค่าออฟเซ็ต** มิฉะนั้นจะถูกลืมเมื่อออกจากสถานะการ calibration คุณยังสามารถบันทึกทุกครั้งหลังจากที่คุณทำการ calibration เซอร์โวตัวเดียวเสร็จแล้ว

### 4.2 Use ‘L’ shaped joint tuner

การสังเกตจะเปลี่ยนมุมมองต่างๆ นั่นเป็นเหตุผลที่เราต้องการอ่านโดยตรงเหนือไม้บรรทัดอ้างอิงเมื่อทำการวัดความยาว

สิ่งสำคัญอย่างยิ่งคือคุณต้องมีมุมมองที่ขนานกันเมื่อปรับเทียบ Bittle ใช้จูนเนอร์ข้อต่อรูปตัว 'L' เป็นข้อมูลอ้างอิงแบบขนานเพื่อหลีกเลี่ยงข้อผิดพลาดในการอ่าน วางปลายบนจูนเนอร์ให้ตรงกับกึ่งกลางของสกรูที่ข้อต่อไหล่และข้อเข่า และรูเล็กๆ ที่ปลายเท้า ดูตามแกนร่วมของศูนย์ สำหรับขาแต่ละข้าง ให้ปรับเทียบเซอร์โวไหล่ (หมายเลข 811) ก่อน จากนั้นจึงปรับเซอร์โวเข่า (หมายเลข 1215) เมื่อปรับเทียบข้อเข่า ให้ใช้ช่องสามเหลี่ยมที่ตรงกันทั้งบนตัวปรับจูนและด้ามเพื่อให้แน่ใจว่าจัดแนวขนานกัน

#### Nybble

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FygLkya62S1HUN9Cn7Rw5%2FNybble-L.jpg?alt=media\&token=943a92d1-ca1e-4c59-8ac7-e6533beb3c6e)

#### Bittle

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FYo5lUtLv96HWPlOI8JLd%2Fassets_bittle_-MSGw-I0q_j0kHosz8nz_-MSGx1sAobtzY1ucuddF_53.jpeg?alt=media\&token=9be5a3e5-6651-4f82-8599-9ea47e861fdc)

![Align the upper leg first](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FqH0w8MyStCVBVDopNtrG%2Fcalib1.png?alt=media\&token=7f499bec-e689-4cac-a736-d6d506e23b10)

![Pay attention to the reference edges for the lower leg](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FTbisNUZ7kRzq59rNgffv%2Fcalib2.png?alt=media\&token=fa045175-f834-4bda-98dd-0dd174245539)

###

### 4.3 การทดสอบและการตรวจสอบความถูกต้อง

หลังจากการ calibration พิมพ์ ‘d’ หรือ ‘kbalance’ เพื่อตรวจสอบการ calibration มันจะส่งผลให้ Bittle / Nybble ขยับแขนขาอย่างสมมาตรระหว่างสถานะพักและสถานะยืน

คุณอาจต้องทำการ calibration สองถึงสามรอบเพื่อให้ได้สถานะที่เหมาะสมที่สุด

ยกตัวอย่าง Bittle ดังนี้:

![](https://3127300255-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBR9bYMZnmeFFa1GJLvjM%2Fuploads%2FmtDK7tP12rwSQYlYPEmD%2FcalibValidation_Bittle.png?alt=media\&token=18bf86c9-2a00-4319-bd99-cfb8d693e300)

### 4.4 Center of mass

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

{% hint style="info" %}
คุณอาจต้อง calibrate ใหม่หากมีการเปลี่ยนแปลงจุดศูนย์กลางมวล
{% endhint %}

โปรดอย่าบังคับให้หุ่นยนต์เพิ่มของหนัก ซึ่งอาจทำให้เซอร์โวติดขัดได้
