Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
encoder.py 2.29 KiB
import RPi.GPIO as GPIO
import time
import math

GPIO.setmode(GPIO.BCM)
print(GPIO.VERSION)

class Encoder:

    def __init__(self, name, encoder_pin: int):
        # Initialize some stuff
        global pulse_count, start_time, time_passed, old_time_passed, old_pulse_count
        self.name = name
        self.encoder_pin = encoder_pin
        pulse_count = 0
        start_time = time.time()
        time_passed = 0
        old_time_passed = 0
        old_pulse_count = 0

        GPIO.setup(self.encoder_pin, GPIO.IN, GPIO.PUD_DOWN)

    def callback_encoder(self, channel):
        # Interrupt handler, increases pulse_count and updates time
        global pulse_count, start_time, time_passed
        time_passed = time.time() - start_time
        pulse_count += 1

    def get_pulse_count(self) -> int:
        # return pulse_count
        global pulse_count
        return pulse_count

    def reset_pulse_count(self):
        # reset pulse_count
        global pulse_count
        pulse_count = 0

    def reset_time(self):
        # reset time_passed and start_time
        global time_passed, start_time
        time_passed = 0
        start_time = time.time()

    def get_current_pulse_speed(self) -> float:
        # Get average speed since last call in pulses/s
        global pulse_count, time_passed, old_time_passed, old_pulse_count
        if (time_passed - old_time_passed):
            speed = (pulse_count - old_pulse_count) / (time_passed - old_time_passed)
        else:
            speed = 0
        old_pulse_count = pulse_count
        old_time_passed = time_passed
        return speed

    def get_speed(self) -> float:
        # Convert pulse speed to cm/s
        pulse_per_second = self.get_current_pulse_speed()
        return pulse_per_second * (6 * 2 * math.pi) / 40

    def init_callback(self):
        # Initialize the interrupt
        GPIO.add_event_detect(self.encoder_pin, GPIO.BOTH, callback=self.callback_encoder, bouncetime=10)

# try:
#     encoder1 = Encoder(name="encoder1", encoder_pin=4)
#     encoder1.init_callback()
#     while True:
#         print(encoder1.get_pulse_count())
#         print(encoder1.get_speed())
#         time.sleep(1)
# except KeyboardInterrupt:  # Exit by pressing CTRL + C
#     GPIO.cleanup()
#     print("Measurement stopped by User")
# finally:
#     GPIO.cleanup()