Adafruit LoRa Radio Bonnet User Manual

Page 1
Adafruit Radio Bonnets with OLED Display - RFM69 or RFM9X
Created by Kattni Rembor
Last updated on 2021-07-07 11:30:09 AM EDT
Page 2
2 3
5 6 6
7 7 8 8
10
10 10 11
14
14
18
18 18
22
22
26
26 26
30 31 32 32 32 33
Guide Contents
Guide Contents Overview
Radio Modules & Frequency Variants RFM69 Specs RFM9x Specs
Pinouts Radio Module Pins 128x32 OLED Buttons Antenna Options
Wire Antenna uFL Antenna SMA Edge-Mount Antenna
RFM69 Raspberry Pi Setup
Installing CircuitPython Libraries
RFM69 Connection Test!
Sending Data with the RFM69
RFM69 and CircuitPython CircuitPython Transmitter/Receiver Example
LoRa Raspberry Pi Setup
Installing CircuitPython Libraries
RFM9x Connection Test!
Sending Data with LoRa
RFM9x and CircuitPython CircuitPython Transmitter/Receiver Example
LoRaWAN Node Guide LoRaWAN Pi Gateway Guide Downloads Files Fab Print Schematic
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 2 of 34
Page 3
Overview
The latest Raspberry Pi computers come with WiFi and Bluetooth, and now you can add even more radio
options with the Adafruit Radio Bonnets! Upgrade your Raspberry Pi with a radio so it can communicate
over very long distances. These bonnets plug right into your Pi and give you long range wireless
capabilities to remote nodes that may be battery powered. Or, you can create Internet gateways with
ease.
You not only get a radio module, but also a 128x32 OLED display for status messages and three buttons
you can use for creating a custom user interface or sending test messages. All of the above is supported
with our Python libraries so you can send or receive radio data with other matching modules. With the
LoRa Radio Bonnet, you send data to a LoRaWAN gateway, or even set up your own single channel
LoRaWAN-to-Internet gateways.
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 3 of 34
Page 4
Compared to the 2.4 GHz WiFi/Bluetooth radios on the Pi already, these modules run at 433 or 900 MHz
(sub-GHz). You can't send data as fast but you can send data a lot farther. These packet radios are simpler
than WiFi or BLE, you don't have to associate, pair, scan, or worry about connections. All you do is send
data whenever you like, and any other modules tuned to that same frequency (and, with the same
encryption key) will receive. The receiver can then send a reply back. The modules do packetization, error
correction and can also auto-retransmit so its not like you have worry about everything but less power is
wasted on maintaining a link or pairing.
These modules are great for use with other microcontrollers with matching radios (like say our RadioFruit
Feathers (https://adafru.it/DFj)), say if you want a sensor node network or transmit data over a campus or
town. The trade off is you need two or more radios, with matching frequencies.
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 4 of 34
Page 5
Radio Modules & Frequency Variants
These radio modules come in four variants (two modulation types and two frequencies):
The first variant is the RFM69 Radio Bonnet. RFM69's are easiest to work with, and are well known
and understood. It is available in 433MHz or 900MHz frequency ranges
The second variant is the LoRa Radio Bonnet - an exciting and more powerful radio module, but also
more expensive. It is available in 433MHz or 900MHz frequency ranges
Here are the four bonnets you can choose from. All radios are sold individually and can only talk to radios
of the same part number. E.g. RFM69 900 MHz can only talk to RFM69 900 MHz, LoRa 433 MHz can only
talk to LoRa 433, etc.
1. RFM69 @ 433 MHz - basic packetized FSK/GFSK/MSK/GMSK/OOK radio at 433 MHz for use in
Europe ITU 1 license-free ISM, or for amateur use with restrictions (check your local amateur
regulations!)
2. RFM69 @ 900 MHz - basic packetized FSK/GFSK/MSK/GMSK/OOK radio at 868 or 915 MHz for use
in Americas ITU 2 license-free ISM, or for amateur use with restrictions (check your amateur
regulations!)
3. RFM9x @ 433 MHz - LoRa capable radio at 433 MHz for use in Europe ITU 1 license-free ISM, or for
amateur use with restrictions (check your local amateur regulations!)
4. RFM9x @ 900 MHz - LoRa capable radio at 868 or 915 MHz for use in Americas ITU 2 license-free
ISM, or for amateur use with restrictions (check your local amateur regulations!)
Please note! The 900 MHz radio version, can be used for either 868MHz or 915MHz
transmission/reception. The exact radio frequency is determined when you load the software since it can
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 5 of 34
Page 6
be tuned around dynamically.
The radio modules themselves have the same pinout so the PCB is the same, but the library usage and
wiring may vary. All use SPI for interfacing, and there are CircuitPython libraries available for both.
RFM69 Specs
SX1231 based module with SPI interface
Packet radio with ready-to-go Arduino libraries
Uses the license-free ISM bands
+13 to +20 dBm up to 100 mW Power Output Capability (power output selectable in software)
50mA (+13 dBm) to 150mA (+20dBm) current draw for transmissions
Range of approx. 350 meters, depending on obstructions, frequency, antenna and power output
Create multipoint networks with individual node addresses
Encrypted packet engine with AES-128
RFM9x Specs
SX127x LoRa® based module with SPI interface
Packet radio with ready-to-go Arduino libraries
Uses the license-free ISM bands
+5 to +20 dBm up to 100 mW Power Output Capability (power output selectable in software)
~300uA during full sleep, ~120mA peak during +20dBm transmit, ~40mA during active radio
listening.
Our initial tests with default library settings: over 1.2mi/2Km line-of-sight with wire quarter-wave
antennas. (With setting tweaking and directional antennas, 20Km is possible (https://adafru.it/mGa)).
Each bonnet comes fully assembled and ready to go. You can attach an antenna via the uFL connector, or
cut and solder on a small piece of wire (any solid or stranded core is fine) in order to create your antenna.
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 6 of 34
Page 7
Pinouts
Radio Module Pins
There's a radio module on each bonnet, which we connect to the Raspberry Pi SPI port plus some extra
pins for controlling.
We connect the radio module to a set of default pins that match our code and examples, you can cut
the solder traces on the bottom and re-wire them but the code/examples will need to be updated as
well.
Each radio has the same pin names and connections. Its easiest to see the pin numbering on the bottom.
The two sets of pins here are broken out from the radio module. The defaults are:
RST - Radio reset pin, connected to GPIO25 on the Pi
CS - Radio SPI Chip Select pin, connected to SPI CE1 on the Pi
CLK - Radio SPI Clock pin, connected to SPI SCLK on the Pi
DI - Radio SPI data in pin, connected to SPI MOSI on the Pi
DO - Radio SPI data out pin, connected to SPI MISO on the Pi
DIO0 - Radio digital IO #0 pin, we use this for status or IRQs. It's required for all our examples.
Connected to GPIO 22 on the Pi
DIO1 - Radio digital IO #1 pin, we use this for status. This is not used for our basic CircuitPython code,
but is used by some more advanced libraries. You can cut this trace if you want to use the Pi pin for
other devices. Connected to GPIO 23 on the Pi
There are 4 different Radio Bonnets, with RFM69 or RFM9X and with 900MHz or 433MHz -
however the overall pinouts are identical for all four!
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 7 of 34
Page 8
DIO2 - Radio digital IO #2 pin, we use this for status. This is not used for our basic CircuitPython
code, but is used by some more advanced libraries. You can cut this trace if you want to use the Pi
pin for other devices. Connected to GPIO 24 on the Pi
DIO3 - Radio digital IO #3, not connected or used at this time.
DIO4 - Radio digital IO #3, not connected or used at this time.
128x32 OLED
This bonnet comes with a 128x32 pixel OLED! The OLED is connected via I2C .
SCL is connected to SCL on the Pi.
SDA is connected to SDA on the Pi.
Buttons
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 8 of 34
Page 9
This bonnet comes with 3 buttons below the OLED. In order from left to right:
Button 1: Connected to GPIO 5 on the Pi
Button 2: Connected to GPIO 6 on the Pi
Button 3: Connected to GPIO 12 on the PI
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 9 of 34
Page 10
Antenna Options
The Radio Bonnets do not have a built-in antenna. Instead, they have three options for attaching an
antenna - for most low cost radio nodes, a wire works great. If you need to put the radio into an enclosure.
We also include a uFL connector, pre-soldered, so you can use a uFL to SMA adapter to let you attach an
external antenna. You can also solder an SMA edge-mount connector directly
Wire Antenna
A wire antenna, aka "quarter wave whip antenna" is low cost and works very well! You just have to cut the
wire down to the right length.
Cut a stranded or solid core wire the the proper length for the module/frequency
433 MHz - 6.5 inches, or 16.5 cm
868 MHz - 3.25 inches or 8.2 cm
915 MHz - 3 inches or 7.8 cm
Strip a mm or two off the end of the wire, tin and solder into the ANT pad.
uFL Antenna
If you want an external antenna that is a few inches away from the radio, you'll want a uFL antenna. The
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 10 of 34
Page 11
radio bonnets have a uFL connector soldered on already - you'll also need a uFL to SMA
adapter (http://adafru.it/851) (or whatever adapter you need for the antenna you'll be using, SMA is the
most common
Of course, you will also need an antenna of some sort, that matches your radio frequency. We have an
antenna kit available which works well with the Radio Bonnet:
900Mhz Antenna Kit - For LoPy, LoRa, etc
This LoRa Antenna Kit is meant for use with the LoPy LoRa, WiFi and BLE board or the SiPy Sigfox,...
$12.75
In Stock
SMA Edge-Mount Antenna
These strong edge connectors are used for many 'duck' antennas, and can also be panel mounted
You'll need an SMA (or, if you need RP-SMA for some
reason) Edge-Mount connector with 1.6mm spacing
The SMA connector 'slides on' the top of the PCB
Add to Cart
uFL connectors are rated for 30 connection cycles, but be careful when
connecting/disconnecting to not rip the pads off the PCB. Once a uFL/SMA adapter is connected,
use strain relief!
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 11 of 34
Page 12
You'll need an SMA (or, if you need RP-SMA for some
reason) Edge-Mount connector with 1.6mm spacing
The SMA connector 'slides on' the top of the PCB
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 12 of 34
Page 13
Use plenty of solder to make sure you have a good
strong mechanical connection. The duck antennas are
long and make great levers, so they could pry apart the
solder joints if not soldered well
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 13 of 34
Page 14
RFM69 Raspberry Pi Setup
This guide assumes that you've gotten your Raspberry Pi up and running, and have CircuitPython
installed.
If you have not done this yet, visit the installation guide here and come back when you're set
up. (https://adafru.it/Deo)
Installing CircuitPython Libraries
We're running CircuitPython on the Raspberry Pi, installing the libraries for radio communication is simple.
To install the library for the display , enter the following into the terminal:
pip3 install adafruit-circuitpython-ssd1306
You'll also need to install the framebuf module in order to write to the display.
sudo pip3 install adafruit-circuitpython-framebuf
To install the library for the RFM69HCW Module, enter the following into the terminal:
sudo pip3 install adafruit-circuitpython-rfm69
RFM69 Connection Test!
The following code is for checking if the RFM69 radio is set up for transmitting and receiving. Save the
code on your Pi as rfm69_check.py .
""" Wiring Check, Pi Radio w/RFM69
Learn Guide: https://learn.adafruit.com/lora-and-lorawan-for-raspberry-pi Author: Brent Rubell for Adafruit Industries """ import time import busio from digitalio import DigitalInOut, Direction, Pull import board # Import the SSD1306 module. import adafruit_ssd1306 # Import the RFM69 radio module.
Do not use this if you have a RFM9x Radio
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 14 of 34
Page 15
import adafruit_rfm69
# Button A btnA = DigitalInOut(board.D5) btnA.direction = Direction.INPUT btnA.pull = Pull.UP
# Button B btnB = DigitalInOut(board.D6) btnB.direction = Direction.INPUT btnB.pull = Pull.UP
# Button C btnC = DigitalInOut(board.D12) btnC.direction = Direction.INPUT btnC.pull = Pull.UP
# Create the I2C interface. i2c = busio.I2C(board.SCL, board.SDA)
# 128x32 OLED Display reset_pin = DigitalInOut(board.D4) display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, reset=reset_pin) # Clear the display. display.fill(0) display.show() width = display.width height = display.height
# RFM69 Configuration CS = DigitalInOut(board.CE1) RESET = DigitalInOut(board.D25) spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
while True: # Draw a black filled box to clear the image. display.fill(0)
# Attempt to set up the RFM69 Module try: rfm69 = adafruit_rfm69.RFM69(spi, CS, RESET, 915.0) display.text('RFM69: Detected', 0, 0, 1) except RuntimeError as error: # Thrown on version mismatch display.text('RFM69: ERROR', 0, 0, 1) print('RFM69 Error: ', error)
# Check buttons if not btnA.value: # Button A Pressed display.text('Ada', width-85, height-7, 1) display.show() time.sleep(0.1) if not btnB.value: # Button B Pressed display.text('Fruit', width-75, height-7, 1)
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 15 of 34
Page 16
display.text('Fruit', width-75, height-7, 1) display.show() time.sleep(0.1) if not btnC.value: # Button C Pressed display.text('Radio', width-65, height-7, 1) display.show() time.sleep(0.1)
display.show() time.sleep(0.1)
To use the code, enter the following in your terminal:
python3 rfm69_check.py
You'll also want to download the font file, font5x8.bin , and copy it into the same directory as the script:
https://adafru.it/DvA
If you want to download this file to your Raspberry Pi via the command line, enter the following wget
command into your terminal:
wget -O font5x8.bin https://github.com/adafruit/Adafruit_CircuitPython_framebuf/blob/master/examples/font5x8.bin? raw=true
Now to check the setup:
The radio should display that a RFM69 module is detected. Pressing each of the buttons should display
different text on the screen.
If it can't detect a RFM69 module, the screen will display RFM69: ERROR
https://adafru.it/DvA
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 16 of 34
Page 17
With everything working, let's move on to using the radio.
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 17 of 34
Page 18
Sending Data with the RFM69
To demonstrate how the RFM69 module sends packets, we'll build an example where one radio transmits
(the Pi) and the other radio connected to a Feather receives the incoming transmission.
RFM69 and CircuitPython
It's easy to use the RFM69HCW radio with CircuitPython and the Adafruit CircuitPython
RFM69 (https://adafru.it/BjE) library. This library allows you to easily write Python code that sends and
receives packets of data with the radio.
Be careful to note this code is for the RFM69 radio only and will not work with the RFM9X LoRa radios!
You'll also need another radio with a RFM69HCW Module to run the example below. Make sure you have
two of the same type of radio (i.e: RFM69HCW) and the same frequency (i.e: 915MHz).
CircuitPython Transmitter/Receiver Example
Below is an example of using the RFM69HCW to transmit, or receive from, another RFM69HCW radio.
Save this as radio_rfm69.py on your Raspberry Pi.
""" Example for using the RFM69HCW Radio with Raspberry Pi.
Learn Guide: https://learn.adafruit.com/lora-and-lorawan-for-raspberry-pi Author: Brent Rubell for Adafruit Industries """ # Import Python System Libraries import time # Import Blinka Libraries import busio from digitalio import DigitalInOut, Direction, Pull import board # Import the SSD1306 module. import adafruit_ssd1306 # Import the RFM69 radio module. import adafruit_rfm69
# Button A btnA = DigitalInOut(board.D5) btnA.direction = Direction.INPUT btnA.pull = Pull.UP
# Button B
Do not use this if you have a RFM9x LoRa Radio.
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 18 of 34
Page 19
btnB = DigitalInOut(board.D6) btnB.direction = Direction.INPUT btnB.pull = Pull.UP
# Button C btnC = DigitalInOut(board.D12) btnC.direction = Direction.INPUT btnC.pull = Pull.UP
# Create the I2C interface. i2c = busio.I2C(board.SCL, board.SDA)
# 128x32 OLED Display reset_pin = DigitalInOut(board.D4) display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, reset=reset_pin) # Clear the display. display.fill(0) display.show() width = display.width height = display.height
# Configure Packet Radio CS = DigitalInOut(board.CE1) RESET = DigitalInOut(board.D25) spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) rfm69 = adafruit_rfm69.RFM69(spi, CS, RESET, 915.0) prev_packet = None # Optionally set an encryption key (16 byte AES key). MUST match both # on the transmitter and receiver (or be set to None to disable/the default). rfm69.encryption_key = b'\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08'
while True: packet = None # draw a box to clear the image display.fill(0) display.text('RasPi Radio', 35, 0, 1)
# check for packet rx packet = rfm69.receive() if packet is None: display.show() display.text('- Waiting for PKT -', 15, 20, 1) else: # Display the packet text and rssi display.fill(0) prev_packet = packet packet_text = str(prev_packet, "utf-8") display.text('RX: ', 0, 0, 1) display.text(packet_text, 25, 0, 1) time.sleep(1)
if not btnA.value: # Send Button A display.fill(0) button_a_data = bytes("Button A!\r\n","utf-8") rfm69.send(button_a_data)
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 19 of 34
Page 20
display.text('Sent Button A!', 25, 15, 1) elif not btnB.value: # Send Button B display.fill(0) button_b_data = bytes("Button B!\r\n","utf-8") rfm69.send(button_b_data) display.text('Sent Button B!', 25, 15, 1) elif not btnC.value: # Send Button C display.fill(0) button_c_data = bytes("Button C!\r\n","utf-8") rfm69.send(button_c_data) display.text('Sent Button C!', 25, 15, 1)
display.show() time.sleep(0.1)
To run the example, enter the following into the terminal :
python3 radio_rfm69.py
You'll also want to download the font file, font5x8.bin , and copy it into the same directory as the script:
https://adafru.it/DvA
Both of the radios will listen for a new incoming packet. When they receive a new packet, they'll print the
text from the packet to the display and to the terminal.
Press any of the three buttons to send data between radios. Pressing button a will send a packet with data
'Button A!' to the other radio, and so on!
To send a packet using the Pi, press Button A . You should see the text change to
Sent Packet!
https://adafru.it/DvA
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 20 of 34
Page 21
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 21 of 34
Page 22
LoRa Raspberry Pi Setup
This guide assumes that you've gotten your Raspberry Pi up and running, and have CircuitPython
installed.
If you have not done this yet, visit the installation guide here and come back when you're set
up. (https://adafru.it/Deo)
Installing CircuitPython Libraries
We're running CircuitPython on the Raspberry Pi, installing the libraries for radio communication is simple.
To install the library for the display , enter the following into the terminal:
sudo pip3 install adafruit-circuitpython-ssd1306
You'll also need to install the framebuf module in order to write to the display.
sudo pip3 install adafruit-circuitpython-framebuf
To install the library for the RFM9x Module, enter the following into the terminal:
sudo pip3 install adafruit-circuitpython-rfm9x
You'll also want to download the font file, font5x8.bin , and copy it into the same directory as the script
wget https://github.com/adafruit/Adafruit_CircuitPython_framebuf/raw/main/examples/font5x8.bin
https://adafru.it/DvA
Make sure the font file is 1282 bytes long, if not something went wrong with the download
RFM9x Connection Test!
https://adafru.it/DvA
Do not use this if you have a RFM69 Radio
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 22 of 34
Page 23
The following code is for checking if the RFM9x radio is set up for transmitting and receiving. Save the
code on your Pi as rfm9x_check.py .
""" Wiring Check, Pi Radio w/RFM9x
Learn Guide: https://learn.adafruit.com/lora-and-lorawan-for-raspberry-pi Author: Brent Rubell for Adafruit Industries """ import time import busio from digitalio import DigitalInOut, Direction, Pull import board # Import the SSD1306 module. import adafruit_ssd1306 # Import the RFM9x radio module. import adafruit_rfm9x
# Button A btnA = DigitalInOut(board.D5) btnA.direction = Direction.INPUT btnA.pull = Pull.UP
# Button B btnB = DigitalInOut(board.D6) btnB.direction = Direction.INPUT btnB.pull = Pull.UP
# Button C btnC = DigitalInOut(board.D12) btnC.direction = Direction.INPUT btnC.pull = Pull.UP
# Create the I2C interface. i2c = busio.I2C(board.SCL, board.SDA)
# 128x32 OLED Display reset_pin = DigitalInOut(board.D4) display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, reset=reset_pin) # Clear the display. display.fill(0) display.show() width = display.width height = display.height
# Configure RFM9x LoRa Radio CS = DigitalInOut(board.CE1) RESET = DigitalInOut(board.D25) spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
while True: # Clear the image display.fill(0)
# Attempt to set up the RFM9x Module
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 23 of 34
Page 24
try: rfm9x = adafruit_rfm9x.RFM9x(spi, CS, RESET, 915.0) display.text('RFM9x: Detected', 0, 0, 1) except RuntimeError as error: # Thrown on version mismatch display.text('RFM9x: ERROR', 0, 0, 1) print('RFM9x Error: ', error)
# Check buttons if not btnA.value: # Button A Pressed display.text('Ada', width-85, height-7, 1) display.show() time.sleep(0.1) if not btnB.value: # Button B Pressed display.text('Fruit', width-75, height-7, 1) display.show() time.sleep(0.1) if not btnC.value: # Button C Pressed display.text('Radio', width-65, height-7, 1) display.show() time.sleep(0.1)
display.show() time.sleep(0.1)
To use the code, enter the following in your terminal:
python3 rfm9x_check.py
Now to check the setup:
If the RFM9x/RFM69 is detected, the OLED will display
Detected. You can test the buttons by pressing them.
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 24 of 34
Page 25
If the wiring of the radio module is incorrect - the display
will show ERROR. Check over your wiring on the Wiring
Page and re-run the test. You may also need to ensure
the correct CircuitPython library is installed for the
module.
If the OLED does not turn on - first check that it is wired
correctly. Then, make sure you enabled I2C from raspi-
config and installed the required libraries ( adafruit-
circuitpython-framebuf
and
adafruit-circuitpython-ssd1306 ).
With everything working, let's move on to using the radio.
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 25 of 34
Page 26
Sending Data with LoRa
The RFM9x is a more expensive module than the RFM69, but it has a trick -
LoRa
. LoRa is a spread
spectrum modulation technique patented by Semtech (https://adafru.it/DuM). It allows your packets to be
sent over farther distances (a few km in a city like New York and around 40km in a rural area).
It's also a low power protocol with batteries lasting in the year range, instead of a few days with WiFi. This
is made possible by only powering up the LoRa radio when packets are being sent, instead of keeping
the radio always-on (like the WiFi radio on your cell phone).
When building a project which uses LoRa, keep in mind that only a few hundred bytes per-transmission
can be sent, and that each transmission will cause the battery life to decrease.
If a LoRa project involves a lot of sensors, expect to cram a lot of data into a small packet which is
transmitted infrequently.
RFM9x and CircuitPython
It's easy to use the RFM9x LoRa radio with CircuitPython and the Adafruit CircuitPython
RFM9x (https://adafru.it/BjD) module. This module allows you to easily write Python code that sends and
receives packets of data with the radio.
Be careful to note this library is for the RFM9x (RFM95/96/97/98) Radio
only
and will not work with the
RFM69.
To demonstrate how the RFM9x LoRa module sends packets, we'll build an example where we send and
receive data between two radios.
CircuitPython Transmitter/Receiver Example
Do not use this if you have a RFM69 Packet Radio, its for RFM9X radio's only!
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 26 of 34
Page 27
Below is an example of using the RFM9x to transmit, or receive from, another RFM9x radio. Save this
as radio_rfm9x.py on your Raspberry Pi.
""" Example for using the RFM9x Radio with Raspberry Pi.
Learn Guide: https://learn.adafruit.com/lora-and-lorawan-for-raspberry-pi Author: Brent Rubell for Adafruit Industries """ # Import Python System Libraries import time # Import Blinka Libraries import busio from digitalio import DigitalInOut, Direction, Pull import board # Import the SSD1306 module. import adafruit_ssd1306 # Import RFM9x import adafruit_rfm9x
# Button A btnA = DigitalInOut(board.D5) btnA.direction = Direction.INPUT btnA.pull = Pull.UP
# Button B btnB = DigitalInOut(board.D6) btnB.direction = Direction.INPUT btnB.pull = Pull.UP
# Button C btnC = DigitalInOut(board.D12) btnC.direction = Direction.INPUT btnC.pull = Pull.UP
# Create the I2C interface. i2c = busio.I2C(board.SCL, board.SDA)
# 128x32 OLED Display reset_pin = DigitalInOut(board.D4) display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, reset=reset_pin) # Clear the display. display.fill(0) display.show() width = display.width height = display.height
# Configure LoRa Radio CS = DigitalInOut(board.CE1) RESET = DigitalInOut(board.D25) spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) rfm9x = adafruit_rfm9x.RFM9x(spi, CS, RESET, 915.0) rfm9x.tx_power = 23 prev_packet = None
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 27 of 34
Page 28
while True: packet = None # draw a box to clear the image display.fill(0) display.text('RasPi LoRa', 35, 0, 1)
# check for packet rx packet = rfm9x.receive() if packet is None: display.show() display.text('- Waiting for PKT -', 15, 20, 1) else: # Display the packet text and rssi display.fill(0) prev_packet = packet packet_text = str(prev_packet, "utf-8") display.text('RX: ', 0, 0, 1) display.text(packet_text, 25, 0, 1) time.sleep(1)
if not btnA.value: # Send Button A display.fill(0) button_a_data = bytes("Button A!\r\n","utf-8") rfm9x.send(button_a_data) display.text('Sent Button A!', 25, 15, 1) elif not btnB.value: # Send Button B display.fill(0) button_b_data = bytes("Button B!\r\n","utf-8") rfm9x.send(button_b_data) display.text('Sent Button B!', 25, 15, 1) elif not btnC.value: # Send Button C display.fill(0) button_c_data = bytes("Button C!\r\n","utf-8") rfm9x.send(button_c_data) display.text('Sent Button C!', 25, 15, 1)
display.show() time.sleep(0.1)
You'll also want to download the font file, font5x8.bin , and copy it into the same directory as the script:
https://adafru.it/DvA
To run the example, enter the following into the terminal :
python3 radio_rfm9x.py
https://adafru.it/DvA
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 28 of 34
Page 29
Both of the radios will listen for a new incoming packet. When they receive a new packet, they'll print the
text from the packet to the display (and to the terminal).
Press any of the three buttons to send data between radios. Pressing button a will send a packet with data
'Button A!' to the other radio, and so on!
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 29 of 34
Page 30
LoRaWAN Node Guide
LoRaWAN Node Guide (https://adafru.it/DHq)
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 30 of 34
Page 31
LoRaWAN Pi Gateway Guide
LoRaWAN Pi Gateway Guide (https://adafru.it/DHr)
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 31 of 34
Page 32
Downloads
Files
RFM9x
SX127x Datasheet (https://adafru.it/oBm)- The RFM9X LoRa radio chip itself
RFM9X (https://adafru.it/FTK) - The radio module, which contains the SX1272 chipset
FCC Test Report (https://adafru.it/q6A)
ETSI Test Report (https://adafru.it/r6a)
RoHS Report (https://adafru.it/r6b)
RFM69
SX1231 Datasheet (https://adafru.it/mCv) - The RFM69 radio chip itself
RFM69HCW datasheet (https://adafru.it/mCu)- contains the SX1231 datasheet plus details about the
module (https://adafru.it/mFX)
RoHS Test Report (https://adafru.it/oC1)
RoHS Test Report (https://adafru.it/oC2)
REACH Test Report (https://adafru.it/oC3)
ETSI Test Report (https://adafru.it/r6c)
FCC Test Report (https://adafru.it/r6d)
Radio Bonnet
Schematic and board files on GitHub (https://adafru.it/DFL) (Pinouts and layout are the same for all
four radio versions)
Fab Print
(Pinouts and layout are the same for all four radio versions)
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 32 of 34
Page 33
Schematic
(Pinouts and layout are the same for all four radio versions)
© Adafruit Industries https://learn.adafruit.com/adafruit-radio-bonnets Page 33 of 34
Page 34
© Adafruit Industries Last Updated: 2021-07-07 11:30:09 AM EDT Page 34 of 34
Loading...