Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
OpenThread is an open-source implementation of the Thread networking protocol. With OpenThread, Nest is making the technology used in Nest products more broadly available to accelerate the development of products for the connected home.
The Thread specification defines an IPv6-based reliable, secure and low-power wireless device-to-device communication protocol for home applications. More information about Thread can be found on threadgroup.org.
The Firefly platform has been widely used to test and develop with OpenThread, thus although the RE-Mote is a great choice as well, we focus on the Firefly as the de-facto choice for OpenThread due to:
- Its simple form factor and more pins available for generic use
- Dual radio enabled as default with on-board antennas (no need for external ones to start working)
- Works at 3VDC, it can be powered over 2xAA or 2xAAA batteries, even a coin-cell!
- The USB-A connector allows to easily plug and play to any host (Raspberry Pi, laptop, etc), event connect multiple devices in a single USB hub to easily deploy a testbed on your own
The following instructions assume you are using Linux and alike, in a nutshell we will first clone the OpenThread repository, the toolchain to compile the examples and the necessary scripts to flash the Zolertia RE-Motes.
sudo apt-get update sudo apt-get install gcc-arm-none-eabi gdb-arm-none-eabi sudo apt-get install python-pip pip install intelhex pip install python-magic
Get the base code and flash installer:
cd $HOME git clone --recursive https://github.com/openthread/openthread git clone --recursive https://github.com/JelmerT/cc2538-bsl cd openthread
git remote add zolertia https://github.com/Zolertia/openthread git fetch zolertia git checkout pull/zolertia-firefly
pull/zolertia-firefly branch will add support for the following peripherals:
And the following sensors:
We will expand this list and add more sensors and actuators.
These peripherals and resources has been added to the CLI example (command line interface), allowing to control and command the Firefly over command line.
Compile and program a Zolertia Firefly
To compile the Firefly (CC2538-based)` example:
./bootstrap make -f examples/Makefile-cc2538 clean && make -f examples/Makefile-cc2538 arm-none-eabi-objcopy -O binary output/bin/arm-none-eabi-ot-cli-ftd output/bin/arm-none-eabi-ot-cli-ftd.bin
To flash the binary to the
Firefly to an USB port:
There's no need to manually unlock the bootloader, the on-board PIC on the
Firefly will automatically handle this.
And run the following command:
python $HOME/cc2538-bsl/cc2538-bsl.py -e -w -v -p /dev/ttyUSB0 -a 0x00200000 output/bin/arm-none-eabi-ot-cli-ftd.bin
/dev/ttyUSB0 is the USB port to which the
Firefly is connected, to find out you can run this command:
dmesg | grep ttyUSB [ 1390.565238] usb 3-2: *cp210x converter now attached to ttyUSB0*
CLI and your first OpenThread application
The OpenThread CLI exposes configuration and management APIs via a command line interface. This CLI may be used to play with OpenThread and may be used along side additional application code. The OpenThread test scripts use this CLI to execute test cases.
A comprehensive list of the available commands in available at:
Firefly custom commands
The following are specific CLI commands implemented for the Firefly in the pull/zolertia-firefly branch:
Retrieve a reading from any of the available ADC channels. Note: The
ADC1 channels are reserved for the serial-to-USB communication to the device, thus are restricted and the application will return an error if selected.
The command has the following syntax:
pin can be any pin from 2 to 7. See the Firefly pin-out for more information on the location of the pins.
The command will return something as shown below:
> adc 5 5: 2280 Done
The result is
228.0 mV as the reading has one-digit precision.
Also using the ADC channel the moisture sensor have to connected on ADC 5
First need enable the channel:
> moisture enable moisture enable Done
Now can be read the value
> moisture value moisture: 0 Done
The sensor send '0' when the soil is completely dry or is on the air.
And when the soil is wet the values is similar than:
> moisture value moisture: 15792 Done
TEMPERATURE AND HUMIDITY
To measure the temperature and humidity, you can use the DHT22 sensor to give the temperature and/or humidity data writing in CLI dht22 :
> dht22 enable Done > dht22 readall Temp: 25.0 Humidity 43.2 Done
Temperature range of -40 and 80ºC, and Humidity between 0-100% RH.
The Firefly has RGB leds (red, blue and green), you can turn the leds on and off using the CLI.
The command has the following syntax:
leds <color> <state>
color could be either blue, red or green; and
state is on or off.
The output should be similar to:
> leds red on Done
You can change the pin configuration at the following line.
The command to request a light reading is shown below:
> light 214 Done
First it's need configure a pin as an output
> relay enable relay enable done
And now we can play using the following syntax:
state can be
> relay off relay off Done
Configure the devices and network parameters
For this example you will need at least 2 x
Firefly. Flash both devices as shown above and connect over USB.
To test the
CLI first retrieve the current channel
This should return something like:
> channel 11 Done
26 as follows:
Read back the
channel parameter to check it has been set.
Repeat the above for the second
Firefly and also set/read the following parameters in both devices to be used later:
> extaddr fd7fdbf2624f1f25 Done > panid 1234 Done > extpanid dead00beef00cafe Done > ipaddr fdde:ad00:beef:0:0:ff:fe00:0 fe80:0:0:0:0:ff:fe00:0 fdde:ad00:beef:0:3b99:9bab:4d1f:ac08 fe80:0:0:0:ff7f:dbf2:624f:1f25 Done > networkname OpenThread Done
If you want to change the default values such as the channel number or PAN ID,
src/core/mac/mac.cpp is the file to do so.
Create a wireless OpenThread network
We are assuming we have two Zolertia
Fireflies, one connected in
/dev/ttyUSB0 and the other in
/dev/ttyUSB1. Let us start
OpenThread by running the
start command, wait a few seconds and check if we are the network leader using the
> start start Done > state state leader Done
Now start the second node (the one connected in
/dev/ttyUSB1 in our example):
> start start Done > state router Done
Do an IEEE 802.15.4 Active Scan for available networks using the
scan command, on the
router device console should yield:
> scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread | dead00beef00cafe | 04d2 | fd7fdbf2624f1f25 | 0 | -90 | 107 | Done
Ping the leader device using the
> ping fdde:ad00:beef:0:3b99:9bab:4d1f:ac08 > 16 bytes from fdde:ad00:beef:0:3b99:9bab:4d1f:ac08: icmp_seq=0 hlim=64
And likewise on the
leader device console:
scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread | dead00beef00cafe | 04d2 | 0001020304050607 | 0 | -96 | 101 | Done > ping fdde:ad00:beef:0:96fe:c89:516:282d > 16 bytes from fdde:ad00:beef:0:96fe:c89:516:282d: icmp_seq=1 hlim=64