Skip to content

Add function to invert IQ signal register #179

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Aug 19, 2018
10 changes: 10 additions & 0 deletions API.md
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,16 @@ LoRa.enableCrc();
LoRa.disableCrc();
```

### Invert IQ Signals

Enable or disable Invert the LoRa I and Q signals, by default a invertIQ is not used.

```arduino
LoRa.enableInvertIQ();

LoRa.disableInvertIQ();
```

## Other functions

### Random
Expand Down
113 changes: 113 additions & 0 deletions examples/LoRaSimpleGateway/LoRaSimpleGateway.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*
LoRa Simple Gateway/Node Exemple

This code uses InvertIQ function to create a simple Gateway/Node logic.

Gateway - Sends messages with enableInvertIQ()
- Receives messages with disableInvertIQ()

Node - Sends messages with disableInvertIQ()
- Receives messages with enableInvertIQ()

With this arrangement a Gateway never receive messages from another Gateway
and a Node never receive message from another Node.
Only Gateway to Node and vice versa.

This code receives messages and sends a message every second.

InvertIQ function basically invert the LoRa I and Q signals.

See the Semtech datasheet, http://www.semtech.com/images/datasheet/sx1276.pdf
for more on InvertIQ register 0x33.

created 05 August 2018
by Luiz H. Cassettari
*/

#include <SPI.h> // include libraries
#include <LoRa.h>

const long frequency = 915E6; // LoRa Frequency

const int csPin = 10; // LoRa radio chip select
const int resetPin = 9; // LoRa radio reset
const int irqPin = 2; // change for your board; must be a hardware interrupt pin

void setup() {
Serial.begin(9600); // initialize serial
while (!Serial);

LoRa.setPins(csPin, resetPin, irqPin);

if (!LoRa.begin(frequency)) {
Serial.println("LoRa init failed. Check your connections.");
while (true); // if failed, do nothing
}

Serial.println("LoRa init succeeded.");
Serial.println();
Serial.println("LoRa Simple Gateway");
Serial.println("Only receive messages from nodes");
Serial.println("Tx: invertIQ enable");
Serial.println("Rx: invertIQ disable");
Serial.println();

LoRa.onReceive(onReceive);
LoRa_rxMode();
}

void loop() {
if (runEvery(5000)) { // repeat every 5000 millis

String message = "HeLoRa World! ";
message += "I'm a Gateway! ";
message += millis();

LoRa_sendMessage(message); // send a message

Serial.println("Send Message!");
}
}

void LoRa_rxMode(){
LoRa.disableInvertIQ(); // normal mode
LoRa.receive(); // set receive mode
}

void LoRa_txMode(){
LoRa.idle(); // set standby mode
LoRa.enableInvertIQ(); // active invert I and Q signals
}

void LoRa_sendMessage(String message) {
LoRa_txMode(); // set tx mode
LoRa.beginPacket(); // start packet
LoRa.print(message); // add payload
LoRa.endPacket(); // finish packet and send it
LoRa_rxMode(); // set rx mode
}

void onReceive(int packetSize) {
String message = "";

while (LoRa.available()) {
message += (char)LoRa.read();
}

Serial.print("Gateway Receive: ");
Serial.println(message);

}

boolean runEvery(unsigned long interval)
{
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
return true;
}
return false;
}

113 changes: 113 additions & 0 deletions examples/LoRaSimpleNode/LoRaSimpleNode.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*
LoRa Simple Gateway/Node Exemple

This code uses InvertIQ function to create a simple Gateway/Node logic.

Gateway - Sends messages with enableInvertIQ()
- Receives messages with disableInvertIQ()

Node - Sends messages with disableInvertIQ()
- Receives messages with enableInvertIQ()

With this arrangement a Gateway never receive messages from another Gateway
and a Node never receive message from another Node.
Only Gateway to Node and vice versa.

This code receives messages and sends a message every second.

InvertIQ function basically invert the LoRa I and Q signals.

See the Semtech datasheet, http://www.semtech.com/images/datasheet/sx1276.pdf
for more on InvertIQ register 0x33.

created 05 August 2018
by Luiz H. Cassettari
*/

#include <SPI.h> // include libraries
#include <LoRa.h>

const long frequency = 915E6; // LoRa Frequency

const int csPin = 10; // LoRa radio chip select
const int resetPin = 9; // LoRa radio reset
const int irqPin = 2; // change for your board; must be a hardware interrupt pin

void setup() {
Serial.begin(9600); // initialize serial
while (!Serial);

LoRa.setPins(csPin, resetPin, irqPin);

if (!LoRa.begin(frequency)) {
Serial.println("LoRa init failed. Check your connections.");
while (true); // if failed, do nothing
}

Serial.println("LoRa init succeeded.");
Serial.println();
Serial.println("LoRa Simple Node");
Serial.println("Only receive messages from gateways");
Serial.println("Tx: invertIQ disable");
Serial.println("Rx: invertIQ enable");
Serial.println();

LoRa.onReceive(onReceive);
LoRa_rxMode();
}

void loop() {
if (runEvery(1000)) { // repeat every 1000 millis

String message = "HeLoRa World! ";
message += "I'm a Node! ";
message += millis();

LoRa_sendMessage(message); // send a message

Serial.println("Send Message!");
}
}

void LoRa_rxMode(){
LoRa.enableInvertIQ(); // active invert I and Q signals
LoRa.receive(); // set receive mode
}

void LoRa_txMode(){
LoRa.idle(); // set standby mode
LoRa.disableInvertIQ(); // normal mode
}

void LoRa_sendMessage(String message) {
LoRa_txMode(); // set tx mode
LoRa.beginPacket(); // start packet
LoRa.print(message); // add payload
LoRa.endPacket(); // finish packet and send it
LoRa_rxMode(); // set rx mode
}

void onReceive(int packetSize) {
String message = "";

while (LoRa.available()) {
message += (char)LoRa.read();
}

Serial.print("Node Receive: ");
Serial.println(message);

}

boolean runEvery(unsigned long interval)
{
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
return true;
}
return false;
}

2 changes: 2 additions & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ setPreambleLength KEYWORD2
setSyncWord KEYWORD2
enableCrc KEYWORD2
disableCrc KEYWORD2
enableInvertIQ KEYWORD2
disableInvertIQ KEYWORD2

random KEYWORD2
setPins KEYWORD2
Expand Down
14 changes: 14 additions & 0 deletions src/LoRa.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@
#define REG_FREQ_ERROR_LSB 0x2a
#define REG_RSSI_WIDEBAND 0x2c
#define REG_DETECTION_OPTIMIZE 0x31
#define REG_INVERTIQ 0x33
#define REG_DETECTION_THRESHOLD 0x37
#define REG_SYNC_WORD 0x39
#define REG_INVERTIQ2 0x3b
#define REG_DIO_MAPPING_1 0x40
#define REG_VERSION 0x42
#define REG_PA_DAC 0x4d
Expand Down Expand Up @@ -531,6 +533,18 @@ void LoRaClass::disableCrc()
writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) & 0xfb);
}

void LoRaClass::enableInvertIQ()
{
writeRegister(REG_INVERTIQ, 0x66);
writeRegister(REG_INVERTIQ2, 0x19);
}

void LoRaClass::disableInvertIQ()
{
writeRegister(REG_INVERTIQ, 0x27);
writeRegister(REG_INVERTIQ2, 0x1d);
}

void LoRaClass::setOCP(uint8_t mA)
{
uint8_t ocpTrim = 27;
Expand Down
3 changes: 3 additions & 0 deletions src/LoRa.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ class LoRaClass : public Stream {
void setSyncWord(int sw);
void enableCrc();
void disableCrc();
void enableInvertIQ();
void disableInvertIQ();

void setOCP(uint8_t mA); // Over Current Protection control

// deprecated
Expand Down