概要
接上回《Klipper上位机开发,通过实现修改printer实现对LED灯控制》,本文主要介绍如何在Console中输入G代码控制单片机。LED亮度的控制,这里我是通过参考官方写的fan.py实现的。
实现效果
这里的语言是英语,中文界面下Console则是控制台
在这里我们可以输入M106 S0-255来控制LED灯的亮度,这里我就演示了M106 S1和M106 S255这两个Gcode命令。
VID_20240709_115132
配置文件
[b]
pin: mcu:PE4
注意:klipper的PWM好似是规定了哪些引脚才能使用PWM,好像没有模拟PWM的类可以使用,这里我选择的是PE4。
源码部分
文件名:b.by
import time
FAN_MIN_TIME = 0.100
class GCODE_USE_TEST:
def __init__(self, config, default_shutdown_speed=0.):
self.printer = config.get_printer()
self.last_fan_value = 0.
self.last_fan_time = 0.
# Read config
self.max_power = config.getfloat('max_power', 1., above=0., maxval=1.)
self.kick_start_time = config.getfloat('kick_start_time', 0.1,
minval=0.)
self.off_below = config.getfloat('off_below', default=0.,
minval=0., maxval=1.)
cycle_time = config.getfloat('cycle_time', 0.010, above=0.)
hardware_pwm = config.getboolean('hardware_pwm', False)
shutdown_speed = config.getfloat(
'shutdown_speed', default_shutdown_speed, minval=0., maxval=1.)
# Setup pwm object
ppins = self.printer.lookup_object('pins')
self.mcu_fan = ppins.setup_pin('pwm', config.get('pin'))
self.mcu_fan.setup_max_duration(0.)
self.mcu_fan.setup_cycle_time(cycle_time, hardware_pwm)
shutdown_power = max(0., min(self.max_power, shutdown_speed))
self.mcu_fan.setup_start_value(0., shutdown_power)
self.enable_pin = None
enable_pin = config.get('enable_pin', None)
if enable_pin is not None:
self.enable_pin = ppins.setup_pin('digital_out', enable_pin)
self.enable_pin.setup_max_duration(0.)
# Register callbacks
self.printer.register_event_handler("gcode:request_restart",
self._handle_request_restart)
def get_mcu(self):
return self.mcu_fan.get_mcu()
def set_speed(self, print_time, value):
if value < self.off_below:
value = 0.
value = max(0., min(self.max_power, value * self.max_power))
if value == self.last_fan_value:
return
print_time = max(self.last_fan_time + FAN_MIN_TIME, print_time)
if self.enable_pin:
if value > 0 and self.last_fan_value == 0:
self.enable_pin.set_digital(print_time, 1)
elif value == 0 and self.last_fan_value > 0:
self.enable_pin.set_digital(print_time, 0)
if (value and value < self.max_power and self.kick_start_time
and (not self.last_fan_value or value - self.last_fan_value > .5)):
# Run fan at full speed for specified kick_start_time
self.mcu_fan.set_pwm(print_time, self.max_power)
print_time += self.kick_start_time
self.mcu_fan.set_pwm(print_time, value)
self.last_fan_time = print_time
self.last_fan_value = value
def set_speed_from_command(self, value):
toolhead = self.printer.lookup_object('toolhead')
toolhead.register_lookahead_callback((lambda pt:
self.set_speed(pt, value)))
def _handle_request_restart(self, print_time):
self.set_speed(print_time, 0.)
def breathe(self):
while True:
for i in range(2):
self.set_speed_from_command(i)
time.sleep(0.09)
for i in range(2,-1,-1):
self.set_speed_from_command(i)
time.sleep(0.09)
class PrinterGcodeTest:
def __init__(self, config):
self.fan = GCODE_USE_TEST(config)
# Register commands
gcode = config.get_printer().lookup_object('gcode')
gcode.register_command("M106", self.cmd_M106)
gcode.register_command("M107", self.cmd_M107)
def cmd_M106(self, gcmd):#这里是控制LED亮度的命令函数,范围为0-255
# Set fan speed
value = gcmd.get_float('S', 255., minval=0.) / 255.
self.fan.set_speed_from_command(value)
def cmd_M107(self, gcmd):#这里想实现呼吸灯的效果但是运行的效果却是一亮一没,还没有弄懂Klipper关于PWM的相关代码。。。这里还有研究一下
self.fan.breathe()
def load_config(config):
return PrinterGcodeTest(config)
小结
- klipper开发
请注意,以下是我个人的理解和见解,如有不对,欢迎指正。