Motor mit Transistor steuern


  • In deinem Programm steht, dass der Motor 0,1 Sekunden laufen soll und dann schaltest du ihn wieder ab und löscht die Programmierung der GPIOs.
    Er tut genau das, was du programmiert hast... Wenn du mal 0,1 auf 3,0 erhöhst, läuft dein Motor vermutlich 3 Sekunden...
    Das Skript wird mehrfach hintereinander ausgeführt? Von wem oder was? Rufst du es in einer Endlosschleife auf? Das leuchtet mir nicht ein.


    Das ganze wird über SSH gesteuert, solange ein bestimmter Befehl gegeben wird, wird das Skript aufgerufen. Aber wenn ich 0.1 Sekunden Strom habe, dann sofort keinen mehr und sofort wieder Strom, dann sollte der Motor doch trotzdem laufen, oder? Das ist erforderlich, weil ich nicht steuern kann, wenn der Motor 10 Sekunden lang eingeschalten bleibt (sind ja mehrere Motoren).
    Automatisch zusammengefügt:[hr]


    Nein der Transistor wird nicht heiß.

  • Also, du gibst über SSH regelmäßig ein bestimmtes Signal? Das ist eine ungewöhnliche Vorgehensweise.
    Warum gibst du nicht ein Signal für Start und eins für Stop?


    Wenns schon so sein muss, dann ändere dein Programm:
    Es sollte den GPIO einschalten, aber nicht mehr ausschalten und auch die Programmierung nicht löschen. Dafür solltest du aber irgendwo speichern, wann der letzte Befehl gegeben wurde.
    Ein zweites Programm müsste dann überwachen, ob die Zeit von 0,1 Sekunden überschritten ist und ggf. den Motor ausschalten.


    Noch einfacher wäre es vielleicht, wenn du einen entsprechend dimensionierten Kondensator vor die Basis schaltest, damit der Basisstrom noch weiter fließt, wenn du den Motor ausschaltest. Außerdem müsste dann wohl eine Diode dran, damit der GPIO im LOW Zustand nicht die Basis auf GND zieht. Der Pulldown sollte dann recht hochohmig sein.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • Hallo Snowball23,



    [quote='Gnom','http://test.forum-raspberrypi.de/forum/index.php?thread/&postID=284622#post284622']
    Das ist erforderlich, weil ich nicht steuern kann, wenn der Motor 10 Sekunden lang eingeschalten bleibt (sind ja mehrere Motoren).


    Dann brauchst Du eine Art "State Machine". Diese kannst Du in Software ganz leicht nachbilden.


    Angenommen, Du willst Pin A für 10 Sekunden auf HIGH setzen. Dann schreibst Du in eine Datenstruktur
    A, 15:27:48
    und setzt den Pin auf HIGH.
    Dein Programm ist dann wieder in der Hauptereignisschleife und durchläuft alle Einträge der Datenstruktur, ob die Zeit schon vorbei ist. In dem Fall ist 15:27:48 noch in der Zukunft.
    Dein Programm ist dann wieder in der Hauptereignisschleife und durchläuft alle Einträge der Datenstruktur, ob die Zeit schon vorbei ist. In dem Fall ist 15:27:48 noch in der Zukunft.
    ...
    Sobald ein Zeit-Eintrag in der Vergangenheit liegt, wird der betreffende Pin auf LOW gesetzt und der Einträg aus der Datenstruktur entfernt.


    Auf diese Weise entfällt dieses unsägliche Sleep in Verbindung mit GPIOs, wodurch sowohl weiteres Schalten als auch die eigentliche Programmausführung blockiert wird.


    Zum Beispiel so:


    Code-Deutung:


    Mit [font="Courier New"]link[/font] werden zwei Libraries geöffnet, einmal die GPIO-Library, zum anderne die Icon-Tool-Kit-Library.


    [font="Courier New"]record[/font] definiert eine Datenstruktur [font="Courier New"]motor[/font], die aus den Feldern [font="Courier New"]pin[/font], [font="Courier New"]zeit[/font] und [font="Courier New"]status[/font] besteht.


    Die Funktion [font="Courier New"]event[/font] simuliert ein Ereignis (in Ermangeleung weitere von Dir gebrachter Erkenntnisse).


    Mit [font="Courier New"][][/font] wird eine leere Liste [font="Courier New"]m[/font] erzeugt.


    In der Endlosschleie wird geprüft, ob ein Ereignis vorliegt. In der Simulation habe ich es so gemacht, dass jeder 10. Aufruf ein Ereignis liefert. Da die Schleife eine Verzögerung von 5 ms besitzt, wird [font="Courier New"]event()[/font] 200 mal pro Sekunde aufgerufen und im Schnitt 20 Ereignisse pro Sekunde erzeugt.
    Wenn denn ein Ereignis vorliegt, wird die Datenstruktur gefüllt, in dem die Liste [font="Courier New"]m[/font] mit einem weiteren Motor-Eintrag ([font="Courier New"]pin[/font], [font="Courier New"]Zeit[/font] und [font="Courier New"]Status[/font]) - jeweils zufallszahlszahlgesteuert - gefüllt wird. Der entsprechende PIN wird mit dem Motor-Eintrag gesetzt.


    In der [font="Courier New"]every[/font]-Schleife wird die Liste [font="Courier New"]m[/font] durchlaufen und geprüft, ob die eingetragene Zeit schon vorbei ist. Wenn ja, wird der Pin auf den Exklusiv-ODER-Wert des Status gesetzt (aus HIGH wird LOW, aus LOW wird HIGH) und der Eintrag aus der Liste gelöscht.


    Die Verzögerung von 5 ms hatten wir schon.


    Auf diese Weise wird der Motor sofort geschaltet und nach Ablauf einer festgelegten Zeit zurückgesetzt.



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().

  • In welchen Abständen kommen denn eine ominösen SSH Befehle? Und woher und warum überhaupt? Das ist doch wirklich etwas unüblich.
    Kannst du uns mal etwas genauer erklären, was der Hintergrund der Ganzen Sache ist? Ich hab das Gefühl, dass wir hier an der ganz falschen Stelle sind. Was willst du steuern, von wo aus und was sind die Regelmechanismen?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().


  • Du musst nur das script öfter pro Zeiteinheit aufrufen (falls Du Deinen Entwurf beibehalten willst)


    Scnr
    Leroy


    Nein, auch in einer while True Schleife ändert sich nichts.
    Automatisch zusammengefügt:[hr]
    Ich schreibe jetzt mal die Software um und melde mich dann wieder ;)
    Automatisch zusammengefügt:[hr]


    In welchen Abständen kommen denn eine ominösen SSH Befehle? Und woher und warum überhaupt? Das ist doch wirklich etwas unüblich.
    Kannst du uns mal etwas genauer erklären, was der Hintergrund der Ganzen Sache ist? Ich hab das Gefühl, dass wir hier an der ganz falschen Stelle sind. Was willst du steuern, von wo aus und was sind die Regelmechanismen?


    Die ominösen SSH Befehle kommen von einem anderen Gerät im Netzwerk (der Pi wird also ferngesteuert). Ja, wir sind wirklich an der falschen Stelle xD ich hätte als erstes wohl bei der Software suchen sollen.

  • Das hat mit der Software meines Erachtens erstmal wenig zu tun. Ich vermute, dass dein Ansatz grundlegend ungünstig ist. Die Signalisierung über einen Aufruf eines Programms zu machen, halte ich für kompliziert. Wenn dein "Sender" weiß, wann er keine Befehle mehr senden soll, kann er doch genauso gut einen Stop-Befehl senden. Und wenn es schon Impuls-Befehle sein müssen, dann muss dein Programm den Impuls erkennen und wenn eine bestimmte Zeit lang kein Impuls kommt, den Motor abschalten. Das Senden von SSH-Befehlen ist da aber eine denkbar ungünstige Lösung. Kann dein Sender nicht direkt mit dem Programm kommunizieren und die Impulse senden? Über einen Socket zum Beispiel. Dazu gibts hier auch ein FAQ/Tutorial.
    Automatisch zusammengefügt:[hr]


    Die ominösen SSH Befehle kommen von einem anderen Gerät im Netzwerk (der Pi wird also ferngesteuert).


    Ach ne? Sag echt? Da wär ich jetzt nicht drauf gekommen? Ich hatte gedacht, die Befehle kommen vom Badezimmerboiler über die Wasserleitung...


    Ehrlich, die Geheimniskrämerei führt dazu, dass dir hier keiner helfen kann.


    Was ist die Ursache dafür, dass die Befehle gesendet werden? Hast du da irgendwelche Sensoren an einem PC oder zweiten Pi, die das steuern? Oder geben viele fleißige Chinesen die Befehle per Hand ein? Das Problem liegt nicht bei der Motoransteuerung im Pi, sondern in deiner Aktionslogik auf Senderseite. Es ist mir immer noch nicht nachvollziehbar, warum dein Sender nicht einfach zwei unterschiedliche Befehle geben kann: Motor an, Motor aus. Oder für mehrere Motoren entsprechend Motor-A an, Motor-A aus, Motor-B an, Motor-B aus, ...

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • Hallo Snowball23,



    Das Senden von SSH-Befehlen ist da aber eine denkbar ungünstige Lösung. Kann dein Sender nicht direkt mit dem Programm kommunizieren und die Impulse senden? Über einen Socket zum Beispiel. Dazu gibts hier auch ein FAQ/Tutorial.

    EDIT 17-OKT-2017: Link im Zitat von Gnom an neues Forum angepasst



    Die andere Möglichkeit besteht in der Verwendung sog. named pipes. Unter dem Stichwort "Interprozess-Kommunikation" habe ich dazu mal ein Tutorial geschrieben.


    Ansonsten bleibt noch die Verwendung von Umgebungsvariablen (sofern die Programme aus dem gleichen Prozess heraus gestartet wurden).


    Deine geschilderte "Kommunikation" über SSH und andere Programme kann so nicht funktionieren - solltest Du mit den Motoren tatsächlich einen Quadcopter steuern wollen: Das Ding wird gar nicht erst stabil abheben und bei nächster Gelegenheit Schräglage erleiden - und bevor Du reagieren kannst, isses schon abgestürzt.



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited 2 times, last by Andreas ().

  • Ach ne? Sag echt? Da wär ich jetzt nicht drauf gekommen? Ich hatte gedacht, die Befehle kommen vom Badezimmerboiler über die Wasserleitung...



    Was nein das wäre doch viel zu teuer ;)
    Auf einem zweiten Gerät (Pi, mein Laptop, der Herd oder sonst was) befindet sich das eigentliche Programm bzw. der Sender. Beim drücken einer Taste wird über die Verbindung ein Befehl an den Pi gesendet (nämlich das bestimmte Skript auszuführen). Für die Verbindung nutze ich Paramiko, weil ich aber nicht herausfinden konnte, ob GPIO Pins auch über das Terminal gesteuert werden können, habe ich mich für Python Skripts entschieden. Zu deinem zweiten Punkt:



    Es ist mir immer noch nicht nachvollziehbar, warum dein Sender nicht einfach zwei unterschiedliche Befehle geben kann: Motor an, Motor aus. Oder für mehrere Motoren entsprechend Motor-A an, Motor-A aus, Motor-B an, Motor-B aus, ...


    Das wird Dummheit genannt, aber ich bin dabei, mein Programm umzuschreiben :D


    Euch allen Danke für eure Hilfe, der Stromkreis ist jetzt ja auch in Ordnung. :danke_ATDE: