******
You can go to docs.petoi.com for the newest instruction doc. It's available in English, Chinese, and Germany!
******
Dear Early Bird Backers,
In case you receive Nybble early, please find the following animations as basic assembling instructions. Some of them were created earlier and are slightly different from the version you receive. I'll update them in the coming week and add more notes to help you figure out the puzzle.
When assembling, there shouldn't be any part that requires excessive force. So be careful not to break those tiny pieces, but take careful observations on the videos. If you have any questions, please post them here with pictures or videos.
Thanks for your support and now let's start a wonderful journey together!
Happy New Year!
Rongzhong
Based on your feedback, I'm making a shared google doc to better chapterize the following tutorial. You can comment on each section to help improve its contents. If you caught me editing the document, we could even chat in real-time! After the contents are pretty fixed, I'll find a better way to present it on a dedicated webpage.
In the tutorial playlist, I have more hand-on instructions besides the animations.
If you have a problem during use, please post under the Clinic category and describe your question with a short subject. Thank you!
Part list:

There are five different screws used in the kit. I think coloring them differently is more helpful than words:

A is for attaching servo arms. D (sharp tip) is for attaching servos to the frame. A and D come in each servo's own little bags.
B is for attaching servo arms/circuit boards to the frame. In later versions, it will be replaced by C.
C (flat tip) is for binding the thighs.
E (always the longest) is for the battery holder.
There are three types of springs. The 9x thick springs are for the thighs; the single thick short spring is for the neck. It will be replaced by the previous thick springs in later versions; the two thin short spring is for the battery holder.
The metal hinge of the battery holder should be bent towards the battery pack to avoid blocking the knee servo's path.
There's an update on the shoulder pieces:
You may notice that the 4th piece (pink) is almost the same except the curve on one side is cut flat. It’s actually an improvement. It's adjusted to accept a Raspberry Pi and give access to its two USB ports. If you are assembling Nybble as is, put the pink one on the bottom side of the tail shoulder. If you want to add Pi later on, put the flat one on the top side of the tail shoulder. In that configuration, you won't be able to install the spine due to the height constraints.
Again, make sure you read the tutorial (google doc) before assembling!
Hi! Congrats on your launch! We just got our Nybble on Wednesday and have been enjoying assembling her -- my daughter absolutely loves the kitten face! I've got a few comments/questions on the process so far:
(1) Where does the ultrasonic sensor plug in? I found the PWM pin assignment on the GitHub Wiki page, and I've read through the NyBoard User Manual. I don't find anything about where this sensor connects.
(2) A parts list would be helpful, along with a "pick list" correlating the 'bits' used in each assembly step with the appropriate springs, screws, etc. Personally, it's a little frustrating to have a bag of not-quite-the-same-size screws and work out which one most closely resembles the one in the video or is the shortest one that could work. I've got a bad feeling that we're going to need longer/shorter screws at the end and have used them elsewhere!
(3) The order of the videos seems amiss -- #1 assembled the head, #2 assembled the body, then #3 partially disassemble the body to get the battery compartment installed. Swapping videos 2 and 3 would avoid duplicated effort.
(4) Installing the sliding battery compartment -- it looks like there are different configurations, one with two slots on the body piece and the little wooden oval goes left-to-right. A second configuration has one slot on the body piece and the wooden oval will go front-to-back, but I don't see any reference to this second configuration except for some of the Nyboard v/s Pi images. Additionally, the plastic box has one larger hole and three smaller ones, but the rivets only fit in the larger hole. We can, of course, bore out one of the other holes to get the other rivet to fit, but the rivets are just being dropped in when I watch the video.
(5) It seems like putting on the rubbery 'feet' would be a lot easier if the wooden part of the foot wasn't serrated to tear into the rubber.
(6) What the the purpose of the LED light soldered onto the ultrasound sensor? Does it exist because some people light flashy lights? Is it lit whenever the cat is 'on' as another indicator? Is it code-configured and I could have my cat 'speaking' in Morse code if I were particularly ambitious? All of the above? ;-)
That's all for now! We're excited to watch Nybble come together and can't wait to see her move around.
Best regards,
--Lisa
(1) The ultrasound sensor connects to D8, D9, D10, GND. At this moment the sensing code has not been integrated into Nybble.ino. The LED is optional to indicate the sensor's status, and will flash according to the distance once in function. It can also be programed to be decorative dynamic colors.
(2) Yes, I can feel your frustration and am very sorry for that. I'm adding more details to the tutorial every day. For the screws, I just listed them and display them in different colors. The last animation in the tutorial shows how it will look like.
(3) The two videos (body and battery) are relatively independent. In the battery video I show only the belly piece for clarity. I just swapped their orders as you wish.
(4) The assembling of the new battery holder will be a scene during a long animation (I'm making it right now. It's like directing a long-take film clip). I just added a screenshot to show the correct holes before uploading the full animation.
(5) The dents design came before the rubber. It's intended to provide sufficient friction even without the rubber toe. So I'd keep it.
Hope the above answers your question! And please keep asking questions so I can add more bits to enrich the tutorial.
The main body animation has been updated: https://youtu.be/B8N2KAf8p28
Hi, you're invited to review and comment on this tutorial with much more details. Thank you!
Congratulations on getting the early kits shipped. I'd really like to see this project succeed. I have a few suggestions for improvement.
The main thing I think that would bring this project to the next level would be a set of consistent work instructions with detailed part lists, instructions, and images from the same model that shipped. I've been able to piece together how to assemble Nybble from your videos, but it's been difficult. Here's an example of a kit build instructions that I've found to be incredibly well done: https://manual.prusa3d.com/Guide/5.+Extruder+Assembly/295?lang=en
This is powered by Dozuki, who do offer a free plan open source projects (with ads). I'm sure there are other work instruction packages out there. What I like about that kit was that there are detailed pictures showing clearly on the actual device the proper pieces and orientation for each step.
Right now we need to watch a few videos, which are mostly good but they don't show the version that shipped in the kits. They have the older NyBoard (just a different color, but this affects people's perception during the build) and older battery holder. Plus there is some back-tracking that occurs during the video if you're building it as you watch it. That can be frustrating to someone new to building kits such as these. The additional animations you've posted on youtube are helpful, but you almost need to watch them in reverse to understand what you need to do. They are showing disassembly rather than assembly.
Other than the general approach to the build instructions, a few minor issues I'm still having are:
- I'm uncertain what the intent was for mounting the tail. What I've done is working but isn't optimal.
- I don't know what the 5 small hexagons and 1 small circle are used for.
- It would be really helpful to have instructions on preparing it for use with a Pi. In particular the need to solder and the different pieces to use.
- I'm thinking of remapping the joint indices. The cable length for the rear shoulder joints is a very tight fit.
- With the RPi configuration you've posted, the header for connecting to the FTDI chip is unreachable. I'm not yet at the point of where I can use the RPi so I want to connect to the serial port but leave the header in it's final position. I don't want to end up bending the pins multiple times during debugging. I'm not sure if you've done this and there's something I'm missing. I'm planning to hook up some jumpers to the pins so I can have the board external to the Nybble while troubleshooting.
Again, great job with getting the early backer kits shipped. The cat is adorable and I'm very excited to see what I can do with the AI agents I build on this type platform. I plan on posting my project publicly once I have it in a releasable form.
Quick answer to your questions:
- I'm uncertain what the intent was for mounting the tail.
The tail is used for posturing and recovering. It's half constrained to allow pitch rotation.
- I don't know what the 5 small hexagons and 1 small circle are used for.
They are optional nuts if you want to mount some board on with self tapping screws. A circuit board usually has 4 mounting holes but I included one extra. The small circle on the tip of shank is for calibration reference.
- It would be really helpful to have instructions on preparing it for use with a Pi.
The included 2x5 female socket is the only thing you need to solder for Pi. The animation in the post shows the configuration for Pi.
- I'm thinking of remapping the joint indices. The cable length for the rear shoulder joints is a very tight fit.
Tight but works. I also noticed that and your remapping should work. In my new servo orders I increased the wire length by 1cm.
It's all up to you to change the joint mapping. Remember to changed it if you pull my future updates though.
- With the RPi configuration you've posted, the header for connecting to the FTDI chip is unreachable.
You are right. It's supposed to be bent towards another side of the board, opposite to the NyBoard alone configuration. The animation in the post shows the adjustment for Pi. I also mentioned it in this new tutorial video, at 2:00. I showed the Pi configuration under multiple occasions. Maybe I should group them in one post and have more close-up photos.
I love the tutorial you shared. It allows sectional comments in a long document. Do you by any chance know how it's done? Or I could split this instruction to multiple posts. The TOC of OpenCat Wiki shows my intent of the chapter plan. It will be like a book or graduate thesis.
I'm out for a conference and will return on Saturday. I'll add more bits during the gaps of meetings.
@Rongzhong Li Thanks for the rapid response during your travel! My question about the tail was not about what it's used for, but about how to mount it.
Thank you for the new video. I think you posted that after I ran into my trouble. It's great to see such rapid progress in getting everything together.
The tutorial I posted is by Dozuki. It's one of the best sites I've seen for maintaining instructions such as these. You can always do something similar via a wiki, but I really like how these are done. Each image you can click on to get the high resolution version, which is sometimes incredibly helpful with small electronics projects. Here's their pricing plan for open source projects. The lowest tier one is free, but will have some ad content. https://www.dozuki.com/Document/qJj2gAd2bhFZocYC/.pdf
I'm currently having trouble with the calibration using WriteInstinct.ino. It isn't moving to the calibration position. I'm going to add some debug lines to the code to troubleshoot on my own, though. I've tested each servo operation through the driver using Adafruit's test servo. BTW, I don't understand the pins definition in your servo test module. It doesn't look like it corresponds to the correct pinout of Nybble.
Great job so far. I know it probably seems like a lot of growing pains, but these early issues will work out and make a better experience for the rest of your users in the near future!
@Tim Saucer
I'm currently having trouble with the calibration using WriteInstinct.ino. It isn't moving to the calibration position.
Do you mean the servos doesn't move after you enter 'c' in the serial monitor? Or the limbs are not moving to the calibration state? Since you said the servos are working with the test code, I guess it's the second case. If you have never calibrated the servos before, you need to take off all the limbs from the servo, enter 'c', let the servos rotate freely. Once they stop, you can attach the limbs to the servos. There are 21 gears on the servo's rotor, the angle division of 360 degree is around 18 degree. That means you will always get some variations from the 90 degrees calibration state. That's why the software calibration is needed. Type 'c + servo index + offset value' (e.g. "c8 4") will rotate the joint and you can find the best offset to make each servo to the calibration state. The rotational resolution is 1 degree. You can use the included “L” shaped tuner as a reference. After calibration, you need to type 's' to save the offsets. The calibration process takes patience, but is only needed once.
The test servo code is just for checking every servo is in working condition. As you suggested, the pin definition is quite flexible so the current code may be using some older pin map. I'll clean it up once I return to the factory.
High customizability sometimes means confusion to new users. The freedom I enjoyed tweaking the codes may be pain to others. I'll try to stick with one setting and make a step by step tutorial. I taught a one semester university robotics class with a simpler model. I think being with the students really helped to solve every tiny confusion in time. It's a real challenge with so many users. So I'm answering questions as promptly as I can.
I'm having a problem with "MPU failed." I've reloaded libraries and cannot seem to get past this part.
Chris
First check, have you dialed the I2C switch (SW2) to "Ar" meaning Arduino? If it doesn't solve the problem, download the new version code. In my updated Nybble.ino, I increased the delay on line 267 to allow more time for connecting.
There's a test code for MPU on GitHub. You can validate whether the module is connected and working. If the test code works alone, but not inside Nybble.ino, comment out the do while loop from line 263 as:
Adding photos and screenshots will also help to locate the problem!
@Rongzhong Li The switch was in the wrong position I believe but it didn't change anything after I set to arduino. The MPU test code fails also. It will just keep scrolling those numbers forever. Not sure what other photos you are looking for.
Chris
@Chris Achilles
The error message "MPU6050 connection failed" comes from the function mpu.testConnection() which always returns false. However your screenshot shows the MPU test code is working. The test code does nothing but printing out those numbers (Yaw, Pitch, Roll angles on each row) forever. You can try to rotate the board and validate that the MPU6050 is reading rotational angles, meaning the sensor is connected and working.
So the problem should be a false alarm by mpu.testConnection(). This is a library function imported from jrowberg's GitHub. There're several similar problems reported on the Internet. i.e. the MPU test codes works fine alone but will report connection error in another sketch. I have seen this problem twice during my previous experience. My solution was ignoring the mpu.testConnection() return value and by pass the checking loop (as in my previous comment). It won't affect the functionality since the MPU6050 can correctly return rotational angle for later adaptive motions.
Let me look over my remaining boards once I return to the factory, and see whether I can reproduce this error message. Then I'll take a deeper look into the problem. I also opened this issue on our GitHub repo for help.
First of all congratulations on this excellent work Rongzhong! I've assembled my Nybble and calibrated it successfully. It reacts to all to commands pretty well, but sometimes the servos (and thus limbs) just go nuts. The only way to recover is to quickly shut Nybble down. After the last of such events it didn't react to anything anymore so I uploaded Nybble.ino again. Now I have a problem that all I get in the serial monitor is:
* Starting *
Initializing I2C
Connecting MPU6050...
Testing connections...
MPU successful
Initializing DMP...
842 -48 38 2
Enabling DMP...
Enabling interrupt detection
DMP ready!
* Assigning 1 skill addresses...
0
0
0
0
0
0
0
0
0
Finished!
FIFO overflow! Using last reading!
7
7
k
FIFO overflow! Using last reading!
FIFO overflow! Using last reading!
CH
CH
d
shut down servos
FIFO overflow! Using last reading!
CH
CH
d
shut down servos
FIFO overflow! Using last reading!
7
7
k
FIFO overflow! Using last reading!
FIFO overflow! Using last reading!
Nybble doesn't seem to recover from this. Any thoughts or ideas?
Q: "Sometimes the servos (and thus limbs) just go nuts"
Fully charged 2S battery is 8.4V. The signal that drives servos will be unstable once the batteries' voltage drops below 7.4V, causing the servos to rotate out of control. If Nybble is doing intense motion, like trot, the requirement for voltage is even higher. Dial the resistor clockwisely will lower the requirement for battery voltage, and extends the battery life after one charge. Though the running speed will be correspondingly slower.
The physics here is:
The battery has a limit on power, P=VxI, where P is output power, V is voltage, and I is the current.
Nybble does work through servos. The higher voltage the servo gets, the larger current it will draw from the battery, until the power exceeds the battery's capacity. It will result in a fluctuation in the batteries' voltage, or trigger the batteries' over-current protection.
Q: "After the last of such events it didn't react to anything anymore"
In rare cases the fluctuation in voltage may flip the bits in the onboard or I2C EEPROM, where all the skills are stored as a linked list. If one bit flips, the program won't be able to load the following skills to its memory. But according to your output info (which is quite helpful), it shows the onboard EEPROM is working fine. So it may be the I2C EEPROM. You may fix it by re-uploading the writeInstinct and Nybble. Make sure you are uploading the files downloaded at the same time (i.e. the same version).
Just another possible cause: Did you closed the switch on the battery holder? And have you charged the batteries? The servos requires external power to work.
Yet another note on handling Li-ion batteries: Remember to remove them from the battery holder after use to avoid over discharging. When charging, use the smart charger and keep them in your reach.
@Rongzhong Li I got Nybble under control again, thanks!
If it helps others here's what I did:
1) Fully recharged the batteries
2) Uploaded writeInstinct and Nybble again (in this order), but it didn't help yet
3) Uploaded just writeInstinct and re-wrote instincts, then uploaded Nybble, but still the same problem
4) I then figured that it might be an issue of the servos being in wrong starting place (as the limbs had gone nuts) so I unscrewed all the limbs and powered Nybble up, which resulted in the servos turning a lot. After this I re-connected the limbs, checked the calibration (had to do a few minor tweaks) and voilà everything was back to normal.
Next I'll actually measure the servo voltage and tune it accordingly in order to save power.
Thanks!
I'm planning on trying to program Nybble directly with Raspberry Pi without the FTDI. The problem with FTDI is that the socket location is not really accessible when Raspberry Pi is mounted.
Arduino IDE can be configured to allow serial programming using the GPIO pins. However, what seems to be missing in Nybble-RPi connection (2x5 socket) is the connection to DTR. First I thought it was the RST pin, but that seems to be the the master reset for Nybble.
Before banging my head too much to the wall is there a ready made solution to this already? My thought for moving forward was to grab DTR from the FTDI connector and connect it via a wire to an arbitrary GPIO on the RPi. This GPIO can then be configured to be used for DTR by Arduino IDE. Maybe the question is whether the Nybble-RPi 2x5 socket connections RXD and TXD can be used similarly to TXO and RXI in FTDI port in order to program ATmega on Nybble? I didn't find the schematic for NybbleV0 and it is quite difficult to figure out the connections from the PCB layout pictures.
The FTDI female socket is supposed to be bent to the other side (belly) if a Pi is mounted. Check the animation on the configuration with Pi. That's why the socket has long legs. I agree that it's still inconvenient to get access to. With a Pi I'm assuming the code on Arduino is pretty done, and most of the commands will be sent through the 2x5 port.
The NyBoard is basically an Arduino Pro Mini with several integrated peripherals. The RXD and TXD in the 2x5 socket are 3.3V, while the FTDI is 5V.
I was going to test using a bluetooth FTDI for uploading sketches and communication, following this tutorial. I should be able to plug it in the FTDI female socket to get rid of the usb cable.
If you get any alternative configuration or customization, please open a post under the other categories of this forum. We'd love to see!
@Rongzhong Li I got the programming working directly from RPi using the GPIO pins. The only addition is another GPIO pin to be used for connecting Pi to DTR. Apart from that a few settings are needed for Arduino IDE setups (namely for avrdude). I'll make another post as soon as I verify the steps with a vanilla RPi Zero W, which is a lot nicer from current consumption perspective than RPi 3B+, which I used as the initial test vehicle.
I would also like to completely get rid of the Desktop environment and use RPi in headless mode. For this I still need to figure out how to compile INO files into HEX files without invoking Arduino IDE. Transferring HEX to Arduino is straightforward from the command line, but I didn't find a way to do the compilation into HEX without the IDE. If someone has the knowledge already then feel free to save me some time on this one!
@antti.havulinna Sounds great! I was thinking using one of Pi’s USB port to connect the FTDI and run Arduino IDE on Pi. Another plan was using a Bluetooth module for wireless uploading and communication. In that way it could have an mobile App for AI and control. Pi 3A+ Should be a good fit for your plan, considering the cost for accessories of Pi0. Pi 3A+ also fits the frame much better. Actually I’ll use them for my future development.
In terms of hex files, you can open a post in other categories on this forum. This thread is so buried in other assembly discussions.
BTW, I‘ve made a more detailed assembly instruction.
Wanted to post a couple of notes on software setup steps that differed from the instructions:
On Fedora 29, RPM install of the Arduino IDE -- the MemoryFree library wasn't found. Downloaded it from the link in your opencat.h file, and we were able to proceed.
When we open the serial monitor, answering 'y' to " Reset all joint calibration" (either updating instincts or not) runs through to the 'FINISHED' on line 112 (WriteInstinct.ino) but it never moves any farther. We were able to proceed through the MPU calibration steps only by selecting "n" and not resetting joint calibrations. It proceeded as expected to where we could enter the 'c' token and invoke calibration mode.
Happy Monday!
--L
MemoryFree is a probe for me to test the performance of the code. Maybe I should comment it out in the public version.
Just want to confirm, did you type 'Y' or 'y' in the serial monitor? It's case sensitive. And have you set the "no line ending"?
@Rongzhong Li We do have "no line ending" selected, and I was following WriteInstinct.ino along with the console output and followed the case in the 'if' statement -- which looks to be a 'Y'.
@ljr could you send a screenshot on the output till where your program stop to info@petoi.com?
can i get dxf file for parts please??
The design files are not public. Reason is stated here. I'll decide a good time to share when my life gets easier.
Hello! Congratulations for super project! I write you e-mail rzlib2l@gmail with questions. Can you receive and possible answer?
1. 3D model for small school CNC
2. Original board purchase with delivery
3. Personal question (only in letter)
Sincerely,
Ivan Eremin
School teacher robotocs line
CEO SdelSam.Ru
Hi, I started to mount a cat designed by me and I noticed in the jointmap images published of the differences in the lines joint index and pwm pin, I attach the photos, which is the exact one. Thanks Giuseppe
The differences are in the hind knee joints. the version with row {15,11,12,14} is the newest version. With this definition, the servos are connected in a more symmetric manner.
Where did you see the old version? I should have updated it.
I need help to trim the servo arms. My original arms are different from those in the instructions. See the photo attached.
Most of the servo arms on the model are trimmed from the cross shaped arm. I guess you are looking for the L shaped one on the neck.
Since there will be more unused straight arms, you can practice trimming on them first.
Thanks you for your help.
To see the google.doc on upside written. a cheap way is with a little burned knife, you could cut it easily instead of scissor somekind to trim.
Thanks you for your tip.
Good point. I‘ve added it to the instruction doc.
The google docs specifies installing Remote via the arduino library search:
"Go to the library manager of Arduino IDE (instruction: https://www.arduino.cc/en/Guide/Libraries), search and install Adafruit PWM Servo Driver, IRremote and QList."
This didn't work for me (no search results for IRemote). I had to go to https://z3t0.github.io/Arduino-IRremote/ and install it as a .zip library
What’s the version of your Arduino IDE?
@Rongzhong Li 1.8.9 on both Linux and Mac
@dave I am running 1.8.9 on Mac and both IRremote and Qlist show up in the library manager.
Make sure you select All (and not Installed or Updatable) and search for IRremote and Qlist.
I am trying to put the Nyboard onto the body and cannot find directions how to install it, specifically, which screws to use and from which direction to screw them in. I also have no idea where to put the sketch uploader. Is there a complete set of instructions or videos that explain that and how to attach the servos to the nyboard?
Hey, we are currently assembling the body. Was not 100% clear how to attach the Nyboard. Does this look correct?
No, it should be flipped.