close-circle
Close
0%
0%

SUN : Self-Sustained Ultralow-power Node

Ambient/Solar Energy harvesting based nodes that DON'T run on a LiPo battery.

Similar projects worth following
close
Challenge it addresses: It is expected that by 2020, 50 billion devices will be connected to the internet. An important consideration for a lot of those devices that don’t need a lot of computation power or, that only sense the environment and transmit that data for processing, is of power consumption. LiPo batteries can no longer be used because it may be possible to replace 100 batteries, it’s not possible to replace 1,00,000 LiPo cells (for devices in large sensor networks). This project attempts to develop a node that uses Solar Energy and(or) Ambient light harvesting to power an ultra-low power node.

Simply Put: I want to show that it is possible to keep running a system on a supercapacitor for at least 24 hours. I am using (BLE) CC2650 uC (can be replaced by CC2640R2F a bluetooth 5 based uC or CC1350 dual band uC), that runs a RTOS and has a special 16 bit core called "Sensor Controller". Using optimized firmware and hardware i want to design a complete

I have already made a working prototype. Below are some videos showing the prototype in action. The processor is ARM Cortex M3+, CC2650 from Texas Instruments. It is running a RTOS. One novel feature of CC2650 is the "Sensor Controller Core" which is a separate 16 bit core. It is optimized for extremely low power and autonomous operation form the rest of the core that can sleep. Here the Sensor Controller reads the Ambient light sensor OPT3001 via I2C and if the value is beyond a maximum value or below a minimum value then it glows an LED to notify that. (NOTE: Glowing LEDs to indicate that is really bad, because the whole system without the LED uses less than 1mA with non optimized code , but the LED itself consumes around 4mA !!. This was just for demonstration purposes.)

In the current prototype CC2650 is being used. We can also use CC1350 or CC2640R2F, but since modules of those uCs are not out there i have stuck with CC2650. Also, I had started this project before either of the uCs were launched, hence i am still developing on CC2650. But the RTOS that runs is exactly the same, hence porting the code would be rather really easy. CC1350 is a SoC which has BOTH SubGHz and BLE. So majority of the nodes will use SubGHz for data transmission, but the central node would use both. In CC2640R2F we don't have to worry about anything as we get the long range capabilities of Sub-GHz due to Bluetooth 5.

Here is a video of the same setup in action with some explanation and showing the supercapacitor charging under ambient light.

Before programming and everything i tested the Power Management circuit. Although i had worked before with BQ25570 and BQ25505 so i knew how to deal with them but it was still necessary to test every detail thoroughly. So here is a video that has 2 tests, one on a sunny day and the other on a cloudy day. To show that the Energy Harvesting circuit is working i replaced the Ferrite Bead with a LED in series with a resistor. Whenever the supercapacitor charges to a pre-programmed level (resistor programming of BQ25570) then the internal mosfet in BQ25570 turns ON the buck converter that produces a constant 1.9V from the linearly decreasing voltage of the Supercapacitor.

WHAT CHALLENGES IN ELECTRONICS ENGINEERING AM I FACING FOR THE ABOVE? 

To better illustrate the difficulties that i am addressing by this project, i have made some images -

MY SOLUTION:

Using Energy Harvesting techniques and designing a hardware for space constrained applications using ultra low power uC and sensors running at 1.9V.

In the first version of the prototype that you have seen so far, i only used BQ25570 and hence only utilized the energy stored in the supercapacitor from ~5V to ~2V. The rest of the energy (from 2V to 0V) was not used by the system as the system ran at 1.9V and BQ25570 had an inherent buck converter only.

The final version looks like this - 

------------------------------------------------------------------------------------------------------------------------------------------------

The FIRST version of the prototype didn't have any feedback mechanisms, which has been addressed in the later versions. The block diagrams for before the feedback is something like this - 

After the feedback -

----------------------------------------------------------------------------------

HOW THE PROJECT CAN BE USED ?

The project can be used to implement a network of wireless sensor nodes and used for monitoring Temperature, Ambient Light and Humidity. These parameters can be used for early warning systems and to detect forest fires, monitoring the micro climate in open or green houses, success or failure of crops, vineyards, structural health of bridges, skyscrapers and other buildings (replacing the existing sensors with accelerometer, gyroscope and magnetometers) air pollution monitoring, landslide detection, monitoring seismic activity etc.

Wireless Sensor Network

Real Life Situation where the project can...

Read more »

Bottom_FinalVersion.png

Bottom Layer of the board.

Portable Network Graphics (PNG) - 41.49 kB - 10/17/2017 at 13:30

eye
Preview
download-circle
Download

Top_FinalVersion.png

Top Layer of the board.

Portable Network Graphics (PNG) - 47.86 kB - 10/17/2017 at 13:30

eye
Preview
download-circle
Download

Layout.png

Layout of the prototype.

Portable Network Graphics (PNG) - 63.52 kB - 10/17/2017 at 13:30

eye
Preview
download-circle
Download

CC2650MODA_V2.2_LoadSwitch.pdf

The latest version of the schematic. Has boost converter, analog switch along with sensors on the solar panel side, powered by GPIO pins rather than power rail.

Adobe Portable Document Format - 52.88 kB - 10/17/2017 at 13:25

eye
Preview
download-circle
Download

Top.png

Layout, top layer. VERSION 1. NOT RECOMMENDED.

Portable Network Graphics (PNG) - 394.89 kB - 03/29/2017 at 03:56

eye
Preview
download-circle
Download

View all 8 files

  • 1 × CC2650MODA BLE Module from Texas Instruments
  • 1 × OPT300X Ambient Light Sensor. X = 1,2,6
  • 1 × TMP112 Temperature Sensor
  • 1 × SHTC1 Humidity Sensor from Sensiron
  • 1 × BQ25570 Energy Harvestinng IC from Texas Instruments

View all 9 components

  • GPIO drivers & BLE Stack working together

    Shantam Raj15 hours ago 0 comments

    Made progress by making the RTOS control the GPIO drivers and the BLE stack too.

    Here is the GitHub link for the code. 

  • Getting BLE working - PART 1

    Shantam Raj4 days ago 0 comments


    These are the screenshots from 2 different apps showing the prototype running as a peripheral.







  • Storing Sensor data in Circular buffer

    Shantam Raj5 days ago 0 comments

      In this log we are implementing a circular array that wraps on itself in the 16bit processor itself so that we don't have to transfer the results as soon as they are made to the 32bit Cortex M0 processor. Once the circular buffer is filled then we will fire a interrupt to transfer the values to the flash memory of the Cortex M0 processor or to transfer the data via Bluetooth to a central device. 

      1. The first graph is the index that goes from 0 to 100 and back to 0 and so on, thats why the saw tooth graph.
      2. The second graph has individual array members at locations 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 99. This explains why they are steady for some time before abruptly changing. As the sensor readings are stored in successive indices, thus for the time it takes to fill all the indices and come back to a particular index, the value in that index stays constant.
      3. The third graph is the graph of the actual output of the sensor.

      The following is again the code used to implement what i have described above in the SENSOR CONTROLLER STUDIO.

      //INITIALIZATION
      
      gpioSetOutput(8);   //OPT3002
      gpioSetOutput(4);   //LED
      fwScheduleTask(1);   // Schedule the first execution
      
      //EXECUTION CODE
      
      i2cStart();   // Configure and start the next measurement
      i2cTx(I2C_OP_WRITE | ALS_I2C_ADDR);
      i2cTx(ALS_REG_CFG);
      i2cTx(ALS_CFG_ONE_SHOT >> 8);
      i2cTx(ALS_CFG_ONE_SHOT >> 0);
      i2cStop();
      evhSetupTimerTrigger(0, 120, 2);   // Read the result after 100 milliseconds + a 20% margin
      fwScheduleTask(1);   // Schedule the next execution
      
      //EVENT HANDLER CODE
      
      // If a measurement was successfully started during the last execution ...
      if (state.i2cStatus == 0x0000) {
          
          // Select the result register
          i2cStart();
          i2cTx(I2C_OP_WRITE | ALS_I2C_ADDR);
          i2cTx(ALS_REG_RESULT);
          
          // If successful ...
          if (state.i2cStatus == 0x0000) {
              U16 resultRegH;
              U16 resultRegL;
              
              // Read the result
              i2cRepeatedStart();
              i2cTx(I2C_OP_READ | ALS_I2C_ADDR);
              i2cRxAck(resultRegH);
              i2cRxNack(resultRegL);
              i2cStop();
              
              // Convert the result (4-bit exponent + 12-bit mantissa) into 16-bit fixed-point
              U16 exp = resultRegH >> 4;
              U16 mant = (resultRegH << 12) | (resultRegL << 4);
              // The exponent is in range 0 to 11     
              U16 value = mant >> (11 - exp);
              output.value = value;
              U16 n = output.a;
              output.array[n] = value;
              utilIncrAndWrap(n, BUFFER; output.a);
              
              // Notify the application with the result is below the low threshold or above the high threshold
              if (value < cfg.lowThreshold) {
                  fwGenAlertInterrupt();
              }
              if (value > cfg.highThreshold) {
                  fwGenAlertInterrupt();
              }
              
          } else {
              i2cStop();
          }
      }
      //TERMINATION CODE
      // Shut down the light sensor
      i2cStart();
      i2cTx(I2C_OP_WRITE | ALS_I2C_ADDR);
      i2cTx(ALS_REG_CFG);
      i2cTx(ALS_CFG_RESET >> 8);
      i2cTx(ALS_CFG_RESET >> 0);
      i2cStop();
      evhCancelTrigger(0);   // Cancel the potentially active event trigger

  • Using Sensor Controller I2C to read sensors

    Shantam Raj10/09/2017 at 15:21 0 comments

    The following is the Sensor Controller Studio Code for testing the sensors. The code generated by the SCS for the final application that also includes the ARM Cortex M0 processor will be different but we don't have to worry about that because it is automatically generated by the software once your testing in the SCS is done.

    //INITIALIZATION
    
    gpioSetOutput(9);   //TMP112
    gpioSetOutput(8);   //OPT3002
    fwScheduleTask(1);
    //EXECUTION
    i2cStart();   // Configure and start the next measurement
    i2cTx(I2C_OP_WRITE | 0x0090);
    i2cTx(1);
    i2cStop();
    i2cStart();
    i2cTx(I2C_OP_WRITE | ALS_I2C_ADDR);
    i2cTx(ALS_REG_CFG);
    i2cTx(ALS_CFG_ONE_SHOT >> 8);
    i2cTx(ALS_CFG_ONE_SHOT >> 0);
    i2cStop();
    evhSetupTimerTrigger(0, 120, 2);
    fwScheduleTask(1);      // Schedule the next execution
    //EVENT HANDLER
    
    // If a measurement was successfully started during the last execution ...
    if (state.i2cStatus == 0x0000) {
        // Select the result register for TEMPERATURE Sensor
        i2cStart();
        i2cTx(I2C_OP_WRITE | 0x0090);
        i2cTx(0);
        
        // If successful ...
        if (state.i2cStatus == 0x0000) {
            U16 resultRegH;
            U16 resultRegL;
            
            // Read the result
            i2cRepeatedStart();
            i2cTx(I2C_OP_READ | 0x0090);
            i2cRxAck(resultRegH);
            i2cRxNack(resultRegL);
            i2cStop();
            
            // Convert the result (4-bit exponent + 12-bit mantissa) into 16-bit fixed-point
            U16 exp = resultRegH << 8;
            U16 value = (exp | (resultRegL))>>3;
            // The exponent is in range 0 to 11
            //U16 value = mant >> (11 - exp);
            output.valueT = value;
            // Notify the application with the result is below the low threshold or above the high threshold
            //if (value < cfg.lowThreshold) {
            //fwGenAlertInterrupt();
            //}
            //if (value > cfg.highThreshold) {
            //fwGenAlertInterrupt();
            //}
            
        } else {
            i2cStop();
        }    
        // Select the result register for AMBIENT LIGHT Sensor
        i2cStart();
        i2cTx(I2C_OP_WRITE | ALS_I2C_ADDR);
        i2cTx(ALS_REG_RESULT);
        
        // If successful ...
        if (state.i2cStatus == 0x0000) {
            U16 resultRegH;
            U16 resultRegL;
            
            // Read the result
            i2cRepeatedStart();
            i2cTx(I2C_OP_READ | ALS_I2C_ADDR);
            i2cRxAck(resultRegH);
            i2cRxNack(resultRegL);
            i2cStop();
            
            // Convert the result (4-bit exponent + 12-bit mantissa) into 16-bit fixed-point
            U16 exp = resultRegH >> 4;
            U16 mant = (resultRegH << 12) | (resultRegL << 4);
            // The exponent is in range 0 to 11
            U16 value = mant >> (11 - exp);
            output.valueL = value;
            //Not necessary right now.
            // Notify the application with the result is below the low threshold or above the high threshold
            //if (valueL < cfg.lowThreshold) {
            //fwGenAlertInterrupt();
            //}
            //if (valueL > cfg.highThreshold) {
            //fwGenAlertInterrupt();
            //}
            
        } else {
            i2cStop();
        }
    }
    //TERMINATION
    
    // Shut down the sensors
    i2cStart();
    i2cTx(I2C_OP_WRITE | 0x0090);
    i2cTx(1);
    //i2cStop();
    i2cTx(I2C_OP_WRITE | ALS_I2C_ADDR);
    i2cTx(ALS_REG_CFG);
    i2cTx(ALS_CFG_RESET >> 8);
    i2cTx(ALS_CFG_RESET >> 0);
    i2cStop();
    evhCancelTrigger(0);    // Cancel the potentially active event trigger
    

    The following are the screenshots of the real time graphs of results of both the sensors. The first graph in both  the graphs is the Ambient Light Sensor (OPT3002) and the following is the Temperature Sensor (TMP112).

  • FINAL PROTOTYPE TESTING & LOOKS

    Shantam Raj07/24/2017 at 12:12 0 comments

    After addressing all the optimizations that i posted in the previous log, i finally got around to making the hardware and testing it. Sadly there were some complications with the customs of the PCBs i ordered using Seeed Studio Fusion PCB fabrication service. They arrived much later than i expected.

    But atleast they are here and here is what the final prototype PCB looks like. I am yet to solder all the components. I will solder and test and keep on doing like that. Currently we have confirmation of the Energy Harvesting circuit from our previous prototype that works perfectly, as well as the sensors. To be honest, the sensors are the least of my concern right now, i am sure they will work just fine!!.


    I have independently tested the boost converter and it is able to provide 2.2V from voltages as low as 0.6V.

    The pushbutton and the LED also work fine. Tested that by a simple blinky code. And ofcourse, the MCU is working too.

    LABELLED BOARD

    10 sec video of the final hardware - 

  • More H/W optimization and some clarifications

    Shantam Raj06/12/2017 at 02:42 0 comments

    This is indeed a Log Entry. But first i would like to make some clarifications, I was going through the article written by sir and read the comments. There were some good advises and some comments that i need to clear -

    1) I think placing a pushbutton for the LED was a good idea. I have placed the LED on the side facing the solar panel, with its pushbutton on the other side. This will prevent unnecessary leakage and also act like a good indicator to show that the system is working. It is important to understand that even the smallest of LEDs consume a ton of current. Because my system consumes 1 to 3mA (actually an order less when only Sensor Controller is working) and that is less than the current used by the LED, you can tell that having them for all sorts of indication on a ultra low power device is ridiculous.

    2) I will NOT implement any sort of Display, be it the low power E-paper displays. The idea is to make the system remotely addressable and accessible. If at all you would like to have some sort of display, a better approach in my opinion would be to have that in a device that acts like a debugging system for the node. So the idea is , you walk up to the node, attach your debugging device(with the display) to the node and do whatever you want. The node will only have the debugging firmware, no physical indicators whatsoever.

    3) I am not claiming 10 years or anything. Those are for companies and there is a very detailed report by Jack Ganssle that debunks the accuracy of these claims. The only thing i am trying to do here is to show that the system runs for 24hours straight while taking useful readings. Harsh conditions for extended periods of time will definitely make the device shutdown but then instead of replacing the batteries like in current systems, my design will not need any human intervention. It will get back up online automatically.

    4) Somehow someone took it to thermostats and other devices.

    My device is strictly a data acquisition device. Its job is NOT to control something. These are meant to be used in remote and inaccessible areas(of course accessible too) for reading the environmental conditions(as of now).

    5) What about devices that DO give 10 years on battery? Well, getting rid of the battery is the point here. Do a google search on how much battery goes to the landfills every year and how toxic they are. Some countries have banned disposing batteries in landfills.

    ------------------------------------------------OPTIMIZATION--------------------------------------------------------1. POWERING SENSORS VIA GPIO PINS OF MCU

    If you look carefully, in my previous design, the sensors were powered by the same rail as the MCU. Because of that they were always ON. And none of them actually has a shutdown pin. So in the next revision, i am connecting the power pins to GPIOs of the MCU, so that the MCU has total control over when to turn ON the sensors and to reduce power consumption.

    2. CHANGED THE ORIENTATION OF SENSORS TO THE SOLAR PANEL SIDE

    Because we have ambient light sensors, it is important that it is on the same side as the Solar Panel so that the system knows how much light energy is available and adjust its power consumption accordingly.

    3. BQ25570 vs BQ25505 AND AN ADDITIONAL BOOST CONVERTER

    I have worked with both the ics and both have their own advantages. I think i will make a few more designs incorporating BQ25505 and a design with BQ25570 with an additional Boost Converter to extract the complete juice in the Supercapacitor. BQ25505 has a provision to connect a non rechargeable primary battery. This will ensure that the system remains turned ON when the rechargeable element drains completely.

    Picture of new design

  • Comparing Supercapacitor with Small Energy Devices from Murata

    Shantam Raj04/03/2017 at 17:51 4 comments

    Recently Murata Launched a new line of products called "Small Energy Devices". You can read about them here. Basically it's a miniature device with a high energy storage capacity, low ESR, fast charging and discharging and the ability to withstand load fluctuations. It may be used as a secondary battery in the same way as a capacitor. This energy device achieves better charge/discharge characteristics and has an extended service life superior to conventional batteries. Well suited as a power supply for wearable devices or sensor nodes for wireless sensor networks, this device maintains flat voltage characteristics while accommodating a wide range of load characteristics.

    UMAC_img0002

    umal_image0001

    Their benefits are - http://www.murata.com/en-us/products/smallenergydevice/uma/benefits

    I have placed order for the UMAC (the top one) series and will design the PCBs accordingly.

  • Voltage Feedback

    Shantam Raj03/24/2017 at 08:52 0 comments

    Currently there is no feedback in the system. I have already started designing a PCB which has feedback. Basically the idea is to monitor the VBAT (Supercapacitor voltage) and the VSTOR(Boost regulator o/p from BQ25570) pins via Analog pins.

    I have also changed the placement of the sensors from the components side to the Solar Panel side as when it will be deployed in the fields then the solar panels will be on top and the sensors need to make measurements in that orientation. Here is how they look like (need to complete s bit of routing )

View all 8 project logs

Enjoy this project?

Share

Discussions

Danie Conradie wrote 05/27/2017 at 17:17 point

Excellent work. Thanks to you I found out about the CC1350/1310, which looks like the perfect solution for a project I'm working on. The energy harvesting will also come in handy

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates