@ meigrafd
Du bist so gut zu mir, vielen Dank
Beiträge von firstfacility
-
-
Hallo Forum,
ich hätte eine Frage bezügliche einer zeitversetzten Anweisung in einer Schleife bei denen die folgenden Anweisungen weiterlaufen, also:
Normalerweise läuft es
Bedingung
Anweisung
time.sleep Anweisung ( warte bis Anweisung abgearbeitet )
Anweisung
.
.
.Ich benötige aber
Bedingung
Anweisung
time.sleep Anweisung ( fahre sofort weiter mit der nächsten Anweisung)
Anweisung
.
.
.Hätte jemand eine Idee wie ich das Lösen könnte ?
Gruß
Frank -
argh, habe ich nur einmal geändert. Leider übersehen.
Ich würde gern noch mal auf das Thema Interrupt zurückkommen. Ein Taster soll einen Motor stoppen und hierzu habe ich folgende alternativen:
Codedef callback2(): while (GPIO.input(10)): delay = 10 steps = 200 backwards(int(delay) / 1000.0, int(steps)) else: print "Stopp"
oder mit Interrupt
Codedef Interrupt_event2(): if (GPIO.input(10)): delay = 10 steps = 200 backwards(int(delay) / 1000.0, int(steps)) else: print "Stop" GPIO.add_event_detect(10, GPIO.RISING, callback = Interrupt_event2, bouncetime = 200)
Bei beiden alternativen habe ich eine Verzögerung von ca. 1 Sek, ich bin davon ausgegangen das es per Interrupt schnellere Reaktionszeiten. Kann man das beschleunigen ?
Gruß
Frank
-
sorry ich muss nochmal nachfragen. Ich bekomme einen Fehler:
TypeError: cannot concatenate "str" and "int" objects
wäre nett wenn du nochmal draufschaust
-
besten Dank das läuft mit ein paar kleinen Änderungen
-
ist mein Label-Widget
und die Verbindung ist da, ich poste nicht den gesamten Code es geht nur um das Label. Zur Erklärung ich bekomme keinen Fehler, sondern er zeigt mir das Ergebnis nicht an. Sonst wäre ich schon weiter.siehe auch hier:
LabelWenn ich hier text"bla bla bla" eintrage ist alles ok.
-
das wäre dann so:
Codedef toggle(): if (GPIO.input(27) == GPIO.LOW): MYLabel1Text.set("Schalter ist aus") else: MYLabel1Text.set("Schalter ist an") MyLabel1Text = StringVar() MyLabel1Text.set("Schalter ist aus") MyLabel1 = Label(master, textvariable=MyLabelText).pack() MyLabel1.grid(row=4, column=1)
geht aber auch nicht
-
Hallo Forum,
ich möchte gern einen GPIO Pin auf low schalten und per Schleife abfragen und das Ergebnis in der GUI als Text ausgeben.Python
Alles anzeigenfrom Tkinter import * import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(27, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) # evtl UP def toggle(): if GPIO.input(27): GPIO.input(27, GPIO.FALLING) MYLabel1["text"] = "Schalter ist aus" else: GPIO.input(27, GPIO.RISING) MYLabel1["text"] = "Schalter ist an" MyLabel1 = Label(master, text=toggle) MyLabel1.grid(row=4, column=1) mainloop()
Die Ausgabe macht keinen Sinn, also der Text wird nicht eingefügt, und ändert sich nicht. Hätte jemand eine Idee was ich machen könnte.
Gruß
Frank
-
Das war schon mal der richtige Hinweis. Genau das steht auch in der Dokumentation des Motors. Aber die Angabe ist falsch bei meinem Motor. Mit etwas probieren habe ich es hinbekommen. Vielen Dank für deine Hilfe.
-
ja klar kommt davon wenn man bei cut and paste nicht aufpasst, aber ich habe das schon im meinem code geändert ich fahre natürlich "nur" mit 4 schritten. Aber das bringt den Motor nicht zum drehen.
-
Hallo DS,
das habe ich schon gelesen und ich meine zumindest das ich es genauso gemacht habe. Die Frage wäre noch was ist mit dem Jumper, zur Zeit steckt er da mein Netzteil 5v liefert, aber es macht auch keinen Unterschied wenn ich ihn ziehe läuft es auch nicht.
Gruß
Frank
-
Hallo Forum,
ich habe ein Problem mit der Ansteuerung meines Schrittmotors. Zur Zeit gehe ich davon aus das es sich um ein Hardwareproblem handelt. Falls sich rausstellen sollte das es ein Softwareproblem ist bitte ich die Mod´s meine Frage zu verschieben.
Ich nutze einen NEMA 17 Schrittmotor:
Stepper Motor DC 5V Schrittmotor
Specs
Nema 17 (42x42)
200 step
1.8°Angle
200 gram
Torque 130 m/Nm
4 Wires
Pairs
Red & Red White
Green & Green White
Compatible
Ramps
A4988Laut Datenblatt ist die Kabelbelegung:
1B ROT
1A ROT/WEIß
2A GRÜN
2B GRÜN/WEIßAls Treiber nutze ich einen L298N Schrittmotorenendstufe Dual H Brücke die ich folgendermaßen angeschlossen habe ( Bild angefügt )
Als Code nutze ich folgendes python Script:
Code
Alles anzeigenimport RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) enable_pin = 18 # nur bei ULN2003 Treiber IC wichtig coil_A_1_pin = 23 # coil_A_2_pin = 24 # coil_B_1_pin = 17 # coil_B_2_pin = 18 # # anpassen, falls andere Sequenz StepCount = 4 Seq = range(0, StepCount) Seq[0] = [0,1,0,0] Seq[1] = [0,1,0,1] Seq[2] = [0,0,0,1] Seq[3] = [1,0,0,1] Seq[4] = [1,0,0,0] Seq[5] = [1,0,1,0] Seq[6] = [0,0,1,0] Seq[7] = [0,1,1,0] GPIO.setup(enable_pin, GPIO.OUT) GPIO.setup(coil_A_1_pin, GPIO.OUT) GPIO.setup(coil_A_2_pin, GPIO.OUT) GPIO.setup(coil_B_1_pin, GPIO.OUT) GPIO.setup(coil_B_2_pin, GPIO.OUT) GPIO.output(enable_pin, 1) def setStep(w1, w2, w3, w4): GPIO.output(coil_A_1_pin, w1) GPIO.output(coil_A_2_pin, w2) GPIO.output(coil_B_1_pin, w3) GPIO.output(coil_B_2_pin, w4) def forward(delay, steps): for i in range(steps): for j in range(StepCount): setStep(Seq[j][0], Seq[j][1], Seq[j][2], Seq[j][3]) time.sleep(delay) def backwards(delay, steps): for i in range(steps): for j in reversed(range(StepCount)): setStep(Seq[j][0], Seq[j][1], Seq[j][2], Seq[j][3]) time.sleep(delay) while True: delay = raw_input("Zeitverzoegerung (ms)?") steps = raw_input("Wie viele Schritte vorwaerts? ") forward(int(delay) / 1000.0, int(steps)) steps = raw_input("Wie viele Schritte rueckwaerts? ") backwards(int(delay) / 1000.0, int(steps))
Wenn ich das Script starte und den Motor vor oder zurückfahre zittert der Moror nur ohne sich zu drehen. Hätte jemand eine Idee was ich falsch gemacht habe ?Gruß
Frank
-
ok, ich habe ihn dann mal an 3,3v betrieben jedoch auch ohne Erfolg. Ich denke mal das der Receiver defekt ist. Ich bestelle mal einen neuen jedoch diesmal einen TSOP31236 der liegt bei 36 khz und läuft auch auf 3,3v. Hast du Erfahrungen mit dem Tsop wäre der ok ?
-
steht doch im Betreff "TSOP38238" Datenblatt
Nach Datenblatt soll er von 3,3v und auch 5v laufen. zur Zeit läuft er auf 5v. Schaltplan und Bild sind doch unter "LINK" zu finden ist genauso verschaltet. -
Hallo zusammen,
ich habe hier schon einiges zu diesem Thema gelesen nur leider habe ich keine Lösung finden können. Deshalb versuche ich es hier nochmal vielleicht hat ja jemand eine Idee.
Mein Aufbau ist so wie in dieser Anleitung LinkIch komme bis:
mode2 -d /dev/lirc0
Hier werden nun keine Signale empfangen obwohl ich im Log finde :
#modprobe lirc_rpiCode20240.071991] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned. kernel: [20240.092493] lirc_rpi lirc_rpi.0: lirc_dev: driver lirc_rpi registered at minor = 0 [20240.092518] lirc_rpi: driver registered! kernel: [20241.046783] lirc_rpi: auto-detected active high receiver on GPIO pin 18
[/quote]
Das schaut doch ganz gut aus oder ? Bloß warum wird nichts empfangen ?
Hier noch meine hardware.conf:Code
Alles anzeigen# /etc/lirc/hardware.conf # # Arguments which will be used when launching lircd LIRCD_ARGS="" #Don't start lircmd even if there seems to be a good config file #START_LIRCMD=false #Don't start irexec, even if a good config file seems to exist. #START_IREXEC=false #Try to load appropriate kernel modules LOAD_MODULES=true # Run "lircd --driver=help" for a list of supported drivers. DRIVER="default" # usually /dev/lirc0 is the correct setting for systems using udev DEVICE="/dev/lirc0" MODULES="lirc_rpi" # Default configuration files for your hardware if any #LIRCD_CONF="/etc/lirc/lircd.conf" #LIRCMD_CONF=""
Vielleicht kann mir jemand helfen ?Gruß
Frank
-
vielen Dank toll von dir, hast mir sehr geholfen.
schönes Wochenende noch
Gruß
Frank -
der Rest wird jedes mal ausgeführt wenn Low erkannt wird, heißt das Signal kommt in 30 Sek ca 30mal. Wäre nett wenn du noch einen Tipp hättest.
-
ich bekomme folgende Fehler:
Enter zum Beenden!
25 Input was LOW
Traceback (most recent call last):
File "klingel2.py", line 22, in my_callback
time.sleep(30)
NameError: global name 'time' is not defined
25 Input was HIGH
25 Input was LOW
Traceback (most recent call last):
File "klingel2.py", line 22, in my_callback
time.sleep(30)
uswDas ganze sollte nur einmal ausgeführt werden und zwar wenn erkannt wird das GIPO 25 LOW ist, dann sollte er 30 Sek schlafen und danach auf einen neunen LOW Zustand warten und Webif erneut ausführen.
-
Python
Alles anzeigen#!/usr/bin/env python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO GPIO.setwarnings(False) from time import sleep GPIO.setmode(GPIO.BCM) GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) import urllib2 def my_callback(channel): if GPIO.input(channel): print("%s Input was HIGH"%channel) else: print("%s Input was LOW"%channel) def WebIf(command): try: sock=urllib2.urlopen('http://192.168.11.100/web/' + command) data=sock.read() except urllib2.URLError: pass except urllib2.HTTPError: pass except urllib2.httplib.BadStatusLine: pass else: sock.close() return(data) WebIf('remotecontrol?command=399') WebIf('remotecontrol?command=3') WebIf('remotecontrol?command=403') WebIf('remotecontrol?command=403') WebIf('remotecontrol?command=403') time.sleep(30) GPIO.add_event_detect(25, GPIO.BOTH, callback=my_callback, bouncetime=200) raw_input("Enter zum Beenden!\n")
Ok sorry ich hoffe nun ist es besser. Zur Funktion: Wenn jemand klingelt signalisiert das meine Doorline durch eine blinkende LED. Dieses Signal wird über ein Relais genutzt um GPIO 25 low oder high zu schalten. Also low Verbindung über pullup an GND bzw High durch umschalten an 3,3V. Der Port wird nun im ca. Sekundentackt umgeschaltet von low nach high. Dieses Signal frage ich nun mit dem Code ab. das geht auch schon ich bekomme als Ausgabe :
25 Input was HIGH
25 Input was LOW
25 Input was LOW
25 Input was HIGH
25 Input was HIGH
25 Input was LOW
25 Input was LOW
25 Input was LOW
usw ca. 30 Sek. lang
Ich möchte nun den ersten Schaltvorgang auf LOW nutzen um den Code ab :
"def WebIf(command):" auszuführen.
Weiterhin sollte der Port permanent überwacht werden, heißt der event sollte weiterlaufen.Gruß
Frank
-
Hallo Forum,
nachdem mir schon mit meiner Schaltung erfolgreich geholfen worden ist, wende ich mich nun mit meinem code an euch, da ich nicht weiterkomme. Es geht darum, mit dem Signal meines Türöffners, ein Programm für die Webcam zu öffnen. Das Signal ist ursprünglich für eine blinkende LED gedacht. Ich füge einen kleinen Schaltplan an woraus ihr sehen könnt wie es geschaltet ist. Ursprünglich habe ich versucht über ein Shell Script den Gpio auszulesen, leider ohne Erfolg da das Blinksignal nicht ausgewertet werden konnte. Nun habe ich mich in python versucht, und die Abfrage von GPIO klappt nun gut, nur leider wird webif nicht ausgeführt .
#!/usr/bin/env python
# -*- coding: utf-8 -*-import RPi.GPIO as GPIO
GPIO.setwarnings(False)
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
import urllib2def my_callback(channel):
if GPIO.input(channel):
print("%s Input was HIGH"%channel)
else:
print("%s Input was LOW"%channel)
def WebIf(command):
try:
sock=urllib2.urlopen('http://192.168.11.100/web/' + command)
data=sock.read()
except urllib2.URLError:
pass
except urllib2.HTTPError:
pass
except urllib2.httplib.BadStatusLine:
pass
else:
sock.close()
return(data)WebIf('remotecontrol?command=399')
WebIf('remotecontrol?command=3')
WebIf('remotecontrol?command=403')
WebIf('remotecontrol?command=403')
WebIf('remotecontrol?command=403')
time.sleep(30)
GPIO.add_event_detect(25, GPIO.BOTH, callback=my_callback, bouncetime=200)raw_input("Enter zum Beenden!\n")
Der Teil "def WebIf(command):" wird nicht ausgeführt, hätte jemand einen Tipp was ich tun könnte ?