LoRa antennelengte voor 868MHz

De LoRa communicatietechnologie is voor een goede werking afhankelijk van antennes. “De beste versterker is een goede antenne,” zei een collega vroeger wel eens tegen me. LoRa werkt in Nederland in twee frequentiebanden, respectievelijk ‘433 MHz’ en ‘868 MHz’ genoemd. De tweede, 868 MHz, wordt het meest gebruikt.

Een antenne is een geleider in de vorm van een staaf of spriet die met een leiding met een communicatiemodule is verbonden. De diameter van de geleider is nauwelijks van belang. Handig is wel als het materiaal waarvan de antenne is gemaakt in staaf- of sprietvorm blijft, dus een enigszins stugge geleider heeft hier de voorkeur. De antenne is het meest effectief als hij precies zo lang is als de gemiddelde frequentie waarvoor hij moet worden gebruikt. Indien dat niet praktisch is dan kan voor de lengte van de antenne ook, met iets mindere resultaten, worden volstaan met een helft of een kwart van de golflengte. Dat laatste wordt het meest toegepast.

De golflengte is gelijk aan v / f, waarbij v de voortplantingssnelheid van de radiogolf is en f de frequentie. In lucht is v gelijk aan de lichtsnelheid c, 299.792.458 m/s. De golflengte voor de 868 MHz band is dan 299.792.458 / 868.000.000 = 34,54 cm. De helft hiervan is 17,27 cm en een kwart is 8,63 cm.

Voor de 433 MHz band is de golflengte 299.792.458 / 433.000.000 = 69,24 cm. De helft hiervan is 34,62 cm en een kwart is 17,31 cm.

Een draadantenne van 8,6 cm volstaat dus voor een LoRa toepassing op de 868 MHz band. Een stukje montagedraad van 8,6 cm is genoeg. De lengte van de antenne is gemeten vanaf de aansluiting. Als een antenne met een leiding wordt verbonden dan moet deze leiding in de vorm van een 50 ohm kabel worden uitgevoerd.

LoRa, KPN en The Things Network met ATtiny85 en RN2483

Een Microchip RN2483 is een degelijke, door de LoRa Alliance gecertificeerde manier om verbinding te maken met een LoRaWAN gateway van KPN of The Things Network. En als het de bedoeling is om af en toe sensorwaarden naar het internet te sturen dan heb je niet veel extra’s nodig. De RN2483 is een SoC dat bestaat uit een Semtech SX1276 LoRa zendontvanger en een Microchip PIC18LF46K22 microcontroller. Deze laatste heeft mogelijkheden genoeg om een sensorwaarde in te lezen, maar om de certificering in stand te houden heeft Microchip ervoor gekozen het lastig te maken om de PIC18LF46K22 te laten herprogrammeren of aan te vullen met extra programmatuur. Maar geen paniek: met een Atmel ATtiny85 kan het ook. Totale kosten van zo’n setje: 20 euro.

In het schema hierboven is een RN2483 met enkele lijnen (GND, RX, TX, RESET) verbonden met de ATtiny85 microcontroller. Beide worden gevoed door een CR2016 knoopcel. Voor de gelegenheid is de RN2483 voorzien van een draadantenne van 8,2 cm, wat voldoende is voor een reikwijdte van een kilometer. De ATtiny85 maakt gebruik van pennen 1 en 3 om de RN2483 serieel aan te sturen en pen 7 om de RN2483 module te herstarten. In de sketch hieronder is het principe weergegeven:

#include 

#define rxPin 4
#define txPin 5
#define rn2483Reset 2

SoftwareSerial rn2483(rxPin, txPin);

byte crlf[2] = {0x0D,0x0A};         // Used to terminate RN2486 commands

void sendCommand(String cmd) {
  rn2483.print(cmd);
  rn2483.write(crlf, 2);
  delay(1000);
}

String getResponse() {
  String response = "";

  while (!rn2483.available()) { // Linger here while no response
  } // Might be better to create a timeout after a few seconds

  while (rn2483.available()) {
    response = response + char(rn2483.read());
  } 
  response = response + "";
  response.trim();
  return response;
}

int initLoRa() {
  String response;
  int code = -1;
  
  sendCommand("mac join otaa"); 
  response = getResponse();
  
  if (response == "ok") {
    code = 0;
    delay(6000);
    response = getResponse();
    if (response == "accepted") {
      // There. A valid LoRa connection
      code = 1;
    } else {
      // Denied. Either no free channels or something else
      code = 2;
    }
  } else {  // not ok
    // Not a wanted response. Something with the hardware
    // We might want to throw a panic here
    code = 3;
  }  
  return code;
}

void setup() {
  pinMode(rn2483Reset, OUTPUT);
  digitalWrite(rn2483Reset, false); // Reset
  delay(100);
  digitalWrite(rn2483Reset, true); // Not reset
  delay(2500);
  rn2483.begin(57600);
  while (!rn2483) {
    delay(100);
  }
  initLoRa();
}

void loop() {
  // put your main code here, to run repeatedly:

}

Het solderen van montagedraden aan een RN2483 is nog niet zo eenvoudig, maar met een soldeerbout met een fijne punt moet het lukken. Het aansturen van de kick-ass PIC18LF46K22 door een ATtiny85 is zoiets als een Tesla model S laten starten met een accu van een lelijke eend, maar LoRaWAN is dan ook niet bedoeld voor iets omvangrijkers dan waar een ATtiny85 toe in staat is.

Arduino communicatie met een RN2483 LoRaWAN module aan The Things Network

Ik heb vandaag geprobeerd een RN2483 LoRaWAN module met een Arduino aan de praat te krijgen. Het parsen van de communicatie van en naar de mdule ging niet gemakkelijk: de RN2483 module heeft soms een precieze timing, variaties in de antwoorden en de TheThingsNetwork.h bibliotheek is op de meeste combinaties van Arduino’s en uitbreidingen niet te gebruiken (Arduino Diecimila bijvoorbeeld, of Arduino Leonardo met Xbee Shield). En als je moeite hebt om het werkend te krijgen dan heb je met TheThingsNetwork.h als abstractielaag vervolgens ook geen idee wat er verkeerd gaat. Met een terminal daarentegen is het vrij gemakkelijk om een RN2486 met The Things Network aan de gang te krijgen:

> sys reset
RN2486...
> mac join otaa
ok
accepted
> mac tx cnf 1 1234
ok
mac_tx_ok

Bovenstaande instructies is genoeg om data te versturen. Ik heb vandaag daarom een paar uur besteed om de abstractielaag weg te poetsen en de module direct via de seriële Arduino poort aan te sturen.

// Routine that uses the SoftwareSerial library to communicatie
// with an RN2483 LoRaWAN module
// Apart from SoftwareSerial there is no abstraction layer, thus
// all steps and code are visible.
// Note: although this code does work, it is not complete. Take this
// code as an example how to communicate with the RN2483 module

// SoftwareSerial can hook up to any two digital pins. More than
// one serial port can exist, but only one can be open at any time
#include <SoftwareSerial.h>

// Connect the RN2486 module to the following pins
#define LoraRX 8 // Yellow
#define LoraTX 9 // White

// Some variables to set right
byte crlf[2] = {0x0D,0x0A};
String r;
SoftwareSerial lora (LoraRX, LoraTX);

// This is the main send routine
void sendCommand(String cmd) {
  lora.print(cmd);
  lora.write(crlf, 2);
}

// This is the main receive routine
String getResponse() {
  r = "";
  while (!lora.available()) { // Linger here while no response
  } // Might be better to create a timeout

  // There is data to get, get it while it lasts
  while (lora.available()) {
    r = r + char(lora.read());
  } 
  r = r + "";
  r.trim();
  return r;
}

void setup() {
  lora.begin(57600);  // RN2486 default baud rate
  delay(100);  // Short delay to make sure the comms are up

  // Reset the module 
  sendCommand("sys reset");  // Reset the module
  r = getResponse();  // We expect a long string here
  // Containing module version information

  // Connect with the network 
  sendCommand("mac join otaa");  // Join OTAA
  r = getResponse();
  if (r == "ok") {  // That is the response we would like to have
    r = getResponse();  // There is going to be a follow-up
    if (r == "accepted") {
      // We're joined with the network
    } else {
      // 'denied'. No free channel, or max usage exceeded
      // Safe to try again later
    }
  } else { // not ok
    // Something went wrong, might be hardware
    // This should be thrown higher up
  }
  lora.end();
}

void transmitData(int payload) {
  lora.begin(57600);
  delay(100); // Short delay to make sure the comms are up

  // Send the payload confirmed, group 1
  sendCommand("mac tx cnf 1 " + String(payload));
  r = getResponse();
  if (r == "ok") {
    r = getResponse();
    if (r != "mac_tx_ok") {
      // We got data back! Parse the values from r
    } else {
      // 'mac_tx_ok'. No data back, just a succesful send
  } else {
    // 'invalid params'. Invalid parameters, programming error
  }
  lora.end();
}
void loop() {
  // This would be the place to send data, if the
  // connection with The Things Network succeeded

  // transmitData(measureSomeSensor());
}

LoRaWAN gateway construeren en verbinden met The Things Network

The Things Network timmert hard aan de weg om wereldwijde LoRaWAN dekking te realiseren. Ze zijn hiervoor volledig afhankelijk van avonturiers en bedrijven die LoRaWAN gateways doneren. Dat hoeven er nog niet eens zo veel te zijn ook: met een stuk of tien gateways heb je Groningen op de kaart.

Onze waddeneilanden hebben nog weinig tot geen LoRaWAN dekking: op drie geplande (maar nog niet aanwezige) gateways op Terschelling na is het on-ontgonnen gebied. Met één zorgvuldig geplaatste gateway heb je op een eiland op de meeste plaatsen wel bereik, dus dat leek ons een mooi doel: Texel op de TTN-kaart zetten. Stap 1: een LoRaWAN gateway construeren. Stap 2: Texel verbinden met The Things Network. Stap 3: Verschillende eiland-toepassingen realiseren.

De TTN-wiki heeft een goed bouwverhaal over het maken van een gateway. Het verhaal eindigt echter wat abrupt na de bouw en installatie van de software: hoe je de gateway aan de praat krijgt blijft onbesproken. Mooie gelegenheid om het verhaal aan te vullen en van wat ervaringen te voorzien.

Bouw

  • Sourcen van onderdelen: een IMST ic880A-concentrator board, een Raspberry Pi B+, een wifi-dongle, een antenne en verbindingskabeltje (‘SMA pigtail’), een waterdichte doos en wat verbindingsdraadjes
  • Bodemplaat voor in de waterdichte doos passend gemaakt en voorzien van gaten voor de ic880A en de Raspberry Pi
  • Printplaten, antenne en bodemplaat monteren
  • Bedrading leggen
  • Alle aansluiting controleren (en nog een keer controleren)
  • Raspberry Pi verbinden met een USB-voeding. Ook de ic880A wordt hiermee van stroom voorzien. Beide bordjes hebben verschillende leds die nu gaan branden
  • Raspberry Pi voorzien van de meest recente software (apt-get install en apt-get upgrade)
  • Raspberry Pi voorzien van de ic880A software met git clone -b spi https://github.com/ttn-zh/ic880a-gateway.git ~/ic880a-gateway
  • De software installeren

Inregelen en configureren

  • Tijdens de installatie van de software is er in de home directory een directory aangemaakt die ic880-gateway heet. Hiernaast is er een directory in /opt aangemaakt die packet-forwarder heet. Beide softwaremodules hebben hun functie: de gateway regelt het verkeer aan de LoRa (radio) kant, de packet-forwarder zorgt voor het ontvangen en versturen van internetverkeer aan de backhaul (wifi) kant
  • Bij de installatie is de EUI van de gateway getoond. Deze moet aan de TTN kant bij het aanmaken van een nieuwe gateway worden ingevoerd

Testen

  • Een werkende gateway meldt zich binnen enkele seconden met zijn EUI op de staging pagina van The Things Network. Staat de gateway hier niet? Dat verbindt hij niet met TTN
  • Een werkende gateway waarvan de EUI bekend is op TTN wordt op de gateway pagina getoond en de doorvoer wordt gemonitord

LoRaWAN node verbinden met The Things Network

Een LoRaWAN node kan op twee manieren voor het eerst met The Things Network verbinden: Over The Air (OTAA) en Activation By Personalisation (ABP). Deze instructie gaat uit van OTAA, een RN2483 node en een bestaand account op TTN:

  • Maak verbinding met de RN2483. Het gemakkelijkst gaat dat met een seriële verbinding: de RN2483 heeft een terminal waar commando’s uitgewisseld kunnen worden. Voer een algehele factory restore uit: sys factoryRESET
  • Vraag het hardware adres op: mac get deveui
  • Voer het Device EUI in TTN in bij de node administratie
  • Kopieer de gegenereerde App Key uit TTN en voer deze in de node in met mac set appkey <appkey>
  • Kopieer de gegenereerde App EUI uit TTN en voer deze in de node in met mac set appeui <appeui>
  • Bewaar alle sleutels in de RN2483 met mac save
  • Maak verbinding met The Things Network met mac join otaa
  • De RN2483 komt direct terug met ok en na enkele seconden met accepted
  • Verstuur data met mac tx cnf 1 <databyte>

Als er geen gateway met een vrij kaneel in de buurt is zal er geen verbinding gemaakt kunnen worden. De RN2483 komt dan terug met de melding no_free_ch. Afgelopen week midden in Zwolle vastgesteld dat daar geen bruikbare LoRa dekking was, maar in Groningen is overal wel een kanaal vrij.

LIFX – slimme wifi lamp zonder hub

Slimme lampen (lampen die je overal ter wereld kunt besturen met een computer en die meestal verschillende kleuren kunnen tonen) zijn er al een poosje. Philips Hue is een bekend product. Het nadeel van Philips Hue is de hub: de lampen van Philips zijn zelf niet verbonden met het internet, maar met een doosje van Philips. Dat maakt de lampen zelf iets goedkoper, maar als je eenmaal in Philips Hue hebt geïnvesteerd, zit je daar redelijk aan vast. Misschien slim van Philips, maar geen ‘slimme oplossing’.

BULB_Color1000_Edison_SquareLIFX (in Nederland verkocht onder de naam Sylvania) maakt échte wifi lampen: de lampen zelf verbinden met je wifi router thuis en je kunt er eentje voor proef nemen, of je hele huis er mee inrichten. De lamp geeft licht in alle kleuren van de regenboog, plus in alle tinten wit die je kunt verzinnen: van kaarslicht-bijna-rood-wit tot blauwig-wit en alles daartussenin.

LIFX komt met toegang via de website van LIFX en een handige app waarmee je de lampen kunt aansturen. Ook is er een IF This Than That koppeling, zodat je de lampen kunt laten reageren op gebeurtenissen die andere slimme apparaten hebben opgepikt: de lamp op de slaapkamer ’s ochtends op wektijd langzaam laten aangaan, de verlichting in huis uitschakelen als de zon buiten schijnt, of inschakelen gaan als je smartphone binnen een straal van 100 meter van je huis komt. Alles kan.

Het nadeel is nog de prijs: in Nederland betaal je per lamp een kleine 90 euro. Als je direct bij de LIFX winkel in Amerika bestelt zijn ze 60 dollar, plus 20 dollar verzendkosten. Als je er meer tegelijk afneemt krijg je 25% korting.

De LIFX geeft zoveel licht als een 75 watt gloeilamp, een goede 1000 lumen. Da’s een grote hoeveelheid licht, die je eerder verwacht van een bouwlamp dan van een gloeilamp. Gelukkig is deze hoeveelheid traploos te regelen tussen 3% en 100%. En in alle kleuren: vooral de mogelijkheid om verschillende wittinten toe te passen is handig.

De koppeling van LIFX met IFTTT maakt deze RGB-LED alleskunner ondanks de hoge aanschafprijs toch een goede investering. Naast een heldere lamp (die met maximaal 13 watt ook nog eens het energieverbruik tot weinig weet te reduceren) heb je met de LIFX een handige signalering voor ongeveer iedere gebeurtenis in de wereld.

Schermafdruk 2016-05-01 14.03.06

Genuino MKR1000

Uit de Arduino-stal is afgelopen maand een nieuw product komen rollen, de ‘Genuino MKR1000’ (in de Verenigde Staten heel verwarrend ‘Arduino MKR1000’ genoemd). Die ‘MKR’ staat vast voor ‘Maker’ en ‘1000’ moet je dan misschien meer zien als ‘1.000’, dus we hebben hier ‘de maker one’ op tafel liggen. Mogelijk het eerste ‘echte open IoT platform’. Tuurlijk, je kunt al sinds jaar en dag verbinding maken met het internet met een keur aan apparatuur en chips, maar deze module is én betaalbaar (hoewel een UPS-reis vanuit Spanje de betaalbaarheid van deze specifieke moduke enigszins onder druk zette), heeft een laag stroomverbruik (de ESP module gebruikt al gauw 250 mA) en is niet gebonden aan specifieke servers: je bent vrij om te verbinden met whatever internetdienst je kunt verzinnen. Oh, en ondersteuning van het Arduino ontwikkelplatform. Binnenkort meer.

IMG_0359

ESP8266 aansluiten aan 5V logica

Een ESP8266 is een handige wifi module met één nadeel: de module werkt op 3,3 volt, in plaats van 5 volt. Om de module te gebruiken met andere spanningen is een aanpassing nodig. Dit geldt zowel voor de voedingsspanning als voor de in- en output. Hiervoor gebruiken we een spanningsdeler: twee weerstanden waarvan de verhouding van de weerstandswaardes zorgt voor de benodigde spanningsaanpassing.

In de tekening hieronder zie je linksboven een principeschakeling: een spanning 5V wordt gedeeld door de weerstanden 10 en 15, de uitgangsspanning tussen beide weerstanden is (10/15) * 5 = 3,33V. Rechtsboven de principeschakeling met de ESP8266: zowel de voedingsspanning als de ingang RXD worden voorzien van een spanningsdeler. De uitgang TXD blijft op 3,3V werken, dat zou moeten kunnen bij een 5V ingang. Linksonder een plaatsingsschema en rechtsonder het printontwerp: een stukje gaatjesprint met banen, voorzien van de onderdelen.

IMG_0255

IMG_0273