惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
D
Docker
N
Netflix TechBlog - Medium
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
宝玉的分享
宝玉的分享
美团技术团队
P
Proofpoint News Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
G
Google Developers Blog
腾讯CDC
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
L
LINUX DO - 最新话题
O
OpenAI News
博客园 - 司徒正美
Google Online Security Blog
Google Online Security Blog
H
Hacker News: Front Page
博客园 - 聂微东
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Project Zero
Project Zero
Vercel News
Vercel News
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Check Point Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
A
Arctic Wolf
Microsoft Security Blog
Microsoft Security Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Forbes - Security
Forbes - Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs
T
Tor Project blog
D
DataBreaches.Net
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Spread Privacy
Spread Privacy
W
WeLiveSecurity
V2EX - 技术
V2EX - 技术
Simon Willison's Weblog
Simon Willison's Weblog
AI
AI
Security Latest
Security Latest
S
Securelist

机核

游戏性能旗舰最强之选,一加 Ace 6 至尊版国补到手价2999元起 6元钱自己更换电动车刹车线 《生化危机9:安魂曲》编剧Haris Orkin专访 摸金游戏?音乐游戏!暗区新赛季这把能弹的琴有何来历? 好评国产武侠SRPG《息风谷战略》免费DLC现已推出 | 机核 GCORES 碎片 《生化危机:安魂曲》将于5月实装首个免费更新内容 | 机核 GCORES 新锐东方游戏,谱写世界新章! 沉浸式恋爱视觉小说游戏《心象演算》免费试玩版现已正式上线 | 机核 GCORES 互动影游《代号三国:龙起》上线!穿越三国与曹操并肩、与佳人同行、与权谋博弈! 《老头收集梦想生活》,游戏酒桌会6,录音笔VOL.689 | 机核 GCORES 破界·共生——《白日梦:无限世界》五大核心游戏特点解析 价格已到史低,锐龙5 9600X/锐龙7 9700X正适合抄底 时间循环之旅即刻启程!《归环》一周目测试今日开启 热门在线韩游变魂游,洛奇衍生作能否打破“花瓶”魔咒? LG UltraGear evo 全新高端显示器系列:当“5K”遇见“AI”,不止强大,更懂热爱 反套路三国互动影游《代号三国:龙起》今日上线! 愿望单登记人数突破10万!备受瞩目的“女儿养成游戏” 《梦幻魔法公主》今日于Steam平台上线!限时八折优惠中 《黑神话:悟空》全球音乐会2026巡演将于4月29日12时开票 | 机核 GCORES “Snowguelike”生存肉鸽挖矿新作《蛙穿雪境》公布发售日期,5月7日正式上线 | 机核 GCORES 重塑移动办公、AI创作新境!全新华硕灵耀Air系列、ProArt 骁龙版震撼首发,创芯未来 均分88:《Saros》媒体评分汇总 | 机核 GCORES 上海烛龙公布合作遗迹探险游戏《吉时已到》首支预告片 | 机核 GCORES 首个独立游戏《萝薇日记》已上线Steam! 烛龙新IP《吉时已到》首曝,打造国内首款中式合作遗迹探险游戏 喜加一:《暗黑破坏神Ⅳ》国服现已开启限时免费领取本体活动 | 机核 GCORES 新版《生化危机》电影定于9月18日上映,官方网站现已上线 | 机核 GCORES 《冲就完事模拟器2》“星球大战”联动DLC正式宣布 | 机核 GCORES SteamController将于5月4日发售,售价99美元 | 机核 GCORES 事已至此,内存这么用也算省钱了,“2+1”非对称双通道应用实测 505游戏母公司现已收购《明末:渊虚之羽》IP | 机核 GCORES 基石 手动杂谈12|格斗游戏也能讲好故事 | 机核 GCORES I Love You Mr Snowball 我的向日葵小姐 会比GTA6先发售吗?最硬核的生存游戏《DAYZ》要推新DLC了 周记02:在2026遇到新怪谈 什么硬件,能让游戏Loading界面快速消失? | 机核 GCORES GadioSpec《百年风云世界杯》免费试听集 | 机核 GCORES 百年风云世界杯Vol.1丨足球崛起 | 机核 GCORES 100年前,一群人提前替我们经历了AI恐惧 | 机核 GCORES 《呼啸山庄》2026 ——一辆当代艺术的大卡车冲撞了我的大脑 手游《天穗之咲稻姬:日之香巡灵传》宣布将于7月27日停服 | 机核 GCORES 集结梦之队,征战世界杯,《最佳球会ONLINE》上线Steam 山水绝景随心拼 休闲建造游戏《千里山河录》Steam商店页公开 巫师帽、法袍、魔杖,为什么它们是影视、游戏里的法师必备三件套? 《无鞘信使》-第一章 复古风自动战斗肉鸽《终结之终结》Steam商店页面现已上线 电脑里有一款不破不立的MMO,录音笔VOL.688 | 机核 GCORES 《生化危机》30周年纪念周边发售,这次是真的“保护伞” 可靠耐用+AI全能,惠普战66 2025锐龙版深度体验 《时之书:无尽终章》关卡“大航海时代”全球首次公开 经典名作《乌龙派出所》改编经营模拟游戏《乌龙派出所~阿两的商店街物语~》正式宣布支持简体中文 明日开冲,解锁反套路三国互动影游《代号三国:龙起》即将上线 独立游戏《这是我的宝藏!》已发售~ 降低难度不是唯一解,无压力死亡也是好体验 Netflix官宣新片《普通人》:讲述韩国现代史上的权力风暴 《生化危机:安魂曲》全球销量现已突破700万份 《绝地鸭卫》PC版5月15日正式发售 亡妻回忆录?女性向情感叙事游戏《S-mail》现已正式发售 全新酷黑风格,酷睿Ultra 200S PLUS的高性价比搭档!七彩虹BATTLE-AX B860M-PLUS S WIFI7 V20 超级黑刃主板测评 胖狗 索尼发布了港台地区PS5产品价格调整公告,将于5月1日起实施 二次元怪猎+性感美女!《碧蓝幻想:无尽黄昏》开启Beta公测 这款怪谈类型中式恐怖游戏居然更新了?! 《百日战纪 -最终防卫学园-》改编漫画将于今年冬季开启连载 《如被附身,请致电我们》:匈牙利黑色幽默恐怖小说 《竹屿山房杂部卷五》(译文) 大树 超越引擎 摄影分享丨四月 碎片杂记vol.72 当老式FPS与老式动画技术碰撞出新时代的火花—《神探杰克鼠》 想做独游,如何避免首个项目就褒姒? 在线多人动作游戏《OCTOPinbs》将于5月12日上线Steam! 《酒鬼女神的酒诡》确定将于2026年登陆Steam 《CRYMELIGHT》将于11月5日(周四)正式发售!4月25日开始预购! 钢铁国度MKI部落Evolution,蛮兵部分 【钢铁国度】部落-Primal MK I,蛮兵部分 这是一个高中生用ai跑出来的作品,我自称他为物理神话 钢铁国度MKI部落Metamorphosis,蛮兵部分上 钢铁国度MKI部落Metamorphosis,蛮兵部分下 INDIE Live Expo于4月25日举办:首发9款新作,超200款独立游戏亮相 暗黑卡牌策略新作《魔忌:穷鼠啮狸》发布全新中文试玩版和发售预告片,4月30日正式上线在即 战锤40K长篇小说:变节者・苦难主宰(三)(全书完) 战锤40K长篇小说:变节者・苦难主宰(二) 战锤40K长篇小说:变节者・苦难主宰(一) 英语语言学习丨短语专题1:短语的特点 唯一的EVE战争 【少前同人】【M200】战术人形会梦见音乐会吗 【昏迷3】即将发售,前作主角悉数到场!“恶灵”宋老师化身可操控角色 业内人士:游戏公司“十有八九”使用生成式AI,包括卡普空 欢庆一周年:《光与影:33号远征队》全新纪念艺术图、超值折扣与免费更新同步上线 才刚刚开始呢 【抽奖】《星际卡车司机》推出免费大型更新,四折平史低折扣进行中 四人合作FPS游戏《佣兵猎手》抢先体验重大更新 1 现已上线 Raw Fury新作《深馅地牢 Deep Dish Dungeon》将于今秋加入 XGP 塔防幸存者游戏《魔怪来袭》推出首个 DLC 《饿狼传说:群狼之城》1周年纪念!新DLC“沃尔夫冈·克劳萨”今日参战 猫狗相伴 欢乐闯关 双人合作平台跳跃游戏《猫狗同行》上线Steam商店页 《同行:月球逃脱》(Together: Moon Escape)上线将于明日上线Steam
浅析3D打印机原理
ArnoSolo · 2022-03-21 · via 机核

大家好,我是阿诺。今天将通过实现一个3D打印机固件,来理解3D打印机是如何工作的。

开发环境

  • 开发框架

  • Arduino

  • 主控芯片

  • 主板

  • 电机驱动

  • X TMC2008

  • Y TMC2008

  • Z A4988

  • E TMC2225

  • 显示器

  • 暂未实现,通过串口交互

  • 机身

G代码解析

本节的要求是将 G1 X2.4 Y5.6 这样的字符串转换 gcode对象,完成即可进入下一节。

  • 最常见G代码 G1 F200 X2 Y4 ; 移动到(2,4,0) 速度为200mm/min G28 X0 Y0 ; move X/Y to min endstops M104 S200 ; 热端升温到200℃ G代码详解: marlin

  • gcode对象示例 gcode.cmdtype = 'G'; gcode.cmdnum = 1; gcode.X = 2.4; gcode.Y = 5.6; gcode.hasX = true; gcode.hasY = true;

SD卡

正常来说,我们需要配置SPI以使用SD卡,但是由于我们的开发框架是Arduino,且我们的芯片是mega2560,所以我们可以直接使用Arduino SD库。我们唯一需要做的就是在主板原理图中找到SD卡的CS引脚(chip select),并调用SD.begin(csPin)

温度控制

本节要求是可以将热端温度控制在200℃。

具体来说就是要创建一个hotend对象,它将拥有一下几个功能:

hotend.setTargetTemp(200); // 设定目标温度为200℃ hotend.readTemp(); // 读取当前温度 hotend.update(); // 以更新MOS管的开关时间

而后创建一个每200ms执行一次的中断服务函数,每次中断执行一次hotend.update()。(定时器初始化放在Heater::init中)

其中Heater类的实现在module/Heater.cpp,中断服务函数在main.cpp

这里主要需要讲的是PID控制器几个参数的含义(虽然它们名字听上去很复杂,但是其实只是简单的加减乘除):

  • 控制器输出值

  • 一个0~255的数, 125表示加热器功率设为50%

  • Error

  • 当前温度150℃, 目标温度200℃, 则偏差值为50

  • Proportion 比例 p = kp * err;

  • 假设当前温度150℃, 目标温度200℃, kp值为1.0, 则p项=50. 加热器功率设为(50/255)=20%

  • 有了这一项就能控制温度. 但是只有这一项, 可能加到170℃温度就加不上去了, 因为这时候加热器功率只有12%, 正好加热器向空气中散发的热量也是这个功率. 这种现象被称为稳态误差.

  • Integration 积分 pidIntegral += err; i = ki * pidIntegral;

  • i项可以解决只有p项时出现的稳态误差. 假设ki为0.5, 那么当加到170℃温度就加不上去时, pidIntegral每200ms就会增加30, i项每200ms就会增加15, 加热器功率每200ms就会增加(15/255)=6%, 如此假以时日, 温度自然就上去了.

  • Differentiation 微分 d = kd * (err - pidPrevErr);

  • 你可能会说,按我这个说法,那只要有p项i项就能实现温度控制了。确实如此,如果你发现有了p项i项就能很好的控制温度的话,那完全可以把ki设成0。但是如果我们想要防止温度变化过快的话,那么可以试试加上d项。因为假设目标温度为200℃,kd为1。如果上一个周期温度为170℃,这一个周期温度为190℃,那么d项就是20。而如果上一个周期温度为170℃,这一个周期温度还是170℃,那么d项就是0。可以说d项这家伙就是讨厌变化。这在到达目标温度后,防止温度快速滑落很有用,因为上文不是提到了嘛, i项需要“假以时日”,p项则在快到目标温度时萎靡不振。

电机控制

这一节的要求能够控制步进电机正反转。

具体来说,就是需要实现motor对象的以下方法

motor.enable(); motor.setDir(1); // 设定电机转动方向 motor.moveOneStep();

A4988

我们将使用A4988模块来控制步进电机,下面给出A4988的原理图:

  1. VMOT 接8v~35v直流电源,需要在VMOTGND间布置一个100uf的电容,以快速响应电机的电能需求。

  2. 1A 1B 接第一个线圈

  3. 2A 2B 接第二个线圈

  4. VDD 接MCU电源

  5. DIR 方向控制引脚,接MCU输出,高低电平分别代表一个转动方向

  6. STEP 一个方波电机运动一次,如果设置步进细分为1,则运动一次一步进,一次步进为1.8°,200步可以转一圈

  7. MS1 MS2 MS3 对步进进行细分,至多可以将一步进细分为16次运动

  1. ENABLE 接低电平模块开始工作,接高电平则模块关机悬空则模块工作

  2. SLEEP 接低电平则电机断电,用手拧可以自由转动。接高电平则电机工作。

  3. RESET 默认悬空。收到低电平时,重置模块。如果不打算控制这个引脚,则应该将其连接到SLEEP引脚以设置为高电平。

所以使用A4988控制电机一共有4步,具体实现在module/Stepper.cpp

  1. 接线。前往注意不要装反了,装反了模块会烧掉。

  2. 设置enable引脚为低电平以激活模块

  3. 设置dir引脚以设置方向

  4. step引脚发射脉冲以要求电机运动

轴步数

现在我们知道了如何经由A4988控制电机,但是电机转一步(step),打印头到底走多少距离(mm)呢?

  • 同步轮与皮带 以2GT,20齿的同步轮为例。2GT的意思是走一个齿皮带运动2mm,那么如果同步轮有20齿,转一圈皮带走40mm。而如果我们电机驱动采用16细分,那么步进电机一圈就是3200步。 轴步数 = 3200steps / 40mm = 80steps/mm 所以如果我们使用i3的结构,希望打印头在x轴正方向上前进10mm,那么就需要MCU向A4988发射 3200 * 10 = 32000 个脉冲。

  • 丝杆 以螺距2mm,导程8mm的丝杆为例。导程的意思是丝杆转一圈所行走的直线距离。所以 轴步数 = 3200steps / 8mm = 400steps/mm 所以如果我们使用i3的结构,希望打印头在z轴正方向上前进10mm,那么就需要MCU向A4988发射 3200 * 400 = 1,280,000 个脉冲

限位开关

打印机每次开机都需要寻找零点,想要归零的话,除了需要了解如何驱动电机外,还需要了解限位开关的原理。我们将需要实现以下方法:

xMin.isTriggered() // 开关被按下则返回true

限位开关有三个引脚分别是常开,常闭,公共端。相应的就有了两种工作模式常开常闭。这里我们选择常闭。于是通过读取MCU引脚电平高低即可实现判断,具体实现在module/Endstop.cpp

限位开关状态电路通断MCU引脚电平未触发通低触发断高。

运动控制

这一节的目标是串口输入 G1 F1000 X6 Y3 热端将到达指定坐标点(6,3,0)。

如何使得轨迹看起来显示一条直线?

假设我们的起始点为(0,0) 那么走到(6, 3)就需要要求 X电机走(6 x 80)步,Y电机走(3 x 80)步。 我们当然可以要求X电机先走,Y电机后走,也能到达目的地,但是画出来的线与理想的线段可就有相当的差距了。或者我们可以先画出理想线段,然后在它的附近画线。

可是这该怎么实现呢?这个问题前人已经想好了,还给它起了个名字叫Bresenham算法。具体来说就是既然X方向需要走480步,Y方向需要走240步,那么就相当于总共要走480次,X方向每次前进一步,Y方向每2次前进一步。这480次运动事件,每一次被称为一个step event。总的次数叫做step event count,它的值就是X,Y中的较大值。

// module/Planner.cpp - planBufferLine block.stepEventCount = getMax(block.steps); ​ // main.cpp - motion control isr motorX.deltaError = -(curBlock->stepEventCount / 2); motorY.deltaError = motorX.deltaError; ​ motorX.deltaError += curBlock->steps.x; if (motorX.deltaError > 0) { motorX.moveOneStep(); motorX.deltaError -= curBlock->stepEventCount; } ​ motorY.deltaError += curBlock->steps.y; if (motorY.deltaError > 0) { motorY.moveOneStep(); motorY.posInSteps += curBlock->dir.y; motorY.deltaError -= curBlock->stepEventCount; }

注意实现:

不要使用浮点数来计算步数,因为会导致失步。

多个运动指令

上文我们实现了如何执行一条G1指令。那么多条指令该怎么办呢?

我们可以将一个包含了每个电机运动多少步,向那个方向运动的对象放入一个队列(queue)中。需要的时候再从队列中取出。

  • block typedef struct { volatile bool isBusy; volatile bool isReady; volatile bool isDone; bool needRecalculate; uint32_t id; ​ double distance; // mm double stepsPerMm; // steps/mm int8_xyze_t dir; // -1 or 1 int32_xyze_t startStep; // mm uint32_xyze_t steps; // steps uint32_t stepEventCount; // steps uint32_t stepEventCompleted; // steps uint32_t accelerateUntil; uint32_t decelerateAfter; double entrySpeed; // mm/s double exitSpeed; // mm/s double nominalSpeed; // mm/s uint32_t entryRate; // steps/s uint32_t exitRate; // steps/s uint32_t nominalRate; // steps/s uint32_t speedRate; // steps/s ​ double acceleration; // steps/sec^2 uint32_t accelerateRate; // steps/sec^2 } block_t;

速度控制

使用定时器中断的时间来控制打印头前进的速度。

比如我们希望速度是1000steps/s,那么定时器就需要每1ms产生一次,同时在中断服务函数中执行一次步进事件(step event)。

如果我们需要改变速度,则可以在中断服务函数中设定触发中断的计数器值。不过我们现在可以暂时把它设置成匀速。

速度衔接

这一节的目标是计算两运动线段的衔接速度,而后计算出每个运动线段何时加速何时减速。

其实做好上面的步骤,把移动速度设置成匀速,打印机就能用了。但是我们还是能够通过适当的改变移动速度来使得打印机的打印速度有适当的提高。

梯形加速

上文提到我们可以通过改变中断时间来改变速度。那么就会涉及到一个问题:何时加速,何时减速?

具体来说就是将一个block分成加速段,匀速段以及减速段并计算它们的长度。计算并不复杂,已在下图给出,需要注意的是如果当前block长度很短的话,加速图形会由梯形变成三角形。

衔接速度

为了不让每个block之间速度跟连贯。我们需要计算每个block的进入速度和退出速度。估算方法下文已给出,需要注意的是图中的圆弧只是用来估算衔接速度的,打印头实际的路径并不会经过这段圆弧。

后记

我以前是不喜欢旅行的,因为在我看来那不过是换个背景拍照。我现在喜欢了,因为我对旅行的定义变了,我现在把它定义成对一个事物的深入探索,而了解3D打印机是如何工作的就是其一。