Inhaltsverzeichnis:
- Schritt 1: Benötigte Materialien
- Schritt 2: Einrichtung der Umgebung
- Schritt 3: Designübersicht
- Schritt 4: Erstellen benutzerdefinierter Patches aus der XOD Core Library
- Schritt 5: Erstellen von benutzerdefinierten Patches mit C++
- Schritt 6: Konstruktion
- Schritt 7: Testen, Teil 1
- Schritt 8: Testen, Teil 2
- Schritt 9: Anhang zur Fuzzy-Logik
Video: XOD-betriebene wiederaufladbare Solarlampe - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:21
In den meisten Haushaltswaren- und Baumärkten sind kostengünstige Solar-Garten- / Gehweglampen erhältlich. Aber wie das alte Sprichwort sagt, bekommt man normalerweise das, wofür man bezahlt. Die üblichen Lade- und Beleuchtungsschaltungen, die sie verwenden, sind einfach und billig, aber die Lichtleistung, die Sie erhalten, ist alles andere als beeindruckend (und kaum genug für jemanden, der Ihren Gehweg benutzt, um zu sehen, wohin er geht!)
Dies ist mein Versuch, ein netzunabhängiges Beleuchtungsmodul zu entwickeln, das eine erhebliche Verbesserung darstellt und dennoch relativ kostengünstig herzustellen ist. Indem Sie ihm ein paar "Gehirne" geben. XOD.io ist eine neue IDE, die mit der Embedded-Entwicklungsplattform Arduino kompatibel ist, auf der Sie Code grafisch "schreiben" können. Die Umgebung überträgt Ihre grafische Skizze in modernes C++, das bemerkenswert effizient bei der Generierung von kompaktem Code ist, und generiert Quellen, die vollständig mit der Arduino-IDE kompatibel sind, ohne dass weitere externe Abhängigkeiten erforderlich sind. So können auch kleine, kostengünstige Mikrocontroller mit begrenzten Programm- und Datenspeicherressourcen zur Übernahme komplexer Aufgaben eingesetzt werden.
Dieses Projekt zeigt, wie zwei Arduino-kompatible ATTiny85-Mikrocontroller verwendet werden können, die zusammenarbeiten, um den Strombedarf der Lampe zu verwalten. Der erste Prozessor verarbeitet Umgebungsdaten von der externen Hardware, und der zweite versucht, tagsüber so viel Energie wie möglich aus der Sonne zu gewinnen, und steuert dann die Beleuchtung einer Hochleistungs-LED, wenn sich ein Akku nachts entlädt. Der zweite Prozessor verrichtet seine Aufgabe über eine kompakte Implementierung einer „Fuzzy-Logic“-Steuerung. Die Software für beide Chips wurde ausschließlich im XOD-Umfeld entwickelt.
Schritt 1: Benötigte Materialien
Arduino IDE, neueste Version, mit installierter ATTinyCore-Erweiterung über den "Boards"-Manager
Sparkfun USBTinyISP ATTiny Programmer, 11801 oder gleichwertig Sparkfun Produktseite
Pololu einstellbarer Niederspannungs-Aufwärtswandler mit Abschalteingang, U1V11A oder gleichwertige Pololu-Produktseite
Weiße Hochleistungs-LED oder RGB-LED mit Kühlkörper, gemeinsamer Anode, Adafruit 2524 oder gleichwertiger Adafruit-Produktseite
Microchip ATTiny85 im 8-Pin-DIP-Gehäuse, 2 Mouser-Produktseite
8-polige DIP-IC-Buchsen, 2
Massenspeicherkondensator, 16 V 220 uF
Ausgangskondensator, 6,3V 47uF
Strombegrenzungswiderstände, 50 Ohm 1/4 Watt
i2c Pullup-Widerstände, 4.7k, 2
Panel Voltage Sense Teiler-Widerstände, 1/4 Watt, 100k, 470k
Strommesswiderstand, 10 Ohm 1⁄2 Watt 1% Toleranz
Bypass-Kondensatoren, 0,1uF Keramik, 2
2 3,7 V 100 mAh Lithium-Ionen-Akku, PKCELL LP401 oder gleichwertig
Fassstecker-Eingangsbuchse für Panel, 1
Mini-Klemmenblöcke 3”x3” Lötpad-Platine und dünner Vollkerndraht zum Herstellen von Verbindungen
Zum Testen werden mit ziemlicher Sicherheit ein Oszilloskop, ein Multimeter und ein Tischnetzteil benötigt
Schritt 2: Einrichtung der Umgebung
Die XOD-Umgebung unterstützt die ATTiny-Prozessorserie nicht von Haus aus, aber mit ein paar Bibliotheken von Drittanbietern aus dem Arduino-Universum ist es einfach, Unterstützung für diese Serie von AVRs hinzuzufügen. Der erste Schritt besteht darin, die Bibliothek „ATTinyCore“aus dem Dropdown-Menü „Tools → Board → Board Manager“der Arduino IDE zu installieren. Stellen Sie sicher, dass die Einstellungen wie im beigefügten Bild gezeigt korrekt sind - denken Sie daran, dass Sie auf "Burn bootloader" klicken müssen, um die Sicherungen für die Brownout-Spannung und die Taktgeschwindigkeit zu ändern, bevor Sie einen Code hochladen!
Der Quellcode für diese Bibliothek ist verfügbar unter:
Eine weitere hilfreiche Bibliothek aus dem Repository ist „FixedPoints“, eine Implementierung von Festkomma-Mathematik zur Kompilierzeit für Arduino-unterstützte Prozessoren. Der ATTiny hat begrenzten SRAM- und Programmspeicher, und es hilft sehr beim Verkleinern der endgültigen Skizzengröße, eine 2-Byte-Ganzzahl für die allgemeine Datenspeicherung anstelle eines Gleitkommatyps zu verwenden, der 4 Byte auf dem AVR erfordert. Die Ausführungsgeschwindigkeit sollte ebenfalls verbessert werden, da der ATTiny keine Hardware-Multiplikationseinheit hat, geschweige denn Hardware-Gleitkomma!
Quellcode ist verfügbar unter:
Das Tutorial zum Erstellen, Transpilieren und Bereitstellen von grafischen XOD-Skizzen unter: https://github.com/Pharap/FixedPointsArduino wird Ihnen helfen zu verstehen, wie die enthaltenen Quelldateien erstellt wurden.
Schritt 3: Designübersicht
Auf der Platine sind zwei ATTiny85-Prozessoren über eine i2c-Schnittstelle verbunden und werden verwendet, um die Spannung des Solarpanels, den Strom, der vom Aufwärtswandler in die Batterie fließt, während das Panel beleuchtet ist, die Batteriespannung und die Batterie zu erfassen Temperatur.
Der Aufwärtswandler ist ein Standardmodul, das auf einem TPS6120-IC von Texas Instruments basiert, das eine Eingangsspannung von nur 0,5 Volt aufnehmen und auf 2 bis 5 Volt anheben kann. Der Sensorkern umfasst mehrere Funktionsblöcke. Die Hauptuhr beginnt zu laufen, sobald der Aufwärtswandler vom Solarpanel-Eingang mit Strom versorgt wird. Dadurch wird die Ausführung der Skizze gestartet und als erstes muss festgestellt werden, ob das Panel ausreichend beleuchtet ist, um den Akku mit Ladestrom zu versorgen.
Die Spannung des Solarpanels wird durch zwei digitale Filter geleitet, und wenn sie über einem bestimmten Schwellenwert liegt, bestimmt das System, dass das Panel beleuchtet ist, und leitet die Master-Clock in den Current-Sense-Monitor. Dies ist ein differenziell konfigurierter Analog-Digital-Wandlerkanal des Chips, der die Spannung über einen 10 Ohm 1% Toleranzwiderstand erfasst, der in Reihe zwischen dem Ausgang des Aufwärtswandlers und dem Batterieeingang geschaltet ist. Wenn das Panel nicht beleuchtet ist, sendet dieses ATTiny ein Signal an das zweite ATTiny, das ihn anweist, die LED-Leistung zu überwachen, anstatt den Strom aufzuladen, und den Aufwärtswandler auszuschalten und den Eingang zu isolieren, damit die Batterie keinen Strom zurück durch das Panel sendet.
Der zweite ATTiny-Kern ist der Ort, an dem der LED-Controller und das Batterieladeüberwachungssystem ausgeführt werden. Daten zu Panelspannung, Batteriespannung und Batterieladestrom werden an diesen Kern gesendet, um sie über ein Fuzzy-Logik-Netzwerk zu verarbeiten, das versucht, ein geeignetes PWM-Signal zu erzeugen, das an den SHTDN-Pin angelegt wird, wodurch die an die Batterie gesendete Strommenge gesteuert wird zum Aufladen im beleuchteten Zustand – eine Grundform des Maximum Power Point Tracking (MPPT). Außerdem erhält er ein Signal vom Sensorkern, der ihm sagt, ob er die LED je nach Tages-/Tagesleistung des Sensorkerns ein- oder ausschalten soll. Nacht Flip-Flop.
Wenn die LED nachts aktiv ist, überwacht dieser ATTiny die von seinem Kumpel an ihn gesendeten Batteriespannungsdaten und seinen eigenen Temperatursensor auf dem Chip, um eine grobe Schätzung zu erhalten, wie viel Strom in die LED gesteckt wird (die Batteriespannung sinkt). und die Chiptemperatur steigt mit dem Strom, der aus seinen Pins gezogen wird.) Das mit dem LED-PWM-Patch verbundene Fuzzy-Logik-Netzwerk versucht zu beurteilen, wie viel Batterieleistung noch verfügbar ist, und verringert die LED-Intensität, wenn die Batterie erschöpft ist.
Schritt 4: Erstellen benutzerdefinierter Patches aus der XOD Core Library
Für dieses Design wurden mehrere benutzerdefinierte Patch-Knoten verwendet, von denen einige leicht vollständig aus enthaltenen XOD-Knoten erstellt werden können und einige in C++ implementiert wurden.
Der erste der beiden benutzerdefinierten Patch-Knoten in den Bildern ist eine Implementierung eines exponentiellen Moving-Average-Filters. Dies ist ein digitaler Low-Overhead-Tiefpassfilter, der in der Skizze in Reihe verwendet wird, um einmal die eingehende Solarpanelspannung für den Logikkern zu filtern und einmal den Trigger zu speisen, der die langfristige Umgebungsbeleuchtung bestimmt. Siehe Wikipedia-Eintrag zur exponentiellen Glättung.
Die Knotenstruktur im Bild ist nur eine direkte grafische Darstellung der Übertragungsfunktion im Artikel, die über Links von den entsprechenden Eingängen zu den Ausgängen miteinander verbunden ist. Es gibt einen Defer-Knoten aus der Bibliothek, mit dem eine Feedback-Schleife erstellt werden kann (XOD warnt Sie, wenn Sie eine Feedback-Schleife erstellen, ohne eine Verzögerung in die Schleife einzufügen, wie im XOD-Ausführungsmodell beschrieben.) Patch funktioniert gut, das ist ganz einfach.
Der zweite benutzerdefinierte Patch-Knoten ist eine Variation des in XOD enthaltenen Standard-Flip-Flops, der mit der gefilterten Panelspannung gespeist wird. Es verriegelt hoch oder niedrig, je nachdem, ob das Eingangssignal über oder unter einem bestimmten Schwellenwert liegt. Cast-Knoten werden verwendet, um boolesche Ausgangswerte in den Impulsdatentyp umzuwandeln, um das Flip-Flop zu triggern, wenn der Zustand von niedrig nach hoch übergeht. Das Design dieses Patch-Knotens sollte aus dem Screenshot hoffentlich einigermaßen selbsterklärend sein.
Schritt 5: Erstellen von benutzerdefinierten Patches mit C++
Für spezielle Anforderungen, bei denen die benötigte Node-Funktionalität zu komplex wäre, um sie einfach grafisch darzustellen, oder die auf Arduino-Bibliotheken angewiesen sind, die nicht in der Arduino-Standardumgebung enthalten sind, macht es XOD für diejenigen mit C/C++-Kenntnissen einfach, mundgerechte Stücke von zu schreiben Code, der dann genauso in einen Patch integriert werden kann wie jeder andere vom Benutzer erstellte oder Stock Node. Wenn Sie im Dateimenü "Neuen Patch erstellen" auswählen, wird ein leeres Blatt erstellt, mit dem Sie arbeiten können, und Eingabe- und Ausgabeknoten können aus dem Abschnitt "Knoten" der Kernbibliothek gezogen werden. Dann kann der "not-implemented-in-xod"-Knoten hineingezogen werden, und wenn er angeklickt wird, wird ein Texteditor geöffnet, in dem die erforderliche Funktionalität in C++ implementiert werden kann. Hier erfahren Sie, wie Sie mit dem internen Status umgehen und auf die Eingabe- und Ausgabeports von C++-Code aus zugreifen.
Als Beispiel für die Implementierung benutzerdefinierter Patches in C++ werden zwei weitere benutzerdefinierte Patches für den Treiberkern verwendet, um eine Schätzung der Versorgungsspannung und der Kerntemperatur des Treiberkerns zu erstellen. Zusammen mit seinem Fuzzy-Netzwerk ermöglicht dies eine grobe Schätzung der verbleibenden Batterieleistung, die zur Verfügung steht, um die LEDs bei Dunkelheit mit Strom zu versorgen.
Das Temperatursensor-Patch wird auch mit dem Ausgang des Versorgungsspannungssensors gespeist, um eine bessere Schätzung zu erhalten – die Messung der Kerntemperatur ermöglicht es uns, eine grobe Schätzung darüber zu erhalten, wie viel Strom in den LEDs verbrannt wird, und kombiniert mit der Versorgungsspannungsanzeige, wenn beim Entladen des Akkus eine weitere grobe Schätzung der verbleibenden Akkuleistung. Es muss nicht supergenau sein; Wenn der Kern „weiß“, dass die LEDs viel Strom verbrauchen, aber die Batteriespannung schnell abfällt, kann man mit Sicherheit sagen, dass die Batterieleistung nicht mehr lange hält und es an der Zeit ist, die Lampe auszuschalten.
Schritt 6: Konstruktion
Ich baute das Projekt auf einem kleinen Stück Prototyping-Platine mit Kupferpads für Durchgangslochteile. Die Verwendung von Sockeln für die ICs hilft sehr beim Programmieren/Ändern/Testen; Der USBTiny ISP von Sparkfun hat einen ähnlichen Sockel auf seiner Platine, so dass die Programmierung der beiden Chips nur darin besteht, den Programmierer an einen PC-USB-Port anzuschließen, den transpilierten XOD-Code aus den mitgelieferten Arduino.ino-Dateien mit den entsprechenden Board- und Programmiereinstellungen hochzuladen und Entfernen Sie dann vorsichtig die Chips aus dem Programmiersockel und stecken Sie sie in die Protoboard-Sockel.
Das auf Pololu TPS6120 basierende Aufwärtswandlermodul wird auf einem Riser-Board geliefert, das auf Stiftleisten in das Protoboard eingelötet ist, so dass es möglich ist, Platz zu sparen, indem einige Komponenten darunter montiert werden. Bei meinem Prototyp habe ich die beiden 4,7k-Pullup-Widerstände darunter gelegt. Diese werden benötigt, damit der i2c-Bus zwischen den Chips korrekt funktioniert - ohne sie funktioniert die Kommunikation nicht richtig! Auf der rechten Seite der Platine befindet sich die Eingangsbuchse für den Stecker des Solarpanels und den Eingangsspeicherkondensator. Es ist am besten zu versuchen, die Buchse und diese Kappe direkt über "Lötfäden" und nicht über Anschlussdraht miteinander zu verbinden, um einen möglichst niederohmigen Pfad zu erhalten. Anschließend wird der positive Anschluss des Speicherkondensators direkt mit dem Eingangsspannungsanschluss des Boost-Moduls und der Massestift des Boost-Moduls direkt mit dem Massestift der Buchse verbunden.
Rechts und links von den Buchsen für die beiden ATTinys befinden sich 0.1uF Despike/Deglitching-Kondensatoren. Diese Komponenten dürfen auch nicht weggelassen werden und sollten so kurz und direkt wie möglich mit den Strom- und Massepins des ICs verbunden werden. Der 10-Ohm-Strommesswiderstand befindet sich auf der linken Seite, er ist mit dem Ausgang des Aufwärtswandlers verbunden und jede Seite ist mit einem Sensorkern-Eingangspin verbunden - diese Pins sind so eingerichtet, dass sie als Differenz-ADC arbeiten, um indirekt den. zu messen Strom in die Batterie. Verbindungen zwischen IC-Pins für den i2c-Bus und zum Shutdown-Pin des Aufwärtswandlers usw. können mit einem Anschlussdraht an der Unterseite des Protoboards hergestellt werden, sehr dünner Vollkern-Anschlussdraht eignet sich dafür hervorragend. Es erleichtert das Wechseln und sieht auch viel ordentlicher aus als Jumper zwischen den Löchern auf der Oberseite zu laufen.
Das LED-Modul, das ich verwendet habe, war eine dreifarbige RGB-Einheit. Mein Plan war es, alle drei LEDs aktiv zu haben, um Weiß zu erzeugen, wenn der Akku fast vollständig aufgeladen war, und die blaue LED langsam in Gelb zu verblassen, wenn die Ladung aufgebraucht war. Aber diese Funktion muss noch implementiert werden. Eine einzelne weiße LED mit einem Strombegrenzungswiderstand funktioniert auch in Ordnung.
Schritt 7: Testen, Teil 1
Nachdem beide ATTiny-ICs mit den mitgelieferten Sketch-Dateien über den USB-Programmierer aus der Arduino-Umgebung programmiert wurden, hilft es zu testen, ob die beiden Kerne des Prototyps ordnungsgemäß funktionieren, bevor versucht wird, den Akku vom Solarpanel zu laden. Idealerweise erfordert dies ein einfaches Oszilloskop, Multimeter und ein Tischnetzteil.
Das erste, was Sie überprüfen müssen, ist, dass keine Kurzschlüsse auf der Platine vorhanden sind, bevor Sie die ICs, die Batterie und das Panel in ihre Sockel stecken, um mögliche Schäden zu vermeiden! Der einfachste Weg, dies zu tun, besteht darin, ein Tischnetzteil zu verwenden, das seinen Ausgangsstrom in diesem Fall auf einen sicheren Wert begrenzen kann. Ich habe mein Bankversorgungsset auf 3 Volt und 100 mA-Grenze verwendet, das an die Eingangsbuchsen des Solarpanels an die positiven und negativen Stromversorgungsleitungen angeschlossen ist. Mit nichts anderem als den verbauten passiven Komponenten sollte im Strommonitor des Netzteils im Wesentlichen keine Stromaufnahme registriert werden. Wenn ein erheblicher Stromfluss vorhanden ist oder die Stromversorgung in die Strombegrenzung übergeht, ist etwas schief gelaufen und die Platine sollte überprüft werden, um sicherzustellen, dass keine falsch verdrahteten Verbindungen oder Kondensatoren mit umgekehrter Polarität vorhanden sind.
Der nächste Schritt besteht darin, sicherzustellen, dass der Aufwärtswandler richtig funktioniert. Auf der Platine befindet sich ein Schraubpotentiometer, bei noch angeschlossener Stromversorgung und entsprechend angeschlossenen vier Pins des Wandlers sollte das Potentiometer mit einer kleinen Schraubendreherspitze gedreht werden, bis die Spannung am Ausgangsanschluss des Moduls etwa 3,8 bis 3,9 Volt beträgt. Dieser DC-Wert ändert sich während des Betriebs nicht, der Treiberkern steuert die durchschnittliche Ausgangsspannung über das Pulsen des Shutdown-Pins des Moduls.
Schritt 8: Testen, Teil 2
Als nächstes ist zu überprüfen, ob die i2c-Kommunikation in Ordnung ist. Wenn die Platine ohne Bankstrom läuft, kann der Sensorkern-IC installiert werden. Auf einem Oszilloskop sollten sowohl an Pin 5 als auch an Pin 7 des physischen Chips pulsierende Signale anliegen, dieser i2c-Treiber auf dem Chip versucht, Daten an seinen Kumpel zu senden. Nach dem Herunterfahren kann der Treiberkern installiert und die Verbindung erneut mit einem Oszilloskop überprüft werden, auf beiden Leitungen sollte eine größere Impulsfolge sichtbar sein. Dies bedeutet, dass die Chips korrekt kommunizieren.
Es hilft, den Akku für den abschließenden Volltest leicht aufgeladen zu haben. Dazu kann auch das Tischnetzteil verwendet werden, wobei die Strombegrenzung auf ca. 50 mA und die Spannung noch auf 3,8 Volt eingestellt ist und der LiPo-Akku für einige Minuten direkt angeschlossen bleibt.
Der letzte Schritt besteht darin, das gesamte System zu testen - wenn alles angeschlossen ist, wenn das Panel für zehn oder 15 Sekunden bedeckt ist, sollte das Licht aufgehen, wenn es über den PWM-Ausgang des Treiberkerns angesteuert wird. Wenn das Panel in hellem Sonnenlicht steht, sollte die Batterie über den Ausgang des Aufwärtswandlers geladen werden. Das Fuzzy-Logik-Netzwerk kann indirekt überprüft werden, um zu sehen, ob es richtig funktioniert, indem man sich die PWM-Leitung ansieht, die den Shutdown-Pin des Aufwärtswandlers ansteuert; Wenn die Beleuchtung bei niedrigem Ladezustand der Batterie zunimmt, sollte die Pulsbreite zunehmen, was zeigt, dass der Treiberkern signalisiert, dass mehr Leistung in die Batterie geleitet werden sollte, wenn mehr Leistung aus Sonnenlicht verfügbar wird!
Schritt 9: Anhang zur Fuzzy-Logik
Fuzzy-Logik ist eine Technik des maschinellen Lernens, die bei der Steuerung von Hardwaresystemen verwendet werden kann, bei denen viele Parameter des zu steuernden Systems unsicher sind, was eine explizite Eingabe- und Ausgabesteuerungslösung für das Ziel mathematisch schwer aufzuschreiben macht. Dies wird erreicht, indem logische Werte verwendet werden, die irgendwo zwischen 0 (falsch) und 1 (wahr) liegen, die Unsicherheit in einem Wert ausdrücken, der eher dem eines Menschen entspricht („überwiegend wahr“oder „nicht wirklich wahr“) und eine Grauzone zulässt zwischen Aussagen, die zu 100 % wahr und zu 100 % falsch sind. Dies wird erreicht, indem zunächst Stichproben der Eingangsvariablen genommen werden, auf denen eine Entscheidung basieren muss, und diese „fuzzifizieren“.
Das Herzstück eines jeden Fuzzy-Logik-Systems ist ein „fuzzy assoziatives Gedächtnis“. Dies erinnert an eine Matrix, in der im Fall der Batterieladeschaltung ein 3x3-Satz von Werten zwischen 0 und 1 gespeichert wird. Die Werte in der Matrix können grob damit in Verbindung gebracht werden, wie ein Mensch darüber nachdenken würde, wie der PWM-Faktor, der den SHTDN-Pin des Aufwärtswandlers steuert, sein sollte, je nachdem, wie die obige Zugehörigkeitsfunktion einen bestimmten Satz von Eingängen qualifiziert. Wenn beispielsweise die Eingangsspannung des Panels hoch ist, aber der in die Batterie gezogene Strom niedrig ist, bedeutet dies wahrscheinlich, dass mehr Strom entnommen werden kann und die PWM-Einstellung nicht optimal ist und erhöht werden sollte. Umgekehrt, wenn die Panelspannung niedrig wird, das Ladegerät jedoch immer noch versucht, einen großen Strom in die Batterie zu leiten, wird ebenfalls Energie verschwendet. Daher ist es am besten, das PWM-Signal zum Aufwärtswandler zu verringern. Sobald die Eingangssignale zu einer Fuzzy-Menge „fuzzifiziert“sind, werden sie mit diesen Werten multipliziert, ähnlich wie ein Vektor mit einer Matrix multipliziert wird, um eine transformierte Menge zu erzeugen, die repräsentativ dafür ist, wie stark das „Wissen“in der Zelle enthalten ist der Matrix sollte in die endgültige Kombinationsfunktion einfließen.
Verwenden des "not-implemented-in-xod" -Knotens, der XOD-Knoten ermöglicht, die benutzerdefinierte Funktionen implementieren, die zu kompliziert sind, um aus den Standardbausteinen vernünftig zu machen, und ein wenig C++ im Arduino-Stil, den assoziativen Speicher, die Gewichtungsfunktion und " Fuzzifier" ähnlich den in dieser Referenz beschriebenen Blöcken: https://www.drdobbs.com/cpp/fuzzy-logic-in-c/184408940 sind einfach zu erstellen und viel einfacher zu experimentieren.