This is how to program the ESP8266 on the blimp PCB (note that the joystick uses an Adafruit Feather ESP32):
Shown here is the pinout for the ESP8266. To program it, the process is to hold D0 low, while hitting reset. D0 stays low while programming. I use a tag-connect cable PN TC2030-FTDI-TTL-232R to program the ESP8266.
Adafruit builds the programming circuit into their ESP8266 Feather board with a latching circuit (transistor). Their Huzzah board has two switches that go to Reset and D0 which you manually toggle in order to program.
These examples are excellent, and useful. However, the blimp has weight constraints so there is no room for switches or transistor circuits.
To program the board, I solder temporary wires onto the reset pin (pin1), and D0 (pin 12).
It also helps to have an extra ground wire dangling from somewhere- you can use an alligator clip from BGND to D0. Sometimes I desolder the battery and use the benchtop power supply to power the board (sometimes called the target) while programming.
There's a lot going on in the above image. This is how to connect the board:
Benchtop power supply to anywhere between 3.4 and 4.2 V is connected to BV and BGND (B stands for battery).
Alligator clip from BGND to D0.
Tag-connect cable from USB on computer to tag-connect pins on board.
On the image below, I'll show you how the tag-connect jig works. You don't need a jig at all, but the holes in the white acrylic that line up with the tag-connect holes works quite nicely. A second person to hold the cable works quite nicely too ;)
Now that you're connected, here are the programming steps.
Attach D0 to GND (alligator cable)
Touch reset to ground. The black wire on pin 1 should be long enough to touch either the alligator cable or GND somewhere else. There is only one GND on the board (no separated GND planes).
When you touch reset, you should see the blue light on the ESP8266 blink. If you do not see a blue light, make sure that you've turned the switch located at the top of the board on.
Open the Arduino IDE and load in the blimp server file. Your Arduino folder should look like this:
If your folder is organized like the above, when you open the Arduino file Blimpy_Server4.ino, it will look like this:
You can also put the file into one long thing rather than breaking it up. I find it easier to stay organized with tabs for different sections of code, but YMMV.
Please note: you will need to add in your own SSID (line 8) and password (line 9). I use a local router which isn't connected to the internet (best) but you can use any router.
SETTINGS FOR ARDUINO UPLOAD
Tools > module > board: Generic ESP8266 module
Port > tag-connect, will have a few numbers
Programmer >Arduino as ISP
Once you've got all of that set up, you can upload! You'll see a line of dots appearing on the bottom of the Arduino IDE until it reaches 100%.
The above directions are just for the blimp board itself (server). You'll need to upload the client to an Adafruit Feather ESP32, but that's quite straightforward.
When I last left this project the great things were:
It flies and the weight issues are over
Up/ Down/ forward controls perfectly and the blimp moves clean
It flies! It flies It flies!
The bad things were:
There's a power issue. When the motors turn on, they suck power, causing the regulator's output to sag. This should be fine, because regulators are supposed to REGULATE, but this one takes too long to recover (like 5 uS) and the ESP loses connection. I had added a large capacitor at the regulator input which helped a lot, but didn't cure the problem entirely.
Left/ right do not control nicely at all, and after a number of experiments with rudders, I think it's because of the overshoot with on/off controls.
I made a new board, changing the layout slightly so that the power traces are closer to the source (battery). I'm hoping that this results in more stability.
I also added a PWM output on GPIO0 and GPIO2. For those unfamiliar with the ESP8266, GPIO0, 2, and 15 need to be in a high or low state on boot in order for the program to run. It's actually really easy to make these GPIO work and on the bench this works very well. I anticipate challenges when rebooting while in the air.
I still have a couple of issues to work out, and one of them turned out to be a huge bummer.
Two of the motors (both on same driver #1) spun at slower rpms than the one (on second driver #2).
I looked at the driver chip under the microscope and noticed that I'd soldered it slightly off the pad so that the junction provided half a trace-width (6 mil not 12 mil). Side note: I cannot find where the trace units are in Eagle. I assume since my board is in inches, the traces are too...
Fixed this by removing and re-soldering the chip
Now that all the motors draw the same current (about 350mA max each at 3.8V - 4.0V), new power problems arose. I noticed that the ESP kept resetting which indicated that the voltage was dropping below 3.0V for some short length of time (5us).
Last night I worked with Ed Nisley, a great friend and an engineer with better tools than I, to discover what exactly was going on. Ed has a Tectronic device from the 70s which coupled with a hall effect sensor converts the signal to a current value to be viewed on a scope. We looked at the current (in yellow), which fortunately doesn't dip under load. However, at the point of reset, with all three motors running (one shown here in purple) + the ESP8226 reaching out to WiFi (1.2A) we observed a voltage dip down to 2.6V at the ESP8266 supply/ buck-boost output (green).
This could be because the back emf is going back into the voltage supply due to such long traces on the board. A little hard to see, but the highlighted trace is the battery supply trace.
I'll recreate some of this test and post scope pictures later. My plan to troubleshoot is to solder three fat wire paths over the board: a path directly from battery supply to buck boost converter + battery supply to each driver.
For now, this is a pretty big bummer as if this is the case, I'll need to redo my layout to put the buck-boost (top left) converter much closer to the supply (bottom middle).
I'm going with a joystick for the main controls because everyone knows how to use one. A joystick is primarily used for direction and speed, it should be received well as a participant interface.
I need 6 commands minimum (up/ down/ left/ right/ forward/ back) and the joystick that I chose is made up of 4 microswitches, so only 4 controls. I love arcade buttons, so I decided to add 2 of those.
Inside of the controller is an Adafruit Feather (has an ESP8266 on it) and a battery.
I used Inventor to model this. Already realized that this rev 1 is missing holes for the battery charging and a reset switch. I also should have added screw holes on the bosses to make them less hollow.
I can fix these post print though :D
and started printing last night. It looks good so far!
I'm pretty excited. The blimp flies and is as controllable as a large envelope full of helium in a drafty house can be ;)
The blimp shown here is 24" diameter, 8" high.
So what's different about this revision and why does it fly?
Motors are spinning super fast and drawing about 200mA each.
New motor drivers provide motors with battery voltage, but control voltage is separate, allowing for motors to get maximum power.
Board is 0.8mm thick and cut the weight of the PCB in half - thank you @oshpark!
Buck boost converter is slightly on the edge with allowing 1.3A, but is much more capable than the voltage regulator in earlier revisions.
Code has been revised so that there is no lag between control switch and motor.
I had a memory leak in which the ram was spinning down and causing the connection to drop. Turns out the libraries (2.4.1) provided for ESP8266WiFi have a bug. A down rev (2.4.0) fixed that problem, but it still took me a day to figure it out.
Evaluate battery draw with special wattmeter designed to look at single cell draw
The hardware is there to measure battery levels, add this to code and send signal when low.
There are still connection loss issues, hopefully adding error handling to code will address this.
FUN! Design controller for joystick and buttons. I'm envisioning a figure eight so that it fits nicely in the hand.
Test with 24" blimp when that arrives
Add ESP reset switch or button to gondola hardware
Add ESP reset switch of button to joystick hardware
I designed an intermediary board to test out a new buck-boost voltage regulator, new motor driver, and a tag connect cable. For those of you in the ESPxxx forum, this is v2 intermediary board with EN tied to VBATT.
I intend to run the board with a single cell Lithium battery no less than 3.6V.
For testing, I am using a benchtop power supply (adjustable V, 3A) or a wallwart (5V, 1.6A).
The new voltage regulator, ADP2504, can provide a current output (see diagram on page 6) of over 800mA at VIN 3.6V. The inductor is rated for 700mA. Capacitors are X5R type.
Screenshot of ADP2504 schematic::
So far, I have populated the board with the ADP and the ESP-12S.
These two weird things are happening:
With power input from benchtop > 4.6V, ESP is able to program and hold the program. Under 4.6V, it is iffy, meaning that the program does not run all the time. Same (expected) results with wallwart at 5V.
Current draw after ESP reset is less than 60mA, but sometimes (often at lower voltage) the current draw jumps up to as much as 210mA.
Does anyone have an idea why this could be happening?
UPDATE: benchtop power supply is wonky and gives inconsistent readings, shuts off randomly, and probably puts out inconsistent power. My best guess is that its constant current output is stuck on something not desirable. I've had it for over 8 years, so....
To add to the gotchas:
New Macbook Pro is incompatible with anything FTDI (seriously WTF)
Fluke 16 measures a full 0.1V higher than the benchtop - no clue what is accurate now.
3VDC wall wart with indecipherable 2008 cell phone end now chopped off puts out something definitely not 3V!
Brand new air gun is making a horrible death rattle.
I decided to go the route of a redesign on a couple of components. It was obvious that the voltage drop in the original voltage regulator was causing the regulator to be a steady 3.3V, especially as the single cell battery dropped below 3.7V. This caused the the ESP to reset occasionally.
I've chosen an Analog Devices buck-boost regulator to replace the AP2112. Yes it costs $1.57 more than something else, but this one has a lot of documentation, and is more likely to work the first time.
After @Ted Yapo commented on my last log, I also realized that the fan motor driver I chose has a high voltage saturation need on the two outputs, limiting the power actually available to the motor itself. I've used fan drivers for other projects and like the simplicity of the part, but I redesigned the board to include an actual brushed motor driver.
I made a square, somewhat spread-out PCB to test the new features, it's an intermediate step before putting all these new parts on the board and having no space to probe.
I sent it off last night to @oshpark's super swift service. It includes:
Tag Connect layout! >> this one I'm really excited about
New buck-boost >> already realized I forgot to put the thermal vias in
New motor driver >> only one, so the the buck-boost won't be getting that hot anyway :)
On-off linear switch (replaces annoying momentary)