Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2017:lora-sniffer [2018/01/12 15:58] Ľubomír Švehla |
2017:lora-sniffer [2018/01/14 20:46] (aktuální) Ľubomír Švehla |
||
---|---|---|---|
Řádek 17: | Řádek 17: | ||
====== Hardware ====== | ====== Hardware ====== | ||
+ | ==== FRDM KL25Z ==== | ||
+ | Jedná sa o vývojový kit od Freescale, ktorý obsahuje MCU KL25 s jadrom Arm Cortex-M0+. Spracúva dáta získané z LoRa modulu a odosiela získané údaje do PC. | ||
+ | |||
+ | {{ :2017:lora-sniffer:frdm-kl25z_headers2.png|Vývojový kit FRDM KL25Z }} | ||
+ | |||
+ | |||
+ | ==== RFM95W ==== | ||
+ | LoRa modul pracujúci s frekvenciou 868 MHz. Je umiestnený na shielde s možnosťou pripojenia antény a s možnosťou jednoduchého pripojenia k vývojovému kitu. Modul je napájaný napätím 3.3V. | ||
+ | |||
+ | {{ :2017:lora-sniffer:img_20180112_161410.jpg?400 |LoRa modul RFM95W}} | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ====== Zapojenie ====== | ||
+ | |||
+ | Vývojový kit je prepojený s RFM95W pomocou SPI rozhrania a s PC pomocou virtuálneho sériového portu cez USB. | ||
+ | |||
+ | {{ :2017:lora-sniffer:zapojenie.png?400 |Zapojenie}} | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ====== Software ====== | ||
+ | Systém je vyvýjaný v online vývojovom prostredí mbed. | ||
+ | |||
+ | Využité knižnice:\\ | ||
+ | **RadioHead** : Pre riadenie komunikácie medzi vývojovým kitom a modulom RFM95W \\ | ||
+ | **USBSerial** : Pre vytvorenie virtuálneho sériového portu a komunikáciu kitu s PC | ||
+ | |||
+ | Inicializácia komunikácie sériového portu a SPI: | ||
+ | <code cpp> | ||
+ | //Virtual serial port over USB | ||
+ | USBSerial serial; | ||
+ | Serial pc(USBTX, USBRX); | ||
+ | |||
+ | // Singleton instance of the radio driver | ||
+ | RH_RF95 rf95(RFM95_CS, RFM95_INT); | ||
+ | |||
+ | SPI spi(PTD2, PTD3, PTD1); // mosi, miso, sclk | ||
+ | DigitalOut cs(PTD0); // NSS | ||
+ | spi.format(8,0); | ||
+ | spi.frequency(1000000); | ||
+ | |||
+ | DigitalOut ResetPin(RFM95_RST, 1); | ||
+ | </code> | ||
+ | |||
+ | Inicializáica LoRa modulu: | ||
+ | <code cpp> | ||
+ | while (!serial); | ||
+ | wait(0.1); | ||
+ | serial.printf("LoRa RX Test!\r\n"); | ||
+ | | ||
+ | // manual reset | ||
+ | ResetPin=0; | ||
+ | wait(0.1); | ||
+ | ResetPin=1; | ||
+ | wait(0.1); | ||
+ | |||
+ | while (!rf95.init()) { | ||
+ | serial.printf("LoRa radio init failed\r\n"); | ||
+ | while(1); | ||
+ | } | ||
+ | serial.printf("LoRa radio init OK!\r\n"); | ||
+ | | ||
+ | // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM | ||
+ | if (!rf95.setFrequency(RF95_FREQ)) { | ||
+ | serial.printf("setFrequency failed\r\n"); | ||
+ | while (1); | ||
+ | } | ||
+ | serial.printf("Set Freq to: %f\r\n", RF95_FREQ); | ||
+ | | ||
+ | rf95.setPromiscuous(true); | ||
+ | bool recvFlag=0; | ||
+ | </code> | ||
+ | |||
+ | Príjem a spracovanie dát: | ||
+ | <code cpp> | ||
+ | while(1) | ||
+ | { | ||
+ | // wait for a lora packet | ||
+ | rxRecvLen = sizeof(rxBuffer); // RadioHead expects max buffer, will update to received bytes | ||
+ | serial.printf("Searching for LoRa packets\r\n"); | ||
+ | DigitalOut bled(LED_BLUE, 0); | ||
+ | |||
+ | while (recvFlag==0) | ||
+ | { | ||
+ | rf95.waitAvailableTimeout(1000); | ||
+ | bled=!bled; | ||
+ | if (rf95.recv(rxBuffer, &rxRecvLen)) | ||
+ | { | ||
+ | recvFlag=1; | ||
+ | char isAck[4] = {""}; | ||
+ | if (rf95.headerFlags() & RH_FLAGS_ACK) | ||
+ | memcpy(isAck, "Ack\0", 3); | ||
+ | rxBuffer[rxRecvLen] = '\0'; | ||
+ | | ||
+ | snprintf(printBuffer, sizeof(printBuffer), "Recv#:%d @ %d, Signal(RSSI)= %d", rxCount++, millis(), rf95.lastRssi()); | ||
+ | serial.printf("%s\r\n", printBuffer); | ||
+ | snprintf(printBuffer, sizeof(printBuffer), " From: %d >> To: %d MsgId: %d Flags: %2x %s", rf95.headerFrom(), rf95.headerTo(), rf95.headerId(), rf95.headerFlags(), isAck); | ||
+ | serial.printf("%s\r\n", printBuffer); | ||
+ | snprintf(printBuffer, sizeof(printBuffer), "Bytes: %d => %s \r\n", rxRecvLen, rxBuffer); | ||
+ | serial.printf("%s\r\n", printBuffer); | ||
+ | } | ||
+ | } | ||
+ | recvFlag=0; | ||
+ | } | ||
+ | </code> | ||
+ | ---- | ||
+ | |||
+ | ====== Záver ====== | ||
+ | |||
+ | Tento projekt bol realizovaný na vývojovom kite FRDM KL25Z vo vývojovom prostredí mbed. Komunikácia medzi kitom a LoRa modulom bola úspešne zrealizovaná pomocou SPI. Takisto aj komunikácia medzi kitom a počítačom bola úspešne zrealizovaná pomocou virtuálneho sériového portu. Odovzdávanie inštrukcí pre LoRa modul bolo zabezpečené pomocou príkazov z importovanej knižnice RadioHead. Inicializácia LoRa modulu pre príjem dát prebehla v poriadku. Vzhľadom na to, že zariadnie bolo testované iba vo vidieckom prostredí, nepodarilo sa overiť funkčnosť samotného hľadania a vypisovania zachytených správ. | ||
+ | |||
+ | Odkaz na ukážku:\\ | ||
+ | [[https://photos.app.goo.gl/1FGIWTzVIhBbRXQ13]] | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ====== Zdroje ====== | ||
+ | |||
+ | [[http://www.hoperf.com/upload/rf/RFM95_96_97_98W.pdf]]\\ | ||
+ | [[https://docs.google.com/viewer?url=http%3A%2F%2Fwww.seeedstudio.com%2Fdocument%2Fpdf%2FFRMD-KL25Z.pdf]]\\ | ||
+ | [[http://www.airspayce.com/mikem/arduino/RadioHead/]]\\ | ||
+ | [[https://os.mbed.com/handbook/USBDevice]] | ||
+ | |||
+ | ---- |