uFlex AIS_ESP32

Traditioneel communiceren modules als GPS en AIS met een seriële protocol als RS232 of RS422, al dan niet verpakt in een virtuele COM-poort over USB of Bluetooth. Dat principe, van één producent die aan één consument "hard-wired" "gegevens levert, heeft zo zijn beperkingen. Dat wordt onmiddellijk duidelijk wanneer er meerdere afnemers bediend moeten worden of sensoren van geheel verschillende geaardheid moeten samenwerken. En, tenslotte, het ontbreekt aan een constante factor waaromheen zaken in de tijd georganiseerd kunnen worden. Een marktplaats waar vraag en aanbod van gegevens bij elkaar komen, elkaar verrijken, en beschikbaar blijven. Een MQTT-broker fungeert als spin in het web rekent hier mee af. Hoe kom je vanuit AIS via NMEA -> JSON -> Wi-FI -> MQTT -> Node-Red -> zowel in alle uithoeken van de hobbyruimte als die in de wijde wereld? Daar gaat dit verhaal over.

 

De ESP8266 en ESP32 als opmaat naar het 'Internet of Things

Eind 2014 bracht Espressif (Shanghai, China) de ESP8266 op de markt. Een IC die vandaag de dag nog volop leverbaar is en minder dan een euro kost. Het is niet zomaar een microcontroller als alle anderen maar -met z'n QFN32 package van 5 x 5 mm- een klein monster die met recht een SoC (een 'System on Chip') genoemd kan worden. Het herbergt een krachtige low power 32bit 80 MHz RISC processor, 36kB SRAM, een WiFi radio met 100mW zendvermogen, een Wi-Fi stack, een Real-Time Operating System (RTOS) waarbij 80% van de processing power voor de applicatie beschikbaar blijft, een 10 bit AD converter, SPI, I2C en 17 GPIO pins. De chip is -aangevuld met Flash RAM- op talrijke modules terug te vinden in de afmeting (en de prijs!) van een postzegel. In 2016 bracht Espressif een nog krachtigere broer uit, de ESP32, met een dual core CPU op 240MHz, 520kB SRAM, crypto, een betere beveiliging, Bluetooth en nog veel meer IO in allerlei hoedanigheden. Het bedrijf biedt ook een vracht aan ontwikkeltools waaronder de ESP-IDF (Espressif IoT Development Framework) waar ook de Arduino gemeenschap zich op heeft gestort. En, met Eclipse of Microsoft Visual Studio IDE en het open source PlatformIO is er een heel eco systeem aan kwalitief hoogwaardige ontwikkeltools beschikbaar gekomen. Gratis en voor niets van internet af te halen. Mede dankzij deze twee chips heeft de ontwikkeling van Internet of Things (IoT) een enorme impuls gekregen.

 

MQTT

Een tweede ontwikkeling die in één adem met het Internet of Things genoemd kan worden is het MQTT netwerk protocol. Het is rond de eeuwwisseling door IBM voor het public domain vrijgegeven en diende oorspronkelijk om langs oliepijpleidingen 'machine-to-machine'-berichtenverkeer mogelijk te maken tussen onderdelen met een beperkte geheugencapaciteit en communcatiewegen met een beperkte bandbreedte. MQTT werkt volgens een "publiceer-abonneer" principe. Producenten van informatie verzenden dit via TCP/IP naar een server in het netwerk, de MQTT-broker. Consumenten die daar behoefte aan hebben 'abonneren' zich op alle of een selectie en ontvangen eenmalig of voortdurend updates.

Zo kunnen sensoren en actoren door tussenkomst van de broker informatie uitwisselen. Een AIS-feed via WiFi ontsluiten voor gebruik in alle uithoeken van het huis, maar ook naar cliënts buiten de deur. En tegelijktijd iets triviaals doen in de sfeer van domotica: een buitenverlichting die ingeschakeld wordt omdat een bron op internet meldt dat de zonsondergang op het huisadres ingetreden is. Er zijn eindeloze combinaties te bedenken maar het idee is duidelijk: Apparaten van compleet verschillende origine kunnen opeens met elkaar samenwerken en beslissingen ondersteunen. En misschien nog belangrijker: MQTT levert een "seperartion fo conserns". Ook voor de hier beschreven AIS ontvanger geldt: denk er niet niet te lang over na hoe het uiteindelijk met een PC of smartphone verbonden moet worden voor kaartpresentatie, maar richt je op de MQTT-broker en zorg dat de inhoud van de AIS-berichten daar in heldere bewoordingen terechtkomen. Vaak is dat in de vorm van JSON-objecten, minder elegant maar ook mogelijk zijn ruwe NMEA sentences, of het zeer efficiënte Google's Protobuf dataformaat. Het één sluit het ander niet uit. En ook is denkbaar dat weer een andere MQTT-client als tolk optreedt voor de rest. De MQTT-broker is de constante factor in het netwerk waar alles stap-voor-stap omheen georganiseerd kan worden.

Om de relaties tussen verschillende cliënts tot stand te brengen en te onderwerpen aan een reeks van spelregels kan gebruik gemaakt worden van een "flow editor" waarin de diverse nodes grafisch met elkaar worden verbonden. Node-Red is zo'n een product. Eveneens ontwikkeld door IBM en in 2016 als open source OpenJS Foundation project beschikbaar gesteld.

In de afbeelding hierboven een voorbeeld met (in het paars) de 'ais_esp32'-node die de hier beschreven AIS ontvanger respresentateerd. In het blauw wat Inject-labels om commando's naar de AIS-ontvanger te testen. In het groen twee Monitor-labels die de input vormen voor het monitor venster rechts. Daar worden nu JSON strings met positie- en statische scheepsinformatie updates getoond. In het grijs een UDP-node waarlangs de NMEA stream wordt doorgeleid naar MarineTraffic.

Voor de presentatie naar de eindgebruiker is er een zgn Nodered Dashboard beschikbaar en een wereld aantal widgets die daarop getoond kunnen worden: buttons, dropdowns, sliders, labels, forms, charts,etc. etc.

De AIS ESP32-MQTT ontvanger

Na deze inleiding wat meer informatie het eigenlijk project. Hiernaast de onderzijde van de print met de ESP32. In dit geval is er gekozen voor een ESP32-WROOM-32UE omdat deze een U.FL connector heeft voor een externe Wi-Fi -antenne wat gezien de metalen behuizing noodzakelijk is. Voor een kunststof behuizing zou dus ook een variant gekozen worden met een PCB-trace antenne. Het module heeft een Flash van 16Mb. Een simpele ESP8266 (bijvoorbeeld in de vorm van de ESP-07 die ook een U.FL connector heeft en 4Mb Flash ) zou ook goed gekund hebben. De ESP32-WROOM heeft een iets ruimere mogelijkheden met het aantal UART-pins wat standaard beschikbaar is en voor het prijsverschil hoef je het niet te laten: ca 3,50 EURO/USD bij AliExpress op het moment van schrijven.

De ontvanger wordt met een standaard 5V USB adapter gevoed. Naast een simpele (AMS1117) 3V3 spanningsregulator is er (NTR4101) P-Channel MOSFET en BC847 NPN als High-Side switch om de AIS-ontvanger op afstand uit te kunnen schakelen. Deze kan eenvoudig eenvoudig overbrugd worden wanneer daar geen behoefte aan bestaat.

ais_ESP32_PCB1.jpgAan de bovenzijde van de print is de AIS-ontvanger geplaatst. Dat is in dit geval een professioneel OEM-module maar kan vervangen worden door elk ander exemplaar met een RS232/RS422 uitgang al dan niet met reverse polarity of een andere baudrate. Dat is in de firmware van de ESP32 eenvoudig aan te passen . Kijk voor een voordelig alternatief bijvoorbeeld de dAISy HAT - AISof AIS-onvangermijn artikel over de AIS ontvanger met twee Silabs Si4362 en STM32 processor.

De afmetingen van de print is afgestemd op een (gehalveerde) Hammond1455J1601BK behuizing die nog voor handen was. Als daar voldoende belangstelling voor bestaat ben ik eventueel wel bereid het ontwerp aan te passen aan een specifieke AIS ontvanger en behuizing.

 

De software

Een korte beschrijving van de firmware in de ESP32: De scheepvaart updates van de AIS-ontvanger komen als (geïnverteerde) RS232 telegrammen binnen op UART-2 van de ESP32. Deze NMEA-sentences kunnen onmiddellijk nadat ze ontvangen zijn in onbewerkte toestand doorgestuurd worden naar de MQTT-broker, maar kunnen ook worden gedecodeerd tot voor mensen leesbare JSON-strings. In dat geval worden de NMEA strings aangeboden aan een geïntegreerde AIS-parser en als JSON-objecten opgezameld in een tweetal buffers. In het eerste buffer wordt de 'dynamische' updates van alle schepen in het verzorgingsgebied bijgehouden. Het betreft dan zaken als actuele positie, snelheid en koers afkomstig uit de AIS-frames type 1, 2, 3 en 18. In het tweede buffer wordt de meer 'statische' informatie uit de AIS-frames type 5, 8, en 24 verzameld. Het gaat in dat geval over zaken als scheepsnamen, scheepstype, de afmetingen van de schip, diepgang e.d., maar ook om gegevens die specifiek zijn voor de binnenvaart en gerelateerd zijn aan de lading en de reis: gevarenklasse en konvooilengte e.d. Deze laatste groep aan gegevens wordt ontleent aan het type 8 ‘Binary Broadcast Messages’ met het kenmerk DAC=200 / FID=10 die de Europese binnenvaart verplicht is uit te zenden.

Tijdens het opzamelen wordt de informatie van de schepen die al in buffer aanwezig zijn voortdurend geactualiseerd. Periodiek worden beide buffers onafhankelijk van elkaar geleegd, vervolgens geserialiseerd en als een verzameling JSON-strings naar de MQTT-server verzonden . Het interval voor het verzenden van de dynamische gegevens is voor standaard ingesteld op 10 seconden en die voor de statische gegevens op 30 seconden. Het verbindende element tussen beide blokken is het MMSI van elk schip.

Voor elke positie-update van een schip wordt ook de hemelsbrede afstand (in meters) tot de gegeven locatie van de thuisbasis berekend, hierdoor is het mogelijk op voorhand het aantal berichten te beperken tot binnen een bepaalde straal. De afstand wordt ook meegegeven in JSON-positie string

De firmware in de ESP32 is ‘Over The Air’ (OTA) te herprogrammeren en er zijn watchdogs actief op zowel de connectie met WiFi als met de MQTT-server. Het beslag aan RAM is ca 112k (35%), vooral opgesoupeerd door beide buffers. Van het flash geheugen is ca 78k in gebruik (60%). Het ‘Over The Air’ programmeren vergt een dubbele hoeveelheid Flash geheugen maar dat is in de ESP32 ruim voorhanden.

 

Het schema

AIS_ESP32_schematic

 

Downloads

 

Illustraties