Close

Choosing the Brains

A project log for Tote

Affordable spider robot

dehipudeʃhipu 01/11/2017 at 22:284 Comments

In the previous post I shared some of my thoughts about this project, and decided to pick a different development board than the Pro Mini that I have been using so far. Don't get me wrong, Pro Mini is great for all kinds of small and cheap projects, it's just that I want to make programming this robot as simple as possible. That, among other things, means using a platform that has a lot of computing power, not just enough, preferably one that has so much of it, that it can be used with a high-level language like Python. That also means something that has a USB socket.

The plan is to keep the Tote base PCB for its body, and keep the ATmega microcontroller on it, but make it only serve as a servo controller. Then, on top of it, have headers for plugging in the actual brains, and possibly for stacking additional shields with sensors and other peripherals. The board would only need connections for the power and the I2C pins, but since there is no standard for the pin layout (or, rather, there are lots of standards), I need to choose one -- history shows that trying to make it flexible and compatible with many different boards only leads to pain and suffering.

However, I still want this to be relatively cheap. It would be bad if the brain was more expensive than the ~$20 the legs cost. I first tried with the D1 Mini board, because it's my favorite ESP8266 board, it's small and compact, and it has a number of shields for it available. It's also easy to make new shields for it, and they can be very small, which makes them cheap on OSHPark. The board can run MicroPython and has WiFi build in, which makes it easy to use a remote console to program and debug it very conveniently. There is also a LiPo shield, which makes it possible to recharge the battery from the USB. So I spent some hours making this:

The base is just the #Servo Breakout for WeMos D1 Mini with 20 channels for the servos. I tried to make it easier to reprogram by including the ISP header. There are no Tote-specific markings about leg servos and so on there -- just channel numbers, so it makes it easier to see which servo is which inside your program, where you have to refer to them by numbers too (at least initially). This way there is no hardcoded magical knowledge necessary, and you can use the remaining 8 PWM outputs for other things, or use this board with a different legs configuration than Tote has.

There is also a power switch in there, but it's not connected to the rest of the board -- since I didn't decide about how it will be powered yet (you can have the LiPo shield or not, you can have some other charging/protection module, you can use a powerbank, etc.), I left it disconnected and only provided headers. I also added battery connectors on both ends of the board, for use with any battery holder. Unfortunately, I didn't know which one, so I just spaced them as far from each other as possible.

Then there are the headers for connecting the D1 Mini and its shields. I used alternating holes headers, so that you can plug it directly into the PCB (but you can also use headers). I connected the servo power to the 5V pin, to bypass the voltage regulator on the board.

Later, I found a tube of ATmega328 chips in the MLF package, and I was a bit bored, so I made a version for that, playing with Fritzing's curvy traces:

It was fun, but ultimately unproductive. Anyways, I liked the first board, so I ordered it at DirtyPCBs and went do bed.

I couldn't sleep that night.

Tossing and turning, I started thinking about different options I have for using this. Then the doubts crept it. If I use the LiPo shield, there will be a boost converter on the 5V line that powers the servos. Will it have enough power for all those servos? If not, can I somehow power the servos directly from the LiPo? I don't have a connection for that on the board, should I add it? What will happen if I short the 5V pin with the 3.3V pin on the D1 Mini? Will that damage the voltage regulator? Can I make adapters for the D1 Mini pinout for other boards? What if I wanted to use OpenMV, could that work? Which of the official D1 Mini shields would actually be useful? The temperature and humidity sensors? The button shield? The single WS2812B RGB LED? Will there be enough room between the robot legs to place the board under the body instead of on top? And so on.

Finally, at 5am I decided I'm not going to fall asleep anyways, so I could as well do some mock designs. What other ESP8266 development board do I know that has a lot of shields available? Maybe the Adafruit HUZZAH Feather? It's a bit expensive, but it does come with a LiPo charger built-in, the correct pin markings for MicroPython (the D1 Mini uses the NodeMCU markings) and generally has great support. There are also other Arduino-compatible boards with that footprint, and there is an M0 board that also runs MicroPython. And the shields somehow look more appealing.

So I decided to give it a try, and I came up with this:

Unfortunately, the Feather is a fraction longer than the 5cm of the Tote's base, so it sticks out about 2mm in front. That's where the ESP8266's antenna is, so I guess that's fine. I also made a couple of other decisions here.

Since there is no boost converter, only the charging circuit, I have no problems with servos drawing too much power -- I will just power them directly from the battery. I decided on the kind of battery to use -- I discovered the 16340 lithium batteries. Previously I knew the 18650, as they are commonly used for power banks, but those are too big for Tote. The 16340 is half that size, and there are convenient battery holders for it. So I added holes for mounting such a holder on the bottom of the board, and made all the connections for the switch and the charging circuit, etc.

I also decided to use one of the analog-only pins of the ATmega for battery voltage monitoring, since I wasn't using them anyways. It's the same voltage divider circuit I had in the previous Totes.

One more addition, is the double pin header on the front. I plan to add a female header to it, but soldered flat on the board, so that you can easily plug any sensor breakout boards into it, and they will be facing forward. Of course, you would need to make any connections with additional wires, but at least there is the mechanical support.

But something wasn't quite right. I had this nagging feeling that I'm forgetting something. I reviewed my notes, and then I realized. Tote is supposed to be simple to build without access to special tools like 3D printers or laser cutters. Or like reflow ovens, hot plates, hot air guns or very precise soldering irons, like the one I have. I have SMD parts on that board, and no beginner is going to solder that with a cheap soldering iron, without using any flux. This board is simply too complex for Tote. I need something simpler.

So I deleted the microcontroller and all the SMD parts, and started working again. I came up with something like this:

There is a number of changes. I used an ATmega chip in a DIP package, which should be easy enough to solder with a rusty nail. There are no analog-only pins in that version, so the battery monitoring went away. I connected the reset pin to the Feather's reset, so they share the pullup resistor there. And I'm going to use internal pullups for the I²C lines.

Next, I aligned all the headers with each other, so that it's easier to solder them all by inserting them into a breadboard for holding. I had some room on the sides, so I doubled the Feather's pins, making a prototyping area where you can connect those wires from your sensors, or whatever you want. I also disconnected the second ground pin from the ground, as I realized that it's connected to CH_PD on the HUZZAH, and I would get a short there. As a finishing touch, I added all the labels I could think of, and moved them to more convenient places. I also added ground fill and some silkscreen decorations that are not shown here, for clarity.

DirtyPCBs has this awesome feature, where you can change your order's gerber if it wasn't assigned to a panel yet. I checked my order, and it wasn't, so I quickly swapped this. I think this is the design I'm going to go with. It's easy enough to assemble even for a beginner, provides a lot of room for prototyping, and is simple and modular.

It's funny how bigger components, like the DIP chip and the Feather board, actually give me more room on the board. The DIP chip has much better spacing of the legs, so I don't need as much width for fitting all the traces. The Feather is narrower than the D1 Mini by 2.54mm, but that means you can fit two Feather shields (they call them Wings) on a 5x5cm PCB, and you have room for the servo horns on the sides of that base board. Finally, you can use a DIP socket and make the chip pluggable -- so you can easily replace it, and also reprogram it more conveniently.

I'm really excited about this board, and I think this is really the right direction for Tote to go in. The next step is code and documentation for it. If the prototype works well enough, I'm going to make it the default version in the documentation and only focus on this. Can't wait for the boards to arrive.

Discussions

davedarko wrote 01/19/2017 at 10:13 point

Thanks to this I'm now aware of the feather designs, they are quite something! Makes sense to go that way. 

Wouldn't it make sense to create a version where you can sell the soldered, programmed boards via Tindie or get in contact with adafruit or hackaday to create a small run kit / feather shield? I'm asking because there are probably more people out there that feel comfortable to buy a finished shield, rather than actually ordering 10+ PCBs and an AVR that they have to program first. 

Or maybe your feather sketch could include a 1kb Atmega8 firmware hex-file that will be burned on the AVR if it doesn't respond the right way on start. But then you might want to change communications from I2C to SPI, to keep it to one interface. This way you could also update your AVR through the ESP whenever there is a new version of firmware.

Last thought: I wouldn't dismiss the ISP / SPI port, even on the DIP version.

  Are you sure? yes | no

deʃhipu wrote 01/19/2017 at 11:26 point

Yes, I have some vague ideas about selling kits/PCBs, and this is actually one of the reasons I'm trying to make it easier to assemble -- you see, I don't want to have to solder all the kits I'd sell... With a DIP package, I can just add a pre-programmed chip to the kit, and let people solder it themselves.

Using SPI for the servo controller and automatically programming the chip is an interesting idea. I'm a little worried that it would use too many pins, though, and risk re-programming something else that is connected to the SPI bus.

I agree it would be nice to still have the ISP port in there, but I couldn't squeeze it in. All the pins are still available as the servo pins, though, so this is just a minor annoyance. You need to find the right pins on the ESP8266 board anyways, so finding the right pins on the base board is not such a big additional problem. Also, I want to provide the chip pre-programmed, and you aren't really supposed to change its code anyways -- it's just a servo controller. Still, maybe I will manage to fit an ISP socket in the next version of the board.

  Are you sure? yes | no

Jarrett wrote 01/12/2017 at 23:33 point

The phrase "internal pullups for the I²C lines" kinda triggered a red flag for me, and I think it might cause you some issues.

This thread:

https://forum.arduino.cc/index.php?topic=369003.0

Seems to indicate that the pull-ups are too weak to reliably hold the I2C lines. If it's too late to change your order, you can still give it a shot, though. And it's through-hole so it should be really easy to bodge some resistors in there!

  Are you sure? yes | no

deʃhipu wrote 01/13/2017 at 08:37 point

I am aware of those problems, and I'm prepared to add pull-ups if they will be needed. However, in my experience it works quite fine with such short traces in my other i2c devices, so I took the risk. There is the prototyping area on that board where I can easily add through-hole resistors if they prove necessary.

  Are you sure? yes | no