第二章:多药仓硬件架构——药仓结构设计、传感器选型与执行器原理
各位同学,大家好。这一章我们聊聊硬件。嗯,我知道很多做算法的同学一听硬件就头疼,觉得那是硬件工程师的事。但我要说,药仓的硬件架构,直接决定了你的算法能不能跑起来、跑得稳。
我做过好几个智能药盒项目,踩过的坑不少。有一次,算法模型调得漂漂亮亮,结果一到实物测试,药片卡在仓里出不来。你说气不气人?从那以后,我养成了一个习惯:写算法之前,先把硬件架构摸透。
2.1 药仓结构设计——别小看这个“盒子”
药仓结构,说白了就是药片住的小房间。设计得好,药片进出顺畅;设计不好,卡药、漏药、碎药,问题一堆。
我个人习惯把药仓分成三类:
- 旋转式药仓:一个圆盘,分成多个格子。电机一转,格子对准出药口。结构简单,适合圆形药片。
- 抽屉式药仓:每个药仓独立,像抽屉一样推拉。适合多种形状的药片,但体积大。
- 管道式药仓:药片竖着叠放,底部开口。靠重力下落,适合胶囊。
你想想看,旋转式药仓最常用。为什么?因为它的空间利用率高,一个电机就能控制多个仓。我在项目中遇到过一个问题:旋转盘和外壳之间的间隙没控制好,药片卡在缝隙里。后来我加了一个导向槽,问题就解决了。
关键设计参数:
- 药仓直径:比药片直径大2-3mm,太紧会卡,太松会晃
- 出药口角度:30°-45°倾斜,利用重力辅助出药
- 仓壁材质:医用级ABS或PC,表面光滑,减少摩擦
2.2 传感器选型——让药盒“看见”药片
传感器是药盒的眼睛。没有传感器,算法就是瞎子。我常用的传感器有三种:重量、红外、霍尔。每种都有自己的脾气。
2.2.1 重量传感器(称重模块)
重量传感器,说白了就是电子秤的原理。它用应变片来感知压力变化。药片掉下来,重量变了,传感器就知道了。
我建议用HX711模块搭配称重传感器。为什么?因为HX711内置了24位ADC,精度够用,而且便宜。一个模块才几块钱。
我的经验: 称重传感器最怕震动。药片掉落时的冲击力,会导致读数跳变。我一般会在软件里加一个滑动平均滤波,取5-10次读数的平均值。这样数据就稳了。
选型参数表:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 量程 | 0-500g | 覆盖常见药片重量(一般0.1-5g/片) |
| 精度 | 0.01g | 能分辨出少了一颗药 |
| 采样率 | 10-80Hz | 太快会引入噪声,太慢会漏掉事件 |
2.2.2 红外传感器(对射式/反射式)
红外传感器,用来检测药片有没有通过某个位置。对射式是一边发射红外光,另一边接收。药片经过时,光线被挡住,接收端信号变化。
反射式则是发射和接收在同一侧,靠药片反射光线来检测。
我个人更推荐对射式。为什么?因为反射式容易受药片颜色影响。白色药片反射强,黑色药片反射弱,检测不稳定。我曾经被这个坑过——黑色胶囊死活检测不到。后来换成对射式,问题就解决了。
注意: 红外传感器要避开阳光直射。阳光里也有红外成分,会导致误触发。我一般会在传感器外面加一个遮光罩,或者用调制红外光(38kHz载波)来抗干扰。
2.2.3 霍尔传感器(磁感应)
霍尔传感器,用来检测旋转位置。比如旋转式药仓,你需要知道当前是哪个仓对准了出药口。在转盘上装一个小磁铁,在固定位置装霍尔传感器。磁铁经过时,霍尔输出一个脉冲。
霍尔传感器分两种:开关型和线性型。开关型只输出0或1,适合检测有没有磁铁。线性型输出模拟电压,可以判断磁铁距离。
我一般用开关型霍尔,比如AH3144。便宜、稳定、抗干扰。配合一个磁铁,就能知道转盘转到了哪个位置。
传感器组合策略:
- 重量传感器:检测药片有没有出仓(最终确认)
- 红外传感器:检测药片有没有通过通道(中间确认)
- 霍尔传感器:检测药仓位置(定位确认)
三重确认,基本不会出错。我在项目中用这套方案,漏检率低于0.1%。
2.3 执行器——让药盒“动”起来
传感器负责感知,执行器负责行动。药盒里最常见的执行器是舵机和步进电机。两者各有千秋。
2.3.1 舵机(伺服电机)
舵机,说白了就是一个能精确控制角度的电机。给它一个PWM信号,它就转到对应的角度。比如0°是关闭,90°是打开。
舵机内部有电位器反馈,所以它能知道自己转到了什么位置。这是闭环控制,精度高。
我建议用SG90或MG996R。SG90便宜,适合小药仓。MG996R扭矩大,适合大药仓。
避坑指南: 我曾经遇到过舵机堵转的问题。药片卡住了,舵机还在使劲转,结果烧了。后来我在程序里加了堵转检测:如果舵机在1秒内没有到达目标角度,就停止输出并报警。这个逻辑救了我好几次。
舵机控制代码示例:
// 舵机控制函数
void setServoAngle(int angle) {
// 角度范围:0-180
// PWM频率:50Hz(周期20ms)
// 脉宽范围:0.5ms-2.5ms
int pulseWidth = map(angle, 0, 180, 500, 2500);
digitalWrite(SERVO_PIN, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(SERVO_PIN, LOW);
delay(20 - pulseWidth / 1000);
}
2.3.2 步进电机
步进电机,适合需要精确旋转圈数的场景。比如旋转式药仓,你需要让转盘精确地转一格。
步进电机没有反馈,它是开环控制。你给它一个脉冲,它就转一步。28BYJ-48是常见的型号,便宜、够用。
但要注意,步进电机有失步的问题。如果负载太大,它可能转不动,但你还以为它转了。我一般会在步进电机上加一个霍尔传感器,确认它真的转到了位置。
| 对比项 | 舵机 | 步进电机 |
|---|---|---|
| 控制方式 | PWM脉宽 | 脉冲数 |
| 反馈 | 有(内部电位器) | 无(开环) |
| 精度 | 高(约1°) | 中(约5.625°/步) |
| 扭矩 | 小-中 | 中-大 |
| 适用场景 | 开关仓门 | 旋转药盘 |
2.4 硬件架构的整合思路
好了,传感器和执行器都讲完了。怎么把它们整合到一起?我一般遵循这个流程:
- 霍尔传感器定位药仓位置
- 步进电机旋转到目标药仓
- 舵机打开仓门
- 红外传感器检测药片通过
- 重量传感器确认药片已出仓
- 舵机关闭仓门
这个流程看起来简单,但每一步都有坑。比如,步进电机旋转时,药片可能会晃动,导致重量传感器误判。我一般会在旋转完成后,等待500ms再读取重量数据,让系统稳定下来。
总结一句话: 硬件架构是算法的地基。地基不稳,算法再漂亮也是空中楼阁。多花时间在硬件选型和结构设计上,后面调试会省很多事。
下一章,我们会讲药仓的通信协议设计。嗯,就是怎么让这些传感器和执行器跟主控芯片“说话”。到时候见。