802.15.4 Power Management using Cyclic Sleep example for mbed XBeeLib By Digi

Dependencies:   XBeeLib mbed

Description

This example characterizes a device that needs to be continuously joined to the coordinator so it doesn't lose any incoming packets. A fast response to packets is not required so radio can sleep for some time to save power while the coordinator buffers its packets.

The example configures the radio to poll its coordinator every 5 seconds if there is any packet for it.
If there is one or more, it awakes and send the packets to the mbed micro-controller.

Setup

Network

You need to set up a coordinator in the network so it buffers the packets send to our local XBee device while it's sleeping.
A module configured as coordinator requires:

  • 'Coordinator Enable (CE)' parameter set to 1.
  • 'Coordinator Association (A2)' parameter set to 0x04 so the coordinator allows end device association.
  • 'Cyclic Sleep Period (SP)' parameter set as the local XBee device.
    In the example it is set to 5000 which represent 5000 ms or 5 seconds.
    In the coordinator, when using X-CTU for configuration, the SP parameter has to be entered as the desired sleep time divided by 10 and in hexadecimal so to cope with the example it should be 5000 / 10 = 500 = 0x1F4 -> 1F4
  • 'Time Before Sleep (ST)' parameter set as the local XBee device; 500 ms = 0x1F4.

Demo run

While it is running, send a packet to the device:

  • Go to the "Console" tab of the XCTU connected to the coordinator.
  • Press the "Add API frame to the list" button.
  • Press "Create using API Frame generator" button.
  • Select "802.15.4" protocol and "0x00 - Tx (Transmit) Request 64-bit address" Frame Type.
  • Paste the Local XBee device 64-bit address in the "64-bit dest. address" text box. (You can copy it from the application banner).
  • In the "RF data" text box, select the ASCII box and type "Hello XBee!".
  • Press OK, Add Frame.
  • Select the frame and press the "Send selected frame" button to send the frame ("Hello XBee!") to the XBee network.

Once the XBee device receives the frame, the radio will wake up to send it to mbed micro-controller, which will process and print the received data.

Verify that the XBee module has received the frame by accessing the serial console terminal. If it was successful, the "Hello XBee!" message will be displayed there.

After that, the radio will go to sleep again until new data is received.

Committer:
hbujanda
Date:
Fri Jul 29 12:11:55 2016 +0200
Revision:
7:7f97480cb88a
Parent:
4:c88db3e5ad7f
Automatic upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hbujanda 2:7ecbda4b8788 1 /**
hbujanda 2:7ecbda4b8788 2 * Copyright (c) 2015 Digi International Inc.,
hbujanda 2:7ecbda4b8788 3 * All rights not expressly granted are reserved.
hbujanda 2:7ecbda4b8788 4 *
hbujanda 2:7ecbda4b8788 5 * This Source Code Form is subject to the terms of the Mozilla Public
hbujanda 2:7ecbda4b8788 6 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
hbujanda 2:7ecbda4b8788 7 * You can obtain one at http://mozilla.org/MPL/2.0/.
hbujanda 2:7ecbda4b8788 8 *
hbujanda 2:7ecbda4b8788 9 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
hbujanda 2:7ecbda4b8788 10 * =======================================================================
hbujanda 2:7ecbda4b8788 11 */
hbujanda 2:7ecbda4b8788 12
hbujanda 2:7ecbda4b8788 13 #include "mbed.h"
hbujanda 2:7ecbda4b8788 14 #include "XBeeLib.h"
hbujanda 2:7ecbda4b8788 15 #if defined(ENABLE_LOGGING)
hbujanda 2:7ecbda4b8788 16 #include "DigiLoggerMbedSerial.h"
hbujanda 2:7ecbda4b8788 17 using namespace DigiLog;
hbujanda 2:7ecbda4b8788 18 #endif
hbujanda 2:7ecbda4b8788 19
hbujanda 2:7ecbda4b8788 20 using namespace XBeeLib;
hbujanda 2:7ecbda4b8788 21
hbujanda 2:7ecbda4b8788 22 /* Configure Sleep Options */
hbujanda 2:7ecbda4b8788 23 #define SLEEP_OPTIONS 0 /* Short Sleep */
hbujanda 2:7ecbda4b8788 24
hbujanda 2:7ecbda4b8788 25 /* Configure Sleep Period in mS */
hbujanda 2:7ecbda4b8788 26 #define SLEEP_PERIOD_MS (5000 / 10) /* 5000 mS */
hbujanda 2:7ecbda4b8788 27
hbujanda 2:7ecbda4b8788 28 /* Configure Time before sleep */
hbujanda 2:7ecbda4b8788 29 #define TIME_BEFORE_SLEEP_MS 500 /* 500 mS */
hbujanda 2:7ecbda4b8788 30
hbujanda 2:7ecbda4b8788 31 Serial *log_serial;
hbujanda 2:7ecbda4b8788 32
hbujanda 2:7ecbda4b8788 33 /** Callback function, invoked at packet reception */
hbujanda 2:7ecbda4b8788 34 static void receive_cb(const RemoteXBee802& remote, bool broadcast, const uint8_t *const data, uint16_t len)
hbujanda 2:7ecbda4b8788 35 {
hbujanda 2:7ecbda4b8788 36 const uint64_t remote_addr64 = remote.get_addr64();
hbujanda 2:7ecbda4b8788 37
spastor 4:c88db3e5ad7f 38 log_serial->printf("\r\nGot a %s RX packet [%08x:%08x|%04x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST",
hbujanda 2:7ecbda4b8788 39 UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16(), len);
hbujanda 2:7ecbda4b8788 40
hbujanda 2:7ecbda4b8788 41 log_serial->printf("%.*s\r\n\r\n", len, data);
hbujanda 2:7ecbda4b8788 42 }
hbujanda 2:7ecbda4b8788 43
spastor 4:c88db3e5ad7f 44 int main()
hbujanda 2:7ecbda4b8788 45 {
hbujanda 2:7ecbda4b8788 46 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
hbujanda 2:7ecbda4b8788 47 log_serial->baud(9600);
hbujanda 2:7ecbda4b8788 48 log_serial->printf("Sample application to demo cyclic sleep power management with the XBee802\r\n\r\n");
hbujanda 2:7ecbda4b8788 49 log_serial->printf(XB_LIB_BANNER);
hbujanda 2:7ecbda4b8788 50
hbujanda 2:7ecbda4b8788 51 #if defined(ENABLE_LOGGING)
hbujanda 2:7ecbda4b8788 52 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
hbujanda 2:7ecbda4b8788 53 #endif
hbujanda 2:7ecbda4b8788 54
hbujanda 2:7ecbda4b8788 55 XBee802 xbee = XBee802(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
hbujanda 2:7ecbda4b8788 56
hbujanda 2:7ecbda4b8788 57 /* Register callbacks */
hbujanda 2:7ecbda4b8788 58 xbee.register_receive_cb(&receive_cb);
hbujanda 2:7ecbda4b8788 59
hbujanda 2:7ecbda4b8788 60 RadioStatus const radioStatus = xbee.init();
hbujanda 2:7ecbda4b8788 61 MBED_ASSERT(radioStatus == Success);
hbujanda 2:7ecbda4b8788 62
hbujanda 2:7ecbda4b8788 63 /* Configure sleep parameters */
hbujanda 2:7ecbda4b8788 64 AtCmdFrame::AtCmdResp cmdresp;
hbujanda 2:7ecbda4b8788 65
hbujanda 2:7ecbda4b8788 66 cmdresp = xbee.set_param("A1", 4); /* AutoAssociate = Device attempts Association until success */
hbujanda 2:7ecbda4b8788 67 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
hbujanda 2:7ecbda4b8788 68 log_serial->printf("A1 Failed!!\r\n");
hbujanda 2:7ecbda4b8788 69 }
hbujanda 2:7ecbda4b8788 70
hbujanda 2:7ecbda4b8788 71 wait_ms(500);
hbujanda 2:7ecbda4b8788 72
hbujanda 2:7ecbda4b8788 73 cmdresp = xbee.set_param("SO", (uint32_t)SLEEP_OPTIONS);
hbujanda 2:7ecbda4b8788 74 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
hbujanda 2:7ecbda4b8788 75 log_serial->printf("SO Failed!!\r\n");
hbujanda 2:7ecbda4b8788 76 }
hbujanda 2:7ecbda4b8788 77
hbujanda 2:7ecbda4b8788 78 cmdresp = xbee.set_param("SP", SLEEP_PERIOD_MS);
hbujanda 2:7ecbda4b8788 79 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
hbujanda 2:7ecbda4b8788 80 log_serial->printf("SP Failed!!\r\n");
hbujanda 2:7ecbda4b8788 81 }
hbujanda 2:7ecbda4b8788 82
hbujanda 2:7ecbda4b8788 83 cmdresp = xbee.set_param("ST", TIME_BEFORE_SLEEP_MS);
hbujanda 2:7ecbda4b8788 84 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
hbujanda 2:7ecbda4b8788 85 log_serial->printf("ST Failed!!\r\n");
hbujanda 2:7ecbda4b8788 86 }
hbujanda 2:7ecbda4b8788 87
hbujanda 2:7ecbda4b8788 88 /* Configure Sleep mode */
hbujanda 2:7ecbda4b8788 89 cmdresp = xbee.set_param("SM", 4); /* Cyclic Sleep Remote */
hbujanda 2:7ecbda4b8788 90 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
hbujanda 2:7ecbda4b8788 91 log_serial->printf("SM Failed!!\r\n");
hbujanda 2:7ecbda4b8788 92 }
hbujanda 2:7ecbda4b8788 93
hbujanda 2:7ecbda4b8788 94 /* Start processing frames */
hbujanda 2:7ecbda4b8788 95 while (true) {
hbujanda 2:7ecbda4b8788 96 xbee.process_rx_frames();
hbujanda 2:7ecbda4b8788 97 wait_ms(100);
hbujanda 2:7ecbda4b8788 98 log_serial->printf(".");
hbujanda 2:7ecbda4b8788 99 }
hbujanda 2:7ecbda4b8788 100
hbujanda 2:7ecbda4b8788 101 delete(log_serial);
hbujanda 2:7ecbda4b8788 102 }