Wireless Embedded Systems (0120442x) Ad hoc and Sensor Networks
Wireless Embedded Systems (0120442x) Sensor Node Programming II (UART and Radio)
description
Transcript of Wireless Embedded Systems (0120442x) Sensor Node Programming II (UART and Radio)
Network Kernel Architectures and Implementation
(01204423)
Sensor Node Programming II(UART and Radio)
Chaiporn [email protected]
Department of Computer EngineeringKasetsart University
2
Outline UART communication Single-hop radio communication
3
Connecting Mote to PC USB connector on IWING-MRF and IWING-
JN
USB dongles3.3V
5VRXTX
GND
USB Dongle based on Silicon Labs’s CP2102ThaiEasyElec’s USB Dongle (FDTI)
3.3VRXTX
GND
4
UART API (motelib/uart.h) Enable UART (both TX and RX)
Send a single byte over UART
Send multiple bytes over UART
uartEnable(true,true);
uint8_t buf[10];:uartWrite(buf, 10);
uartWriteByte(50);
5
UART API (cont'd) Check whether there is any data
received from UART
Read a single byte from UART input buffer
Send formatted string over UART using Standard I/O library
uint8_t byte = uartReadByte();
#include <stdio.h>::printf("Hello, world\n");printf("i = %d\n", i);
if (uartInputLen() > 0) ...
6
Processing UART Data on PC Locate UART device file
Run dmesg to find out Usually /dev/ttyUSB0 or /dev/ttyACM0
For textual data Run terminal program such as screen,
gtk-term, putty on UART device For binary data
Any UART library can be used E.g., Python's serial package
$ dmesg :[70063.712091] usb 4-1: new low speed USB device using uhci_hcd and ..[70063.871042] usb 4-1: config 1 interface 1 altsetting ..[70063.871056] usb 4-1: config 1 interface 1 altsetting ..[70063.895220] cdc_acm 4-1:1.0: ttyACM0: USB ACM device
7
USB-UART Implementation MoteLib provides UART-via-USB
implementation for IWING-MRF platform (>= rev. 388) Emulated using V-USB library by
Objective Development Based on AVR-CDC project (
http://www.recursion.jp/avrcdc/) Requires no USB dongle Build your app with UART_VIA_USB=1
$ make UART_VIA_USB=1 ...
8
Example: sense-to-uart.c Sense light intensity every second;
send values to display via UART#include <stdio.h>#include <motelib/system.h>#include <motelib/timer.h>#include <motelib/uart.h>#include <motelib/sensor.h>#include <motelib/actor.h>
Timer t;void senseDone(uint16_t value);void sense(Timer *t);
void boot(){ uartEnable(true,true); timerCreate(&t); timerStart(&t, TIMER_PERIODIC, 1000, sense);}
void senseDone(uint16_t value){ printf("Light = %d\r\n", value); actorSetState(ACTOR_0, 0);}
void sense(Timer *t){ actorSetState(ACTOR_0, 1); sensorRequestAnalog(SENSOR_1, senseDone);}
9
Testing sense-to-uart Build with UART_VIA_USB option
Capture UART output using screen (or gtk-term or putty)
$ make UART_VIA_USB=1 flash
$ screen /dev/ttyACM0
10
Radio Communication IWING-MRF: Microchip's MRF24J40
controller IWING-JN: Built-in IEEE 802.15.4 @ 2.4 GHz, 250 kbps
16 non-overlapping channels 16-bit node ID 16-bit PAN (Personal Area Network) ID
11
Configuring Radio (IWING-MRF) Use config-mote.py script located
in $MOTELIB_DIR/platforms/iwing-mrf/tools
Have mote enter bootloader, then run:
E.g., set address to 234 and PAN ID to 555
Set channel to 0x1A
$ cd $MOTELIB_DIR/platforms/iwing-mrf/tools$ ./config-mote.py
$ ./config-mote.py --address 234 --panid 555
$ ./config-mote.py --channel 0x1A
Configure Radio (IWING-JN) Set the following variables via make
DEFAULT_ADDR DEFAULT_PANID DEFAULT_CHANNEL
Example:
12
$ make PLATFORM=iwing-jn DEFAULT_ADDR=50
13
Radio Message Format
Type and application data are provided by the application via Radio API
Type(1 byte)802.15.4 Header Seq No.
(1 byte)App Data
(max ~100 bytes)Checksum
14
Radio API (motelib/radio.h) Broadcast a message (type=7)
containing "HELLO" to all neighbors Call txDone() when message has been
sent
Use NULL when callback is not needed
radioRequestTx(BROADCAST_ADDR, 7, "HELLO", 5, txDone);:void txDone(RadioStatus status){ :}
radioRequestTx(BROADCAST_ADDR, 7, "HELLO", 5, NULL);
15
Radio API (cont'd) Set a handler to process received
messagesradioSetRxHandler(receive);:void receive(Address src, MessageType type, void *msg, uint8_t len){ :}
16
Example: sense-to-base.c Every second, each sensor node measures
light intensity and reports to the base station Assume base station has address = 0
Base station reports light measurements over UART
Base station
Sensor nodes measuring light intensity
Sensor node
17
sense-to-base.cvoid sense(Timer *t){ actorSetState(ACTOR_0, 1); sensorRequestAnalog( SENSOR_1, senseDone);}
void senseDone(uint16_t value){ radioRequestTx(0, 1, &value, sizeof(value), NULL); actorSetState(ACTOR_0, 0);}
#include <motelib/system.h>#include <motelib/timer.h>#include <motelib/radio.h>#include <motelib/sensor.h>#include <motelib/actor.h>
Timer t;void sense(Timer *t);void senseDone(uint16_t value);
void boot(){ timerCreate(&t); timerStart( &t, TIMER_PERIODIC, 1000, sense);}
18
base.c#include <stdio.h>#include <motelib/system.h>#include <motelib/radio.h>#include <motelib/uart.h>
void receive(Address src, MessageType type, void *msg, uint8_t len){ if (type == 1) { printf("Node %d: Light = %d\n", src, *((uint16_t*)msg)); }}
void boot(){ uartEnable(true,true); radioSetRxHandler(receive);}
19
Exercise: Voting Machine Create an application for wireless
voting machine Allow user to cast a vote using the USER
button Voting choices are: Red (1), Yellow (2),
Green (3), or No Vote (0) When the USER button is pressed,
Set LED status accordingly Report current vote to the base station (#1)
with message type 50