Vorstellung und erste Fragen zur Selbstabschaltung (Transistorschaltung)

eben. oder halt falsch gezeichnet. aber bis dato kenne ich das konkrete Problem immer noch nicht.

ElEspanol: Das ist doch nur für ein Spielzeugauto.

Das ist doch kein Problem, oder? Für kleine Dinge verwende ich den IRLML6402

ElEspanol: eben. oder halt falsch gezeichnet. aber bis dato kenne ich das konkrete Problem immer noch nicht.

Hat er doch beschrieben. Allerdings in zwei Steps.

Hallo,

ich verweise mal kurzerhand auf den AVR Transistortester. http://www.mikrocontroller.net/articles/AVR-Transistortester#Hardware

Hier sieht man genau für das Problem die Beschaltung und weiter unten die Beschreibung dafür. Per Taster ein und nach einer gewissen Zeit schaltet er sich selbst ab. Den 5V Spannungsregler brauchste ja nicht. Bleibt außen vor. Gehst von Batterie über den PNP zu VIN. Der Spannungsregler sitzt ja auf dem Arduino der dann den Rest macht.

Du kannst mit nur einem Transistor keine vernünftige Spannungsabschaltung machen.
Du brauchst einen PNP, der die Batterie schaltet, und einen zweiten (NPN) mit Massebezug, der die Logik übernimmt.

Hier der Schaltplan:
Ubatt-Schalter_mit_Selbsthaltung.jpg

Wenn der Taster gedrückt wird, wird Q2 bestromt, der dann Q1 durchsteuert, worauf VIN auf 9V steigt.
VIN wiederum hält nun über R4 Q2 leitend, der Taster kann wieder losgelassen werden. D7 bleibt auf INPUT.
Zum Abschalten wird D7 als OUTPUT deklariert und auf LOW gesetzt.

Und hier noch als Steckbrett, falls dir das Schaltplanlesen schwer fällt. Aber gewöhne dich an Schaltpläne, die sich besser zu lesen.
Ubatt-Schalter_mit_Selbsthaltung_Steckbrett.jpg

Für mich ist Aus, wenn es klack macht, daher würde ich ein Subminiatur- oder Reedrelais mit Selbsthaltung per Sketch wählen. Bei einem Relais mit Diode kann die eingezeichnete entfallen. Schaltung:
Selbsthaltung.png

Mein bisher kleinster Sketch hier im Forum:

#define selbsthaltungPin     7    // 
const unsigned long abschaltzeit = 60000UL;

void setup() {
  pinMode(selbsthaltungPin, OUTPUT);
  digitalWrite(selbsthaltungPin, HIGH);
}

void loop() {
  if (millis() > abschaltzeit) {
    digitalWrite(selbsthaltungPin, LOW);
  }
}

@ Alle: Danke schon mal für die vielen Hinweise und den vielen Hirnschmalz, den ihr für mich verwendet! @ guntherb: Das kommt meiner Idealvorstellung sehr nahe und ich habe vor allen Dingen alle Bauteile dafür hier. Danke für den Schaltplan (noch etwas fremd, aber ich kann ihn lesen), die gute Erklärung und die Skizze! @ agmue: Auch ein interessanter Plan, scheitert gegenwärtig noch am Reedrelais. Das wird bei der nächsten Bestellung mitgeordert und die Schaltung ausprobiert. Danke hierfür!

Leider habe ich schon wieder eine Frage. Gunter schreibt: "D7 bleibt auf INPUT. Zum Abschalten wird D7 als OUTPUT deklariert und auf LOW gesetzt."

Ich kann den Pin im Setup deklarieren --> pinMode (Pin7, INPUT); Wie kann ich den Pin innerhalb des Sketches umdeklarieren? Habe ich einen Knoten im Kopf, oder ist das einfach nur mehr als ich nach meinem Einsteiger-Tutorial weiß? Viele Grüße, Thomas

pinMode() ist eine ganz normale Funktion. Die kannst du nicht nur in setup() aufrufen

Serenifly: pinMode() ist eine ganz normale Funktion. Die kannst du nicht nur in setup() aufrufen

Genau. Du kannst einen Pin auch im Sketch deklarieren, sogar mehrfach umdeklarieren. Du könntest ihn also im Setup auf INPUT setzen, und dann im Sketch, da wo der Arduino abgeschaltet werden soll, auf OUTPUT und dann auf LOW setzen. Dann sollte der Arduino aus sein.

Falls das nicht funktionieren sollte, könnte ein Widerstand von ca. 1,5k von der Basis Q2 nach Masse helfen.

Oh man, so langsam verzweifle ich und denke ich hätte doch den blöden kippschalter einbauen. Aber jetzt habe ich (und ihr) schon viel Zeit auf die Schaltung verwendet. Ich habe die Schaltung von Gunther nachgebaut. Lese ich die Pläne richtig, dass der NPN im schaltplan andersrum als in der Skizze eingebaut ist? Ich habe auf jeden Fall beide Möflichkeiten durchgespielt. Leider nur mit mäßigem Erfolg. Schließe ich den Schalter startet der Arduino. Er geht jedoch nicht wieder aus und der Sound ist nur ein Knacken ca. im Sekundentakt. Ich überlege jetzt, ob die Software nicht zur Hardware passt. Aufbaufehler kann ich nicht ausschließen, aber sicherheitshalber habe ich sie drei Mal aufgebaut.
Ich füge noch einmal das aktuelle Programm an (hoffentlich direkt im richtigen Format). Findet jemand Ungerimtheiten?

/*
  Blink
  Wechselblinker (je 3x). Dauerschleife.
  Ton wechselt nachdem beide LEDs durchgelaufen sind.
 
  Ach ja, laüft mit Taster
 
 */
 
int led1 = 8;
int led2 = 9;
int speaker = 10;
int transe = 7;
int hiNote = 659;
int lowNote = 440;
int ledDelay = 60;
int tone_number = 0;
int loop_number = 0;
int zaehler;


void setup() {                
  // initialize the digital pin as an output.
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);        
  pinMode(speaker, OUTPUT);    
  pinMode (transe, INPUT);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite (speaker, LOW);
  digitalWrite(transe, LOW);
}


void loop() {
for(zaehler = 1; zaehler<10; zaehler++)

{
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);
digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);
digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led2, HIGH);
delay(ledDelay);

digitalWrite(led2, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);
delay(ledDelay);
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);
delay(ledDelay);
digitalWrite(led1, LOW);
delay(ledDelay);
digitalWrite(led1, HIGH);

if (loop_number >= 1){
    loop_number = 0;
    changeTone();  
    }
  loop_number++;
}
  }

void changeTone()
{
  tone_number = !tone_number;
   if (tone_number) {
    tone(speaker, lowNote, 1000);
    } else {
    tone(speaker, hiNote, 1000);
  }
pinMode (transe, OUTPUT);
digitalWrite(transe, LOW); 
}

Edit sagt erst beim zweiten Versuch :slight_smile:

Ach ja, grundsätzlich läuft die schaltung bei mir ohne den zusätzlichen Widerstand und mit 2K Ohm. Bei 1K Ohm hatte ich probleme, dass nur eine LED flackert. 1,5K habe ich gerade nicht da.

pinMode (transe, INPUT);
digitalWrite(transe, LOW);

Einen Eingang mit LOW zu beschreiben, ist keine gute Idee.

pinMode (transe, OUTPUT);
digitalWrite(transe, LOW);

steht in changeTone(). Wo ist da die Zeit bis zum Abschalten definiert? Du darfst bei mir spicken :)

Kompliment an Gunther: Deine Schaltung hat eine Selbsthaltung ohne Mithilfe des Arduino, weshalb die Wartezeit bis Ende Bootloader entfällt. Den Zustand hochohmig zu nutzen und mit LOW nur Auszuschalten, ist eine tolle Idee! 8)

Danke noch mal agmue und guntherb. Leider ist mir im Moment wohl noch nicht so richtig zu helfen. Ich habe heute meine gesamte Freizeit in dieses (vermeintliche Mini-)Projekt gesteckt und viel Hilfe bekommen. Aber ich habe eher meine Grenzen aufgezeigt bekommen. Schön zu wissen, dass hier schnelle Hilfe zu erwarten ist, aber ich sollte vielleicht mein Wissen zuerst erweitern. Ich probiere gegenwärtig viel rum, da sich mir viele Zusammenhänge nur teilweise erschließen und ich viele Befehle nicht kenne. Vielleicht lege ich die Selbstabschaltung vorerst zur Seite… Die Schaltpläne haben mir auf jden Fall neue Erkenntnisse beschert.
Wenn ich bei dem Projekt weiter bin, bzw. weiter mache melde ich mich auf jeden Fall!
Glück Auf,
Thomas

Mach doch zunächst nur die Selbstabschaltung mit einem einfachen Sketch. Wenns dann läuft, kombinierst du beide Sketche.

Gute Idee, für heute reicht es mir aber erstmal... Weitermachen ist vielleich gut, der besagte Kippschalter würde mich jetzt auch jedes mal nerven wenn ich ihn sehe.

Morgen unter der Dusche kommt Dir die richtige Inspiration. Bis dahin gute Nacht :sleeping:

Es ist immer gut, komplexere Projekte in kleine Teilaufgaben zu splitten, und wenn alle Teile einzeln laufen, alles kombinieren. Spart auch unheimlich Zeit ein, wenn nicht jedes Mal das ganze Projekt kompiliert und hochgeladen werden muss, nur weil ich eine Zeile zum Testen geändert habe.

So kannst du auch Schritt für Schritt die delays rausprogrammieren.

agmue: Kompliment an Gunther: Deine Schaltung hat eine Selbsthaltung ohne Mithilfe des Arduino, weshalb die Wartezeit bis Ende Bootloader entfällt. Den Zustand hochohmig zu nutzen und mit LOW nur Auszuschalten, ist eine tolle Idee! 8)

Ich habe das Ganze mit einem "nackten" Atmega 328 ohne Bootloader, nur mit gesetzten Fuses in einer Schaltung realisiert. Da stellt sich dieses Problem nicht :P Es langt übrigens ein einziger Startwiderstand, der Taster braucht nur C-E vom pnp Transistor überbrücken. Ich habe dem Taster sogar noch eine 2. Funktion zugewiesen. Kurzer Druck schaltet das Gerät ein, langer Druck beim Einschalten aktiviert die Hintergrundbeleuchtung es Displays. Dazu habe ich empirisch noch einen 4,7 Ohm Widerstand hinter den pnp eingeschleift. Am R sollen ca. 0,1V abfallen. Dann habe ich 2 Analogeingänge geopfert, die vor und hinter dem Widerstand die Spannung einlesen. Brückt der Taster Transistor und Widerstand, dann ist der Spannungsabfall theoretisch Null und die Analogspannungen liegen näher beieinander.

In mein Gehirn muß rein, daß ein Ausgang nicht nur HIGH und LOW, sondern auch hochohmig, also tristate sein kann.

Für ein Spielzeug wohl etwas übertrieben, geht das Schaltungsprinzip auch mit zwei Relais:
Selbsthaltung2.png

Muensterlaender: Lese ich die Pläne richtig, dass der NPN im schaltplan andersrum als in der Skizze eingebaut ist?

Ich bitte vielmals um Entschuldigung, ich hatte tatsächlich in der Steckbrettskizze Transistoren mit dem falschen Pinning verwendet. jetzt sollte es passen.