Ebay:stä saa parilla kympillä SX1276/1278 piiriin pohjautuvia LORA shieldejä Arduinolle, http://wiki.dragino.com/index.php?title=Lora_Shield
Saatavilla on moduleja 433, 868 ja 915 MHz:n ISM bandeille. Semtechin SX127x piirit http://www.semtech.com/wireless-rf/rf-transceivers/sx1278/ soveltuvat LORA moden lisäksi myös FSK, GFSK, MSK, GMSK ja OOK lähetelajeihin. Piirin ohjelmointi on varsin mutkikasta, rekistereitä ja erilaisia asetuksia on paljon. Tässä juttusarjassa rakennetaan Arduinolle koodia piirin eri toimintojen käyttämiseksi, tarkoituksena on kasata FSK/OOK dekooderi, jota voisi käyttää erilaisten ISM bandilla toimivien laitteiden käyttämien protokollien analysointiin.

#include <SPI.h>

#define debug_mode 0
#define max_spi_speed 4000000 // 250 ns
#define spi_rw_delay 4 // 4 ms
#define sx127x_slave_num 0
#define sx127x_rw_setclr_bit 7
#define sx127x_max_curr 0x1B

// sx127x registers
#define REGISTER_OP_MODE      1  // 0x01
#define REGISTER_OCP          11 // 0x0B

const byte FSK_SLEEP_MODE   = 0;
const byte FSK_STDBY_MODE   = 1;
const byte FSK_RX_MODE      = 5;

SPISettings spi_Settings(max_spi_speed, MSBFIRST, SPI_MODE0);

void setup() {
  Serial.begin(9600);
  sx127x_setON();
}

void loop() {
}

void sx127x_setON() {
 
  #if (debug_mode > 0)
    Serial.println();
    Serial.println(F("sx127x_setON"));
  #endif
 
  pinMode(SS, OUTPUT);
  digitalWrite(SS, HIGH);
  SPI.begin();
}

void sx127x_setOFF() {
  #if (debug_mode > 0)
    Serial.println();
    Serial.println(F("sx127x_setOFF"));
  #endif
 
  SPI.end();
  pinMode(SS, OUTPUT);
  digitalWrite(SS, LOW);
}

void sx127x_writeReg(byte addr, byte data) {
  SPI.beginTransaction(spi_Settings);
  digitalWrite(SS, LOW);
  delay(spi_rw_delay);
  bitSet(addr, sx127x_rw_setclr_bit);
  SPI.transfer(addr);
  SPI.transfer(data);
  digitalWrite(SS, HIGH);
  SPI.endTransaction();

  #if (debug_mode > 0)
    Serial.println();
    Serial.println(F("sx127x_writeReg"));
    Serial.print(F("\tRegister "));
    bitClear(addr, sx127x_rw_setclr_bit);
    Serial.print(addr, HEX);
    Serial.print(F("\tData "));
    Serial.print(data, HEX);
    Serial.println();
  #endif
}

byte sx127x_readReg(byte addr) {
  byte val = 0;
  SPI.beginTransaction(spi_Settings);
  digitalWrite(SS, LOW);
  delay(spi_rw_delay);
  bitClear(addr, sx127x_rw_setclr_bit);
  SPI.transfer(addr);
  val = SPI.transfer(sx127x_slave_num);
  digitalWrite(SS, HIGH);
  SPI.endTransaction();

  #if (debug_mode > 0)
    Serial.println();
    Serial.println(F("sx127x_readReg"));
    Serial.print(F("\tRegister "));
    Serial.print(addr, HEX);
    Serial.print(F("\tValue "));
    Serial.print(val, HEX);
    Serial.println();
  #endif
}

void sx127x_setOCP(byte crate) {
  byte regValue;

  #if (debug_mode > 0)
    Serial.println();
    Serial.println(F("sx127x_setOCP"));
  #endif

  if (crate > sx127x_max_curr) {
      crate = sx127x_max_curr;
  }
 
  crate |= B00100000;
  regValue = sx127x_readReg(REGISTER_OP_MODE);

  sx127x_writeReg(REGISTER_OP_MODE, FSK_STDBY_MODE);
 
  sx127x_writeReg(REGISTER_OCP, crate);
  sx127x_writeReg(REGISTER_OP_MODE, regValue);
}