Hallo Leute,
Bin neu hier und beschäftige mich erst seit ein paar Monaten mit dem RasPi und Python.
Ich baue mir einen Schrittmotorbetriebenen Kameraslider und hab ja schon einige Grundfunktionen zum laufen gebracht. Ich weiß das das Programm noch einige Verbesserungen nötig hat, aber momentan läuft es so, bis auf mein Problem mit dem blinken.
Ich will das eine Tastenfeldbeleuchtung während der Motor dreht, blinkt.
Hab die Stellen markiert (############!!!!!!...).
Leider bleibt mein Programm an der stelle hängen, was ja irgendwie logisch ist, aber ich finde keine lösung.
Ich hab schon ein extra skript geschrieben, was durch subprozess aufgerufen wird, aber das haut mir scheinbar meinen Arbeitsspeicher voll. Oder was auch immer, jedenfalls bremst es alles aus, der Motor ruckelt und nichts blinkt.
Verbesserungsvorschläge erwünscht!!!
Vielen Dank für eure Hilfe
Ps.: "Anfänger"
Hauptprogramm "auswahl1.py":
[code=php]
#!/usr/bin/python
# coding: utf-8
import RPi.GPIO as GPIO
import time
import math
import sys
import subprocess
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
## Pin- und GPIOzuweisung
A_1_pin = 12 # Motorspule A1
A_2_pin = 16 # Motorspule A2
B_1_pin = 20 # Motorspule B1
B_2_pin = 21 # Motorspule B2
s1 = 24 # Bestätigungstaste (momentan rechtslauf)
s2 = 27 # Return-Taste (momentan lingslauf)
s9 = 18 # Schalter für Voll- oder Halbschritte
stop_r = 22 # Endschalter rechts
stop_l = 23 # Endschalter links
ref = 6 #Joystick Taster zur referenzfahrt
bl_led = 4 # Tastenfeldbeleuchtung
##----------GPIO als Aus- oder Eingänge deklarieren-----------
## Ausgänge für Motor zurückgesetzt
GPIO.setup(A_1_pin, GPIO.OUT)
GPIO.setup(A_2_pin, GPIO.OUT)
GPIO.setup(B_1_pin, GPIO.OUT)
GPIO.setup(B_2_pin, GPIO.OUT)
GPIO.setup(bl_led, GPIO.OUT)
GPIO.output(A_1_pin, GPIO.LOW)
GPIO.output(A_2_pin, GPIO.LOW)
GPIO.output(B_1_pin, GPIO.LOW)
GPIO.output(B_2_pin, GPIO.LOW)
GPIO.output(bl_led, GPIO.LOW)
## Eingänge (Pull down)
GPIO.setup(s1, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(s2, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(s9, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(ref, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(stop_r, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(stop_l, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
## ruft andere Scripte auf.
subprocess.Popen(['python', 'ref_rechts_led.py'], stdout = subprocess.PIPE)
bl_start = False
def blinken(bl_start):
while bl_start == True:
GPIO.output(bl_led, GPIO.HIGH)
time.sleep(0.4)
GPIO.output(bl_led, GPIO.LOW)
time.sleep(1.3)
def rechts():
blinken(True) #################!!!!!!!!!!! Ab hier soll es blinken
from motor import Motor # ruft die Klasse "Motor" in modul motor auf (instanz)
if input9 == False:
sequenz = True
else:
sequenz = False
print'Rechts'
m1 = Motor(int(steps), float(delay), sequenz, coil, stop_r, stop_l)
m1.rechts()
m1.step = '0000'
m1.setze_step(m1.step)
blinken(False) ##################!!!!!!!!!!! bis hier!!
def links():
blinken(True) #################!!!!!!!!!!! Ab hier soll es blinken
from motor import Motor # ruft die Klasse "Motor" in modul motor auf (instanz)
if input9 == False:
sequenz = True
else:
sequenz = False
print'Links'
m2 = Motor(int(steps), float(delay),sequenz, coil, stop_r, stop_l)
m2.links()
m2.step = '0000'
m2.setze_step(m2.step)
blinken(False) ##################!!!!!!!!!!! bis hier!!
def referenz():
blinken(True) #################!!!!!!!!!!! Ab hier soll es blinken
from motor import Motor # ruft die Klasse "Motor" in modul m$
if input9 == False:
sequenz = True
else:
sequenz = False
ref1 = Motor(int(steps), float(delay),sequenz, coil, stop_r, stop_l)
ref1.referenz()
ref1.step = '0000'
ref1.setze_step(ref1.step)
blinken(False) ##################!!!!!!!!!!! bis hier!!
## Testschleife
while True:
# delay = raw_input("Verzögerung zwischen den Schritten (Sekunden)?")
# steps = raw_input("Wie viele Schritte? ")
delay = 0.005 # Statt der Eingabe oben
steps = 100 # Statt der Eingabe oben
coil = [A_1_pin,A_2_pin,B_1_pin,B_2_pin] # Ausgänge zum Schrittmotor
print 'start'
while True:
## Tasterinput durch GPIO
input1 = GPIO.input(s1)
input2 = GPIO.input(s2)
st_r = GPIO.input(stop_r)
st_l = GPIO.input(stop_l)
refer = GPIO.input(ref)
input9 = GPIO.input(s9)
## Rechts
if input1 == False and st_r == True:
rechts()
while input1 == False:
input1 = GPIO.input(s1)
# Links
elif input2 == False and st_l == True:
links()
while input2 == False:
input2 = GPIO.input(s2)
# Referenzfahrt
elif refer == True:
referenz()
while refer == False:
refer = GPIO.input(ref)
[/php]
Motorinstanz "motor.py":
[code=php]
#!/usr/bin/python2
# coding: utf-8
import RPi.GPIO as GPIO
import sys
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
class Motor():
def __init__(self, steps, delay, sequenz, coil, stop_r, stop_l):
self.sequenz = sequenz
self.steps = steps
self.delay = delay
self.rechtslauf = False
self.linkslauf = False
self.coil = coil
self.step = '0000'
self.setze_step(self.step)
if sequenz == True:
self.reseq = ['1010', '1000','1001','0001','0101', '0100','0110','0010'] # Halbschritte
self.liseq = list(self.reseq) # Kopiert vorwärtsliste
self.liseq.reverse() # Liste läuft rückwärts ab
else:
self.reseq = ['1010','1001','0101','0110'] # Ganze schritte
self.liseq = list(self.reseq) # Kopiert vorwärtsliste
self.liseq.reverse() # Liste läuft rückwärts ab
self.stop_r = stop_r
self.stop_l = stop_l
#----------GPIO als Aus- und Eingänge deklarieren-----------
# Ausgänge
GPIO.setup(self.coil[0], GPIO.OUT)
GPIO.setup(self.coil[1], GPIO.OUT)
GPIO.setup(self.coil[2], GPIO.OUT)
GPIO.setup(self.coil[3], GPIO.OUT)
# Eingänge (Pull down)
GPIO.setup(self.stop_r, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) # Rechter Endschalter
GPIO.setup(self.stop_l, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) # Linker Endschalter
# In der Funktione "setze_step" wird s"step" je nach schrittsequenz aufgelöst
# und den jeweiligen GPIO's ein Boolischer Wert zugewiesen
def setze_step(self, step):
GPIO.output(self.coil[0], self.step[0] == '1')
GPIO.output(self.coil[1], self.step[1] == '1')
GPIO.output(self.coil[2], self.step[2] == '1')
GPIO.output(self.coil[3], self.step[3] == '1')
#-------------Vorwärtsfunktion------------
def rechts(self):
self.rechtslauf = True
if (GPIO.input(self.stop_r) == True):
for i in range(self.steps):
for self.step in self.reseq:
sys.stdout.flush()
self.setze_step(self.step)
time.sleep(self.delay)
if (GPIO.input(self.stop_r) == False):
break
#--------------Rückwärtsfunktion----------
def links(self):
self.linkslauf = True
if (GPIO.input(self.stop_l) == True):
for i in range(self.steps):
for self.step in self.liseq:
sys.stdout.flush()
self.setze_step(self.step)
time.sleep(self.delay)
if (GPIO.input(self.stop_l) == False):
break
if (GPIO.input(self.stop_l) == False):
break
def referenz(self):
if (GPIO.input(self.stop_r) == True):
print "Referenzfahrt nach rechts"
while True:
for self.step in self.reseq:
sys.stdout.flush()
self.setze_step(self.step)
time.sleep(0.005)
if (GPIO.input(self.stop_r) == False):
print "Referenzpunkt erreicht"
break
if (GPIO.input(self.stop_r) == False):
break
else:
print("Referenzpunkt bereits erreicht")
return self
[/php]