# 为NyBoard上传程序

## 配置流程

OpenCat 软件可在Petoi机器人上运行，主板是由基于 ATmega328P 的 NyBoard。 更详细的硬件信息请参考 [NyBoard V1\_0](https://docs.petoi.com/v/chinese/nyboard/nyboard-v1_0) 或 [NyBoard V1\_1](https://docs.petoi.com/v/chinese/nyboard/nyboard-v1_1) 。

{% hint style="info" %}
NyBoard 主板型号（版本信息)，可参考图示位置：

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FA6hvSf0oUMZNaqWGgiIp%2FNyBoardV1_1.jpg?alt=media\&token=44733683-da5b-4274-89ae-8ab4b890fa95)
{% endhint %}

### 将I2C开关(SW2)拨到“Arduino”

I2C 开关用于改变 I2C 设备（陀螺仪/加速度计、伺服驱动器、外部 EEPROM）的主控。 默认“Arduino”时，NyBoard 使用板载 ATmega328P 作为主控芯片； 拨到“RPi”端时，NyBoard 使用通过I2C 端口（SDA、SCL）连接的外部芯片作为主控芯片。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F4TWYQfoQfc4uKu8tYGeM%2FI2C_switch.png?alt=media\&token=775cfdd4-18f0-46ac-9ed5-96e5927f9c23)

{% hint style="warning" %}
注意：

* 有时，如果您无法启动Bittle / Nybble，则可能是您不小心将开关拨到了“RPi”端。
* 在上传固件前，请确保不要在主板的I2C接口连接任何I2C设备，否则会导致固件上载失败。I2C接口位置如下图示(红框内）：

  ![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FfV3Pe5lSdQuiXnVttsx6%2FI2C%E6%8E%A5%E5%8F%A3.png?alt=media\&token=62f280ea-9400-4470-ac29-4f4743e5cef6)
  {% endhint %}

### 下载和安装软件环境

{% hint style="info" %}
您将需要配置[Arduino集成开发环境](https://www.arduino.cc/en/software)，且最好是最新的版本，旧版本往往会编译出可能超出内存限制十六进制文件。
{% endhint %}

使用 NyBoard V1\_\*主板，您只需选择 Arduino Uno。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FPiUkjUzNX76P0hw9I2MR%2Funo.png?alt=media\&token=9b34e70c-cafd-4d53-b40e-f950bd5e62df)

{% hint style="warning" %}
只有当引导程序崩溃时才需要进行下列操作！

### 烧录引导程序

* [什么是引导程序？](https://www.arduino.cc/en/Hacking/Bootloader?from=Tutorial.Bootloader)

每块NyBoard在出厂时都经过了功能性测试，这意味着它们已经预先烧录了引导程序。但是，在极个别情况下，引导程度可能会崩溃并导致无法上传Arduino代码。

当然，不能上传代码往往是由其他原因造成的，而不是因为引导程序崩溃：

* 有时USB驱动可能会检测到一个USB设备的电流过大而主动禁用该设备。这时需要更换USB端口甚至重启电脑来再次激活USB端口；
* 需要安装FTDI USB2.0 UART上传器的驱动；
* 在Arduino IDE中没有选对串口；
* 接触不良；
* 运气不好 ☯️ 过两天可能又好了。

如果您确实需要重新烧录引导程序：

* 如果你手上的是**NyBoard V1\_\***，在Arduino IDE的**Tool**下选用**Arduino Uno**。
* 选择您的烧录工具。下面的截图突出显示了两种常用的编程器，高亮的 **USBtinyISP**是一种小巧便宜的专门的编程器，当前选择的**Arduino as ISP**是[用另一块Arduino板作为编程器](https://www.arduino.cc/en/Tutorial/ArduinoISP)；

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FZFsj1gaXuRiDaGSzHiWb%2FISP_new.png?alt=media\&token=83fb5668-db52-4a6d-abf1-4674ec2fb613)

* 把编程器接到NyBoard的2x6的SPI端口，注意接插方向和良好接触。您可以用手指轻轻按压插针确保良好的接触，但无需为这一次性操作把插针焊到主板上。

<img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FDRonIJCMmLHb1OEwSNDx%2Fbootloader.jpeg?alt=media&#x26;token=2efa0d04-9fc2-42dc-8fbb-c78a88d367c9" alt="" data-size="original">

* 点击**烧录引导程序**进行烧录。如果这是您第一次尝试烧录，请耐心多等一会儿，直到看见进度条达到100%并不再有新进度条或新信息跳出为止。
  {% endhint %}

### 连接USB上载器（USB适配器）

{% hint style="info" %}
此步骤不需要将NyBoard安装在机器人身上。
{% endhint %}

具体步骤可参考[USB上载模块中连接NyBoard](https://docs.petoi.com/v/chinese/tong-xin-mo-kuai/usb-xia-zai-mo-kuai-ch340c#lian-jie-nyboard)部分。

### 连接蓝牙上载器（可选）

具体步骤可参考[双模蓝牙模块中连接NyBoard](https://docs.petoi.com/v/chinese/tong-xin-mo-kuai/shuang-mo-lan-ya-mo-kuai#yu-nyboard-lian-jie)部分。

{% hint style="warning" %}
在 Mac 上，蓝牙可能会在多次上传后断开连接。 在这种情况下，请删除连接再重新连接。
{% endhint %}

{% hint style="warning" %}
在矽递及其代理渠道销售的版本中不包含蓝牙模块，请向<support@petoi.com>咨询购买方式。
{% endhint %}

### 下载OpenCat软件包

{% hint style="info" %}
我们一直将代码更新为一个开源项目。您可以加星标并关注我们的GitHub代码仓库以获取最新功能和错误修复。您还可以与全球OpenCat用户共享代码。

欢迎提交代码！！！
{% endhint %}

* 从GitHub下载最新的OpenCat代码库：<https://github.com/PetoiCamp/OpenCat>。最好使用GitHub的版本控制功能。否则，请确保您每次都下载全部的OpenCat文件夹。所有代码必须是相同版本时才能一起使用。

<figure><img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FP53DxAgAF6bA9rVaFPns%2FdownloadGithubRepo.png?alt=media&#x26;token=a0747112-c7ec-4ae4-9af3-4d5da30de2c2" alt=""><figcaption></figcaption></figure>

* 如果下载代码的Zip文件，则解压缩后将获得一个OpenCat-main文件夹。把它重命名为 OpenCat。

{% hint style="warning" %}
Arduino规定代码必须放在同名文件夹之下，您需要在打开OpenCat.ino之前将文件夹OpenCat-main重命名为OpenCat（即删除-main 后缀），否则，Arduino 会在打开 OpenCat.ino 时创建一个新的 OpenCat 文件夹，并将 OpenCat.ino 移动进去，就会打破相关文件的路径结构。

无论您将文件夹保存在何处，文件结构都应如下图所示：

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F6oydQf6IQyuh1GCoWKHb%2FOpenCat2.0_tree.png?alt=media\&token=64f71188-63ff-4430-b4bc-a67823e56110)
{% endhint %}

* ModuleTests文件夹中有几个名为testX（X代表功能模块，比如蜂鸣器陀螺仪）.ino的代码。您可以上传它们以分别测试对应模块。打开任何带有前缀“ test”的testX.ino的工程。 （我建议您使用testBuzzer.ino作为第一个测试项目）。
* 打开串行监视器并设置波特率。使用NyBoard V1\_ \*，将开发板选为Arduino Uno，然后在代码和串口监视器中将波特率设置为115200。
* 编译代码，应该没有错误提示。如果有请根据提示查找问题，一般问题为缺少某些库，根据需要安装即可。随后上传到您的开发板上，您应该看到Tx和Rx LED快速闪烁。一旦它们停止闪烁，消息应出现在串口监视器上。

### 上传程序固件

代码中配置主板，请按照以下步骤操作：

#### 1. 配置机器人产品类型和主板版本

打开文件 **OpenCat.ino**，选择您的机器人 产品类型 和 主板版本。 例如：

```cpp
#define BITTLE    //Petoi 9 DOF robot dog: 1x on head + 8x on leg
//#define NYBBLE  //Petoi 11 DOF robot cat: 2x on head + 1x on tail + 8x on leg

//#define NyBoard_V0_1
//#define NyBoard_V0_2
#define NyBoard_V1_0
//#define NyBoard_V1_1
```

{% hint style="info" %}
符号 **//** 停用代码行并将它们转换为注释。 确保您只使用了其中一行并行选项。
{% endhint %}

#### 2.进入主板配置模式

&#x20;注释此行代码#define MAIN\_SKETCH，保存、编译、上传程序固件后，机器人将进入主板配置模式。 上传完成后，请按照串口提示信息继续操作。

```cpp
// #define MAIN_SKETCH
```

{% hint style="info" %}
如果您激活此行代码 #define AUTO\_INIT，程序将自动设置而不进行串口提示。 它不会重置关节校准数据，但会校准 IMU。 对于我们的生产线来说，这只是一个方便的选择。
{% endhint %}

#### 3. 将 USB 上载器插入您的计算机

&#x20;如果在 Arduino -> Tools -> Port 下没有找到 USB 端口，请安装[驱动程序](https://docs.petoi.com/v/chinese/tong-xin-mo-kuai/usb-xia-zai-mo-kuai-ch340c#qu-dong-cheng-xu)。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F2CyVevnONo4L1TmeMe0e%2F%E4%B8%B2%E5%8F%A3%E5%88%97%E8%A1%A8.PNG?alt=media\&token=a3c55de2-0990-44e1-b3de-e06858985211)

#### 4. 将 USB 上载器插入 NyBoard

具体方法可参考[USB上载模块中连接NyBoard](https://docs.petoi.com/v/chinese/tong-xin-mo-kuai/usb-xia-zai-mo-kuai-ch340c#lian-jie-nyboard)部分。

#### 5. 上传主板配置程序

点击 **上传** 按钮即可上传主板配置程序。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FSf49BhEkAFKv1HkA8TBa%2F%E4%B8%8A%E4%BC%A0%E6%8C%89%E9%92%AE.PNG?alt=media\&token=2ccd6f20-5084-482d-a80b-005acb4585f4)

#### 6. 打开串口监视器

您可以在菜单栏 **工具** 下方或者在主界面的右上角找到按钮。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2Fs5Irrd99t8leKBmVVjqk%2F%E4%B8%B2%E5%8F%A3%E7%9B%91%E8%A7%86%E5%99%A8%E6%8C%89%E9%92%AE02.PNG?alt=media\&token=731420b8-57c6-42ed-a3b0-29a0051d1f66)

<figure><img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FeJjyYjtbGbkzJSAeJbHr%2Fimage.png?alt=media&#x26;token=583b223b-6b84-4aa7-a795-c0f3e8354bc7" alt=""><figcaption></figcaption></figure>

在输入命令之前，请确保串口监视器设置为 “**没有结束符**”（No line ending），否则不可见的' \n'或' \r'字符将使解析函数失效。波特率设置为 "**115200 波特率**" （115200 baud）。

#### 7. 清除校准数据

串口提示内容如下：

```cpp
Reset joint offsets? (Y/n):
```

如果要将所有关节的校准数据重置为 0，请输入“**Y**”并按回车键 (**Enter**)。 程序将进行重置，然后更新静态内存中的常量和本能技能。

{% hint style="info" %}
您必须输入‘Y’或‘n’来越过这一步，否则后续的参数（比如技能数据）将不能正常地更新到主板上。
{% endhint %}

#### 8. 校准IMU

串口提示: 是否校准IMU (Inertial Measurement Unit)？

```cpp
Calibrate the IMU? (Y/n): 
```

如果您从未校准过 IMU 或想要重新校准，请输入“Y”并按回车键 (Enter)。 将机器人平放在桌子上，不要触摸它。 机器人会长鸣六声给你足够的时间。 然后它将读取数百个传感器数据并保存偏移量。 校准完成时会发出蜂鸣声。&#x20;

当串口监视器打印“Ready!”时，您可以关闭串口监视器进行下一步操作。&#x20;

#### 9. 校准舵机驱动芯片

在校准 IMU后有一步可选的操作来校准舵机驱动：

```
Optional: Connect PWM 3 -> Grove pin A3 to calibrate PCA9685
```

您可以通过校准舵机驱动芯片（PCA9685 chip）来让角度控制更加精准。用一根跳线连接 PWM 引脚3（舵机控制脚的信号脚之一 ）和 Grove 引脚 A3，并把线按稳。

<figure><img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F77egd72R78jXgKCNdIFk%2F%E8%B7%B3%E7%BA%BF.jpg?alt=media&#x26;token=c9bf518e-d48c-4992-a99b-9a72693101a0" alt=""><figcaption></figcaption></figure>

您不需要专门的跳线来完成这一步。任何能连通引脚的细金属线都可以，比如拉直的回形针。

程序会测量信号脉宽，在连续三次测量到相同读数后自动校准芯片。校准修正值会被存入控制板并在下次启动时生效。然后您可以继续进行下一步。

{% hint style="warning" %}
如果机器人的某个舵机停止转动，但将电池断电重启后又能转动，很可能就是因为舵机驱动信号不准，这一步就不可跳过。
{% endhint %}

#### 10. 上传主要功能程序

此行代码 #define MAIN\_SKETCH  取消注释，并保存修改以使其处于激活状态。 编译、上传程序固件后，机器人将运行主要功能的正常程序。&#x20;

```cpp
#define MAIN_SKETCH
```

再次打开串口监视器，当串口监视器打印“Ready!”时，恭喜：机器人已准备好接受您的下一条指令！:v:

{% hint style="info" %}
请在上传完主要功能程序后，再进行[校准舵机](https://docs.petoi.com/v/chinese/arduino-ide/shi-yong-arduino-ide-xiao-zhun-duo-ji)。
{% endhint %}

#### 11. 代码中的模块宏

默认程序是标准模式。如果您有一些[扩展模块](https://docs.petoi.com/v/chinese/kuo-zhan-mo-kuai/kuo-zhan-mo-kuai-gai-yao-shuo-ming)，可以将这些模块的宏定义语句取消注释。这样会禁用陀螺仪的代码节省出一些编程空间，并激活这些扩展模块的演示代码。

<figure><img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FmABrVSSlXPoXmOx6ZlS1%2Fmodules.png?alt=media&#x26;token=2a0e553d-b9fe-40aa-bd9e-a972677e6263" alt=""><figcaption></figcaption></figure>

官方模块的代码是在 src/里的单独头文件里定义的。您可以在OpenCat/src/io.h -> readSignal()找到它们对应的函数。 OTHER\_MODULES（其他模块）的行为在OpenCat/OpenCat.ino ->  otherModule()定义。您可以参考示例代码写出自己的功能。

<figure><img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F2FT0dUfb4BzqFOkj83JP%2Fother.png?alt=media&#x26;token=dbf478a1-4cf7-4666-9096-a9ed025f2f2c" alt=""><figcaption></figcaption></figure>

#### 12. 修改“关节-引脚”映射

在某些情形下，您也许需要更改机器人的“关节-引脚”映射，它可以在**OpenCat/src/OpenCat.h**中修改。注意要按照 OpenCat.ino 开头的主板版本来修改相应的代码段落。修改后记得保存，并重复从第2步开始的上传步骤。

<figure><img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FsVPcuoLABifA2drV2WNi%2FchangingPin.jpeg?alt=media&#x26;token=0b015e33-d0dc-4f3c-be16-6bdfcab246e5" alt=""><figcaption></figcaption></figure>


---

# 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/chinese/arduino-ide/wei-nyboard-shang-chuan-cheng-xu.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.
