Arduino per Software ausschalten

Ich habe ein Arduino, das von einer 9-V-Blockbatterie gespeist und durch einen Schalter aktiviert wird. Ich möchte den Schaltkreis so ändern, dass das Arduino beim Ausschalten des Schalters eingeschaltet bleibt, bis bestimmte Aktionen abgeschlossen sind, und dann ausschalten.

Ich möchte jedoch nicht, dass das Arduino schläft, die Stromversorgung sollte getrennt werden. Dies ist wichtig, da ich zusätzliche Komponenten habe, die Strom aus dem 5-V-Pin (ca. 300 mA) ziehen, und ich möchte, dass diese ebenfalls heruntergefahren werden.

Meine erste Idee war, ein Relais parallel zum Schalter zu verwenden. Wenn der Schalter eingeschaltet wird, schaltet das Arduino auch das Relais ein. Wenn der Schalter ausgeschaltet ist, wird das Arduino immer noch über das Relais mit Strom versorgt. Das Arduino erkennt, wenn der Schalter ausgeschaltet ist (der Schalter ist zweipolig, sodass ich seinen Zustand mit einem digitalen Eingangsstift erkennen kann) und schaltet das Relais aus, wenn die verbleibenden Aktionen abgeschlossen sind.

Gibt es einen besseren Weg als die Verwendung eines Relais? Kann ich anstelle des Relais einen Mosfet oder etwas anderes verwenden?

Und vielleicht brauche ich in Zukunft die 9V für zusätzliche Komponenten, die sich auch ausschalten sollten, wenn sich das Arduino zum Herunterfahren entscheidet. Aber wenn das Relais/Mosfet/..? wird zwischen Batterie und Arduino VIN platziert. Ich kann diese einfach zwischen Relais / Mosfet / .. anschließen? und der Arduino. Das sollte also einfach sein.

Bearbeiten: Basierend auf der Antwort von Passanten habe ich mir Folgendes ausgedacht:Geben Sie hier die Bildbeschreibung ein

Der Motor ist nur ein Platzhalter für meine zusätzlichen Komponenten, die Strom aus der Batterie ziehen und auch abgeschaltet werden sollten.

Ein Schaltplan mit Ihrer vorgeschlagenen Idee wäre hilfreich.

Antworten (2)

Ein System, das ich häufig verwende:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

M1 wird normalerweise von R1 AUS gehalten. SW1 zieht das Gate von M1 auf LOW, wenn es gedrückt wird, um M1 einzuschalten. Das versorgt dann den Arduino mit Strom.

Die erste Operation, die der Arduino ausführt, besteht darin, den mit dem Gate von M2 verbundenen GPIO anzusteuern (der ein FET mit "Logikpegel" sein muss, dessen Schwellenwert niedrig genug ist, um direkt mit einem Arduino zu fahren - Sie könnten auch einen NPN-BJT verwenden). Das umgeht dann den Schalter SW1 und hält das System eingeschaltet.

Der Schalter kann dann losgelassen werden und die Stromversorgung bleibt eingeschaltet.

Der Arduino kann dann den GPIO freigeben, indem er ihn entweder auf LOW treibt oder auf INPUT setzt (R3 zieht ihn in diesem Fall herunter) und M2 ausschaltet, wodurch R1 das Gate von M1 hochziehen und ausschalten kann.

Der einzige Nachteil dieser Schaltung bei der Arbeit mit einem Arduino ist, dass Sie den Netzschalter lange genug gedrückt halten müssen, damit der Bootloader die Ausführung beendet (ca. 2 Sekunden), bevor der Strom eingeschaltet bleibt. Es kann von Vorteil sein, dem GPIO, der das Gate von M2 ansteuert, eine LED (und den zugehörigen Strombegrenzungswiderstand) hinzuzufügen, damit Sie eine visuelle Rückmeldung von "Einschalten" erhalten (oder Sie können einen separaten GPIO verwenden, wenn Sie dies wünschen). wissen, wann Sie die Taste lange genug gedrückt haben.

Eine ähnliche Lösung, die das Problem „Warten auf den Bootloader“ löst, finden Sie unter youtube.com/watch?v=9CnTguj_qvY
@ambitiose_sed_ineptum Nicht schlecht - macht es jedoch komplexer zu implementieren (mehr Komponenten), und das 2-Sekunden-Ding wirkt tatsächlich als extremes Entprellen des Knopfes (das Einschalten wird zu einer sehr, sehr bestimmten Aktion, die nicht zufällig sein kann).
Yup, nur ein weiterer Vorschlag, falls das OP es möchte. Sagen wir, würde ein Pull-up-Widerstand (sagen wir 1k) von VIN zum Gate von M2 nicht fast dasselbe bewirken?
Möglich, obwohl ich VIN nicht einmal über 1100 Ω mit einem GPIO verbinden möchte.
Nun, Sie könnten dieses Signal dann stattdessen mit einem npn bjt steuern.
Und dann bist du ungefähr so ​​komplex wie die andere Schaltung ;) Es gibt viele Möglichkeiten, eine Katze zu häuten, einige unordentlicher als andere: P Ich persönlich leide nicht unter dem 2-Sekunden-Ding, da ich keinen Bootloader habe, der wartet so wie das. Denken Sie daran, dass ich mich heutzutage selten für eine vollständige Abschaltlösung entscheide, aber wenn Sie den schrecklich ineffizienten Arduino haben, brauchen Sie wahrscheinlich eine Möglichkeit, die verschwendete Energie der LDO-Raumheizung zu begrenzen.
Danke, das sieht genau so aus, wie ich es brauche. Die 2 Sekunden sind für mich kein Problem. Können Sie erklären, warum Sie einen zweiten FET M2 verwenden? Ich habe meiner Frage eine Schaltung hinzugefügt, die nur eine verwendet, wie Passerby vorgeschlagen hat.
Was wären hier gute Mosfets? Für M2 brauche ich V_GS klein (<2,5 V mit 5 V Logik) und ich möchte, dass R_DS hoch ist, wenn das Mosfet geschlossen ist (also habe ich einen geringen Stromverbrauch, wenn das Gerät ausgeschaltet ist). Für M1 brauche ich nur U_DS > 9V. Ist das korrekt? Gibt es sonst noch etwas zu beachten?
Für M2 interessiert Sie nicht wirklich viel R D S Ö N Und R D S Ö F F wird immer sehr hoch sein. Für M1 Sie wollen R D S Ö N schön und niedrig zu sein, und ICH D hoch genug sein, um mit dem Strom fertig zu werden, den Sie benötigen. Auch sollten Sie auf die Verlustleistung achten ( P = ICH D 2 R D S Ö N ).

Ein High-Side-pnp-Transistor oder p-Kanal-Mosfet mit einem Pull-up-Widerstand an seiner Basis / seinem Gate zwischen dem 5-V-Regler und Ihrer Zubehörschaltung. Wenn Ihr Arduino schlafen geht, stellen Sie den Steuerstift hoch oder den Eingangsmodus ein, um den Transistor auszuschalten. Wenn Sie Strom benötigen, ziehen Sie den Stift nach unten.

Ein Relais ist zu groß und entlädt Ihre 9-V-Batterie sehr schnell.