# 为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>
