Wireless Embedded Systems (0120442x) Sensor Node Programming II (UART and Radio)

Post on 23-Feb-2016

31 views 0 download

description

Wireless Embedded Systems (0120442x) Sensor Node Programming II (UART and Radio). Chaiporn Jaikaeo chaiporn.j@ku.ac.th Department of Computer Engineering Kasetsart University. Outline. UART communication Single-hop radio communication. Connecting Mote to PC. - PowerPoint PPT Presentation

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 Jaikaeochaiporn.j@ku.ac.th

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