project/cli-cheatsheet.md

garden-cli 命令速查与急救卡

知识库 · 项目卷宗 📅 初版 2026-10-08

日常运维两张卡:命令速查卡(怎么用)与急救卡(出问题按顺序做什么)。全部命令板上实测,退出码 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 步杀进程
标定 / 写盘报 EROFSSD 卡间歇性只读(当前最高风险),第 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

#五、连接与环境

项值
SSHssh orangepi@192.168.1.107,密码 orangepi(DHCP 会变,用 board_find2.ps1 找)
Tailscale 外网100.93.100.17
面板http://192.168.1.107:8080/
HAhttp://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)

用途行号物理脚
上限位(物理上端)27131 (PI15)
下限位(物理下端)27237 (PI16)
水位超声波 TRIG / ECHO259 / 26040 / 38
水泵27016
灯按钮25835
水泵按钮7636
左 / 右灯带268 / 26733 / 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 6Bdir 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_MM47.1皮带每圈行程(尺实测)
MOTOR_SPEED_CAL_PCT12标定速度
MOTOR_END_MARGIN_PCT3软限位余量(日常不碰开关)
MOTOR_RECAL_MOVES50每 50 次运动自动重标定
MOTOR_DIR_FLIP / MOTOR_POS_INVERT1 / 1电机正方向装反的软件补偿(必须同时开)
水位 D_EMPTY / D_FULL40 / 12 cm已实测定稿(V1.0 的 5/25 占位值作废)

行程实测 427~429mm,标定后自动停靠 20%。验收数据留档:25% 误差 0.99%、50% 0.39%、75% 0.01%、100% 0.02%;软限位全程限位开关零触发。

#九、相关链接

#十、更新日志

📝共 1 条记录
日期类型更新内容
2026-10-08新增首次建档:CLI 命令速查、急救六步 + 症状对照、标准工作流、连接环境、GPIO 行号、X42S 协议帧表、标定参数(与《香橙派开发指南》第 3~6 节同源)