====== WirelessHART sensor mote ====== Semestrální projekt do předmětu MPOA - Tomáš Řežucha. **Kompletní zdrojové kódy pro Keil uVision5 jsou ke {{ :2017:hart-sensor:mpoa_xrezuc00.zip |stažení zde}}.** \\ Device Family Package pro ADuCM4050 {{ http://download.analog.com/tools/EZBoards/ADuCM4050/Releases/AnalogDevices.ADuCM4x50_DFP.3.0.0.pack |lze stáhnout zde}}. ---- ===== Zadání ===== Navrhněte WirelessHART sensor mote a naprogramujte MCU Analog Devices ADuCM4050 na zpracovávaní vybraných HART příkazů z klasického HART FSK modemu a také pro komunikaci s bezdrátovým modulem založeném na SoC LTC5800. \\ Aplikace musí být schopna přeposílat HART zprávy mezi drátovým a bezdrátovým rozhraním a správně na ně odpovídat. ===== Úvod ===== WirelessHART je bezdrátová nadstavba průmyslového standardu HART, který je v současnosti nejrozšířenější standard pro senzory a aktuátory. WirelessHART je senzorová síť typu //mesh// pracujíci v pásmu ISM 2,4GHz podle dopručení IEEE802.15.4; vyznačuje se vysokou latencí, nízkou rychlostí ale naopak vyniká svojí robustností a nízou energetickou náročností. V tomto projektu je kladen důraz na firmware aplikačního MCU, který řídí celý senzorový přístupový bod. Blokové schema takovéhoto obvodu je na obrázku 1. {{ 2017:hart-sensor:wh_blockdiagram.png?600 }} \\ Obrázek 1: Blokové schema navrženého obvodu ===== Řešení ===== ADuCM4050 je mikrokontrolér založený na jádře ARM Cortex-M4F a je zaměřen na aplikace s extémně nízkou spotřebou. Z široké nabídky použitých perferií jsou použity tyto: Použité periferie mikrokontroléru ADuCM4050: ^ Periferie ^ Použití ^ | UART1 | Komunikace s HART modemem AD5700-1 | | UART2 | Komunikace s rádiovým module LTP5901-WHM | | I2C | Komunikace s Coulomb počítadlem LTC3335 (v budoucnu) | | 2x SPI | Připojení externích senzorů nebo ADC | | Flexi RTC | SensorStrobe - sběr dat z ADXL363 | | RTC | Scheduler | | FPU | Operace s plovoucí desetinnou čárkou | K vybraném mikrokontroléru výrobce dodává sadu ovladačů ve formě Device Family Package pro Keil {{ http://download.analog.com/tools/EZBoards/ADuCM4050/Releases/AnalogDevices.ADuCM4x50_DFP.3.0.0.pack |lze stáhnout zde}}. \\ Zdrojové kódy v adresáři //ADI// jsou upravené verze těchto ovladačů (periferie RTC a akceleromter ADXL363) aby lépe vyhovovali požadavkům této aplikace. \\ **Nejsem autorem zdrojových kódů v adresáři //ADI//.** ==== Analog Devices AD5700-1 ==== AD5700-1 je jednoduchý FSK modulátor a demodulátor splňujíci specifikace HART pro drátové FSK rozhraní. Připojuje se k MCU ADuCM4050 pomocí UART s baudrate 1200 Baud. Kontrola toku se využíva pro přepínáním mezi modulátorem a demodulátorm - HART je poloduplexní protokol. ==== Linear Technology LPT5901-WHM ==== O rádiový přístup do sítě WirelessHART se na fyzické, linkové a síťové vrstvě stará bezdrátový modul od Linear Technolgy LTP5901-WHM s integrovanou čipovou anténou. Modul je založen na System on Chip LTC5800 který obsahuje rádiový front-end, paměť FLASH a ARM Cortex-M3 na kterém běží SmartMesh networking software pro správnou obsluhu linkové a síťové vrstvy. Pro uživatele je tento systém přístupný pomocí API rozhraní, které je zprostředkováno pomocí UART-u. Jedná se o asynchornní a potvrzovanou komuniaci s kontrolou toku a chyb. \\ Výrobce dodáva API ovladač v embedded C. Ten je téměř beze změn (oprava drobných chyb) uložen v adresáři //DustNetworks//. \\ **Nejsem autorem zdrojových kódů v adresáři //DustNetworks//.**\\ Vyobrazení rádiového modulu je na obrázku 2: {{ 2017:hart-sensor:wh_module.png?175 }} \\ Obrázek 2: Rádiový modul LTP5901-WHM s čipovou anténou ==== Prototyp ==== Pro testování firmware-u byl sestaven hardware-ový prototyp s dostupných evaluačních desek. Z blokového diagramu na obrázku 1 chybí pokorčilá správa napájení z baterky. Pro evaluaci HART a WirelessHART konektivity je uvedený prototyp na obrázku 3 plně dostačující. {{ 2017:hart-sensor:wh_photo.jpg?600 }} \\ Obrázek 3: Fotka prototypu pro testování firmware-u \\ 1 - AD5700-1 evaluační deska, HART modem \\ 2 - ADuCM4050 vývojová deska. Obsahuje také akcelerometr ADXL363 \\ 3 - DC9003A-C WirelessHART vývojová deska pro Evropské pásmo \\ 4 - J-Link debugger\\ ==== Ukončování HART commandů ==== Specifkace HART ver. 7 rozšiřuje klasický HART o bezdrátovou nadstavbu WirelessHART a přináší velké množství commandů k řízení síťové vrstvy (Network Helth Report, Neighbour Report...). Všechny tyto příkazy ukončuje (tzn. vykonává nebo generuje odpověď) System on Chip LTC5800. Původní HART commandy, ke řízení aplikační vrstvy (kalibrace měření, nastavování Burstů...), ukončuje aplikační procesor ADuCM4050. Oba typy příkazů musí být akceptováný ze drátového i bezdrátového rozhraní, viz obrázek 4. {{ 2017:hart-sensor:moteterminated.png?500 }} \\ {{ 2017:hart-sensor:mcuterminated.png?500 }} \\ Obrázek 4: HART commandy ukončované v LTC5800 (nahoře) a v ADuCM4050 (dole) Funkce //hart_modem_rxSerialRequest()// je volána po přijetí kompletní HART zprávy po drátovém rozhraní. Procesor na základě parametru //cmdId// rozhodne, zda-li\\ 1) Dokáže sám vygenerovat odpověď pomocí //hart_lib_cmdTerminatedByMCU()// a odeslat ji pomocí //hart_serial_txHartFrame()//. \\ 2) Musí požadavek přeposlat do Mote-u (LTC5800). V tom případě přeformátuje zprávu do formátu srozumitelného pro LTC5800 API pomocí //hart_lib_cmdTerminatedBymote()// a zavolá vrstvu obsluhující požadavky na Mote //hart_modem_vars.toMoteCb()//.\\ Zdrojové soubory //hart_lib.c hart_serial.c a hart_xor.c// v adresáři //HART// jsou předkompilovány do formátu //*.lib//. //========== serialRX void hart_modem_rxSerialRequest(uint16_t cmdId, uint8_t* payload, uint8_t len, hart_lib_master_t master) { int16_t responseLen; // check if the cmd is terminated by OEM MCU or by mote if ( ((cmdId > 767) && (cmdId < 1024)) || //SmartMesh WirelessHART Users' Guide p115 ((cmdId > 64511) && (cmdId < 64766)) ) { // cmd terminated by mote DEBUG_MSG("hart MOTE cmd %d received, length: %d\n", cmdId, len); // save paramtere, flag request hart_modem_vars.toMoteCmdId = cmdId; hart_modem_vars.toMoteRequest = true; // build reply responseLen = hart_lib_cmdTerminatedByMote( cmdId, payload, len, hart_modem_vars.toMoteBuf, hart_modem_vars.toMoteBufLen ); // send reply only if hart_lib returned no error if(responseLen > HART_LIB_DO_NOT_ANSWER) { hart_modem_vars.toMoteCb(); } } else { // all other cmds are terminated by this MCU DEBUG_MSG("hart OEM cmd %d received, length: %d\n", cmdId, len); // build reply responseLen = hart_lib_cmdTerminatedByMCU( cmdId, payload, len, hart_modem_vars.toModemBuf, sizeof(hart_modem_vars.toModemBuf), master ); // send reply only if hart_lib returned no error if(responseLen > HART_LIB_DO_NOT_ANSWER) { hart_serial_txHartFrame( cmdId, // cmd id hart_modem_vars.toModemBuf, // RC|data responseLen // RC+data ); } } } ==== Non-volatile data ==== Specifikace WirelessHART definuje sadu proměnných a nastavení které musí zůstat uloženy i po resetu nebo strátě napájení, jsou tede non-volatile a musí být uloženy ve FLASH paměti. Část těchto proměnných (Network ID, Network Key, MAC adresa) jsou uloženy ve FLASH LTC5800 který je i sám spravuje. Ostatní aplikační proměnné (nastavení Burtů, Eventů, Configuration Changed Counter, Long Tag a další) musí být uložen ve FLASH ADuCM4050. Proměnné ve FLASH jsou seřazeny ve stuktuře typu //hart_flash_memImage_t// na předposlední stránce FLASH. //==== structure of non-volatile data saved in flash at HART_FLASH_ADDR typedef struct { cfgCounter_t cfgCounter; // configuration changed counter settings burstSettings_t burst[HART_BURST_NUM]; // bursts settings eventSettings_t event[HART_EVENT_NUM]; // events settings uint8_t longTag[32]; uint8_t shortTag[6]; // this 3 must be next to each other uint8_t descriptor[12]; // this 3 must be next to each other uint8_t date[3]; // this 3 must be next to each other uint8_t message[24]; uint8_t pollingAddr; uint32_t finalAssemblyNum; // this is only 24 bit wide!!!! } hart_flash_memImage_t; ==== Fronta Finite State Machine ==== Další komunikace po API s LTC5800 může být zahájena až po ukončení (pomocí ACK) předchozí komunikace a uplynutí Inter packet delay. Požadavky však můžou vznikat asynchronně z různých zdrojů: \\ 1) Asynchronní notifikace z Network Manageru\\ 2) Požadavek z drátového rozhraní\\ 3) Jiný požadavek mikrokontroléru\\ Pokud vznikne nový poždavek, počas průběhu jiného, je tento zaražen do fronty a bude vykonán po uvolnění komunikačních prostředků pomocí //time_configureFsmEvent()//. //============================================================================= // Execution of event, called from time.c //============================================================================= void fsm_event(void) { fsm_event_t *thisEvent, *nextEvent; // init event pointer thisEvent = &fsm_vars.eventQueue[fsm_vars.queueRdIdx++]; fsm_vars.queueRdIdx %= FSM_QUEUE_LEN; // index rollover nextEvent = &fsm_vars.eventQueue[fsm_vars.queueRdIdx]; if (thisEvent->event != NULL) { thisEvent->event(); // Issue Callback thisEvent->event = NULL; // Callback is empty } // schedule next event in queue, if armed if (nextEvent->event != NULL) { time_configureFsmEvent(nextEvent->delay, fsm_event); } } ==== Debugging zprávy ==== Protože všechny dostupné periferie UART jsou obsazené a Keil nepodporuje //semihosting// bylo využito možnosti posílat debuggovací zprávý zkrze programátor J-Link.\\ Na straně PC lze tyto zprávy číst pomocí programu //J-Link RTT Viewer//.\\ **Nejsem autorem zdrojových kódů v adresáři //RTT//** kromě souborů //debug.c a debug.h//.\\ Ukázka debuggovacích zpráv po startu mikrokontroléru je zobrazena na obrázku 5. ===== Ukázka ===== {{ 2017:hart-sensor:rtt_viewer.png?400 }} \\ Obrázek 5: Datalog ze startu mikrokontroléru Klíčové eventy v zobrazeném datalogu:\\ //Uvítací zpráva// - MCU se korektně zaplo\\ //Reset a Event: BOOT// - Rádiový modul byl vyresetován a zaslal BOOT notifikaci\\ //FSM JOINING// - Byly provedeny všechny potřebné startovací rutiny a je zapnut Autojoin\\ //Join// - LTC5800 dostal příkaz na pokusení se o připojení do sítě\\ //Event: OPERATIONAL// - Zařízení je připojeno do sítě a má vyhrazené základní rádiové prostředky\\ {{ 2017:hart-sensor:data_notif.png?300 }} \\ Obrázek 6: Přijetí WirelessHART packetu s příkazem číslo 0 - Get Unique Identifier a odeslání odpovědi. Pro demonstraci funkčnosti bylo vytvořeno GUI, které dokáže generovat WirelessHART zprávy a odeslat je přes manager, dále také přijímá a zobrazuje jejich odpovědi.\\ Na následujíci videoukázce se ze seznamu připojených zařízení vybere to správné a odesílají se příkazy číslo 20 - Get Long Tag a číslo 72 - Squawk (audiovizuální identifikace, v tomto případě zapnutí/vypnutí LED). {{ youtube>V_VXArqP7-o?medium }} ===== Závěr ===== V rámci projektu byl sestaven prototypový hardware, který umožňoval evaluaci komunikačních rozhraní pro drátavé FSK i bezdrátové rozhraní podle protokolu HART. Po úspěšném ověření funkce komunikačních rozhraní, byla vytvořena aplikační vrstva podle oficiálních HART specifikací, tak aby se výsledné zařízení úspěšně připojilo do bezdrátové sítě WirelessHART a správně zpracovalo vybrané příkazy pro zběr dat z akcelerometru ADXL363 připojeného pomocí rozhraní SPI. Pro generaci HART signalizačních zpráv byl použit jednoduchý USB <-> HART konvertor. Pro generaci WirelessHART zpráv a demonstraci klíčových funkcí byl vytvořen program pro obsluhu WirelessHART manageru v jazyce //Python// (není součástí tohoto projektu). ===== Použitá literatura ===== [1] Analog Devices Inc., ADuCM4050 Datasheet, 2017. Link: http://www.analog.com/media/en/technical-documentation/data-sheets/ADuCM4050.pdf \\ [2] Linear Technology, „SmartMesh WirelessHART Application Notes,“ 2017. Link: http://cds.linear.com/docs/en/application-note/SmartMesh_WirelessHART_Application_Notes.pdf \\ [3] Analog Devices Inc., AD5700/AD5700-1 Datasheet, 2016. Link: http://www.analog.com/media/en/technical-documentation/data-sheets/AD5700_5700-1.pdf \\ [4] Linear Technology, LTP5901-WHM/LTP5902-WHM Datasheet, 2014. Link: http://cds.linear.com/docs/en/datasheet/59012whmfa.pdf \\ [5] Analog Devices Inc., ADXL363 Datasheet, 2013. Link: http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL363.pdf \\ [6] HART communication Foundation, „Network Management Specification,“ 2012. \\ [7] Analog Devices Inc., AN-1427 Application Note, 2017. Link: http://www.analog.com/media/en/technical-documentation/application-notes/AN-1427.pdf \\ -----