project/cli-cheatsheet.md
garden-cli 命令速查与急救卡
日常运维两张卡:命令速查卡(怎么用)与急救卡(出问题按顺序做什么)。全部命令板上实测,退出码 2 = 结构化失败,不是崩溃。
#一、元信息
| 字段 | 值 |
|---|---|
| 对象 | garden-cli(~/garden-driver/garden-cli,C 语言,JSON 输出) |
| 平台 | Orange Pi Zero 2W / Armbian aarch64,板上实测 |
| 板端数据(丢不得) | /home/orangepi/garden-data/(标定 + 运动计数) |
| 验证状态 | ✅ 已验证(板上在用,2026-10-08) |
#二、CLI 命令速查
bashCLI=~/garden-driver/garden-cli
$CLI motor position # 位置/误差/转速/mm/占行程%(JSON)
$CLI motor drive # 驱动器状态: 堵转/编码器/校准表/固件/开闭环 <- 排查首选
$CLI motor protect-clear # 撞死点后驱动器自锁 -> 解开
$CLI motor move 50 # 定位 50%(软限位映射后实际落 [3%,97%])
$CLI motor up | down # 走到软限位就停
$CLI motor calibrate # 全自动标定(速度 12% + 末端降速)
$CLI motor stop # 急停
$CLI status # 全家桶 JSON
要点:motor drive 是排查电机问题的第一入口——先看驱动器自述状态,再看代码;move 的百分位是「占行程百分比」,经过软限位映射后实际落点在 [3%, 97%]。
#三、出问题急救六步
bash1. systemctl is-active ... # 服务活着吗
2. curl -s :8080/api/status # 面板有数据吗
3. $CLI motor drive # 堵转?protect-clear
4. ps -eo pid,etime,args | grep '[g]arden-cli motor' -> kill # 残留进程占锁(别用 pkill -f)
5. journalctl -u garden-server/-voice -n 30 # 看日志
6. echo t > ~/garden-data/_t # SD 卡还写得进吗
| 症状 | 第一嫌疑 |
|---|---|
| 「直连正常、经服务失败」 | systemd 沙箱(NoNewPrivileges 让 sudo 失效),见坑 19 |
| 电机全部命令排队假死 | 残留 motor 进程占串口锁,先按第 4 步杀进程 |
| 标定 / 写盘报 EROFS | SD 卡间歇性只读(当前最高风险),第 6 步验证 |
| motor / water 离线 | 先查 24V 供电再怀疑代码(24V 是常态在用) |
| 急停后连急停都回 E2 | 堵转保护自锁,motor protect-clear(0E 52) |
#四、标准工作流(每次改代码后)
bash1. 找板子: powershell -File board_find2.ps1
2. 上传: scp <文件> orangepi@<IP>:/tmp/ # 复杂命令一律写 .sh 再 scp
3. 板端: echo orangepi | sudo -S cp /tmp/x /目标路径
4. 生效:
- Python 文件: systemctl restart garden-server / garden-mqtt-bridge / garden-voice
- C 源码: cd ~/garden-driver && sed -i 's/\r$//' src/*.c include/*.h && make
# 改了 config.h 和 .c 都要传!改了 limits/gpio 要重启 garden-local
5. 验证: curl -s http://127.0.0.1:8080/api/status | python3 -m json.tool
#五、连接与环境
| 项 | 值 |
|---|---|
| SSH | ssh orangepi@192.168.1.107,密码 orangepi(DHCP 会变,用 board_find2.ps1 找) |
| Tailscale 外网 | 100.93.100.17 |
| 面板 | http://192.168.1.107:8080/ |
| HA | http://192.168.1.107:8123/ |
| 摄像头 | http://192.168.1.107:8090/(mjpg-streamer) |
| 语音模型 | /home/orangepi/vosk-model-small-cn-0.22/(42MB) |
| 6 个 systemd 服务 | garden-server / garden-mqtt-bridge / garden-voice / garden-local / mjpg-streamer / garden-tools 应全部 active |
#六、GPIO 行号速查(gpiod line offset)
| 用途 | 行号 | 物理脚 |
|---|---|---|
| 上限位(物理上端) | 271 | 31 (PI15) |
| 下限位(物理下端) | 272 | 37 (PI16) |
| 水位超声波 TRIG / ECHO | 259 / 260 | 40 / 38 |
| 水泵 | 270 | 16 |
| 灯按钮 | 258 | 35 |
| 水泵按钮 | 76 | 36 |
| 左 / 右灯带 | 268 / 267 | 33 / 32 |
⚠️ 限位与按键:开关一端接 GND + 上拉 → 低电平 = 已触发。271=上 / 272=下,别交换。
#七、ZDT X42S 协议速查
地址 0x01,/dev/ttyS5 115200 8N1,帧尾 0x6B。固件 FW_Ver=201,X 固件,开环模式。手册:x42s.txt / x42s_manual.pdf。
| 功能 | 帧 | 说明 |
|---|---|---|
| F6 速度模式 | 01 F6 dir accH accL spdH spdL sync 6B | dir 00 正 / 01 反;spd 单位 0.1RPM |
| FE 立即停止 | 01 FE 98 00 6B | 必须 5 字节,4 字节回 EE |
| 0A 位置清零 | 01 0A 6D 6B | |
| 0E 解除保护 | 01 0E 52 6B | 堵转后救命帧 |
| 06 编码器校准 | 01 06 45 6B | 开环模式回 E2,不需要 |
| 36 读位置 | 01 36 6B | 返回 8B:addr 36 符号 数据(4,大端) 6B,单位 0.1° |
| 37 / 35 / 3A / 3B / 1A | 读误差 / 转速 / 状态 / 回零 / 选项 | 见进度交接 20260925 第 2.2 节 |
| FD 位置模式 | 不可用 | 本固件会跑飞,定位一律 F6 + 位置闭环 |
#八、机构与标定参数(include/config.h)
| 常量 | 值 | 含义 |
|---|---|---|
| MOTOR_LEAD_MM | 47.1 | 皮带每圈行程(尺实测) |
| MOTOR_SPEED_CAL_PCT | 12 | 标定速度 |
| MOTOR_END_MARGIN_PCT | 3 | 软限位余量(日常不碰开关) |
| MOTOR_RECAL_MOVES | 50 | 每 50 次运动自动重标定 |
| MOTOR_DIR_FLIP / MOTOR_POS_INVERT | 1 / 1 | 电机正方向装反的软件补偿(必须同时开) |
| 水位 D_EMPTY / D_FULL | 40 / 12 cm | 已实测定稿(V1.0 的 5/25 占位值作废) |
行程实测 427~429mm,标定后自动停靠 20%。验收数据留档:25% 误差 0.99%、50% 0.39%、75% 0.01%、100% 0.02%;软限位全程限位开关零触发。
#九、相关链接
- 项目总览——系统架构与现状
- HAL 分层重构执行需求书(V1.1)——本速查是任务 0 回归清单的命令底表
- 踩坑索引——急救卡里每个「第一嫌疑」的完整来龙去脉
- 一次嵌入式联调踩的 17 个坑——协议帧、锁、标定背后的坑
- 开箱到 SSH:香橙派首次点亮——板子连接与配网基础
#十、更新日志
📝共 1 条记录
| 日期 | 类型 | 更新内容 |
|---|---|---|
| 2026-10-08 | 新增 | 首次建档:CLI 命令速查、急救六步 + 症状对照、标准工作流、连接环境、GPIO 行号、X42S 协议帧表、标定参数(与《香橙派开发指南》第 3~6 节同源) |