

The Adafruit Feather M0 RFM9x LoRa is a compact and versatile microcontroller board designed for IoT (Internet of Things) applications. It features an ARM Cortex-M0 processor and an integrated RFM9x LoRa radio module, enabling long-range wireless communication. This board is part of Adafruit's Feather ecosystem, making it compatible with a wide range of FeatherWing add-on boards for extended functionality.








| Specification | Value |
|---|---|
| Microcontroller | ATSAMD21G18 ARM Cortex-M0 |
| Operating Voltage | 3.3V |
| Clock Speed | 48 MHz |
| Flash Memory | 256 KB |
| SRAM | 32 KB |
| LoRa Radio Module | RFM95/96/97/98 (Semtech SX1276 chipset) |
| Frequency Range | 868 MHz (EU) / 915 MHz (US) |
| Communication Interfaces | UART, SPI, I2C |
| GPIO Pins | 20 (8 PWM-capable) |
| Analog Inputs | 6 (12-bit ADC) |
| Power Supply | USB or LiPo battery (3.7V) |
| Dimensions | 51mm x 23mm x 8mm |
| Pin Name | Description |
|---|---|
| VIN | Input voltage (3.7V LiPo battery or USB power) |
| 3V | Regulated 3.3V output |
| GND | Ground connection |
| A0–A5 | Analog input pins (12-bit ADC) |
| D0–D13 | Digital I/O pins (some support PWM) |
| SDA | I2C data line |
| SCL | I2C clock line |
| MOSI | SPI Master Out Slave In |
| MISO | SPI Master In Slave Out |
| SCK | SPI clock |
| RFM9x CS | Chip select for the LoRa module |
| RFM9x IRQ | Interrupt request pin for the LoRa module |
| RFM9x RST | Reset pin for the LoRa module |
| EN | Enable pin to turn the board on/off |
| BAT | LiPo battery voltage monitoring pin |
Powering the Board:
Connecting Peripherals:
Programming the Board:
Using the LoRa Module:
#include <SPI.h>
#include <RH_RF95.h>
// Define LoRa module pins
#define RFM95_CS 8 // Chip select pin
#define RFM95_RST 4 // Reset pin
#define RFM95_INT 3 // Interrupt pin
// Frequency for LoRa communication (adjust based on region)
#define RF95_FREQ 915.0 // 915 MHz for US, 868 MHz for EU
// Create an instance of the RF95 driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);
void setup() {
Serial.begin(9600);
while (!Serial);
// Initialize LoRa module
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
delay(10);
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
if (!rf95.init()) {
Serial.println("LoRa module initialization failed!");
while (1);
}
Serial.println("LoRa module initialized.");
// Set frequency
if (!rf95.setFrequency(RF95_FREQ)) {
Serial.println("Failed to set frequency!");
while (1);
}
Serial.print("Frequency set to: ");
Serial.println(RF95_FREQ);
// Set transmission power
rf95.setTxPower(13, false); // 13 dBm, PA_BOOST disabled
}
void loop() {
// Send a test message
Serial.println("Sending message...");
const char *message = "Hello, LoRa!";
rf95.send((uint8_t *)message, strlen(message));
rf95.waitPacketSent();
Serial.println("Message sent!");
// Wait for a response
if (rf95.waitAvailableTimeout(3000)) {
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (rf95.recv(buf, &len)) {
Serial.print("Received: ");
Serial.println((char *)buf);
} else {
Serial.println("Receive failed.");
}
} else {
Serial.println("No response received.");
}
delay(5000); // Wait before sending the next message
}
LoRa Module Not Initializing:
No Communication Between Devices:
Board Not Recognized by Arduino IDE: