Difference between revisions of "RSS measurement"
(→RSS Measurement Program on Cooja!) |
|||
Line 8: | Line 8: | ||
− | == RSS Measurement Program on Cooja | + | == RSS Measurement Program on Cooja == |
=== Step 1 === | === Step 1 === | ||
Line 35: | Line 35: | ||
Press Ctrl-C to quit. | Press Ctrl-C to quit. | ||
− | |||
− | |||
== Code == | == Code == |
Revision as of 00:43, 14 November 2014
Contents
Introduction
This tutorial helps you to understand how to measure Radio Signal Strength (RSS) received by a Tmote Sky.
RSS Measurement Program on Cooja
Step 1
Using the opened terminal window compile and upload the RSS measurement program on two Tmote Sky. One will act as the sender and another will act as the receiver. Note: Upload same firmware on both the Tmote sky.
-
make TARGET=sky savetarget
(This save the target for any future compilations) -
make rss.upload
(This will upload the code on the Tmote Sky) -
make login
(This will enable us to view the output. If permission error occurs, use sudo command at the beginning)
-
See the following link for troubleshooting - http://anrg.usc.edu/contiki/index.php/Troubleshooting
http://web.stanford.edu/class/cs244e/papers/cc2420.pdf
Step 2
Press the reset button on the Tmote Sky. The following message will appear on the terminal window
-
Temperature=28.04 C (6764)
-
Humidity=73.20% (2259)
-
Light=38.26 lux (94)
-
Values inside the round brackets (ex 6764, 2259 and 94) are the actual sensor values and the calibrated values can be obtained by performing calculations on these sensor values. You can find the calculations at http://tinyos.stanford.edu/tinyos-wiki/index.php/Boomerang_ADC_Example
Step 3
Press Ctrl-C to quit.
Code
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
etimer_set(&et, CLOCK_SECOND * 2);
This will set the timer to repeat the iterations every 2 seconds.
SENSORS_ACTIVATE(light_sensor);
SENSORS_ACTIVATE(sht11_sensor);
We need to activate light_sensor for measuring the light intensity and sht11_sensor for the measurement of temperature and humidity.
val = sht11_sensor.value(SHT11_SENSOR_TEMP);
Here we are capturing the actual sensor value.
s = ((0.01*val) - 39.60);
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
SENSORS_DEACTIVATE(light_sensor);
SENSORS_DEACTIVATE(sht11_sensor);
After we are done with the calculations, we need to deactivate the sensors.
Edited by : Nitin