Skip to content
LoRaWAN implementation in python
Branch: master
Clone or download
Pull request Compare This branch is 54 commits ahead of jeroennijhof:master.
pjb304 Now don't try to reserve a pin for DIO3 on the pi header as it's not …

Bump the version number for a new release
Latest commit 55b56af Oct 18, 2019


This is a LoRaWAN v1.0 implementation in python for the Dragino LoRa/GPS HAT, it is currently being used to connect to the things network It is based on work at

It uses


Hardware Needed

  • Raspberry Pi
  • SD card
  • LoRa/GPS HAT


  1. Install Raspbian on the Raspberry Pi
  2. Enable SPI using raspi-config
  3. Enable Serial using raspi-config (no login shell)
  4. Install the required packages sudo apt install device-tree-compiler git python3-crypto python3-nmea2 python3-rpi.gpio python3-serial python3-spidev python3-configobj
  5. Download the git repo git clone
  6. Enable additional CS lines (See section below for explanation)
    1. Change into the overlay directory cd dragino/overlay
    2. Compile the overlay dtc -@ -I dts -O dtb -o spi-gpio-cs.dtbo spi-gpio-cs-overlay.dts. This might generate a couple of warnings, but seems to work ok
    3. Copy the output file to the required folder sudo cp spi-gpio-cs.dtbo /boot/overlays/
    4. Enable the overlay at next reboot echo "dtoverlay=spi-gpio-cs" | sudo tee -a /boot/config.txt
    5. Reboot the Pi sudo reboot
    6. Check that the new cs lines are enabled ls /dev/spidev0.* should output /dev/spidev0.0 /dev/spidev0.1 /dev/spidev0.2. In which case the required SPI CS line now exists
  7. Create a new device in The Things Network console and copy the details into the config file
  8. Run the test programm ./ and the device should transmit on the things network using OTAA authentication

Additional Chip Select Details

For some reason the Dragino board does not use one of the standard chip select lines for the SPI communication. This can be overcome by using a device tree overlay to configure addtional SPI CS lines. I am not a device tree expert so I adapted the example given at to provide the code needed for this to work.


  • Make code more readable and easier to use (From upstream)
  • Add GPS code into dragino class
  • Use .ini files for config not .py
  • investigate device tree compilation warnings
  • Test recieving of messages
You can’t perform that action at this time.