Klipper上位机开发,通过Console控制LED亮度

概要

接上回《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开发

请注意,以下是我个人的理解和见解,如有不对,欢迎指正。

Klipper是一种开源的3D打印固件,它可以用于开发应用程序。 首先,我们需要了解Klipper的基本概念和功能。Klipper使用Python编写,并且其设计理念是将大部分运算任务离线计算,在主机上运行一个守护进程,并通过串口与3D打印机进行通信。这种设计使得Klipper具有高扩展性和灵活性,并且可以提供更高的打印速度和精度。 开发应用程序时,我们可以利用Klipper的插件系统来扩展其功能。Klipper的插件可以实现各种不同的功能,比如添加新的运动控制算法、优化印刷质量、增加新的打印机功能等。我们可以根据自己的需求选择已有的插件,也可以根据需要自行开发新的插件。 开发Klipper应用程序的主要步骤如下: 1. 确定需求:首先我们需要确定需要开发的功能和目标。比如,我们可能希望开发一个可以通过网络远程监控打印机状态的应用程序。 2. 编写插件:根据需求,我们可以编写一个Klipper插件来实现所需功能。插件可以通过Klipper提供的API来访问打印机状态信息,并可以通过WebSocket等方式将数据实时传输到应用程序中。 3. 开发应用程序:利用已有的网络编程框架(如Flask、Django等),我们可以开发一个用于监控打印机状态的Web应用程序。该应用程序可以通过与Klipper插件进行交互来获取打印机状态信息,并将其展示在Web界面上。 4. 测试和部署:在开发完成后,我们需要对应用程序进行测试,确保其功能和稳定性。之后,我们可以将应用程序部署到服务器上,然后用户只需通过浏览器访问该应用程序即可实现远程监控打印机状态的功能。 总之,通过Klipper的插件系统和灵活的设计,我们可以开发出各种应用程序来扩展3D打印机的功能和提升打印质量。无论是开发远程监控应用,还是开发其他更加复杂的功能,都可以通过Klipper的开放性来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值