ESP32/RS-232-adapter: draadloze verbinding voor klassieke meetinstrumenten
RS-232 kan ook draadloos! Een moderne en goedkope ESP32-module geeft een seriële interface vleugels. Naast de communicatiemogelijkheden via een seriële verbinding stelt deze kleine adapter SCPI-testapparatuur in staat om commando’s te ontvangen en gegevens naar het thuisnetwerk te sturen via MQTT.
Als je in de loop der jaren aan verschillende elektronicaprojecten hebt gewerkt, is de stapel testapparatuur op je werkbank gegroeid – dat kan niet anders. In mijn geval gebruik ik een Keithley SourceMeter 2400 om fouten in elektronische apparaten op te sporen, ze in bedrijf te stellen of zelfs de eigenschappen van verschillende componenten te meten. Het is ook een geweldig instrument voor het testen van de lekstroom van elektrolytische condensatoren of het meten van hun nominale capaciteit. Een ander instrument in mijn verzameling is een AOR AR5000-ontvanger, die ik gebruik om in contact te blijven met radioamateurs waar ook ter wereld.
Beide apparaten kunnen, net als vele andere in het lab, bestuurd worden door een PC dankzij hun ingebouwde seriële RS-232-interfaces. De beschikbaarheid van USB/RS-232-adapterkabels betekent dat aansluiting op een normale PC vrij eenvoudig zou moeten zijn. In mijn geval werkte de adapterkabel prima met de AR5000, maar de communicatie met de Keithley SourceMeter was merkbaar minder stabiel. Er gingen af en toe karakters verloren tijdens het verzenden van SCPI-commando’s en de verbinding viel regelmatig uit.
De RS-232-verbinding
De RS-232-standaard, vastgelegd in de jaren 1960, wordt gebruikt om seriële databits van een karakter te verzenden met behulp van veranderingen in spanningsniveaus. De elektrische eigenschappen werden gedefinieerd in V.28, terwijl de overkoepelende functionaliteit geregeld was in V.24. De V.28 standaard bepaalt dat, afhankelijk van de logische bitwaarde, een logische ‘0’ wordt verzonden als een tot 5...12 V stijgende flank en voor een logische ‘1’ als een tot –5...–12 V dalende flank. De ontvanger heeft een iets breder spanningsvenster en zal een signaal in het bereik van 3...12 V interpreteren als een logische ‘0’ en in een bereik van –3...–12 V als een logische ‘1’. Hierbij wordt rekening gehouden met signaaldegradatie in de kabel door ruis, spanningsval en flankafronding ten gevolge van de impedantie-eigenschappen van de kabel.
In oudere, goedkope USB/serieel-adapters en sommige laptops is de zwaai van het signaal aan de zenderzijde nauwelijks groter dan ±5 V of zelfs ±3 V als gevolg vereenvoudigingen in het ontwerp van de RS-232-driver om de ontwikkelings- en componentkosten te minimaliseren. Dit heeft geleid tot de populaire overtuiging dat laptops en RS-232-apparatuur vaak niet goed samenwerken. De afbeelding van figuur 1 (uit een TI-document) illustreert de standaard-conforme spanningsniveaus.
Of het eerder genoemde communicatieprobleem met het Keithley-instrument te wijten was aan het gebruik van een USB-verlengkabel, een aardlus of de elektrische eigenschappen van de ingebouwde transceiver is hier niet relevant. Een USB-kabel van de ene kant van het lab naar de andere is immers niet alleen slordig maar ook een struikelgevaar. Wat we nodig hebben is een nette, compacte en draadloze oplossing!
Ik zocht overal naar een kant-en-klare oplossing voor mijn probleem, maar ik vond slechts vrij grote modules voor DIN-rail-montage of DHZ-ontwerpen die waren ontworpen om één specifiek probleem op te lossen en voor mij te weinig mogelijkheden hadden. Zinloos – als ik een nette, universele RS-232 radiocommunicatie-eenheid wilde, dan moest ik mezelf achter de oren krabben en zelf zoiets ontwerpen.
Ontwerpcriteria
Dit ontwerp is bewust gericht op de maker-lab omgeving en wordt zeker geen fraai ingekast model zoals je in een elektronicawinkel kunt kopen. Toch is het een goede gewoonte om het ontwerp van het apparaat zorgvuldig te overwegen, zodat het alle taken kan uitvoeren waarvoor het bedoeld is.
Een ESP32 doet al het werk
De RS2-32-gateway is primair bedoeld om gegevens van en naar het netwerk te zenden. Dit wordt gewoonlijk gedaan via TCP-poort 23 (Telnet). Applicatie-specifieke software-aanpassingen zouden echter ook mogelijk moeten zijn, die de gebruiker kan kiezen aan de hand van de eisen van de betreffende applicatie. Voor mij was een SCPI-naar-MQTT-service belangrijk, zodat de SourceMeter-testapparatuur zijn metingen ’s nachts naar Grafana (zie verderop) kan sturen voor evaluatie.
De ESP32 biedt voldoende rekenkracht (naast het verzenden van eenvoudige TCP-packets) zodat het aangesloten apparaat eenvoudig kan worden geïntegreerd in Home Assistant of een vergelijkbare service via MQTT of om het te delen via een speciaal frontend via de ESP32-webserver.
Een alternatief is de ESP8266, die iets minder ruimte inneemt en iets goedkoper is. De bespaarde ruimte gaat echter ten koste van een aanzienlijk zwaarder belaste CPU en minder RAM-geheugen. Bovendien mist de ESP8266 een (in deze toepassing voordelige) Bluetooth-module naast de gewenste WiFi-functie.
Het nadeel van de ESP32 is natuurlijk zijn aanzienlijk hogere stroomverbruik (maximaal wordt ongeveer 500 mA van de 3,3V-rail genomen). Natuurlijk zal de CPU niet continu bezig zijn met rekenen, maar afhankelijk van hoe goed de software uiteindelijk is geoptimaliseerd, zal de piekstroom waarschijnlijk deze waarde bereiken, zoals aangegeven in tabel 4.2 van de datasheet. Een vergelijking met de datasheet van de ESP8266 laat zien dat het stroomverbruik van de ESP32 ongeveer 35% hoger is tijdens zenden en ongeveer 80% hoger tijdens ontvangen.
Een net, compact ontwerp
De meeste mensen zijn het er waarschijnlijk wel mee eens dat er al genoeg kabels rondslingeren op en onder werkbanken. Deze print kan rechtstreeks op een D-sub DE-9 connector worden gesoldeerd en is qua afmetingen niet veel groter dan een standaard IEC C13 netstekker (inclusief de buigstraal). Dit betekent dat de print in aangesloten toestand de footprint van het RS-232-apparaat niet veel groter maakt. Als er een behuizing nodig is, kan deze eenvoudig 3D-geprint worden; in het ideale geval past de schakelingt zelfs in een standaardbehuizing.
Voeding via micro-USB
De print wordt gevoed via een micro-USB-connector (inmiddels de standaard voor veel kleine apparaten). De +3,3 V die de ESP32 nodig heeft, wordt door de Advanced Monolithic Systems AMS1117 lineaire spanningsregelaar uit de +5V-voeding van de USB-poort afgeleid. Hoewel de AMS1117 geschikt is voor maximaal 1 A, wordt hij behoorlijk heet op deze relatief kleine print. Een efficiënter alternatief is de Texas Instruments TPS62291 schakelende step-down-converter, die wordt geleverd in een WSON-6 behuizing van 2x2 mm. Deze levert ook maximaal 1 A rn zou wat ruimte besparen. Tenzij je een microscoop hebt en alle benodigde gereedschappen en ervaring om op dit niveau te werken, is deze chip lastiger te monteren vanwege de kleine afmetingen van de behuizing. Wie aan zijn soldeervaardigheden twijfelt, kan nuttige aanwijzingen en tips vinden in de video .
Er moet ook worden opgemerkt dat de verkrijgbaarheid van dit specifieke onderdeel de afgelopen jaren aan schommelingen onderhevig was. Hierdoor is de prijs bij sommige distributeurs toegenomen tot meer dan € 20 in plaats van de meer gebruikelijke € 1,70. Als je de prijzen op internet vergelijkt, kun je exemplaren vinden voor prijzen die doen denken aan de goede oude tijd. Om het gedoe te verminderen, heb ik in deze versie alleen de AMS1117 gebruikt, wat het solderen met de hand veel eenvoudiger maakt.
Voeding via de 9-polige sub-D connector
Als je er niet vies van bent om af en toe de gebaande paden te verlaten, kan de print ook gevoed worden via de 9-polige sub-D connector. Met een kleine aanpassing aan de eindapparaten kan de vereiste 5 V worden geleverd via de RS-232-connector (waardoor een extra voeding wordt vermeden). De standaard ondersteunt een dergelijke voedingsoptie via de connector echter niet, dus we moeten er rekening mee houden dat deze aanpassing ook niet conform de standaard is.
Volgens V.28 kunnen alle signaallijnen spanningen voeren van +15 V tot –15 V; voor voedingsdoeleinden is het zinvol om een van de pinfuncties te ‘misbruiken’ die zelden wordt benut. Pin 9 is de zogenaamde Ring Indicator (RI) en wordt alleen gebruikt door een modem om een inkomend gesprek te signaleren. RS-232-modems zijn tegenwoordig zo goed als redundant, waardoor de RI-pin een geschikte kandidaat is om voor de voeding te gebruiken.
Eerst moeten we echter controleren wat er gebeurt als we onverwacht de maximale spanning aanleggen, bijvoorbeeld als wer een eindapparaat aansluiten dat onze voedingslijn aanstuurt conform V.28. De +15 V is geen probleem voor de AMS1117 zelf; deze spanning valt binnen de gespecificeerde limieten. Als er echter –15 V zou aanliggen, zouden de interne beveiligingsdiodes van de AMS regelaar de gewoonlijk 10...20 mA van het RS-232 signaal naar massa afleiden. Empirisch is gebleken dat deze diodes hier geen problemen mee hebben, en volgens hun specificatie zijn de RS-232-drivers kortsluitvast, dus ook hier treedt geen schade op.
De VDD-voedingsspanning van onze RS-232-transceiver is slechts gespecificeerd tot 5,5 V en is ook verbonden met de +5 V. Gelukkig daalt de spanning in dit geval tot ongeveer 3,5 V vanwege de stroombegrenzing door de RS-232-drivers. Toegegeven, we gaan hier een beetje kort door de bocht, maar we hebben al deze factoren alleen overwogen voor het zeldzame geval dat RI op pin 9 daadwerkelijk wordt aangestuurd door het eindapparaat. Meestal is deze pin niet aangesloten.
Echte RS-232
Zoals eerder vermeld is ons doel hier om zo dicht mogelijk bij de V.28 standaard te blijven, daarom is een data-transceiver absoluut noodzakelijk. De ST232EBTR van ST is hiervoor geschikt; deze chip is verkrijgbaar in een TSSOP-16-behuizing. Met een prijs van ongeveer € 1 is dit IC heel betaalbaar; het beschikt over een interne spanningsverdubbelaar en inverterschakelingen, genereert voedingsspanningen van plus en min 10 V, die worden gebruikt voor de RS-232-signalen (die typisch ongeveer 9 V bedragen onder normale bedrijfsomstandigheden). Het schema van de ESP32/RS-232-dongle met de ESP32-WROOM-module (of de WROVER met PSRAM) en de twee IC’s (ST232EBTR en AMS1117) plus alle periferie is te zien in figuur 2.
Plaatsing van onderdelen
Voor zo’n kleine print met zo weinig componenten heeft het weinig zin om die professioneel te laten bestukken of de extra kosten te maken van een soldeerpasta-stencil en aansluitende assemblage met behulp van een reflow-plaat. De print van figuur 3 kan op de ouderwetse manier met de hand worden gesoldeerd omdat er weinig componenten zijn en de soldeereilandjes goed toegankelijk zijn.
De eerste component die moet worden gemonteerd is de ST232 (U3). Deze is relatief plat en er is wellicht enige nabewerking nodig om zuivere aansluitingen te krijgen. Vervolgens kunnen de condensatoren, weerstanden en LED op hun plaats worden gesoldeerd, gevolgd door de AMS1117 (U1) en de USB-connector. Dan kan de ESP32 en als laatste de 9-polige sub-D-connector worden gesoldeerd.
De firmware
De allereerste functie van de firmware is het doorsluizen van karakters die via het netwerk worden ontvangen naar de RS232-poort en vice versa, maar dankzij de veelzijdigheid van de ESP32 is hier veel meer mogelijk. De firmware, zoals te vinden in de repository , biedt momenteel twee bedrijfsmodi – Telnet en MQTT/SCPI – die aansluitend worden besproken.
Telnet/Raw TCP-Socket
Zoals we al hebben aangestipt bij de ontwerpcriteria, is de primaire functie het overbrengen van gegevens van het netwerk naar de RS-232-poort. Voor zulke adapters is het gebruikelijk om de karakters zonder bewerking te verzenden via TCP-poort 23. Deze poort werd vroeger gebruikt voor Telnet-verbindingen naar een server, maar wordt tegenwoordig zelden gebruikt (behalve bij embedded systemen). Voor ons doel, het verzenden van commando’s of meetwaarden van en naar seriële apparaten, is dit in een thuisnetwerk meer dan afdoende.
Telnet is een netwerk-communicatieprotocol dat is ontwikkeld om de afstandsbediening van een computer via een netwerk mogelijk te maken. Het biedt een op tekst gebaseerd communicatiekanaal waarmee een gebruiker toegang kan krijgen tot een computer op afstand en daar opdrachten kan uitvoeren. De verbinding is bidirectioneel, zodat zowel de invoer als het antwoord via het netwerk worden doorgegeven. Telnet werd oorspronkelijk ontwikkeld in het nog primitieve tijdperk van de vroege internetstandaarden en wordt vaak gebruikt in toepassingen waar eenvoudige tekstgebaseerde communicatie volstaat. Het wordt echter als onveilig beschouwd omdat het geen encryptie biedt, waardoor mogelijk alle overgedragen gegevens kunnen worden onderschept, inclusief wachtwoorden en andere gevoelige informatie.
Voor de eerste communicatietests kun je het hulpprogramma telnet.exe gebruiken, dat standaard in eerdere versies van Windows zat. Als het niet beschikbaar is, kun je het gratis en meer universele alternatief PuTTYi> gebruiken.
MQTT/SCPI
Voor toepassingen die regelmatig meetwaarden moeten vastleggen over perioden van meerdere uren, kun je geschikte Python-scripts ontwikkelen of zelfs kant-en-klare tools op je PC starten en ze uitlezen via de Telnet-poort. Een praktisch alternatief voor degenen die al een geschikte infrastructuur in hun thuisnetwerk hebben opgezet, is om de energieverslindende PC helemaal te omzeilen en een eenvoudiger meetopstelling te gebruiken.
In veel huishoudens worden al services zoals MQTT, InfluxDB en Grafana gebruikt voor het vastleggen van meetwaarden van sensoren op een Raspberry Pi of via Docker Containers met behulp van hun NAS. Zonder al te veel in detail te treden en in eenvoudige bewoordingen:
- MQTT is een lichtgewicht berichtenprotocol dat is ontworpen voor efficiënte communicatie tussen IoT-apparaten en netwerken met geringe bandbreedte en grote latentie. Het gebruikt een informatie-broker met een publish/subscribe-model om naadloze gegevensuitwisseling met minimale overhead mogelijk te maken.
- InfluxDB is een tijdreeks-database, ontworpen om efficiënt om te gaan met hoge schrijf-/vraag-belastingen voor gegevens met tijdstempels. Tags zijn key/value-paren voor indexering terwijl velden de eigenlijke data bevatten.
- Grafana haalt gegevenswaarden uit een database en geeft de informatie op een gebruiksvriendelijke manier weer in de vorm van door de gebruiker gedefinieerde grafieken.
Voor degenen die thuis zoiets hebben ingericht, biedt deze firmware de optie om meetwaarden gegenereerd door het SCPI-compatibele apparaat direct te publiceren naar een MQTT-broker voor verdere verspreiding.
De set commando’s die door diverse SCPI-apparaten worden gebruikt, varieert aanzienlijk. Het enige apparaat dat momenteel door de code wordt ondersteund is de Keithley SourceMeter 2400. Dit is echter als een goed uitgangspunt voor iedereen om eigen firmware-varianten toe te voegen. Bekwame embedded ontwikkelaars worden uitgenodigd om de software-functionaliteit uit te breiden en te delen met de gemeenschap.
Om te zien hoe meetweergaven kunnen worden weergegeven in verschillende toepassingen, zie figuur 4 (Grafana), figuur 5 (MQTT Explorer, een uitgebreide MQTT-client voor verschillende platforms ) en figuur 6 (ook Grafana). Om dit mogelijk te maken moet de ESP32 een paar dingen regelen en daarvoor heeft hij informatie nodig die we via een webinterface moeten verstrekken.
WiFi-setup
Als geen geconfigureerd access point (AP) wordt gevonden of als er geen is geconfigureerd, dan wordt de ESP32 actief en biedt zichzelf aan als een AP met de naam esp232-config. Het is het beste om verbinding te maken met dit AP met behulp van een smartphone. Na het inloggen kun je de belangrijkste parameters configureren door in een browser naar http://192.168.4.1/ te gaan. De webpagina die op de ESP32 wordt gehost is te zien in figuur 7.
In tabel 1 kun je nalezen wat in elke rij moet worden ingevoerd.
OTA: Over-the-Air updates
In de Arduino IDE of in PlatformIO, waar ik de voorkeur aan geef, kan de ESP32 ‘op afstand’ worden bijgewerkt. Het onderliggende protocol wordt geïmplementeerd door de ArduinoOTA-component. Hoewel deze functie frequente updates van de microcontroller vergemakkelijkt, kwamen er in de praktijk belangrijke nadelen aan het licht. Het lijkt erop dat het voortdurend toewijzen en vrijgeven van buffers voor elk ontvangen UDP-pakket het geheugen van de ESP32 fragmenteert, wat kan leiden tot onvoorspelbare resets. Tot overmaat van ramp gebeurt dit ongeacht of er OTA-packets onderweg zijn. Je kunt je voorstellen dat een crashbericht dat wordt uitgevoerd via de UART van de ESP32 zelden goed wordt ontvangen door het aangesloten apparaat. Gelukkig zijn er verbeteringen die het crashpercentage aanzienlijk verlagen. Vanwege deze mate van onzekerheid wordt de OTA-functie alleen kortstondig en op verzoek van de gebruiker geactiveerd. Daarom is er een veld (Enable OTA) voor in de webinterface.
Flashen
Als je nog geen Pogo-adapter voor de ESP32-modules hebt, moet de microcontroller na assemblage worden voorzien van de juiste firmware met behulp van de TX- en RX-pinnen van de ESP32. Download hiervoor de broncode van , importeer deze in PlatformIO, compileer en flash deze naar het board.
Rechtsonder op de print is voorzien in een programmeerpoort. Voor sporadisch gebruik kan je gewoon het IO0-signaal aan massa leggen en de TXD0 en RXD0 (pin U4_34 van de microcontroller, zie figuur 8) aan een USB/UART-adapter solderen.
Zoals tabel 2 toont, heeft de ESP32 een paar ‘strapping pins’ die moeten worden ingesteld als je de ROM-code met deze methode laadt. In deze opstelling hoeven we ons maar om één ervan zorgen te maken (IO0). Zodra de firmware is geladen, zou na ongeveer 30 seconden een LED moeten gaan knipperen.
Niet alles is even mooi
De ESP32 heeft zijn capaciteiten bewezen in mijn projecten. Er waren echter aanvankelijk verschillende problemen in de Arduino-bibliotheek met betrekking tot het gebruik van de UART-buffer, gerelateerd aan de code die de bibliotheken in het IDF-framework rechstreeks benadert. Bugs in de ArduinoOTA-bibliotheek zorgden er ook voor dat ik een aantal nachten bezig was om de problemen te lokaliseren. Als gevolg hiervan zijn er bepaalde workarounds in de broncode. Maar omdat deze firmware open source is, zal hij blijven evolueren en profiteren van verbeteringen die door de community worden bijgedragen.
De volgende generatie
Wat me tot nu toe stoorde aan v1.0 van het project is het ietwat omslachtige flash-proces tijdens de eerste installatie (of flashen om fouten in de code te corrigeren). Dankzij een flash-adapter met Pogo-pinnen die ik voor al mijn projecten gebruik, gaat dit veel makkelijker, maar niet iedereen heeft een geschikte adapter bij de hand of werkt graag met jumperkabels.
Daarom gaat de ESP32/RS-232-adapter naar zijn volgende incarnatie: die wordt momenteel ontwikkeld als versie 2.0 met behulp van een ESP32-S3-PICO. Er zijn al enkele eerste prototypes gebouwd en die zien er veelbelovend uit. De PICO is een complete module met SPI-flash en RAM, alles geïntegreerd in een LGA-56 behuizing. Hoewel de PICO er op het eerste gezicht uitziet als een QFN, die meestal gemakkelijk met de hand te solderen is, moet GND verbonden worden met een pad aan de onderzijde, die bij handmatige assemblage via een gat gesoldeerd moet worden. Deze behuizing heeft ook geen aansluitpinnen, zodat de aansluitingen slechts moeizaam vanaf de rand gesoldeerd worden. Het lijkt erop dat een (mini)reflow-plaat hier de beste methode is .
Het grote voordeel van de S3 is dat deze de complete USB-periferie aan boord heeft om te flashen of te debuggen. Indien nodig kan ESP232 v2.0 ook worden gebruikt als een USB/-RS-232-adapter.
Of we daarmee uitkomen waar we begonnen zijn is een retorische vraag. Als je bedenkt dat de ESP8266 al van meet af aan ideaal was om een WiFi/serieel-adapter te bouwen, vraag je je af waarom iets dergelijks vandaag de dag nog steeds niet op de markt is.
Opmerking redactie: Dit artikel (220352-03) is verschenen in Elektor Maart/April 2024.
Over de auteur
Georg Hofstetters interesse in elektronica werd gewekt in de dagen van de Commodore 64 en gaatjesprint. Na zijn opleiding tot elektronicus behaalde hij een graad in computerwetenschappen. Sindsdien ontwikkelt of reverse-engineert hij software en embedded systemen en publiceert hij geselecteerde projecten op zijn website www.g3gg0.de. Enkele van de bekendere projecten zijn firmware-aanpassingen voor Canon DSLR’s met de naam Magic Lantern www.magiclantern.fm en voor de Toniebox https://gt-blog.de/toniebox-hacking-how-to-get-started.
Vragen of opmerkingen?
Hebt u technische vragen of opmerkingen naar aanleiding van dit artikel? Stuur een e-mail naar de auteur via elektor@g3gg0.de of naar de redactie van Elektor via redactie@elektor.com.