DC Motor steuern mit adafruit Hat DC Motor Befehl Einschaltdauer

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Zusammen,
    ich habe mir das adafruit-dc-stepper-motor-hat-

    http://www.adafruit.com/product/2348

    für den raspberry-pi-2 geholt.
    Die Test dateil läuft auch soweit --

    die Beispiel Datei -->DCTest.Py


    #!/usr/bin/python
    from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor

    import time
    import atexit

    # create a default object, no changes to I2C address or frequency
    mh = Adafruit_MotorHAT(addr=0x60)

    # recommended for auto-disabling motors on shutdown!
    def turnOffMotors():
    mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(3).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(4).run(Adafruit_MotorHAT.RELEASE)

    atexit.register(turnOffMotors)

    ################################# DC motor test!
    myMotor = mh.getMotor(3)

    # set the speed to start, from 0 (off) to 255 (max speed)
    myMotor.setSpeed(150)
    myMotor.run(Adafruit_MotorHAT.FORWARD);
    # turn on motor
    myMotor.run(Adafruit_MotorHAT.RELEASE);


    while (True):
    print "Forward! "
    myMotor.run(Adafruit_MotorHAT.FORWARD)

    print "\tSpeed up..."
    for i in range(255):
    myMotor.setSpeed(i)
    time.sleep(0.01)

    print "\tSlow down..."
    for i in reversed(range(255)):
    myMotor.setSpeed(i)
    time.sleep(0.01)

    print "Backward! "
    myMotor.run(Adafruit_MotorHAT.BACKWARD)

    print "\tSpeed up..."
    for i in range(255):
    myMotor.setSpeed(i)
    time.sleep(0.01)

    print "\tSlow down..."
    for i in reversed(range(255)):
    myMotor.setSpeed(i)
    time.sleep(0.01)

    print "Release"
    myMotor.run(Adafruit_MotorHAT.RELEASE)
    time.sleep(1.0)


    der motor beschleinigt nur kurz (bremst wieder ab und wechselt die richtung beschleunigt wieder kurz bremst ab und wechselt die richtung und das im loop

    Wie kann ich programmieren bzw mit welchem befehl funktioniert es das der Motor eine bestimmte zeit lang(also sekunden die ich eingeben kann )eingeschalten bleibt.

    Bin absoluter anfänger und arbeite mich gerade erst ein..wäre super wenn mir jemand weiterhelfen kan

    Einmal editiert, zuletzt von nimaru_one (9. Mai 2015 um 09:44)

  • DC Motor steuern mit adafruit Hat DC Motor Befehl Einschaltdauer? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    Als Anfänger, vergiss die Motoren und lerne die grundlage der Sprache. Wie du ih vorwärts drehen lässt steht ja in dem Beispiel. Jetzt musst du nur noch Zeit x lang machen lassen. Dazu gibts time modul. Also ran an die python tutorials und probier dich aus.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • okay das werde ich machen,
    ich habe aber zu dem "adafruit motor hat" noch eine sehr sehr wichtige frage....

    ich möchte am "adafruit motor hat" http://www.adafruit.com/product/2348
    einen dc motor betreiben welcher eine leinwandmaskierung hoch und runter bewegt.falls der motor länger angetrieben wird als eine bestimmte definierte zeit dann zerstört er die mechanik der maskierung.

    jetzt ist mit beim testen aufgefallen ,das wenn der raspberry crasht oder neu bootet während der motor angesteuert wird..also in bewegung ist,dieser unkontrolliert weiterläuft...

    der hersteller schreibt dazu in der beschreibung:

    The PWM driver is 'free running' - that means that even if the python code or Pi linux kernel
    crashes, the PWM driver will still continue to work. This is good because it lets the Pi focus on linuxy things while the PWM driver does its PWMy things.

    But it means that the motors DO NOT STOP
    when the python code quits For that reason, we strongly recommend this 'at exit' code when using DC motors, it will do its best to shut down all the motors.

    # recommended for auto-disabling motors on shutdown!
    def turnOffMotors():
    mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(3).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(4).run(Adafruit_MotorHAT.RELEASE)
    atexit.register(turnOffMotors)

    Der Satz "it will do its best to shut down all the motors" verwirrt mich...:@

    das beste reicht hier nicht -->der motor muss stoppen<--
    den wenn der motor einfach weiterläuft was er mit der Beispiel Datei " DCTest2.py " bei einem simulierten absturz auch macht.
    Obwohl dieser sogenannte"at exit" code dort programmiert ist,dann zerstört der motor wie oben gesagt meine mechanik welche vom Motor angetrieben wird..

    Verstehe ich einige dinge Falsch :wallbash: ?oder Muss ich diesen"at exit" code noch irgendwie aktivieren.meiner Meinung nach ist dieser ja schon programmiert.

    Bin ich eventuell mit einer einfachen H-Brücke besser dran als mit diesem Motor Shield.
    Dann werde ich das Shield zurückschicken ,und mich mal richtig in das thema einlesen.
    :danke_ATDE:

    Einmal editiert, zuletzt von nimaru_one (9. Mai 2015 um 09:46)

  • Hallo Nimaru_One,

    ein Endschalter sorgt dafür, dass der Motor in einer Richtung nicht weiter fährt, als er fahren soll. Suche einmal nach diesem Begriff und mache Dich mit der Funktionsweise eines Endschalters vertraut.

    Ansonsten nimm den Hinweis von dbv ernst und beschäftige Dich zuerst mit den Grundlagen der Programmiersprache, mit der Du Deine Idee realisieren möchtest. Ansonsten ist der Frustfaktor zu groß.

    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

    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.

  • Wie Andreas gerade geschrieben hat, montiere einen Endschalter = Microswitch =Unterbrecher, der die Stromzufuhr zu Deinem Motor unterbricht, wenn er am Endanschlag der Mechanik, bzw. kurz davor angekommen ist.

    Das fungiert dann wie eine Sicherung oder auch "Versicherung", dass an der Mechanik nichts kaputt geht.

    So was wird tausendfach an elektrischen Schiebedächern, elektrischen Torantrieben etc eingesetzt.

    Ausser mit einem Microswitch kann man das auch optisch oder mit Hallsensoren machen, ist aber alles aufwendiger.

    Vermutlich brauchst Du auch einen in der Gegenrichtung am anderen Endanschlag.

  • Ja das mit dem Endschalter ist klar.danke.ich hab schon welche bestellt aber hier wird nur der strom zum motor unterbrochen das hab ich simuliert.motor geht aus..aber der treiber läuft trotzdem weiter und wenn ich wieder Spannung auf den Motor gebe läuft er unkontrolliert weiter...also bring es mir nichts nur den strom zum motor zu unterbrechen...der treiber oder das angestartete programm muss bei einem crash sauber gestoppt und resettet werden..

    Einmal editiert, zuletzt von nimaru_one (9. Mai 2015 um 10:24)

  • Hallo Nimaru_One,

    ein Endschalter macht einen Motor in einer Richtung stromlos - in der Richting, in der er zu weit gefahren ist. Der Motor bleibt stehen, egal ob Du da Strom drauf gibst oder nicht.
    Du kannst den Motor nur noch in der anderen Richtung zurückfahren. Wenn in der anderen Richtung auch eine Endschalter angebracht ist, dann pendelt der Motor nur zwischen den beiden Endschaltern hin und her.
    Das Problem, das der Treiber Dir bereitet, ist dann ein anderes. Der scheint ein Eigenleben zu entwickeln.

    Dein Programm muss über einen GPIO-Eingang erkennen, dass der Endschalter erreicht wird. Tritt dieses Ereignis ein, muss das Programm entsprechendes veranlassen (Signal Motor-Stop absetzen - auch wenn der Motor wegen Stromlos-Schalten durch Endschalter steht).
    Die Software darf dann nur eione Bewegung in der entgegengesetzten Richtung erlauben (Signale Motor-anfahren, Motor-beschleunigen.

    Dein Programm sollte nicht zeitgesteuert verlaufen (z.B. 10 Sekunden zum Hochfahren, 8 Sekunden zum Herunterfahren der Leinwand) - sondern vollkommen ereignisgesteuert ablaufen (Endschalter hier, Endschalter dort).

    Wenn Du dies (nachdem Du Dich mit den Grundlagen der Programmierung beschäftigt hast) umsetzt, dann wirst Du damit eine gute Lösung gefunden haben.

    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

    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.

  • Hi Andreas ,

    danke für die hinweise..:thumbs1:

    ursprünglich wollte ich ja ein schrittmotor einsetzten aber da dieser in stromlosen zustand kein haltemoment hat müsste ich ihn dauernd beschaltet lassen damit die position der maskierung sich nicht verändern kann..bzw der schrittmotor auch keine schritte verliert.

    leider wird ein schrittmotor bei dauerbestromung relativ warm,da er jedoch direkt hinter der leinwandfolie sitzen würde hatte ich bedenken das die folie sich dann an dieser stelle durch die erwärmung eventuell verformen kann.

    so habe ich die schaltlogik jetzt nochmal überdacht und werde die maskierung vorerst manuell ansteuern d.h über ein kipp oder drehschalter 2 polig mit 6 anschlüssen (ein -aus -ein) werde ich die drehrichtung des dc motors ändern (für hoch und runter) und die mirkoschalter in den entsprechenden leitungen zwischenschalten.

    das adafruit hat/shield habe ich zurückgeschickt und mir eine 4mal günstigere h-brücke geholt..
    später wenn ich etwas fitter bin was die programmierung angeht werde ich die ansteuerung dann über den raspi mit python skripten und per smartphone/tab steuern.

    verstanden habe ich zwar immernoch nicht warum der treiber vom adafruit shield ,bei einem crash oder reboot des raspi unkrontrolliert weitergelaufen ist...aber das ist ja jetzt egal.


    gruß nimaru

    Einmal editiert, zuletzt von nimaru_one (15. Mai 2015 um 14:03)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!