/
step_motor.py
228 lines (168 loc) · 6.95 KB
/
step_motor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# Der Code dient zur Steuerung eines Motorsets,
# das unter folgendem Link erhältlich ist:
# http://bit.ly/schritt-motor
# Benötigten Bibliotheken importieren
import RPi.GPIO as GPIO
import _thread
import time
# Funktion, die die gekürtze Eingabe in Wörter umwandelt
def getRotation(rotation):
# Wenn die ausgewählte Richtung 'v' ist
if(rotation == "v"):
# wird 'vorwärts' zurück gegeben
return "vorwärts"
# sonst
else:
# wird 'rückwärts' zurück gegeben
return "rückwärts"
# Funktionen, die die Motor-Auswahl in "Wörter" umwandelt
def getMotor(motor):
# Wenn der ausgewählte Motor 'a' ist
if(motor == "a"):
# wird 'A' zurück gegeben
return "A"
# Wenn der ausgewählte Motor 'b' ist
elif(motor == "b"):
# wird 'B' zurückgegeben
return "B"
# sonst
else:
# wird 'A und B' zurückgegeben
return "A und B"
# Funktion, die Motor A drehen lässt
def motorA(rotation, step_a):
# Solange der Nutzer das Programm nicht beenden
while True:
# wird der Motor vorwärts gedreht, wenn es angegeben worden ist
if(rotation == "v"):
for i in range(0, len(pinsA)):
GPIO.output(pinsA[i], pattern[step_a % 8][i])
step_a += 1
time.sleep(0.001)
# Sonst Rückwärts drehen
else:
for i in range(0, len(pinsA)):
GPIO.output(pinsA[i], pattern[step_a % 8][0-i])
step_a += 1
time.sleep(0.001)
# Funktion, die Motor B drehen lässt
def motorB(rotation, step_b):
# Solange der Nutzer das Programm nicht beenden
while True:
# wird der Motor vorwärts gedreht, wenn es angegeben worden ist
if(rotation == "v"):
for i in range(0, len(pinsB)):
GPIO.output(pinsB[i], pattern[step_b % 8][i])
step_b += 1
time.sleep(0.001)
# Sonst Rückwärts drehen
else:
for i in range(0, len(pinsB)):
GPIO.output(pinsB[i], pattern[step_b % 8][0-i])
step_b += 1
time.sleep(0.001)
try:
# GPIO einrichten
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# Pins des Motors A festlegen
pinsA = [11, 12, 13, 15]
# Pins des Motors B festlegen
pinsB = [16, 18, 22, 7]
# Pins des ersten Motores als Output festlegen
for pin in pinsA:
GPIO.setup(pin, GPIO.OUT, initial = False)
# Pins des zweiten Motores als Output festlegen
for pinB in pinsB:
GPIO.setup(pinB, GPIO.OUT, initial = False)
# Ansteuerungsmuster initialisieren
pattern = []
pattern.append([1,0,0,0])
pattern.append([1,1,0,0])
pattern.append([0,1,0,0])
pattern.append([0,1,1,0])
pattern.append([0,0,1,0])
pattern.append([0,0,1,1])
pattern.append([0,0,0,1])
pattern.append([1,0,0,1])
# Variablen auf Startwert setzen
step_a = 0
step_b = 0
# Den Nutzer fragen, ob Motor A oder B
print("Du kannst Motor A und/oder B ansteuern!")
print("Bitte gebe, wenn du gefragt wirst, den Motor an den du bentutzen willst")
print("Wenn du beide Motoren Steuern möchtest gebe 'c' ein")
# Solange die Antwort keine Gültige ist
while True:
# Den Nutzer nach einer neuen Antwort fragen
input_motor = input("Motor: ")
# Alles klein schreiben, um ein Programmstandard zu haben
input_motor = input_motor.lower()
# Wenn eine gültige Antwort eingegeben wurde
if(input_motor == "a" or input_motor == "b" or input_motor == "c"):
# wird mit dem Rest des Progrannes weiter gemacht
break
# Den Nutzer Fragen, in welche Richtung sich der Motor drehen soll
print("Du kannst eine Richtung angeben, in der sich der Motor drehen soll")
print("Der Motor kann sich vorwärts (v) oder rückwärts (r) drehen")
# Solange die Antwort ungültig ist Frage wiederholen
while True:
# Wenn nicht beide Motoren angesteuert werden,
if (input_motor != "c"):
# wird nur eine Richtung abgefragt
input_rotation = input("Richtung (v|r): ")
# Alles klein schreiben, um ein Programmstandard zu haben
input_rotation = input_rotation.lower()
# Wenn eine gültige Antwort eingegeben wurde,
if(input_rotation == "v" or input_rotation == "r"):
# wird mit dem Rest des Programmes weiter gemacht
break
# Wenn beide Motoren angesteuern werden,
else:
# wird erst nach der Richtung für Motor A gefragt
input_rotation_a = input("Richtung Motor A: ")
# Alles klein schreiben, um ein Programmstandard zu haben
input_rotation_a = input_rotation_a.lower()
# Wenn die Antwort für Motor A gültig ist,
if(input_rotation_a == "v" or input_rotation_a == "r"):
# Solange die Antwort für B ungültig ist
while True:
#wird nach der Richtung von B gefragt
input_rotation_b = input("Richtung Motor B: ")
input_rotation_b = input_rotation_b.lower()
# Wenn die Antwort für B gültig ist,
if(input_rotation_b == "v" or input_rotation_b == "r"):
#wird mit dem Rest des Programmes weiter gemacht
break
break
# Dem Nutzer mitteilen, welcher Motor sich jetzt dreht
if(input_motor == "c"):
print("Motor {} drehen sich jetzt {} / {}".format(getMotor(input_motor), getRotation(input_rotation_a), getRotation(input_rotation_b)))
else:
print("Motor {} dreht sich jetzt {}".format(getMotor(input_motor), getRotation(input_rotation)))
# Wenn Motor A angeben wurde
if(input_motor == "a"):
# rufen wir die Funktion auf, die Motor A drehen lässt
motorA(input_rotation, step_a)
# Wenn Motor B angegeben wurde
elif(input_motor == "b"):
# Bis der Nutzer das Programm beendet
while True:
# rufen wir die Funktion auf, die Motor B drehen lässt
motorB(input_rotation, step_b)
# Wenn 'c' (beide Motoren) angeben wurde(n)
else:
# Wird ein Thread mit der Funktion Motor A in die gewünschte Richtung drehen zu lassen gestartet
_thread.start_new(motorA, (input_rotation_a, step_a))
# die Funktion, um Motor B in die gewünschte Richtung drehen zu lassen, aufrufen
motorB(input_rotation_b, step_b)
# Wenn 'Strg + C' gedrückt wird beide Motoren ausschalten
# und Nutzerbestätigung ausgeben
except KeyboardInterrupt:
for pin in pinsA:
GPIO.output(pin, GPIO.LOW)
for pin in pinsB:
GPIO.output(pin, GPIO.LOW)
print("Alle Pins aus!")
print("Auf wiedersehen!")
exit()