56

ULPNode Low Power Secret Revealead

After several articles and some intensive tests with ULPNode, it’s now time to explain how the low power engine has been built. Even if you can find plenty of Arduino clone node, when it’s time to power them with battery and using power optimization, I never succeeded to find one fitting my needs. Today I can say that ULPNode is the less consuming power nodes ever built. It works also from several power sources (AA, AAA, Cell coin, ….). May be some are existing but not released to public so I’m not aware. If you find one do not hesitate to tell me, I’m always curious to see how to achieve same things with other methods.

This article refers to several ones already written. That is why I will not be going into deep details on some points already discussed. If you want to have a whole vision of this project and a smoothly reading of this post, please take some time reading the previous following articles for detailed explanations on other points.

  1. Introduction of ULPNode
  2. Low Power Bootloader 1 and 2 for ULPNode
  3. ULPNode first prototypes status

How low can I go ?

Arduino boards are based on ATMel chip, the most commonly used one is the ATMega328p. Note that the last letter “p” is very important because it indicate “PicoPower, and this mean that it is the most dedicated for Low Power operations. Reading the datasheet this chip can work starting 1.8V wich it’s very suitable in our case. It consumption in total idle mode can be as low as 100nA (see datasheet section 29.2.8 ATmega328P DC Characteristics). As the node are doing most of their time in this idle mode, this is allowing us to run them at a really low consumption.

 Conception

That said, to achieve this low power mode, we need to conform to the datasheet. A good advice is always read the datasheet on the point you need details, if something goes wrong, read back the datasheet, and remember, try to understand the author point of view, do not make any assumption on how you think you understand information written. the following cases are the one I used when I created ULPNode.

  • In our case, we need to have the board not running at speed higher than 4MHz to be able to let it working until limit of 1.8V. So the default cruising speed of ULPNode need to be 4MHz, it will always work (we’ll see later how to increase this on demand).
  • Lot of sensors or devices need to be powered with 3.3V, so we need to be able to get power to 3.3V on demand, for this, one way to do, using a DC/DC booster. This also mean that we can have 3.3V power when we decide and we need it.
  • Ideally, since the consumption in idle mode of CPU is approx to 100nA, a good thinking would be to charge a capacitor to 3.3V before going into low power mode and then disconnect the main power from the CPU and sensors until the capacitor discharge reach about 2V. then we just need to charge back the capacitor to 3.3V and disconnect again, and so on. To achieve this, we need also a non conventional booster, this one should have a feature that lot of them do not have. This feature is called “true output disconnect”, that means that when not activated the input is not bypassed (lot of them do this) but instead it’s disconnected from the output. So every devices (CPU, Sensors, ..) located after the output of the booster does not draw any current on the battery in this mode. The only battery drawing is the Booster quiescent current in idle mode.
  • So we need a voltage supervisor controller. Of course it may be technically possible to use the Arduino chip to manage and check discharge with ADC comparator and interrupt and then charge back. As I do not want that the software can interact and potentially break the powering engine, I decided to keep this to be done by hardware, it’s safe and user code don’t need to worry about that, and it will work even if there is a code bug. I’m sure this decision will remove some pain and headaches.
  • But , even if low powering engine supervisor is done by hardware we need to be able to activate the booster on demand by software when we need it.
  • Last but not least, of course all sensors and consuming devices need to be disconnected for low power consumption and activated only when we need them. This part will be done by software activating or deactivating sensors powering.

Functional diagram

Ok, now let’s put all of this into the shaker and here below the functional diagram of ULPNode power engine.

ULPNode Functional Diagram

ULPNode Functional Diagram

 How does this all works ?

As previously said, the booster as a nice feature called “true output disconnect”, this is acting like a switch, when the booster is enabled, the input voltage is stepped up to 3.6V (3.6V because I wanted the on-board RGB led to work correctly, datasheet says 3.5V) and most sensors works until 3.6V. thus this will give some extra time during the voltage decrease to 2V.

Once started, VCC line will bring to 3.6V until the booster is disabled. During this time you can do anything you want even speed up the processor to 8MHz (at 3.6V we can go to 8MHz). You can power the sensors, the radio module, whatever you like.

Once your job’s done (measure, radio send, ..) , you can enter to Low Power mode, for this, you must disable all sensors and CPU peripherals, then you can disable the booster and go into sleep mode.

Once in deep sleep mode, the supervisor will constantly check its voltage (VCC line) if above 2V. If it is above 2V, nothing happens, the low power consumption of the CPU will bring down very slowly VCC line trough the reserve capacitor. As soon as the voltage supervisor detect voltage under 2V (on my prototypes it is happening after approx 100 seconds), supervisor output becomes active and three things are happening :

  1. The booster is being enabled for about 30 ms (it is the reset pulse time of the supervisor) and the reserve capacitor is being charged to 3.6V.
  2. The battery monitoring is enabled.
  3. The third event is optional, but if you enabled the wake  interrupt in the CPU, the CPU is waked and let you do the stuff you want to do (power on the sensors, reading them, sending measure with radio module, ..) Once done, you can go back to sleep after disabling the sensors and the booster. If you want to save more power and for example you don’t need to send data on every wake, you just need to have a counter variable in you loop and decide for example to read and send data only each “n” wake. In this case the wake will be very short in term of timing when doing nothing  except increment the counter and testing it. Remember that the consumption is at the top when sending data through radio module (45 mA for RFM69 radio module) so just do it only when needed.

Why the third event is optional ? well, imagine you want to do a pulse counter (which is slightly different for example than sending data every 5 minutes for temperature or things like that). In this case you let the hardware doing the reserve capacitor recharge (so you won’t be waked on this event happening when VCC goes below 2V). ULPNode will work in this case in a mode I could call “free running mode”. You have nothing to manage except deciding and configuring before going to sleep which external event will wake you.

So if you program another I/O pin (the pulse counter) as interrupt. Then you will be waked each time this interrupt occurs. If pulse happens slowly, CPU could stay in sleep mode for a very long time (min, hour, day, month, …). Of course when waked by other IRQ (pulse counter), don’t forget to enable the and activate the booster as soon as you’ve been waked, this rule is always true. Even if voltage supervisor enable it for 30 ms, it does not hurt to confirm and force the booster until you finish what’s need to be done.

Bringing all of this to life

After these theoretical words, let’s go in the battle field, I’ve implemented a small sketch illustrating this all. The CPU is waked each time the voltage detector assert a “Wake” (VCC going below 2V). Then I power the sensors and the RF module, send a radio frame other the air to the gateway, wait for ACK from the GW and blink the on-board RGB led in green if ACK received else in red. Then going back to sleep. This event is happening every 100 seconds (each hardware wake).

Since 100 second is very long to do a scope capture, I’ve put a resistor between VCC and GND to force consumption during sleep mode, in this case, wake is happening approx every 1.2 second. It’s just to be able to capture a quick sequence on my scope. And here the result below :

ULPNode Low Power

ULPNode Low Power capture graphs

ULPNode Low Power

ULPNode Low Power capture graphs

On both images, the blue line is grabbed from “Enable Booster” signal (output of the voltage supervisor) and the yellow one is VCC, the master power voltage present on reserve capacitor and booster output when activated.

As you can see on the 1st image, the wake duration is about 300 ms (blue pulse) doing all the stuff I said before, then the CPU is set to sleep mode disabling the booster. Once booster disabled, CPU engine is free running mode, this means consume  nothing on the battery because it is powered trough the reserve capacitor. VCC start going to decrease until it reach 2V, then supervisor activate back the booster and so on…..

You can also notice that when as long as the booster is activated, VCC stays stable approx to 3.5V.

Components Involved

ULPNode mains components used for all of this are a Microchip DC/DC booster MCP1640 the model is PWM/PFM with true output disconnect options. The voltage supervisor is a NCP302LSN20T1 the model with threshold detection at 2V.

Of course there are passive components all around for feedback, adapting/inverting signals and doing other things. And as a bonus, when booster is enabled, it enable the battery monitoring, this permit to know the battery level without drawing current from it when in sleep mode.

Next steps

I’m currently merging all code into a library to let you use ULPNode features without worrying a lot and using simple API. The sample code used in this example was written before the library creation so I’m doing lot of cleanup to have sample code using library. Also I’m adding some other nice features to the library to be able do to several actions depending on a button press such as sending ping packet, check RF module, auto configure nodes, … As soon as it’ll be ready I will post code on Github.

Final schematics will also be on Github as soon as boards will be available out of production. I’m currently waiting the 2nd batch of prototype boards, which should be knocking my door in few days.

Charles

Charles

Charles

56 Comments

  1. Excellent work. I really like your idea. I’ll follow your work.
    Have you seen the airboard project ? It’s look like similar to your project and have same goals.

    • Emmanuel,
      Thank you, I always appreciate good comments.

      Yes I took time to watch to airboard project, seems much advanced then my project, but no secret, there is a complete team behind, that is what I’m missing.

      They use Lipo and charging engine, this is a thing I thought during conception but dismissed it because when a sensor is out of battery I just want to be able to change battery in less than one minute and forget it again. Also BLE is great but I don’t know the range, and the RFM69 modules have a really good range for the price. ULPNode would work far longer than 6 month with 1 minute sending frame. And moreover, ULPNode will work with any old battery indicated as “LOW” by other devices, making the node really kind of “green node”. The pro is that with BLE you can connect to the device directly with smart phone, which is fine 🙂

      Charles

    • Goran,
      Thank you. If all goes fine the production could be started after Chinese new year holidays.This year it will be the last two weeks of February. So starting production could start beginning of march do be available for sale at the end of March, I cross my fingers 😉

      Charles

  2. I agree with your pros and cons.
    I’m very interested in the “low power side” of your ULPNode, let me know when you have some boards ready.

  3. Hello !

    Bien joué, très bonne approche 🙂 Par contre as tu prévu depouvoir connecter un oscilleteur 32khz sur le node ? Car pour pouvoir mettre en place des protocoles sécurisés cel peut être très interessant d’avoir un compteur très basse consommation . As tu une idée du prix auxquel tu comptes les distribuer ?

     

     

    • Bonjour et Merci,

      Je ne suis pas sur de comprendre l’histoire de l’oscillateur, mais pourquoi pas, peux-tu préciser pour quel usage ?

      Pour le prix je pense ce que sera aux alentours de 29$

      Charles

  4. Bonjour,

    Il existe des horloges RTC qui peuvent tourner à 55nA avec un quartz de 32Khz et qui consomment encore moins en utilisant leur oscillateur RC interne.

    Plutôt que de mettre le mcu en Sleep avec son watchdog et l’oscillateur en fonction (750nA) , on met le mcu en PowerDown (100nA) et on le réveille avec la RTC programmable. Il est possible de gagner environ 600nA avec cette approche.

    • Bonjour,

      Ah je comprends mieux la demande. en fait j’avais pensé à ce système, mais dans la conception de l’ULPNode, ce n’est pas nécessaire car l’ULPNode en veille est en total PowerDown avec le BOD ainsi que tous les périphériques désactivés (environ 100nA), ce qui fait qu’il est en mode consommation minimale. Il est alors réveillé (si on le souhaite) par le superviseur externe (environ toutes les minutes) ou par une autre IRQ (un capteur par exemple)

      Charles

  5. Thanks Charles. Really good work on the development. I too (like so many others it seems :-)) would be interested in being notified when you have a production board. Awesome!

  6. Hello Charles,

    please notify me as soon as I can order your ULPNodes – looking forward to them and thank you for developing them!

  7. Hello, congrats for you work !

    Your especially choose a DCDC converter that disconnects its output, and let the supervisor keep regulating the voltage between 2V and 3.3V.

    What about having a DCDC converter not disconnecting the output (just the self and diode) being in series to power the uC when in sleep ? You will suppress the quiescent current of the supervisor, and the power losses in the capacitor that keeps charging and discharging. I agree that this solution doesn’t work on a single AAA cell as 1.5V is too low for the atmega to work.

    Regards,

  8. Very good… Quick question, on your diagram you have a battery monitoring and a sensor/radio switch. Are those small logical mosfets? Cheers

  9. Hallo , and contratulation for the project, do you have any news ?
    please include my email  on the list of the future buyers .

    Regards Paolo

  10. Hello Charles,

    Great Job !

    Are you still confirm that it will be ready for selling in April ?

    Please include me in your mailing list and  Don’t forget to have shipping method to Thailand.

    Zen

     

     

    Regards,

    zen

    • Hello,
      Thanks for the comment.
      To be honest I’m currently rewriting lot of associated code for ULPNode. There will be some samples from client side (ULPNode) and server side (Gateway). In the meantime a small efficient WEB control panel (AngularJS + HTML 5) is also under writing to see values and be able to remote configure the nodes.
      By the way, I want to be sure everything is working fine on hardware view before selling anything. Hardware is working fine, but I need to move some placement components and I want to do a 3rd prototype plan for this to be fully functional. I will also add placement for SI7021 new temperature/humidity sensor which is becoming very popular.

      This mean that I will not able to have the definitive boards in April. I apologize for this.

      Charles

      • Hello Charles,

        It’s OK, However Is it possible to expect when the first version will be launched?

        zen

  11. Im interested too. Add me to your mailing list.

     

    Thanks in advance 😉

  12. Charles

    Im planning a small local batch for sensors in beehives (5 persons with 2 of 3 nodes each). This will be a kind of Proof Of Consept en learning fase. If this works out fine we intend to start a regional batch. (50 .. 100 persons). Who knows a national batch as wel. Im publishing a project site at the moment. Sorry it is in dutch.

    Im looking forward for testing it with my lokal node and gateway. (Seedstudio LinkIT One). Let me know when you can spare a node for testing.

     

     

    • Hi Koen,

      I’m really glad you’re interested in this project. I would be interested also in seeing your site (google would be able to translate me) to have a better idea of what you want to do.

      No problem for spare as soon as I’ve got some. As a proof of concept I think I could find you some prototypes that I’m currently using. What kind of RF module you planned to use on your gateway ?

      Charles

      • Charles.

        The project site is http://www.bijen-monitor.nl
        Not all ready jet. I start with communication when i have some parts ready tot test.
        Ik what de use a RF12b (lowest on power). I JeeLabs on te gateway (Seedstudio LinkeIT-One board)?. Any sugestions.
        If could buy an older version fort my POC en programming would be great. But… im af beginner and fast learner.

        Koen.

  13. Hi

    Great job, my weatherstation client nodes needs some upgrade (battery life sucks)and this ULNode things sound great, could be  you put me onto list too. I’n more than interesting.

    Br. Hannu

  14. I’m also very interested. Please, keep me informed.

    Henry

  15. Hi,

    I am also very interested in this project.  Please add me to the email list when production units are available for sale.

    Patrick

  16. This is exactly what I’m looking for, for my OpenHAB build.

    So interresting to read your work.

    Any word og target price / and updated estimated production date ?

    (please forgive if already stated – I just haven’t seen it)

    Please add me to notification list too – would be very interrested in field testing the ULPN

    Cheers Kurt

  17. Bonjour,

    En cherchant des réponses à un projet que je souhaite réaliser, je viens de tomber sur votre site. C’est prometteur !

    Et comme je ne compte pas réinventer la roue, je serai intéressé. Comme un autre visiteur, je souhaite surveiller des ruches et rapatrier les infos via GSM sur mon site Web et lancer des alertes via SMS en cas de problème.

    Où en est votre projet et conviendrait-il à mon besoin ?

    Cordialement,

    • Bonjour Patrick,

      Merci pour le retour, oui çà devrait être possible, tout dépend de ce que vous souhaitez surveiller et à quelle distance sera la passerelle informatique ?

      Charles

  18. Hello, please add me to notification list for when these are available to purchase. Thank you!

  19. Bonjour,

    j’ai trouvé votre blog i l y a quelques temps. Votre concept d’ulpnode est très ingénieux et je vous remercie pour le partage de votre travail. J’utilise la lib Mysensors. Pour l’instant tout est à l’état de breadboard car je ne veux pas faire de wirewrapping (trop galère). Je me suis donc fait un mix entre une carte et votre concept ulpnode.  Cela est juste pour mon utilisation perso. Je me ferai mon bootloader perso. Si voulez voir si je respecte les règles de license :

    https://github.com/scalz/MySensors-HW/tree/master/PowerManagementMysensors

    Je ferai les modifs nécessaires s’il faut. Si cela ne vous convient pas, je retire mes fichiers, pas de problème. Sinon, où en êtes-vous? Le concept fonctionne-t-il comme espéré?

    Cordialement

    • Bonjour,
      Merci pour le commentaire, aucun soucis pour la license, c’est le concept open source. En plus je n’ai pas “releasé” les schémas ni les sources encore.
      Oui tout fonctionne nickel, j’ai juste du changer de librairie pour le protocole RF, j’utilise maintenant la librairie bien connue RadioHead et je travaille sur la gateway avec l’option de protocole compatible avec Mysensor. Du coup l’ULPnode sera nativement compatible Mysensor en utilisant une GW quelconque (MiniWireless, moteino, raspberry, ….)

      Charles

      • alors là je ne sais quoi dire…j’en ai le sourire jusqu’aux oreilles lol! jsuis fan, j’ai hâte de voir tout ça! Plus sérieusement, faudra que je regarde comme intégrer tes modifs de bootloader à l’ota mysensors. Tu utilises quoi pour mesurer la conso? J’attends des pcb uCurrentGold..si tu veux jpourrai t’en envoyer un. Jveux bien que tu me mettes sur la liste pour une board du coup stp.

        • Ce coup-ci c’est toi qui me fait sourire car j’utilise la même chose que toi pour les mesures, un ucurrentgold. j’en avais même fabriqué 3 maison (les 1er ucurrent) mais dès que tu changes de calibre, çà coupait le jus, donc pas super pratique. Du coup j’ai acheté un gold officiel. Mais, car il y a un mais, c’est pas super pratique pour ce type de mesures (low puis high).
          Je m’explique en veille l’ULPNode consomme entre 400 et 800nA donc tout va bien avec le calibre 1mv/nA mais dès que le node se réveille et transmet, on monte à plus de 40mA et la le calibre devient trop petit, la tension aux bornes du shunt du ucurrent est trop grande et plus assez de tension pour le montage, résultat, çà plante le node. Donc obligé de switcher sur le gros calibre, puis reset du node et enfin une fois le node en veille tu rebascules sur le petit.
          Mais bon, çà permet de mesurer, c’est déjà çà 😉

          • ok. je suis pas étonné que tu en ai un. merci pour les précisions sur le ucurrent. jme posais des questions là dessus aussi pour le coup du calibre. mais c’est sûr que ce sera pratique. bravo pour tes résultats de conso. ulpnode+mysensors en rfm69 ça fera un super combo avec un jeedom ou nodered.
            @+

  20. Great work on these ULP modules. Do you have a current consumption number for the regulator + supervisor + micro sleeping?

    • Bogdan,

      Thanks for the feedback, the idle consumption on the battery (so total consumption) is approx 400nA (100nA for ATmega, 300nA for Booster+supervisor) + with 1.5V battery and twice this with 3.2V cell coin,

      Hope this help

      Charles

      • Thank you, I was curious how this would compare with a solution that keeps 3.3V on constantly, like with TLV61225 which burns 5u.

Comments on this topic in community Forums.