Ich habe kürzlich ein altes BK Precision 1787 Netzteil in der Garage meines Vaters gefunden und, da ich ein kleiner Sammler bin, konnte ich nicht widerstehen, es mit nach Hause zu nehmen und damit zu spielen. Wie ein vergessenes Spielzeug stand dieses Netzteil über ein Jahr lang in meinem Schrank, sammelte Staub und wartete nur darauf, benutzt zu werden. Kürzlich holte ich es heraus, nur um festzustellen, dass es auf der Rückseite einen RS-232-Anschluss hatte:
Abbildung 1:
Ich fragte mich, „könnte ich dies tatsächlich mit einem RS-232-Kabel steuern?“ Bei einer ersten Untersuchung auf der Website von BK Precision besagte die ursprüngliche Dokumentation (von vor über 20 Jahren), dass ich ein spezielles Kit benötigen würde, um die PC-Schnittstelle nutzen zu können:
Abbildung 2:
Ich war ziemlich enttäuscht, als ich auf diese Mitteilung stieß und dachte darüber nach, das ganze Gerät zu entsorgen, aber ich beschloss, ein kleines Experiment zu wagen. In diesem Artikel werden wir uns ansehen, wie ich das Netzteil auseinandergenommen und in ein IoT-gesteuertes Gerät verwandelt habe, bei dem Spannung und Strom über Ihr Telefon oder jedes internetfähige Gerät eingestellt oder abgelesen werden können. Wir werden uns die UART-Befehle ansehen, den Bus abhören, um die serielle Kommunikation zu validieren, und einen REST-API-Server auf einem Raspberry Pi Pico W aufbauen, um die IoT-Fähigkeit dieses Geräts bereitzustellen.
Anstatt das Netzteil als Elektroschrott zu entsorgen, entschied ich mich, ein wenig damit zu basteln. Die meisten Netzteile können heutzutage über Serial (z.B. UART), USB (normalerweise als COM- oder USBTMC-Gerät) und/oder Ethernet (in der Regel über VISA gesteuert) gesteuert werden. Ich habe jedoch nicht viele Geräte gesehen, die Wi-Fi-Fähigkeiten unterstützen. Ich stelle mir vor, dass dies daran liegt, dass es ein bisschen lästig zu konfigurieren ist und die meisten Designer oder Testingenieure sich nicht wirklich von einer kabelgebundenen Verbindung stören lassen. Mein Netzteil kam mit einem RS-232-Anschluss, aber sonst nichts. Ich dachte, es wäre ziemlich cool, ihm Wi-Fi-Fähigkeit mit einem REST-API-Frontend zu geben, damit ich es von überall aus mit einem internetfähigen Gerät steuern könnte.
Das eine große Problem, das ich hatte, war meine Unfähigkeit, mit dem Netzteil zu kommunizieren. Wie Sie oben gesehen haben, besagte das Handbuch, dass Sie ein proprietäres Kit und eine Software benötigen würden, um die PC-Schnittstelle zu nutzen. Mein erster Versuch, das Netzteil zu „hacken“, endete in einem völligen Fehlschlag. Ich schloss ein RS-232 UART-Kabel an den hinteren Anschluss an und begann, zufällige Zeichen einzugeben. Ich entfernte den Deckel und verfolgte Signale über den RS-232-Anschluss zu einem MAX202C-Transceiver-Chip und beobachtete die TX- und RX-Signale auf beiden Seiten des Chips. Alles, was ich bekam, war ein Haufen Müll:
Abbildung 3:
Glücklicherweise waren die Leute bei BK Precision super hilfsbereit und haben mir den benötigten Befehlssatz zur Steuerung der Versorgung gegeben. Sie konnten mir sogar Screenshots mit der Software, die sie verwendeten, und allen UART-Einstellungen zur Verfügung stellen, sodass ich bestätigen konnte, dass ich alles korrekt eingerichtet hatte. Mit ihrer Hilfe konnte ich meine Befehle testen und auf meinem Oszilloskop sehen, wie sie korrekt verarbeitet wurden:
Abbildung 4:
Obwohl dies wie ein überflüssiger Schritt erscheint, half es mir, eine Basislinie zum Vergleich zu etablieren, wenn ich meinen Raspberry Pi Pico W direkt an die UART-Leitungen anschließen würde. Zu diesem Zeitpunkt konnte ich eine ordnungsgemäße Kommunikation herstellen und war bereit, mein Netzteil so umzurüsten, dass es ein IoT-fähiges Gerät wurde.
Nachdem ich eine funktionierende Einrichtung mit einem USB RS-232 UART-Kabel hatte, wollte ich die gleiche Einrichtung mit einem Raspberry Pi Pico W nachbilden. Die meisten meiner Projekte für den Raspberry Pi Pico sind in MicroPython geschrieben (eine kleinere, kompaktere Version von Python, die für Mikrocontroller gedacht ist), also entschied ich mich, die machine.uart Bibliothek zu nutzen. Dazu musste ich meine UART/RS-232-Leitungen an die spezifischen Hardware-Pins für UART anschließen. In diesem Fall verwendete ich GPIO 16 und 17. Nachdem ich serielle Befehle über UART innerhalb meines MicroPython-Codes gesendet hatte, stellte ich fest, dass alle gesendeten und zurückkommenden Daten Müll waren. Der Code meldete ständig, dass die zurückkommenden Bytecodes nicht einmal ASCII-Zeichen waren. Offensichtlich stimmte etwas nicht. Aus diesem spezifischen Grund war es entscheidend, dass ich eine Aufnahme eines funktionierenden Setups bekam. Sofort konnte ich feststellen, dass die Signale invertiert wurden, bis sie zum Raspberry Pi Pico-Gerät gelangten. Nachdem ich TX und RX auf Invertierung eingestellt hatte (beim Instanziieren des UART-Bibliotheksobjekts), waren die zurückkommenden seriellen Daten makellos.
Es ist wichtig zu beachten, dass das Raspberry Pi Pico-Gerät auf 3,3V Spannungsebenen arbeitet und die BK Precision 1787 (speziell der MAX202C-Chip, den es verwendet) auf 5V. Das Senden von 5V-Signalen an die GPIO-Pins des Raspberry Pi Pico-Geräts über längere Zeiträume kann die Eingangspuffer des Chips beschädigen. Für die langfristige Nutzung ist es sehr ratsam, einen Pegelwandler zu verwenden, um die Spannungsebenen zwischen den Geräten von 3,3V auf 5V richtig umzuwandeln.
Zu diesem Zeitpunkt hatte ich eine Kommunikation etabliert und eine Treiberbibliothek geschrieben, die eine vollständige Steuerung meines Netzteils über serielle Kommunikation ermöglichte. Der nächste Schritt war, einen grundlegenden Webserver zu konfigurieren und zu validieren, dass ich mein Gerät über das Web steuern konnte. Dank microdot konnte ich meine REST-API abkürzen und einen sehr schnellen „Hello World“-Prototypen erstellen, um zu validieren, dass das Raspberry Pi Pico H-Gerät einen Webserver für mich hosten konnte. Neben einer einfachen „Hello World“-Rückgabeanweisung bestätigte ich auch, dass ich LEDs mit POST-Funktionen umschalten konnte. An diesem Punkt war ich bereit, alles zu integrieren.
Um den endgültigen Code lesbarer und skalierbarer zu machen, verwendete ich Klassen in meinem Code. Objektorientierter Code ist in der Softwarewelt nichts Neues, wird aber in eingebetteten Systemen oft übersehen. Beim Schreiben von Webdiensten, insbesondere solchen, die verschiedene Hardwarekomponenten steuern, ist es wichtig, Ihren Code schön zu abstrahieren, sodass der detaillierte Hardwarecode außerhalb der Hauptanwendung liegt. In meinem Fall werden Sie in main.py bemerken, dass es sehr wenig Code gibt, der sich auf das Netzteil bezieht, außer dem Aufrufen spezifischer Funktionen wie das Einstellen oder Lesen von Strom/Spannung (im Gegensatz zur Handhabung des eigentlichen UART-Befehls innerhalb von main.py). Dies ermöglicht eine klarere Sicht darauf, was auf der Ebene der Webanwendung passiert, und abstrahiert die Details dessen, was auf der Ebene der Gerätekommunikation vor sich geht.
In main.py erstelle ich zwei verschiedene Arten von Endpunkten, um mein Netzteil zu steuern. Ein Typ verwendet eine POST-Methode, die typischerweise innerhalb der REST-API verwendet wird, um Felder auf einem Backend zum Server zu aktualisieren (z.B. das Einfügen einer Zeile einer Datenbank). Ich hätte leicht eine PUT-Methode verwenden können, da es nur ein einzelner Wert war, den ich bearbeitete, aber aus keinem wirklichen guten Grund blieb ich bei POST. Es liegt wirklich an Ihnen, welche Art von Methode Sie in diesem spezifischen Szenario implementieren möchten.
Ich habe auch eine Route namens „controller“ erstellt, die ein sehr einfaches Einreichungsformular ausspuckt, in dem ein Benutzer die Spannung/Stromstärke einstellen und auf „submit“ klicken kann, was wiederum eine POST-Aktion auslöst und den Webservice dazu veranlasst, die Spannungs-/Stromeinstellungen am Netzteil zu aktualisieren. Hier kommt der IoT-, smartphonefähige Aspekt ins Spiel. Eine POST-Methode von Ihrem Smartphone oder einem herkömmlichen Browser aus durchzuführen, ist nicht sehr einfach. Sie könnten eine GET-Methode ausgeben, aber Sie würden auch mit einer langen URL-Zeichenfolge enden. Eine sehr einfache Möglichkeit, den „Smartphone-Aspekt“ Ihres Projekts zu erreichen, besteht darin, ein grundlegendes Webformular einzufügen, auf das jeder von jedem Gerät aus zugreifen kann. Sobald Sie ein grundlegendes Webformular in Ihrer Webanwendung unterstützen (und den eingehenden Verkehr ordnungsgemäß durch die Firewall Ihres Routers leiten), haben Sie im Grunde genommen demonstriert, dass Ihr Code „IoT-fähig“ ist.
Abbildung 5:
Einige andere Gesundheitsüberwachungs-/Debug-Funktionen, die ich in dieses Projekt eingeführt habe, umfassen:
Abbildung 6:
Diese kleinen Extras helfen wirklich dabei, ein Hobbyprojekt in etwas Reiferes zu verwandeln, das diagnostiziert werden kann, wenn Probleme auftreten.
Zu diesem Zeitpunkt hatte ich erfolgreich alle Teile zusammengefügt und besaß nun ein altes Netzteil mit modernster Technik. „Zu welchem Zweck würde dieses super retro Netzteil dienen?“, fragte ich mich. Nun, diesen Teil versuche ich immer noch herauszufinden.
Um das vollständige Code-Repository zu besuchen, besuchen Sie https://gitlab.com/embedded-designs/rest-api-controlled-power-supply-using-micropython.