# 为NyBoard上传1.0版本程序

以下视频展示了如何使用Arduino IDE 对 Bittle 进行配置。 这些步骤与 Nybble 相同，您只需要将 OpenCat.h 中的产品定义更改为 Nybble。

```cpp
//#include "InstinctBittle.h" //activate the correct header file according to your model 
#include "InstinctNybble.h" 
```

{% embed url="<https://www.youtube.com/watch?v=MbTN4IcuqLo>" %}

## 1 NyBoard

### 1.1 阅读用户手册

在 NyBoard 上找到主板的版本信息。如下图所示：

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FpLs6cH3djnw4X7uLVdTR%2FNyBoardV1_1.jpg?alt=media\&token=fae7d52a-95af-4338-8254-229eb799875a)

#### Nybble

相应的规格文档：[NyBoard V0\_1](https://github.com/PetoiCamp/OpenCat-Old/blob/master/Resources/NyBoard/NyBoardV0_1.pdf)、[NyBoard V0\_2](https://github.com/PetoiCamp/OpenCat-Old/blob/master/Resources/NyBoard/NyBoardV0_2.pdf)、[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)（轻度修订）。

#### Bittle

相应的规格文档：[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)。

以 NyBoard V1\_0 为例，如下图所示：

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FCDQnMeM3PP9H1Rju5r3O%2FNyBoardVersion.png?alt=media\&token=7cf8b6a7-366f-49a0-917c-14316f57d622)

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FB0H9DdkcyyFlZegl6iU2%2Fassets_-MPQ2vWEZUH7ol6XE55o_-Mafr-LQL8D20NOtf8CC_-Mafr2YgZpKEumQgfq4g_NyBoardV1new_B.png?alt=media\&token=264d235f-309e-4204-8ddd-dcc3cfadd9f8)

{% hint style="danger" %}
错误的操作可能会损坏您的 NyBoard！
{% endhint %}

### 1.2  把滑动开关拨到Arduino档.

滑动开关用于选择Nyboard上板载I2C设备（陀螺仪/I2C PWM控制器以及EEPROM）的连接属性。

当开关位于“Arduino”端的时候，这些I2C设备将同ATMega328P通信，Arduino可以访问这些设备

当开关位于“Pi”端的时候，这些I2C设备将断开和ATMega328P的连接，主板上的 树莓派接口 和 Grove I2C 接口上的设备将成为主设备。

{% hint style="warning" %}
有时，如果您无法启动，则可能是您不小心将开关拨到了“Pi”端。
{% endhint %}

{% hint style="warning" %}
以下部分保留用于 NyBoard 旧版本 (V0系统)：

### 1.3 把电位器顺时针转至最低输出

{% hint style="success" %}
从NyBoard V0\_2开始，我们在板上添加了一个跳线帽选择开关，可以绕过降压芯片电路直接给舵机供电。如果您使用的是Nybble套件中的金属齿舵机，可以跳过这一小节。
{% endhint %}

高电压可以提升舵机的转矩，使Nybbles运动更迅速。代价是它同时会增大电流、缩短电池寿命，降低电路的稳定性，以及加速舵机的磨损。据我们测试，5.5V的电压可以得到一个比较平衡的性能表现。

在最初组装时，先不要把NyBoard的螺丝拧紧，因为可能还要调节电位器。在微调校准之前 ，确保所有舵机可以在当前电压设置下正常、稳定地转动。

### 1.4. 把NyBoard调节到最佳状态

在设计NyBoard时我考虑了两种使用场景：作为Nybble配套的驱动板，和DIY用户的开发板。

板载的降压电路可在5\~8V输出之间调节，峰值电流不能超过5A。Nybble套件中的金属齿舵机可以承受高压，功率大，通过NyBoard的降压电路会有过载保护的问题，最好由电池直接供电。而DIY用户往往选用更便宜的塑料齿舵机，但它们不能承受高压，必须降压到5.5V左右才能使用。好在塑料齿舵机的工作电流更低，也不会触发降压电路的过载保护了。

所以如果使用的是配套的金属齿舵机，推荐直接由电池供电。对于初版NyBoard\_V0\_1，这需要一些焊接工作，可见[论坛帖子](https://www.petoi.com/forum/hardware/reconfigure-nyboard-v0-1-for-pro-users)。对于更新NyBoard\_V0\_2，可以更方便地把跳线帽SW3接在BATT和V\_S之间（出厂时SW3默认接在V\_S和V+之间，以免烧坏塑料齿舵机)。

{% hint style="warning" %}
V\_S 表示舵机供电。跳线帽可以选择到底是由降压电路（V+）还是电池组（BATT）供电，所以BATT和V+永远不应该短接。
{% endhint %}

{% hint style="info" %}
事实证明，当直接使用 BATT 而不是 V+ 为金属齿舵机供电时，NyBoard 的工作更稳定。 但是，如果您使用 NyBoard 驱动您自己的塑料齿轮伺服系统，则需要使用降压电路。
{% endhint %}
{% endhint %}

NyBoard用7.2V电池直接为金属舵机供电，电池充满电时为8.4V。您不能使用NyBoard直接驱动自己的塑料舵机（比如SG系列）。

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

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

如果您先前已添加其他库并看到错误消息\`\`XXX库已安装''，我建议您先[删除它们](https://stackoverflow.com/questions/16752806/how-do-i-remove-a-library-from-the-arduino-environment)。

由于Arduino IDE安装的配置不同，如果您在以后的编译过程中看到有关缺少库的任何错误消息，只需用baidu他们（google也可以）并将其安装到IDE中即可。

{% hint style="warning" %}
如果您在 2022 年 1 月 3 日之后从 GitHub 下载了最新的 [OpenCat 代码](https://github.com/PetoiCamp/OpenCat)，则可以跳过以下库安装步骤。

### 2.1  通过库管理器安装所需的库文件

在Arduino的库管理器（操作指南 : <https://www.arduino.cc/en/Guide/Libraries>）中，搜素并安装以下的库：

* **Adafruit PWM Servo Driver**
* **QList（非必须）**
* **IRremote**

  IRremote库在近期有更新，甚至更改了按键的编码。你可以安装2.6.1版本实现对我们代码的兼容。

  为节省编程空间，你可以禁用IRremote.h中没用到的解码器，这样可以省出10%的flash空间！

  在Mac上，找到**Documents/Arduino/libraries/IRremote/src/IRremote.h**，并把没用到的解码器置0：

  ```
  #define DECODE_RC5           0
  #define SEND_RC5             0

  #define DECODE_RC6           0
  #define SEND_RC6             0

  #define DECODE_NEC           1
  #define SEND_NEC             0

  #define DECODE_SONY          0
  #define SEND_SONY            0

  ...

  #define DECODE_HASH          1 // special decoder for all protocols
  ```

### 2.2  使用压缩包（.zip）安装库

使用被广泛使用的I2Cdev库和MPU6050库，传送门：[jrowberg/i2cdevlib: I2C device library collection for AVR/Arduino or other C++-based MCUs](https://github.com/jrowberg/i2cdevlib)

我相信你们的git用的很好，下载下来就OK。无论是用git clone或者download zip。注意选一下是Arduino下的，主要要红色箭头指示的2个库，I2Cdev是负责I2C通信的；MPU6050是启用DMP（数字融合处理器，做姿态解算的），当然也可以全部下载下来。

<img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FolcGkPZbIQPgdwO5Zlsg%2Fi2clib02.png?alt=media&#x26;token=e9f305f2-1c2f-448f-88ba-1422959f4747" alt="" data-size="original">

在IDE里点击：项目 -> 加载库 -> 添加.zip库，把刚刚下的ZIP直接导入即可

<img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2Fp7Y19lAqJjtzAaoMcTd6%2Fi2clib_import.png?alt=media&#x26;token=5eae936d-ac25-4ee4-a068-4ffd4c7c9b83" alt="" data-size="original">

服务到位给您下载好了：
{% endhint %}

{% file src="<https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FRRuguAqVQ2JDGLAKKJg8%2Fmpu6050.zip?alt=media&token=f230b463-bddd-4671-b692-3d4c87a53624>" %}

{% file src="<https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F5MJxpJTh5tfrWSfcXQWB%2FI2Cdev.zip?alt=media&token=1afb009e-a6cf-4a10-a021-42db3844858c>" %}

### 2.3  增加NyBoard支持

对于V1版本的Nyboard (**NyBoard V1\_\***) 完全兼容UNO，选UNO即可。&#x20;

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F2JNXLl9E8gwEGK6VzeDx%2Funo_cn.png?alt=media\&token=cdfa4195-4aed-495d-af3f-78acf6bcb05a)

{% hint style="warning" %}
以下部分适用于旧版本 (V0)

* 如果你手上的是**NyBoard V0\_\***，因为它超频到了20MHz，你需要按下列步骤添加配置文件：

#### 自动添加NyBoard支持

{% hint style="success" %}
感谢[A-Ron](https://github.com/asmagill)对这一节的贡献！
{% endhint %}

<img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FOlHIO0wmNbzdXl1ocOBX%2FNyBoardURL.png?alt=media&#x26;token=755f4a1f-1212-406a-96f4-13fb6d82aeb3" alt="" data-size="original">

1. 打开Arduino首选项面板。
2. 在**附加开发板管理器网址**处，添加： <https://raw.githubusercontent.com/PetoiCamp/OpenCat/main/Resources/NyBoard/boardManager/package_petoi_nyboard_index.json>。如果里面已经有其他网址了，可以用逗号或者换行来分隔它们。
3. 点击“好”关闭首选项面板（需要先关闭之前的网址编辑器）。
4. 从**工具 -> 开发板: XXXX -> 开发板管理器...** 打开 **开发板管理器**。
5. 搜索“nyboard”。
6. 安装NyBoard。
7. 关闭**开发板管理器**。
8. 从 **工具 -> 开发板** 选择 **开发板** **ATmega328P (5V, 20 MHz) NyBoard XXXX**  (NyBoardV0\_1 和 NyBoardV0\_2 选用同样的开发板)。

#### 手动添加NyBoard支持

{% hint style="warning" %}
只有当以上方法无效时使用！
{% endhint %}

* 找到开发板配置文件 **boards.txt**

**苹果系统：**

/Users/UserName/Library/Arduino15/packages/arduino/hardware/avr/version#/

或

/Applications/Arduino.app/Contents/Java/hardware/arduino/avr

右键点击Arduino.app图标显示程序包内容。

**Windows系统：**

C:\Program Files(x86)\Arduino\hardware\arduino\avr\\

{% hint style="warning" %}
通过Microsoft商店安装的程序可能会安装在隐藏目录，可以直接[从Arduino官网下载IDE](https://www.arduino.cc/)并手动选择安装位置。
{% endhint %}

**Linux**&#x20;

从终端命令行下载到的也许不是最新版本，可以[从Arduino官网下载IDE](https://www.arduino.cc/en/Main/Software)然后解压安装:

`sudo install.sh`

boards.txt 的位置可能随Linux版本有不同：

**Fedora:**&#x20;

/etc

**Arch:**&#x20;

/usr/share/arduino/hardware/archlinix-arduino/avr/

**Mint:**

location\_of\_installation/arduino/hardware/arduino/avr

**Ubuntu** (on 18.04 when installing with \`apt-get install arduino\`):&#x20;

/usr/share/arduino/hardware/arduino/boards.txt

找到 **boards.txt** 后：

* 备份 **boards.txt** 便于回滚操作
* 新建一份 **boards.txt**

您可以下载我修改后的[**boards.txt**](https://raw.githubusercontent.com/PetoiCamp/OpenCat/main/Resources/NyBoard/boards.txt)**，**&#x6216;者自行修改您原来的**boards.txt**，可能需要管理员权限。

用文本编辑器打开**boards.txt**，找到`pro.name=Arduino Pro or Pro Mini`的代码段，插入

```
## Arduino Pro or Pro Mini (5V, 20 MHz) w/ ATmega328P
## --------------------------------------------------
pro.menu.cpu.20MHzatmega328=ATmega328P (5V, 20 MHz) NyBoard

pro.menu.cpu.20MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.20MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.20MHzatmega328.upload.speed=57600

pro.menu.cpu.20MHzatmega328.bootloader.low_fuses=0xFF
pro.menu.cpu.20MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.20MHzatmega328.bootloader.extended_fuses=0xFD
pro.menu.cpu.20MHzatmega328.bootloader.file=atmega/ATmega328_20MHz.hex

pro.menu.cpu.20MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.20MHzatmega328.build.f_cpu=20000000L

## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328P
## --------------------------------------------------
```

如下图:

```
##############################################################
pro.name=Arduino Pro or Pro Mini

pro.upload.tool=avrdude
pro.upload.protocol=arduino

pro.bootloader.tool=avrdude
pro.bootloader.unlock_bits=0x3F
pro.bootloader.lock_bits=0x0F

pro.build.board=AVR_PRO
pro.build.core=arduino
pro.build.variant=eightanaloginputs

## Arduino Pro or Pro Mini (5V, 20 MHz) w/ ATmega328P
## --------------------------------------------------
pro.menu.cpu.20MHzatmega328=ATmega328P (5V, 20 MHz) NyBoard

pro.menu.cpu.20MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.20MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.20MHzatmega328.upload.speed=57600

pro.menu.cpu.20MHzatmega328.bootloader.low_fuses=0xFF
pro.menu.cpu.20MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.20MHzatmega328.bootloader.extended_fuses=0xFD
pro.menu.cpu.20MHzatmega328.bootloader.file=atmega/ATmega328_20MHz.hex

pro.menu.cpu.20MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.20MHzatmega328.build.f_cpu=20000000L

## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328P
## --------------------------------------------------
```

保存并退出编辑器。

* 下载 [ATmega328\_20MHz.hex](https://raw.githubusercontent.com/PetoiCamp/OpenCat/main/Resources/NyBoard/bootloaders/atmega/ATmega328_20MHz.hex) 并保存到Arduino文件夹 ./bootloaders/atmega/。 在该文件夹中应该还有其他开发板的后缀为.Hex的文件。

重启Arduino IDE。在**工具->开发板**中，选择**Arduino Pro or Pro Mini**。在子目录里会出现 **ATmega328P (5V, 20 MHz) NyBoard**。

<img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FHz2qnoalS6RW8QczIOLt%2FprocessorSelection.png?alt=media&#x26;token=c5bf168a-f0b9-493c-9cf2-26b83f84dd7a" alt="" data-size="original">

{% hint style="info" %}
如果完成以上操作后仍找不到NyBoard，可能是您的Arduino IDE的有效配置文件存在其他位置。在电脑的所有位置搜索boards.txt，看看是不是有新的发现。
{% endhint %}
{% endhint %}

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

### 2.4 为板子烧录Arduino的Bootloader（这不是常规操作）

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

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

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

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

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

* 如果你手上的是**NyBoard V1\_\***，在Arduino IDE的**Tool**下选用**Arduino Uno**
* 如果你手上的是**NyBoard V0\_\*** ，就需要选用**NyBoard (ATmega328P 5V, 20MHz)**

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FnZTWZ5rRt4Gzd4zx4B61%2FISP_new.png?alt=media\&token=8c3cef9c-435d-4eea-b5aa-ba7b722cc932)

* 选择您的烧录工具。上面的截图突出显示了两种常用的编程器，高亮的 **USBtinyISP**是一种小巧便宜的专门的编程器，打勾的**Arduino as ISP**是[用另一块Arduino板作为编程器](https://www.arduino.cc/en/Tutorial/ArduinoISP)
* 把编程器接到NyBoard的2x6的SPI端口，注意接插方向和良好接触
* 点击**烧录引导程序**进行烧录。如果这是您第一次尝试烧录，请耐心多等一会儿，直到看见进度条达到100%并不再有新进度条或新信息跳出为止。
  {% endhint %}

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

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

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FX0grtiujRKDlqoG8lJud%2FusbAdapter1.jpg?alt=media\&token=17c8b03c-a265-4fc0-a68d-c1ca6d5b6a10)

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FfLwYsdV5h33ngbp6cvrj%2FusbAdapter2.jpg?alt=media\&token=2a198bea-c5b6-432d-b808-d9569c075b42) ![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FQzmdQn8Jx8M2Hg8V6rlG%2FPlug_in_usb_uploader.jpeg?alt=media\&token=159d861e-0da7-4802-a9aa-990a9cfba409)

{% hint style="info" %}
下图显示了之前套件中的两个 FTDI 板。

<img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FbgBcanR2CcTQQGauzoBE%2FFTDIcompare.jpg?alt=media&#x26;token=d5aa7676-6fe4-4056-94be-f33cebc598a5" alt="" data-size="original">

红色上传器上有电平选择跳线帽，拔到5V。在连接上传器和NyBoard的6针母座时要注意方向，可以用地线GND作为参考。

<img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FjtnNhFf7kyzxmcns5Zbu%2FFTDIconnection.jpg?alt=media&#x26;token=511d9a2f-ebc0-48a9-a97a-2d7bc9232136" alt="" data-size="original">

<img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FwNKBLkrRrAPMPGWEXGBv%2FFTDIonNybble3.jpg?alt=media&#x26;token=0b960c88-105a-4a29-9942-735f4ba018bb" alt="" data-size="original">

先用 miniUSB-USB 线缆连接电脑和FTDI上传器。红色款上传器有三个LED灯，电源，Tx和Rx，蓝色款上传器没有电源灯。在接通电脑USB的瞬间，Tx和Rx灯会闪一下然后会熄灭，表明有初始的信息传输。然后您可以在Arduino IDE的**工具->端口**找到对应的串口 “/dev/cu.usbserial-xxxxxxxx”（苹果系统） 或 “COM#” （Windows系统）。
{% endhint %}

通过USB到micro-USB电缆将您的计算机与USB上载器连接。

USB上载器具有三个LED，即电源（红色），Tx和Rx。连接后，Tx和Rx应该闪烁一秒钟，指示初始通信，然后变暗。仅电源LED指示灯应保持点亮状态。您可以在“工具”->“端口”下找到一个新端口，名称为：

“ /dev/cu.usbserial-xxxxxxxx” （Mac）

“ COMX ”（Windows，注意一定不是COM1，COM1一般台式机有，RS232串口）

“ttyUSB” （Linux，注意Arduino是否有读写该设备的权限，没有就chmod）

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FKz19qp6RMz67ZPNGgKyr%2F%E4%B8%B2%E5%8F%A3%E5%88%97%E8%A1%A8_cn.PNG?alt=media\&token=e7fb73ab-8d88-4009-a200-4a9ee7ff2614)

{% hint style="danger" %}
如果Tx和Rx灯常亮，也不闪烁，则串口通讯可能存在问题，这时串口也不会显示在串口列表里。这往往是由于NyBoard在驱动舵机时没有外接电源，USB端口被过流保护禁用导致的。
{% endhint %}

特别提一下Linux，将上载器连接到计算机后，您将在串行端口列表中看到“ ttyUSB＃”。但是上传时，您仍然可能会遇到串行端口错误。您将需要授予串行端口权限。请转到此链接并按照说明进行操作 <https://playground.arduino.cc/Linux/All/#Permission>

{% hint style="info" %}
驱动程序在这里，理论上Win10免驱

Mac: <http://www.wch.cn/download/CH341SER_MAC_ZIP.html>

Windows: <http://www.wch.cn/download/CH341SER_EXE.html>
{% endhint %}

### 2.6  连接蓝牙模块 (可选)

连接蓝牙模块， 您可以使用智能手机 APP 或 Web API 控制机器人。

在标准机器人套件中包含我们的官方蓝牙模块。 波特率请设置为 115200。

您需要像使用蓝牙 AirPod 一样将其连接到计算机。 默认密码为 0000 或 1234。然后您可以在 Arduino IDE 的 Tools->Port 下选择它，使用方法与USB上载器相同。

具体连接方法请参考[双模蓝牙模块](https://docs.petoi.com/v/chinese/mo-kuai-shi-yong-zhi-nan-1/shuang-mo-lan-ya-mo-kuai)相应章节。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2Ftu5oQccWSgqCPvnuKPfK%2Fbluetooth_cn.png?alt=media\&token=30502249-ed2c-44a6-a9a6-feb91a6616ff)

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FDDpMdzP3RpCjfbguI8ne%2Fblue.jpg?alt=media\&token=23328f3a-6945-4656-b290-2a919d94e9d4)

{% hint style="warning" %}
如果您使用的是NyBoard V0\_\* 主板，您需要将其波特率设置为 **57600** 。
{% endhint %}

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

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

### 2.7  下载OpenCat软件包

* 从 GitHub 下载 1.0 OpenCat 存储库：<https://github.com/PetoiCamp/OpenCat/tree/1.0>
* 如果下载代码的Zip文件，则解压缩后将获得一个OpenCat-1.0文件夹。您需要在打开OpenCat.ino之前将其重命名为OpenCat（Arduino规定代码必须放在同名文件夹之下）。

{% hint style="warning" %}
无论您将文件夹保存在何处，文件结构都应为：

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FuAUJGm14121Uf67mSqTB%2FOpenCat1.0_tree.png?alt=media\&token=bf710c29-06a9-4227-969f-395c3252bc16)
{% endhint %}

* ModuleTests文件夹中有几个名为testX（X代表外设，比如蜂鸣器陀螺仪）.ino的代码。您可以上传它们以分别测试某些模块。打开任何带有前缀“ test”的testX.ino的工程。 （我建议您使用testBuzzer.ino作为第一个测试项目）。
* 打开串行监视器并设置波特率:
  * 使用NyBoard V1\_ \*，将开发板选为Arduino Uno，然后在代码和串口监视器中将波特率设置为115200。
  * 使用NyBoard V0\_\*，将开发板选为NyBoard (ATmega328P 5V, 20MHz)，然后在代码和串行监视器中将波特率设置为 57600。
* 编译代码，应该没有错误提示。如果有请根据提示查找问题，一般问题为缺少某些库，根据需要安装即可。随后上传到您的开发板上，您应该看到Tx和Rx LED快速闪烁。一旦它们停止闪烁，消息应出现在串口监视器上。
* 在输入命令之前，请确保串口监视器设置为“没有结束符” （No line ending）。否则，不可见的' \n'或' \r'字符将使解析函数失效。

![NyBoard V0\_\*](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FNK1enXeEZZIamX18BOzS%2FserialMonitor%20\(V0%E6%9D%BF\).png?alt=media\&token=e1f727c1-4584-4f2a-9f0d-56f56ab8362e) ![NyBoard V1\_\*](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F79SiID8DKaHvBCui2RZa%2F%E4%B8%B2%E5%8F%A3%E7%9B%91%E8%A7%86%E5%99%A8.PNG?alt=media\&token=c996d991-f469-4f3c-bc5b-b7996b363bc6)

对于Linux计算机，您初次编译时可能会看到错误消息，例如“ permission denied（权限被拒绝）”。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2Fjg38gfPgMZJq8TgWpDcT%2FLinux%20error%20message.jpeg?alt=media\&token=4090ea4c-4192-486c-aa0c-dfce3491dabd)

您将需要向avr-gcc添加执行特权才能编译Arduino程序：

`sudo chmod +x filePathToTheBinFolder/bin/avr-gcc`

此外，您需要为/ bin中的所有文件添加执行权限，因此命令为：

`sudo chmod -R +x /filePathToTheBinFolder/bin`

## 3  使用串口通信协议

通过连接NyBoard和Arduino IDE的USB上载器 /蓝牙模块，就可以和Nyboard直接通信了。

我们预先定义了一些指令，指令和参数表如下：&#x20;

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FSOdHbCY0Mc1YgudYdjE2%2FserialProtocol.png?alt=media\&token=15aee24d-c8d2-4b9f-84fe-52c09d816f13)

所有的命令都是以单个ASCII字符开头，并区分大小写。通常指令为小写。

{% hint style="info" %}
有的指令，如“c”和“m”是复合命令：

比如：连续命令如：“ m8 40”，“ m8 -35”，“ m 0 50”可以写为“ m8 40 8 -35 0 50”。您最多可以组合四个相同类型的命令。确切地说，字符串的长度应小于30个字符。您可以在代码中更改限制，但是串行缓冲区可能会有系统的限制。
{% endhint %}

{% hint style="warning" %}
一些命令尚未实现，例如“h”。 命令“i”和“l”在软件版本 1.0 中仍然存在一些错误。
{% endhint %}

## 4  使用树莓派接口&#x20;

{% hint style="warning" %}
机器人的运动是不需要树莓派的，树莓派是机器人的主控上位机。

&#x20;您需要断开USB上载器才能与 Pi 的串行端口进行通信。
{% endhint %}

您可以在NyBoard上焊接2x5插座，就可以连接Raspberry Pi。 Pi 3A +最适合Bittle的型号。

### Nybble

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FsH8XgLfbhT8ctBCZ2DJf%2F_B2L8832%20Large.jpeg?alt=media\&token=d025f2c3-c878-4b33-b2ec-0d4f5be65359)

### Bittle

{% hint style="danger" %}
焊上了2x5的插座后，Bittle的盖子就盖不上了。
{% endhint %}

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2Fmpa8gsTf4gKEVeeUyjBI%2FPi01.jpg?alt=media\&token=5902cb57-a136-4db1-a709-1e024497bc44)

红色的[树莓派卡扣](https://github.com/PetoiCamp/NonCodeFiles/blob/master/stl/Bittle%20%26%20BittleX/RaspberryPiStandOff/Pi3A_standOff.stl)可以3D打印。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2F0XBlzm47Ax2qPp7JLel3%2FPi3a.jpg?alt=media\&token=5716d9a1-2962-4b4e-a779-b7ddc7e83365)

如[串行协议](https://bittle.petoi.com/v/zhong-wen/4.-she-zhi-nyboard#4-3-shi-yong-chuan-kou-tong-xin-xie-yi)所示，Arduino IDE的串口监视器支持的命令参数全部编码为AscII码字符串，主机（例如RasPi）支持额外的命令，大多数命令都编码为二进制字符串以进行有效编码。例如，当编码角度为65度时：

* Ascii码字符串: 2个字节的char，'6' 和 '5'
* 二进制字符串: 1个字节的char，‘A’

{% hint style="info" %}
值 -113 如何处理？ 它需要四个字节作为 AscII码字符串，但在二进制编码中仍然只需要一个字节，尽管内容将不再可作为字符打印。
{% endhint %}

显然，二进制编码比AscII码字符串有效得多。但是，传输的消息将不会直接被人类读取。在OpenCat存储库中，有一个简单的Python脚本[ardSerial.py](https://github.com/PetoiCamp/OpenCat/blob/main/serialMaster/ardSerial.py)，它可以处理NyBoard和Pi之间的串行通信。

### 4.1  配置树莓派的串行接口

打开树莓派的终端，输入 `sudo raspi-config`

在 **Interface（接口）**&#x9009;项，选择 **Serial（串行接口）**&#x9009;项以启用串口。禁用串行登录 shell 并启用串行接口以使用主 UART：

1. 使用 sudo 权限命令运行 raspi-config：**sudo raspi-config**
2. 找到 Interface Options-> SerialPort
3. 选项 `Would you like a login shell to be accessible over serial? 选择`**`No`**
4. `选项 Would you like the serial port hardware to be enabled? 选择`**`Yes`**
5. 退出 raspi-config 并重新启动机器人（关闭、打开电池电源）以使更改生效。

{% hint style="danger" %}
你还需要**禁用**Pi的[1-wire接口](https://www.raspberrypi-spy.co.uk/2018/02/enable-1-wire-interface-raspberry-pi/)防止Pi的GPIO 4不断地发送重启信号。
{% endhint %}

{% hint style="info" %}
树莓派官方网站上有一个很好的[教程](https://www.raspberrypi.com/documentation/computers/configuration.html)。
{% endhint %}

只要把树莓派和NyBoard通过可选的2x5插座相连，它们的串口就自动连接起来了，逻辑电平是3.3V。如果您连接的是其他AI芯片，就要注意Rx和Tx的连接，以及它们的逻辑电平。外接板上的Rx要连接NyBoard的Tx，外接板上的Tx要连接NyBoard的Rx，还需要连接NyBoard的参考电平输入和外接板的逻辑电压。

{% hint style="info" %}
注意：如果您在树莓派上安装了 Ubuntu 操作系统，请进行如下配置：

* 在 `/boot/config.txt 添加 enable_uart=1`
* 在 Ubuntu系统的文件 `/boot/firmware/cmdline.txt中删除`&#x20;

`console=serial0,115200（类似于在树莓派系统中文件/boot/cmdline.txt）`

* 运行以下命令关闭串行控制台：

`sudo systemctl stop serial-getty@ttyS0.service && sudo systemctl disable serial-getty@ttyS0.service`

* 请确保您已安装python 串行库 pyserial，而不是来自 apt 的 python-serial。
* 创建 udev file (`/etc/udev/rules.d/50-tty.rules`),并添加以下内容：

  ```
  KERNEL=="ttyS0", SYMLINK+="serial0" GROUP="tty" MODE="0660"
  KERNEL=="ttyAMA0", SYMLINK+="serial1" GROUP="tty" MODE="0660"
  ```
* 运行以下命令重载 udev 规则：

`sudo udevadm control --reload-rules && sudo udevadm trigger`

* 运行以下命令更改新的串口设备的用户组：

sudo chgrp -h tty /dev/serial0

sudo chgrp -h tty /dev/serial1

* 这些设备现在位于 tty 组下。 运行以下命令将用户添加到 tty 组和dialout 组：

sudo adduser $USER tty

sudo adduser $USER dialout

* 运行以下命令更新设备上组读取的权限：

sudo chmod g+r /dev/ttyS0

sudo chmod g+r /dev/ttyAMA0

* 重启树莓派（关闭、打开机器人电池电源）

或者创建一个自动执行这些操作的脚本。
{% endhint %}

### 4.2  给 [ardSerial.py](https://github.com/PetoiCamp/OpenCat/blob/master/SerialMasterPython/ardSerial.py) 增加执行权限给

如果您想在bash里运行ardSerial.py，您还需要为它添加可执行权限：

`chmod +x ardSerial.py`

同时您可能需要把文件第一行的Python安装路径`#!/user/bin/python`改成您电脑上的设置。

### 4.3  用 **ardSerial.py** 向机器人发送指令

{% hint style="warning" %}
NyBoard 只有一个串口。 如果你想用树莓派的串口控制机器人，你需要拔掉USB上载器。
{% endhint %}

在树莓派的终端输入`./ardSerial.py <args>` 就相当于之前在Arduino串口监视器里输入 \<args> 。比如，`./ardSerial.py kcr` 表示“执行 s**k**ill **cr**awl”。

Python脚本**ardSerial.py** 和**Nybble.ino**里对应的解析代码都比较简略，需要逐渐完善。

{% hint style="warning" %}
对于Nybble:

{% hint style="warning" %}
连接到树莓派时可能会降低运动能力！ 需要更强的电池。
{% endhint %}

某些快速的步态，比如小跑（trot，指令是`ktr`），可能会导致系统重启。目前系统由两节14500电池串联供电，您可以升级供电方案，比如模型专用的锂聚合物动力电池。

在改装过程中需要综合考虑软硬件的协作。对于Nybble小巧的身躯而言，最好是把它作为一个编程平台来研究系统整合与决策树，而不是作为一台遥控赛车。
{% endhint %}

## 5  电池

尽管通过USB上载器供电是可以给Nyboard上传程序的，但是仅使用USB上载器为 NyBoard 供电时，舵机存在明显的充电和放电现象，并导致黄色 LED 闪烁。USB 数据线的电流不足以维持舵机正常工作。 因此，舵机必须由外部电池供电才能正常工作。

### Bittle

#### 5.1 电压

NyBoard需要7.4〜8.4V外部电源来驱动舵机。我们在Bittle套件中包括了带有内置充电和保护电路的定制锂电池。短按电池按钮将显示其状态。蓝灯表示有电，红灯表示电量低。

#### 5.2 连接插头和打开电源&#x20;

连接电源时，请注意极性。 NyBoard上的插座具有防呆功能（防止反向插座），因此您将无法以错误的方向插入。详情请看[这里](https://bittle.petoi.com/v/zhong-wen/untitled-1#dian-chi-an-zhuang)（请不要 **大 力 出 奇 迹**！）

长按按钮3秒钟以打开/关闭电池。

{% hint style="danger" %}
**反接电池有可能会损坏Nyboard！虽然我们也设计了简单的防反接电路～**
{% endhint %}

#### 5.3 电池续航能力

电池寿命因使用情况而异

如果您主要是编码和测试姿势，则可以持续几个小时，如果保持Bittle的运行，则可以持续不到30分钟。

电量不足时，电池指示灯将变为红色。电源将自动切断。

#### &#x20;5.4 充电

请使用输出为5V-1A 的 USB充电器为电池充电。我们不建议使用快速充电器。电池在充电过程中无法供电。充电时请注意电池安全。

完全充电大约需要1.5至2小时，为确保安全，防止将其置于无人处持续充电。

#### 5.5 玩耍结束该做的事情

请记住长按电池上电源键2.5秒以上关闭电源。建议您最好在关闭电源后把电池从NyBoard板上拔下来。

### Nybble

#### 5.1. 电压

NyBoard需要7.4\~9V 外接强力电源来驱动舵机。在调试狸宝时，我们用的是8V电源，通常可以通过串联两节锂离子或锂聚合物电池来获得。一节电池充满电是4.2V，在3.6V以上都可以正常工作，串联后就是8.4\~7.2V的电压区间。如前所述，驱动套件配送的舵机最好采用电池直连，也就是把跳线帽SW3连接在BATT和V\_S之间。

在购买电池时，搜索关键词“14500 3.7V 锂离子电池”，最好再加上“无保护板”。我注意到有些有过载保护的电池可能会过早地触发断电保护（<2.5A），导致狸宝不能正常工作，比如重启或死机。电池的放电能力越大越好，比如能稳定以2A放电，或2C以上。

我们的用户在论坛上对各国能买到的电池品牌作了[汇总](https://www.petoi.com/forum/clinic/report-your-batteries)。

#### 5.2. 尺寸

套件中的电池盒适用于14500锂离子电池，14表示直径为14mm，50表示电池长度，有时会差±2mm，但仍可适用。这个尺寸和常见的5号AA干电池一样，但是同尺寸的锂电池电压更高。

{% hint style="danger" %}
注意不要和普通5号电池混淆而误装到其他设备上！
{% endhint %}

另外，要选购正极有按钮状突起的电池。如果您在美国，可以在沃尔玛网购“EBL 14500 Li-ion”电池；在中国，可以在淘宝上试试运气。不要买标榜900mAh以上的电池，至少它们在容量上就不诚实。

您也可以自己设计电池盒来安装其他的电源方案，尤其是当您想添加树莓派做一些严肃的开发 ，或者纯粹想让狸宝跑得更快的时候。

#### 5.3. 接线&#x20;

接线时要注意极性，确保您能清楚地区分NyBoard电源接线端子和电池上的正负号（+/-）。

{% hint style="danger" %}
**电源反接几乎必然会损坏NyBoard！**
{% endhint %}

把NyBoard电源端子的螺丝拧松，插入电池盒引出的电源线，然后拧紧螺丝。闭合开关后，蓝光（主控）和黄光（舵机供电）LED都会点亮。

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FudXqO4K38uO4wciqw2hw%2FNybble_battery.jpg?alt=media\&token=47cf7134-0547-4576-9d2c-68ab9743c522)

1月1日之后发货的套件中，端子更换为防反接插座，这样您就不会插错方向了。

#### 5.4. 续航时间

续航时间取决于使用场景。如果您主要是用狸宝编程和测试一些动作，电池可以支持几个小时。如果您一直让狸宝跑来跑去，那就玩不到一个小时，大约四十分钟左右。

当电量不足时，黄色LED可能会不稳定地抖动。这时NyBoard仍可驱动一两个舵机，但更多舵机的负载的叠加会使电路极不稳定，导致持续重启或舵机的异常转动。在极个别情况下，电压波动会恰好翻转EEPROM中的关键常数，那就需要重新上传代码来恢复数据了。

#### &#x20;5.5 充电

最好使用与电池配套的锂电池智能充电器，比如“充电器+4节电池”的套装。在充电期间最好在场以防发生意外 。

#### 5.6 归置

使用后，记得把电池从电池盒中取出，以防无意中接通开关导致电池过度放电。

#### 5.7 信号干扰

可以同时连接FTDI上载器和外接电源。事实上，如果在不接外接电源时命令舵机转动，会使USB端口负载过量电流，导致USB端口被禁用。在电池电量不足时，多个舵机的负载的叠加会波及逻辑电路，导致输出乱码、重启或死机。
