11 March, 2013

Arduino +USB Lipo Charger +5v Booster

So, let's say that you want to use your Arduino board with a LiPo battery. What would you have to do?

WARNING: If you have never used a LiPo battery before, I strongly advise you to read this guide before continuing. This guide will teach you the basic safety precautions required by this kind of battery.

If you do have the money for it OR if you don't fell comfortable working with the steps that I'm writing below, I suggest you buy a board that already has a USB LiPo charger embedded, like an Arduino Fio* - the only practical difference between this board and what I'm presenting here is the more expensive price and the impossibility to use it @ 16Mhz without modifying the board.

Since I'm always concerned with simplicity, I'll only suggest already tested and safe modules. We don't need to reinvent the wheel, do we? This is just a simple Arduino power guide.

Required parts

  1. 1x Arduino board, of course, original or compatible.
  2. 1x Sparkfun's PowerCell v1.3 (the previous version has a flaw on its design that will drain the battery really quick). This module has a quick start guide here.
  3. 1x Micro USB-B cable.
  4. 1x 1S 1P low discharge rate LiPo battery with a JST connector (JST RCY or 2pin Molex too).
  5. 2x 2.54mm angle pin headers.
  6. 2x 2.54mm pin headers.
  7. 2x wires with 2.54mm female headers on both ends, 20cm so so, red and black.
Charger/Booster LiPo, 1S1P Micro USB-B Cable JST RCY Connector 2pin molex

Why use a "low discharge" battery and what the hell is that? The discharge rate is simply how fast a battery can be discharged safely, suffice it to say that we don't need a battery with a high discharge rate (the normal type out there) for devices with low consumption. Our Arduino is a low consumption device (it requires 100ma, tops) so a low discharge rate battery is more appropriate, safer and it will drain slower than a normal battery. If you want to know more about LiPo Batteries, take a look into this link.

Basic Wiring

  1. Make sure that the blink "sketch" is already loaded into your Arduino board. It comes pre-loaded from factory.
  2. To be sure that everything is okay BEFORE we wire our modules, turn the Arduino board on as you normally do. If everything is all right, the led on pin 13 will start to blink and then there's no one to blame later on. Turn off the Arduino board.
  3. Get the 2.54mm angle pins and solder them into the VCC and GND out charge pins (picture 3, top).
  4. Plug the 3.7v LiPo into the small white plastic connector. It fits in only one direction so you don't have to care about it's position (picture 4). This type of connector (JST) breaks easily and it's a real pain to remove after it is connected, so be careful. If you don't have a LiPo with this connector, you will have to solder an adapter like the one in picture 2 (you can grab this connector from any PS3 Dual Shock Battery).
  5. Connect the black wire into the GND out charger's pin. Plug a male 2.54mm pin header into the opposite end of this wire in order to be able to connect it into the Arduino GND female header (picture 5) and then connect it (picture 6).
  6. Connect the red wire into the VCC out charger's pin. Use another 2.54mm header for the red wire end connector and then wait a minute. Review all connections just to be sure that everything is all right. Take a break, review again and, only after that, connect the red connector to the Arduino 5v header (picture 6). I'm serious - you can burn your Arduino just like popcorn and I'm almost sure that you will not like the smell.
  7. If you didn't burnt down the house by now, it's time to connect the USB cable. As soon as you plug the USB cable in, the red led in the charger board will turn on (picture 7).

Picture 1, The 2.54mm header wire plugged with the male pin

Picture 2, The JST Adapter

Picture 3, The JST Adapter connected

Picture 4, LiPo -> charger

Picture 5, LiPo -> charger, out cable connected

Picture 6, LiPo -> charger -> Arduino

Picture 7, LiPo -> charger -> Arduino 5v GND, USB -> charger

This is the basic wiring to power up any Arduino board running at 5v (pictures 8 and 9). It's important to note that we are wiring the charger's output straight into the uC and it's not passing though the internal voltage regulator (the LM whatever LDO). That being said make sure to use only 5v regulated power sources otherwise you will melt your little friend.

Picture 8, LiPo -> charger -> Leonardo Pro 5v GND

Picture 9, LiPo -> charger -> Groovy 5v GND

The booster is also available in a single module, without the LiPo charger:

Picture 10, The 5v booster

Picture 11, LiPo -> booster -> Leonardo Pro 5v GND

    A few notes
  1. There is one implicit worldwide color convention that dictates that red is positive and black is negative (GND).
  2. The multimeter is your friend, use it whenever you can.
  3. Whenever you need to wire up a power source wire up first the GND line, after measuring it with your friend - the multimeter.
  4. Whenever you need to disconnect a power source disconnect first the VCC line.
  5. Always buy spare parts - you never know when you are going to burn something.

Basic Wiring, 3.3v

The Sparkfun's USB LiPo charger/booster used above can be configured to work at 3.3v, you can see how to into its guide, doing so you will be ignoring it's embedded booster circuit. For this scenario it's better to use one simple LiPo charger instead - cheaper and smaller.

Charger 5v Booster Another Charger More Charger
    The wiring here is way simpler:
  1. Connect the LiPo 3.7v and GND into the charges IN+ and IN- respectively.
  2. The same LiPo GND goes to Arduino's GND.
  3. The same LiPo 3.7v goes to Arduino's 3.3v. 3.7v is not equals to 3.3v, I know - the thing is that 3.7v is in the tolerance range that is acceptable by Arduino's 3.3v input.
  4. If I'm consuming power (the board is on doing something) how I'll be sure that I'll be recharging the LiPo? Well, this charger feeds 400ma (tops) to recharge the LiPo and we know that one Arduino uses 100ma (tops), so the math is: 400ma - 100ma > 0. If greater than zero we are okay, we will be charging the LiPo, if lower than zero review your project and remember that a LiPo can't be totally discharged without getting damaged (see the LiPo guide for more details).

Picture 12, I'm out of LiPo chargers right now, I'll post it later ...

    A few 3.3v boards
  1. Arduino Mini 3.3v.
  2. Arduino Fio v2.2 and v3.0.
  3. RBBB variants without crystal.
    More notes
  1. The "booster" module is also called by "step up" circuit, it's a circuit that increases the voltage of it's input. There is another similar kind of circuit that will help you in the opposite case, the "Step Down" circuit, it's a circuit that decreases the voltage of it's input.
  2. Do not use the USB 5v line to power up your 3.3v device. It's normal to have a tolerance range (normally it's between 10%) but 5v is way higher and it will fry your uC, for these cases you will have to use one step down circuit.
  3. The Arduino uC, from factory, operates at 16Mhz. You will have to reconfigure the Arduino fuses in order to make it run at 8Mhz.

Data wiring

At this point you did powered you Arduino however you didn't wired the USB data pins (D- and D+), there's no such pins in the LiPo charger nor in the 5v booster - both modules don't care about these signals. They could have designed these modules taking into account these pins but they didn't. Why? I think they are just assuming that you are only using the USB cable to charge your LiPo or to provide power to your device, not to communicate with your computer (silly assumption).

To enable the USB communication you will need one USB 2.0 header like the one I did here.

continue ...

Picture 13, USB 2.0 pinout - I'll post it later ...

    And more notes:
  1. The USB D- and D+ signals are not interchangeable then you need to follow the correct order of the pins.
  2. Try to use and memorize the correct color code adopted into the USB cables (picture 13, mine is wrong - don't know why they swapped the D- with the D+ wire).

Data wiring, 3.3v

    Aggain, you know, more notes:
  1. The USB D- and D+ signals are 5v signalsthen you will need one level converter into them.

Identifying which power source is been used

Sometimes you will need a way to identify when the device is been powered by the USB or been powered by the LiPo. This is not required but it will help some wireless applications (if you don't need or don't have a clue why an wireless application would require it just wait my next post - when I'll wire a bluetooth module to one LiPo powered Arduino).

The easiest way to identify when the board is been powered by our LiPo is to check the USB 5v presence. You will need one 100k resistor, one wire with 2.54mm headers and one USB 2.0 header.

    Wiring, you will see it's easy
  1. Using the USB header connect the wire into the USB 5v.
  2. Plug the 100k resistor's leg (any leg) at the end of this wire.
  3. Connect the other resistor's leg into the Arduino A5 port.
  4. Compile and upload the sketch below, piece of cake right?
USB 5v –> 100k resistor –> Arduino A5.
Blink when powered by LiPo.
#define DEBUG 

// Pin 13 has an LED connected on most Arduino boards.
int led = 13;
// Analog 5 will be used to read the vcc line voltage.
int vcc = A5;

// the setup routine runs once when you press reset:
void setup() {
  Serial.begin( 9600 );
  // initialize the digital pin as an output.
  pinMode( led, OUTPUT );

// the loop routine runs over and over again forever:
void loop() {

  int vccA = analogRead( vcc );
  float vccR = vccA / 204.6;

  #ifdef DEBUG
    Serial.print( "VCC Voltage: " );
    Serial.print( vccA );
    Serial.print( " - " );
    Serial.print( vccR );
    Serial.println( "." );

  digitalWrite( led, HIGH );   // turn the LED on (HIGH is the voltage level)
  delay( 1000 );               // wait for a second
  if( vccR < 3.3 ) {
    digitalWrite( led, LOW );  // turn the LED off by making the voltage LOW
    delay( 1000 );             // wait for a second

204.6? what's that? Take a look into the documentation of the function analogRead and try to figure it out by yourself as a mental exercise.


  1. * Arduino Fio v2.2, ATMega328p OR Arduino Fio v3.0, ATMega32u4

No Arduinos Were Harmed in the Production of this Post.

Post not finished, I'm still writing it ...

No comments:

Post a Comment