blocksdef.js实现全解)
如何从零开发MicroPython扩展积木旋转电位器rotary-potentiometerblocksdef.js实现全解【免费下载链接】CupCode_EC11旋转编码器模块此扩展适配于采用EC11的旋转编码器不支持按键。项目地址: https://gitcode.com/yuanshixiong/rotary-potentiometer想搞清楚一个blocksdef.js文件是怎么在 MicroPython 平台里长出四块 EC11 旋转编码器积木的吗本文以开源项目rotary-potentiometer源师兄 / CupCode_EC11旋转编码器模块为例从零讲透 MicroPython 扩展积木开发的完整流程config.json 定义扩展信息、category.json 注册积木分类、blocksdef.js 完成积木外观 Python 代码生成两大核心全程面向新手尽量不堆代码。 1. 先认识项目一个扩展积木由 4 个文件组成项目结构非常轻量每个文件各司其职文件角色一句话说明config.json扩展名片设备归属、扩展名称、功能描述category.json积木分类清单声明 4 个积木及每个数值端口的默认值blocksdef.js核心积木外观定义 MicroPython 代码生成library/ec11.py底层驱动GPIO 双相读取、严格消抖、加速计数只想直接使用扩展的话接线表和积木用法见 README.md本文聚焦开发侧——这些积木是怎么搭出来的。️ 2. 第 1 步config.json——给扩展办一张名片config.json 只有 3 个关键字段平台加载扩展时逐一读取Device扩展归属的设备家族本项目为源师兄扩展Name积木工具栏里显示的分类名这里是EC11旋转编码器Description一句话功能描述展示在扩展详情页。 注意Name要与 category.json 中name字段对应分类名就是积木调色板的入口。️ 3. 第 2 步category.json——积木分类的清单category.json 用三层信息声明这个分类里有什么统一配色colour: #f4b400是整个分类的主题色blocksdef.js 顶部的globalcolor与它保持一致同一扩展的积木观感统一积木列表contents按顺序登记 4 个kind: BLOCK条目——初始化、重置计数、获取值、获取方向每个条目的type如ohcode_extend_ec11_init与 blocksdef.js 中的积木名一一对应默认值shadow为数值端口预置灰色数字积木如初始化积木的最小值0、最大值255、步长1。 新增积木时只需在contents里加一条BLOCK条目type名保持与 blocksdef.js 一致即可。⚙️ 4. 第 3 步核心blocksdef.js——一份外观 一份代码生成整个 blocksdef.js 只有约 100 行每个积木都出现两次套路完全一致Blockly.Blocks[积木名]定义积木的样子——文字、下拉框、输入端口、是语句型还是输出型pythonGenerator.forBlock[积木名]定义积木的行为——拼积木点运行后生成哪一行 MicroPython 代码。4.1 积木的外观定义init() 函数的 4 个动作以初始化积木为例见 blocksdef.js#L3-L33init只做 4 件事文本 下拉框appendDummyInput()单行排布文字两个FieldDropdown生成A连接到 / B连接到下拉选项P0~P16取值即引脚号数值输入端口appendValueInput(min_val)等创建最小值、最大值、步长 3 个端口category.json 里的灰色默认值就嵌在这里拼图形态setPreviousStatement(true)setNextStatement(true)让积木能插进程序流、上下可拼接成为语句型积木配色与提示setColour统一颜色setTooltip写悬停提示。4.2 积木的代码生成pythonGenerator 做的 3 件事代码生成函数见初始化积木 blocksdef.js#L36-L49做 3 件事getFieldValue(CLK_PIN)取下拉框选中的 A/B 引脚号valueToCode(block, min_val, ...)取插上的数值积木没插时回退到默认值0/255/1拼接并返回目标代码pot EC11(int(0), int(1), int(0), int(255), int(1))。这里藏着一个巧妙技巧from EC11 import EC11被写进pythonGenerator.definitions_——这是代码生成器的全局导入区无论程序里放多少个初始化积木import 语句都只在生成代码顶部出现一次不会重复。↑ 语句型积木重置计数为代码生成函数只返回一行pot.set_value(...)设置值会被驱动自动限制在最小/最大值之间4.3 输出型积木获取值 / 获取方向如何嵌入其他积木获取值、获取方向积木是输出型——init里用setOutput(true)代替上下拼接见 blocksdef.js#L72-L100让积木像变量一样插进显示、比较等积木中它们的代码生成函数返回[代码, 优先级]数组获取值int(pot.value())优先级ORDER_ATOMIC原子值嵌入表达式时不会多套括号获取方向pot.direction()顺时针返回1、逆时针返回-1、无新旋转返回0。 5. 积木背后的驱动力ec11.py 驱动的关键设计积木只负责界面 生成代码真正干活的是 library/ec11.py 里的EC11类几个亮点值得借鉴双相 GPIO 判向CLKA 相、DTB 相两路数字引脚内部上拉输入靠两相信号差判定旋转方向严格消抖CLK 下降沿后 5 次采样取多数 连续 3 次同向才确认从根源上解决偶发反向读数实现见 ec11.py#L87-L135加速计数连续快速旋转时步长自动增大最高 10 倍猛拧旋钮也不丢步后台线程独立线程每 10ms 轮询一次主程序随时读取、不阻塞这是积木化外设驱动的标准姿势。❓ 6. 新手常见问题方向反了 / 数值卡边界 / 如何新增积木Q1旋转方向与预期相反A/B 两相接反所致——交换 CLK/DT 接线或初始化驱动时设reverseTrue。Q2数值卡在最大值/最小值不动当前值被初始化积木设定的量程钳位了调大最大值即可。Q3「获取方向」一直是 0方向是一次性消费的每次旋转事件返回一次即复位需要持续判断请在旋转后立即读取。Q4想给扩展新增第 5 个积木怎么办复制外观 4 步 代码生成 1 函数的模板改积木名和生成的代码再在 category.json 的contents里加一条BLOCK条目完成。Q5旋钮上的按键SW能用吗本扩展不支持 EC11 按键功能SW 引脚悬空即可按键请使用其他积木。↑ 输出型方向积木返回 1 / -1 / 0可用于顺逆时针分别执行不同逻辑如调参、翻页✅ 7. 总结3 个文件的扩展积木开发模板开发一个 MicroPython 扩展积木本质就是填好 3 个文件config.json 是名片、category.json 是分类清单、blocksdef.js 是每个积木一份外观 一份代码生成再配一个底层 MicroPython 驱动本项目为 library/ec11.py。以 EC11 旋转编码器扩展 rotary-potentiometer 为模板你就能快速搭建出自己的传感器积木完整使用文档见 README.md。【免费下载链接】CupCode_EC11旋转编码器模块此扩展适配于采用EC11的旋转编码器不支持按键。项目地址: https://gitcode.com/yuanshixiong/rotary-potentiometer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考