Jump to content

IO Bricklet


Paul

Recommended Posts

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 ;)

Link zu diesem Kommentar
Share on other sites

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 ;)

Link zu diesem Kommentar
Share on other sites

Ü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)

Link zu diesem Kommentar
Share on other sites

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

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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/

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...