Malik Posted April 17, 2020 at 04:10 PM Posted April 17, 2020 at 04:10 PM Bei meinem jetzigen Projekt bin ich über folgendes gestolpert: Ich lese Werte vom Rotary Encoder ein, die zwischen 0 und 1280 liegen sollen. Wenn ich den Encoder aber weiter drehe (positiv oder negativ), zählt es intern weiter. Also wenn ich nach meinem Einlesen von "0" negativ weiter drehe, kommt bei der ersten Umdrehung Richtung "1" gar nichts. Ich muss drehen, bis der interne Count wieder bei "0" ist. Leider gibt es den Befehl "set_count" nicht, um bei meiner unteren oder oberen Grenze stehen zu bleiben. Irgendeine Idee, wie man (nach zehn negativen Umdrehungen) bei der ersten positiven Umdrehung wieder bei "0" anfängt? Danke Malik Quote
photron Posted April 17, 2020 at 04:31 PM Posted April 17, 2020 at 04:31 PM (edited) Dazu nimmst du nicht den Wert selbst, sondern nimmst den aktuellen Wert, ziehst davon den letzte Wert ab. Das Ergebnis davon addierst du dann zu deinem beschränkten Wert und beschränkst den beschränkten Wert dann wieder... hm, ziemlich beschränkt. Versteht wahrscheinlich so keiner. Hier ein Python Beispiel: #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID = "XYZ" # Change XYZ to the UID of your Rotary Encoder Bricklet 2.0 from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_rotary_encoder_v2 import BrickletRotaryEncoderV2 UPPER_LIMIT = 10 LOWER_LIMIT = -10 last_count = None limited_count = None # Callback function for count callback def cb_count(count): global last_count global limited_count if last_count == None: last_count = count if limited_count == None: limited_count = count limited_count = min(max(limited_count + count - last_count, LOWER_LIMIT), UPPER_LIMIT) last_count = count print("Count: " + str(count)) print("Limited Count: " + str(limited_count)) print("") if __name__ == "__main__": ipcon = IPConnection() # Create IP connection re = BrickletRotaryEncoderV2(UID, ipcon) # Create device object ipcon.connect(HOST, PORT) # Connect to brickd # Don't use device before ipcon is connected # Register count callback to function cb_count re.register_callback(re.CALLBACK_COUNT, cb_count) # Set period for count callback to 50ms without a threshold re.set_count_callback_configuration(50, True, "x", 0, 0) input("Press key to exit\n") # Use raw_input() in Python 2 ipcon.disconnect() Die limited_count Variable hält den Zählerwert, der hier zwischen -10 und +10 beschränkt wird. Auf limited_count wird jeweils die Änderung des eigentlichen Zählerwerts des Rotary Encoders addiert. Dadurch bleibt limited_count zwischen -10 und +10, reagiert aber wie gewünscht auf alle Änderungen von count, dabei spielt der eigentliche Wert von count keine Rolle, sondern nur dessen Änderungen. Edited April 20, 2020 at 11:43 AM by photron Quote
Malik Posted April 20, 2020 at 09:40 AM Author Posted April 20, 2020 at 09:40 AM Danke für die ausführliche Antwort, photron! Ich hatte ein wenig gehofft, dass es eine "elegantere" Lösung gibt... Trotzdem: Es funktioniert ja, Problem gelöst. Quote
photron Posted April 20, 2020 at 11:46 AM Posted April 20, 2020 at 11:46 AM Ich habe das Beispiel noch mal angepasst, damit zwischendrin der limited_count nicht außerhalb des erlaubten Bereichs liegen kann. Quote
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.