A servo plug has three wires. Plug it in the right direction or you may burn the chip. Thecolor of wires may vary for different models. However, the darkest-colored (Black or Brown) wire (GND for ground) is always the GND wire as a convention. The GND wire should be plugged closest to the board.
The index number of the joint servo has no corresponding relationship with the PWM pin number on the main board. You don't even need to read the pin numbers on the PCB board.
Welcome to Petoi Doc Center for Bittle, Bittle X & Nybble
📚➡️🤖
This is the Petoi robot product documentation hub for Petoi legacy robot Bittle, Bittle X(but not Bittle X V2), and Nybble. We constantly iterate on our models and codes to bring bionic robotic pets to the world. Please read the notes regarding versions carefully before configuring your robot.
If you need help, please or post on .
Legacy Hardware Products
Joint Pins on NyBoard
When we map those joints to a specific robot, the indexing becomes more practical. The ordering for the joint servo pins on NyBoard is like below:
If you have a Bittle X V2(as indicated on the package barcode label), please visit
Note that the robot is suitable for working on smooth surfaces. When walking on a carpet, the movement may not be smooth.
After you’ve assembled a Petoi robot or have bought a pre-assembled version, the following steps are recommended:
Play with the default actions
Play with
Note that all the tutorials work on Bittle/Bittle X robot dogs and Nybble robot cat even though we use one particular robot pet as an example.
Petoi robot joint index
We humans and many other legged animals have many joints. They give us the freedom to move in many ways. Though it's difficult to reproduce those complex motions on a robot, we can simplify all those joints to limited numbers of actuators.
When controlling so many joints, the first thing is to index them. We can define an order according to their distance from the torso. For example, the shoulder joint is closer to the torso than the elbow joint, and the joint that let us look around is closer to the torso than the joint that let us nod. If we had tails, it would be as close as the head compared to the shoulder joints.
So we can order the joints in this way: head panning, head tilting, tail panning, tail tilting, 4x shoulder (or hip) roll, 4x shoulder (or hip) pitch, 4x elbows (or knees). For the joints in the same distance group, we can index them clockwise from the front-left corner if the body is looked at from behind.
Coordinate values and directions.
The rotation angle range of the joint servo is between [-125~125]. For the leg servo, when viewed from the left side of the robot, when the leg rotates counterclockwise from the 0-degree position around the joint center point (the screw fixing position), the angle is a positive value; clockwise rotation, the angle is a negative value; viewed from the right side of the robot, the leg rotation angle is mirror-symmetrical to the left side (when rotating clockwise from the 0-degree position around the joint center point, the angle is a positive value; Rotate counterclockwise, the angle is negative). For the robot's neck servo, looking down from the top of the robot's head, when the neck rotates counterclockwise from the position of 0 degrees around the joint center point (the position where the screw is fixed), the angle is a positive value; when it rotates clockwise, the angle is a negative value.
For the Nybble head servo (No. 1 servo) observed on the right side of the robot, the head rotates counterclockwise from the 0-degree position around the joint center point (screw fixed position), and the angle is positive; when it rotates clockwise, the angle is negative.
For the Nybble tail servo (No. 2 servo) facing the tail and looking down, the tail rotates counterclockwise from the 0-degree position around the center point (screw fixing position), and the angle is positive; when it rotates clockwise, the angle is negative.
You can turn off the voice command functionality(for example: in a public space, or in a classroom setting requiring quiet periods) to avoid accidentally triggering voice responses and robot reactions.
The calibrator interface for Nybble is as following:
This interfaces will be displayed when you calibrate for the first time. You can also click to open the upper-right menu in the control panel and select Calibrate to re-access.
After the robot enter the calibration state, install the head, legs and tail as the calibration posture.
Bluetooth Connection
If you want to use , in the Petoi Desktop App, or a coding block in via computer Bluetooth, you need to pair the mainboard's Bluetooth with the computer first.
NyBoard Connection
Connection method
To run the Skill Composer, you can use the following methods to connect the robot's mainboard to the computer:
Wired connection: The kit includes a connecting the robot's mainboard to the computer.
Interface
At present, There are three kinds of interface for the Petoi robots:
Nybble
Bittle / Bittle X
Bittle X+Arm
Joint Pins on BiBoard V1
Although the BiBoard V1 has only 12 pins, the joint index numbers are configured in the same order as the NyBoard. The ordering for the joint servo pins on BiBoard V1 is like below:
BiBoard V0
Some customers already have Bittle X (BiBoard V0), which can also be equipped with a robotic arm. The joint calibrator interface is as follows. Please note the wiring of the servo:
The joint calibrator interface for Bittle X+Arm, which uses BiBoard V0 in the Petoi Desktop App, is as follows:
BiBoard Preparation
BiBoard
For products (such as and ), there is no need to modify any software code. By default, all functional blocks in Mind+ are supported.
BiBoard V1
Use the .
Check the BiBoard V1 version
The and the are the same as BiBoard V0.
BiBoard Preparation
Plug in the battery and long-press the battery button to power on the robot.
For BiBoard, please ensure the program enters the .
The USB data cable connection must be made directly to the BiBoard and NOT to the battery's outside charging port.
You can also connect to the computer via .
The interface for each kind of product, please refer to the following subpages:
Plug in the battery to the BiBoard, install it to the chassis and long-press the battery button to power on the robot.
Connect method
Wired connection: The kit includes a USB Type-C data cable connecting the robot's mainboard to the computer.
Wireless connection(Bluetooth): The motherboard's built-in Bluetooth communication module allows you to establish a wireless connection between the robot's mainboard and the computer.
You can find the board version number on the BiBoard V0:
On the pre-assembled Bittle X, you can check the version information of BiBoard like this by taking a picture and zooming in to see the version information:
Uploading options
Factory Reset
After upgrading the firmware, the board will enter the and ask whether to clear the joint calibration parameters and calibrate the IMU.
Upgrade the Firmware
It will upgrade the firmware, skip the clear joint calibration parameters, calibrate the IMU steps (Send serial command "n"), and automatically enter the .
Update the Mode Only
It has the same function as the Upgrade the Firmware at present.
Factory reset process
After clicking the Factory Reset button, the uploading process will start immediately. The board will enter the after uploading the firmware. Some message windows will pop up in sequence for you to confirm or cancel:
Reset joint offsets? (Y/N)
Select Yes, and the program will reset all servo calibration parameters to zero. The status bar will update the corresponding process and result in real time.
Select No to preserve the calibration value(so that you don't need to calibrate again if you have already done so).
Calibrate IMU? (Y/N)
Select Yes, and the program will calibrate the gyroscope (IMU) to balance the robot correctly. The status bar will update the corresponding process and result in real time.
Select No, and the program will skip this step.
After that, the board will enter the .
Note:
Ensure the mainboard is positioned horizontally for IMU calibration before clicking the "Yes" button.
NyBoard
When you use a USB uploader to upload the firmware for the NyBoard, if there is no serial port in the port list of Device Manager.
NyBoard is equivalent to a generic Arduino Uno board with rich peripherals. Besides the native Arduino IDE, you can also program it using Mind+ blocks. But be aware that if you use this mode, the original OpenCat firmware will be over-written, and you will need to re-upload the firmware later to resume the default robot animal function.
Setting up the coding environment is as easy as the following steps.
BiBoard V0
When you use a USB type-C data cable to upload the firmware for the BiBoard V0, if there is no serial port in the port list of Device Manager.
Note: The connection for uploading firmware is to be made directly to the BiBoard V0 and NOT to the outside charging port on the battery.
Bittle X
Please download and install the USB driver:
For more details, please refer to the .
Bittle X+Arm
A servo plug has three wires. Plug it in the right direction or you may burn the chip. Thecolor of wires may vary for different models. However, the darkest-colored (Black or Brown) wire (GND for ground) is always the GND wire as a convention. The GND wire should be plugged closest to the board.
The index number of the joint servo has no corresponding relationship with the PWM pin number on the main board. You don't even need to read the pin numbers on the PCB board.
BiBoard V1
The joint calibration interface for Bittle X+Arm which uses BiBoard V1 in the Petoi Desktop App is as follows:
The servo slider is not available in the light yellow background area in the interface.
Bittle / Bittle X
The interface for Bittle / Bittle X :
Bittle X+Arm
A servo plug has three wires. Plug it in the right direction or you may burn the chip. Thecolor of wires may vary for different models. However, the darkest-colored (Black or Brown) wire (GND for ground) is always the GND wire as a convention. The GND wire should be plugged closest to the board.
The index number of the joint servo has no corresponding relationship with the PWM pin number on the main board. You don't even need to read the pin numbers on the PCB board.
Nybble Q
A servo plug has three wires. Plug it in the right direction or you may burn the chip. Thecolor of wires may vary for different models. However, the darkest-colored (Black or Brown) wire (GND for ground) is always the GND wire as a convention. The GND wire should be plugged closest to the board.
The index number of the joint servo has no corresponding relationship with the PWM pin number on the main board. You don't even need to read the pin numbers on the PCB board.
Joint Pins on BiBoard V0
Although the BiBoard V0 has only 12 pins, the joint index numbers are configured in the same order as the NyBoard. The ordering for the joint servo pins on BiBoard V0 is like below:
NyBoard Preparation
For products (, ), there are two ways to upload the firmware (Mind+ mode), which supports the Mind+ extension library:
If you just downloaded a new version of this Desktop App. You should click the Upgrade the Firmware button. You can select 'N' to preserve the calibration values.
Bittle X+Arm
The calibrator interface for Bittle X+Arm is as follows:
The interfaces above will be displayed when you calibrate for the first time. You can also click to open the upper-right menu in the control panel and select Calibrate to re-access.
For the pre-assembled kit, you can directly power on the robot and use the mobile app to fine-tune all joints.
For the construction kit, after
BiBoard V1
When you use a USB type-C data cable to upload the firmware for the mainboard BiBoard V1.
On Windows, if there is no serial port in the port list of Device Manager:
On Mac, open the
Upload Firmware
Connect to the mainboard
You must use the USB data cable to do firmware uploading.
Bittle / Bittle X
The subpages mention the joint calibration interface for Bittle / Bittle X in the Petoi Desktop App.
Installation for the construction kit
After entering the calibration state, with all servos rotated to their zero angles, attach the head, and legs prepared in the previous section to the body. They are generally perpendicular to their linked body frames. The calibration pose is shown below:
Bittle X+Arm
The interface for Bittle X+Arm:
Nybble
The joint calibration interface for Nybble in the Petoi Desktop App is as follows:
The servo slider is not available in the light yellow background area in the interface.
Overview
At present, there are 3 versions of NyBoard: NyBoard V1_0, NyBoard V1_1 and NyBoard V1_2.
There are just a few differences between NyBoard V1_1 and NyBoard V1_2:
V1_2 has one NeoPixel LED attached to Pin D10.
BiBoard Connection
Connection method
To run the Skill Composer, you can use the following methods to connect the robot's mainboard to the computer:
Wired connection: The kit includes a USB Type-C data cable connecting the robot's mainboard to the computer.
Python coding mode in Mind+
Switch to the Python coding mode
If you are familiar with the Petoi coding blocks and Python language, you can change to the Code mode in Mind+ as follows:
The Code mode is a Python3 development environment. You can write any Python script in it and call all the API interfaces of the PetoiRobot library imported by Mind+.
NyBoard Preparation
Plug in the battery and long-press the battery button to power on the robot.
For NyBoard, please ensure you have uploaded the OpenCat firmware before calibrating.
You must connect theand USB data cable orto the computer.
4.Digital-Analog Converter
The usage of DAC
The purpose of the DAC is the opposite of that of the ADC. The DAC converts a digital signal into an analog signal for output.
Remember the music when NyBoard is turned on? It is using PWM to make music sound which uses high-speed switching to adjust the duty cycle to output voltage.
Compared with PWM, the DAC will directly output the voltage without calculating the duty cycle. ESP32 integrates a 2-channel 8-bit DAC with a value of 0-255. The voltage range is 0-3.3V. Therefore, the formula for calculating the output voltage of the DAC is as follows:
The demo is as follows:
Bittle X
A servo plug has three wires. Plug it in the right direction or you may burn the chip. Thecolor of wires may vary for different models. However, the darkest-colored (Black or Brown) wire (GND for ground) is always the GND wire as a convention. The GND wire should be plugged closest to the board.
Install Mind+ on Chromebook
Configure the Linux environment
You need to on the Chromebook to access the Linux environment via the terminal app.
Then, follow the following steps to install Mind+.
Bittle
A servo plug has three wires. Plug it in the right direction or you may burn the chip. Thecolor of wires may vary for different models. However, the darkest-colored (Black or Brown) wire (GND for ground) is always the GND wire as a convention. The GND wire should be plugged closest to the board.
Bittle X
A servo plug has three wires. Plug it in the right direction or you may burn the chip. Thecolor of wires may vary for different models. However, the darkest-colored (Black or Brown) wire (GND for ground) is always the GND wire as a convention. The GND wire should be plugged closest to the board.
Bittle X (BiBoard V0)
The joint calibration interface for Bittle X (BiBoard V0) in the Petoi Desktop App is as follows:
The servo slider is not available in the light yellow background area in the interface.
Bittle X (BiBoard V1)
The joint calibration interface for Bittle X (BiBoard V1) in the Petoi Desktop App is as follows:
The servo slider is not available in the light yellow background area in the interface.
Wireless connection(Bluetooth): The motherboard's built-in Bluetooth communication module allows you to establish a wireless connection between the robot's mainboard and the computer.
If you have upgraded the firmware at least once after a new download, You can click the Update the Mode Only button. It's faster to only switch the modes without refreshing the parameters.
Note that the gyroscope function is turned off with the Mind+ mode on NyBoard to save memory space. The robot won't be able to self-balance and auto-recover.
V1_2 supports both ATmega328p AU (bigger) and MU (smaller) chips.
NyBoard V1_0
NyBoard V1_1
NyBoard V1_2
The index number of the joint servo has no corresponding relationship with the PWM pin number on the main board. You don't even need to read the pin numbers on the PCB board.
The index number of the joint servo has no corresponding relationship with the PWM pin number on the main board. You don't even need to read the pin numbers on the PCB board.
Bittle
The index number of the joint servo has no corresponding relationship with the PWM pin number on the main board. You don't even need to read the pin numbers on the PCB board.
Since the ESP8266 can be used as a regular Arduino board, we can write a simple Arduino code to open the serial port and send the serial commands to control the robot. It's like a stand-alone serial commander written in C and can go with the robot. You may write hundreds of pre-defined tasks without worrying about the memory limits on the main controller.
You can find a short test8266Master in OpenCat/ModuleTest:
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.setTimeout(5);
bool connected = false;
while (!connected) {
Serial.print("b 20 8 22 8 24 8");
for (byte t = 0; t < 100; t++) {
if (Serial.available())
if (Serial.read() == 'b') {
connected = true;
while (Serial.available() && Serial.read())
;
break;
}
delay(10);
}
delay(1000);
}
}
void sendCMD(const char cmd[], int wait = 0) {
Serial.print(cmd);
while (true) {
if (Serial.available() && toLowerCase(Serial.read()) == cmd[0]) {
delay(10);
while (Serial.available() && Serial.read())
;
break;
}
delay(2);
}
delay(wait);
}
void loop() {
sendCMD("d", 500); //rest and wait 0.5 seconds 趴下并等待0.5秒
sendCMD("khi"); //greetings 打招呼
sendCMD("kpu"); //pushups 俯卧撑
sendCMD("kvtF", 1000); //stepping 原地踏步
sendCMD("G"); //Turn off the gyro 关闭陀螺仪
sendCMD("kwkF", 1500); //walk 行走
sendCMD("kck"); //check 观察
sendCMD("kpu1"); //push ups with on hand 单手俯卧撑
sendCMD("kvtR", 2000); //spin 旋转
sendCMD("G", 100); //turn on the gyro 打开陀螺仪
sendCMD("ktrF", 1500); //trot 跑步
sendCMD("kjy", 0); //joy 加油
sendCMD("i 0 45 8 -90 9 -90", 1000); //rotate the head and arm joints 伸手转头
sendCMD("ksit", 1000); //sit 坐下
}
1.GPIO port
Operate the GPIO port of BiBoard
There is no separate GPIO port on BiBoard, but the multiplexed serial port 2 (pin 16, 17) or the PWM pin of the unused PWM servo interface can be used as GPIO port. The GPIO port is also relatively simple to use. After configuring the input and output mode, the usage is exactly the same as that of Arduino UNO. You can use any IO control program of Arduino UNO, just change the number of IO .
/* In this demo, we use TX2, RX2 as general purpose IO
* TX2 : IO17
* RX2 : IO16
*/
void setup() {
// initialize digital pin 16 & 17 as an output.
pinMode(16, OUTPUT);
pinMode(17, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(16, HIGH); // GPIO 16 & 17 HIGH
digitalWrite(17, HIGH);
delay(1000); // wait for a second
digitalWrite(16, LOW); // GPIO 16 & 17 LOW
digitalWrite(17, LOW);
delay(1000); // wait for a second
}
2.Serial port
There are 2 serial ports,which are separately located on 2 expansion sockets (P16, P17) ,on BiBoard.
The serial port 1 on the P16 can be connected to the USB downloader and the external serial device. Please do not use the downloader and the external serial device at the same time. The serial port voltage division will lead to communication errors.
In the Arduino demo, Serial represents the serial port 0, Serial1 represents the serial port 1.Serial and Serial1 send to each other.
/* In this demo, we use Serial and Serial1
* Serial and Serial1 send to each other
*/
void setup() {
// initialize both serial ports:
Serial.begin(115200);
Serial1.begin(115200);
}
void loop() {
// read from port 1, send to port 0:
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.write(inByte);
}
// read from port 0, send to port 1:
if (Serial.available()) {
int inByte = Serial.read();
Serial1.write(inByte);
}
}
You can find the PetoiRobot library in the following directory. There are all the definitions of API interfaces in the PetoiRobot.py
Windows
C:\Users\{username}\AppData\Local\DFScratch\extensions\petoi-robot-thirdex\python\libraries\PetoiRobot.py
You can also copy the code in the Auto Generate area in the Blocks mode and then paste it into the code file in the Code mode. Then you can edit and run the code.
# The code starts here
from PetoiRobot import * # must import the PetoiRobot library
# enter the code below
# auto connect serial ports
autoConnect()
# call the APIs to control the Petoi robot
sendSkillStr('ksit', 0.5)
sendCmdStr('T', 0.5)
loadSkill("skillFileName", 0.2)
# close the serial port
closePort()
the robot enters the calibration state, do the following steps:
Install the neck servo and leg servos
Note:
You must use the neck section with a J-hook (as pictured below) to avoid the neck from falling when using this robot arm.
This robot arm is already fully assembled. After finishing calibrating the neck servo and the leg servos, power off the robot and install the servo slot on the neck servo with two M2*5 self-tapping screws.
Then, power on the robot, and do the joint calibration for the servos on the robot arm.
Terminal
program under the
Applications
-
Utilities
folder and type the following commands. If no serial device name starting with "
Some USB cables are just for charging and do not have data transfer capability. Using the original data cable in the kit is better for making the uploading successful.
Some new laptops only have USB-C ports, so users use a hub to connect standard USB-B to their computers. However, the intervening hubs prevent the app from recognizing the serial port. The solution was to connect the USB-C cable DIRECTLY to the computer using EITHER a USB-C to USB-C cable OR a tiny C to B adaptor (not a hub).
Upload the firmware
There are two methods to Upload the firmware to the robot:
The simplest method is to use the Petoi Desktop App. No programming is involved. You can play with some preset modes.
If you have some programming experience, you can use the Arduino IDE. You will be able to modify the open-source codes for your new projects.
If you have a NyBoard(with Bittle and Nybble), we highly recommend using the green USB programmer to upload the firmware. The Bluetooth dongle is not as stable and may cause the mainboard's bootloader to crash if interrupted in the middle.
For BiBoard(with Bittile X), the USB/Bluetooth connections are built on the board already.
Install the servo-related components according to the picture above and try to ensure that they are perpendicular to each other (the upper leg is perpendicular to the torso, and the lower leg is perpendicular to the upper leg).
Install the head
In the calibration state, place the head as close to the central axis as possible and insert its servo shaft into the servo arm of the neck.
Press down on the head so it is firmly attached to the neck.
Install the legs
Install upper leg and lower leg components to the output teeth of the servos after the Bittle is powered on and in the calibrated neutral position. Please keep the torso, upper leg, and lower leg installed vertically as much as possible, and do not install the lower leg backward, as shown in the picture.
Fine-tuning
The pre-assembled robot should already have the components adequately installed. You can do the joint calibration for fine-tuning.
Use the included L-shaped tool as a reference during calibration. According to the index numbers of the joints shown at the top of the interface (when calibrating the servos, adjust the upper leg first, then adjust the lower leg). Drag the corresponding slider (below the index number), or click the blank part of the slider track to fine-tune the joint to right angles.
Align the upper leg first
Pay attention to the reference edges for the lower leg
If the offset is more than +/-9 degrees, you need to remove the corresponding leg and reinstall it by rotating one tooth and then dragging the corresponding slider. For example, when it is adjusted to +9 and still not right, remove the corresponding leg and shift one tooth when attaching it. Then, you should get a smaller offset in the opposite direction.
Bittle's Calibration State
Installation
After entering the calibration state, , with all servos rotated to their zero angles, attach the head, tail, and legs prepared in the previous section to the body. They are generally perpendicular to their linked body frames. The calibration pose is shown below:
Nybble's Calibration State
Install the servo-related components according to the picture above and try to ensure that they are perpendicular to each other (the upper leg is perpendicular to the torso, and the lower leg is perpendicular to the upper leg).
Fine-tuning
Use the included L-shaped tool as a reference during calibration. According to the index numbers of the joints shown at the top of the interface (when calibrating the servos, adjust the upper leg first, then adjust the lower leg). Drag the corresponding slider (below the index number), or click the blank part of the slider track to fine-tune the joint to right angles.
If the offset is more than +/-9 degrees, you need to remove the corresponding leg and reinstall it by rotating one tooth and then dragging the corresponding slider. For example, when it is adjusted to +9 and still not right, remove the corresponding leg and shift one tooth when attaching it. Then, you should get a smaller offset in the opposite direction.
Check the processor architecture
Use the following command to check the processor architecture in the terminal:
uname -m
The output will be similar to "i686", "x86_64" or "armv7":
i686 (or similar) - 32-bit Intel/AMD processor (common in older computers).
x86_64 (or similar) - 64-bit Intel/AMD processors (modern laptops, desktops, and most Chromebooks).
armv7 (or higher) - ARM processor. (Mobile phones, tablets, 2nd and 3rd generation Raspberry Pis running Ubuntu Mate, and some Chromebooks. Most are 32-bit now)
Use the following command in the terminal to install it (Replace ***** with the file name of the installation package):
sudo dpkg -i *****.debsudo apt-get -f install
After installed, you can start the Mind+ app in the Chromebook launcher:
Bittle and Bittle X use the same calibrator interface.
The calibrator interface for Bittle is as following:
Calibration Interface
This interfaces will be displayed when you calibrate for the first time. You can also click to open the upper-right menu in the control panel and select Calibrate to re-access.
After the robot enters the calibration state, do the following steps:
Install the head
In the calibration state, place the head as close to the central axis as possible and insert its servo shaft into the servo arm of the neck.
Press down on the head so it is firmly attached to the neck.
Install the legs
Install upper leg and lower leg components to the output teeth of the servos when the Bittle is powered on and in the calibration state. Please keep the torso, upper leg, and lower leg installed vertically as much as possible, and do not install the lower leg backward, as shown in the picture.
The pre-assembled robot should already have t
Use the included L-shaped tool as a reference
Bittle X+Arm
Bittle X+Arm is Bittle X equipped with a robotic arm.
The subpages mention the joint calibration interface for Bittle X+Arm, which uses BiBoard V0 and BiBoard V1 in the Petoi Desktop App.
Prepare for calibration
This robotic arm is already fully assembled.
For the construction kit
Install the short wire servo in the servo slot on the robotic arm with two M2*5 self-tapping screws.
[robotic arm installation image 0]
For the pre-assembled kit
You only need to install the servo with the neck structure in the servo slot with two M2*5 self-tapping screws.
Installation for the construction kit in the calibration state
For the construction kit, after entering the calibration state, please install the legs and robotic arm as follows:
Install the legs
The process is the same as .
Install the robotic arm
Place the robotic arm as close to the central axis as possible and insert its servo shaft into the servo arm of the neck.
[robotic arm installation image 1]
Press down on the robotic arm so it is firmly attached to the neck.
[robotic arm installation image 2]
Fine-tuning
The process of fine-tuning the legs and the Servo 0 is the same as that of Bittle / Bittle Xegs process is the same as .
Please click the blank part of the slider track and follow the calibration posture below to fine-tune Servo 1 on the robotic arm.
Please click the Auto button to fine-tune the claw (Servo 2) on the robotic arm.
You can also manually click the blank part of the corresponding slider track and adjust the gear on the servo output shaft to the position shown in the figure above.
Serial Monitor
NyBoard
There are two ways to establish a serial port connection:
Connect the USB Adapter
Connect the USB adapter to the mainboard and select the correct serial port. Refer to the section in the USB Adapter(Uploader) Module for specific steps.
Connect Bluetooth module(optional)
Please refer to the in the Dual-Mode Bluetooth Module for the specific steps.
On Mac, the Bluetooth may lose connection after several uploads. In that case, delete the connection and reconnect to resume the functionality.
The Bluetooth dongle is not included in the kit sold by Seeed Studio or its partners. Please write to [email protected] for more information.
Setup steps in the Arduino IDE
Select the port in the (recommend version 1.8.19).
If you can't determine which port is correct, unplug and re-plug the USB data cable on the computer side and check the difference in the Tools menu.
You may install the if no new port is shown in the menu list.
Open the serial monitor.
You can choose the "Serial Monitor" in the Tools menu bar or click the button to open the serial monitor window:
Config the parameter of the serial monitor.
In the serial monitor, set "No line ending" and the baud rate to 115200.
With the USB adapter / Bluetooth module connecting NyBoard and computer, you have the ultimate interface - Serial Monitor to communicate with NyBoard and change every byte on it(via sending the serial commands based on the ).
BiBoard
There are two ways to establish a serial port connection:
and computer using a USB type-C data cable(you should use the original one in the kit).
Connect the mainboard with a / via Bluetooth.
The setup steps in the Arduino IDE are identical to those .
Nested task queue and signal generator
Nested task queue
You can join multiple serial commands as one task queue:
The token is T_TASK_QUEUE. ('q')
Use 'q' to start the sequence.
Add a sub token followed by the subcommand.
Use ':' to add the delay time (mandatory)
Add '>' to end the sub-command
Example: qk sit:1000>m 8 0 8 -30 8 0:500> will make the robot sit and then move the shoulder joint.
Attach a trigonometric function to each joint to compose smooth and periodical movements
For the detailed implementation, refer to the source code in OpenCatEsp32/src/OpenCat.h and reaction.h.
Set up Development Environment on ChromebookU
Set up Linux on your Chromebook
Linux is a feature that lets you develop software using your Chromebook. Install Linux command line tools, code editors, and IDEs (integrated development environments) on your Chromebook. These can be used to write code, create apps, and more.
Important: If you use your Chromebook at work or school, you might be unable to use Linux. For more information, contact your administrator.
Turn on Linux
Linux is off by default. You can turn it on at any time from Settings.
On your Chromebook, at the bottom right, select the time.
Select Settings AdvancedDevelopers.
Next to "Linux development environment," select Turn On.
Accessing Linux environment:
You can access your Linux environment through the terminal app in your Chromebook launcher.
Files created in Linux are stored in a container and are separate from Chrome OS files. You can access them using the "Linux files" app.
You can set the shared folders in the file browser and manage them in the Settings
Update and install development tools:
Once the setup is complete, a terminal window will open. You can use the following commands to update the package list and install basic development tools:
After downloading the compressed file(.zip), please unzip it first.
Do NOT move the UI.exe to another location in Windows.
From version 1.2.1, the Petoi Desktop App has included a new module - Tools. This module provides convenient tools to fix your robot's frequent problems.
Reset voice module
It is used to reset the , simplifying its If the voice module does not respond to your voice, you can use this tool to reset it. It's pretty simple to use: click the Reset voice module button.
From version 1.2.4, the interface has added this new function.
It is used to calibrate the gyroscope sensor on the mainboard. If you notice that the robot cannot maintain balance while performing skill movements (such as sitting down) and its body keeps shaking, you need to recalibrate the gyroscope. To calibrate the gyroscope, click the Calibrate gyroscope button.
Please connect the corresponding pins of the Raspberry Pi and the BiBoard extension hat as follows:
5V power --> 5V
Ground --> GND
GPIO 14 (TXD) --> RX2
GPIO 15 (RXD) --> TX2
Dial the switch on the BiBoard extension hat to the UART2 side.
To ensure a good connection, you may need to solder the wires.
The and are the same as BiBoard V1.
BiBoard
Connection steps
Power on the mainboard via the battery (plug in the battery to the mainboard, and long-press the battery button > 3 seconds); after powering on, the mainboard's blue LED and yellow LED should be on.
For Windows, Open the Bluetooth & other devices setting page, and turn on the Bluetooth button as follows:
Add the BiBoard Bluetooth for the first time as follows:
Select the one with the name Bittle**_BLE:
After paired successfully, it shows:
For Windows 11, after the initial Bluetooth pairing, the device might show “not connected” as follows. However, as long as the robot is not rebooted after the pairing, the associated COM port is still registered in the system. You can connect to the serial port within the Petoi application, such as the Desktop app and the Mind+.
Check the outgoing serial port, which we will use later in the Mind+ or Petoi Desktop App in the More Bluetooth options:
If you have already added the BiBoard Bluetooth before, after powering off and powering on the robot, you should remove both of the two devices in the list as follows:
Then re-do the Step 3.
Don't add the one with the name Bittle**_SSP that auto-generates a PIN code:
Click the button Cancel to quit.
Test in Mind+:
FAQ(Frequently Asked Questions)
Bittle vs Bittle X
The doc seems to refer to Bittle and Bittle X interchangeably. Why is that?
Feedback servos
We introduced the position feedback feature for servos manufactured after March 2024. This feature utilizes the same PWM signal wire to return the servo's actual position, opening up a new control interface for the robot.
This feature should be present on all servos with labels or laser marks after May 2024. If the labels are missing, they may still have it. However, the feature is only available on ESP32-based BiBoards (not NyBoards).
To check it, you need to upgrade your robot's firmware. Enter the serial command 'f' in or the . If the monitor keeps printing values that change when you move the servos, they are position feedback. The number of columns corresponds to the number of servos with feedback.
The servos have to be all feedback servos to perform the following features:
Setup on NyBoard
The Petoi Web Coding Block can also be used for the robot, which uses the and the .
Please take a look at the related section in the Wi-Fi module for instructions on and software setup ( and ).
Upload the WiFi Firmware to the WiFi module
Project URL:
Calibrator
Prepare for calibration
For NyBoard:
C++ API
How to use C++ to play with Nybble😼 or Bittle🐶
Use the library in your own project
The project is built as a dynamic library so that the program can easily link to it. The recommended practice to use the library is to clone it as a git submodule:
If you are using cmake, simply create a CMakeLists.txt file and link the library to your executable:
3.Analog-digital converter
Application of ADC which is variable gain on BiBoard (ESP32)
The instructions of ADC on BiBoard
The 34, 35, 36 and 39 pins of the ESP32 module support input only. We configure it as an analog input port on BiBoard, which makes it convenient for developers to connect 4 foot sensors.
The usage of analog input analog-to-digital converter (ADC) on BiBoard is the same as the basic Arduino UNO, but the accuracy is higher (12 bits, UNO is 10 bits), and a programmable gain amplifier is added to make the ADC work in the best range.
When a 1V voltage signal is input, if 12bit access is used according to the normal configuration, the reference voltage is equal to the power supply voltage (3.3V): the corresponding output is 0~1241, a large part of the ADC range will be wasted, resulting in inaccurate data. When we configure the programmable gain, we can make the 1V input signal fill almost the entire ADC range, and the accuracy and resolution are greatly improved.
This demo uses 4 inputs, respectively configured as: 0/2.5/6/11 decibel amplification gain, it should be noted that the default configuration of ESP32 Arduino is 11 decibel amplification gain.
We use "analogSetPinAttenuation(PIN_NAME, attenuation)" to configure the gain of a single input pin, or use "analogSetAttenuation(attenuation)" to configure the gain of all analog input pins.
In the actual test, when the 1V standard voltage is input, the ADC values are: 3850/2890/2025/1050. In future productions, the ADC range can be changed by changing the ADC gain without the replacement of the reference voltage source.
// Ain 34 - 0dB Gain - ADC_0db
analogSetPinAttenuation(34, ADC_0db);
// Ain 35 - 2.5dB Gain - ADC_2_5db
analogSetPinAttenuation(35, ADC_2_5db);
// Ain 36 - 6dB Gain - ADC_6db
analogSetPinAttenuation(36, ADC_6db);
// Ain 39 - 11dB Gain - ADC_11db (default)
analogSetPinAttenuation(39, ADC_11db);
It doesn't matter if you use ',' or space ' ' to separate the numbers. However, using ',' to group can clarify one joint's parameters.
frequency defines how many cycles the joint can oscillate in one loop.
phase is defined as -120 to 120. So phase = 30 means shifting by Pi/2. 120 is one entire period.
For example, the head’s pan/tilt angles can be bound to form the Lissajous Figure.
Follow the on-screen instructions(default settings). Setup can take 10 minutes or more.
A terminal window opens. You have a Debian 11 (Bullseye) environment. You can run Linux commands, install more tools using the APT package manager, and customize your shell.
:
Bittle and Bittle X are from the same family and share a lot of common things, except for the microcontroller difference where Bittle X uses BiBoard and Bittle uses NyBoard. So we just refer to Bittle most of the time without specifically mentioning Bittle X.
The difference of mainboards
The differences in specifications of different mainboards are shown in the figure below:
The error that occurs when uploading the sketch is shown below:
[1]. Do the simple checks as follows:
Make sure there's no other program using the serial port, If you have opened the Arduino IDE and its serial monitor, it may occupy the serial port.
Make sure the uploader is connected to the NyBoard .
Make sure you're using the USB cable that comes with the kit, some USB cables may only have two wires for powering, but no data wires.
[2]. For this operation, you can use a simple test sketch for convenience.
With the Petoi Desktop App, select the microcontroller type: NyBoard_V1_*, then you can upgrade the Standard firmware.
With Arduino IDE, select the microcontroller type: Board-> Arduino AVR Boards-> Arduino Uno, then you can upload the sketch: File-> Examples->04.Communication->ASCIITable.
[3]. Install .
[4]. .
Why there are two calibration stages?
There are two calibration steps for different components.
Because the controller board has limited resources, we divide the program into two stages.
In the first stage, we upload the program and large data to the onboard EEPROM (hard disk) and use the remaining programming space to calibrate the IMU, a sensor that measures the body orientation. The board should be leveled and untouched during the (IMU) calibration.
In the second stage, we upload the standard functional code. For the first-time configuration, we need to enter the (joint) calibration state and attach the legs in the right direction.
If you use the Arduino IDE to set up the board, you will handle those stages explicitly. The Petoi Desktop App can finish the two-stage uploading in the background. The mobile app can work only with an already configured board. Its (joint) calibration is only for attaching the legs.
If I buy the pre-assembled Bittle, does it still need to be calibrated?
Yes, you still need to use the desktop app/mobile app/Arduino IDE to fine-tune the joints if your robot doesn't walk very stable.
If I buy a microcontroller such as NyBoard or BiBoard alone, do I have to buy a separate software program to make it work?
Our microcontrollers are specifically designed for our robots. The open source code is free to use and can be downloaded on GitHub.
Can your robot (Bittle / Nybble) function on its own? Or does it only work with the commands I give it? Also, can it learn?
It follows your instructions via the infrared remote, mobile app, or desktop app. It can also do random behaviors if you enable the random mode. Best of all, the program is open source on GitHub, and you can refer to the relevant technical documents to create new skills for your robot.
When running the Petoi Desktop App in MacOS14.1 (Sonoma), the buttons are not responsive. How to solve this problem?
This is due to the incompatibility of the Python Tk library with MacOS. The temporary solution is that you can press the button and drag the mouse slightly at the same time.
How to set up Arduino IDE on ChromeOS (for Chromebook)
I'm on Windows 11 and cannot find the robot in the Bluetooth device list
Try to set "Bluetooth devices discovery" to "Advanced" as follows:
How to install the CP210x driver on Windows
In the Device Manager, if you open the Other devices list, you may see a CP210X device with a triangle exclamation sign. Right-click it to find the "update driver" option, then select the enclosing folder of your downloaded driver to install.
When use mobile App connects to the robot, it indicates "The device doesn't seem to be a Petoi robot."
When connecting, the app will send handshake signals to the robot, and the robot should be running the firmware in standard mode to respond correctly. If the app returns a "not Petoi robot" error, it's probably due to a firmware issue. Please follow this debugging process:
[1]. Please check the version of the app as follows:
App Store
Google Play
[2]. For the startup melody in normal mode, please refer to the 00:13 in the video below:
For how to open the serial monitor and input the serial command, please refer to the instructions in the Petoi Doc Center.
How can I easily install the springs into the upper legs of Bittle?
Please check out the forum post discussing installing springs with various tools. Or you can request Bittle upper legs with pre-installed springs
I can't find the toe covers. What are the toe covers for?
The toe covers are for special experiments that require more friction. They are not required for regular walking and performance. We have removed them from the standard kit recently, and you may order them as optional accessories.
Some frame structures are broken. Where can I get replacement parts?
You may contact us. Show the picture of the broken pieces and explain how they broke. You may find the 3D-printable files or get a replacement directly from us.
Bittle's neck is loose and may fall accidentally. How can I reinforce the connection?
In some cases, the motor's output gear may disengage with the following gear. It will result in an abnormal buzzing sound inside the servo. You can take off the bottom of the servo and push the motor inward very hard until you hear a clicking sound.
The camera module can't work after being connected to the BiBoard extension hat.
For the BiBoard V0 mainboard, power on the robot via battery, and the servos can not move.
After powering on the robot via battery, if you speak a voice command to the robot, there is only a voice response, but no action response. Or you send the skill command to the robot, and the servos can not move. Maybe the fuse(marked X30 or X70) is damaged, it has a lower capability to handle current, which causes the LED light to blink and lowers power stability.
If you have a soldering iron, you can directly connect the two ends of the fuse as following:
Can I use block-based coding with any Petoi robot? Do I need to purchase add-on components/modules?
You can use Petoi Coding blocks to do Scratch-like block-based programming with all of Petoi robots.
There's nothing else to purchase.
Do joint calibration automatically
Serial Monitor: Send serial command "c16". The robot will enter its resting posture. Push the robot down flat onto the table, move its head straight forward, and send a space character(‘ ’) in the serial monitor. The robot will automatically set the calibration values of all its joints. Some joints can still be off and require standard calibration, but it saves most of the time.
Mobile app: Create a mobile app command called "Auto calibrate"(customizable) and use the code: c16 . The robot will enter its resting posture. Push the robot down flat onto the table, and and move its head straight forward.Create a mobile app command called "Quit"(customizable) and use the code: "d" to continue to the automatic calibration step. The robot will automatically set the calibration values of all its joints. Some joints can still be off and require standard calibration, but it saves most of the time.
Movement following
Serial Monitor: Send the serial command "fF", then slowly drag one of the legs. The other legs will follow the motion.
Send another serial command to quit.
Mobile app: Create a mobile app command called "following"(customizable) and use the code: fF
Create a mobile app command called "Quit"(customizable) and use the code: d to quit this mode.
Learn a new skill by rotating servos
Serial Monitor: Send serial command 'fl', which means learning new movements. Move the legs to your intended starting position, then keep the robot steady for about 2 seconds. The robot will count down and then beep slightly to indicate that it has started recording. It won't record small movements, so you can pause in the middle. After 124 frames, if you enter any character in the serial monitor or stop moving it for over 2 seconds, it will stop recording. Send serial command 'fr', which means replay to recall the taught movement.
Mobile app: Create a mobile app command called "start learning"(customizable) and use the code: fl which means learning new movements. Move the legs to your intended starting position, then keep the robot steady for about 2 seconds. The robot will count down and then beep slightly to indicate that it has started recording. It won't record small movements, so you can pause in the middle. After 124 frames, if you enter any character in the serial monitor or stop moving it for over 2 seconds, it will stop recording.
Create called "replay"(customizable) and use a space character as the code: fr to which means replay to recall the taught movement.
The skill will also be printed on the (as pictured below), and you can import it into and the .
If you wish to write new applications based on the feedback servo, refer to the source codes in OpenCatEsp32/src/espServo.h.
Please open the WebCoding8266.ino in the Arduino IDE and install the library WiFiManager, WebSockets, and ArduinoJson in the Library Manager:
Then connect the USB uploader, plugged into the WiFi module, to the computer via the USB data cable. Select the correct serial port and upload the sketch to the ESP8266 WiFi module as follows:
After the sketch is uploaded to the WiFi module, open the serial monitor in Arduino IDE. Then, unplug and re-plug the WiFi module into the USB uploader.
Open your smartphone's WiFi scanner and find an unencrypted access point named "Petoi-AP****" (shown as in the serial monitor) and connect to it to configure the WiFi parameter of the module, let the WiFi module join the local network, and get a local IP address. For more details, please refer to the " How to use" section of the WiFi module.
After the WiFi module gets the IP address (as shown in the serial monitor above).
Unplug the WiFi module from the USB uploader, plug it into the NyBoard, power on the robot, and enter the WiFi module's IP address in the coding block.
Now you can use the web coding page to run the program:
make sure you have uploaded the OpenCat Main function firmware before calibrating.
Only the software version 2.0 is supported to calibrate the joints via this App.
You need to connect theBluetooth modulewith computer, install the battery and long-press the button on the battery to power the robot.
We recommend that you quickly browse the page's general content first. Then, based on the product type you are actually using, you can check the corresponding sub-page for more specific instructions.
You can refer to the sub-page of Calibrator in the MOBILE APP:
Enter the calibration state
After the robot is powered on by the battery, there are 2 methods to enter the calibration state.
Use Bittle for example:
Click the Start Calibration button.
Click the Calibration button in the calibration interface.
For the construction kit, you can install the body parts to the robot torso according to the instructions in the following sub-pages based on the products you choose.
For the construction kit, after installing the body parts, you do not need to use screws to fix the body parts to the robot trunk for the time being.
The pre-assembled robot should already have the legs properly installed. You can do the joint calibration for fine-tuning.
When calibrating, Depending on the product you are using, select the corresponding calibration ruler in the sub-page as an aid. first select the index number of the joint servo from the diagram(when adjusting the leg servo, adjust the thigh first, and then adjust the calf), and then click the "+" or "-" button to fine-tune the joint to the right angle state.
If the offset is more than +/- 9 degrees, you need to remove the corresponding part of the servo and re-install it by rotating one tooth, and then press the "+" or "-" button.
For example, if you have to use -10 as the calibration value, take the limb off, rotate by one tooth then attach it back. The new calibration value should be around 4, i.e., they sum up to 14. Avoid rotating the servo shaft during this adjustment.
Test calibration effect
You can click the skill buttons to switch between Rest, Stand, and Walk to test the calibration effect.
Use Bittle for example:
Bittle
If you want to continue calibrating, please click the Calibration button, and the robot will be in the calibration state again (all servos will move to the calibration position immediately).
Note:
You may need a second round of calibrations to achieve optimal results.
After calibration, remember to click the "Save" button to save the calibration offset. Otherwise, click "<" in the upper left corner to abandon the calibration.
Install the screws for construction kit
For the construction kit, after completing the joint calibration, install the center screws to fix the leg parts and servo gears.
Examples
Below is a very simple example on how to use the library.
After you download the compressed file(.zip), please unzip it first.
Do NOT move the UI.exe to another location in Windows.
Prepare for calibration
Please follow the instructions in the subpages to prepare according to the robot's mainboard.
Only software version 2.0 can calibrate the joints via this App.
For Bittle X+Arm, you must install the short wire servo in the servo slot on the robotic arm. For more information, please refer to in the subpage.
Calibration process
Enter the calibration state
You must connect the battery to the mainboard and long-press the battery button for more than 3 seconds to power on the robot.
After the robot is powered on by a battery, there are two methods to enter the calibration state:
It will enter the calibration state automatically when you click the Joint Calibrator button.
Click the Calibrate button in the calibrator interface. Take Bittle for example:
2. The rationale for calibration
2.1 Understand the zero state and the coordinate system
After typing ‘c’ in the serial monitor, with all servos rotated to their zero angles, attach the head, tail, and legs prepared in the previous section to the body. They are generally perpendicular to their linked body frames. The calibration pose is shown below:
If you are building the robot from a kit, install the servo-related components according to the picture above and try to ensure that they are perpendicular to each other (the upper leg is perpendicular to the torso, and the lower leg is perpendicular to the upper leg). Please refer to the related chapter in the user manual for the details:
Nybble
Note: Insert the servo-related components directly into the servo output shaft; do not turn the output shaft during this process.
Rotating the limbs counter-clockwise from their zero states will be positive (same as in polar coordinates). Viewed from the left side of the robot's body, the counter-clockwise rotation of the joint is defined as the positive direction.
The only exception is the tilt angle for the head of Nybble. It’s more natural to say head up, while it’s the result of rotating clockwise.
However, from the right side of the robot's body, the rotation direction's positive and negative are just opposite.
2.2 Discrete angular intervals
If we look closer at the servo shaft, we can see it has a certain number of teeth. That’s for attaching the servo arms and avoiding sliding in the rotational direction. In our servo sample, the gears divide 360 degrees into 25 sectors, each taking 14.4 degrees(offset of -7.2~7.2 degrees). That means we cannot always get a perfect perpendicular installation.
Installing and Fine-tuning
The joint calibration interface of different products is shown in the following subpages.
There are two kinds of kit: the construction kit and the pre-assembled kit.
For the construction kit, you must install the components (such as the head, legs, and tail) after the robot enters the calibration state. For more details, please follow the suppage instructions.
The pre-assembled kit already has the components adequately installed. You can do the joint calibration for fine-tuning.
The included L-shaped tool can be used as a reference during calibration. For more details, please follow the instructions on the subpages.
Validation and Save data
You can switch between "Rest", "Stand up"and "Walk" to test the calibration effect.
If you want to continue calibrating, please click the Calibration button, and the robot will be in the calibration state again (all servos will move to the calibration position immediately). take Bittle for example:
Note:
You may need a second round of calibrations to achieve optimal results.
After calibration, remember to click the "Save" button to save the calibration offset. Otherwise, click the "Abort" button to abandon the calibration data. You can save the calibration in the middle in case your connection is interrupted.
When you close this window, there is a message box shown below:
If you want to save the calibration data, please click the "Yes" button; otherwise, click the "No" button. Click the "Cancel" button to cancel or quit.
Install the screws for the construction kit
After completing the joint calibration, install the center screws to fix the components and servo gears.
Introduction
Petoi Desktop App provides a neat graphical user interface to configure the firmware, calibrate the robot, and design customized motions for your robot. The major function modules are the Firmware Uploader, Joint Calibrator, and Skill Composer.
Download & Installation
You can download the latest version of the desktop App and unzip it.
Before running the app, you must use the included USB adapter or the Bluetooth dongle to connect to a Petoi robot. You may need to for USB connection.
Windows
Run the UI.exe in the unzipped folder. Do NOT move the UI.exe to another location in Windows.
Mac
After downloading the Mac version, you must drag it into the Applications folder.
If you see the error message that "Petoi Desktop App" cannot be opened because the developer cannot be verified, you can right-click the icon, hold the Shift key, and click Open. If it still doesn't open, go to your System Settings -> Privacy and Security and scroll down. There should be an option to allow the app to run.
The upgraded macOS has introduced some incompatibility with the GUI library. To click/activate an element in the app's interface, you need to click the element, hold the click, and slightly move your finger, then release. Otherwise, the event cannot be recognized. Sorry for the inconvenience. It's been a known issue between macOS and the popular Tkinter library.
Linux
Please see the next chapter to run the app from a terminal.
Run the app from the Terminal
In the case of compatibility issues, or if you want to modify the source and test, you can also run the code from the Terminal.
The Terminal is a built-in interface on macOS or Linux machines. The equivalent environment on Windows machines is called the Command-Line Tool (CMD). It's recommended that you install to manage your Python environment. It can also provide the Powershell as a Terminal for the Windows machines.
Depending on your existing Python configuration, you may need to upgrade to Python 3 and install the following libraries:
pyserial
pillow
You can install them by entering pip3 install pyserial pillow in the Terminal or using the package manager in Anaconda.
To run the code:
In the Terminal, use the cd command to navigate to the OpenCat/pyUI/ folder. You can use the Tab key to auto-complete the path name.
After entering the pyUI/ folder, enter ls and ensure you can see the UI.py and other Python source codes listed.
If you encounter the Python error message "_tkinter.TclError: no display name and no $DISPLAY environment variable", you can try to install python3-tk, tk-dev, and idle3.
For Linux users, taking Debian / Ubuntu as an example, the command is as follows:
apt install python3-tk
Open Source Codes
The source code is written with Tkinker in Python 3 and is .
UI.py is the general entry for all the modules:
UI.py
-> FirmwareUploader.py
-> Calibrator.py
-> SkillComposer.py
-> Debugger.py: provides some debugging tools for the Petoi robot.
-> translate.py: provides multi-language support for the UI. You may help to translate the UI into your language.
For more details, please refer to the Connect NyBoard section in the USB uploader module for specific steps.
NyBoard
NyBoard Version
You can find the board version number on the NyBoard.
Note:
For NyBoard V1_1, the board version number is here:
Dial the I2C switch(Sw2) to the "Arduino" side
The I2C switch changes the master of I2C devices (gyro/accelerometer, servo driver, external EEPROM). On default “Arduino”, NyBoard uses the onboard ATmega328P as the master chip; On “RPi”, NyBoard uses external chips connected through the I2C ports (SDA, SCL) as the master chip. Always select "Arduino" unless you can connect the I2C devices from the external chip.
Notes:
Sometimes, if you cannot go through the bootup stage, such as repetitively printing "IMU" and restarting, you may have accidentally dialed the switch to the "RPi" side.
Uploading options
Factory Reset
Our factory uses it to improve efficiency. However, it automatically resets all the parameters, including the calibration parameters of the servos and the IMU, so it's not recommended for regular users.
Upgrade the Firmware
It will upgrade both the Parameters and the Main function firmware.
It is mandatory if you just downloaded a new version of this desktop app.
Update the Mode Only
If you have upgraded the firmware at least once after downloading a new version of this desktop app, you can switch between the modes without refreshing the parameters. It's faster by skipping the firmware upgrade stage.
Upgrade the firmware process for NyBoard
After clicking the Upgrade the Firmware button, the uploading process starts immediately. The status bar at the bottom shows the current progress in real time and the results of key processes.
After the Parameters firmware has been successfully uploaded, the board runs the configuration program. Some message windows will pop up in sequence for you to confirm or cancel:
Reset joint offsets? (Y/N)
Select "Yes, " and the program will reset all servo calibration parameters to zero. The status bar will update the corresponding process and result in real time.
Select "No" to preserve the calibration value(so that you don't need to calibrate again if you have done so before).
For software version 1.0, there is a warning message window of "Update Instincts? (Y/N)" will pop up as follows:
If you select "Yes," the program will upload all skill configuration parameters, and the status bar will update the corresponding process and result in real-time.
Select "No," and the program will skip this step.
If you upload this version of the software for the first time, be sure to select "Yes"!
Calibrate IMU? (Y/N)
Select "Yes, " and the program will calibrate the gyroscope (IMU) to balance the robot correctly. The status bar will update the corresponding process and result in real time.
Select "No," and the program will skip this step.
Note:
Ensure the mainboard is positioned horizontally before clicking the "Yes" button.
When uploading this firmware version for the first time, click the "Yes" button!
When all the steps are completed, a message window will appear showing "Parameter initialization complete!" You must confirm to proceed to the second round of uploading the Main functional firmware.
Calibrate the servo controller chip PCA9685 on the NyBoard.
When the above window pops up, there's an optional step to calibrate the servo driver before clicking OK. If you later find one of the servos stops working but can resume working after re-powering it, it's probably due to an inaccurate PWM driver signal. Please redo the previous upload, and this step CANNOT be skipped.
Introduction
📱🤖
Thanks for choosing Petoi's robot, Bittle or Nybble. This guide will help you set up your robot buddy and provide a simpler UI to calibrate the joints, control the robot, and program it. For advanced users, we recommend you keep the robot updated with the OpenCat firmware on Github for the best compatibility and the newest features.
Download and installation
The app works on both Android and iOS devices.
APK
For Android, you can also download the APK and install it on your phone.
The universal version(try this one first)
The v8a version of the app mainly supports most of the current new mobile phone models
The v7a version of the app is compatible with older mobile phone models
If the Bluetooth dongle (which is plugged in NyBoard) blinks while the connection panel within the App shows a blank Bluetooth connection list, first check if you have given the Bluetooth and location permission to the App. If it still shows a blank list, you may try to install the previous stable version.
Connect to your robot
You need to plug the into the 6-pin socket on the NyBoard. Pay attention to the Bluetooth dongle's pin order. Long-press the button on the battery to turn on the robot's power.
If the buzzer beeps repetitively after bootup or during use, the battery is low. Please charge it in time. The charging port is on one end of the battery.
If the main board is BiBoard, no need to plug the Bluetooth dongle.
The LED on the Bluetooth dongle should blink, waiting for a connection. Open the app and scan available Bluetooth devices. Don't connect the robot with the phone's system-wide Bluetooth settings! Connect the device with the name Bittle, Petoi, or OpenCat. Remember to open the Bluetooth service and grant the app access to the service. On some devices, you may also need to allow the location service for the app, though we are not using any of that information.
On some Android OS, you need to activate the location service as following:
The app will send a greeting to the Bluetooth device and expects a response from the OpenCat firmware. You must install the full OpenCat code on your robot before connecting to the app. Otherwise, the app will consider it's "not a Petoi device". A pre-assembled robot should already have the firmware installed. Otherwise, you must configure it with Arduino IDE or the Desktop app.
If Bluetooth is connected, its LED will light steadily. The robot will play a three-tone melody. If the robot doesn't respond or malfunctions later, press the reset button on the NyBoard to restart the program on the NyBoard.
The App should automatically detect Nybble or Bittle with the latest OpenCat firmware. Otherwise, it will show the selections for Nybble or Bittle. The option "Select a robot" also can be re-visited in the control panel.
Serial Protocol
We have defined a set of serial communication protocols for robots:
All the tokens start with a single ASCII-encoded character to specify their parsing format. They are case-sensitive and usually in lowercase.
Some commands, like the c and m commands, can be combined.
For example:
Successive "m8 40", "m8 -35", "m 0 50" can be written as "m8 40 8 -35 0 50".
You can change the limit in the code, but there might be a systematic constraint for the serial buffer.
Try the following serial commands in :
“ksit”
“m0 30”
“m0 -30”
The quotation mark indicates that they are character strings. Don’t type quotation marks in the serial monitor.
You can refer to the macro definitions in OpenCat.h to utilize the most updated sets of tokens.
Some more available commands for skills:
The complete set of skills in effect is defined in or :
For example:
All the skill names in the list can be called by adding a 'k' to the front and deleting the suffix. For example, there's "sitI" in the list. You can send "ksit" to call the sitting posture. If a skill has "F" or "L" as the second last character, it's a gait. It means walking forward or left. Walking right is a mirror of walking left. So you can send "kwkF", "kwkL", "kwkR" to make the robot walk. Similarly, there are other gaits like trot ("tr"), crawl ("cr"), and stepping ("vt").
Install Arduino IDE on Chromebook
After turning on Linux on the Chromebook, you can access the Linux environment via the terminal app.
Please follow the following steps to install the Arduino IDE:
Check the type of your OS version
Download package
Open the website () and download the corresponding type of Legacy Arduino IDE:
Installation
After downloading complete, set the folder Downloads in the file browser to share with Linux, as mentioned above. Use the following commands to install the Arduino IDE, e.g.,arduino-1.8.19-linux64.tar.xz is the downloading file.
Set up the Arduino IDE development environment for the mainboard
You can open the Arduino IDE as follows:
NyBoard
For more details, please refer to .
After using the USB uploader and USB data cable to connect the NyBoard and Chromebook, you will see a prompt: Please click Connect to Linux.
and check in the Settings interface, and it should be enabled as follows:
After downloading the project file OpenCat-main.zip from GitHub: , use the following commands to unzip it to the Downloads folder.
BiBoard
For more details, please refer to .
After using the USB data cable to connect the BiBoard and Chromebook, you will see a prompt: Please click Connect to Linux.
and check in the Settings interface, and it should be enabled as follows:
Use the following commands to install the library pyserial for uploading the sketch for BiBoard
After downloading the project file OpenCatEsp32-main.zip from GitHub: , use the following commands to unzip it to the Downloads folder.
For BiBoard V1
Hardware Connection
You can solder a 5-pin socket on BiBoard V1 to plug in a Raspberry Pi.
You can 3D print a new that fits the Raspberry Pi socket, as follows:
After plug in the Raspberry Pi board , power on the BiBoard via USB data cable or Battery.
Software Setup
Open the , and send serial command XS to enable the working mode.
You can also modify the source code (OpenCat.h) and to enable the Serail 2 working mode:
Serial port name on Pi
Generally, the serial port name on Raspberry Pi 3 and 4 is "/dev/ttyS0," and the one on Raspberry Pi 5 is "/dev/ttyAMA0." If the Pi can't open the serial port after it is connected to the mainboard, you can uncomment the line of code as follows to check all the serial ports on the Raspberry Pi in the terminal when the Python script(ardSerial.py) is running.
ROS and ROS2
ROS Interface
There's also a for developpers to easily connect to the environment. This ROS wrapper contains two branches: ROS1 and ROS2. It is recommended to use ROS with .
Note:
ROS1 and ROS2 are not directly compatible, but you can achieve limited interoperability through the following methods:
Remote Controller
It's simple to control Nybble / Bittle via the infrared remote controller.
1. Preparation
BiBoard V0
The infrared receiver for
Bittle (NyBoard)
The joint calibration interface for Bittle (NyBoard) in the Petoi Desktop App is as follows:
The servo slider is not available in the light yellow background area in the interface.
for (int t = 0; t < 360; t += resolution)
angle = midpoint +
round(amp * sin(2.0 * M_PI * ((t + phase * 3 / freq) / (360.0 / freq))));
sudo apt update
sudo apt upgrade
OpenCat:82:10: fatal error: src/OpenCat.h: No such file or directory
#include "src/OpenCat.h"
^~~~~~~~~~~~~~~
compilation terminated.
cmake_minimum_required(VERSION 3.0.2)
project(serial_examples)
option(CATKIN_ENABLE "Enable using the Catkin make extension to cmake (ie for ROS)" OFF)
add_subdirectory(opencat_serial)
add_executable(serial_examples path/to/cpp)
target_link_libraries(serial_examples opencat_serial)
#include "opencat_serial/opencat_serial.hpp"
int main(int argc, char *argv[])
{
// connect to the serial device
OpenCat::Robot rob("/path/to/port");
// create task
OpenCat::Task task;
// set command type to calibration pose
task.command = OpenCat::Command::CALIB_POSE;
// time delayed after execution
task.delay = 2;
// send command
rob.SendTask({OpenCat::Command::CALIB_POSE, 2});
return 0;
}
Enter python3 UI.py.
apt install tk-dev
apt install idle3
For macOS users, use the following command to install the library:
brew install idle3
After the installation is complete, reboot the computer.
cd /mnt/chromeos/MyFiles/Downloads/
sudo apt-get install xz-utils
sudo tar -C /opt -xf arduino-1.8.19-linux64.tar.xz
cd /opt
ls
cd arduino-1.8.19/
ls
sudo ./install.sh
cd /mnt/chromeos/MyFiles/Downloads/
sudo apt-get install unzip
unzip OpenCat-main.zip
sudo apt install python3 pip
python3 -V
pip -V
cd /usr/lib/python3.11/
sudo rm EXTERNALLY-MANAGED
sudo pip3 install pyserial
pip list
cd /mnt/chromeos/MyFiles/Downloads/
sudo apt-get install unzip
unzip OpenCatEsp32-main.zip
Before uploading the firmware, please ensure that no I2C device is connected to the I2C interface of the mainboard. Otherwise, the firmware upload will fail. The location of the I2C interface is as shown below (in the red box):
For software version 2.0, this choice is automatically processed as Y in the background.
This calibration makes the servo controller's (PCA9685 chip) angle signal more precise. A short jumper wire connects PWM pin 3 (the signal pin of one of the servo pins) and Grove pin A3, and the wire is steady. It doesn’t have to be a dedicated jumper wire. Any thin metal wire, such as a straightened paper clip, can work as long as it can connect the pins.
The program measures the pulse width of the signal and automatically calibrates the chip after successively getting three identical readings. It usually takes less than 2 seconds. The board will beep three times to indicate that the calibration is done. The calibration offset will be saved to the board for the next bootup. The process should be done at least once, and we have calibrated every board after October 2022. But you can still do it by yourself, just in case.
The x86_64 version of the app indicates that the APK is designed for Android devices using Intel or AMD 64-bit processors. This means the APK contains native code libraries optimized for the x86_64 architecture, designed to improve performance and compatibility.
v1.4.1-40-2-20251022-app-x86_64-release.apk
System Coexistence: Both ROS1 and ROS2 can be installed on the same device, but they are used by switching environment variables and cannot be activated at the same time.
Communication Bridge: Communication between the two requires the ros1_bridge tool to bridge messages. Note that this only supports a limited number of standard message types.
Development Differences: ROS1 code cannot be reused directly. Adjustments are required for ROS2 syntax (such as message types starting with a capital letter) and APIs.
Using ROS on Raspberry Pi
Currently, it's recommended to install ROS using docker.
(mainboard type: BiBoard V0) is on the microcontroller near the neck of Bittle X.
Note that Bittle X V2 comes with BiBoard Vo and doesn't support the infrared remote controller.
BiBoard V0_x
NyBoard V1
The infrared receiver for Nyboard is near the tail of the Bittle robot dog.
NyBoard V1_*
Remote connection
The remote doesn't require pairing. Make sure its plastic insulation sheet is removed, and point the remote‘s transmitter to the receiver on the robot's back when operating. If the robot doesn't respond, you can use your phone‘s camera to check the transmitter. If it doesn't blink when clicking a button, you need to change its battery. If it blinks, it may indicate the program on the robot is not configured correctly.
2. Keymap
Only the position of the buttons matters, though those symbols can help you remember the functionalities. It's better to define position-related symbols to refer to those keys, such as K00 for the 1st row and 1st column, and K32 for the 4th row and 3rd column.
Abbreviations for key definitions can reduce SRAM usage. Due to the limited keys of a physical remote, you can change the definitions for convenience.
The following map is just an illustration. Check the #define KXX commandin OpenCat/src/infrared.h for the actual key definitions in effect. They are also open to your customization.
We also made a customized remote panel for future batches. Previous users can download the design file and print it on A4 paper.
3. Check out the following featured motions
Rest puts the robot down and shuts down the servos. It's always safe to click it if Nybble is doing something awkward.
Balance is the neutral standing posture. You can push the robot from the sides and it will try to recover. You can test its balancing ability on a fluctuating board. Balancing is activated in most postures and gaits.
Pressing F/L/R will make the robot move forward/left/right
B will make the robot move backward
Calibrate puts the robot into calibration posture and turns off the gyro
Stepping lets the robot step at the original spot
Crawl/walk/trot are the gaits that can be switched and combined with the direction buttons
Buttons after trot are preset postures or other skills
Gyro will turn on/off the gyro for self-balancing. Turning off the gyro can accelerate and stabilize the slower gaits. But it’s NOT recommended for faster gaits such as trot. Self-righting will be disabled because the robot no longer knows it's flipped.
Different surfaces have different friction and will affect walking performance. The carpet will be too bushy for the robot's short legs. It can only crawl (command kcr) over this kind of tough terrain.
You can pull the battery pack down and slide along the longer direction of the belly. That will tune the center of mass, which is very important for walking performance.
When the robot is walking, you can let it climb up/down a small slope (<10 degrees)
If the robot keeps beeping after you connect the USB uploader, with numbers printed on the serial monitor, it’s the low voltage alarm being triggered. You need to power the mainboard with the battery to pass the threshold.
The servos are designed to be driven by internal gears. Avoid rotating the servos too fast from the outside.
Don’t keep the robot running for too long. It will overheat the electronics and reduce the servos’ life span.
If you feel something is wrong with the robot, press the reset button on the main board to restart the program.
Be kind as if you were playing with a real kitten/puppy. (^=◕ᴥ◕=^)
BiBoard Hat V1.0 is the extension board of BiBoard V0, which allows for convenient connection of the voice command and other Grove extensible modules.
Connection to the BiBoard
Peripherals
The extension hat has an onboard voice command module and four grove sockets.
1x Serial2 port (GPIO16, 17).You must dial the slide switch to UART2 to free it for regular serial communication or GPIO. In that case, the Tx pin (GPIO 17) can be used to write.
1x I2C port (GPIO21, 22). It's already used by the main program to read sensors. If you use the BiBoard as a regular ESP32 board without Bittle's firmware, they can be configured as regular GPIO pins to read and write.
2x input-only pins (GPIO 34, 35, 36, 39).
No.
Module
Introducion
Introduction to the onboard components
Voice command module
It's equivalent to the independent Grove voice module introduced in the .
Grove sockets
We adopted the Grove sockets for convenient plug-and-play connections. There are three types of sockets:
BiBoard provides the 5V power supply of the grove sockets, while the 5V comes from the battery. So the devices connected to the Grove sockets can only work when connected to the BiBoard and powered by the battery.
BiBoard's 3.3V powers the voice module. The 3.3V can be supplied from the USB. So it can work without battery power.
UART2 / Voice command switch
UART2 shares the GPIO ports with the voice command module. When the switch is dialed to VOICE COMMAND, the Serial2 port can NOT be used. You can dial the slide switch to UART2 to free it for regular serial communication or GPIO.
The function of the switch is shown in the figure below:
Joint Calibration
Joint calibration is vital for the robot to work properly.
The pre-assembled robot should have the legs installed, but you can further improve its performance by fine-tuning the joints' calibration.
Make sure you have uploaded the OpenCat before calibrating.
This is a cool tutorial video made by one of our users, which briefs the process and explains its logic.
# start core
roscore
# start service server
rosrun opencat_server opencat_service_node
# examples using oppencat ros service in C++
rosrun opencat_examples opencat_examples_client_cpp
# examples using opencat ros service in python
rosrun opencat_examples opencat_examples_client_py
We have published the 3D structure of the Bittle / Bittle X (Bittle X+Arm)'s calibration bracket online. If you have a 3D printer, you can print it by yourself. Please check this page:
You don't know where the servos are pointing before they are powered and calibrated. So if you attach the legs, the legs will rotate to random angles and may collide with the robot's body or other legs and get stuck. If a servo is stuck for a long time, it may break.
The robot has a "calib" posture with all joints set at zero degrees. You can put the robot to the calib posture so that you know all the joints should be rotated to their zero points (though you cannot see because the legs are not attached to the servos yet). Then, you can attach the legs to the servos one joint by one joint, perpendicular to their nearby references on the body frame.
Calib Posture
Because the servo's gear teeth are discrete, aligning the legs to the right angles perfectly is impossible. So, you will need to fine-tune the offsets within the software.
The principles are the same for Nybble and Bittle.
Prepare to Enter the Calibration State
Entering calibration mode requires the following preparations:
1. All servo circuits are connected to the mainboard
2. The battery is plugged into the controller board and is turned on (long-press the button on the battery to turn on/off the power)
3. Connect the robot to a computer or mobile phone
For BiBoard, The USB data cable connection must be made directly to the BiBoard and NOT to the battery's outside charging port. You can also connect to the computer / mobile phone via Bluetooth.
If you build the robot from an unassembled kit, do not install the head and leg components before entering the calibration state.
If you have a pre-assembled kit with the feedback servos, you can do automatic calibration to save time.
Note: For robots with robot arms, the automatic calibration function does not include the claw joint.
Enter the Calibration State
The robot's legs may point to unknown angles when booting up. When entering the calibration state, the joints will be moved to their zero positions. You can see the output gears of the servos rotate and then stop. Then, you can attach the legs and fine-tune the joint offsets in the software interface. There are 3 software interfaces to enter the calibration state and fine-tune the joints.
You can also enter the calibration state by booting up the robot with one side up. This method doesn't require any computer, remote, or smartphone app, so it's convenient when you are focused on assembling the robot from the kit.
Install the screws
After completing the joint calibration, install the center screws to fix all the joint parts and servo gears.
After downloading the compressed file(.zip), please unzip it first.
Do NOT move the UI.exe to another location in Windows.
Petoi Desktop App works on both Nybble and Bittle controlled by NyBoard based on ATmega328P or Bittle X controlled by based on ESP32.
For , more detailed documentation can be found at , (which is similar to NyBoard V1_1).
Connect the mainboard to the computer
You can connect the computer to the mainboard using a USB cable, following the instructions on the subsequent sub-pages, which are specific to the robot's mainboard model. To see the sub-pages as in the following picture:
Upload the firmware using the Petoi Desktop app
Open the PetoiDesktopApp
After properly connecting the USB uploader, open the PetoiDesktopApp (for Windows: UI.exe / for Mac: Petoi Desktop App), and select your Model and Language.
Menu bar in Petoi Desktop APP
Click the Firmware Uploader button
Auto Detect the Serial Port
If there is no serial port or more than one serial port are detected by the desktop app:
After clicking the Firmware Uploader button, there will be a message box prompt as follows:
Please follow the prompts in the message box.
After clicking the Confirm button, If you complete the prompts within 10 seconds, the desktop app will automatically identify the serial port name connecting the robot to the computer.
If you complete the operation of unplugging and plugging the USB interface on the computer for more than 10 seconds, the desktop application will enter the manual selection of the serial port name mode:
Click the OK button in the Warning message box first, then you can refresh the serial port list or select one of them (e.g. COM3) and click the OK button in the Manual mode window to open the Firmware Uploader interface as follows:
Once the Firmware Uploader interface is opened, you can also unplug and replug the USB cable from the COMPUTER side. The desktop app will automatically identify the serial port name connecting the robot to the computer.
If unplug the COM5 and replug it on the computer side, it will be discovered by the desktop app as follows:
Select the correct options to upload the latest firmware.
The 1.0 software won't work properly with the Joint Calibrator, the Skill Composer, and other APIs. Only use it when you want to use CodeCraft (a graphical coding interface by our partner, TinkerGen).
Options
Values
Note
You can use the serial commands to for BiBoard:
For BiBoard, Mind+ mode is supported by default, so it doesn't require a serial command to switch on.You can learn about the function of each module through the .
There's no correlation between the board (hardware) version and the code (software) version.
Finish uploading the firmware
After the upload, the status bar will update the corresponding result, such as the success or failure of firmware uploading. If the uploading is successful, a message window of "Firmware upload complete!" will pop up simultaneously.
Note:
For NyBoard, when you open the software and upload the firmware for the first time, the program will first upload the "Parameters" firmware and then the "Main function" firmware.
Check the log file
If the uploading fails, the following message box will pop up:
The log file is located at:
For Windows:
The log file is in the same directory as UI.exe
For macOS:
You can check the log file as follows:
When you contact our [email protected], please attach the log file to your email.
There may be some OS platform compatibility issues with different computers.
You can still run the app directly from your terminal:
Go to OpenCat/pyUI/ in your terminal.
If you have Arduino IDE programming experience, you can see the same log message when uploading.
For NyBoard, you can refer to .
For BiBoard, you can refer to .
Raspberry Pi serial port as an interfac
Robot doesn't need a Pi to move.
You need to unplug the 6-pin USB adpter for the NyBoard before mounting the Pi to the board.
You can solder a 2x5 socket on NyBoard to plug in a Raspberry Pi. Pi 3A+ is the best fit for NyBoard's dimension.
Nybble
Bittle
After you solder on the socket, you won't be able to install the back cover of Bittle.
The red can be 3D printed.
As shown in the , the arguments of tokens supported by Arduino IDE's serial monitor are all encoded as Ascii char strings for human readability. While a master computer (e.g. RasPi) supports extra commands, mostly encoded as binary strings for efficient encoding. For example, when encoding angle 65 degrees:
Ascii: takes 2 bytes to store Ascii characters '6' and '5'
Binary: takes 1 byte to store value 65, corresponding to Ascii character 'A'
What about value -113? It takes four bytes as an Ascii string but still takes only one byte in binary encoding, though the content will no longer be printable as a character.
Obviously, binary encoding is much more efficient than the Ascii string. However, the message transferred will not be directly human-readable. In the OpenCat repository, I have put a simple Python script that can handle the serial communication between NyBoard and Pi.
1. Config Raspberry Pi serial port
In Pi's terminal, type sudo raspi-config
Under the Interface option, find Serial. Disabled the serial login shell and enable the serial interface to use the primary UART:
Run raspi-config with sudo privilege: sudo raspi-config.
Find Interface Options -> Serial Port.
At the option Would you like a login shell to be accessible over serial?
You also need to DISABLE the to avoid repeating reset signals sent by Pi's GPIO 4.
If you plug Pi into NyBoard's 2x5 socket, their serial ports should be automatically connected at 3.3V. Otherwise, pay attention to the Rx and Tx pins on your own AI chip and its voltage rating. The Rx on your chip should connect to the Tx of NyBoard, and Tx should connect to Rx.
Note: If you installed UbuntuOS on Raspberry Pi, please config it as follows:
add enable_uart=1 to /boot/config.txt
If you are using generic Linux system, once the uploader is connected to your computer, you will see a “ttyUSB#” in the serial port list. But you may still get a serial port error when uploading. You will need to give the serial port permission. Please go to this link and follow the instructions:
2. Change the permission of
If you want to run it as a bash command, you need to make it executable:
chmod +x ardSerial.py
You may need to change the proper path of your Python binary on the first line:
#!/user/bin/python
3. Use ardSerial.py as the commander of robot
NyBoard has only one serial port. You need to UNPLUG the USB adapter if you want to control Bittle with Pi's serial port.
Typing ./ardSerial.py <args> is almost equivalent to typing <args> in Arduino's serial monitor. For example, ./ardSerial.py kcrF means "perform skill crawl Forward".
Both ardSerial.py and the parsing section in OpenCat.ino need more implementations to support all the serial commands in the protocol.
For Nybble:
Reduced motion capability may happen when connected to Pi! A stronger battery is needed.
In the control panel, you can control the robot to perform various postures, behaviors, and gaits.
Gaits
The left panel sets both the robot's gaits and directions and send combined command, such as "walk left" and "trot forward". The robot will only move if an initial gait and direction are selected. The "step" has no direction, and "backward" has left and right directions. The pause button "||" will pause the robot's motion and turn off the servos, so that you can rotate the joints to any angle. The "Turbo" button ( ) turns on/off the gyro, a sensor to detect the robot's body orientation. Turning it on will make the robot keep adjusting to body angles, and will know when it's upside down. Turning it off will reduce calculation and make it walk faster and more stable.
Run MicroPython on ESP8266
After uploading the MicroPython firmware on ESP8266, we can use it run MicroPython scripts.
1. Run the script directly
We can execute the python scripts directly in the interpreter.
BiBoard V0 Guide
1. Introduction
BiBoard is a robot dog controller based on ESP32 developed by Petoi LLC. Unlike NyBoard, which is for regular users and robot lovers, BiBoard mainly faces developers and geeks. High-performance processors, larger memory and storage (16 MB of Flash), and wireless connections. Audio function is also included.
Standard (default)
RandomMind
Voice
Mind+
Camera
Ultrasonic
RandomMind_Ultrasonic
Light
Touch
PIR
Gesture
IR distance
For NyBoard, these 12 modes can be selected. All of these modes apply to both Bittle and Nybble.
For BiBoard, You only need to upload the Standard mode firmware, and you can switch between different modes via serial port commands. [1]
Serial port
Auto detection or by manual selection.
You can find the correct one through unplug and replug the USB socket on the computer side
After uploding the firmware, if the NyBoard or BiBoard V1 is not connected to the battery and powered on, you will hear repetitive descending melodies, indicating that the battery is low or disconnected. You need to connect the battery and turn on its power.
Install pyserial and pillow for your Python. You may get a clean Anaconda environment and pip3 install pyserial pillow
Run python3 UI.py
For NyBoard, the firmware uploader calls the application avrdude to upload firmware files to the mainboard.
Linux OS
For Linux system users, in addition to the above steps, you also need to perform the following steps:
1. Install avrdude
Fedora: dnf install avrdude
CentOS: yum install avrdude
Debian / Ubuntu: apt install avrdude
2. Modify the variable avrdudeconfPath in FirmwareUploader.py
make sure you have pyserial installed if you're using the python serial library, not python-serial from apt.
create the following udev file (I created /etc/udev/rules.d/50-tty.rules):
reload your udev rules: sudo udevadm control --reload-rules && sudo udevadm trigger
change the group of the new serial devices:
The devices are now under the tty group. Need to add the user to the tty group and dialout group:
update the permissions for group read on the devices:
reboot
Or just create a script that will do this automatically.
With the additional current drawn by Pi, Nybble will be less capable for intense movements, such as trot (the token isktr). The system is currently powered by two 14500 batteries in series. You may come up with better powering solutions, such as using high drain 7.4 Lipo batteries, or 2S-18650. There are a bunch of considerations to collaborate software and hardware for balanced performance. With Nybble's tiny body, it's better to serve as a platform for initiating the communication framework and behavior tree rather than a racing beast.
The built-in postures and behaviors can be triggered by pressing the buttons. Don't press the button too frequently and repeatedly. Allow some time for the robot to finish its current tasks.
Import commands in batches
You can press the Import commands button in the menu list (as follows) to import the command buttons via a config file (*.json) .
Customized commands
Press and hold the button and drag to change the button position.
Double-tap the command button to edit it.
You can also create a customized single command/group command by pressing the "+" button.
Create a single command
After pressing the Create Command button, you can see the following interface:
After entering the editing state, there's a serial console to test the command and configure the robot.
You can try the following useful serial commands in the Code text box:
* move Bittle's head (move joint angle)
* move head left and right (move joint1 angle1 joint2 angle2 .... The angle is -127~128)
* sit
* move joints one by one
* MOVE joints simultaneously
Below are the indexes of the joints for your reference. Observe the patterns of the ordering and try to remember them.
* show current joint angles
* long meow once (Nybble)
* short meow three times (Nybble)
* mute/unmute the buzzer beep
* adjust the buzzer volume (b[0-10])
* play a short tone (beep tone duration, duration is 0~256)
* play a melody (beep tone1 duration1, tone2 duration2, tone3 duration3, .... only 64 characters are allowed, the actual duration is calculated as 1/duration)
More common commands to be added
Please see this list of common commands that may be added as customized commands. You can enter the "Voice command" column values as the "Name" values and the "Customized command code for Petoi mobile app" column values as the "Code" values.
A more detailed command table can be found in the Serial Protocol.
Import new skills as a customized button
Import your local customized skill (created by the Skill Composer)
You can send the skill file to your phone using Messenger or email and open the file on the phone using the Petoi App. A button will be created for the new skill; you can see it when you open the control panel.
Import new skills from the skill library on GitHub
The SkillLibrary folder in Github contains new skills for the OpenCat robot, which can be used for your reference. You can use your mobile browser to access the GitHub page of the OpenCat project, open the skill file (such as Bittle_Fold.md), select the "Code" tab, and share it with Petoi Mobile App(make sure the mobile app is connected to your Petoi robot first), as shown in the figures below. Then you can execute this skill by pressing the newly created command button.
On the iOS device, you may not share the .md skill file on the Github via the Chrome browser. You can download the skill file and refer to the method - Import your local customized skill to import it to this smartphone app.
The group command feature lets you chain multiple commands together and play them in sequence.
After pressing the Create Group Command button, you can see the following interface:
You can name the command group in the Name text box and add the command to the Command Group list by clicking the command button in the Command Library selection box. In the Command Group list, you can press and holdthe command button and drag to change the command position.
Click the Test or Play () button to test the function of the command group. click the Pause () button to interrupt the command list execution flow.
Click the Delete button to Delete the group command.
Make your robot act randomly
If your robot doesn't have any random behavior, you may need to upgrade your robot to the latest firmware.
Updates and support
We keep improving the app and will inform you of the updates when available. Please write to [email protected] if you have any questions about the app.
2. Use the .py file to run the script
The NyBoard WiFi module ESP8266 uses the IO2 pin to connect with a red LED to indicate the connection status. This LED is programmable. Write a simple python blink script:
Press the green start button on the toolbar, and the script will be sent to the WiFi module through the serial port, and then run after being interpreted by the built-in MicroPython interpreter of ESP8266. Because the Blink script is an endless loop when it needs to stop, press the red stop button to end the program interruption and reset.
3. Upload the .py file to the ESP8266
We can click View -> File to open the file toolbar, and the file is displayed on the left side of Thonny. The upper part is the directory of the local machine, and the lower part is the files stored in the MicroPython device. By default, there is only one boot.py file, please do not delete this file, it is the startup file of the MicroPython device.
We save the script as blink.py and save it on the machine, right-click on the file and select Upload to / :
Select the MicroPython device in the pop-up window:
There is a blink.py file on the device. So the file is saved on the device.
4. Write a script to let robot perform actions sequentially
ESP8266 can send commands to NyBoard through the serial port. We only need to write a simple serial port sending script to send a series of serial port commands to NyBoard, and then the robot can execute sequence actions.
When the actSeq() function is executed, It can output a series of commands through the serial port. Using the serial monitor we can debug. Use the serial port monitor to monitor the output as follows (for the convenience of reading, please use the automatic frame break of the serial port debugger, in fact, there is no automatic line break).
5. Power on and run automatically
After we debug the sequence action, unplug the ESP8266 and plug it into the NyBoard, the robot dog does not respond because the actSeq() function is not running. We want to run the scripts automatically after power on. There are two methods:
Please change the file name to "main.py" and save to the device (Recommend)
Modify the Boot.py
2. Modules and functions
The function partition for BiBoard is shown below:
Part No.
Module
Function
Introduction
Power 1
Battery Socket
Connects to Bittle's battery or provides external 8.4V power
Bittle battery or external 8.4V battery
2
Power LED
Indicates power status: Blue for 5V/3.3V, Orange for 8.4V servo power
3
Power
Block diagram for BiBoard is shown below:
3. Module details:
3.1 Power
There're 2 ways to power the BiBoard: USB 5V and battery socket 7.4V.
When using USB power, there’s no power output for DC-DC 5V extension and servo. So USB power mainly supplies ICs.
When using battery power at 7.4V (maximum: 8.4V). Both servos and 5V power will be supplied. You can use 5V powering the Raspberry Pi.
3.2 On board modules
3.2.1 USB Downloader
There’s no USB circuit in the ESP32, so we use the CP2102 USB bridge as officially recommended. The maximum download baud is 921600. The bridge is connected to serial 1 of the ESP32.
We use the USB Type-C port; 2 resistors, CC1 and CC2, are added as the identifier.
We tried the automatic download circuit designed by ESP and the NodeMCU, but none of them works perfectly. So we modified the circuit by adding the third transistor and enlarger the capacitor.
The transistors receive standard serial modem signals DTR and RTS and trigger a unique timing-sequence forcing ESP32 into download mode and then reboot. The detail of the automatic download circuit is shown below.
3.2.2 IMU
We use Invensense MPU6050, the most widely used IMU. Its I2C address is 0x68, and DMP’s interrupt is connected to IO26 of the ESP32.
With the help of Jrowberg’s MPU6050 DMP library, you can easily get the motion status of the Bittle. The Jrowberg’s MPU6050 library must be modified to adapt ESP32. The data types of “int8” and “PGMSpace” should be pre-defined instead of 8-bit AVR macros. We offer the modified library of MPU6050. You can replace the original library so that both AVR boards and ESP boards would be worked normally.
3.2.3 EEPROM
There is a 64Kbit EEPROM on the BiBoard. You can directly use the EEPROM read and write a program that is used on the Arduino UNO. You can use it to store calibration data.
There is also an example program named “EEPROM” in the ESP32 support package. This is not the demo code of the I2C EEPROM. That’s the demo of the simulated EEPROM by ESP32’s QSPI flash memory.
3.2.4 DAC and audio applications
We use DAC output and a class-D amplifier instead of a PWM buzzer to make Bittle more vivid. You can use 3 ways to drive the audio module:
Use Arduino “Tone()” function.
Use ESP32 “dacWrite()” function like “analogWrite()” in Arduino. The data quality produced by the DAC is better than the PWM.
Use ESP MP3 decode library developed by XTronical, you can play MP3 files. You should configure a file system like SPIFFS or FAT in the flash before you use this MP3 decoder.
The IR sensor on Nyboard and BiBoard are the same, so you can directly use the sketch from the Nyboard. The BiBoard’s flash is large enough so that you don’t have to disable macros in IRremote.h.
4. Servo sockets
There’re 12 PWM servo sockets on the BiBoard, and the pin number is marked near the socket.
We transform the direction of the PWM servo socket by 90 degrees since the size of the ESP32 module. You should connect the wires first before you screw the BiBoard on the cage.
5. Extension sockets
There’re 3 extension sockets on the BiBoard that marked with P15, P16 and P17.
5.1 Analog input sockets(P15)
This socket is used for analog input extension, you can try to connect foot press sensors to this socket.
5.2 Bus extension sockets(P16)
This socket is used for bus extension of the ESP32.
5.3 Raspberry Pi interface (P17)
You can use this interface to connect to the Raspberry Pi, but you cannot directly mount the Raspberry Pi above the BiBoard. Use wires or adapters instead.
Servo gear
NyBoard V1_1 & NyBoard V1_2
Update:
NyBoard V1_1 is a V1 refreshed version mainly focused on the shortage of the ATMEGA328P-MU in our supply chain.
Replace the ATMEGA328P-MU(QFN32)with the ATMEGA328P-AU(TQFP32)
Removed 7 WS2812 LEDs to optimize the area.
A green LED is connected to the D10 port with PWM functions.
There's no changes of sockets and pin definitions from V1_0, the bootloader and the OpenCat sketchs is fully compatible.
Overview
NyBoard V1 is an upgraded version considering the users' feedback on NyBoard V0. It's compatible with previous versions, yet has some new design to make it easier to use.
It still uses Atmel ATMega328P as the main chip but adopts 16MHz without accelerating it to 20MHz. Now the board is fully compatible with Arduino Uno, much easier for new users to Arduino.
It keeps driving 16 PWM channels with PCA9685. The pin order is altered, but you don't even need to read the indexes on the board, because the pin mapping is handled within the software.
Now the 6-axis motion sensor MPU6050 is designed on the PCB, rather than a stand-alone module soldered above the board. It supports a built-in DMP (Digital Motion Processor) to calculate the motion data, as well as providing raw data for your own fusion and filtering algorithms.
Logic diagram of the controller
The configuration of NyBoard V1_0 is shown as below:
Introduction to the onboard components
Main controller
NyBoard V1_0 uses Atmel ATMega328P-AU, the same MCU of the Arduino Nano (UNO Compatible).
The ATMega328P works at 16MHz with a 5V supply. It has 2KB SRAM, 32KB Flash, and 1KB on-chip EEPROM. With the same bootloader of Arduino Uno, you can upload sketches through the serial port.
LED(NEW!)
The WS2812 serial RGB LEDs are replaced by a single green LED. You can easily use it with standard Arduino GPIO control commands.
I2C switch
The main chip runs at 5V, while the other peripherals run at a 3.3V logic level. We use PCA9306 to convert the I2C bus of ATMega328P to 3.3V. We also added an I2C switch on the bus. By dialing it to "Arduino" or "Raspberry Pi", you can change the I2C master of the onboard peripherals.
6-Axis IMU MPU6050
MPU6050 is widely used in many DIY projects to acquire the motion state of devices. It detects the 3 acceleration and 3 angular motion states. It also includes a DMP to calculate the state directly, without using the main controller's computational resources.
On NyBoard V1_0, its I2C address is 0x68. The interrupt pin is connected to the PD2 port of ATMega328P (or the D2 pin of Arduino Uno).
There are a lot of available MPU6050 libraries and we are using I2CDev/6050DMP. You can also use other versions:
PCA9685 and the PWM servo ports
PCA9685 fans out 16 PWM 12-bit channels with instructions from the I2C port. Its address is set to 0x40. There are 16 PWM indexes printed on the PCB, but you don't really need to read them because the pin-mapping is done in the software. The physical wiring pattern is the same as the previous boards. You do need to check the direction of the servo pins. Regular servos have 3 pins for PWM, power(2S), and ground (GND). The ground should connect to the black wire of the servo.
On NyBoard V1_0, the servos' power connects to the 2S Li-ion battery. We designed our servos to be compatible with 8.4V input. Regular servos usually run at 6V. You should not connect regular 9g servos like the SG90 to the board directly.
We use Adafruit PWM Servo Driver Library for PCA9685.
EEPROM
We save the motion skills with an 8KB onboard I2C EEPROM AT24C64. Its I2C address is 0x54. The lookup table of skills is saved in the 1KB on-chip EEPROM of ATMega328P. It uses <EEPROM.h>. You need to pay attention to their differences when developing new codes.
Passive buzzer
The buzzer is driven by PD5 (or the D5 of Arduino UNO). The current is amplified by 2N7002 MOS.
Infrared receiver
We use VS1838B as the Infrared receiver, connected to PD4 (or D4 on Arduino Uno). It's driven by the IRremote library of Arduino, the corresponding remote is encoded in NEC format. You may disable the other protocols in IRremote.h to save Flash (about 10%!)
Voltage detector
The two LEDs in the Petoi logo indicates the powering state of the board. The left eye is blue for the logic chips. The right eye is yellow for the servos' power. When NyBoard is connected to the battery, both LEDs should lit up. When NyBoard is powered by the USB downloader, only the blue LED will lit up.
There's an anti-reverse socket for the battery. The battery's output is connected to ADC7 (or A7 of Arduino Uno) and is not threaded to an open pin. ADC7 collects the voltage over a voltage divider. The actual voltage is approximately 2x of the reading. A safe range of battery voltage is below 10V.
You should charge the battery in time when the battery is lower than 7.4V.
Grove sockets
We adopted the Grove sockets for convenient plug-and-play connections. There are three types of socket:
Power system
The main chips are powered by a Low-dropout (LDO) linear regulator for noise removal and better stability. We use LM1117-5V and XC6206P-3.3V to power 5V and 3.3V chips. The 3.3V LDO is connected in serial after the 5V LDO for better efficiency.
There's a diode between the battery and LM1117-5V to prevent damage by the wrong connection. There's a self-recover fuse (6V 500mA) on the USB uploader to limit the current and protect the USB port.
The Raspberry Pi consumes much more power, so we choose TPS565201 DC-DC to provide a 5V 3A output. The peak output can be 5A and with high-temperature/current/voltage protection. It will cut off the power when the chip keeps outputting >4A and over 100 Celcius degrees until the temperature drops to normal.
The servos are powered by 2S Li-ion batteries directly. Pay attention not to short connect the power or any pins on the NyBoard.
Using the ESP-NOW protocol
Petoi Group Control Solution
1. Function introduction
ESP-NOW is another wireless communication protocol developed by Espressif that enables multiple devices to communicate without or using Wi-Fi. This protocol is similar to the low-power 2.4GHz wireless connection commonly found in wireless mice—the devices are paired before they can communicate. After pairing, the connection between the devices is continuous, peer-to-peer, and does not require a handshake protocol. It is a fast communication technology with short data transmission and no connection, which allows low-power controllers to directly control all smart devices without connecting to a router. It is suitable for scenarios such as smart lights, remote control, and sensor data return.
After using ESP-NOW communication, if a certain device suddenly loses power, as long as it restarts, it will automatically connect to the corresponding node to resume communication.
The communication modes supported by ESP-NOW are as follows:
one-to-one communication
one-to-many communication
many-to-one communication
ESP-NOW supports the following features:
Unicast packet encryption or unicast packet unencrypted communication;
Mixed use of encrypted paired devices and non-encrypted paired devices;
Can carry payload data up to 250 bytes;
At the same time, ESP-NOW also has some limitations:
Broadcast packets are not supported temporarily;
There are restrictions on encrypted paired devices
In Station mode,a maximum of 10 encrypted paired devices are supported;
Petoi group control can use the ESP-NOW communication function of the ESP8266.
2. Setup for ESP-NOW
2.1 Hardware setup
In this case, two Bittles (equipped with ESP8266) and one computer connected with ESP8266 are prepared.
See below for program uploading and MAC address acquisition of the module in the figure.
2.2 Software setup
Install Thonny on the computer to facilitate the debugging of MicroPython of the ESP8266 module. When using the ESP-NOW protocol, special MicroPython firmware is required (see ). Because the normal version of the 8266-MicroPython firmware will prompt that the library cannot be found.
Open Thonny and use the USB uploader to connect the ESP8266 module, enter in the shelll interface:
If there is an error prompt such as "cannot find espnow module", it means that there is a problem with the firmware uploading; if there is no prompt, it means that the firmware uploading is successful.
If after burning the ESP-NOW firmware, the symbolic >>> symbol of Python does not appear in the shell interface, it means that the firmware burning failed. You can try to use the Flash burning tool NodeMCU-PyFlasher.exe, and the burning configuration is shown in the figure below :
3. Code introduction
The group control code is divided into 3 parts:
Query the MAC address of the module
Transmitter program
receiver program
3.1 Query the MAC address of the module
The MAC address is an address used to confirm the location of a network device, and is responsible for the second layer (data link layer) of the OSI network model. The MAC address is also called the physical address and the hardware address. It is burned into the non-volatile memory (such as EEPROM) of the network card when it is produced by the network equipment manufacturer.
The length of the MAC address is 48 bits (6 bytes), usually expressed as 12 hexadecimal numbers. The first 3 bytes represent the serial number of the network hardware manufacturer, which is assigned by IEEE (Institute of Electrical and Electronics Engineers), and the last 3 bytes represent the serial number of a certain network product (such as a network card) manufactured by the manufacturer. As long as you don't change your MAC address, the MAC address is unique in the world. Visually speaking, the MAC address is like the ID number on the ID card, which is unique.
The easiest way to use ESPNOW is to send it by MAC address. We use a small program to query the MAC address of the module.
After running in Thonny, print out the MAC address in the terminal. At this time, you can use a self-adhesive sticker to write the MAC address of the module and paste it on the module.
3.2 Transmitter program
The transmitter program consists of the following parts:
Enable the WiFi function of the module
Configure the ESP-NOW protocol and enable it
Add a node (peer) that needs to communicate
The specific code is as follows:
3.3 Receiver program
The receiver program is mainly composed of the following parts:
Enable the WiFi function of the module
Configure the ESP-NOW protocol and enable it
Add a node (peer) that needs to communicate
The specific code is as follows:
This code is encapsulated in a function named espnow_rx() for the convenience of automatically starting the program after power-on.
There are two ways to realize automatic startup after power-on:
Rename the code file to main.py;
Modify the boot.py ;
For beginners, we recommend the first method.
3.4 Communication-Command Converter
Writing the serial command conversion at the receiving end will make the program too complicated and difficult to maintain. We can create a new function in which to perform instruction conversion and output commands.
8266 MicroPython controller
The tutorial of using the WiFi module as a MicroPython controller
Part 1: Hardware Setup
1.1 hardware list
USB Uploader (CH340C)
WiFi ESP8266
1.2 Connection
Insert the ESP8266 module into the module configuration interface of the USB uploader, and find the corresponding COM port in the Windows device manager.
Part 2: Software Setup
2.1 Download Thonny
Download the latest version of Thonny, an out-of-the-box Python editor that natively supports MicroPython.
Download address:
2.2 Download the MicroPython firmware
The compiled ESP8266 firmware is provided on the MicroPython official website, because our WiFi module is 4MB, please select the latest firmware with the name of ESP8266 with 2MiB+ flash, and download the bin file.
Firmware download address:
2.3 Upload the MicroPython firmware to the ESP8266 module
There are two ways to upload the MicroPython firmware to the ESP8266 module:
Using the ESPtool download tool, you can more precisely control the partition and use of Flash.
Using Thonny's built-in tool.
For convenience, we use Thonny's built-in tool. The specific steps are as follows:
Open the Thonny, the main interface is as shown below. Thonny uses the Python interpreter in the installation directory by default.
Open Tools -> Options to enter the options page. In the first tab General, we can choose the language we need (needs to be restarted).
NyBoard V1_0
Overview
NyBoard V1 is an upgraded version considering the users' feedback on NyBoard V0. It's compatible with previous versions, yet has some new design to make it easier to use.
Setup WebREPL
Realize remote debugging and upload script
The previous tutorial realized the function of the robot to perform sequence actions by editing Python code offline. But this is very inconvenient. Whenever we need to modify the code, we need to unplug the WiFi module for modification, and we cannot flexibly pause and modify parameters during execution. The reason is that ESP8266 only has one serial port, and we need to use it to communicate with NyBoard. Fortunately, MicroPython uses the WiFi function provided by ESP to realize remote wireless Python debugging - WebREPL.
On the basis of official documents, combined with the characteristics of ESP8266, we wrote the following tutorials:
import network
import espnow
import time
sta = network.WLAN(network.STA_IF) # Enable station mode for ESP
sta.active(True)
sta.disconnect() # Disconnect from last connected WiFi SSID
e = espnow.ESPNow() # Enable ESP-NOW
e.active(True)
peer1 = b'\xe8\x68\xe7\x4e\xbb\x19' # MAC address of peer1's wifi interface
e.add_peer(peer1) # add peer1 (receiver1)
peer2 = b'\x60\x01\x94\x5a\x9c\xf0' # MAC address of peer2's wifi interface
e.add_peer(peer2) # add peer2 (receiver2)
print("Starting...") # Send to all peers
e.send(peer1, "walk", True) # send commands to pear 1
e.send(peer2, "walk", True) # send commands to pear 2
time.sleep_ms(2000)
e.send(peer1, "walk", True)
e.send(peer2, "back", True)
time.sleep_ms(2000)
import network
import espnow
from machine import UART
def espnow_rx():
#config UART
uart = UART(0, baudrate=115200)
# A WLAN interface must be active to send()/recv()
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect() # Disconnect from last connected WiFi SSID
e = espnow.ESPNow() # Enable ESP-NOW
e.active(True)
peer = b'\x5c\xcf\x7f\xf0\x06\xda' # MAC address of peer's wifi interface
e.add_peer(peer) # Sender's MAC registration
while True:
host, msg = e.recv()
if msg: # wait for message
if msg == b'walk': # decode message and translate
uart.write("kwkF") # to the NyBoard's command
elif msg == b'back':
uart.write('kbk')
elif msg == b'stop':
uart.write('d')
if __name__ == "__main__":
espnow_rx()
It continues to use an 8KB onboard I2C EEPROM to save constants for skills.
The power system is redesigned to provide a more stable supply. The structure for peripherals is also optimized.
From Jan 1st, 2021, We start to include an official Bluetooth dongle for wirelessly uploading and communication. The default baud rate for all the communication ports is set to be 115200.
The reset button is more accessible on the back of the board.
We added 4 Grove socket to plug-and-play Seeed Studio's extensible modules. We still provide standard 2.54mm through-holes besides the socket.
The socket for the battery is now anti-reverse.
Digital I/O; 0-5V
Name
Author
Feature
I2Cdev
jrowberg
built-in DMP
Adafruit MPU6050
Adafruit
standard MPU6050 library
Kalman Filter
TKJ Electronics
with Kalman filter
Voltagereal=1024ADCreading×5.0×2
Grove Socket
Pin Number
Function
G1
I2C: SCL, SDA
I2C with 3.3V logic signal
G2
A2, A3
Analog input; 0-5V
G3
PD8, PD9
Digital I/O; 0-5V
G4
PD6, PD7
Open the second tab Interpreter, we replace the default Python3 interpreter with MicroPython (ESP8266) and select the corresponding port.
At this time, the ESP8266 module has not yet uploaded the MicroPython firmware. Click "Install or update firmware" in the lower right corner of the above picture to update the firmware using the built-in tool.
Select the port (COMx) where the ESP8266 module is located, and select the location where the downloaded MicroPython firmware (.bin file) is located. Check the flash mode: from image file (keep) (the speed will be slower, but it only needs to be burned once and it is not easy to make mistakes), and check the option Erase flash before installing. Press the Install button.
The progress will be displayed in the lower-left corner of the interface, erase the Flash first, and then write the firmware. When the word Done appears, it means that the programming has been completed.
The software preparation work is over, and the following display will appear after closing the download interface. The red text is garbled because ESP8266 will print a string of codes with a baud rate other than 115200 when it starts up. This code cannot be recognized by MicroPython Shell. When Python’s iconic symbol >>> appears, it means that the firmware is uploaded successfully.
It still uses Atmel ATMega328P as the main chip but adopts 16MHz without accelerating it to 20MHz. Now the board is fully compatible with Arduino Uno, much easier for new users to Arduino.
It keeps driving 16 PWM channels with PCA9685. The pin order is altered, but you don't even need to read the indexes on the board, because the pin mapping is handled within the software.
Now the 6-axis motion sensor MPU6050 is designed on the PCB, rather than a stand-alone module soldered above the board. It supports a built-in DMP (Digital Motion Processor) to calculate the motion data, as well as providing raw data for your own fusion and filtering algorithms.
It continues to use an 8KB onboard I2C EEPROM to save constants for skills.
The power system is redesigned to provide a more stable supply. The structure for peripherals is also optimized.
From Jan 1st, 2021, We start to include an official Bluetooth dongle for wirelessly uploading and communication. The default baud rate for all the communication ports is set to be 115200.
The reset button is more accessible on the back of the board.
We added 4 Grove socket to plug-and-play Seeed Studio's extensible modules. We still provide standard 2.54mm through-holes besides the socket.
We added 7 WS2812 RGB LEDs on the board as another form of output and status indicator.
The socket for the battery is now anti-reverse.
Logic diagram of the controller
The configuration of NyBoard V1_0 is shown as below:
Introduction to the onboard components
Main controller
NyBoard V1_0 uses Atmel ATMega328P-MUR as the main controller. We adopted its smaller version of QFN32 for better layout, and it's near-identical to regular TQFP32.
ATMega328P works at 16MHz with a 5V supply. It has 2KB SRAM, 32KB Flash, and 1KB on-chip EEPROM. With the same bootloader of Arduino Uno, you can upload sketches through the serial port.
I2C switch
The main chip runs at 5V, while the other peripherals run at a 3.3V logic level. We use PCA9306 to convert the I2C bus of ATMega328P to 3.3V. We also added an I2C switch on the bus. By dialing it to "Arduino" or "Raspberry Pi", you can change the I2C master of the onboard peripherals.
6-Axis IMU MPU6050
MPU6050 is widely used in many DIY projects to acquire the motion state of devices. It detects the 3 acceleration and 3 angular motion states. It also includes a DMP to calculate the state directly, without using the main controller's computational resources.
On NyBoard V1_0, its I2C address is 0x68. The interrupt pin is connected to the PD2 port of ATMega328P (or the D2 pin of Arduino Uno).
There are a lot of available MPU6050 libraries and we are using I2CDev/6050DMP. You can also use other versions:
Name
Author
Feature
I2Cdev
jrowberg
built-in DMP
Adafruit MPU6050
Adafruit
standard MPU6050 library
Kalman Filter
TKJ Electronics
with Kalman filter
PCA9685 and the PWM servo ports
PCA9685 fans out 16 PWM 12-bit channels with instructions from the I2C port. Its address is set to 0x40. There are 16 PWM indexes printed on the PCB, but you don't really need to read them because the pin-mapping is done in the software. The physical wiring pattern is the same as the previous boards. You do need to check the direction of the servo pins. Regular servos have 3 pins for PWM, power(2S), and ground (GND). The ground should connect to the black wire of the servo.
On NyBoard V1_0, the servos' power connects to the 2S Li-ion battery. We designed our servos to be compatible with 8.4V input. Regular servos usually run at 6V. You should not connect regular 9g servos like the SG90 to the board directly.
We use Adafruit PWM Servo Driver Library for PCA9685.
EEPROM
We save the motion skills with an 8KB onboard I2C EEPROM AT24C64. Its I2C address is 0x54. The lookup table of skills is saved in the 1KB on-chip EEPROM of ATMega328P. It uses <EEPROM.h>. You need to pay attention to their differences when developing new codes.
Passive buzzer
The buzzer is driven by PD5 (or the D5 of Arduino UNO). The current is amplified by 2N7002 MOS.
Infrared receiver
We use VS1838B as the Infrared receiver, connected to PD4 (or D4 on Arduino Uno). It's driven by the IRremote library of Arduino, the corresponding remote is encoded in NEC format. You may disable the other protocols in IRremote.h to save Flash (about 10%!)
Voltage detector
The two LEDs in the Petoi logo indicates the powering state of the board. The left eye is blue for the logic chips. The right eye is yellow for the servos' power. When NyBoard is connected to the battery, both LEDs should lit up. When NyBoard is powered by the USB downloader, only the blue LED will lit up.
There's an anti-reverse socket for the battery. The battery's output is connected to ADC7 (or A7 of Arduino Uno) and is not threaded to an open pin. ADC7 collects the voltage over a voltage divider. The actual voltage is approximately 2x of the reading. A safe range of battery voltage is below 10V.
You should charge the battery in time when the battery is lower than 7.4V.
WS2812 RGB LED
We added 7 WS2812 RGB LEDs (or the NeoPixel) on the NyBoard. The pin number is D10. They are powered by the 5V DC-DC power chip for Raspberry Pi and are independent of the 5V network of ATMega328P. So you need to plug in the battery to power the LEDs.
Grove sockets
We adopted the Grove sockets for convenient plug-and-play connections. There are three types of socket:
Grove Socket
Pin Number
Function
G1
I2C: SCL, SDA
I2C with 3.3V logic signal
G2
A2, A3
Analog input; 0-5V
G3
PD8, PD9
Digital I/O; 0-5V
G4
Power system
The main chips are powered by a Low-dropout (LDO) linear regulators for noise removal and better stability. We use LM1117-5V and XC6206P-3.3V to power 5V and 3.3V chips. The 3.3V LDO is connected in serial after the 5V LDO for better efficiency.
There's a diode between the battery and LM1117-5V to prevent damage by the wrong connection. There's a self-recover fuse (6V 500mA) on the USB uploader to limit the current and protect the USB port.
The Raspberry Pi consumes much more power, so we choose TPS565201 DC-DC to provide a 5V 3A output. The peak output can be 5A and with high-temperature/current/voltage protection. It will cut off the power when the chip keeps outputting >4A and over 100 Celcius degrees until the temperature drops to normal. The WS2812 RGB LEDs are also powered by this DC-DC source.
The servos are powered by 2S Li-ion batteries directly. Pay attention not to short connect the power or any pins on the NyBoard.
Last updated: Jan 13, 2021
Top side
Bottom side
Voltagereal=1024ADCreading×5.0×2
1. Enable webREPL
After connecting the device, enter import webrepl_setup in the shell interface, and input according to the prompt information:
Enable it running on boot: E
Set password for it: your own password(e.g. 1234)
Repeat the password to confirm
Reboot the ESP8266: y
2. The script to setup webREPL
We use the demo script below, to replace the SSID and password with the network information your own around you.
After running the script, it will keep trying to connect to the WiFi network. Once connected, it will automatically start the WebREPL service of the device.
Remember this IP address (automatically assigned by router DHCP), useful when configuring WebREPL.
3. Configure the WebREPL service
We are now debugging the Python script through WebREPL, and the previous serial port is used to communicate with NyBoard. So in the options, change the previous USB-COMx interface to WebREPL.
Then we fill in the IP address, port and password of WebREPL, and click OK.
When WebREPL Connected is displayed, the connection is successful.
We can try some simple scripts, such asblink.py.
WebREPL saves serial ports and supports wireless debugging. The disadvantage is that the speed is slow (because of network delay), and the waiting time for software reset is relatively long.
4. Separate the serial port from the debugger
Now we can use webREPL to debug the script, but when we open the serial port monitor, we will find that whenever we run the script, the serial port will send out a series of debugging content: These massive strings will cause the NyBoard to be too late to process and crash. As shown below:
We hope that when debugging the program, the serial port only outputs the commands we want to output, not the Debug information. Open the boot.py on the device, uncomment the line of code uos.dupterm(None, 1) and save it , and unbind the serial port and REPL debug. Restart the module, and the serial port debugging assistant will no longer print the debug information.
As a supplement, we can output debug information through the print() statement, which will be displayed in the Shell through WiFi.
So far, you can easily use the ESP8266 to debug robot through webREPL to edit action sequences based on MicroPython.
How to use python scripts to have fun with the robots
Preparation
Install python (version≥ 3.6, such as Anaconda3-5.2.0-Windows-x86_64.exe)
Calibrate the joints with Arduino IDE
Prepare to Enter the Calibration State
Please refer to the in the Joint Calibrator of the Petoi Desktop App according to the robot's mainboard.
import network
import time
import webrepl
def do_connect():
# WiFi SSID and Password
wifi_ssid = "YOUR SSID" # YOUR WiFi SSID
wifi_password = "YOUR PASSWORD" # YOUR WiFi PASSWORD
# Wireless config : Station mode
station = network.WLAN(network.STA_IF)
station.active(True)
# Continually try to connect to WiFi access point
while not station.isconnected():
# Try to connect to WiFi access point
print("Connecting...")
station.connect(wifi_ssid, wifi_password)
time.sleep(10)
# Display connection details
print("Connected!")
print("My IP Address:", station.ifconfig()[0])
if __name__ == "__main__":
do_connect()
webrepl.start()
Connected!
My IP Address: 192.168.xxx.xxx
WebREPL daemon started on ws://192.168.xxx.xxx:8266
Started webrepl in normal mode
Install pyserial library (version 3.5)
Connect the serial port
When using a USB adapter to connect to the NyBoard or USB type-C data cable to connect to the BiBoard, there should be only one serial port number:
USB serial port number
When using the Bluetooth function, there can be two serial port numbers:
Please utilize GitHub’s version control feature. Otherwise, make sure you download the WHOLE OpenCat FOLDER every time.
Open a Terminal (such as Anaconda Prompt) and enter the path where the Python API is located (***/OpenCatPythonAPI). Then, run the two example scripts in the folder(petoiRobotExample.py and ardSerialExample.py). The script will automatically identify the serial port number at the beginning and complete the connection.
ardSerial.py contains the core communication functions. robot.py is a wrapper module that provides more user-friendly functions. Our Mind+ coding blocks is a graphical UI for this library.
Run the scripts
Run the ardSerialExample.py
ardSerialExample.py demonstrates how to call the functions defined in ardSerial.py(in the ***/OpenCatPythonAPI/PetoiRobot)
The list testSchedule in ardSerialExample.py is used to test various serial port commands. Run the following script code to see the execution effect of each serial port command in the list:
You can also refer to the content of the testSchedule list (in ***/serialMaster/demos/hlw.py), write a list of behaviors according to your actual needs, and realize your creativity. 🤩 It was used in a Halloween puppet show.
Note: When running the scripts under the path of /serialMaster/demos,you must first use the "cd demos" command to enter the path where the scripts are located (/serialMaster/demos) and then use the python3 command to run the script (e.g., "python3 hlw.py")
Explanation of the serial port commands in the list testSchedule:
['kup', 2]
'kup' indicates the command to control Bittle to stand normally
2 indicates the postponed time after finishing the command in seconds.
m indicates the command to control the rotation of the joint servo
0 indicates the index number of joint servo
-20 indicates the rotation angle (this value is expressed relative to the reference 0 value used after calibration). The unit is in degrees.
1.5 indicates the postponed time after finishing the command in seconds. It can be a float number.
['m', [0, 45, 0, -45, 0, 45, 0, -45], 2]
['M', [0, 45, 0, -45, 0, 45, 0, -45], 2]
The meaning of this example is the same as the previous command.
Using the 'm' control command, the index number of joint servo and rotation angle values are stored as ASCII strings.
Using the 'M' control command, the index number of joint servo and rotation angle values is stored as a byte string, a byte sequence (binary form).
['d', 2]
d indicates the command to put the robot down and shut down the servos
2 indicates the postponed time after finishing the command in seconds
['c', 2]
c indicates the command to enter calibration mode
2 indicates the postponed time after finishing the command in seconds. After these motion commands are completed, the next command will be executed after a 2-second delay.
['c', [0, -9], 2]
c indicates the command to enter calibration mode
0 indicates the index number of joint servo
-9 indicates the rotation angle. The unit is in degrees.
2 indicates the postponed time after finishing the command in seconds
Using this format, you can enter the calibration mode to calibrate the angle of a specific joint servo. Note: If you want the correction value in this command to take effect, you need to enter the "s" command after executing this command.
The meaning of this example is that the joint servo with serial number 0 rotates -9 degrees. After these motion commands are completed, the next command will be executed after a 2-second delay.
['m', [0, -20], 1.5]
m indicates the command to control the rotation of the joint servo
0 indicates the index number of joint servo
-20 indicates the rotation angle (this angle refers to the origin rather than the additive). The unit is in degrees.
1.5 indicates the postponed time after finishing the command in seconds. It can be a float number.
['m', [0, 45, 0, -45, 0, 45, 0, -45], 2]
Using this format, multiple joint servo rotation commands can be issued in a list. These commands are executed sequentially, not simultaneously. The joint angles are treated as ASCII characters so humans can enter them directly.
This example means that the joint servo with index number 0 is first rotated to the 45-degree position, then to the -45-degree position, and so on. After these motion commands are completed, the following command will be executed after a 2-second delay.
['i', [ 8, -15, 9, -20], 2]
Using this format, multiple joint servo rotation commands can be issued in a list and executed AT THE SAME TIME. The joint angles are treated as ASCII characters so humans can enter them directly.
The meaning of this example is that the joint servos with index numbers 8 and 9 are rotated to the -15 and -20 degree positions simultaneously. After these motion commands are completed, the following command will be executed after a 2-second delay.
['M', [8, 50, 9, 50, 10, 50, 11, 50, 0, 0], 3]
M indicates the command to rotate multiple joint servos SEQUENTIALLY. The angles are encoded as BINARY numbers for efficiency.
8, 9, 10, 11, and 0 indicate the index numbers of joint servos
50, 50, 50, 50, 0 indicate the rotation angle (this angle refers to the origin rather than additive ). The unit is in degrees
3 indicates the postponed time after finishing the command in seconds
['I', [8, 50, 9, 50, 10, 50, 11, 50, 0, 0], 3]
The meaning of this example is the same as the previous command.
Using the 'i' control command, the index number of the joint servo and rotation angle values are stored as ASCII strings.
Using the 'I' (the uppercase of the letter 'i')control command, the index number of the joint servo and rotation angle values are stored as a byte string.
'I' indicates the command to control all joint servos to rotate AT THE SAME TIME (currently, the command supports 16 degrees of freedom, that is, 16 servos). The angles are encoded as BINARY numbers for efficiency.
20,0,0,0,0,0,0,0,45,45,45,45,36,36,36,36 indicate the rotation angle of each joint servo corresponding to 0-15 (this angle refers to the origin, rather than additive). The unit is in degrees.
5 indicates the postponed time after finishing the command. The unit is in seconds.
Here, 'l' is the lowercase form of the letter 'L'.
['b', [10,2], 2]
b indicates the command to control the buzzer to beep
10 indicates the music tone
2 indicates the lengths of duration, corresponding to 1/duration second
2 indicates the postponed time after completing the tone. The unit is in seconds
'K' indicates the skill data to send to Bittle in real-time
The skill array is sent to the robot on the go and executed locally on the robot
You may insert the skills in the skill library or InstinctX.h in this format
For the description of other serial port commands, please refer to Serial Commands.
Run the petoiRobotExample.py
petoiRobotExample.py demonstrates how to call the functions defined in robot.py(in the ***/OpenCatPythonAPI/PetoiRobot)
Available APIs
Below are the supported function calls in the library (robot.py):
Here is a sample code in the petoiRobotExample.py:
When the system recognizes that there are multiple serial port numbers, the script will automatically identify all serial port numbers that have been connected to the robot (you can send serial commands to multiple robots at the same time). When the script starts running, it will print out the following prompt information:
Please help the robots find their sparks. Wish you have fun! 😍
Calibration process
1. Enter the calibration state
You must plug the servos and external batteries into the mainboard and check the position and direction of all servos.
Send the serial command ‘c’ in the serial monitor to enter the calibration state. Depending on their initial shaft direction, some may travel larger angles until stopping at the middle point. There will be noise coming from the gear system of the servos. You will see a calibration table like the following:
The first row is the joint indexes; the second row is their calibration offsets:
Index
0
1
2
3
4
5
6
7
8
9
10
11
12
13
Initial values are “-1” or “0” and should be changed by later calibration.
The servos use a potentiometer in the feedback loop for position control. When held at a static position, they tend to vibrate around the target angle. A Parkinson's-like vibration will develop after a short period of use. It won’t affect much during continuous motion. Better servos without these troubles could cost 10 times more, so replacing a failed unit is a more cost-effective solution.
2. The rationale for calibration
2.1 Understand the zero state and the coordinate system
After typing ‘c’ in the serial monitor, with all servos rotated to their zero angles, attach the head, tail, and legs prepared in the previous section to the body. They are generally perpendicular to their linked body frames. The calibration pose is shown below:
Nybble's Calibration State
Bittle's Calibration State
If you are building the robot from a kit, install the servo-related components according to the picture above and try to ensure that they are perpendicular to each other (the upper leg is perpendicular to the torso, and the lower leg is perpendicular to the upper leg). Please refer to the related chapter in the user manual for the details:
Nybble
Note: Insert the servo-related components directly into the servo output shaft; do not turn the output shaft during this process.
Rotating the limbs counter-clockwise from their zero states will be positive (same as in polar coordinates). Viewed from the left side of the robot's body, the counter-clockwise rotation of the joint is defined as the positive direction.
The only exception is the tilt angle for the head of Nybble. It’s more natural to say head up, while it’s the result of rotating clockwise.
However, from the right side of the robot's body, the rotation direction's positive and negative are just opposite.
2.2 Discrete angular intervals
If we look closer at the servo shaft, we can see it has a certain number of teeth. That’s for attaching the servo arms and avoiding sliding in the rotational direction. In our servo sample, the gears divide 360 degrees into 25 sectors, each taking 14.4 degrees(offset of -7.2~7.2 degrees). That means we cannot always get a perfect perpendicular installation.
2.3 Attach body parts to the servos
Install the head
In the calibration state, place the head as close to the central axis as possible and insert its servo shaft into the servo arm of the neck.
Press down on the head so it is firmly attached to the neck.
Install the legs
Install upper leg and lower leg components to the output teeth of the servos after the Bittle is powered on and in the calibrated neutral position. Please keep the torso, upper leg, and lower leg installed vertically as much as possible, and do not install the lower leg backward, as shown in the picture.
3. Fine-tune the calibration using the serial monitor
3.1 Joint Control Commands
The command for fine-tuning calibration (refer to the serial protocol) is formatted as cIndex Offset. Notice that there’s a space between cIndex and Offset. The index number of the robot's joints is shown in the pictures below:
Nybble
Bittle
For example :
c8 6 This means giving the 8th servo an offset of 6 degrees.
c0 -4 This means giving the 0th servo(the head) an offset of -4 degrees.
The resolution of the correction amount is 1 degree; do not use decimals.
If you find the absolute value of offset is more significant than 9, you are not attaching the limb closest to its zero states. That will decrease the servo's reachable range on either side. Please take off the limb and rotate it by one tooth. It will result in an opposite but smaller offset.
For example, if you have to use -9 as the calibration value, remove the limb, rotate it by one tooth, and then attach it back. The new calibration value should be around 5, i.e., the sum of their absolute values is 14. Avoid rotating the servo shaft during this adjustment.
Find the best offset that can bring the limb to the zero states. It's a process of trial and error.
For the robotic arm, you can use the serial command "c-2" to auto-calibrate the robotic claw joint.
After calibration, remember to type ‘s’ to save the offsets. Otherwise, they will be forgotten when exiting the calibration state. You can even save every time after you’re done with one servo.
3.2 Use ‘L’ shaped joint tuner
When watching something, one's observations will change from different perspectives. When measuring length, one always wants to read directly above a referencing ruler.
You must keep a parallel perspective when calibrating Bittle. Use the 'L'-shaped joint tuner as a parallel reference to avoid reading errors. Align the tips on the tuner with the center of the screws in the shoulder and knee joints and the little hole on the tip of the foot. Look along the co-axis of the centers. For each leg, calibrate the shoulder servos (index 8~11) first, then the knee servos(index 12~15). When calibrating the knee, use the matching triangle windows on both the tuner and shank to ensure parallel alignment.
Nybble
Bittle
Align the upper leg first
Pay attention to the reference edges for the lower leg
3.3 Testing and validation
After calibration, type ‘d’ or ‘kup’ to validate the calibration. This will result in Bittle / Nybble symmetrically moving its limbs between the rest and stand states.
You may need to do a few rounds of calibrations to achieve optimal states.
Take Bittle, for example, as follows:
3.4 Install the screws
After completing the joint calibration, install the center screws to fix the leg parts and servo gears.
3.5 Center of mass
Try to understand how the robot keeps balance even during walking. If you add new components to the robot, distribute its weight symmetrically about the spine. You may also need to slide the battery holder back and forth to find the best balance spot. Because the battery is heavier in the front, you can insert it in a reversed direction to shift the center of mass more toward the back.
You may need to recalibrate if there's a change to the center of mass.
Please do not force the robot to add heavy objects, which may cause the servos to sweep or get stuck.
OpenCat software works on both Nybble and Bittle, controlled by NyBoard based on ATmega328P. More detailed documentation can be found at the or .
***\OpenCatPythonAPI>python3 ardSerialExample.py
for task in testSchedule:
wrapper(task)
***\OpenCatPythonAPI>python3 petoiRobotExample.py
# use to print debug information
def printH(head, value)
# deactivate the Gyro
def deacGyro()
# get the current angle list of all joints
def getAngleList()
return angleList
# get the current angle value of a joint
def getCurAng(index)
# creat an absolut value list
def absValList(num1, num2)
# rotate angle from relative value to absolute value
# creat an offset value list
def relativeValList(index, symbol, angle)
# rotate the joints sequentially or simultaneously
def rotateJoints(token, var, delayTime)
# play tones
def play(token, var, delayTime)
# encode the character to bytes
def encode(in_str, encoding='utf-8')
def printSkillFileName()
# open the serial port
def openPort(port)
# auto connect serial ports
def autoConnect()
# send a short skill string
def sendSkillStr(skillStr, delayTime)
def loadSkill(fileName, delayTime):
# send a command string
def sendCmdStr(cmdStr, delayTime)
def sendLongCmd(token, var, delayTime)
# get the analog value of a pin
def readAnalogValue(pin)
# get the digital value of a pin
def readDigitalValue(pin)
# set the analog value of a pin
def writeAnalogValue(pin, val)
# set the digital value of a pin
def writeDigitalValue(pin, val)
# close the serial port
def closePort()
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from PetoiRobot import *
autoConnect()
# The list format is [joint index, angle, joint index, angle...]
sendSkillStr('ksit',3)
sendSkillStr('kup',3)
rotateJoints('M', absValList(0, 60), 1)
# The list format is [note, duration, note, duration...]
play('B', [14,4,14,4,21,4,21,4,23,4,23,4,21,2], 1)
closePort()
2024-11-15 15:14:51,357 PetoiRobot.ardSerial - INFO - ardSerial date: Jun. 20, 2024
Mind+ date: Oct 18, 2023
C:\Users\***\.config\Petoi already exists
C:\Users\***\.config\Petoi\SkillLibrary\Bittle already exists
C:\Users\***\.config\Petoi\SkillLibrary\Nybble already exists
C:\Users\***\.config\Petoi\SkillLibrary\BittleR already exists
*** Available serial ports: ***
COM3
Bittle X
B02_241105
2024-11-15 15:14:54,634 PetoiRobot.ardSerial - INFO - Connect to the serial port list:
2024-11-15 15:14:54,635 PetoiRobot.ardSerial - INFO - COM3
modelName: Bittle
*** The skill names you can call are as follows: ***
* skillFileName
******************************
2024-11-15 15:15:05,134 PetoiRobot.ardSerial - INFO - close the serial port.
The I2C switch changes the master of I2C devices (gyro/accelerometer, servo driver, external EEPROM). On default “Arduino”, NyBoard uses the onboard ATmega328P as the master chip; On “RPi”, NyBoard uses external chips connected through the I2C ports (SDA, SCL) as the master chip.
Notes:
Sometimes if you cannot go through the bootup stage, such as repetitively printing "IMU" and restarting, maybe you have accidentally dialed the switch to the "RPi" side.
Before uploading the firmware, please make sure not to connect any I2C device to the I2C interface of the mainboard, otherwise, the firmware upload will fail. The location of the I2C interface is as shown below (in the red box):
Quick Start Tutorial Video
The setup process for Nybble is almost the same, except that you need to change the model definition to #define NYBBLE. Make sure you read through the following detailed steps.
Downloads and installations of Arduino IDE
You will need the newest Arduino IDE to set up the environment. Older versions tend to compile larger hex files that may exceed the memory limit.
With NyBoard V1_*, you can simply choose Arduino Uno.
Only if the bootloader of NyBoard collapsed, which is very unlikely to happen
Burn the bootloader (no need for normal use)
●
Every NyBoard has to go through functionality checks before shipping, so they should already have a compatible bootloader installed. However, in rare cases, the bootloader may collapse then you won't be able to upload sketches through Arduino IDE.
Well, it's not always the bootloader if you cannot upload your sketch:
Sometimes your USB board will detect a large current draw from a device and deactivate the whole USB service. You will need to restart your USB service, or even reboot your computers;
You need to install the driver for the FTDI USB 2.0 to the UART uploader;
You haven't selected the correct port;
If you really decide to re-burn the bootloader:
please refer to the chapter
Connect the uploader (sometimes referred to as the programmer)
This step does not require the NyBoard to be mounted on the robot.
For specific steps, please refer to the Connect NyBoard section in the Dual-Mode Bluetooth Module.
On Mac, the Bluetooth may lose connection after several uploads. In that case, delete the connection and reconnect to resume the functionality.
The Bluetooth dongle is not included in the kit sold by Seeed Studio or its partners. Please write to [email protected] for more information.
Download the OpenCat package
We keep updating the codes as an open-source project. You can star and follow our GitHub repository to get the newest features and bug fixes. You can also share your codes with worldwide OpenCat users.
Download a fresh OpenCat repository from GitHub: https://github.com/PetoiCamp/OpenCat. It’s better if you utilize GitHub’s version control feature. Otherwise, make sure you download the WHOLE OpenCat FOLDER every time. All the codes have to be the same version to work together.
If you download the Zip file of the codes, you will get an OpenCat-main folder after unzipping. Rename it to OpenCat before opening the OpenCat.ino, so that the two names match.
Arduino requires the .ino file to be put in a folder with the same name. You must rename the OpenCat-main folder as OpenCat (i.e. delete the -main suffix). Otherwise, Arduino will create another OpenCat folder and move OpenCat.ino into it. It will break the path dependency of related files.
No matter where you save the folder, the file structure should be:
There are several testX.ino codes in ModuleTests folder. You can upload them to test certain modules separately. Open any testX.ino sketch with prefix “test”. (I recommend using testBuzzer.ino as your first test sketch)
Open up the serial monitor and set up the baud rate. With NyBoard V1_*, choose the board as Arduino Uno and later set the baud rate to 115200 in both the code and the serial monitor.
Compile the code. There should be no error messages. Upload the sketch to your board and you should see Tx and Rx LEDs blink rapidly. Once they stop blinking, messages should appear on the serial monitor.
Upload
To configure the board, please follow these steps:
1. Configure the robot type and board version
Open the file OpenCat.ino and select your robot and board version. For example:
The symbol // deactivates the line of code and turns them into comments. Make sure you have only one line of the parallel options activated.
2. Setup the configuration mode
Comment out #define MAIN_SKETCH so that it will turn the code to the board configuration mode. Upload and follow the serial prompts to proceed.
If you activate #define AUTO_INIT, the program will automatically set up without prompts. It will not reset joint offsets but calibrate the IMU. It's just a convenient option for our production line.
3. Plug the USB uploader into your computer
Install the driver if no USB port is found under Arduino -> Tools -> Port.
You can find the button either under Tools, or at the top-right corner of the IDE.
Set the serial monitor as No line ending and 115200 baud rate.
7. Reset joint offsets
The serial prompts:
Input ‘Y’ and hit enter if you want to reset all the joint offsets to 0.
The program will do the reset and then update the constants and instinctive skills in the static memory.
To pass this step, you must enter ‘Y’ or ‘n’. Otherwise, the following parameters, including the skill data, will not be updated on the board.
8. IMU (Inertial Measurement Unit) calibration
The serial prompts:
Input ‘Y’ and hit enter, if you have never calibrated the IMU or want to redo calibration.
Put the robot flat on the table and don't touch it. The robot will long beep six times to give you enough time. Then it will read hundreds of sensor data and save the offsets. It will beep when the calibration finishes.
When the serial monitor prints "Ready!", you can close the serial monitor to do the next step.
If you don't want to calibrate PCA9685(the servo driver), Step 9 can be skipped. The do Step 10 Upload the major functionalities sketch, and calibrate the joint servos if you have never calibrated the joints.
9. Calibrate the servo controller chip PCA9685 on the NyBoard
After the IMU calibration, there's an optional step to calibrate the servo driver.
If later you find one of the servos stops working but can resume working after re-powering it, it's probably due to an inaccurate PWM driver signal. You must redo the previous uploading, and this step CANNOT be skipped.
This calibration makes the servo controller (PCA9685 chip)'s angle signal more precise. Use a short jumper wire to connect the PWM pin 3 (the signal pin of one of the servo pins) and Grove pin A3 and hold the wire steady. It doesn’t have to be a dedicated jumper wire. Any thin metal wire, such as a straightened paper clip, can work as long as it can connect the pins.
The program will measure the pulse width of the signal and automatically calibrate the chip after getting three identical readings successively. It usually takes less than 2 seconds. The board will beep three times to indicate the calibration is done. The calibration offset will be saved to the board for the next time of bootup. The process should be done at least once, and we have calibrated every board after October 2022. But you can still do it by yourself, just in case.
The servo has a backdoor signal to modify its parameters defined by the manufacturer. The PWM signal is 2700us with a tolerance window (2650 to 2750 us). The PCA9685's internal crystal has a frequency between 23MHz and 27MHz. The standard Adafruit servo library just set it to 25MHz if not calibrated. The regular servo PWM signal ranges between 500 and 2500 us. The error (27-25)/25 = 8% usually can be tolerated by the system. But when the joint signal falls in the range of 2700us, the servo will enter the configuration mode. Only powering off will break it out of the loop.
The optional step can be a quick fix. It utilizes the input pin of the main chip, which has an accurate external crystal clock, to measure the signal from PCA9685. It compares the measured pulse width and expected value, calculates a calibrating factor, and stores it in the chip. The process can be less than 1 second or several seconds. As long as it's done once, you don't need to do it again unless the temperature changes a lot. Calibrating the signal can also make the movements more precise if you are a professional who needs to conduct motion-related research.
The calibration can be applied to all the PCA9685-based servo drivers that omit an external crystal. To recalibrate, just run the program's first round again and connect the two pins after the IMU calibration. The calibration value can be seen in Arduino's serial monitor and should be pretty consistent.
10. Upload the major functionalities sketch
Uncomment #define MAIN_SKETCH to make it active. This time the code becomes the normal program for the major functionalities. Then upload the code.
Open the serial monitor. When the serial monitor prints "Ready!", the robot is ready to take your next instructions.
The default code runs the standard mode. If you have some extensible modules, you may uncomment the macro definition of a specific module. It will disable the Gyro code to save some programming space and activate the demo of the module.
The behavior of the official modules is defined in separate header files in OpenCat/src/. You can find them in OpenCat/src/io.h-> readSignal(). The behavior of OTHER_MODULES is defined in OpenCat/OpenCat.ino -> otherModule(). You can study the example code to write your own functions.
12. Modify the "joint - pin" mapping
In certain cases, you may want to modify the "joint - pin" mapping of the robot. You can modify it in OpenCat/src/OpenCat.h. Make sure you are modifying the code block corresponding to the board version at the beginning of OpenCat.ino. After the modification, remember to save the changes and redo the uploading process from step 2.
Memory arrangement
Congratulations! Now, you have finished the standard setup steps. You may read the source codes if you want to dive deeper into the program. The skills are saved in multiple places on a NyBoard due to ATmega328P's limited resources. The following diagram may give you some hints to help you understand.
There are different storage on 328P (OpenCat):
The SRAM is only 2K. It's used for the whole program, so storing all the skill data is impossible. Only one skill is loaded to the SRAM before execution for easier and faster calculations.
The skill data are stored in the PROGMEM in the first upload round. During the program’s runtime, they will be stored in the external I2C chip, and their addresses will be stored in the onboard EEPROM.
In the second round of uploading, the skill data in PROGMEM are not enabled, so I have more memory to write the main program's logic and UI.
To accelerate tuning the skills, I allow a few skills to be stored in the PROGMEM, even in the main program. They are called the . So I don’t need to upload it twice to tune its skill data.
Now, I have a better serial protocol that can take a long skill data array in real time, so I don't need to re-upload to tune a skill. The token is 'K'.
The onboard EEPROM is only 1K. It stores the skill name string and addresses in PROGMEM or I2C EEPROM. It even stores the melodies from its tail.
On ESP32, the Flash is large enough, so I don’t need to save the skill data to I2C EEPROM. However, transferring one active skill to the SRAM is still necessary to avoid keeping all the skill arrays in the SRAM.
#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
// #define MAIN_SKETCH
Reset joint offsets? (Y/n):
Calibrate the IMU? (Y/n):
Optional: Connect PWM 3 -> Grove pin A3 to calibrate PCA9685
Arduino IDE 2.*.* cannot add the large_spiffs_16MB (4.5MB APP with OTA/6.93MB SPIFFS) configuration option currently.
The in Arduino IDE 1.8.* is written in Java. And Arduino IDE 2.0 is written in a different language (TypeScript + Golang), so the previous upload plugin cannot be used in Arduino IDE 2.*.* There is no support for the Arduino IDE 2.0 SPIFFS file upload plugin currently.
Open Preferences in Arduino, add the ESP32 development board URL:
Open Boards Manager... and wait for updates from external board support links. Search “esp32” and install the support package.
Please install version 2.0.12. Installing version 2.0.13 and above may cause the mainboard to fail to start up.
After showing INSTALLED, the BiBoard board support package is finished.
2.2 Modify the code file in the package
sdkconfig.h
For Windows:
C:\Users\{username}\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.*\tools\sdk\esp32\qio_qspi\include\sdkconfig.h
For Mac:
/Users/{username}/Library/Arduino15/packages/esp32/hardware/esp32/2.0.*/tools/sdk/esp32/qio_qspi/include/sdkconfig.h
Append a line of code at the end of the file:
2.3 Setup the options
Please review the option list to configure the board's (ESP32 Dev Module) upload speed, CPU frequency, and other settings.
There is a setting for the Flash Size and Partition Scheme among the options. For more information, refer to the next section.
2.4 Choose hardware partition
The BiBoard V0 uses an ESP32 with a 16M flash. To simplify, you can use the Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) partition map without a problem. There's plenty of programming space for the standard OpenCatEsp32 firmware.
The BiBoard V1 uses an ESP32 with a 4M flash.
4 MB partition
You can use the Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS).
16 MB partition
Suppose you want to fully utilize the 16 MB flash of BiBoard V0 (it's unnecessary and takes a longer uploading time). You can read the user manual for the .
2.5 Download the source code & install the library
We keep updating the codes as an open-source project. You can star-mark and follow our GitHub repository to get the newest features and bug fixes. You can also share your codes with worldwide OpenCatEsp32 users.
Download the OpenCatEsp32-Quadruped-Robot source code
The GitHub repository is :
We suggest you utilize GitHub’s version control feature. Otherwise, make sure you download the WHOLE OpenCatEsp32 FOLDER every time. All the codes have to be the same version to work together.
If you download the Zip file of the codes, you will get an OpenCatEsp32-main folder after unzipping. Please rename it to OpenCatEsp32 before opening the OpenCatEsp32.ino so that the two names match.
No matter where you save the folder, the file structure should be:
There are several test***.ino codes in the ModuleTests folder. You can upload them separately to test specific modules (I recommend using testBuzzer.ino as your first test sketch).
Install the libraries
Download and install the into the Arduino IDE.
Install ArduinoJson in the Library Manager.
2.6 via USB type-C data cable
Set the serial port in the Arduino IDE:
If you cannot find the serial port after connecting to your computer:
for BiBoard V0:
You need to install for the CP210x chip.
2.7 Compile and upload the sketch
Modify the device type macro definition in OpenCatEsp32.ino according to the device type.
Modify the motherboard model macro definition in OpenCatEsp32.ino according to the .
if the robot(Bittle X+Arm) with the robotic arm, you should also activate the macro definition as follows:
Otherwise, please comment out this line code.
After the modification is completed, you can click the Upload button (as below) to upload the sketch OpenCatEsp32.ino, and the changes in the code file will be automatically saved.
2.8 Program Initialization
If the version date of the currently uploaded sketch is newer than the version date of the mainboard firmware, it will automatically enter the initialization startup mode after the sketch upload is completed.
Please open the serial monitor and set the configuration parameters of the serial port monitor to 115200 baud rate and No line ending.
You can check the version date of the currently uploaded sketch in the source code file (OpenCatEsp32/src/OpenCat.h):
#define DATE "250218" // YYMMDD
You can send the serial command "?" in the serial monitor to check the version date of the mainboard firmware:
When the mainboard is powered on, open the serial monitor and you will see the startup information:
If you do not see the startup information after opening the serial monitor, please short press the Reset button on the mainboard.
Next you will see the following prompt questions:
Send 'Y' to the question, which means resetting all servo corrections to zero.
Send "n" to skip this step.
If you want to keep the previous joint calibration data, please send 'n'.
Send 'Y' to the question, which means calibrating the IMU, i.e. the gyro/accelerometer sensor.
Send "n" to skip this step.
If you want to keep the previous IMU calibration data, please send 'n'.
Halts at the connection stage. To restart it, you can close and reopen the serial monitor or press the reset button on BiBoard. Put the BiBoard FLAT on the table, and don't touch it during calibration.
Sometimes, the program halts at the connection stage. To restart it, you can close and reopen the serial monitor or press the reset button on BiBoard.
The program starts calibration after playing the melody 6 times.
Input 'n' and press Enter to continue. Or you can do nothing, it will Auto skip in 5 seconds.
The details of serial port printing information are as follows:
When the string "Ready!" is output in the serial monitor, the program will enter the regular startup mode.
Every time the mainboard is powered on, it compares the BIRTHMARK in the EEPROM to determine whether the program has been initialized. If the program has already been initialized, it will not enter the initialization startup mode again.
Note: When the mainboard is powered on, the music melodies played in the regular startup mode and the initialization startup mode are completely different. This is convenient for users (no need to open the serial monitor) and can also identify the startup mode.
If you need to clear the calibration parameters of the servo and recalibrate the joint servo, or recalibrate the IMU, you can send the serial command "!" in the serial monitor, and the program will re-enter the initialization startup mode.
2.9 Swith working mode via the serial commands (Optional)
The default code runs the Standard mode (including the Voice command function). If you want to switch modes, Please open the serial monitor and send the following serial commands:
Serial command
Function
The behavior of the official modules is defined in separate header files in OpenCat/src/. You can find them in OpenCat/src/io.h-> readSignal(). The behavior of Quick demo mode is defined in OpenCat/OpenCat.ino -> quickDemo(). You can study the example code to write your functions.
You can learn about the function of each module through the .
2.10 Power on
Long-press the battery button and boot up the robot with one side up. It will enter the calibration state automatically in the regular startup mode. The picture below shows the head, the upper and lower legs installed after the robot enters the calibration state.
Please refer to and for the complete calibration process.
If you power on the robot and it is upright (with its back upward), the robot will start from the "rest" posture (fold the legs and unlock the servos) in the regular startup mode.
3. Configuration with App
The BiBoard has built-in Bluetooth, and you can connect it with the to do and .
You can check the update history information in the.
Petoi Web Coding Blocks
1. Upgrade the firmware
You can upgrade the firmware for BiBoard, which supports web block-based programming via the latest version (≥ 1.2.6 beta) of the Petoi Desktop App.
2. Open the Petoi Web Coding Block
Download the source code from the GitHub repository ().
Open OpenCatEsp32 > PetoiWebBlock > programblockly.html to start programming with Petoi Web Coding Block on web.
Note:
You'd better open programblockly.html using:
3. The principle and process
The Petoi Web Coding Block allows you to control the robot via WiFi without compiling and uploading code to its main board. Simply click the "Run Code" button to execute the program at the graphical block level, sending instructions wirelessly to the robot through your local network. The process involves three key steps:
Open the serial port
Control the robot
Close the serial port
When you plug in the USB data cable on the computer side of the Chromebook, if a USB device detected message window pops up in the bottom-right corner of the screen, as shown in the figure below, please DO NOT click the Connect to Linux button in the window.
If you accidentally click this button, Chrome will not detect the serial port. To resolve the issue, go to the settings interface below, turn off the USB Single Serial option, and then unplug and reconnect the USB cable. This will cause the
If you use the Chrome, please make sure to turn on the permission settings first:
The Petoi web coding block interface is shown below:
① ② ③ ④ ⑤ ⑥ ⑦
3.1 Initial Setup & Quick Connect
For first-time use, you need to establish a connection between your robot and computer. Both must be on the same WiFi network, and the robot can only connect to 2.4GHz WiFi networks. Therefore, you need to split your WiFi SSID into two frequency bands.
Follow these steps to split your WiFi bands:
Access your router’s Wireless Settings page (access method typically found on the router’s label).
In the 2.4GHz settings, change the Wi-Fi name (SSID) to xxx-2.4G and save.
In the 5GHz settings, change the SSID to xxx-5G and save.
Note: Since the Wi-Fi names have changed, all devices connected to this router need to reconnect. If you didn’t change the password, it remains the original password.
Connection Procedure
Connect the robot’s mainboard to your computer via USB cable.
There are two methods to connect the robot to your 2.4GHz WiFi network:
(Recommended)
Click button on the webpage, select a serial port of the robot in the pop-up window and click "Connect" button. (For Mac user, different from , any serial port of the robot works here)
Enter your xxx-2.4G WiFi credentials when prompted. The robot will connect to your network like any standard device, then automatically reboot its mainboard.
Once rebooted, the red block
Note: If you cannot find the new password-free network in the WiFi list, please try refreshing the list multiple times. If it still does not appear, check the robot’s serial output to confirm whether the robot remains in the waiting state. If not, the hotspot has been deactivated, and you will need to restart the network reset procedure.
Persistent Connection
This entire process only needs to be set up once. The robot remembers your WiFi credentials.
For future connections, You only need to use either one of the following methods to connect :
Wireless: Enter the current IP in the Connect with IP block (check via USB if IP changes).
Wired: Connect the robot to the computer via USB cable, then send command w to the serial port for auto-connection.
Note:
The connection relies on the local network environment. Ensure it is always on the same WiFi network as your computer during every subsequent connection. Your network IP address may not always remain unchanged. If you entered the IP address directly in the workspace block but failed to connect, please consider possible IP address changes. You may:
Connect the robot’s serial port to the computer via USB cable. Send command w through Petoi Web Coding Block to the serial port to check and update the IP address.
3.2 Language Switch
You can switch language systems here anytime.
3.3 Workspace
This is the area where you assemble block programs. You can scroll the mouse wheel to zoom in/out.
Press and hold the left mouse button on a blank area to pan the view. Right-click to perform actions like undoing block operations.
Left-click and hold a block to drag its position. Right-click a block to copy or delete it.
The buttons at the bottom-right :
From top to bottom: Undo • Redo • Center View • Zoom In • Zoom Out • Trash Bin
You can drag blocks onto the Trash Bin here to delete them. Click the Trash Bin to view deletion history, the blocks inside can be dragged back to the workspace.
Alternative deletion methods:
Right-click a block → choose "delete block".
Drag blocks to the Toolbox area.
The Workspace contains two default blocks that cannot be deleted :
Connect with IP: Essential block for program execution. Only blocks connected under it will run.
Gyroscope: Disables robot's gyroscope during program execution by default.
Robots' gyroscope status varies by users' usage habits. If it's enabled during runtime, the robot will automatically adjusts balance in real-time, which may interfere with your program's intended behavior. To ensure consistency, gyroscope is disabled at program start.
To enable: Simply change "disable" to "enable".
3.4 Action Buttons
Show Code: Displays source code of blocks connected under the Connect with IP block.
Run Code: Executes all blocks connected under the Connect with IP block.
Save Program: Saves current project state (all blocks + skills) as a .json file.
Load Program: Loads the .json project you saved.
Upload Skill Files: Adds skill files to project (details: xxx).
Clear All: Removes all blocks except default blocks Connect with IP and Gyroscope on the workspace. Cleared blocks will appear in Trash Bin history.
3.5 Console
You can view real-time program execution messages here. It's critical when controlling wirelessly, console can provides vital feedback as serial port data is inaccessible.
Use this button to toggle the timestamp display in the Console on/off. When you need to copy batches of sensor data output to the console, turning off timestamps makes it easier.
3.6 Serial Monitor
View serial print messages from connected robots here and send commands directly to the serial port.
When you successfully connect to the robot's serial port, the Serial Monitor window will automatically open as shown above.
Note:
Without a USB cable connection between the robot and computer, serial data cannot be accessed or sent here.
3.7 Toolbox & Blocks
Left-click any category in the Toolbox to reveal all its blocks. Drag and place them in the Workspace, then link to blocks under Connect with IP to assemble your program.
The Communication, Motion, Console, and Music categories contain blocks created and provided by Petoi. All other blocks are default functional blocks from Blockly.
4 The instructions for blocks
4.1 Communication
The blocks in Communication are used for interacting with various modules of the robot.
For detailed instructions on sensor connections, please refer to the individual sensor documentation in the "" section. Only basic connection diagrams and pin number references are provided here for your guidance.
The pin numbers required when using building blocks can be referenced against the labels next to the Grove Sockets on your BiBoard.
For general modules (Light Sensor, Touch Sensor, Gesture Sensor, PIR Motion Sensor, IR Distance Sensor), You can use the above four blocks to digitally/analog read/write signals and see the results in both the serial monitor and console.
Analog value range: 0~255
Digital value range: High-level: 1; Low-level: 0
For the
4.2 Motion
The blocks in Motion are used for controlling robot actions and reading/writing servo joint angle signals.
Preset Actions:
This block enables the robot to execute various preset gaits for movement in various directions/poses. You can modify the delay duration for continuous walking.
This block makes the robot perform various preset poses.
Custom Actions:
Use these two blocks to get the robot's current joint angles. You can assign it to a variable first and then use the variable and algorithm to control other joints to rotate.
The return value of the blocks are only angle values, which cannot be filled in the "Turn sequentially" and "Turn simultaneously" blocks alone.
These two blocks can both set a single joint angle individually. You can set the joint angle to an absolute value, or to a relative angle value. increase it, or decrease it by a specific number.
You can even creatively make the angle change using a formula or variable instead of a fixed number.
Combine these four blocks to move multiple joints sequentially or simultaneously.
The "Action frame" block represents a list of 16 angle values. Each angle value corresponds to the absolute angle value to which the corresponding servo rotates.
This block executes uploaded skill files by entering the full filename (e.g., test.md).
You can create skill files by using the .
Tips: you can also copy & paste the folder from the source code of the OpenCat project on GitHub to the .config/Petoi directory. Therefore, you can use some sample skills for your program, and there is no need to use the export function in the Skill Composer.
The folder .config is a hidden directory on MacOS/Linux but can be visited in the terminal or through a specific view setting:
MacOS
open the directory /Users/{username} in Finder, then press the “Command” + “Shift” + “.” (period) keys at the same time.
4.3 Console
Use this block to add console output, to observe runtime status and test programs in the console.
Use this block to insert a delay after statement execution, to observe program flow or achieve timing effects.
4.4 Music
You can combine these two blocks to make the robot play continuous melody.
You may use the play note block alone, but please note:
Petoi web blocks send instructions one by one in real-time over the network; using only play note during network congestion may cause discontinuous tones. Unless this effect is desired, we recommend using both blocks together for smooth melody playback.
4.5 Demo code
5 Appendix - Full WiFi Connection Logic
During the program’s runtime, press the BOOT button to reboot the robot and start the Wifi Manager. It will create a Wi-Fi hotspot with your machine-specific name. Connect it in your system’s Wifi settings, and a Wifi configuration page will automatically open to let you connect to your router. Only a 2.4G network is supported. The personal hotspot of your smartphone is also applicable, but you must connect your computer to the same hotspot during later operations. If the Wi-Fi configuration doesn’t open automatically after 5 seconds, you can try to connect to 192.168.4.1 manually in your browser. Alternatively, you can enter the Wifi credential in the serial monitor, formatted as “w%wifiname%password”. Click the Quick Connect button on the block coding page to enter the Wifi credentials.
If the Wifi connection is established successfully, the robot will automatically connect to the same router every time after reboot. If it fails, it won’t auto-connect during the future reboot. You can start over the connection operation as your first operation.
To clear the previously saved Wi-Fi credentials, hold the BOOT button for more than 2 seconds. This will reboot and start the Wi-Fi manager to connect to a new router.
Petoi Coding Blocks
How to use the extension library specially developed for the Petoi robot in Mind+
Prepare Mind+
Download the latest version from the
If you need to use more SPIFFS functions, it is recommended to install and use the Arduino IDE 1.8 temporarily; we strongly recommend the legacy version 1.8.19. Otherwise, the latest version 2.*.* is OK.
For Ubuntu:
Arduino root directory/.arduino15 (hidden file)/packages/esp32/hardware/esp32/2.0.12/tools/sdk/esp32/qio_qspi/include/sdkconfig.h
If the battery powers on the BiBoard, please long-press the button on the battery >=3s to power off the BiBoard, so that the BiBoard is only powered through the USB cable and only the blue LED is lit up.
XG
Gesture
XD
IR distance
XQ
Quick demo
XS
Enable the Serial 2(Tx2, Rx2). For BiBoard V0, the switch on the extension hat should be dialed to the Uart2 side; voice control will not work.
XB
Enable the back touch funtion.
X
Disable all the module functions above.
z
RandomMind (On/Off)
XA
Voice. For BiBoard V0, the switch on the extension hat should be dialed to the Voice command side (default mode)
XU
Ultrasonic. For BiBoard V0, the switch on the extension hat should be dialed to the Uart2 side; voice control will not work.
It's best not to use a VPN, as it may slow down the response speed and impact the experience. Please turn off the VPN extension.
USB device detected
message window to pop up again.
After renaming, both xxx-2.4G and xxx-5G will appear in your device’s WiFi list.
Connect with IP:192.168.4.1
in the workspace will auto-update with your actual IP, indicating successful connection. You can use Petoi Web Coding Block to send real-time signals to the robot via WiFi from now!
Click button in the serial monitor on the webpage to establish a serial connection with the robot.
Press and hold the BOOT button on the robot’s mainboard until the 10-second countdown in the serial monitor’s output ends. This will initiate the network reset procedure.
When the serial output displays "wm:Starting Web Portal", the serial output will pause. This indicates that the robot has created a new hotspot and entered a waiting state for connection.
At this point, open your computer’s WiFi network list and locate the newly appeared, password-free network. The network name is typically "UII WifiConfig."
After connecting, a WiFi Manager window will open. Follow the prompts to select your 2.4GHz network, enter the username and password, and wait for the connection to complete. The window will close automatically once connected.
Left-click a block → press "Delete" on your keyboard.
Ultrasonic Sensor
, use this block to read the distance value. You can set the two pins ( Trigger and Echo) like this: (BiBoard V1 connects to the Rx and Tx pins)
For camera modules (MU Camera, Petoi AI Vision Module), use this block to Read the coordinates of the identified target from the camera module.
If you are familiar with Petoi's serial commands (e.g., m 0 60 rotates servo #0 to 60°), you can use this block to send serial commands to robot during program execution.
You can also input "kkcL" (kick the left front leg), and "khiR" (raise the right front leg to say hello). For more serial port commands, please refer to the serial protocol.
Use this block to enable/disable the robot's gyroscope:
Enabled: The robot adjusts motion balance in real-time and performs self-righting when tilted over.
Disabled: The robot executes only specified movements without auto-balancing.
This block performs advanced preset motions. Due to large movement ranges, please use cautiously especially when using with USB-connected robot or Bittle X+Arm.
This block controls preset robotic arm motions (Bittle X+Arm only).
You can click the gear icon, then change the list length in the pop-up window to apply it to the actual block.
Use these two blocks to control all joints to rotate at the same time.
If you can not download the software from Mind+'s official website, you can download a stable version from the Google Drive folder. However, we strongly recommend that you download and use the official latest version.
For macOS only: If you have already installed the old Mind+ version (<=V1.7.2 RC3.0), we recommend that
You uninstall it first
Delete this folder /Users/[vour username]/Documents/mindplus-pv/environment/Python3.6.5.64/ib/python3.6/site-packages/
Download and install the latest version of Mind+.
After the installation is complete, you can open Mind+
If the default installation language is Chinese, you can switch to English as follows:
Petoi Coding Blocks is a user-extended library of Mind+.
If you open Mind+ by double-clicking the icon, it will not automatically load this extension library, and you need to re-import it manually every time you open the app.
If you open Mind+ by double-clicking the code file(suffix mp or sb3) that uses this extension library or load these code files after opening Mind+, Mind+ will automatically load this extension library.
The principle and process
This extension library can control the robot without compiling and uploading the code to the robot's main board. Click the "Run" button directly to run the program on the Python level and send instructions to the robot's serial port. If you need to stop the program while running, you can click the "Stop" button anytime. The process of the program can be divided into three steps:
Open the serial port
Control the robot
Close the serial port
The instructions for blocks
Open the serial port
There are two ways to open the serial port:
Automatically identify and open the serial port
Enter the name of the serial port to open the serial port
If it fails to open the serial port, you can refer to the printed information in the terminal window to replace the name of the serial port:
Deactivate Gyro
When the gyroscope function is turned on, the robot can balance its body in real-time. It may be seen that when the robot is doing preset actions (especially when performing more violent actions), the body will shake back and forth, and even the body will tip over. The robot will automatically perform recovery actions, which may disrupt your preset steps.
If the uploaded sketch is Mind+ mode sketch(#define GROVE_SERIAL_PASS_THROUGH this line is activated), the gyroscope function will be turned off, and the robot will not be able to balance or auto-recover, so there is no need to add this block.
If the robot is in standard mode, you'd better deactivate the Gyro after the serial port-opening block. It deactivates the gyroscope function to prevent the robot from performing balance feedback actions in real-time. For example:
Perform inherent skills
Use this block to let the robot perform skills pre-built on the robot's main board. Skills from "sit" to "zero" are postures (containing only one action frame). Skills from "boxing" to "sniff" are behaviors (containing multiple posture frames and are performed only once). Skills from "stepping" to "trotRight" are gaits (containing multiple posture frames, and are repeated in periodical loops until stopped).
After finishing the current block's task, the program will wait a short time (delay xx seconds) before moving to the next block.
Perform the last skill exported from the Skill Composer
Use this block to let the robot perform the last skill exported from the Skill Composer.
It is equivalent to inputting the serial command 'T' in the serial monitor and then delaying the preset time.
Perform the skill in the file
Use this block to let the robot perform the skill in the skill files, which are in the following directory:
Windows: C:\Users\{your user name}\.config\Petoi\SkillLibrary\{model}
MacOS : /Users/{your user name}/.config/Petoi/SkillLibrary/{model}
Linux: /home/{your user name}/.config/Petoi/SkillLibrary/{model}
The folder name {model} is Bittle or Nybble. When exporting a skill file from the Skill Composer, it will automatically save the skill file to this directory.
Tips: you can also copy & paste the SkillLibrary folder from the source code of the OpenCat project on GitHub to the .config/Petoi directory. Therefore, you can use some sample skills for your Mind+ program, and there is no need to use the export function in the Skill Composer.
The folder .config is a hidden directory on MacOS/Linux but can be visited in the terminal or through a specific view setting:
MacOS
open the directory /Users/{username} in Finder, then press the “Command” + “Shift” + “.” (period) keys at the same time.
Rotate joints in a sequence.
Use this block to control one joint or multiple joints to rotate in sequence. There are several ways to use the blocks for reference:
Controls individual joint rotations to an absolute angle value.
Controls individual joint rotations to a relative angle value.
Control multiple joints to rotate sequentially to absolute angle values or relative angle values.
Use the joint angle list to control multiple joints to rotate to absolute angle values in a sequence.
, represents a list consisting of a joint index and an angle value. For example, [Head panning to 30 degrees] represents the list [0, 30].
It consists of one or more pairs of joint index + angle value, and the specific format is as follows:
[joint index, angle value, joint index, angle value...]
Rotate joints simultaneously
Using this block can control multiple joints to rotate at the same time. There are several ways to use the blocks for reference:
Control multiple joints to rotate to absolute angle values or relative angle values at the same time
Use the joint angle list to control the simultaneous rotation of multiple joints to absolute angle values.
Get the current angle value of a joint.
Use this block to get the current angle value of the selected joint. It is recommended to assign it to a variable first and then use the variable and algorithm to control other joints to rotate.
The return value of this block is only an angle value, which cannot be filled in the "Turn sequentially" and "'Turn simultaneously" blocks alone.
Demo code:
Transform to frame
Use this block to control all joints to rotate at the same time. Please use it with the "Action frame" block. As shown below:
The "Action frame" block represents a list of 16 angle values. Each angle value corresponds to the absolute angle value to which the corresponding joint index servo rotates.
Play a melody
Use this block to control the robot to play music. There are several ways to use blocks together for reference:
A list made up of multiple "Tone + Duration" blocks
Using a tone duration list
Consists of one or more pairs of Tone + Duration, the specific format is as follows:
For more detailed tutorials, please refer to Melody Creation.
Execute a serial command
Use this block to send a serial command to the robot, which can provide you with more and more flexible control methods. For example, you can input "kkcL" (kick the left front leg), and "khiR" (raise the right front leg to say hello). For more serial port commands, please refer to the serial protocol.
Write analog value
Use this block to write an analog value to a specified pin. Analog value range: 0~255
Read analog value
Use this block to read an analog value from a specified pin.
Write digital value
Use this block to write a high/low-level value to the specified pin. High-level: 1; Low-level: 0.
Read digital value
Use this block to read the high/low-level value of the specified pin.
Read Ultrasonic sensor distance
Use this block to read the distance value from the ultrasonic sensor.
For other ultrasonic sensor models (e.g., HC-SR04 connects to the D6 and D7 pins), you can set the two pins like this:
Read the target coordinates
Use this block to Read the coordinates of the identified target from the camera module(MU camera / Petoi AI Vision module) which connect to the BiBoard.
Test code screenshot
You can download this test code (testCamera.mp) and run in the Mind+.
Get the gesture value
Use this block to Read the gesture value from the gesture sensor which connect to the BiBoard.
the gesture value meaning is as following:
Test code screenshot
You can download this test code (testGesture.mp) and run in the Mind+.
Close the serial port
Generally, at the end of the program, it is recommended to use this block to close the serial port communication.
Demos
We provide some demos to download for reference in the GitHub repository (Petoi_MindPlusLib/examples).
Skill Composer is a skill development tool specially developed by Petoi for robots (Bittle, Nybble). Good tools are the prerequisite to the success of a job.
A Brief Introduction to the Interface
See .
#define CONFIG_DISABLE_HAL_LOCKS 1
#define BITTLE //Petoi 9 DOF robot dog: 1 on head + 8 on leg
//#define NYBBLE //Petoi 11 DOF robot cat: 2 on head + 1 on tail + 8 on leg
//#define CUB
// #define BiBoard_V0_1 //ESP32 Board with 12 channels of built-in PWM for joints
#define BiBoard_V0_2
// #define BiBoard_V1_0
#define ROBOT_ARM // for attaching head clip arm
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x1b (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13964
load:0x40080400,len:3600
entry 0x400805f0
k
Flush the serial buffer...
* Start *
Bittle X
Software version: B02_250121
Scanning I2C network...
- I2C device found at address 0x54: EEPROM
- I2C device found at address 0x5C: Misc.
- I2C device found at address 0x68: MPU6050
- I2C device found at address 0x69: ICM42670
- I2C device found at address 0x7E: Misc.
- done
GroveVisionQ 0
MuQ 0
Set up the new board...
Unmute and set volume to 5/10
Using constants from I2C EEPROM
- Name the new robot as: Bittle45
Reset the joints' calibration offsets? (Y/n):
- Calibrate the Inertial Measurement Unit (IMU)? (Y/n):
Run factory quality assurance program? (Y/n)
* Start *
Scanning I2C network...
- I2C device found at address 0x54 !
- I2C device found at address 0x68 !
- done
Set up the new board...
// 蓝牙连接时使用的设备名称
- Name the new robot as: BittleED
Reset the joints' calibration offsets? (Y/n):
Y
Buzzer volume: 5/10
- Calibrate the Inertial Measurement Unit (IMU)? (Y/n):
Y
Put the robot FLAT on the table and don't touch it during calibration.
Initializing MPU6050...
OK
If the program stucks, reinstall Arduino ESP32 boards version 2.0.12. Newer version may cause bugs!
- Testing MPU connections...attempt 0
- MPU6050 connection successful
- Initializing DMP...
MPU offsets: 2691 1893 1181 72 -57 0
Calibrate MPU6050...
>....................>....................
MPU offsets:
// X Accel Y Accel Z Accel X Gyro Y Gyro Z Gyro
//OFFSETS 2759, 1871, 1173, 73, -56, -4
- Enabling DMP...
- DMP ready! Waiting for the first interrupt...
BLE: Bittle45_BLE
Waiting for a BLE client connection to notify...
SSP: Bittle45_SSP
The SSP device is started, now you can pair it with Bluetooth!
Setup ESP32 PWM servo driver...
Calibrated Zero Position
135 225 135 135 190 80 190 80 190 80 80 190
Build skill list...88
Run factory quality assurance program? (Y/n)
(Auto skip in 5 seconds)
5...4...3...2...1...n
TaskQ
rest
11
Init voice
Number of customized voice commands on the main board:
10
Turn on the audio response
Show Petoi Logo color
S, A, T, L, D, I, B, U, G, C, Q,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Ready!
g
rest
d
XAaXAc
Switch English
0: Up;
1: Down;
2: Left;
3: Right;
Connection method
The robot must be powered by the battery and running the OpenCat 2.0 firmware to be recognized by the Petoi Desktop App. Before opening the software, please plug in the battery, and long-press the button on the battery to power on the robot.
To connect the robot's mainboard to the computer, please follow the instructions in the subpages according to the kind of mainboard you have.
After downloading the compressed file(.zip), please unzip it first.
Do NOT move the UI.exe to another location in Windows.
Open the Petoi Desktop App (for Windows: UI.exe / for Mac: Petoi Desktop App), click the "Skill Composer" button, and open the skill composer interface.
The Skill Composer Interface
The interface for different kind of product, please refer to the subpages.
Note: Most of the buttons on the interface have a tooltip when the mouse hovers over.
Menu Options
Model
Nybble
Bittle
Bittle X+Arm
Nybble cat and Bittle dog have different back leg joint directions. Their skill data are not interchangeable. Select the correct model before operating the Skill Composer. Otherwise, some joints may conflict with the robot's body.
Language
Currently, there are English, 中文, and Italian. You may contribute to the .
Utility
We will keep adding small gadgets to the utility tab. We have an eye color picker for the Nybble cat's ultrasonic sensor with built-in LEDs. We also have an entry where you can add your creator credential to the skills you create.
Connection and State Dials
Listening / Connect button
Connect the robot to your computer through either the USB uploader or system Bluetooth settings, then open up this desktop app. It should automatically detect and connect to the robot. The robot's serial port will appear in the following drop-down menu. The button should turn from "Listening" to "Connected". If the robot fails to connect for the first time, you can click the "Listening" button to disconnect all the ports, then press the "Connect" button again.
Note: The desktop app will keep listening to the serial port and send a handshake signal to the newly added device. If the device responds with a pre-defined signal, it will be recognized as a Petoi device and added to the drop-down menu.
Servo
The robot's joints will hold position when the force is on. You should NOT rotate them by hand. Turning it off can allow you to rotate the robot's joints freely. It's helpful to quickly pose the robot to plan its center of mass for balancing.
Gyro
The robot has a gyroscope to detect its body angle and movements. It's used for balancing and roll-recovering. Turning it off can avoid unexpected reactions when rotating the robot.
Random
In certain experimental modes (e.g. RandomMind mode), the robot will move randomly. This button can toggle the behavior on/off.
Send a serial command
Like the serial monitor, you can enter a serial command in the text box and send it to the robot by pressing the Enter key or clicking the Send button.
Preset Postures
A few preset static postures move the robot's joints to specific positions. You can use them as a starting point to build your motion sequence. We usually start with the "balance" posture, with the robot standing on all four legs.
You can switch between different postures and observe how the sliders in the Joint Controller area update to reflect the changes in joint angles.
Joint Controller
The angle sliders can show the robot's current joint angles. They can reversely rotate the robot's joints if you change their values. You can drag the slider bar for large angle adjustments or click above or below the slider bar for fine adjustments (by 1 degree). Some joints will have smaller accessible ranges than the sliders. Try to use angles between -125 and 125 degrees. Sending larger angles will increase the response time.
The sliders correspond to the robot joints if you look down at the robot's body with its head pointing forward. Joints closer to the body are closer to the center of the panel. The robot's joints can be mapped to your own body and become your avatar.
Note: Some sliders with a light yellow background are disabled for joints that don't exist on specific models.
You can control multiple joints by clicking the dial "+" or "-" on each slider. All sliders with their "+" pressed will change by the same increments. Sliders with their "-" button pressed will change by the negative increments. The button can be toggled on and off. Click the "Unbind All" button to disengage all the joints at once.
You can also control the robot's whole body joints with the sliders in the center panel. You can tune these central sliders to adjust the robot's global orientation and translation. The neutral "balance" posture can generate better results than other tilted postures.
Global Orientation and Translation
Effect
Pitch
Adjust the pitch angle
Roll
Adjust the roll angle
Spinal
Move in the spinal direction
Height
Raise or lower the robot's body
Skill Editor
The previous functions can modify a single posture. The Skill Editor is a stop-motion animation scheduler. You can add, delete, and insert frames of poses and make the robot perform continuous and smooth motions.
Every frame has a row of buttons and input fields as parameters. The first static row contains the column header to indicate the parameters' names.
Basic Operation
The Activated Frame
You can click the "=" button (the 2nd item of a frame) to activate the corresponding frame and move the robot to the frame's posture. The frame will hold all your new edits on the robot's current posture. The "=" symbol will become bold, and the button will become larger. The "=" symbol will become a red "!" mark if the current frame is edited. You can click this button to save your edits. Otherwise, the current edits will be abandoned if you click the "=" buttons of the other frames.
Add a Frame
You can click the "v" button (the 9th item of a frame) to add a frame after the current frame and activate it. The new frame will be identical to the previous activated frame.
Note: The new frame doesn't necessarily copy the "v" button's frame.
Insert a Frame
You don't always add a new frame after the last frame. You can click the "v" button (the 9th item of a frame) of any intermediate frames to insert a new frame below the "v" button. The new frame carries information identical to the previously activated frame.
Mirror a frame
You can mirror the activated frame's posture by clicking the ">|<" button.
Delete a Frame
You can click the "<" button (the 8th item of a frame) to delete the current frame holding the button. All the following frames will shift up. If the activated frame is deleted, its preceding frame will be activated. If the activated frame is the first frame and is deleted, its following frame will be activated.
Add a Note to a Frame
You may lose track of what each frame holds with multiple edits to the frame list. Switching to individual frames can be time-consuming. We provide a "Note" field (the 7th item of a frame) where you can add short keywords to identify the frames. By default, a random animal name will be added to a frame when created.
Bound joints and passed-through edits
If a joint's angle is the same in the current frame and the next frame, editing and saving its angle will also update the angles in the following frames until the angle differs. For example, if joint 8's angles are 4,4,4,4,6,7 in all the frames, changing the angle in the second frame to 8 will update the sequence to 4,8,8,8,6,7.
Play the Skill Sequence
Besides manually clicking the "=" button (the 2nd item of a frame) to view the single posture, you can click the "Play" button to show the postures in order starting from the activated frame. During playing time, the button's text becomes "Stop" to allow you to stop in the middle.
Export the skill
After clicking the "Export" button, you can choose a location and filename to save the skill (from the activated frame.If the activated frame is the last action frame, all action frames in the action frame list are exported) as a text file. You can cancel the savings to skip. The desktop app will still send the skill to the robot for real-time performance. And you can call the last exported skill by the serial token "T." There are two ways:
Open the mobile app, use the Create Command function, and enter the serial port command "T" in the Code text box.
The last skill exported by the Skill Composer is stored in temporary memory. It can stay after the power is off and rebooted but will be overwritten by a new export.
From version 1.1.3, When exporting a skill, the desktop app automatically saves it to /Users/{username}/.config/Petoi/SkillLibrary/. Note the .config is a hidden directory but can be visited in the terminal or through a specific view setting. Therefore, you can easily manage the skills in Mind+.
The Skill Creation chapter focuses on the code and data structure so that you can integrate any number of new skills into the source code. The skill data array in the exported text file (*.txt or *.md) content can be copied and pasted into the Instinct**.h file to be used as a skill array.
Export the skill as a customized button in the mobile app. It can be permanent even if you create multiple skills.
Import the Skill
You will see a pop-up window after clicking the "Import" button. It allows you to copy-paste a skill data array in the text editor or import an existing skill file you or other users created. You can find example skill data in OpenCat/src/InstinctBittle.h or InstinctNybble.h. A complete skill format should include the "{ }" pair and the numbers between them. Only the first one will be imported if there are multiple skill arrays. The importer will do some simple format checks.
The SkillLibrary folder in Github is a collection of new skills of the OpenCat robot, which can be used for your reference (after downloading, use the import function to save a single skill to the robot's memory, and then use the play or export to view the specific effect).
You are welcome to share your new skills by sending merge requests to this folder.
Reset the Skill Editor
You can use the "Restart" button to clear the Skill Editor panel and start over.
Advanced operation
Set up Action Frame Loops
If you need some consecutive action frames in the action frame list to run multiple times in a loop, you can first enter the number of loops in the Repeat text box above the action frame list (on the left side of the label "Set"), and then use the left mouse button to select them in turn, The index numbers (the 1st item of a frame) of the first and last two frames of the continuous action frame that want to achieve cyclic motion (the index number button will appear in a recessed state after selection), as shown in the following figure:
If you enter -1 in the Repeat text box, the looping action frames will keep looping forever unless you press the reset button on the main board of the robot.
Set Movement Speed
In the action frame list, you can set the running speed of each frame of action (the 3rd item of a frame). There are the following 9 options for you to choose from (speed up the running speed in the order of numerical value):
1,2,4,8,12,16,32,48,max
Note:
In the options box, you can also enter any integer value in the range of 0~125 (0 means max).
By clicking the "Play" button in the "Skill Editor" area, you can NOT see the real running speed effect of the action; only after clicking the "Export" button will you see the real running speed effect.
Moving at the fastest speed for a long time will cause damage to the servo, so it is generally recommended NOT to set it to "max".
When the "Gyro" button in the "" area is turned on (the font color is green), after adjusting the joint angle value in the action frame or the running speed of the action frame, it to view the debugging effect, or the action behavior, the robot It will try to maintain its own body balance in real-time, so it may be seen that when the robot is doing preset actions (especially when running relatively violent actions), its body will shake back and forth or even overturn, and the robot will automatically recover. Action may disrupt your original operation steps. Therefore, it is recommended that you click the "Gyro" button when designing the action to turn off the gyroscope (the font color changes to red), and the robot will not perform balance feedback actions in real-time. When turning on the gyroscope, click the "Gyro" button again.
Set Delay
In the action frame list, the "Delay" option (the 6th item of a frame) in each action frame indicates how long the robot delays before doing the next frame of action after the action of this frame is completed.
There are 17 presets for you to choose from: 0,50,100,200,300,400,500,600,700,800,900,1000,2000,3000,4000,5000,6000.
Of course, you can also enter any integer value in the range of 0~6000 in the "Delay" option box. The unit is milliseconds (ms).
Set Trigger and Angle
The "Trigger" option (the 4th item of a frame) in the action frame is used to set the body rotation direction when the robot triggers the next action frame. There are the following 5 setting options:
None means that there is no trigger and the angle condition is set
Pitch means the robot body rotates nose-down
-Pitch means the robot body rotates nose-up
Roll means that the robot body rolls to its left side (counter-clockwise when looking from the tail)
-Roll means the robot body rolls to its right side (clockwise when looking from the tail)
The "Angle" option (the 5th item of a frame) is defined with reference to the angle of the polar coordinate system. As shown in the figure above, when the body is horizontal, the angle of the polar coordinate axis is 0 degrees. If the polar coordinate axis rotates counterclockwise, the angle is positive and gradually increases. The angle setting range is an integer value between -125~125.
When a specific trigger and angle are set in the action frame, the next frame of action will be triggered only when the robot rotates over the trigger angle in the trigger's direction. If a delay time is also set in this action frame, it will delay an additional time after the trigger condition is met before moving to the next frame.
When creating actions related to the rotation of the robot body (such as backflips, doing high bar exercises, etc.), it's vital to trigger the motion at a certain body angle whose timing can be hard to estimate, and it may also change during the motion. We can use the gyroscope to monitor the rotation angle of the robot body in real-time, so that the robot can trigger the joint servo at the exact time of the trigger event.
Export Mirror Actions
When exporting the action frames, if you want to mirror all the action frames in the action frame list (the robot's left and right side joints will be exchanged, as if seen in a mirror), you can first click the "MirrorAll" button, and then click the "Export" button. If you want to cancel the mirrored export, you can deselect the "MirrorAll" button.
Behavior and Gait Options
Before exporting action frames, select the "Behavior/Gait" options in the "Skill Editor" area as "Behavior". After clicking the "Export" button, the program will run on the robot and automatically interpolate between these action frames to make the robot move smoothly. All action frames will execute for only one round.
If the "Gait" option is selected before you click the "Export" button, the robot will continue to execute in a loop, and each action frame will run at the fastest speed; NO interpolation between action frames will be added. The motion can be quite brutal. Therefore, it is recommended that beginners always use the "Behavior" option to develop new skills.
When importing some pre-built skill array, the desktop app will automatically select the "Behavior/Gait" option according to the data format. The frames will be loaded into the frame editor, and the robot will automatically move to the first frame's posture.
After sending a command, the desktop app will wait for the robot to return a confirmation token. It may freeze if the robot's program halts or the connection is lost. You don't need to close the desktop app and lose the unsaved action frames but press the "reset" button on the robot's main board to break the app's waiting loop. If the program still does not respond, you can click a posture button in the "Preset Postures" area or try to reconnect the robot using the "Connect/Listening" button.
Simultaneous Control of Multiple Robots
The desktop app supports the connection of multiple robots through their own serial ports (such as the Bluetooth communication module) to achieve simultaneous control of multiple robots. After a physical connection, the app can only recognize a serial port as a robot. So after the robot is powered on normally:
USB
First, connect the USB uploader to the main board of the robot, and then use the data cable to connect it to the computer's USB interface.
Bluetooth
First, plug the Bluetooth module into the main board of the robot (no need for the ESP32-based board) and pair the board with the computer's Bluetooth setting interface. The desktop app will keep detecting if there is a new serial port connection. When multiple serial ports are successfully connected, the serial port option button in the "State Dials" area will change to "All." Click the drop-down list to view all serial ports that have been successfully connected. All robots will be synchronized in real-time in this way. You can also select any one of the serial ports to control the corresponding robot.
If you unplug a USB serial port on the computer (or disconnect the Bluetooth module in the Bluetooth setting interface), the corresponding serial port will be removed from the drop-down list in real-time.
If you unplug all USB serial ports (disconnect all Bluetooth modules), the serial port option button displays "None," and the left button displays "Listening." The desktop app still automatically detects whether there is a serial port connection. When a robot is reconnected to the computer through the serial port, the button on the left side of the drop-down menu will display "Connected." The corresponding serial port name is displayed in the serial port option button.
If you want the desktop app to stop detecting serial connections, click the "Connected" / "Listening" button. The text in the button will change to "Connect," and all serial connections will be disconnected. Click the "Connect" button again to restart the real-time detection function.
Professional extensions
You can modify the source code of the Skill Composer in OpenCat/pyUI/SkillComposer.py.
Teach by pulling legs using the Feedback servo
This function requires the servos after March 2024, the BiBoard, and the latest firmware.
We have added the position feedback feature to recent batches of Petoi servos. The servo can reply to a specific PWM pulse (3500µs) with its current position in the form of pulse length. The central controller (BiBoard) can convert the signal to angles for more interaction.
First, send the robot a serial command "xl" to start the learning process. In the demo, it's triggered by our customized voice command. The robot's servo driver will switch to reading mode. Joint jigs can occur during this transition. Organize the robot's legs and then hold it still. The learning starts when no significant movements are detected.
Pull the legs, and the movement will be recorded. Stopping in the middle is okay because identical postures will be skipped. The recording will stop if the maximal frame is reached or the robot's joints are not moved for 2 seconds.
The recorded command can be called by "xp" to replay. The skill data is also printed to the screen so you can save it and import it into the Skill Composer or other OpenCat interfaces.
The control logic is defined in OpenCatEsp32/src/reaction.h and motion.h.