I have built and tested the first version of the Jetduino. Overall, I am happy with the results, but there are several issues that need to be addressed before it will be ready. In this post I will go over what I have discovered.
Figure 1 shows my layout for applying the solder paste for the SMD parts. I taped some old PCBs onto a large clipboard to hold the Jetduino in place, and then placed a mylar solder mask over the top of it so it lined up with the pads. You can purchase these solder masks cheaply from Polulu. Once I had everything secured and lined up, I added some solder paste and used a scraper from Home depot to get the paste to coat the pads. This is the largest board I have ever tried this with, and there were some issues with it. The DynamixShield pads in particular did not apply as cleanly as I wanted even after several attempts, so I had to try and touch these up manually. I think this may have been partially responsible for some trouble I mention later in the post. I have a few ideas on how to improve this process next time.
Once the SMD pads all had solder on them I used some tweezers and my magnifying glass headlamp to add all the SMD components by hand. It is quite tedious, especially for such a large board. It would be awesome if I had a pick-n-place machine to do this for me, but so far they are just out of my price range. After all the parts were placed I used a waffle heating skillet from Target to reflow the solder paste onto all the SMD parts. The weights in figure 2 are to try and make sure all the parts of the board maintain contact with the heating surface. For my smaller boards I never had any problems with this method. However, this was such a large board that it took longer to get everything to melt. This is another potential concern I had with this board.
Once the SMD reflow was done I had to test each connection to look for jumpers and such, and fix anything that was discovered. Then I started soldering on all the through-hole components. The final board is shown in figure 3, and figure 4 shows the Jetduino mounted on the Jetson with a 2.5" HD and the Arduino Due. I am using some really long standoffs for now because that was all I had. I have ordered some 50mm standoffs, but they have not arrived yet. This will allow me to get the Jetduino closer to the Jetson.
I was also able to mount the 2.5" hard drive on the underside of the Jetduino with some small standoffs as shown in figure 5. If you are not going to use the prototype area for anything you could mount this directly without any standoffs, but if you will be soldering stuff in that area you will need some small standoffs to keep the HD away from the soldered ends. I have also ordered some shorter SATA cables for connecting to the HD, but they have not arrived yet.
Figure 6 shows the ribbon cable connecting the Jetson to the Jetduino. The ribbon cable is a standard 40 pin cable for the Raspberry Pi GPIO, but you can also make one by hand if you want so it is the exact size you need. This one is a bit long, but it is convenient in that it can be ordered directly from numerous places.
On the Jetson side, I was able to test all the GPIO, serial, and SPI lines at both 3.3v and 5V to verify that they worked correctly. I was also able to hook up several different Grove and RobotGeek modules and test them as well. This included an RFID tag reader, a GPS module, a XBee socket for wireless serial communications, and several digital modules. I plan to have some small blogs and YouTube videos over the next few weeks showing how to use these types of modules with the Jetduino. So stay tuned!
However, not all of the Jetson connections worked as expected. The biggest problem concerned some issues with getting the I2C lines running correctly. When I had the connections set to 3.3V it worked like a charm, but when I set it to convert to 5V then my Jetson would no longer boot up! It would get stuck in the boot process and stated that it was not able to communicate with some I2C power devices. I have tested the level shifting circuitry pretty extensively with the DynamixShield board I built, and it works without any issues with the I2C systems there. I did some preliminary breadboard testing of the Jetson circuitry before hand, but all of the I2C tests I ran on it were at 3.3V. When I went back and tested the breadboard version at 5V it had the same boot up problem. This was an oversight on my part. If I had tested the breadboard version more extensively I could have identified this problem earlier.
I messed around with this for several days trying various things to get it to work, but to no avail. At this point I am not sure why the GTL2010 circuit is not working for the I2C on the Jetson, when the exact same circuit works fine everywhere else I have tried it, but I have decided to move on to a different approach. I was using the GTL2010 chip primarily because it has a very fast rise/fall time that is needed for high speed SPI communications. The I2C lines will never get close to this speed though, so that chip is not really required there. I did some more breadboard tests using the BSS138 chip that several others have previously used with the Jetson, and that worked great at both 3.3V and 5V. So in version 0.2 of the Jetduino I will be switching out the I2C lines to use that MOSFET instead of the GTL2010. The other lines will still use the GTL, as it was only the I2C signals that were causing a problem at 5V, and I need the high-speed switching for the SPI lines. One other benefit to this approach is it will allow me to have all three I2C lines configurable for 3.3 or 5V. Previously, I only had PWR and GEN1 setup this way, and GEN2 was stuck at 3.3V. One downside though is that it will require me to get rid of all of the external level shifter connections that were available on this version of the Jetduino.
Surprisingly, the part that caused me the most problems was the DynamixShield section. Most of it worked fine, but there were a few of the IO lines that did not behave. They were either stuck on low or high no matter what I did. I tested all the traces, and it all looked like it was connected up correctly, but they just did not work. My current theory is that I heated the the board too much when I was doing the reflow and damaged one of the GTL chips. I have built about 10 of the stand-alone DynamixShields now, and they have all worked fine and never displayed this behavior before. I started the Jetduino using the DynamixShield as a base, so there were no changes to its schematic or board layout, and the only direct connection between the DynamixShield and Jetson sections is the ground plane. So it seems likely there is a something wrong with how I built this one. Those problems aside though, the other parts of the shield worked fine. I have successfully tested the other GPIO, regular servo control, Dynamixel smart servo control, serial and I2C lines.
However, another annoying thing I discovered with the DynamixShield section is that I did not take into consideration how far out the Arduino Due edge extends. As you can see in figure 7, it is out just enough to block the standoff between the Jetduino and Jetson. So I will need to move the DynamixShield layout down by 5mm to fix this problem.
In this version of the board I had two power regulators. One is a 5V regulator for the USB hub. I will test this with the Jetson USB hub as soon as I get it. The second regulator provided 12V @ 3A to power the Jetson itself. I was able to test this with a fully charged 3C 11.1V LiPo battery. When fully charged it has a voltage of around 12.6V. The regulator itself needs the input voltage to be at least 0.4V above the target voltage, so it did provide the required 12V, and was able to power the Jetson and the hard drive. However, once I started trying to actually use this, it quickly became apparent that I had not thought through this whole regulator business enough. If you use a 4C LiPo battery it will range from 16.8 to 12.8V. So it will always be far enough above 12V that the regulator will work to provide a consistent 12V to the Jetson. However, I want the Jetduino to be flexible enough to accept a wide range of battery voltages. For example, I typically use either 3C or 2C batteries. I use 3C, 11.1V batteries so I can power Dynamixel AX/MX servos, while the 2C, 7.4V batteries are very useful for powering most standard servos. The 3C batteries start out above 12V when fully charged, but will go down below it when they are getting low, and the 2C batteries never get close to 12V. So this presents serious problems for trying to use a 12V regulator to power the Jetson. Another concern I have is ensuring that the power supply going to the Jetson does not have a lot of noise on it due to the battery also driving the motors.
Because of these issues I have decided to use the open source Power Distribution circuits for the MyzharBot that Walter Lucetti generously made available. To allow this to fit I am going to increase the size of the board on that side by about 10-15mm, so it will overhang the Jetson just a bit. I plan to reproduce the MyzharBot power board as closely as possible in that space. The power distribution circuit has a 3rd order PI filter and a transient voltage diode to help ensure that the power going to the digital logic of the Jetson is isolated from the noise generated by motors and servos, and to prevent voltage spikes from damaging the digital circuits. I also plan to replace the 2.1mm power jack I was using before with several screw terminals. There will be four power terminals for the raw, unfiltered battery, and four for the filtered power. If you are using a 3C LiPo battery you have the option of using this filtered output to directly power the Jetson. You will not be able to use an external hard drive in that case though.
To allow the Jetduino to support a variety of different battery voltages I am also going to add holes directly above the power filter circuits to allow you to easily mount a step up/down DC-DC power converter, like the one shown in figure 8. I have tested this one and will be using it for the Jetduino. It will allow you to run wires from the filtered power to the converter using the screw terminals, and get nice, clean 12V out regardless of the battery voltage you are using. This give you two options for powering the Jetson from the Jetduino. You can use a 11.1V battery and power the Jetson directly using the filtered battery power, or you mount the converter onto the Jetduino and use its 12V output to power the Jetson from almost any input battery voltage. This will make the system much more flexible.
The Arduino Due has 12 analog to digital converter (ADC) lines. One thing that occured to me while testing the Jetduino is that there was currently no way to perform ADC for the Jetson itself. Because a lot of the Grove and RobotGeek modules are actually analog modules, this really cuts down on what types of modules you can use with the Jetduino. Since I decided to extend the Jetduino a bit for the power filter circuits anyway, I decided to add a 4 channel, 12 bit ADC as well. I will use the ADS1015 chip. It will have two Grove connectors and a 4 row RobotGeek header. I plan to add it to one of the I2C lines, so when the Jetduino is plugged in you will able to query it for the voltage value for any of the 4 channels. This will make it possible to use the analog modules directly with the Jetson.
I am using a WIFI/Bluetooth module in the mini-PCIe slot that is available on the Jetson. The one I have requires two antennas like the ones shown in figure 9. At the moment, I just have these kind of sitting on the table. It occurred to me that since I had a little bit of space left from the extension of the board, it would also be great if I had some mounting holes for those antennas. So I plan to add this to the next version of the board. This will provide a convenient mounting location for these antennas for your robot.
Another issue I discovered with the Jetduino is with the startup/shutdown sequence. Unlike a traditional microcontroller, you should not simply flip the power off on the Jetson. It is an actual computer, and this can cause corruption of the file system if you do not shut it down nicely before cutting the power. To handle this issue, in the next version I am placing headers for buttons that go to the ONKEY_L and PMU_RESET_L lines of the Jetson. I am also adding LEDs on the Jetduino to notify when battery power is on, and when the Jetson is on. Each of these LEDs will also have a header to allow you to connect up LEDs that can be run to the outside of your case so they will be visible even when the Jetduino is enclosed. You can configure the Jetson so that the on button causes it to startup, or to shutdown nicely if it is already on. This will allow you to use the following sequence to startup and then shutdown the robot cleanly.
Here is a short recap of the major things I plan to modify for the next version.
My current plan is to make these changes to the board as quickly as I can and send it off for production. While the new prototype boards are being built I plan to work on several new blog entries and YouTube videos demonstrating how to use the current Jetduino version I have. Once I get the new boards I will build and test them. My hope is that this next version will be close to production ready. I am sure there will still be some minor tweaks, but my goal is for it to be close enough to start the crowdfunding campaign and share a few prototypes with some others at that point. So please stay tuned!
Please subscribe to my Newsletter!
NeuroRobotic Technologies is dedicated to creating the next generation of intelligent, adaptive robotic systems by building autonomous controls systems that mimic the brains of real animals.