Paul Geschrieben March 19, 2012 at 11:18 Geschrieben March 19, 2012 at 11:18 Moin, ich versuche gerade mit dem IO Bricklet und einem angeschlossenen Mikroschalter eine Funktion auszulösen. In diesem Fall soll der Wert des Rotary Bricklets ausgelesen werden und als Schrittwert für den Schrittmotor verwendet werden. Den Wert des Rotary Bricklets als Schrittanzahl zu verwenden ist nicht das Problem (das läuft auch schon), aber wie verwende ich den Interrupt des IO Bricklets um beim drücken des Schalters den Motor die angegebene Anzahl an Schritten laufen zu lassen? Oder als einfacheres Beispiel, eine LED anschalten. Ich bin noch neu in Sachen programmieren, bisher nur reines Bash Scripting, und wollte mich mal an Python wagen. Gruß, Paul PS: den Interrupt auslesen (per Callback) hab ich auch drin, aber was mache ich mit dem String, den ich dadurch bekomme, bzw wie wird der weiter verarbeitet? Ich vermute mal, dass die Lösung total einfach sein wird, ich nur mal wieder außenrumdenke Zitieren
borg Geschrieben March 19, 2012 at 14:24 Geschrieben March 19, 2012 at 14:24 Naja, dafür musst du die Schrittanzahl die beim Poti eingestellt wird zwischenspeichern und sobald du den Callback bekommst den Wert mit set_steps setzen. Zitieren
Paul Geschrieben March 19, 2012 at 14:48 Autor Geschrieben March 19, 2012 at 14:48 Den Wert gespeichert habe ich und ich fahr den Schrittmotor auch mit dem Poti (nur ohne Schalter). Nur wie verarbeite ich dass, was ich vom IO Bricklet gemeldet bekomme (also das der Schalter gedrückt wurde), da stehe ich dezent auf dem Schlauch. Als Rückmeldung habe ich diesen (aus dem Kopf) b110110 bzw b110111 Wert. Muss ich dafür "while wert = b110110: fahr den Motor"-Schleife bauen, oder denke ich da in die komplett falsche Richtung? Oder muss ich da einen Callback auf den Port des IO Bricklets setzen? Mit einem io.register_callback(io.CALLBACK_INTERRUPT, cb_interrupt) werden ja alle interrupts verarbeitet (es wird die Funktion cb_interrupt aufgerufen). So weit ich das verstehe, reagiert dieser Callback aber immer, wenn irgend ein Interrupt auftritt. Bei mehreren Schaltern würde dann immer der selbe interrupt/funktion aufgerufen werden, wie trenne ich das? aka interrupt auf port a2 = func1 und interrupt auf port a4 = func2. Hoffe das war verständlich Zitieren
borg Geschrieben March 19, 2012 at 15:59 Geschrieben March 19, 2012 at 15:59 Überprüfen welchen Interrupt du bekommen hast kannst du mit dem binären &, z.B.: if value & (1 << 5): # hier code für pin 5 = high if value & (1 << 0): # hier code für pin 0 = high # ... Ansonsten, ist mir noch nicht klar was du machen möchtest. Soll der Motor so lange fahren wie du den Knopf drückst? Dann würde ich machen # Schalter an Pin 5 if value & (1 << 5): stepper.drive_forward() else: stepper.stop() Wenn du pro Knopf drücken x Schritte fahren willst: # Schalter an Pin 5 if value & (1 << 5): stepper.set_steps(x) Zitieren
Paul Geschrieben March 22, 2012 at 11:59 Autor Geschrieben March 22, 2012 at 11:59 Hallo borg, danke für deine Tipps. Leider komme ich auf kein konsistentes Ergebnis. Ich habe mal, um das IO Bricklet zu testen, alle Ports der a Seite als Pullup (io.set_port_configuration('a', 0xFF, 'i', True)) und als Interrupt (io.set_port_interrupt('a', 0xFF)) konfiguriert und lasse mir das Ergebnis per Callback anzeigen (euer example_interrupt.py). Ausgelöst wird der Callback aber nur seeeehr sporadisch, mal am Anfang ein mal und dann erstmal nicht, auch wenn ich andere Ports gegen GND kurzschließe. Von ca 100 Schaltungen werden mir 5-10 angezeigt. Unter Windows funktioniert das gar nicht, da wird mir ein Interrupt ausgegeben, wenn ich das Programm schließe... Wenn ich nur den Example Code laufen lasse, bekomme ich überhaupt keinen Callback zustande... Hast du eine Idee? Der Code: https://pastee.org/gtnxq Zitieren
Paul Geschrieben March 22, 2012 at 12:41 Autor Geschrieben March 22, 2012 at 12:41 Hab zum Test eine Schleife laufen lassen (nur io.set_port_configuration('a', 0xFF, 'i', True) gesetzt) um die Werte dauerhaft zu überprüfen while True: port=io.get:port('a') print port Unter Windows (7 64bit, Python 2.7.2 32bit) gibt es das erwartete Ergebnis, wenn ich keinen Port kurzschließe, bleibt der Wert auf 255 und verändert sich entsprechend der Schaltung. Unter Linux (Ubuntu 12.04 beta 64bit, Python 2.7.3rc1) verändert sich der Wert willkürlich nach kurzer Zeit auf 0, 128, 1, 32, 96, ... plus Veränderungen durch Port Schaltungen. Ich werde mir mal die letzte Stable von Ubuntu installieren, nicht dass mir da Beta "Features" dazwischen funken. Nachtrag: mit Ubuntu 11.10 32bit gibts keine Probleme mit den geschilderten Symptomen. Komm aber heute leider nicht mehr zum testen, alles weitere werde ich mir morgen anschauen. Zitieren
borg Geschrieben March 22, 2012 at 22:31 Geschrieben March 22, 2012 at 22:31 Bei mir funktioniert der Source Code hier: https://pastee.org/gtnxq sowohl unter Linux (Ubuntu 11.10) als auch unter Windows 7 ohne Probleme. Hast du die IO16 schon auf die neueste Firmware geupdatet? Hab da vor kurzem eine Kleinigkeit hinzugefügt, siehe hier: http://www.tinkerunity.org/forum/index.php/topic,188.0.html (das kann aber eigentlich nichts mit deinen Problemen zu tun haben) Funktioniert das denn im Brick Viewer? Einfach starten und auf die Knöpfe drücken, der konfiguriert dafür standardmäßig genau richtig. Welche Version haben deine Python Bindings? http://download.tinkerforge.com/bindings/python/ Zitieren
Paul Geschrieben March 22, 2012 at 22:41 Autor Geschrieben March 22, 2012 at 22:41 Die Firmware habe ich am letzten Wochenende auf allen Bricks und Bricklets aktualisiert und die Bindings auch am Wochenende runtergeladen. Unter Ubuntu Stable läuft auch der Brickviewer und auch mein Code läuft dort. Ich bin mir sicher, dass die Beta Version von Ubuntu an den Problemen Schuld war. Ich werde mir das morgen Abend bzw am kommenden Wochenende noch genauer anschauen, aber ein kurzer Test vorhin sah schon vielversprechender aus. Das einzige Problem, ist jetzt noch unter Windows, dass dort die Interrupts bzw Callbacks nicht richtig zurück gegeben werden. Das werde ich aber auch nochmal genauer mit dem neuen Ubuntu vergleichen und dann nochmal detailliert darüber berichten. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.