Difference between revisions of "RSS measurement"

From Contiki
Jump to: navigation, search
(Step 3)
(Understanding the Code)
Line 159: Line 159:
 
== Understanding the Code ==
 
== Understanding the Code ==
  
::<code>etimer_set(&et, CLOCK_SECOND * 2);</code>  
+
::<code>static const struct collect_callbacks callbacks = { recv };</code>
This will set the timer to repeat the iterations every 2 seconds.
+
callbacks = { recv } calls the recv() function when a packet is received.
  
 +
::<code>collect_open(&tc, 130, COLLECT_ROUTER, &callbacks);</code>
 +
Opens a connection.
  
::<code>SENSORS_ACTIVATE(light_sensor);</code>
+
::<code>collect_set_sink(&tc, 1);</code>
::<code>SENSORS_ACTIVATE(sht11_sensor);</code>
+
Sets the node as sink. Note that we are setting node 1.0 as the sink here.
We need to activate light_sensor for measuring the light intensity and sht11_sensor for the measurement of temperature and humidity.
+
 
+
 
+
::<code>val = sht11_sensor.value(SHT11_SENSOR_TEMP);</code>
+
Here we are capturing the actual sensor value.
+
 
+
 
+
::<code>s = ((0.01*val) - 39.60);</code>
+
We need to calibrate the sensor values by doing some calculations. You can find the calculations here: http://tinyos.stanford.edu/tinyos-wiki/index.php/Boomerang_ADC_Example
+
  
 +
::<code>collect_send(&tc, 15);</code>
 +
Sends data through the link.
 +
 +
::<code>etimer_set(&et, CLOCK_SECOND * 2);</code>
 +
This will set the timer to repeat the iterations every 2 seconds.
  
::<code>SENSORS_DEACTIVATE(light_sensor);</code>
+
::<code>if(rimeaddr_node_addr.u8[0] != 1 )</code>
::<code>SENSORS_DEACTIVATE(sht11_sensor);</code>
+
This if condition will work only for the source nodes i.e. node id != 1.
After we are done with the calculations, we need to deactivate the sensors.
+
  
  

Revision as of 19:45, 22 November 2014

Back to Contiki Tutorials

Introduction

This tutorial helps you to understand how to measure Radio Signal Strength (RSS) received by a Tmote Sky. In this tutorial we have one sender and one receiver. Receiver receives the packet and display the RSS value of the packet received.

You can find the step by step simulation in the next section "RSS Measurement Program on Cooja" and you can find the C code in the subsequent section.


RSS Measurement Program on Cooja

Step 1

Create New Simulation on Cooja. Let's say we call our simulation as "RSS".


RSS 1.png


Step 2

Create Motes.


RSS 2.png


Step 3

Browse the firmware. Note: You can find the code later in this tutorial.


RSS 3.png

Step 4

Compile the firmware.


RSS 4.png


Step 5

Select number of new motes=2. Note: We are uploading same firmware on both the motes. One will act as Sender and another will act as Receiver.


RSS 5.png


Step 6

Start the simulation.


RSS 6.png


Step 7

You can see the RSSI value in the mote output window.


RSS 7.png

Code


<HEADER FILES>

static struct collect_conn tc;

PROCESS(example_collect_process, "RSS Measurement");
AUTOSTART_PROCESSES(&example_collect_process);

static void recv(const rimeaddr_t *originator, uint8_t seqno, uint8_t hops)
{
  static signed char rss;
  static signed char rss_val;
  static signed char rss_offset;
  printf("Sink got message from %d.%d, seqno %d, hops %d: len %d '%s'\n",originator->u8[0], originator->u8[1],seqno, hops,packetbuf_datalen(),
         (char *)packetbuf_dataptr());
  rss_val = cc2420_last_rssi;
  rss_offset=-45;
  rss=rss_val + rss_offset;
  printf("RSSI of Last Packet Received is %d\n",rss);
}

static const struct collect_callbacks callbacks = { recv };

PROCESS_THREAD(example_collect_process, ev, data)
{
  static struct etimer periodic;
  static struct etimer et;
  
  PROCESS_BEGIN();

  collect_open(&tc, 130, COLLECT_ROUTER, &callbacks);

  if(rimeaddr_node_addr.u8[0] == 1 && rimeaddr_node_addr.u8[1] == 0) 
  {
    printf("I am sink\n");
    collect_set_sink(&tc, 1);
  }

  /* Allow some time for the network to settle. */
  etimer_set(&et, 120 * CLOCK_SECOND);
  PROCESS_WAIT_UNTIL(etimer_expired(&et));

  while(1) 
  {

    /* Send a packet every 1 seconds. */
    if(etimer_expired(&periodic)) 
    {
      etimer_set(&periodic, CLOCK_SECOND * 1 );
      etimer_set(&et, random_rand() % (CLOCK_SECOND * 1));
    }

    PROCESS_WAIT_EVENT();


    if(etimer_expired(&et)) 
    {
      static rimeaddr_t oldparent;
      const rimeaddr_t *parent;
      if(rimeaddr_node_addr.u8[0] != 1 )
      {
        printf("Sending\n");
        packetbuf_clear();
        packetbuf_set_datalen(sprintf(packetbuf_dataptr(),"%s", "Fight On") + 1);
        collect_send(&tc, 15);

        parent = collect_parent(&tc);
        if(!rimeaddr_cmp(parent, &oldparent)) 
        {
           if(!rimeaddr_cmp(&oldparent, &rimeaddr_null))
           {
              printf("#L %d 0\n", oldparent.u8[0]);
           }
           if(!rimeaddr_cmp(parent, &rimeaddr_null)) 
           {
              printf("#L %d 1\n", parent->u8[0]);
           }
           
           rimeaddr_copy(&oldparent, parent);
        }
      }
    }

  } //end of while

  PROCESS_END();
} //end of process thread
 

Understanding the Code

static const struct collect_callbacks callbacks = { recv };

callbacks = { recv } calls the recv() function when a packet is received.

collect_open(&tc, 130, COLLECT_ROUTER, &callbacks);

Opens a connection.

collect_set_sink(&tc, 1);

Sets the node as sink. Note that we are setting node 1.0 as the sink here.

collect_send(&tc, 15);

Sends data through the link.

etimer_set(&et, CLOCK_SECOND * 2);

This will set the timer to repeat the iterations every 2 seconds.

if(rimeaddr_node_addr.u8[0] != 1 )

This if condition will work only for the source nodes i.e. node id != 1.


Back to Contiki Tutorials


Edited by : Nitin http://web.stanford.edu/class/cs244e/papers/cc2420.pdf