Python scripte abbrechen/beenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Doki
User
Beiträge: 3
Registriert: Samstag 23. Mai 2015, 15:39

Hallo zusammen,

ich habe sehr wenig erfahrung mit Python, aber geringe Erfahrung mit Programmieren allgemein.
ich arbeite im Moment an einen Script, welches mit Servo-Motor steuern lässt. Script läuft auf den Raspberry Pi.

Über eine html Seite kann ich diese mit Steuerelementen steuern. (Links, Rechts, ... )

Ich drücke auf "Links" (Motor schwenkt nach links, und fährt wieder zurück)
Ich drücke auf "Rechts" (Motor schwenkt nach rechts, und fährt wieder zurück)

Das Problem:
Ich möchte die Schwenkung nach Links abbrechen, sobald ich auf Rechts derückt habe.

Wenn ich jetzt auf Links drücke und gleich auch auf Rechts, fährt der Motor gemütlich nach links und danach nach rechts.

Ich würde es gerne schaffen dass in solch einer Situation die Links-Bewegung abgebrochen wird und der Motor sofort nach rechts schwenkt. (also "Links.py" sofort beenden und "Rechts.py" sofort starten)


Realisiert hab ich das folgendermaßen:

Code: Alles auswählen


import time
import atexit
from flask import Flask, render_template, request
app = Flask(__name__)


from Adafruit_PWM_Servo_Driver import PWM
import time

# Load the main form template on webrequest for the root page
@app.route("/")
def main():

    # Create a template data dictionary to send any data to the template
    templateData = {
        'title' : 'PiCam'
        }
    # Pass the template data into the template picam.html and return it to the user
    return render_template('picam.html', **templateData)

# The function below is executed when someone requests a URL with a move direction
@app.route("/<direction>")
def move(direction):
    # Choose the direction of the request
    if direction == 'left':
        
        execfile("links.py")

     elif direction == 'right':

        execfile("rechts.py")

     elif direction == 'up':

	execfile("rauf.py")         

     elif direction == 'down':
         
	execfile("runter.py")

# Function to manually set a motor to a specific pluse width
@app.route("/<motor>/<pulsewidth>")
def manual(motor,pulsewidth):
#    if motor == "pan":

#    elif motor == "tilt":
#servoTilt.set_servo(22, int(pulsewidth))
    return "Moved"

# Clean everything up when the app exits
#atexit.register(cleanup)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80, debug=True)
in der Links.py siehts so aus: (in den anderen Scripten genau so, nur Werte anders.)

Code: Alles auswählen

#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import time

# ===========================================================================
# LINKS
# ===========================================================================
# Initialise the PWM device using the default address
pwm = PWM(0x40)
# Note if you'd like more debug output you can instead run:
#pwm = PWM(0x40, debug=True)

def setServoPulse(channel, pulse):
  pulseLength = 1000000                   # 1,000,000 us per second
  pulseLength /= 60                       # 60 Hz
  print "%d us per period" % pulseLength
  pulseLength /= 4096                     # 12 bits of resolution
  print "%d us per bit" % pulseLength
  pulse *= 1000
  pulse /= pulseLength
  pwm.setPWM(channel, 0, pulse)

pwm.setPWMFreq(60)                        # Set frequency to 60 Hz

n = 150
i = 300

while n <= i:
	i = i - 1
	
  pwm.setPWM(0, 0, i)
  time.sleep(0.005)

Ich hoffe ihr könnt mir sagen wie ich das richtig machen sollte :)
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Doki: Die Einrückungen Deines Programms sind kaputt, so läuft das nicht. Statt für jede Richtung eine eigenes Programm zu starten, mußt Du die Motorsteuerung in einem Prozess/Thread laufen lassen; der Webserver kommuniziert mit diesem Steuerungsthread über eine Queue. so kannst Du die Richtungsänderung jederzeit durchführen.
Doki
User
Beiträge: 3
Registriert: Samstag 23. Mai 2015, 15:39

Sirius3 hat geschrieben:@Doki: Die Einrückungen Deines Programms sind kaputt, so läuft das nicht. Statt für jede Richtung eine eigenes Programm zu starten, mußt Du die Motorsteuerung in einem Prozess/Thread laufen lassen; der Webserver kommuniziert mit diesem Steuerungsthread über eine Queue. so kannst Du die Richtungsänderung jederzeit durchführen.

die Formatierung ist mir wohl beim kopieren durcheinander geraten.

Vielen Dank für deine Antwort. Ich werde mich wohl damit auseinandersetzten müssen, weil wie gesagt für mich Python neu ist. :K

Kannst du mir einen Ansatz zeigen wie ich hier anfangen soll?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Doki: schreibe Dir ein Modul für die Motorsteuerung, bei der Du einen Schritt in eine Richtung ausführen kannst. Dann eine Schleife, die Befehle über eine Queue entgegen nimmt und die Schrittfunktion in die richtige Richtung regelmäßig aufruft. Dann den Web-Server, der die Schleife in einem eigenen Thread startet und die Queue über die Button-Requests füllt.
Doki
User
Beiträge: 3
Registriert: Samstag 23. Mai 2015, 15:39

Sirius3 hat geschrieben:@Doki: schreibe Dir ein Modul für die Motorsteuerung, bei der Du einen Schritt in eine Richtung ausführen kannst. Dann eine Schleife, die Befehle über eine Queue entgegen nimmt und die Schrittfunktion in die richtige Richtung regelmäßig aufruft. Dann den Web-Server, der die Schleife in einem eigenen Thread startet und die Queue über die Button-Requests füllt.
Horcht sich gut an, ich werde das Versuchen. Muss aber noch einiges lernen. Vielen Dank Sirius3!

Off-Topic:
bei diesem Project gehts um eine Steuerung für ein RC Car.
Was es hat und was es noch haben soll:
  • 4x4 Antrieb, gefedertes Fahrwerk. ca. 20km/h schnell.
    Präzise Steuerung über Web (kein klumpes "Vollgas / Vollgas zurück usw..)
    Livebild vom Auto aus (Kamera lenkt in der Kurve mit)
    Steuerbares Licht (manuell zum einschalten oder automatisch bei Dämmerung)
    ca. 1h Akkuzeit. Solarpanele laden den Akku in der Sonne. (mit Schutz vor überladung usw..)
    Sensoren (vorne / hinten ) die das Auto bei einem Hindernis automatisch abbremsen.
falls es wenn interessiert, schreibe ich gerne eine Anleitung / Stückliste wie mann sich selbst eines bauen kann!
Antworten