LoraWanNode: Difference between revisions
No edit summary |
No edit summary |
||
(37 intermediate revisions by 2 users not shown) | |||
Line 3: | Line 3: | ||
|Picture=LoraWanNode.jpg | |Picture=LoraWanNode.jpg | ||
|Omschrijving=Description of how to set up an Arduino Pro Mini and an HopeRF RFM95 to create a LoraWAN node | |Omschrijving=Description of how to set up an Arduino Pro Mini and an HopeRF RFM95 to create a LoraWAN node | ||
|Status= | |Status=Completed | ||
|Contact=bertrik | |Contact=bertrik | ||
}} | }} | ||
== Introduction == | == Introduction == | ||
Line 12: | Line 11: | ||
It doesn't currently contain any new work, it just describes the steps I've done to use existing code to get a LoraWAN node to work with a LoraWAN network. | It doesn't currently contain any new work, it just describes the steps I've done to use existing code to get a LoraWAN node to work with a LoraWAN network. | ||
I've tested this successfully on the-things-network (TTN) in the city of Utrecht | I've tested this successfully on the-things-network (TTN) in the city of Utrecht and on two gateways during a | ||
[http://www.haagsemakers.nl/forums/topic/project-diy-lora-gateway meetup of the Haagse Makers] on 2016-05-10. | |||
=== How to tell if it works === | === How to tell if it works === | ||
On the Arduino side, every time a packet has been successfully sent, you'll see a message containing "EV_TXCOMPLETE" on the serial output of the Arduino. | On the Arduino side, every time a packet has been successfully sent, you'll see a message containing "EV_TXCOMPLETE" on the serial output of the Arduino. | ||
On the TTN side, you can go to http://thethingsnetwork.org/api/v0/nodes/ | <del>On the TTN side, you can go to http://thethingsnetwork.org/api/v0/nodes/YOUR_DEVICE_ADDRESS | ||
where you should see the contents of the message you just sent, along with information about the particular gateway that received your signal, received signal strength and with what settings (bandwidth, spreading factor) your packet was received. | where you should see the contents of the message you just sent, along with information about the particular gateway that received your signal, received signal strength and with what settings (bandwidth, spreading factor) your packet was received.</del> | ||
== Hardware == | == Hardware == | ||
The hardware I've used is: | The hardware I've used is: | ||
* a HopeRF RFM95 module | * a HopeRF RFM95 module, soldered onto a breakout board for easy access to the pins | ||
* an Arduino mini pro, 8MHz/3.3V | * an Arduino mini pro, 8MHz/3.3V (you need the 3.3V version, a 5V mini pro won't work!) | ||
* a CP2104-based USB-serial converter | * a CP2104-based USB-serial converter to connect the Arduino to the development PC | ||
* "dupont" wire to connect everything together | |||
The HopeRF RFM95 module is connected to the Arduino | The HopeRF RFM95 module is connected to the Arduino as follows: | ||
* pin VCC to arduino Vcc pin (3.3V) | * pin VCC to arduino Vcc pin (3.3V) | ||
* pin GND to arduino Gnd pin | * pin GND to arduino Gnd pin | ||
Line 49: | Line 41: | ||
I don't know if connection of all the DIOx pins is really needed. | I don't know if connection of all the DIOx pins is really needed. | ||
At least DIO2 on the RFM95 seems to be used exclusively for some frequency-hopping feature (which is AFAIK not used in LoraWAN), I guess you can ignore that signal. | At least DIO2 on the RFM95 seems to be used exclusively for some frequency-hopping feature (which is AFAIK not used in LoraWAN), I guess you can ignore that signal. | ||
In the code, this means the following setting of the lmic_pins constant: | |||
<pre> | |||
const lmic_pinmap lmic_pins = { | |||
.nss = 10, | |||
.rxtx = LMIC_UNUSED_PIN, | |||
.rst = LMIC_UNUSED_PIN, | |||
.dio = {4, 5, 7}, | |||
}; | |||
</pre> | |||
== Software == | == Software == | ||
This section assumes you are running Linux (I've tested this with Debian Jessie) and that you have git already installed. | |||
=== Tools === | === Tools === | ||
* Arduino IDE 1.6.8, from https://www.arduino.cc/en/Main/Software | * Arduino IDE 1.6.8, from https://www.arduino.cc/en/Main/Software | ||
Line 56: | Line 60: | ||
=== Libraries === | === Libraries === | ||
I've used this LoRa LMIC library: https://github.com/things4u/LoRa-LMIC-1.51.git | I've used this LoRa LMIC library: https://github.com/things4u/LoRa-LMIC-1.51.git | ||
[[Maxell]] did not got it working with this version but had success with https://github.com/matthijskooijman/arduino-lmic | |||
Clone this library into ~/Arduino/libraries and restart the Arduino IDE | Clone this library into ~/Arduino/libraries and restart the Arduino IDE | ||
cd ~/Arduino/libraries | cd ~/Arduino/libraries | ||
git clone https://github.com/things4u/LoRa-LMIC-1.51.git | git clone https://github.com/things4u/LoRa-LMIC-1.51.git | ||
For the matthijskooijman version use | |||
cd ~/Arduino/libraries | |||
git clone https://github.com/matthijskooijman/arduino-lmic.git | |||
=== Node firmware === | === Node firmware === | ||
Line 65: | Line 75: | ||
I made the following changes: | I made the following changes: | ||
* | * in the library: replaced all instances of "arduino.h" by "Arduino.h" (capital "A"). This was needed because I compile on Linux which uses case-sensitive file names. | ||
* changed the device address (variable "DevAddr") in the .ino file to another number (0x19 0x74 0x08 0x23) | * changed the device address (variable "DevAddr") in the .ino file to another number (0x19 0x74 0x08 0x23) | ||
* changed the payload string in function do_send in the .ino file (to my e-mail address) | * changed the payload string in function do_send in the .ino file (to my e-mail address) | ||
When running this code, you can see some debug messages coming in over the serial port at 115200 bps. | When running this code, you can see some debug messages coming in over the serial port at 115200 bps. | ||
== Results == | |||
=== 2016-08-06: personalized Device (ABP) === | |||
While taking the train from Leeuwarden to Gouda, I decided to transmit from the train onto the LoRa gateways in the neighborhood of Utrecht on the way home. | |||
This was also a test for me for the device registration process, see also [https://www.thethingsnetwork.org/wiki/Backend/ttnctl/QuickStart this ttnctl quickstart]. | |||
I registered another personalized device. | |||
In the Arduino code, I copy-pasted the following | |||
* the device address (device address 0x19800501 this time) | |||
* the NwkSKey and AppSKey | |||
To register the device, run: | |||
<pre>ttnctl devices TODO</pre> | |||
The NwkSKey and AppSKey are the ones that see when you do | |||
<pre>ttnctl devices info 19800501</pre> | |||
I didn't need to do any reversing of bytes or anything like that, just copy the hex string into the Arduino code. | |||
To listen using the ttnctl utility, it's simply: | |||
<pre>./ttnctl subscribe | |||
INFO Subscribing to uplink messages from all devices in application 70B3D57ED000078A | |||
INFO Subscribed. Waiting for messages... | |||
INFO 7B2248656C6C6F223A226265727472696B4073696B6B656E2E6E6C227D DevEUI=0000000019800501 | |||
WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 | |||
INFO 7B2248656C6C6F223A226265727472696B4073696B6B656E2E6E6C227D DevEUI=0000000019800501 | |||
WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 | |||
WARN Disconnected, reconnecting... error=pingresp not received, disconnecting | |||
</pre> | |||
To see the message in plain text, add the --plain option: | |||
<pre>./ttnctl subscribe --plain | |||
INFO Subscribing to uplink messages from all devices in application 70B3D57ED000078A | |||
INFO Subscribed. Waiting for messages... | |||
WARN Sending data as plain text is bad practice. We recommend to transmit data in a binary format. | |||
INFO {"Hello":"bertrik@sikken.nl"} DevEUI=0000000019800501 | |||
WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 | |||
INFO {"Hello":"bertrik@sikken.nl"} DevEUI=0000000019800501 | |||
WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 | |||
WARN Disconnected, reconnecting... error=pingresp not received, disconnecting | |||
WARN Disconnected, reconnecting... error=pingresp not received, disconnecting | |||
INFO {"Hello":"bertrik@sikken.nl"} DevEUI=0000000019800501 | |||
WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 | |||
WARN Disconnected, reconnecting... error=pingresp not received, disconnecting | |||
</pre> | |||
To listen on the MQTT stream: | |||
<pre>mosquitto_sub -h staging.thethingsnetwork.org -p 1883 -t +/devices/+/up -u 70B3D57ED000078A -P m7Z3xdRm1jlEkBoTaSCbm3h2f7JfHpPRZXjgzHtFl9E=</pre> | |||
The application EUI and application access keys are the ones that you see when you run: | |||
<pre>ttnctl applications</pre> | |||
resulting in | |||
<pre> | |||
{"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":3,"dev_eui":"0000000019800501","metadata":[{"frequency":867.3,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":1954388012,"gateway_time":"2016-08-06T19:06:05.891844Z","channel":4,"server_time":"2016-08-06T19:06:05.926706718Z","rssi":-118,"lsnr":-10.5,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"AA555A00080605B7","altitude":40,"longitude":5.16738,"latitude":52.08393}]} | |||
{"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":4,"dev_eui":"0000000019800501","metadata":[{"frequency":867.7,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":2168302684,"gateway_time":"2016-08-06T19:09:39.806484Z","channel":6,"server_time":"2016-08-06T19:09:39.840959922Z","rssi":-120,"lsnr":-0.5,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"AA555A00080605B7","altitude":39,"longitude":5.16738,"latitude":52.08392},{"frequency":867.7,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":1293339940,"gateway_time":"2016-08-06T19:08:29.876103Z","channel":6,"server_time":"2016-08-06T19:09:40.052999884Z","rssi":-112,"lsnr":-7,"rfchain":1,"crc":1,"modulation":"LORA","gateway_eui":"008000000000A888","altitude":15,"longitude":5.11127,"latitude":52.08906}]} | |||
{"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":5,"dev_eui":"0000000019800501","metadata":[{"frequency":867.9,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":2382216124,"gateway_time":"2016-08-06T19:13:13.719895Z","channel":7,"server_time":"2016-08-06T19:13:13.760756309Z","rssi":-119,"lsnr":-11,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"AA555A00080605B7","altitude":39,"longitude":5.16739,"latitude":52.08393},{"frequency":867.9,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":1507253220,"gateway_time":"2016-08-06T19:12:03.787853Z","channel":7,"server_time":"2016-08-06T19:13:13.965280234Z","rssi":-108,"lsnr":3.5,"rfchain":1,"crc":1,"modulation":"LORA","gateway_eui":"008000000000A888","altitude":15,"longitude":5.11127,"latitude":52.08906}]} | |||
{"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":7,"dev_eui":"0000000019800501","metadata":[{"frequency":868.1,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":2809949852,"gateway_time":"2016-08-06T19:20:21.45356Z","channel":0,"server_time":"2016-08-06T19:20:21.492938568Z","rssi":-121,"lsnr":-9,"rfchain":1,"crc":1,"modulation":"LORA","gateway_eui":"AA555A00080605B7","altitude":40,"longitude":5.16738,"latitude":52.08396},{"frequency":868.1,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":1934986644,"gateway_time":"2016-08-06T19:19:11.520236Z","channel":0,"server_time":"2016-08-06T19:20:21.699607758Z","rssi":-120,"lsnr":-14.8,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"008000000000A888","altitude":15,"longitude":5.11127,"latitude":52.08906}]} | |||
{"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":8,"dev_eui":"0000000019800501","metadata":[{"frequency":868.3,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":3779659468,"gateway_time":"2016-08-06T19:23:55.36816Z","channel":1,"server_time":"2016-08-06T19:23:55.799624684Z","rssi":-117,"lsnr":-12,"rfchain":1,"crc":1,"modulation":"LORA","gateway_eui":"0000024B080E015D","altitude":82,"longitude":5.05359,"latitude":52.01008}]} | |||
</pre> | |||
The payload field is your data, unencrypted just encoded as BASE64. | |||
=== 2016-08-13: TTN mapper node === | |||
[[File:20160813_ttn_heatmap.jpg|thumb|right]] | |||
In this experiment, I modified a Things Uno (actually a Leonardo!) with an external antenna and reprogrammed it with code for [http://ttnmapper.org/ ttnmapper.org]. | |||
I put a 100 pF capacitor in series to the external antenna, perhaps I should have just bridged (0 ohm) the connection. | |||
Steps performed: | |||
* on github, forked [https://github.com/jpmeijers/ttnmapperarduino ttnmapperarduino] into my own [https://github.com/bertrik/ttnmapperarduino fork] | |||
* on my local disk, added a symlink from libraries/rn2483 to ~/Arduino/libraries | |||
* in my arduino sketch, modified mySerial to Serial1, so it uses the hardware serial port instead of a software emulated serial port | |||
* in my arduino sketch, removed the reset sequence on pin D12 (probably doesn't hurt, but I removed it anyway) | |||
* on the [https://staging.thethingsnetwork.org TTN dashboard], I created an application ("ttnmappergouda") | |||
* on the TTN dashboard, created an ABP device with option 'Relax Frame Count' enabled | |||
* in my arduino sketch, copied the App EUI, NwkSKey, AppSKey and Dev Address into my arduino sketch ('hex' format) into myLora.init(...); | |||
* on my phone in the [https://play.google.com/store/apps/details?id=com.jpmeijers.ttnmapper TTN mapper android app], entered the App EUI and the App secret key | |||
To see live packets from this node: | |||
<pre> | |||
mosquitto_sub -h staging.thethingsnetwork.org -t +/devices/+/up -u 70B3D57ED0000A91 -P aPgDfHWuApjr/MWItruMciYtwTyE5lhZ8RGs3xYALFM= | |||
</pre> | |||
To see the scan result from a little bike tour around the gateway, go to [http://ttnmapper.org/ ttnmapper page] and zoom into Gouda, around the train station. | |||
=== 2016-09-13: improved LMIC code === | |||
The code from [https://github.com/matthijskooijman/arduino-lmic this arduino LMIC implementation] looks a lot better than the code I used before: | |||
* less memory use: about 20 kB, leaving more room for your own application stuff | |||
* more debugging: shows more logging about what is going on | |||
* better examples: comes with examples for ABP and OTAA | |||
=== 2016-10-02: motion detection node === | |||
The point of this experiment is to create a simple LoRa node that is actually somewhat useful. | |||
The idea is to attach a cheap PIR motion detector module to an Arduino and make it send a LoRa signal when motion is detected. | |||
Proposed design: | |||
* the processor is an Arduino Pro Mini 3.3V 8MHz which is compatible in signal levels with an RFM95 LoRa module | |||
* the Arduino is mostly sleeping to save battery power, waking up periodically to check if its time to send something | |||
* to wake up the Arduino, the output of the PIR is connected to a pin that can wake up the Arduino from sleep | |||
* the Arduino counts the number of times that movement was detected and sends this to TTN | |||
Hardware: | |||
* an inexpensive [https://nl.aliexpress.com/item/Free-Shipping-1PCS-SR501-HC-SR501-Adjust-IR-Pyroelectric-Infrared-PIR-module-Motion-Sensor-Detector-Module/1874938103.html "HC-SR05" PIR module], about E1,- | |||
* an Arduino Pro mini 3.3V 8MHz, about E1,50 | |||
* an RFM95 module, about E10,- | |||
* some pieces of wire | |||
Software: | |||
* wakes up (by interrupt) through a hardware interrupt from the PIR, or periodically from the watchdog | |||
* keeps a counter of number of movements in EEPROM (think about EEPROM longevity) | |||
* tries to send an update every time the counter changes | |||
TODO: | |||
* measure the current consumption of the PIR module / the entire circuit in sleep mode | |||
* measure current consumption of a doppler radar movement detector module like the XYC-WB-DC | |||
=== 2016-12-30 OTAA using arduino LMIC with the v2 backend === | |||
Steps performed: | |||
* registered a new app on http://console.thethingsnetwork.org | |||
* registered a new device for the application, specifying just one byte of the device id (12), leaving other fields (device EUI and AppKey) to be auto-generated | |||
* copied the auto-generated fields to my code: | |||
** Device EUI in '''lsb''' format | |||
** Application EUI in '''lsb''' format | |||
** App Key in '''msb''' format |
Latest revision as of 11:02, 24 April 2019
Project LoraWanNode | |
---|---|
Description of how to set up an Arduino Pro Mini and an HopeRF RFM95 to create a LoraWAN node | |
Status | Completed |
Contact | bertrik |
Last Update | 2019-04-24 |
Introduction
This page describes the steps needed to create a simple LoraWAN node for the-things-network, using an Arduino Pro Mini and a HopeRF RFM95 module. It doesn't currently contain any new work, it just describes the steps I've done to use existing code to get a LoraWAN node to work with a LoraWAN network.
I've tested this successfully on the-things-network (TTN) in the city of Utrecht and on two gateways during a meetup of the Haagse Makers on 2016-05-10.
How to tell if it works
On the Arduino side, every time a packet has been successfully sent, you'll see a message containing "EV_TXCOMPLETE" on the serial output of the Arduino.
On the TTN side, you can go to http://thethingsnetwork.org/api/v0/nodes/YOUR_DEVICE_ADDRESS
where you should see the contents of the message you just sent, along with information about the particular gateway that received your signal, received signal strength and with what settings (bandwidth, spreading factor) your packet was received.
Hardware
The hardware I've used is:
- a HopeRF RFM95 module, soldered onto a breakout board for easy access to the pins
- an Arduino mini pro, 8MHz/3.3V (you need the 3.3V version, a 5V mini pro won't work!)
- a CP2104-based USB-serial converter to connect the Arduino to the development PC
- "dupont" wire to connect everything together
The HopeRF RFM95 module is connected to the Arduino as follows:
- pin VCC to arduino Vcc pin (3.3V)
- pin GND to arduino Gnd pin
- pin NSS to arduino pin D10 (SS)
- pin SCK to arduino pin D13 (SCK)
- pin MOSI to arduino pin D11 (MOSI)
- pin MISO to arduino pin D12 (MISO)
- pin DIO0 to arduino pin D4
- pin DIO1 to arduino pin D5
- pin DIO2 to arduino pin D7
Basically this connects the RFM95 to the SPI bus of the Arduino, connects the RFM95 to 3.3V power and connects some of the generic RFM95 I/Os (like interrupt signals) to the Arduino. I don't know if connection of all the DIOx pins is really needed. At least DIO2 on the RFM95 seems to be used exclusively for some frequency-hopping feature (which is AFAIK not used in LoraWAN), I guess you can ignore that signal.
In the code, this means the following setting of the lmic_pins constant:
const lmic_pinmap lmic_pins = { .nss = 10, .rxtx = LMIC_UNUSED_PIN, .rst = LMIC_UNUSED_PIN, .dio = {4, 5, 7}, };
Software
This section assumes you are running Linux (I've tested this with Debian Jessie) and that you have git already installed.
Tools
- Arduino IDE 1.6.8, from https://www.arduino.cc/en/Main/Software
Libraries
I've used this LoRa LMIC library: https://github.com/things4u/LoRa-LMIC-1.51.git
Maxell did not got it working with this version but had success with https://github.com/matthijskooijman/arduino-lmic
Clone this library into ~/Arduino/libraries and restart the Arduino IDE
cd ~/Arduino/libraries git clone https://github.com/things4u/LoRa-LMIC-1.51.git
For the matthijskooijman version use
cd ~/Arduino/libraries git clone https://github.com/matthijskooijman/arduino-lmic.git
Node firmware
The firmware used on the arduino is the nano-lmic-v1.51-F.ino from the examples directory of the LoRa LMIC library.
I made the following changes:
- in the library: replaced all instances of "arduino.h" by "Arduino.h" (capital "A"). This was needed because I compile on Linux which uses case-sensitive file names.
- changed the device address (variable "DevAddr") in the .ino file to another number (0x19 0x74 0x08 0x23)
- changed the payload string in function do_send in the .ino file (to my e-mail address)
When running this code, you can see some debug messages coming in over the serial port at 115200 bps.
Results
2016-08-06: personalized Device (ABP)
While taking the train from Leeuwarden to Gouda, I decided to transmit from the train onto the LoRa gateways in the neighborhood of Utrecht on the way home.
This was also a test for me for the device registration process, see also this ttnctl quickstart. I registered another personalized device.
In the Arduino code, I copy-pasted the following
- the device address (device address 0x19800501 this time)
- the NwkSKey and AppSKey
To register the device, run:
ttnctl devices TODO
The NwkSKey and AppSKey are the ones that see when you do
ttnctl devices info 19800501
I didn't need to do any reversing of bytes or anything like that, just copy the hex string into the Arduino code.
To listen using the ttnctl utility, it's simply:
./ttnctl subscribe INFO Subscribing to uplink messages from all devices in application 70B3D57ED000078A INFO Subscribed. Waiting for messages... INFO 7B2248656C6C6F223A226265727472696B4073696B6B656E2E6E6C227D DevEUI=0000000019800501 WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 INFO 7B2248656C6C6F223A226265727472696B4073696B6B656E2E6E6C227D DevEUI=0000000019800501 WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 WARN Disconnected, reconnecting... error=pingresp not received, disconnecting
To see the message in plain text, add the --plain option:
./ttnctl subscribe --plain INFO Subscribing to uplink messages from all devices in application 70B3D57ED000078A INFO Subscribed. Waiting for messages... WARN Sending data as plain text is bad practice. We recommend to transmit data in a binary format. INFO {"Hello":"bertrik@sikken.nl"} DevEUI=0000000019800501 WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 INFO {"Hello":"bertrik@sikken.nl"} DevEUI=0000000019800501 WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 WARN Disconnected, reconnecting... error=pingresp not received, disconnecting WARN Disconnected, reconnecting... error=pingresp not received, disconnecting INFO {"Hello":"bertrik@sikken.nl"} DevEUI=0000000019800501 WARN Your payload has a size of 29 bytes. We recommend to send no more than 20 bytes. DevEUI=0000000019800501 WARN Disconnected, reconnecting... error=pingresp not received, disconnecting
To listen on the MQTT stream:
mosquitto_sub -h staging.thethingsnetwork.org -p 1883 -t +/devices/+/up -u 70B3D57ED000078A -P m7Z3xdRm1jlEkBoTaSCbm3h2f7JfHpPRZXjgzHtFl9E=
The application EUI and application access keys are the ones that you see when you run:
ttnctl applications
resulting in
{"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":3,"dev_eui":"0000000019800501","metadata":[{"frequency":867.3,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":1954388012,"gateway_time":"2016-08-06T19:06:05.891844Z","channel":4,"server_time":"2016-08-06T19:06:05.926706718Z","rssi":-118,"lsnr":-10.5,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"AA555A00080605B7","altitude":40,"longitude":5.16738,"latitude":52.08393}]} {"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":4,"dev_eui":"0000000019800501","metadata":[{"frequency":867.7,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":2168302684,"gateway_time":"2016-08-06T19:09:39.806484Z","channel":6,"server_time":"2016-08-06T19:09:39.840959922Z","rssi":-120,"lsnr":-0.5,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"AA555A00080605B7","altitude":39,"longitude":5.16738,"latitude":52.08392},{"frequency":867.7,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":1293339940,"gateway_time":"2016-08-06T19:08:29.876103Z","channel":6,"server_time":"2016-08-06T19:09:40.052999884Z","rssi":-112,"lsnr":-7,"rfchain":1,"crc":1,"modulation":"LORA","gateway_eui":"008000000000A888","altitude":15,"longitude":5.11127,"latitude":52.08906}]} {"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":5,"dev_eui":"0000000019800501","metadata":[{"frequency":867.9,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":2382216124,"gateway_time":"2016-08-06T19:13:13.719895Z","channel":7,"server_time":"2016-08-06T19:13:13.760756309Z","rssi":-119,"lsnr":-11,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"AA555A00080605B7","altitude":39,"longitude":5.16739,"latitude":52.08393},{"frequency":867.9,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":1507253220,"gateway_time":"2016-08-06T19:12:03.787853Z","channel":7,"server_time":"2016-08-06T19:13:13.965280234Z","rssi":-108,"lsnr":3.5,"rfchain":1,"crc":1,"modulation":"LORA","gateway_eui":"008000000000A888","altitude":15,"longitude":5.11127,"latitude":52.08906}]} {"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":7,"dev_eui":"0000000019800501","metadata":[{"frequency":868.1,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":2809949852,"gateway_time":"2016-08-06T19:20:21.45356Z","channel":0,"server_time":"2016-08-06T19:20:21.492938568Z","rssi":-121,"lsnr":-9,"rfchain":1,"crc":1,"modulation":"LORA","gateway_eui":"AA555A00080605B7","altitude":40,"longitude":5.16738,"latitude":52.08396},{"frequency":868.1,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":1934986644,"gateway_time":"2016-08-06T19:19:11.520236Z","channel":0,"server_time":"2016-08-06T19:20:21.699607758Z","rssi":-120,"lsnr":-14.8,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"008000000000A888","altitude":15,"longitude":5.11127,"latitude":52.08906}]} {"payload":"eyJIZWxsbyI6ImJlcnRyaWtAc2lra2VuLm5sIn0=","port":1,"counter":8,"dev_eui":"0000000019800501","metadata":[{"frequency":868.3,"datarate":"SF12BW125","codingrate":"4/5","gateway_timestamp":3779659468,"gateway_time":"2016-08-06T19:23:55.36816Z","channel":1,"server_time":"2016-08-06T19:23:55.799624684Z","rssi":-117,"lsnr":-12,"rfchain":1,"crc":1,"modulation":"LORA","gateway_eui":"0000024B080E015D","altitude":82,"longitude":5.05359,"latitude":52.01008}]}
The payload field is your data, unencrypted just encoded as BASE64.
2016-08-13: TTN mapper node
In this experiment, I modified a Things Uno (actually a Leonardo!) with an external antenna and reprogrammed it with code for ttnmapper.org. I put a 100 pF capacitor in series to the external antenna, perhaps I should have just bridged (0 ohm) the connection.
Steps performed:
- on github, forked ttnmapperarduino into my own fork
- on my local disk, added a symlink from libraries/rn2483 to ~/Arduino/libraries
- in my arduino sketch, modified mySerial to Serial1, so it uses the hardware serial port instead of a software emulated serial port
- in my arduino sketch, removed the reset sequence on pin D12 (probably doesn't hurt, but I removed it anyway)
- on the TTN dashboard, I created an application ("ttnmappergouda")
- on the TTN dashboard, created an ABP device with option 'Relax Frame Count' enabled
- in my arduino sketch, copied the App EUI, NwkSKey, AppSKey and Dev Address into my arduino sketch ('hex' format) into myLora.init(...);
- on my phone in the TTN mapper android app, entered the App EUI and the App secret key
To see live packets from this node:
mosquitto_sub -h staging.thethingsnetwork.org -t +/devices/+/up -u 70B3D57ED0000A91 -P aPgDfHWuApjr/MWItruMciYtwTyE5lhZ8RGs3xYALFM=
To see the scan result from a little bike tour around the gateway, go to ttnmapper page and zoom into Gouda, around the train station.
2016-09-13: improved LMIC code
The code from this arduino LMIC implementation looks a lot better than the code I used before:
- less memory use: about 20 kB, leaving more room for your own application stuff
- more debugging: shows more logging about what is going on
- better examples: comes with examples for ABP and OTAA
2016-10-02: motion detection node
The point of this experiment is to create a simple LoRa node that is actually somewhat useful. The idea is to attach a cheap PIR motion detector module to an Arduino and make it send a LoRa signal when motion is detected.
Proposed design:
- the processor is an Arduino Pro Mini 3.3V 8MHz which is compatible in signal levels with an RFM95 LoRa module
- the Arduino is mostly sleeping to save battery power, waking up periodically to check if its time to send something
- to wake up the Arduino, the output of the PIR is connected to a pin that can wake up the Arduino from sleep
- the Arduino counts the number of times that movement was detected and sends this to TTN
Hardware:
- an inexpensive "HC-SR05" PIR module, about E1,-
- an Arduino Pro mini 3.3V 8MHz, about E1,50
- an RFM95 module, about E10,-
- some pieces of wire
Software:
- wakes up (by interrupt) through a hardware interrupt from the PIR, or periodically from the watchdog
- keeps a counter of number of movements in EEPROM (think about EEPROM longevity)
- tries to send an update every time the counter changes
TODO:
- measure the current consumption of the PIR module / the entire circuit in sleep mode
- measure current consumption of a doppler radar movement detector module like the XYC-WB-DC
2016-12-30 OTAA using arduino LMIC with the v2 backend
Steps performed:
- registered a new app on http://console.thethingsnetwork.org
- registered a new device for the application, specifying just one byte of the device id (12), leaving other fields (device EUI and AppKey) to be auto-generated
- copied the auto-generated fields to my code:
- Device EUI in lsb format
- Application EUI in lsb format
- App Key in msb format