ich arbeite gerade an einem Projekt, um die Vorschubrate meiner CNC-Maschine zu steuern, da der Controller diese Funktion leider nicht von Haus aus unterstützt. Ich plane daher, eine eigene Lösung zu entwickeln, bei der ich einen Raspberry Pi Pico und ein Potentiometer verwende, um die Vorschubrate extern anzupassen.
Der Controller unterstützt die Anpassung der Vorschubrate über Tastatureingaben, wie zum Beispiel F11 für das Erhöhen und Verringern der Vorschubrate (+/-). Mein Ziel ist es, den Pico zu verwenden, um diese Tastaturbefehle zu simulieren. Der Pico soll Änderungen am Potentiometer erfassen (ich verwende ein 10K Ohm Potentiometer) und bei jeder Änderung von 1% sofort ein „+“ oder „-“ an den Controller senden. Wenn sich das Potentiometer nicht bewegt, soll natürlich auch nichts gesendet werden.
Ich habe dazu bereits Code geschrieben, komme aber leider nicht weiter, da dieser nicht zuverlässig läuft. Die Ausgabe entspricht nicht meinen Vorstellungen, da die Änderungen nicht präzise genug erkannt werden. Der Pico soll exakt auf jede 1%ige Änderung reagieren und sofort das entsprechende "+" oder "-" senden. Wenn keine Bewegung stattfindet, soll nichts gesendet werden.
Hier ist der Code, den ich bisher geschrieben habe. Ich würde mich sehr über Hilfe oder Vorschläge freuen, um die Genauigkeit und Zuverlässigkeit zu verbessern.
Vielen Dank schon mal für die Unterstützung!
Code: Alles auswählen
import time
import analogio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
import board
# Setup potentiometer for feedrate pin and HID keyboard
pot_feedrate = analogio.AnalogIn(board.GP26_A0) # Using only feedrate potentiometer
kbd = Keyboard(usb_hid.devices)
# Function to map potentiometer values to a percentage
def get_percentage(pin):
return (pin.value / 65535) * 100
# Parameters for adjustments
change_threshold = 2.4 # Sensitivity with a 2.4% deviation trigger
step_size = 2.4 # Adjustments made in 2.4% increments
debounce_time = 0.3 # Debounce time for avoiding rapid changes
dead_zone = 1.5 # Small dead zone to ignore small changes
feedrate_values = []
moving_average_length = 10
# Moving average calculation
def moving_average(values, new_value, length):
values.append(new_value)
if len(values) > length:
values.pop(0)
return sum(values) / len(values)
last_feedrate_time = time.monotonic()
while True:
# Read current value from potentiometer
current_feedrate = get_percentage(pot_feedrate)
# Calculate moving average
avg_feedrate = moving_average(feedrate_values, current_feedrate, moving_average_length)
# Output feedrate change only when it exceeds the change threshold
if abs(current_feedrate - avg_feedrate) > change_threshold:
steps = int((current_feedrate - avg_feedrate) / step_size)
if abs(current_feedrate - avg_feedrate) > dead_zone:
if current_feedrate > avg_feedrate:
print(f"Increasing feedrate by {steps * step_size:.2f}% +")
for _ in range(steps):
kbd.press(Keycode.KEYPAD_PLUS)
time.sleep(0.05)
kbd.release_all()
elif current_feedrate < avg_feedrate:
print(f"Decreasing feedrate by {abs(steps) * step_size:.2f}% -")
for _ in range(abs(steps)):
kbd.press(Keycode.KEYPAD_MINUS)
time.sleep(0.05)
kbd.release_all()
last_feedrate_time = time.monotonic()
# Debug output showing feedrate and average
if time.monotonic() - last_feedrate_time > debounce_time:
print(f"Feedrate: {current_feedrate:.2f}% (Avg: {avg_feedrate:.2f}%)")
last_feedrate_time = time.monotonic()
time.sleep(0.1)