Yearly Archives: 2017

Wall-E2 battery charger module testing, Part II

Posted 22 December 2017

After having worked out (hopefully) all the bugs in the Arduino Uno program and associated test hardware, I have moved on from testing just one of the Adafruit PowerBoost 1000C   charging module in isolation to testing the entire 2-cell battery pack system, albeit with the smaller 2500mAh LiPo’s rather than the full-up 18650 stacks.

Full-up test of the 2-cell charging system using 2500mAh LiPo cells

Full charge of 2500mAh cells

After several days of testing, I never really got consistent results with this setup – I seemed to be always chasing intermittent problems of one sort or another.   Then I finally figured it out (I think) – the problem wasn’t my setup, it was the proto plug-board I was using.   This board was a cheap no-name plugboard I got off eBay, and apparently I got exactly what I paid for! ;-(.   So, I reverted to my tried-and-true (but HUGE!) AP Products A.C.E. 236 plugboard that I have had around the lab for a couple of decades, at least.   When I transferred the setup to this plugboard, everything started working better.   In particular, the battery charging current went from about 0.5A to about 1.5A – a much more believable (and practical) figure than before.   Here’s the new test setup.

New test setup with my trusty AP ACE 236 plugboard. Note charging current shown on current meter

After getting the hardware problems squared away, I started getting reliable charge/discharge cycle data, as shown in the curves below

Two complete charge/discharge cycles. Note the time axis is in minutes here

The next step in the process will be to replace the PKCell 2500mAh flat-pack LiPo cells with the 6800mAh pack (two series banks of 2ea Panasonic 18650 3400mAh cells in parallel) to be used in the robot.

26 December Update:

Chg/Dischg testing with the Panasonic 18650 packs from the robot.

As shown above, I switched out the 2500 mAh flatpacks for the Panasonic 3400 mAh cells from the Wall-E2 robot.   Initially I was somewhat disappointed with charging performance, as I was only seeing about 1 – 1.5A initial charge current for both 6800 mAh cells, instead of the 2+ A I expected to see.   Eventually I narrowed the problem down to stray resistance in the testing circuit itself, through the plugboard, the plugboard wiring, and the relay being used to switch charging power to the battery module.   When I bypassed these elements and connected the external MeanWell 5V power supply to the battery module terminals, the max current increased to slightly over 2A, as expected.   This is actually very good news, as it means that the resistance of the PCB traces supplying power to the PowerBoost 1000C modules is low enough to not materially affect the max charging current – yay!

Still, even with the max charging current up at 1A/cell and with the PB 1000C’s PROG3 charge termination resistor reduced from 100K to 33K, it takes every bit of 10 hours to charge the battery pack from 3V to 4.2V, as shown below.

Panasonic 18650 6.8AH robot battery pack. Initial charge rate approx 1A per 2-cell parallel stack

Panasonic 18650 6.8AH robot battery pack discharge, 15 ohm load

28 December 2017 Update:

While testing these battery packs for charge and discharge performance, I came to realize that I had over-complicated the test circuit.   The original test circuit is shown below:

This circuit uses a relay to switch +5V power to the charger modules in the battery pack module, and also to switch the load in and out.   As I gained more experience, I realized the relay contact resistance was substantially reducing the charge current, so I wired +5V directly to the battery pack; this worked because the Arduino running the test circuit keeps the battery pack parallel/series relay disengaged (meaning the battery cells are arranged in series) until the load voltage drops below a set threshold.   So, this realization resulted in the following updated circuit schematic.

As shown above, I added the connections to the battery charger module, and the LED displays.

However, I have now come to realize that the other half of the relay isn’t necessary either, as the ‘Robot +’ line isn’t connected to anything until the test manager computer (Arduino Uno) recognizes the end-of-charge condition and changes the Coil Enable signal from HIGH to LOW, disabling the battery pack’s internal relay and changing the battery configuration from parallel (CHARGE) to series (RUN).   So, now the test circuit can be reduced to just the LEDs and the load resistors, as shown below.

While I was making the other changes, I also cut the load resistance in half, from 15Ω to 7.5Ω to more accurately simulate the actual robot motor loads, and (finally!) managed to capture a complete discharge cycle, as shown below.

Complete Robot Battery Pack Discharge Curve, 7.5-ohm load.

The 7.5Ω load for this run provides a good approximation for the maximum current drain experienced by the robot under most operating conditions, so it is now safe to say that the robot should be able to run at least 6 hours on a charge, and that a full charge will take about 10 hours.   So, the robot will spend more time on the charger than on the road, but that’s life in the robot lane.

Stay tuned!

Frank

 

 

 

Wall-E2 battery charger module testing, Part I

Posted 15 December 2017

For the last couple of months I have been working on the battery subsystem for my Wall-E2 autonomous wall-following robot.   Along the way I upgraded the robot chassis to provide more room for the on-board charger & battery pack, and created a PC board design for the module that charges the 2-cell LiPo stack in parallel and then switches to a serial configuration to run the motor.   This post describes the first part of a testing program to validate the performance of the Adafruit PowerBoost 1000C charger module, and the idea of switching seamlessly from charging to powering a load.

By way of background for this post, I ran into some difficulties when I tried to integrate the full-up 2-cell, 2-PB1000C battery pack/charger combination into my Wall-E2 robot, and troubleshooting the problems using the complete operating system software proved to be somewhat tedious, I decided to start at the other end with a very simple test program running on an Arduino Uno, and a single PB1000C charger.

The Arduino test program is very simple; when it is initialized, it checks the battery voltage to see if is above or below a preset threshold.   If above, it energizes a DPDT relay to connect the battery to a 15Ω load; if below, it de-energizes the relay, which disconnects the battery from the load and also connects 5V to the ‘USB’ (5V input) terminal of the PB1000C, thereby charging the battery.   After that, the program alternately switches the battery between the load and charging states, recording the battery voltage every four seconds.

Battery Testing Hardware

Arduino Uno and test circuit.   Note the yellow ‘charging’ LED on PowerBoost 1000C shown at middle right

After working the inevitable bugs out of the Arduino program, I got some reasonable battery cycling data, as shown in the following plots.   The battery used in all these tests was a PKCell LP795060 LiPo cell, rated for 3.7V and 2500mAH.   It is rated for about 5hrs at 0.2C discharge, but I was only seeing about 3hrs at 0.1C, most probably because I was terminating the discharge at 3.4V rather than the 2.75V used in the discharge tests.

Two complete chg/discharge cycles

Chg/Dischg cycles using PB2 (same battery as previous tests). Short cycles may imply battery wear-out

After the last test above, I was concerned that either the PowerBoost 1000C was not operating properly, or the battery itself was failing, or both.   So, I changed the discharge termination threshold from 3.4 to 3.0V to be more consistent with the 2.75V cutoff used by the battery manufacturer.   After making this change only, I got the following plot

Charge/discharge cycles after changing the discharge termination threshold from 3.4 to 3.0V

As can be seen from the above plot, the discharge and charge times were extended dramatically.   Discharge (at approximately 220 mA or 0.1C) took well over 3hrs, and charge took about the same amount of time.   So, it appears that both the PowerBoost 1000C modules are still working OK even after the abuse I put them through by plugging them into a PCB with wiring errors ;-).

 

 

 

Wall-E2 Battery Charger PCB Part II

Posted 1 November 2017

In my last post on this subject, I described my efforts to create a PCB for the charging module in my wall-following robot(s).   I showed the hand-wired original, and the first (of three, so far) PCB versions. My circuit-checking skills are a bit deficient, so I keep finding ‘issues’ with the PCBs I received from Bay Area Circuits.   It’s not their fault as they produced PCB’s  exactly like I told them – apparently they don’t know about the RDM (Read Designer’s Mind) checkbox on their order form! 😉

In any case, the major problems I discovered on the first two revs are, kind-of, understandable for a PCB newbie like myself; I had the JST battery connectors switched, so Batt+ showed up on the PCB as Batt-, and the IRF-510 transistor holes were reversed as well.   A bit of cut-and-jumper work solved the first problem, and simply turning the transistor around solved the second one.   However, I really didn’t like leaving that as the ‘final solution’ so I splurged another $30 on a third rev with these problems fixed.   These boards have not yet arrived, so in the meantime I continued testing on the current setup.

As the photo below shows, the finished and populated PCB has almost exactly the same dimensions as the hand-wired perfboard model.   Since the perfboard version had several components mounted on the wiring side, arriving at the same dimensions with everything on  one side is a definite plus!

comparison between the hand-wired perfboard version and the PCB

After getting the PCB populated, I did some electrical testing, and somewhere along the way I think I managed to damage the boost regulator chip on one of the PowerBoost 1000C modules.   And this is where I discovered my  next  major booboo – I had hard-wired the PB1000C’s to the PCB, and so now I couldn’t replace the damaged part without destroying the part, and probably the PCB too – oops!

07 December 2017 (Pearl Harbor Day) Update:

I received the latest (and hopefully, last!) batch of battery charger module PCB’s from Bay Area Circuits a week ago, but have been too busy with other things (mostly dealing with the new V3 robot chassis) to do much with it. So, today I started populating and testing the new charger module.   As I mentioned before, one of the bigger mistakes I made on the previous version was to hard-wire the PowerBoost 1000C’s onto the PCB, making it almost impossible to replace if it failed (and, as I learned from the Adafruit forums they can be easily damaged if they are powered up without a battery attached).   So, this time I soldered female headers onto the PCB and male headers onto the charger modules, making them easy to replace if needed.

New charger module with some test batteries attached

Charger module showing PowerBoost 1000C header arrangement

The next step will be to test the module’s ability to manage the robot’s battery stack.   I plan to simulate the robot load with a 500 mA resistive load, and simulate the actual battery stack with the two smaller 2500 mAH batteries shown in the above photos.   I’ll simulate the robot with an Arduino, programmed to print out time-stamped readings of the robot power voltage (actually 1/3 of the robot power voltage, but what’s a scaling factor between friends?).

Stay tuned!

 

 

A New Chassis For Wall-E2, Part II

Posted 17 November 2017

In my ongoing quest to give Wall-E2 a bigger/roomier ride, I am continuing the process of moving all Wall-E2’s stuff to the new chassis, and modifying the charging station to work properly with the new wide-body model.

Second Deck Sensors:

Even with the wider footprint, there’s not enough real estate to easily mount the three distance sensors (LIDAR for forward distance, and acoustic for left/right distance).   I could shoe-horn it all in, but it would look messy and would leave all Wall-E2’s electronics exposed to potential damage from furniture, cats, careless humans, etc.   So I decided to transplant the second deck, complete with all the sensors, to the new chassis.   This looked to be a real PITA, until I let go of the notion that the 60mm stand-offs had to remain in the same locations. Once I did that, things got a  lot easier 😉

IR Homing Module:

This was a straightforward transplant, especially since all the detection/demodulation is being

3D printed spacers for the motor controller PCBs

done by a Teensy 3.2 physically attached to the sunshade. All I had to do was drill the mounting   holes, add two more press-fit nuts, and screw on the module.

Arduino Mega Processor and Motor Controllers:

These two items came over as a group, as that way I didn’t have to disconnect anything – my kind of transplant!   However, while I was at it, I decided to neaten things up a bit by printing spacers for the motor controllers; this isolates the underside of the PCBs from the metal chassis, and provides a nice flat surface for mounting the controllers to the chassis with double-sided tape – a win-win-win (the last ‘win’ was because I got to use my 3D printer some more!)

Arduino Mega processor, motor controllers, rear taillight assembly, and IR homing module transplanted

Charging Station Modifications:

I was  not  looking forward to modifying the charging station to work with the new wider chassis.   The charging station electronics assembly is non-trivial, and it would be a real PITA If I had to reprint the frame and transfer all the electronics. Fortunately for me, this turned out not to be the case.    By a happy coincidence, the distance from the right-hand guide rail to the center of the power receptacle was exactly the same for the new chassis as for the old one, so all I had to do was re-position the left-hand rail to accommodate the wider tread spacing. Well, there was one minor glitch – the charging station has two physical stops, and the one that mated with the left-hand wheel guard on the old chassis now didn’t hit anything, so I had to print a small 5mm thick spacer and double-sided tape it to the front of the existing stop.

Closeup of the spacer for the right-hand charging station stop

Front view showing left and right charging station stops (with spacer added to right one)

18 November 2017 Update:

I’ve got almost everything transplanted over now, as shown in the following photos:

Side view without the sensor deck, showing that all modules are in place

Side view showing the sensor deck in place.

end-on view showing the difference between the old and new chassis dimensions

There’s still a ton of work to be done; The latest version of the charger PCB still hasn’t arrived from Bay Area Circuits, so I still need to do all that, and then wire the finished module into the battery compartment. Also, I’m having to redo the front bumper guards, as I have found they are somewhat fragile due to the way in which they were printed – bummer!   However, it shouldn’t be  too long before I can take the new model out for a spin! ;-).

Stay tuned!

Frank

 

 

 

A New Chassis For Wall-E2, Part I

Posted 06 November 2017

Back in May of this year I came to the conclusion that I was never going to get my new four-cell battery pack (4ea 18650 3600mAH 3.7V LiPo cells connected as 2ea 7400mAH 3.7V stacks) and its companion charger module to comfortably fit into Wall-E2’s current chassis.   It all fits, but only with a considerable amount of pushing and shoving which has invariably resulted in damage to something – a connector, a wire, or something else vital.

Bottom side view of 4WD robot showing battery packs and charging module

Bottom rear view of 4WD robot showing battery packs and charging module

So, I spent some quality time online looking for a new, larger home for Wall-E2, and found this chassis

Lightweight 4WD Drive Aluminum Mobile Dolly Car Robot Platform for Arduino

This chassis has an internal cavity width of about 14cm compared to 10.5cm for Wall-E2’s current ride.   This extra inch or so make all the difference in the world for comfortable installation of the battery pack and charger.

After getting this chassis on order, I basically forgot about it while I was working on the square-wave modulated IR homing project.   Then when my grandson Danny and his family visited in August, we dug out the kit and assembled it.   Danny wasn’t all that impressed with the quality (well, neither was I, but I didn’t expect all that much for $30 either).   After looking at both chassis (Wall-E2’s current ride and the new one), Danny suggested that maybe we could transplant the motors from the new chassis into the old one and get enough additional space from the different form factors to solve the battery problem.   At the time I pooh-poohed the idea, and put the new chassis back on the shelf to be forgotten again.

However, after finishing up the IR homing project last month, I decided I would actually try this trick and see what happened.   So, I laboriously swapped all four right-angle motors from the new chassis to the old one, and … RATS!!   As the photos below show, no real change in the available room for the charger/battery pack combination.   Well, at least I tried ;-).

So, now I’m back to swapping chassis (wow – plural form of ‘chassis’ is ‘chassis’ – go figure) instead of motors.

One of the major shortcomings in the new model was the cheapness of the threaded holes in the frame components.   The frame metal is so thin that instead of drilling and tapping the material, the holes were punched in a way that left the punched-out metal in the hole, and this material was tapped with the machine thread.   Needless to say, this lasted for about one (or fewer) screw/unscrew cycle before stripping out – bad design!.   Fortunately I knew how to fix this problem, with the help of McMaster-Carr.   I went to their site and ordered a bunch of press-fit nuts (also called PEM-nuts for historical reasons)

Press-fit nuts for my new robot chassis

In case you have never dealt with McMaster-Carr, they are incredibly quick.   I normally tell people that once I click on the ‘order’ button, I get up, walk to my front door, open it, and get hit in the chest by the shipped order! ;-).

Once I got the nuts, I replaced all the threaded holes on the new chassis with these wonderful little gadgets.   I used a #16 number drill to drill out the holes, and pressed the nuts in the new holes with a pair of cheap gas pliers – done!

As seen below, there is a  lot more room in the new model

In fact, there is so much room that now I have to figure out how to keep the batteries and charging module from sloshing around in there.   Fortunately I have a fertile imagination, TinkerCad, and a 3D printer – so I designed and printed up a battery box, and a prototype stand-off design for the PCB, as shown below.

The next part of the puzzle will be to figure out how all that stuff (IR Homing Module, laser and ultra-sonic distance sensors, motor controllers and the main controller) is going to fit on the new chassis.

Stay tuned!

Frank

 

 

 

Adafruit PowerBoost 1000C Charge Termination Threshold

Posted 01 November 2017

At the conclusion of my ‘field’ testing of Wall-E2’s new-found ability to mate with the charging station using the square-wave modulated beacon signal, I noticed that Wall-E2 was always disconnecting from the charging station based on elapsed time (set for 2Hrs at the moment) rather than detection of the end-of-charge condition.   After investigating this a bit more, I found that one of the charging modules never switched from charging to ‘finished’.   This was more than a little irritating, as I was counting on that transition to make sure that Wall-E2 was fully charged before disconnecting.

During the process of creating the PCB design for my charging module, I took a dive into the datasheet for the MCP73871 charge management chip on the PB1000C in an effort to figure out if there was any way to improve the end-of-charge detection situation.   When I looked through the specs (relevant data sheet portions shown below), I found that there is a spec called ‘Charge Termination Ratio’ (oddly shown with dimensions of mA, but what do I know), and this value is controlled by the value of the resistor connected to the PROG3 pin.

On the Adafruit PowerBoost 1000C module, the resistor attached to PROG3 is 100K, the larger of the two values mentioned in the datasheet, and this value sets the charge termination threshold at approximately 12.5 mA (according to the Adafruit gurus, ‘approximately here means +/- 25% – yikes!)

So, I decided to see if decreasing the value of this resistor give me a more robust charge termination experience.   Rather than trying to replace the SMT/SMD resistor part, I decided I could just mount a regular 1/8W resistor in parallel, with the value chosen to get the right resultant value.   Since there is such a large (+/- 25%) variation, there’s no real good reason for trying to arrive at an exact value, so I just chose a convenient value (meaning the closest value I could find in a small 1/8W package) – in this case, 51K.   With a little bit of patience, and a strong magnifier, I was able to get the resistor soldered onto the SMD part without burning up the pads or anything else, as shown in the following photo

51K resistor soldered in parallel with the existing 100K resistor on the MCP73871 PROGR3 pin

This parallel combination results in an PROG3 resistor value of about 33K, which (assuming a linear progression) should result in a charge termination current of about 40mA.   When I tried this setup with a mostly charged battery and an Adafruit ‘Charger Doctor’ for monitoring charge current, the PB1000C changed to the ‘finished’ state with a measured current of about 20mA.

When I first tried this trick, I was expecting the charge to terminate when the Charge Doctor readout showed “0.04” – but it didn’t happen until more like “0.02”.   When I mentioned this on the Adafruit forum, a very knowlegeable reply was forthcoming from “Mike”

Re: Powerboost 1000C Charge termination threshold

by  adafruit_support_mike  on Tue Oct 31, 2017 9:54 am

“Charge termination ratio” is a general term for LiPo chargers. Most of them don’t use an external resistor to set the cutoff current, and just end the charge cycle when the current flowing into the battery reaches a given fraction of the constant-current level.. 1% is fairly common.

If you run the math out, the ratio of I.prog:I.term is R.prog1:R.prog3

We started with 100k because that’s one of the two values listed in the DC Characteristics table, and after a while you learn to take datasheets very literally. They excel at telling you the parts of the truth the vendor wants you to hear, but nothing more. It’s always best to start from the exact spec values and then vary the parameters to see what they left out.

We left it at 100k because it worked, and the datasheets for the LiPos we carry spec 1% as the termination level.

The tolerance for that value is +/-25%, so a nominal value of 33mA can be expected to fall in the range between 24.75mA and 41.25mA. The Charge Doctor has a resolution of 10mV/10mA, and I’d expect its measurement error to be about half that through rounding if nothing else. That puts the potential range of measured values for a nominal 33mA current between 19.75mA (rounded to 20mA) and 46.25mA (rounded to 40mA).

The error is almost as large as the value you want to measure, and larger than the difference you want to measure.

 So I thought about that some more, and eventually realized that the cause of my non-termination woes might well be that I’m using these chargers on much larger (capacity-wise) cell stacks than normal.   I’m using a 7400 mA stack, so a 1% threshold would be 7.4mA, which may be a little too close for comfort to the 12.5 mA termination spec for a 100K resistor on PROG3.
In any case, this exercise taught me a  lot more about the PowerBoost 1000C in general, and the MCP73871 chip specifically.
Stay tuned,
Frank

 

 

Wall-E2 Battery Charger PCB Part I

Posted 18 October 2017

Wall-E2’s on-board battery system has gone through some major changes over the last three years or so. Back in October 2015 I implemented an on-board battery pack & charger using two Sparkfun boost chargers and two 2000 mAh LiPo batteries as shown in the following image.

 

Battery pack showing charging modules and switching relay. The tan capacitor-looking component is actually a re-settable fuse

This was a technical success, but a practical failure; the LiPo cells just didn’t have the oomph to handle the high motor currents, and the single relay design had some problems as well.    So, in December 2015 I replaced the entire on-board battery system with a much higher discharge capacity RC battery, the GForce 2200 battery pack, as shown below

Current Wall-E2 battery pack

However, using this battery required that I physically disconnect the battery and connect it to an off-board charger for recharges, which meant I could never implement my idea of an autonomous robot.

So, about a year ago,  I re-implemented the on-board charging system, but with two significant changes; I used two 2-cell stacks of 3700 mAh 18650-style 3.7V li-ion batteries (specifically the NCR18650B cell) instead of the 2000 mA LiPo flatpacks, and two Adafruit PowerBoost 1000C chargers instead of the Sparkfun units.   I also added a second Axicom DPDT relay to solve the previous overvoltage issue.   The result is shown in the photograph below

Finished charging module connected to two 2-cell 3.7V battery packs

This system worked very well, and with the modifications  discussed in this post from last January (January 2017), I had a complete system for autonomous on-board charging.

This system has worked extremely well, but now I wanted to duplicate it for a planned upgrade to a larger robot platform, and I really wasn’t looking forward to hand-wiring another board. What I needed was a PCB, so I (or anyone else) could fabricate any number of charging modules without the PITA factor of a hand-wired perf-board implementation, so I decided to see If I could make a PCB using the free version of DipTrace.

After fumbling around for a while in DipTrace, I soon realized that in order to do a good job with a PCB design, I needed a component and associated PCB pattern for the Adafruit PowerBoost 1000C, and AFACT, none existed – at least not in a form compatible with DipTrace.   So, after some more fumbling around, I came up with the following model for the PB1K

DipTrace component model for the Adafruit PowerBoost 1000C

Creation of this component was complicated by the fact that I needed ‘flying lead’ connections to the ‘charging’ and ‘finished’ LED drivers on the PB1K module – signals that aren’t exposed to the outside world.   Eventually I hit upon the idea of adding a couple of ‘off-board’ pads (shown above at the lower left corner of the pattern), and assigning them to the ‘Finish’ and ‘Charging’ functions of the component layout. The ‘Chg Pwr’ signal already existed on the breakout header as the ‘Power’ signal, so I didn’t need anything for that.   These modifications allowed me to integrate the PB1K module into the charger schematic and the PCB layout using the normal DipTrace project work flow.

After getting what I thought was a successful layout, I clicked the ‘Order PCB’ button in the PCB editor, and ordered their minimum of two PCBs for $30 + shipping (I actually received 4ea PCBs so it was an even greater deal than normal!).

PCBs as received from Bay Area Circuits – nice packaging!

Four PCBs for the price of two – cool!

Test run to populate PCB with actual components

Size comparison between PCB and hand-wired versions. First iteration of PCB is slightly larger

After inspecting the PCBs, I realized I had screwed up on a couple of items.   The pad pattern for the two-wire terminal blocks wasn’t correct (too small), and at least one of them was reversed – oops!   In addition, a couple of PCB traces weren’t correct. So, it was back to the drawing board (literally) for a ‘version 2’ PCB.   On this iteration I learned a good bit more about DipTrace’s schematic/component/pattern relationship, so I felt like I was getting at least some value out of my screwups.   After removing a superfluous 2-wire terminal block and moving a couple of parts around, I was able to make the V2 PCB smaller than the original hand-wired model.   This time I remembered to use DipTrace’s verification routines, and this allowed me to catch some additional problems that had made it through into V2.   In addition, I used DipTrace’s print facility to print out a 1:1 PCB layout on paper, so I could double-check parts placement with real components, as shown in the following photo

Second iteration PCB printed at 1:1 scale on paper for component fit testing

So, many hours and a couple of iterations later, I have what I believe is a successful PCB implementation, and I sent off a new order to BAC.    As usual, I wound up spending  far more time designing the PCB than I ever would have in making a second hand-wired unit for the new robot, but where’s the fun in  that?

Stay tuned

Frank

 

 

IR Homing Module Integration Part X

Posted 15 October 2017

Well, we have just about reached the end of the road with respect to the ‘IR Homing Module Integration’ adventure.   As you may recall, at the very start of this trip (a couple of centuries ago back in August of this year) I showed the following block diagram of the proposed integration architecture

Teensy 3.2-based IR Demod module block diagram

The above architecture actually worked almost exactly as planned, except for using only two phototransistors vs the four in the original design, as shown below

Revised IR Demodulator block diagram. Note the removal of two phototransistors and the input combiner

After literally dozens of trials on my 1m (aka workbench) and 2m  ranges (aka the floor of my lab), I believe I have arrived at a reasonably successful set of PID parameters for Wall-E2 to use when homing to a charging station.   As usual, after going all around the barn with different P, I, & D values, I wound up with the simplest possible set of parameters, namely PID = (200,0,0).   The ‘200’ value is due to the use of a   (L-R)/(L+R) computation in the IR homing module, resulting in a steering   value output that ranges from -1 to +1.

While the result at the moment is far from perfect, it  is pretty good.   Wall-E2 can now successfully home to and mate with the charging station from at least 3m away, with wall offset distances from 50-91 cm as shown in the following videos (as can be seen in the last video, there is still some work to be done for wall offsets in the 25cm range)

 

So, the IR Homing Module Integration project is basically complete.   To recap, the idea for an interference-resistant IR homing scheme using a square-wave modulated IR beacon and a companion ‘degenerate N-path Band-pass Filter’ demodulator started back in May of this year during a visit from my old friend and mentor John Jenkins (see this post).   Since then, Wall-E2 and I have done the following:

  • Researched the basic theory behind the ‘N-path band-pass filter’ technology
  • Designed and implemented (with John’s help) a two-channel version of the technique using an arduino Uno.
  • When the Uno turned out to be too slow for operation at the desired 520Hz square-wave frequency, reduced the operating frequency by a factor of 10 to 52Hz to verify proper operation
  • Researched faster alternatives to the Uno, and eventually settled on the Teensy 3.x line of micro-controllers.   This hardware change allowed me to run the algorithm successfully at 520Hz, while simultaneously cutting the required real-estate by a factor of four, and the current drain by a factor of two – neat!
  • Designed and implemented the ‘crushed funnel’ two-phototransistor detector sunshade.
  • Integrated everything onto the Wall-E2 robot.
  • Demonstrated successful homing in the presence of overhead halogen lighting

Remaining Work:

There are still some things that need to be cleaned up to complete the integration, but it is mostly minor stuff:

  • I’m still not entirely happy with the inability to successfully home & mate with the charger for wall-following offsets below about 25cm, but I don’t think there is anything I can do realistically to solve that problem; what I  can do, however, is to make sure Wall-E2 starts homing far enough away from the nearest wall to avoid that problem. This will probably mean something like a pre-homing maneuver if the nearest wall distance is too small (or maybe even changing the basic wall-following algorithm to maintain a minimum distance of > 25cm)
  • Along the lines of belt-and-suspender designs, I probably also need to implement some sort of fallback algorithm if, despite all my best efforts, Wall-E2  still  manages to impale itself on one of the lead-in rails.   When Wall-E2 is in normal wall-following mode and gets stuck, it has a way of detecting that condition and recovering, but that scheme isn’t currently active during homing operations.   I just need to copy that capability into the homing mode, and hopefully Wall-E2 will cooperate.
  • There’s a whole bunch of commented-out stuff and debugging printout code scattered through the program right now, and that stuff needs to be cleaned out before I forget (if I haven’t already) what it was originally intended to do.

In any case, it is time to declare victory move on to the next challenge, as soon as I figure out what that might be.

Stay tuned!

Frank

 

 

IR Homing Module Integration Part IX

Posted 09 October 2017

In my last post on this subject, I showed that the azimuth response from the V9 ‘crushed funnel’ sunshade design was almost ideal for the intended homing operation, and it was time to start seriously integrating it onto Wall-E2.   As the following photos show, this worked out fairly well.

As shown in the above photos, the Teensy 3.2 IR Homing Module is mounted on the sunshade, with connections to the sunshade IR phototransister outputs on one end, and connections via I2C to the Mega on the other.

After making the necessary modifications to Wall-E2’s operating system to incorporate the steering value input from the homing module, I ran a short azimuth scan at 1m range using the completed IR Flashlight-based transmit module, as shown in the following short video.

During the azimuth scan, steering values were acquired by the IR Homing module and transferred via I2C to the Mega on an as-requested basis.   These values were then printed out to a PC using a Wixel wireless serial link.   The result, as shown below, looks pretty good.  It was pretty clear that the azimuth response was excellent over almost the entire azimuth range from -90 º to +90 º

 

The next step is to modify the PID parameters to translate the -1 to +1 range of steering values to appropriate wheel motor speed variations.

So, the error term varies from -1 to +1, and the motor wheel speed range is from 0-255, or MOTOR_SPEED_HALF +/- 127.   So, I would expect to have to have a Kp value on the order of 100 or so to achieve the full range of motor speeds.   I ran some manual scans for different Kp values to see what would happen with motor speeds, and got the following plots:

As expected, a Kp value of 20 appears to be a bit weak; it would do the job eventually, but probably not fast enough to get captured by the lead-in rails.

A Kp value of 100 looks better – motor speeds vary over almost the full range, so a full off-axis detection should cause Wall-E2 to almost spin in place to turn toward the beacon.

 

As shown above, using just Kp with Kd = Ki = 0 results in a constant offset with a constant error term.   However, for this application a constant output will still result in the robot turning toward the beacon, so a constant offset shouldn’t be a problem.

After this last test, I noticed that an offset to the right of the beacon boresight line (as was the case for this test produced a high left wheel speed and a low right wheel speed, exactly the opposite of what would be required to reduce the error term – oops!   This means I need to change the PID direction parameter from REVERSE to DIRECT to get the correct wheel speed adjustment sense.

To produce the above plot, the robot was left in the same position as it was at the end of the last run – offset about 20-30 º to the right of the beacon boresight, but with the PID sense changed from REVERSE to DIRECT. As shown above, now the right motor speed is higher than the left, which would turn the robot back toward the beacon boresight.

The data for all the above plots was collected with the wheel motors disabled.   The next step will be to enable the motors and see what happens.   I re-enabled the motors, but also implemented a wireless ‘kill switch’ so I could keep Wall-E2 from disappearing over the horizon (or more likely, over the edge of the bench!).   Here’s Wall-E2’s maiden run with PID = (100,0,0)

 

Well, Wall-E2 didn’t home properly to the beacon, but it did manage to correct at least a little bit, and managed to not leap off the edge of my test bench – yay!   The plot below shows the data from the run

From the above plot, it is clear that Wall-E2 was trying to do the right thing, but couldn’t change the wheel speeds fast enough for effective homing.   The input value started off at about -0.5, and the wheel speeds at L = 75, R = 175, which caused Wall-E2 to correct left, as it should.   This started the input trending upwards toward zero, and the wheel speeds both tending toward 127 (i.e. half-speed).   Everything arrived at the setpoint at position 5, so Wall-E2 continued straight, which took it back off the boresight and to the right side again.   The input started down again, and the motor speeds started adjusting, but they couldn’t adjust fast enough to keep Wall-E2 from blowing past the beacon – oops!

I’m not real sure what this tells me about PID tuning, but I suspect I’m going to need a non-zero differential term to deal with the close-in rapid angle changes.   It’s late, so I’m going to quit for tonight, but I hope to run some more tests tomorrow.

11 October Testing:

Here’s another run on my 1m test range (aka test bench). The only change from the previous run is that the data is being acquired at four times the rate – at 100mSec intervals vice 400mSec

The two plots shown above are almost identical, as would be expected, but the second plot has 4x the data points and is a lot smoother.   Still, it tells the same story; the PID_In line (blue, plotted on the right-hand scale) stays relatively constant at about -0.5 until about position 13.   With PID_In at -0.5, PID_Out (orange curve) is about 50, resulting in L/R speeds of about 75 & 175 (grey & yellow curves, resp).   These speeds cause a very gentle turn to the left (way too gentle, as it turns out).   After position 13, PID_In starts rising slowly (and then more rapidly) toward zero, indicating that the robot heading is nearing the beacon boresight.   At position 23   PID_In   hits -0.1 and the wheel speeds cross at a value of 125, meaning the robot is moving more or less straight ahead.   For some currently unknown reason, PID_In actually goes significantly above zero between positions 23 and 25, causing the robot to ‘twitch’ to the right, away from the beacon!   Then at position 25 PID_In reverses course, diving from +0.3 to -1 as the robot goes past the beacon.   This causes the robot to reverse course again, undoing the ‘twitch’ just before hitting the end-of-range condition (aka my tool chest).

So, why did PID_In (i.e. the steering value coming from the IR Homing Module) continue to increase even as the angle between the beacon boresight and the robot centerline continued to increase – not decrease?

More 11 October Testing:

Rather than worry about the ‘twitch’ phenomenon observed just before Wall-E2 passed the IR beacon, I decided to attack the first part of the run, where the PID input stayed relatively constant, but well offset from the setpoint. From my reading of PID tuning, this indicates a need for a non-zero I (integration) term.   To test this, I adjusted my PID value from (100,0,0) to (100, 20, 0) and ran some more testing.   The 1m range runs were encouraging, so I tried a run on my 2m range (aka my lab floor). As the following video and accompanying data plots show, this was pretty darned successful.

 

Starting at an offset angle of about 30-40 º relative to beacon boresight, Wall-E2 homed in on the beacon very smoothly and accurately.   In fact, when I picked up Wall-E2, I found that it had partially mated with the charging probe, even without lead-in rails for physical registration – neat!

Here’s another run, with Wall-E2 starting from the other side, with more of an initial offset (almost 90 º)

As can be seen in the above video clip and accompanying plot, Wall-E2 makes an abrupt initial turn to point (generally) toward the beacon, but then doesn’t make any additional significant corrections until it is almost past the beacon.   From the plot, it appears that the I value isn’t quite high enough.   So, I plan to make some more runs with increased I values.

 

Stay tuned!

Frank

IR Homing Module Integration, Part VIII

Posted 21 September 2017

As I mentioned at the end of the previous post on this subject, there are still some ‘issues’ with the charging station system.

Ambient light flooding, TSAL-6200 LED Power:

AFAIK, there are only two ways to beat the ambient light flooding problem; by reducing the amount of ambient light allowed to hit the phototransistors, or reducing the gain of the phototransistors, or both.   The ‘flat funnel’ sunshade design appears to be effective in reducing the incidence of ambient light from above (i.e. overhead incandescent lighting and sunlight) while preserving off-axis beacon detection ability, but it may not be enough by itself.  The problem with reducing detector gain to a level that would guarantee protection from flooding is that it might make it impossible to detect the charging station signal from far enough (i.e. around 2m away) to maneuver in time to be captured by the charging station lead-in rails.  Thus, the lower limit on the detector gain is set by the beacon field strength at approximately 2m distance.  So, if I want to reduce the detector gain, I have to increase the IR beacon field strength.

With the current setup with a single-TSAL-6200 IR LED transmitter, there’s not much more I can do to increase field strength at 2m.  The flashlight reflector idea significantly increased detection range, but even with the reflector I had to use a gain resistor of over 100K to achieve 2m detection/homing range, and that is probably 2 orders of magnitude greater than the maximum gain for flooding prevention.  The use of a square-wave modulation with it’s 50% duty factor makes this situation even worse, although I can get most of this loss back by running the LED at 200mA instead of 100.

While I was pondering my navel on this subject, someone mentioned that there are now small, cheap IR flashlights available for the tactical and hunting markets, and these flashlights use one or more Cree high-power IR LEDs.  I happened to be familiar with the Cree line of LEDs, as I have used their visual-light models to replace the el-cheapo LEDs in a couple of my bench lamps.  The visual-light models can easily handle 1Amp, and at that current are too bright to look at directly.  A little research showed that the IR models have the same high power rating, making them ideal for this purpose.  In addition to the high power, the IR flashlights typically come with adjustable optics that allow for a broad or spot beam, which would eliminate the requirement for a reflector – cool!

So, I ordered a ‘IR-940’ IR flashlight from eBay, and it looks like it might fill the bill. The flashlight as received is shown below.

IR-940 IR Flashlight

I ran a small series of tests to see if the adjustable optics really made a difference, and discovered that they did.  As shown below, the spot beam is noticeably smaller and more intense than the other settings.  Interestingly, the illumination pattern at the ‘wide’ setting is almost undetectable – it would be easy to conclude that the flashlight was actually turned OFF, when in fact it was still ON, but with a broad-beam pattern.

IR-940 flashlight at the most narrow-beam setting

IR-940 flashlight halfway between the narrowest and widest settings

IR-940 flashlight at the widest setting

After investigating the flashlight’s physical construction for a bit, I figured out that I could simply hacksaw off the battery compartment, leaving only the front optics adjustment section, and of course the 3-LED module itself.  The following photos show the result

IR flashlight LED and optics section wired into charging station transmit module. The black plastic piece is a prototype of the holder to be used in place of the current reflector

I ran some simple distance tests using my digital camera as an IR sensor.  With the room lights off, I could easily detect the flashlight output from up to 5 m (this was as far away I could get without too much trouble), as shown below

IR flashlight from across the room

Then I redesigned the charging station module to accoMmodate the IR flashlight head, as shown below.

Charging station module with IR flashlight head installed

After getting the flashlight head installed on the charging station module, I ran some azimuth tests with the V10 sunshade, as shown below

-90 to +90 degree azimuth scan at 1m: 2ea SFH-314 phototransistors with 1KΩ Rc using the V10 sunshade and the IR flashlight head

-90 to +90 degree azimuth scan at 2m: 2ea SFH-314 phototransistors with 1KΩ Rc using the V10 sunshade and the IR flashlight head

-90 to +90 degree azimuth scan at 3m: 2ea SFH-314 phototransistors with 1KΩ Rc using the V10 sunshade and the IR flashlight head

As can be seen from the above plots, the IR flashlight idea is definitely a winner.  Even with the detector Rc reduced to 1KΩ the square-wave modulated IR signal can be successfully demodulated from at least 3m away.  All three plots above are essentially identical, except for the scale.   So, if needed, the Rc value could probably be further reduced, and/or the flashlight drive current could be lowered.

 

Phototransistor azimuth pattern alignment:

In the ‘original’ (V9) ‘crushed funnel’ sunshade design, the phototransistors were aligned with about 70 º offset, i.e with a 110 º internal angle between the two back walls.  This resulted in the following azimuth plot

Azimuth scan using 2ea SFH-314 photo transistors

This indicated to me that I needed to bring the two phototransistor boresight angles more in parallel, thereby moving the two individual azimuth responses toward each other, filling the gap between them.  To accomplish this, I printed up another ‘crushed funnel’ sunshade (V10), with the phototransistors offset 50 º instead of 70 º (i.e. an internal angle of 130 º).  This piece was used for the 1m, 2m, and 3m plots above (repeated below for comparison purposes)

-90 to +90 degree azimuth scan with SFH-314 phototransistors using the V10 sunshade and the IR flashlight head, 1m distance

Comparing these two plots, it looks like I overshot a bit with my adjustment, as now the two individual phototransistor responses are too close together to produce a decent slope on the ‘steering’ (L-R)/(L+R) curve shown above in gray.  Fortunately, it costs essentially zero to produce yet another ‘crushed funnel’ design, this time with an offset midway between the V9 (about 70 º) and V10 (about 50 º) versions, i.e. an offset of about 60 º (V11).  The image below shows the result on my 1m range

-90 to +90 degree azimuth scan with SFH-314 phototransistors using the V11 sunshade and the IR flashlight head, 1m distance

The above plot definitely shows an improvement in the phototransistor azimuth response alignment, and this might well be the one that I want to go with.  However, it makes me a little suspicious of the original V9 data, as the V9 and V11 offsets are almost the same (70 º for V9 vs 60 º for V11).  Maybe the only real difference between V11 & V9 is the Rc value?  To test this theory, I re-ran the V9 setup with a 1K vs 10KΩ, with the following results.

-90 to +90 degree azimuth scan with SFH-314 phototransistors using the V9 sunshade and the IR flashlight head, 1m distance

As can be seen from the above, my suspicions about the original data were well-founded; the V9  scan with the 1KΩ is just about perfect; the two detector az responses cross at about 1/2 amplitude, and the steering curve is smooth and steep in the boresight region.  So it appears that something else was responsible for the anomalous V9 results – either the use of a 10K Rc or the fact that the original V9 results were acquired with the TSAL-6200/reflector setup versus the IR flashlight setup.   Just for completeness, here’s a shot of all three ‘crushed funnel’ designs.

All three ‘crushed funnel’ sunshade designs. As it turns out, V9 was the winner

At this point, I think I have just about everything I need to integrate the square-wave modulation detection/homing scheme onto the robot; I’ve got a good (V9) sunshade, an excellent IR source with the modified IR flashlight, and a well-tested Teensy 3.2-based demod/homing module.  I think the next step will be to mount the sunshade/detector unit and the demod module on the robot, modify the main robot controller software to acquire steering data via an I2C channel, and then do some homing tests.

Stay tuned,

Frank