Jump to content

Rotary Encoder rücksetzen


Recommended Posts

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

Link to comment
Share on other sites

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 by photron
Link to comment
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...