[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article:cwo-trainer-3a66769c":3},{"article":4,"revisions":15},{"id":5,"author_id":6,"firmware_project_id":7,"slug":8,"published_revision_id":9,"visibility":10,"moderation_lock_reason":11,"version":12,"created_at":13,"updated_at":14},"e6ef5745-4b9d-426e-848f-9e9463bec991","a3176b1e-f2c7-4719-af2d-6a610475dc51","3a66769c-4c2d-45de-840c-e397b29ae80a","cwo-trainer-3a66769c","1857d955-ae08-4b52-8ebf-63979ece97cb","public",null,6,"2026-09-26T10:58:06.484Z","2026-09-28T03:03:52.424Z",[16],{"id":9,"article_id":5,"revision_no":17,"state":18,"source_revision_id":11,"change_summary":19,"version":12,"submitted_at":20,"reviewed_at":21,"published_at":14,"created_at":13,"description":22,"rendered_description":23,"content":24},1,"published","Initial draft","2026-09-26T10:58:15.167Z","2026-09-28T03:03:52.395Z","# CWO 莫尔斯电码训练器 · 使用说明\n\n一台拿在手上的莫尔斯电码（CW）练习机：敲点划、屏幕实时解出字母数字、耳机\u002F扬声器同步发声。不需要联网，不需要连电脑，上电就能用。\n\n---\n\n## 快速上手\n\n1. 上电，等屏幕出现界面（约 2 秒）\n2. **左键** = 点 `·`，**右键** = 划 `—`，按下去就发声\n3. 试试敲出 `H` 和 `E`：\n\n   `····`（四下左键）→ 停顿一下 → `·`（一下左键）→ 停顿\n\n   停顿之后屏幕上应该出现 `HE`\n\n4. 想调速度\u002F音量\u002F屏幕方向 → **两个键一起按住约半秒**，进入设置\n\n---\n\n## 屏幕说明\n\n```\n              ┌──────────────────────┐\n              │ CWO TRAINER   WPM 20 VOL 40 R 270 │  ① 状态栏\n              ├──────────────────────┤\n              │                      │\n              │        ·—··          │  ② 符号区：你正在敲的点划\n              │                      │\n              ├──────────────────────┤\n              │ HELLO WORLD          │  ③ 解码区：解出来的字符\n              │                      │\n              ├──────────────────────┤\n              │ WPM       20  (15-30)│  ④ 设置区（只在设置模式显示）\n              │ L\u002FR = -\u002F+  HOLD = ...│  ⑤ 提示栏：当前能按什么\n              └──────────────────────┘\n```\n\n| 位置 | 内容 |\n| --- | --- |\n| ① 状态栏 | 当前速度 `WPM`、音量 `VOL`、屏幕方向 `R`（0\u002F90\u002F180\u002F270） |\n| ② 符号区 | 当前这一个字符已经敲进去的点划，字很大，解出来后会清空 |\n| ③ 解码区 | 解出来的字母和数字，满屏会自动清空重新开始 |\n| ④ 设置区 | 只在设置模式出现，显示参数名和当前值 |\n| ⑤ 提示栏 | 随模式变化，告诉你这时按键是什么作用 |\n\n### 界面图\n\n两张图由 GSP 模拟器按设备的 `ui\u002Fmain.json` 渲染，和机器上是同一套渲染管线（图中的点划与文字是示例内容）。\n\n**普通模式** —— 符号区是你正在敲的点划，解码区是已经解出来的字符：\n\n![image](\u002Fapi\u002Fv1\u002Ffiles\u002F45141a22-4706-451e-a085-8abc28e457ea.webp)\n\n\n**设置模式** —— 双键同按进入后，底部出现参数名和当前值，提示栏变成设置操作说明：\n\n![image](\u002Fapi\u002Fv1\u002Ffiles\u002Feb40ba0b-74cc-4329-9dbd-70fb062f17f8.webp)\n\n\n---\n\n## 按键总览\n\n### 普通模式（平时发报）\n\n| 按键 | 作用 |\n| --- | --- |\n| 左键 短按 | 点 `·`（按下即发声） |\n| 右键 短按 | 划 `—`（按下即发声） |\n| 双键 同时按住 0.4 秒 | 进入设置模式 |\n\n### 设置模式（调参数）\n\n| 按键 | 作用 |\n| --- | --- |\n| 左键 短按 | 当前参数 `−1` 步 |\n| 右键 短按 | 当前参数 `+1` 步 |\n| 左键 长按 0.6 秒 | 切到上一个参数 |\n| 右键 长按 0.6 秒 | 切到下一个参数 |\n| 双键 同时按住 0.4 秒 | 退出设置模式 |\n\n参数顺序循环：**WPM → VOLUME → ROTATION → 回到 WPM**\n\n每按一次加减都会立刻用新值响一声，不用看屏幕也能听出变化。\n\n---\n\n## 按键映射\n\n设备上只有两个物理按键（都在交互子板上），所有功能都由这两个键的**短按 \u002F 长按 \u002F 双键同按**组合而成。\n\n| 物理键 | 手势 | 普通模式 | 设置模式 |\n| --- | --- | --- | --- |\n| 左键 | 短按（\u003C 0.6 秒） | 输入点 `·` | 当前参数 `−1` |\n| 左键 | 长按（≥ 0.6 秒） | 无 | 切到上一个参数 |\n| 右键 | 短按（\u003C 0.6 秒） | 输入划 `—` | 当前参数 `+1` |\n| 右键 | 长按（≥ 0.6 秒） | 无 | 切到下一个参数 |\n| 左右双键 | 同时按住 ≥ 0.4 秒 | 进入设置模式 | 退出设置模式 |\n\n映射的判定细节：\n\n| 项目 | 取值 | 说明 |\n| --- | --- | --- |\n| 按键来源 | 交互子板 GPIO 直读 | 不走触摸通道；上电后子板枚举约需 3 秒才可响应 |\n| 轮询周期 | 10 毫秒 | 按键状态每 10ms 采样一次 |\n| 消抖 | 连续 3 次采样一致（约 30ms） | 机械抖动不会产生假按键 |\n| 双键同按 | 两键都稳定按下并持续 ≥ 400ms | 只是碰巧同时按下不算，必须按住 |\n| 长按 | 设置模式下按住 ≥ 600ms | 普通模式没有长按功能 |\n| 生效时机 | 普通模式：**按下瞬间**\u003Cbr>设置模式短按：**松手时** | 普通模式按下即发声，判定长按不会给发报带来延迟 |\n\n> **屏幕方向不影响按键功能。** `ROTATION` 只旋转显示内容，左键永远是「点 \u002F −」、右键永远是「划 \u002F +」。把机器转个方向拿，键的功能不会跟着变 —— 需要的是把画面转到对着你。\n\n> **进入设置那一次的双键同按不会留下字符。** 和弦按下的瞬间在普通模式下会先喂进去 `·` 和 `—`（连起来是 `A`），进入设置时会被撤销。\n\n---\n\n## 三项可调参数\n\n| 参数 | 含义 | 范围 | 每步 | 出厂默认 |\n| --- | --- | --- | --- | --- |\n| `WPM` | 发报速度（每分钟多少词） | 15 – 30 | 1 | 15 |\n| `VOLUME` | 音量，0 为静音 | 0 – 100 | 10 | 50 |\n| `ROTATION` | 屏幕方向（顺时针角度） | 0 \u002F 90 \u002F 180 \u002F 270 | 90 | 0 |\n\n- **WPM 越大越快**：速度会同时改变你听到的点划长短和机器判定字符结束的快慢。练熟了再往上加。\n- **ROTATION 改完立刻生效**，屏幕当场转过来，不用重启。\n- **三项都会自动保存**，断电再上电仍然是上次的设定。\n\n---\n\n## 解码是怎么判的\n\n机器靠「你停顿多久」来判断一个字有没有敲完：\n\n| 你输入的 | 机器怎么理解 |\n| --- | --- |\n| 点 按住时间 | 1 个单位 |\n| 划 按住时间 | 3 个单位 |\n| 敲完一个字，停顿约 4 个单位 | 这个字符结束了，开始解码 |\n| 再继续停顿到 8 个单位 | 补一个空格，表示一个词结束 |\n\n单位长短由 WPM 决定，比如 WPM 20 时一个单位是 60 毫秒，也就是：\n\n- 点 = 60ms，划 = 180ms\n- 字内停顿 240ms 以上 → 这个字解出来\n- 停顿 480ms 以上 → 再加一个空格\n\n**支持 `A`–`Z` 和 `0`–`9`。** 敲出表里没有的组合会显示 `?`。\n\n---\n\n## 常见问题\n\n**Q：屏幕上一直显示 `?` 怎么办？**\n你能敲的点划组合不在莫尔斯表里，通常是敲多了或敲错了。不用管它，接着敲下一个字就行。一个字符最多 20 个点划，超了也会判成 `?`。\n\n**Q：数字总是解不出来 \u002F 解成两个字母？**\n数字（`0`–`9`）都是 5 个点划，必须一口气敲完、中途别停顿。如果手速跟不上，**把 WPM 调低**，判定窗口会变长，就容易了。\n\n**Q：敲错了想删掉一个字怎么办？**\n目前**没有退格功能**，只能继续往下敲。解码区攒满 64 个字符（4 行 × 16 个）后会自动清空，重新开始。\n\n**Q：屏幕上刚敲的东西突然不见了？**\n这是设计如此 —— 解码区满了 64 个字符会自动清空，否则新字符会超出屏幕看不见。\n\n**Q：没声音？**\n先看状态栏的 `VOL`：\n- 如果是 `0`，进设置按几下右键加音量\n- 如果音量正常还是没声音，检查扬声器\u002F耳机有没有插好\n\n**Q：屏幕方向是歪的 \u002F 我想横过来用？**\n进设置，长按切到 `ROTATION`，短按左右键转到你要的方向（0\u002F90\u002F180\u002F270），屏幕会**立刻**转过来。\n\n**Q：双键一起按了但没进设置？**\n需要**同时按住满 0.4 秒**。快速连打左一下右一下（两键重叠时间很短）不会被当成同按，那是正常的连打。\n\n**Q：按键完全没反应？**\n确认手柄式的交互子板插稳了。开机后模块枚举需要约 3 秒，刚上电的一两秒内按键可能不响应，稍等一下再试。\n\n**Q：设置会掉电丢失吗？**\n不会，速度\u002F音量\u002F方向都自动保存，每次开机自动载入。\n\n---\n\n## 练习小贴士\n\n- 先按默认 WPM 15 敲熟常用字母：`E ·`、`T —`、`A ·—`、`N —·`、`S ···`、`O ———`\n- 想练听音抄报，可以把 WPM 往上调（20、25…），判定窗口会同步收紧\n- 练习「词」的时候，敲完一个字停一下、敲完一个词停久一点，屏幕上就会出现空格\n- 进入设置那一次的「双键同按」不会在解码区留下多余字符，可以放心用\n\n---\n\n## 固件升级\n\nCWO 通过 ESP-Iris 的 **System Update** 升级：新固件写入独立的应用分区，**不会清掉你保存的 WPM \u002F 音量 \u002F 方向**，升级完屏幕状态栏显示的还是上次的参数。\n\n### 需要准备\n\n- 一台装了 ESP-Mosaico 开发环境的电脑（ESP-IDF + `mosaico.py`）\n- 一根 USB 数据线，能出现串口即可\n\n### 升级步骤\n\n1. 用 USB 线把设备连到电脑\n2. 在 **workspace 根目录**（`esp-mosaico-vibe\u002F`）打开终端，设置环境变量：\n\n   ```powershell\n   $env:IDF_TOOLS_PATH = \"E:\\TREA_WORKSPACE\\espressif-tools\"\n   $env:IDF_PATH       = \"E:\\TREA_WORKSPACE\\esp-idf\"\n   ```\n\n3. 编译 + 打包 + 写入并激活：\n\n   ```powershell\n   python submodule\\esp-mosaico-utils\\mosaico-tools\\mosaico.py iris system-update --project projects\u002Fcwo --timeout 1800\n   ```\n\n4. 命令会先编译（几分钟），然后把设备切到 Recovery 写入新固件，最后自动切回应用\n5. 设备重启后屏幕重新出现界面即完成\n\n> 每个 `mosaico.py` 命令都必须在 workspace 根目录下执行，否则会报 `No .mosaico.json was found`。\n> 已经编好包、只想重新写一遍时，在上面命令后面加 `--skip-build` 跳过编译。\n\n### 确认版本\n\n```powershell\npython submodule\\esp-mosaico-utils\\mosaico-tools\\mosaico.py iris list --project projects\u002Fcwo\n```\n\n看输出里的 `app_version`。版本号定义在 `projects\u002Fcwo\u002FCMakeLists.txt` 的 `project(cwo VERSION x.y.z)`。\n\n### 升级失败怎么办\n\n| 现象 | 处理 |\n| --- | --- |\n| `USB devices are reserved ... state=owned` | 上一次会话还占着设备，先执行 `iris reconcile --device-id \u003CID> --project projects\u002Fcwo` 再重试 |\n| 卡在 `waiting_recovery` 后报 `outcome_unknown` | 固件通常已经写进去了。`reconcile` 之后加 `--skip-build` 再跑一次即可 |\n| 设备从电脑上\"消失\"（串口不见了） | 拔掉 USB 再插上，等设备重新枚举，然后 `reconcile` + 重试 |\n| 设备完全起不来（反复重启 \u002F 停在 Recovery 画面） | 见下节「抢救」 |\n\n### 抢救：设备起不来\n\n`recover` 会把设备恢复到**基础固件**（Recovery 镜像），用于抢救无法启动的设备。它是**顶层命令**，不在 `iris` 下面：\n\n```powershell\n# 设备无响应时先进入下载模式：按住 BOOT 键，插入 USB，再松开 BOOT\npython submodule\\esp-mosaico-utils\\mosaico-tools\\mosaico.py recover --timeout 1800\n```\n\n恢复完成后设备停在 Recovery，再跑一次第 3 步的 `system-update` 把应用写回去。\n\n> 抢救性恢复后如果发现参数变回了默认值（WPM 15 \u002F VOL 50 \u002F R 0），重新设置一次即可 —— 这种情况只可能出现在 `recover` 之后，正常升级不受影响。\n","\u003Ch1>CWO 莫尔斯电码训练器 · 使用说明\u003C\u002Fh1>\n\u003Cp>一台拿在手上的莫尔斯电码（CW）练习机：敲点划、屏幕实时解出字母数字、耳机\u002F扬声器同步发声。不需要联网，不需要连电脑，上电就能用。\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch2>快速上手\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cp>上电，等屏幕出现界面（约 2 秒）\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>左键\u003C\u002Fstrong> = 点 \u003Ccode>·\u003C\u002Fcode>，\u003Cstrong>右键\u003C\u002Fstrong> = 划 \u003Ccode>—\u003C\u002Fcode>，按下去就发声\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>试试敲出 \u003Ccode>H\u003C\u002Fcode> 和 \u003Ccode>E\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cp>\u003Ccode>····\u003C\u002Fcode>（四下左键）→ 停顿一下 → \u003Ccode>·\u003C\u002Fcode>（一下左键）→ 停顿\u003C\u002Fp>\n\u003Cp>停顿之后屏幕上应该出现 \u003Ccode>HE\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>想调速度\u002F音量\u002F屏幕方向 → \u003Cstrong>两个键一起按住约半秒\u003C\u002Fstrong>，进入设置\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr \u002F>\n\u003Ch2>屏幕说明\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>              ┌──────────────────────┐\n              │ CWO TRAINER   WPM 20 VOL 40 R 270 │  ① 状态栏\n              ├──────────────────────┤\n              │                      │\n              │        ·—··          │  ② 符号区：你正在敲的点划\n              │                      │\n              ├──────────────────────┤\n              │ HELLO WORLD          │  ③ 解码区：解出来的字符\n              │                      │\n              ├──────────────────────┤\n              │ WPM       20  (15-30)│  ④ 设置区（只在设置模式显示）\n              │ L\u002FR = -\u002F+  HOLD = ...│  ⑤ 提示栏：当前能按什么\n              └──────────────────────┘\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>位置\u003C\u002Fth>\n\u003Cth>内容\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>① 状态栏\u003C\u002Ftd>\n\u003Ctd>当前速度 \u003Ccode>WPM\u003C\u002Fcode>、音量 \u003Ccode>VOL\u003C\u002Fcode>、屏幕方向 \u003Ccode>R\u003C\u002Fcode>（0\u002F90\u002F180\u002F270）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>② 符号区\u003C\u002Ftd>\n\u003Ctd>当前这一个字符已经敲进去的点划，字很大，解出来后会清空\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>③ 解码区\u003C\u002Ftd>\n\u003Ctd>解出来的字母和数字，满屏会自动清空重新开始\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>④ 设置区\u003C\u002Ftd>\n\u003Ctd>只在设置模式出现，显示参数名和当前值\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>⑤ 提示栏\u003C\u002Ftd>\n\u003Ctd>随模式变化，告诉你这时按键是什么作用\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3>界面图\u003C\u002Fh3>\n\u003Cp>两张图由 GSP 模拟器按设备的 \u003Ccode>ui\u002Fmain.json\u003C\u002Fcode> 渲染，和机器上是同一套渲染管线（图中的点划与文字是示例内容）。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>普通模式\u003C\u002Fstrong> —— 符号区是你正在敲的点划，解码区是已经解出来的字符：\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"\u002Fapi\u002Fv1\u002Ffiles\u002F45141a22-4706-451e-a085-8abc28e457ea.webp\" alt=\"image\" \u002F>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>设置模式\u003C\u002Fstrong> —— 双键同按进入后，底部出现参数名和当前值，提示栏变成设置操作说明：\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"\u002Fapi\u002Fv1\u002Ffiles\u002Feb40ba0b-74cc-4329-9dbd-70fb062f17f8.webp\" alt=\"image\" \u002F>\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch2>按键总览\u003C\u002Fh2>\n\u003Ch3>普通模式（平时发报）\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>按键\u003C\u002Fth>\n\u003Cth>作用\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>左键 短按\u003C\u002Ftd>\n\u003Ctd>点 \u003Ccode>·\u003C\u002Fcode>（按下即发声）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>右键 短按\u003C\u002Ftd>\n\u003Ctd>划 \u003Ccode>—\u003C\u002Fcode>（按下即发声）\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>双键 同时按住 0.4 秒\u003C\u002Ftd>\n\u003Ctd>进入设置模式\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3>设置模式（调参数）\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>按键\u003C\u002Fth>\n\u003Cth>作用\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>左键 短按\u003C\u002Ftd>\n\u003Ctd>当前参数 \u003Ccode>−1\u003C\u002Fcode> 步\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>右键 短按\u003C\u002Ftd>\n\u003Ctd>当前参数 \u003Ccode>+1\u003C\u002Fcode> 步\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>左键 长按 0.6 秒\u003C\u002Ftd>\n\u003Ctd>切到上一个参数\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>右键 长按 0.6 秒\u003C\u002Ftd>\n\u003Ctd>切到下一个参数\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>双键 同时按住 0.4 秒\u003C\u002Ftd>\n\u003Ctd>退出设置模式\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>参数顺序循环：\u003Cstrong>WPM → VOLUME → ROTATION → 回到 WPM\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>每按一次加减都会立刻用新值响一声，不用看屏幕也能听出变化。\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch2>按键映射\u003C\u002Fh2>\n\u003Cp>设备上只有两个物理按键（都在交互子板上），所有功能都由这两个键的\u003Cstrong>短按 \u002F 长按 \u002F 双键同按\u003C\u002Fstrong>组合而成。\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>物理键\u003C\u002Fth>\n\u003Cth>手势\u003C\u002Fth>\n\u003Cth>普通模式\u003C\u002Fth>\n\u003Cth>设置模式\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>左键\u003C\u002Ftd>\n\u003Ctd>短按（&lt; 0.6 秒）\u003C\u002Ftd>\n\u003Ctd>输入点 \u003Ccode>·\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>当前参数 \u003Ccode>−1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>左键\u003C\u002Ftd>\n\u003Ctd>长按（≥ 0.6 秒）\u003C\u002Ftd>\n\u003Ctd>无\u003C\u002Ftd>\n\u003Ctd>切到上一个参数\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>右键\u003C\u002Ftd>\n\u003Ctd>短按（&lt; 0.6 秒）\u003C\u002Ftd>\n\u003Ctd>输入划 \u003Ccode>—\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>当前参数 \u003Ccode>+1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>右键\u003C\u002Ftd>\n\u003Ctd>长按（≥ 0.6 秒）\u003C\u002Ftd>\n\u003Ctd>无\u003C\u002Ftd>\n\u003Ctd>切到下一个参数\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>左右双键\u003C\u002Ftd>\n\u003Ctd>同时按住 ≥ 0.4 秒\u003C\u002Ftd>\n\u003Ctd>进入设置模式\u003C\u002Ftd>\n\u003Ctd>退出设置模式\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>映射的判定细节：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>项目\u003C\u002Fth>\n\u003Cth>取值\u003C\u002Fth>\n\u003Cth>说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>按键来源\u003C\u002Ftd>\n\u003Ctd>交互子板 GPIO 直读\u003C\u002Ftd>\n\u003Ctd>不走触摸通道；上电后子板枚举约需 3 秒才可响应\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>轮询周期\u003C\u002Ftd>\n\u003Ctd>10 毫秒\u003C\u002Ftd>\n\u003Ctd>按键状态每 10ms 采样一次\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>消抖\u003C\u002Ftd>\n\u003Ctd>连续 3 次采样一致（约 30ms）\u003C\u002Ftd>\n\u003Ctd>机械抖动不会产生假按键\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>双键同按\u003C\u002Ftd>\n\u003Ctd>两键都稳定按下并持续 ≥ 400ms\u003C\u002Ftd>\n\u003Ctd>只是碰巧同时按下不算，必须按住\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>长按\u003C\u002Ftd>\n\u003Ctd>设置模式下按住 ≥ 600ms\u003C\u002Ftd>\n\u003Ctd>普通模式没有长按功能\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>生效时机\u003C\u002Ftd>\n\u003Ctd>普通模式：\u003Cstrong>按下瞬间\u003C\u002Fstrong>\u003Cbr \u002F>设置模式短按：\u003Cstrong>松手时\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>普通模式按下即发声，判定长按不会给发报带来延迟\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>屏幕方向不影响按键功能。\u003C\u002Fstrong> \u003Ccode>ROTATION\u003C\u002Fcode> 只旋转显示内容，左键永远是「点 \u002F −」、右键永远是「划 \u002F +」。把机器转个方向拿，键的功能不会跟着变 —— 需要的是把画面转到对着你。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>进入设置那一次的双键同按不会留下字符。\u003C\u002Fstrong> 和弦按下的瞬间在普通模式下会先喂进去 \u003Ccode>·\u003C\u002Fcode> 和 \u003Ccode>—\u003C\u002Fcode>（连起来是 \u003Ccode>A\u003C\u002Fcode>），进入设置时会被撤销。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr \u002F>\n\u003Ch2>三项可调参数\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数\u003C\u002Fth>\n\u003Cth>含义\u003C\u002Fth>\n\u003Cth>范围\u003C\u002Fth>\n\u003Cth>每步\u003C\u002Fth>\n\u003Cth>出厂默认\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>WPM\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>发报速度（每分钟多少词）\u003C\u002Ftd>\n\u003Ctd>15 – 30\u003C\u002Ftd>\n\u003Ctd>1\u003C\u002Ftd>\n\u003Ctd>15\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>VOLUME\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>音量，0 为静音\u003C\u002Ftd>\n\u003Ctd>0 – 100\u003C\u002Ftd>\n\u003Ctd>10\u003C\u002Ftd>\n\u003Ctd>50\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ROTATION\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>屏幕方向（顺时针角度）\u003C\u002Ftd>\n\u003Ctd>0 \u002F 90 \u002F 180 \u002F 270\u003C\u002Ftd>\n\u003Ctd>90\u003C\u002Ftd>\n\u003Ctd>0\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cul>\n\u003Cli>\u003Cstrong>WPM 越大越快\u003C\u002Fstrong>：速度会同时改变你听到的点划长短和机器判定字符结束的快慢。练熟了再往上加。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ROTATION 改完立刻生效\u003C\u002Fstrong>，屏幕当场转过来，不用重启。\u003C\u002Fli>\n\u003Cli>\u003Cstrong>三项都会自动保存\u003C\u002Fstrong>，断电再上电仍然是上次的设定。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr \u002F>\n\u003Ch2>解码是怎么判的\u003C\u002Fh2>\n\u003Cp>机器靠「你停顿多久」来判断一个字有没有敲完：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>你输入的\u003C\u002Fth>\n\u003Cth>机器怎么理解\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>点 按住时间\u003C\u002Ftd>\n\u003Ctd>1 个单位\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>划 按住时间\u003C\u002Ftd>\n\u003Ctd>3 个单位\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>敲完一个字，停顿约 4 个单位\u003C\u002Ftd>\n\u003Ctd>这个字符结束了，开始解码\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>再继续停顿到 8 个单位\u003C\u002Ftd>\n\u003Ctd>补一个空格，表示一个词结束\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>单位长短由 WPM 决定，比如 WPM 20 时一个单位是 60 毫秒，也就是：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>点 = 60ms，划 = 180ms\u003C\u002Fli>\n\u003Cli>字内停顿 240ms 以上 → 这个字解出来\u003C\u002Fli>\n\u003Cli>停顿 480ms 以上 → 再加一个空格\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>支持 \u003Ccode>A\u003C\u002Fcode>–\u003Ccode>Z\u003C\u002Fcode> 和 \u003Ccode>0\u003C\u002Fcode>–\u003Ccode>9\u003C\u002Fcode>。\u003C\u002Fstrong> 敲出表里没有的组合会显示 \u003Ccode>?\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch2>常见问题\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Q：屏幕上一直显示 \u003Ccode>?\u003C\u002Fcode> 怎么办？\u003C\u002Fstrong>\n你能敲的点划组合不在莫尔斯表里，通常是敲多了或敲错了。不用管它，接着敲下一个字就行。一个字符最多 20 个点划，超了也会判成 \u003Ccode>?\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q：数字总是解不出来 \u002F 解成两个字母？\u003C\u002Fstrong>\n数字（\u003Ccode>0\u003C\u002Fcode>–\u003Ccode>9\u003C\u002Fcode>）都是 5 个点划，必须一口气敲完、中途别停顿。如果手速跟不上，\u003Cstrong>把 WPM 调低\u003C\u002Fstrong>，判定窗口会变长，就容易了。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q：敲错了想删掉一个字怎么办？\u003C\u002Fstrong>\n目前\u003Cstrong>没有退格功能\u003C\u002Fstrong>，只能继续往下敲。解码区攒满 64 个字符（4 行 × 16 个）后会自动清空，重新开始。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q：屏幕上刚敲的东西突然不见了？\u003C\u002Fstrong>\n这是设计如此 —— 解码区满了 64 个字符会自动清空，否则新字符会超出屏幕看不见。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q：没声音？\u003C\u002Fstrong>\n先看状态栏的 \u003Ccode>VOL\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>如果是 \u003Ccode>0\u003C\u002Fcode>，进设置按几下右键加音量\u003C\u002Fli>\n\u003Cli>如果音量正常还是没声音，检查扬声器\u002F耳机有没有插好\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Q：屏幕方向是歪的 \u002F 我想横过来用？\u003C\u002Fstrong>\n进设置，长按切到 \u003Ccode>ROTATION\u003C\u002Fcode>，短按左右键转到你要的方向（0\u002F90\u002F180\u002F270），屏幕会\u003Cstrong>立刻\u003C\u002Fstrong>转过来。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q：双键一起按了但没进设置？\u003C\u002Fstrong>\n需要\u003Cstrong>同时按住满 0.4 秒\u003C\u002Fstrong>。快速连打左一下右一下（两键重叠时间很短）不会被当成同按，那是正常的连打。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q：按键完全没反应？\u003C\u002Fstrong>\n确认手柄式的交互子板插稳了。开机后模块枚举需要约 3 秒，刚上电的一两秒内按键可能不响应，稍等一下再试。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Q：设置会掉电丢失吗？\u003C\u002Fstrong>\n不会，速度\u002F音量\u002F方向都自动保存，每次开机自动载入。\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch2>练习小贴士\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>先按默认 WPM 15 敲熟常用字母：\u003Ccode>E ·\u003C\u002Fcode>、\u003Ccode>T —\u003C\u002Fcode>、\u003Ccode>A ·—\u003C\u002Fcode>、\u003Ccode>N —·\u003C\u002Fcode>、\u003Ccode>S ···\u003C\u002Fcode>、\u003Ccode>O ———\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>想练听音抄报，可以把 WPM 往上调（20、25…），判定窗口会同步收紧\u003C\u002Fli>\n\u003Cli>练习「词」的时候，敲完一个字停一下、敲完一个词停久一点，屏幕上就会出现空格\u003C\u002Fli>\n\u003Cli>进入设置那一次的「双键同按」不会在解码区留下多余字符，可以放心用\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr \u002F>\n\u003Ch2>固件升级\u003C\u002Fh2>\n\u003Cp>CWO 通过 ESP-Iris 的 \u003Cstrong>System Update\u003C\u002Fstrong> 升级：新固件写入独立的应用分区，\u003Cstrong>不会清掉你保存的 WPM \u002F 音量 \u002F 方向\u003C\u002Fstrong>，升级完屏幕状态栏显示的还是上次的参数。\u003C\u002Fp>\n\u003Ch3>需要准备\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>一台装了 ESP-Mosaico 开发环境的电脑（ESP-IDF + \u003Ccode>mosaico.py\u003C\u002Fcode>）\u003C\u002Fli>\n\u003Cli>一根 USB 数据线，能出现串口即可\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>升级步骤\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Cp>用 USB 线把设备连到电脑\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>在 \u003Cstrong>workspace 根目录\u003C\u002Fstrong>（\u003Ccode>esp-mosaico-vibe\u002F\u003C\u002Fcode>）打开终端，设置环境变量：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$env:IDF_TOOLS_PATH = \"E:\\TREA_WORKSPACE\\espressif-tools\"\n$env:IDF_PATH       = \"E:\\TREA_WORKSPACE\\esp-idf\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>编译 + 打包 + 写入并激活：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>python submodule\\esp-mosaico-utils\\mosaico-tools\\mosaico.py iris system-update --project projects\u002Fcwo --timeout 1800\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>命令会先编译（几分钟），然后把设备切到 Recovery 写入新固件，最后自动切回应用\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>设备重启后屏幕重新出现界面即完成\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\n\u003Cp>每个 \u003Ccode>mosaico.py\u003C\u002Fcode> 命令都必须在 workspace 根目录下执行，否则会报 \u003Ccode>No .mosaico.json was found\u003C\u002Fcode>。\n已经编好包、只想重新写一遍时，在上面命令后面加 \u003Ccode>--skip-build\u003C\u002Fcode> 跳过编译。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>确认版本\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>python submodule\\esp-mosaico-utils\\mosaico-tools\\mosaico.py iris list --project projects\u002Fcwo\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>看输出里的 \u003Ccode>app_version\u003C\u002Fcode>。版本号定义在 \u003Ccode>projects\u002Fcwo\u002FCMakeLists.txt\u003C\u002Fcode> 的 \u003Ccode>project(cwo VERSION x.y.z)\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch3>升级失败怎么办\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>现象\u003C\u002Fth>\n\u003Cth>处理\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>USB devices are reserved ... state=owned\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>上一次会话还占着设备，先执行 \u003Ccode>iris reconcile --device-id &lt;ID&gt; --project projects\u002Fcwo\u003C\u002Fcode> 再重试\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>卡在 \u003Ccode>waiting_recovery\u003C\u002Fcode> 后报 \u003Ccode>outcome_unknown\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>固件通常已经写进去了。\u003Ccode>reconcile\u003C\u002Fcode> 之后加 \u003Ccode>--skip-build\u003C\u002Fcode> 再跑一次即可\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>设备从电脑上\"消失\"（串口不见了）\u003C\u002Ftd>\n\u003Ctd>拔掉 USB 再插上，等设备重新枚举，然后 \u003Ccode>reconcile\u003C\u002Fcode> + 重试\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>设备完全起不来（反复重启 \u002F 停在 Recovery 画面）\u003C\u002Ftd>\n\u003Ctd>见下节「抢救」\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3>抢救：设备起不来\u003C\u002Fh3>\n\u003Cp>\u003Ccode>recover\u003C\u002Fcode> 会把设备恢复到\u003Cstrong>基础固件\u003C\u002Fstrong>（Recovery 镜像），用于抢救无法启动的设备。它是\u003Cstrong>顶层命令\u003C\u002Fstrong>，不在 \u003Ccode>iris\u003C\u002Fcode> 下面：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 设备无响应时先进入下载模式：按住 BOOT 键，插入 USB，再松开 BOOT\npython submodule\\esp-mosaico-utils\\mosaico-tools\\mosaico.py recover --timeout 1800\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>恢复完成后设备停在 Recovery，再跑一次第 3 步的 \u003Ccode>system-update\u003C\u002Fcode> 把应用写回去。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>抢救性恢复后如果发现参数变回了默认值（WPM 15 \u002F VOL 50 \u002F R 0），重新设置一次即可 —— 这种情况只可能出现在 \u003Ccode>recover\u003C\u002Fcode> 之后，正常升级不受影响。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",{"title":25,"categories":26,"boards":28,"tags":29,"cover_images":30,"external_links":33,"attachments":34,"current_version":35,"license":36,"firmware_variants":37},"CWO trainer",[27],"audio",[],[],[31,32],"\u002Fapi\u002Fv1\u002Ffiles\u002F0e909ee5-c258-43ae-b56c-e7bddd315423.webp","\u002Fapi\u002Fv1\u002Ffiles\u002F98995bd3-748d-4c25-bc22-1999355cdef5.webp",[],[],"1.0.0","MIT",[38],{"type":39,"partitions":40,"iris":41},"iris",[],{"bundle_asset_id":42},"127a408c-43ea-4f51-8633-dac449a0d53d.irisfw"]