openpnp - Warning - Unknown firmware
文章目录
- openpnp - Warning - Unknown firmware
- 概述
- 笔记
- https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares
- 备注
- END
openpnp - Warning - Unknown firmware
概述
接上飞达控制板后, 显示未知固件的警告

开始没看源码之前, 总以为是回答的版本号不合适, 就照着冰沙板子回的版本号来回固件版本. 还是有这个警告.
现在已经在使用自己编译出来的openpnp, 就想去看看这个警告咋来的.
笔记
判断是否有未知固件的函数为 findIssues()
D:\my_openpnp\openpnp_dev_2022_0801\src\main\java\org\openpnp\machine\reference\solutions\GcodeDriverSolutions.java
public void findIssues(Solutions solutions) {
// ...
if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("Smoothieware")) {firmware = (gcodeDriver.getFirmwareProperty("X-GRBL_MODE", "").contains("1"))? FirmwareType.SmoothiewareGrblSyntax : gcodeDriver.getFirmwareProperty("FIRMWARE_VERSION", "").contains("chmt-")?FirmwareType.SmoothiewareChmt : FirmwareType.Smoothieware;firmwareAxesCount = Integer.valueOf(gcodeDriver.getFirmwareProperty("X-AXES", "0"));if (firmware == FirmwareType.SmoothiewareChmt) {// OK, CHMT STM32 Smoothieware board. Take PAXES == 5 if missing (legacy build).firmwarePrimaryAxesCount = Integer.valueOf(gcodeDriver.getFirmwareProperty("X-PAXES", "5"));}else if (gcodeDriver.getFirmwareProperty("X-SOURCE_CODE_URL", "").contains("best-for-pnp")) {// OK, regular Smoothieboard with pnp firmware.firmwarePrimaryAxesCount = Integer.valueOf(gcodeDriver.getFirmwareProperty("X-PAXES", "3"));}else {solutions.add(new Solutions.PlainIssue(gcodeDriver, "There is a better Smoothieware firmware available. "+gcodeDriver.getDetectedFirmware(), "Please upgrade to the special PnP version. See info link.", Severity.Error, "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares#smoothieware"));}if (firmwarePrimaryAxesCount != null && firmwarePrimaryAxesCount != firmwareAxesCount) {solutions.add(new Solutions.PlainIssue(gcodeDriver, "Smoothieware firmware should be built with the PAXIS="+firmwareAxesCount+" option.", "Download up-to-date firmware optimized for OpenPnP, or if you build the firmware yourself, please use the `make AXIS="+firmwareAxesCount+" PAXIS="+firmwareAxesCount+"` command. See info link.", Severity.Warning, "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares#smoothieware"));}}else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("Duet")) {firmware = FirmwareType.Duet;String firmwareVersion = gcodeDriver.getFirmwareProperty("FIRMWARE_VERSION", "0.0");Integer major = null;Integer minor = null;try {Matcher matcher =Pattern.compile("(?<major>-?\\d+)\\.(?<minor>-?\\d+).*").matcher(firmwareVersion);matcher.matches();major = Integer.parseUnsignedInt(matcher.group("major"));minor = Integer.parseUnsignedInt(matcher.group("minor"));}catch (Exception e) {Logger.warn(e);}if (major == null || minor == null|| major < 3 || (major == 3 && minor < 3)) {solutions.add(new Solutions.PlainIssue(gcodeDriver,"Duet3D firmware was improved for OpenPnP, please use version 3.3beta or newer. Current version is "+firmwareVersion,"Get the new version through the linked web page.",Severity.Error,"https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares#duet"));}if (gcodeDriver.getConfiguredAxes() != null) {try {Matcher matcher =Pattern.compile(".*\\s(?<axes>-?\\d+)\\saxes\\svisible.*").matcher(gcodeDriver.getConfiguredAxes());matcher.matches();firmwareAxesCount = Integer.parseUnsignedInt(matcher.group("axes"));}catch (NumberFormatException e) {// ignore}if (gcodeDriver.getConfiguredAxes().contains("(r)")) {solutions.add(new Solutions.PlainIssue(gcodeDriver,"Axes should be configured as linear in feedrate calculations on the Duet controller. See the linked web page.","Use the M584 S0 option in your config.g file.",Severity.Error,"https://duet3d.dozuki.com/Wiki/Gcode#Section_M584_Set_drive_mapping"));}else {firmwarePrimaryAxesCount = firmwareAxesCount;}}}else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("Marlin")) {firmware = FirmwareType.Marlin;firmwareAxesCount = Integer.valueOf(gcodeDriver.getFirmwareProperty("AXIS_COUNT", "0"));if (firmwareAxesCount > 3) { firmwarePrimaryAxesCount = firmwareAxesCount;}else {solutions.add(new Solutions.PlainIssue(gcodeDriver, "Marlin firmware is not reporting support for rotation axes (A B C). "+gcodeDriver.getDetectedFirmware(), "Please upgrade the firmware and/or axis configuration. See the info link.", Severity.Error, "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares#marlin-20"));}}else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("TinyG")) {// Having a response already means we have a new firmware.firmware = FirmwareType.TinyG;}else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("Grbl")) {firmware = FirmwareType.Grbl;}else if (gcodeDriver.getFirmwareProperty("FIRMWARE_NAME", "").contains("GcodeServer")) {firmware = FirmwareType.Generic;}else { solutions.add(new Solutions.PlainIssue(gcodeDriver, "Unknown firmware. "+gcodeDriver.getDetectedFirmware(), "Check out firmwares known to be well supported. See info link.", Severity.Warning, "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares"));}// ...
}
看了判断是否为未知固件的实现, 明白了.
原来openpnp只支持几种御用固件, 其他的固件都是未知固件.
在代码中, 看到openpnp支持的御用固件如下:
Smoothieware
Duet
Marlin
TinyG
Grbl
GcodeServer
以前和一个同学讨论, 他问一个主板是否支持openpnp, 我当时现去查, 看到有个openpnp硬件项目拟采用那个主板, 才知道那个主板可以用做openpnp的主板.
现在看了代码就很清楚了, openpnp就支持有限的几种御用主板.
如果不是openpnp主板, 而是辅助用的飞达控制板, 出现这种未知固件的警告是不用担心的, 将这个警告禁止掉就行.
飞达控制板不涉及到openpnp硬件的运动位置, 只在固定位置送料, 这种只要送料控制好使就行.
下面是openpnp未知主板固件的提示信息
else { solutions.add(new Solutions.PlainIssue(gcodeDriver, "Unknown firmware. "+gcodeDriver.getDetectedFirmware(), "Check out firmwares known to be well supported. See info link.", Severity.Warning, "https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares"));}
看到给出了官方openpnp支持的主板固件的wiki连接.
看了一下, 知道了如果用于openpnp, 主板需要支持哪些特性(GCode)
https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares
主板固件支持异步GCode驱动和高级运动控制.
不过异步GCode驱动停危险的, 同步GCode驱动就够用了.
异步GCode驱动的官方wiki GcodeAsyncDriver
高级运动控制的官方wiki Advanced Motion Control
openpnp要求的主板关键特性:
- 支持M115命令, 用来向openpnp上报固件版本, 好让openpnp能判断固件.
- 必须支持除了X, Y, Z之外的附加轴(A, B, C)控制, 而且可以使多个轴的混合控制好使.
- 支持M114命令, 用来上报所有轴的位置.
- 支持G92命令, 用来让每个轴位置归零.
- 支持M400命令, 用来等待移动完成. 在移动完成之前, 通讯必须是阻塞的. (在M400之后, 可能会发送其他命令, 但是移动完成之前, 必须阻塞住, 不能执行后续的指令)
- 必须支持M204(加速度控制), M201.3(禁止加速)
- 最好内置GcodeServer控制器模拟器(可选), 用来和openpnp联调, 用来确定openpnp发送的指令能产生正确的动作和效果.
官方御用的主板和固件如下:
Duet3D => https://docs.duet3d.com/en/Duet3D_hardware/Hardware_overview
RepRapFirmware
只是固件, 板子支持多种, 没细看.
Smoothieware 官方特意说, 不支持中国同学做的山寨版冰沙, 不过都是吓唬人, 用起来挺好的.
冰沙有第三方出的新固件 => makr.zone: “Smoothieware: New Firmware for PnP”
Marlin 2.0
TinyG
备注
对换冰沙主板之外的板子, 不感兴趣. 因为都是钱和时间啊, 等以后时机到了, 再折腾其他主板.
END
相关文章:
openpnp - Warning - Unknown firmware
文章目录 openpnp - Warning - Unknown firmware概述笔记https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares备注END openpnp - Warning - Unknown firmware 概述 接上飞达控制板后, 显示未知固件的警告 开始没看源码之前, 总以为是回答的版本号不合适, …...
Android 中如何使用 App Links
1. 简介 什么是 App Links呢?App Links 是 Android 6.0 (API 级别23) 引入的新功能,它是基于 DeepLinking,允许应用自动处理网站的 URL,而无需提示用户启动相应的应用。 例如:如果你在手机浏览器中输入了某个网站&am…...
7 款好用的 PDF 密码删除工具
这是最佳 PDF 密码删除工具列表。该列表包括免费和付费软件。将要在线完成的所有事情都需要密码才能感到安全。数据传输也是如此。大多数数据是通过文件传输的,PDF有自己的标志。PDF是一种灵活的文件格式,因此也可以专业使用。 有多种PDF 编辑器软件&am…...
你一般什么时候会用到GPT?
GPT(Generative Pre-trained Transformer)是一种自然语言处理技术,它在各种领域和场景中都有广泛的应用。下面将详细介绍一些常见的情况,人们在这些情况下通常会使用GPT: 自然语言生成: GPT可以用于生成文本…...
YUV编码格式解析
YUV 颜色编码 YUV 颜色编码采用的是 明亮度 和 色度 来指定像素的颜色。 其中,Y 表示明亮度(Luminance、Luma),而 U 和 V 表示色度(Chrominance、Chroma)。 而色度又定义了颜色的两个方面:色…...
mysql-面试50题-5
一、查询数据 ymysql-面试50题-2-CSDN博客 二、问题 41.按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一 mysql> select student.SId as 学生编号,student.Sname as 学生姓名, -> TIMESTAMPDIFF(YEAR,student.Sage,CURDATE(…...
微服务初始和Nacos安装
一)初始微服务: 微服务是将一个大型的,单一的应用程序拆分成多个小型服务,每一个服务负责于特定的业务功能,并且可以通过网络来和其他服务进行通讯,是一个思想,将一个大的项目拆分成多个小的项目,多个小的项…...
YouTube博主数据信息资源
YouTube博主数据信息资源 🔥我是一位拥有10年编程经验的程序猿,为你带来一个全新的优质资源 🔍您是否在寻找最新、最活跃的YouTube博主数据,以助力你的项目、营销或研究? 我们的数据,您的优势:…...
算法通过村第十七关-贪心|黄金笔记|跳跃游戏
文章目录 前言跳跃游戏最短跳跃游戏总结 前言 提示:曾走过山,走过水,其实只是借助他们走过我的生命;我看着天,看着地,其实只是借助它们确定我的位置;我爱这她,爱着你,其实…...
【精选】VMware部署ESXI6.5 vCenter Server详解
VMware部署ESXI6.5 vCenter Server 一、ESXi主机介绍1、虚拟机的好处2、为什么要使用虚拟机 二、虚拟化服务器概述1、VSphere物理架构2、体系架构3、VMware vSphere 组件 三、ESXi安装环境1、安装步骤2、使用VMware新建ESXi主机3、初始环境安装 四、创建虚拟机五、安装部署VMwa…...
如何借助数据集更好的评估NLP模型的性能?
随着信息时代的迅猛发展,每天有无数文本、声音、图片和视频不断涌入互联网。如何从海量数据中提炼有意义信息成为学术界和工业界迫切需要解决的问题。在此背景下,自然语言处理(NLP)应运而生,成为人工智能领域最为活跃的…...
2023年腾讯云服务器地域节点选择指南(亲自整理)
腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置,如上海、广州和北京等地域,如何选择地域?腾讯云百科txybk.com建议地域选择遵循就近原则,用户距离轻量服务器地域越近,网络延迟越低,速度就越…...
华媒舍:日韩媒体发稿推广中8个关键因素帮助你实现突破
在当今经济全球化的时代背景下,日韩地域媒体影响力日益提高。对于需要在这一地区开展发稿推广的人来讲,掌握适度的思路和流程是十分重要的。下面我们就为大家介绍8个关键因素,以帮助你在日韩地域媒体发稿推广中实现突破。 1.科学研究行业在逐…...
Docker数据卷
目录 1.bind mount 2.docker managed volume 1.bind mount docker run -it --rm -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/passwd:/mnt/passwd:ro busybox 2.docker managed volume docker run -d --name web1 webserver:v3 docker inspect web1 cd/var/lib/doc…...
LightGBM 的完整解释 - 最快的梯度提升模型
文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的…...
Think-Queue3一直提示[Exception]redis扩展未安装
场景 tp6tq3实现的任务队列,使用redis作为数据驱动,目前是tp6可以正常使用redis了,但tq3不行,一直提示[Exception]redis扩展未安装。 解决思路 1.分析tq3源码 定位到是这一行出了问题 if (!extension_loaded(redis)) {throw n…...
Spring cloud教程Gateway服务网关
Spring cloud教程|Gateway服务网关 写在前面的话: 本笔记在参考网上视频以及博客的基础上,只做个人学习笔记,如有侵权,请联系删除,谢谢! Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,…...
【C++代码】爬楼梯,不同路径,整数拆分,不同搜索树,动态规划--代码随想录
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推…...
设计模式(单例模式、工厂模式及适配器模式、装饰器模式)
目录 0 、设计模式简介 一、单例模式 二、工厂模式 三、适配器模式 四、装饰器模式 0 、设计模式简介 设计模式可以分为以下三种: 创建型模式:用来描述 “如何创建对象”,它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、…...
为wget命令设置代理
使用-e参数 wget本身没有专门设置代理的命令行参数,但是有一个"-e"参数,可以在命令行上指定一个原本出现在".wgetrc"中的设置。于是可以变相在命令行上指定代理: -e, --executeCOMMAND 执行.wgetrc格式的命令 例如&…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
