Re: schaltlogik entwickeln für 8-gang-schaltung
Verfasst: Dienstag 30. Juli 2019, 17:02
Du kannst ggf. auch noch mit nem RC-Filter entprellen. Aber prinzpiell sollte das schon gehen, auch mit preiswerten Schaltern.
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
#!/usr/bin/env python3
from functools import partial
from signal import pause
from gpiozero import Button, AngularServo
GEAR_CHANGE_SERVO_PIN = 15
GEAR_UP_PIN = 11
GEAR_DOWN_PIN = 9
GEAR_TO_ANGLE = [-90, -64.3, -38.6, -12.9, 12.8, 38.5, 64.2, 90]
def clamp(value, lower, upper):
return max(min(upper, value), lower)
class GearChange:
def __init__(self, gear_to_angle, servo_pin, gear_up_pin, gear_down_pin):
self._current_gear = 0
self._gear_to_angle = gear_to_angle
self._servo = AngularServo(
servo_pin,
initial_angle=self._gear_to_angle[self.current_gear],
min_angle=min(self._gear_to_angle),
max_angle=max(self._gear_to_angle),
min_pulse_width=0.0008,
max_pulse_width=0.0023,
)
self._gear_up_button = Button(gear_up_pin)
self._gear_up_button.when_pressed = partial(self.change, +1)
self._gear_down_button = Button(gear_down_pin)
self._gear_down_button.when_pressed = partial(self.change, -1)
@property
def gear_count(self):
return len(self._gear_to_angle)
@property
def current_gear(self):
return self._current_gear
@current_gear.setter
def current_gear(self, value):
self._current_gear = clamp(value, 0, self.gear_count - 1)
def change(self, direction):
self.current_gear += direction
self._servo.angle = self._gear_to_angle[self.current_gear]
def main():
lichtschalter = Button(26)
fernlichtschalter = Button(19)
blinkschalter_links = Button(13)
blinkschalter_rechts = Button(6)
hupe = Button(5)
_gear_change = GearChange(
GEAR_TO_ANGLE, GEAR_CHANGE_SERVO_PIN, GEAR_UP_PIN, GEAR_DOWN_PIN
)
pause()
if __name__ == '__main__':
main()
Code: Alles auswählen
#!/usr/bin/env python3
from functools import partial
from signal import pause
from gpiozero import Button, AngularServo, LED, PWMLED
GEAR_TO_ANGLE = [-90, -64.3, -38.6, -12.9, 12.8, 38.5, 64.2, 90]
STUFE_ZU_PWM = [0.0, 0.2,0.6,1]
current_gear = 0 # FIXME Globale Variable beseitigen.
led_startvalue = 0.2
def clamp(value, lower, upper):
return max(min(upper, value), lower)
def clamp2(value, lower, upper):
return max(min(upper, value), lower)
def shift(servo, direction):
global current_gear
current_gear = clamp(current_gear + direction, 0, len(GEAR_TO_ANGLE)-1)
servo.angle = GEAR_TO_ANGLE[current_gear]
def shift2(fahrlicht, direction):
global led_startvalue
led_startvalue = clamp2(led_startvalue + direction, 0, len(STUFE_ZU_PWM)-1)
led.angle = STUFE_ZU_PWM[led_startvalue]
def blinker_links():
blinker_links_led3.blink (on_time = 0.8, off_time = 0.2)
def blinker_rechts():
blinker_rechts_led4.blink (on_time = 0.8, off_time = 0.2)
def hupe_an():
hupen_led
def hupe_aus():
hupen_led
def main():
fahricht_hoch = Button(26)
fahrlicht_runter = Button(19)
blinkschalter_links = Button(13)
blinkschalter_rechts = Button(6)
hupenschalter = Button(5)
bremslichtschalter = Button(10)
gang_hochschalter = Button(11)
gang_runterschalter = Button(9)
blinker_links_led3 = LED (16)
blinker_rechts_led4 = LED (12)
hupen_led = LED(7)
fahrlicht = PWMLED(21,initial_pwm=STUFE_ZU_PWM[led_startvalue],
min_angle=min(STUFE_ZU_PWM),
max_angle=max(STUFE_ZU_PWM),
)
fernlicht = PWMLED(20,initial_value = led_startvalue)
servo = AngularServo(
25,
initial_angle=GEAR_TO_ANGLE[current_gear],
min_angle=min(GEAR_TO_ANGLE),
max_angle=max(GEAR_TO_ANGLE),
min_pulse_width=0.0008,
max_pulse_width=0.0023,
)
gang_hoch.when_pressed = partial(shift, servo, +1)
gang_runter.when_pressed = partial(shift, servo, -1)
fahrlicht_hoch.when_pressed = partial(shift2, fahrlicht, +1)
fahrlicht_runter.when_pressed = partial(shift2, fahrlicht, -1)
blinkschalter_links.when_pressed = blinker_links
blinkschalter_rechts.wehn_pressed = blinker_rechts
hupenschalter.when_pressed = hupe_an
hupenschalter.when_preleased = hupe_aus
pause()
if __name__ == '__main__':
main()