自助旧书回收装置:基于STM32的嵌入式系统设计与实现
2026/9/18 4:53:00 网站建设 项目流程

1. 项目整体设计与选题思路

1.1 自助旧书回收装置要解决什么问题

接触这个项目之前,我们先想清楚一个现实场景:校园里毕业生离校前有一大批教材和课外书要处理,小区里居民家里也堆着不少看完就不想留的旧书。这些书扔了可惜,当废纸卖掉又觉得亏,但要一本一本挂到二手平台上去卖,又费时间费精力,最后往往还是堆在角落里落灰。自助旧书回收装置就是冲着这个痛点去的——用户把书放进回收口,设备自动识别书的信息、评估价格、完成回收,用户当场就能拿到回收款或者积分。

我在设计这套系统时的核心思路,是把“识别—评估—回收—结算”这一整条链路做成一个无需人工值守的自动化流程。它不像自动售货机那样只是简单地吐货物,而是需要同时处理传感检测、数据识别、价格计算、机械执行、人机交互等多个环节,是一个比较典型的嵌入式综合项目。用STM32作为主控,既能满足传感器数据采集和电机控制的实时性要求,又能在功耗和成本之间取得一个很好的平衡,这也是很多类似自助设备选择STM32系列芯片的原因。

这套系统解决了三个层面的问题:对用户来说,处理旧书变得即时、透明,不再需要等待买家;对运营方来说,降低了人工收书的成本,可以实现全天候回收;对环保循环来说,提高了旧书的再流通率。如果你是在校学生正在找毕业设计题目,或者刚接触嵌入式开发想做一个完整项目练手,这个题目覆盖了传感器、通信、电机控制、嵌入式GUI等多个知识点,是一个非常合适的综合性项目。

1.2 为什么选STM32做控制核心

现在市面上的主控方案很多,Arduino上手快、树莓派性能强、ESP32自带WiFi,但我在这个项目里还是坚持选了STM32,原因很实际。

首先看实时性。旧书回收流程中,称重传感器需要连续采样、红外对射传感器需要及时响应、投递舱门的舵机需要精确控制角度,这些任务对响应时间的要求是毫秒级的。STM32采用Cortex-M内核,中断响应速度快,定时器资源丰富,可以保证这些任务并行不误。树莓派虽然性能强,但它跑的是完整操作系统,任务调度存在不确定性,在工业级控制场景中反而不如单片机可靠。

其次是接口资源。这个系统需要的接口类型很多:称重传感器走HX711的时钟和数据线、RFID模块走串口或SPI、显示屏走I2C或SPI、ESP8266模块走串口、舵机走PWM、继电器走GPIO。STM32的GPIO口数量充足,多个USART、SPI、I2C外设可以同时工作,基本上不需要做接口扩展,硬件设计会简单很多。如果换用Arduino Uno,串口只有一个,接完RFID再接ESP8266就会冲突,必须靠软件模拟串口,稳定性要打折扣。

然后是成本。STM32F103C8T6这颗芯片在正常市场行情下单颗价格在几块钱到十几块钱之间,整个控制板打样加元器件,成本可以压到50元以内。对于开源项目来说,成本越低的方案,别人复现的意愿就越高。这也是我在项目说明里特意强调“低成本可复现”的原因。

当然,ST官方现在主推的是HAL库,代码结构清晰,移植性好,配合STM32CubeMX做初始化配置,开发效率比早期用标准库手写寄存器高很多。我在这个项目中整个工程都是基于HAL库的,后面如果有需要换芯片型号,比如从F103换到F411,大部分驱动代码只需要修改底层引脚配置就能复用。

1.3 开源的作用:从“一个人的项目”到“一群人的项目”

做硬件项目最怕的是什么?不是不会写代码,而是踩了坑没人告诉你坑在哪。开源的真正价值就在这里。

我把这个项目的原理图、PCB工程、STM32源码、结构件3D模型全部放到了Gitee仓库里。这样做有几个好处:第一,别人可以在我的电路设计基础上直接改,比如把RFID识别换成扫码识别,不需要从头画板子;第二,别人发现的问题和解决方案会通过Issue反馈回来,相当于免费的测试团队;第三,也让这个项目有了持续演化的可能,有人会提交代码优化称重滤波算法,有人会补充新的传感器驱动,一个人维护的精力和能力有限,但社区的力量是无限的。

如果你打算把自己的项目开源,我有几点建议:LICENSE一定要选好,不想让别人商用就选GPL-3.0,想开放得更彻底就选MIT;README文档要写清楚硬件清单和烧录步骤,很多项目代码写得不错,但别人根本跑不起来,就是因为文档太敷衍;还有,尽量在代码里加上详细注释,尤其是关键算法的实现思路,这会直接决定别人愿不愿意继续使用和传播你的项目。

2. 硬件系统拆解与选型分析

2.1 主控选型:从F103C8T6到F407的取舍

在这个项目中,我最终选用的是STM32F103C8T6,也就是大家常说的“蓝色药丸”板子。这颗芯片是72MHz主频的Cortex-M3内核,64KB Flash,20KB RAM,对于这个项目来说,资源刚好够用,性价比非常高。

但如果你后续想在设备上跑图形界面,比如用LVGL做一个带动画效果的触控屏,那F103的RAM就比较吃紧了。建议直接升级到STM32F407VET6,192KB RAM跑LVGL会从容很多,而且F407主频168MHz,还有硬件浮点单元,做传感器数据滤波和PID控制时的计算速度会有明显提升。

我整理了一个选型对比表,方便你根据自己的实际需求做决定:

对比项STM32F103C8T6STM32F407VET6
内核Cortex-M3Cortex-M4F
主频72MHz168MHz
Flash/RAM64KB/20KB512KB/192KB
硬件浮点
适合场景基础控制、传感器采集图形界面、复杂算法
典型成本中高

我个人建议做主控板的时候把两种封装的兼容设计考虑进去,比如F103C8T6是LQFP48封装,F103RCT6是LQFP64封装,如果PCB面积允许,可以做兼容焊盘设计,这样以后升级芯片不用重新画板。

2.2 书籍识别与信息采集模块

旧书回收的第一个核心步骤是识别这本书是什么书、什么版本、大概值多少钱。这里我采用了RFID加称重双通道的方案。

RFID模块选用的是RC522,工作在13.56MHz频段,支持ISO14443A协议。对应的RFID标签有两种粘贴方式:一种是运营方提前在图书入库时贴好标签,写入唯一ID和书籍信息;另一种是用户自己把书放进投递口后,设备通过RFID天线读取标签信息。RC522的读取距离通常只有2到5厘米,所以天线的安装位置要贴近投递舱的图书放置平台,这样才能保证读取稳定。实际调试中发现,RFID天线对金属物体非常敏感,附近不能有大面积的金属支架,否则读写距离会急剧缩短。我的解决方案是天线下方垫一层3毫米厚的亚克力板做隔离。

称重模块选用的是电阻应变片式压力传感器加HX711 ADC芯片的方案。HX711是一款24位高精度ADC,专门为桥式传感器设计,内置了低噪声放大器,增益可选32/64/128倍。我选择量程为5kg的传感器,因为一本教材通常在500克左右,一摞书最多也就几公斤,5kg量程配合24位精度,理论上可以分辨0.3克以内的重量变化,完全满足旧书称重需求。

2.3 人机交互与执行机构

交互屏幕方面,我选用的是1.44寸TFTLCD屏幕,ST7735驱动芯片,分辨率128x128。选择这块屏的原因是它相比OLED来说显示颜色丰富,实物展示效果好,同时功耗也控制得住。如果你倾向于更简洁的方案,0.96寸OLED也是可以的,I2C接口只需要两根线,代码也更简单。

执行机构是这个项目里最容易出问题的部分。投递舱门我用了一个SG90舵机来控制开关,舵机转动角度约90度,配合3D打印的拨杆机构完成舱门的锁止和释放。SG90扭矩比较小,如果是大尺寸舱门或者门上有较重书籍压着,建议直接换成MG996R金属齿轮舵机,扭矩可以达到13kg/cm,可靠性高很多。

另一个重要执行部件是回收箱满溢检测。我在回收箱顶部两侧安装了一对红外对射传感器,当书本堆到一定高度时,光束被遮挡,系统判定回收箱已满,进入停止回收状态,并通过屏幕提示运维人员清空。这个功能看着简单,但非常关键——如果箱子满了没有检测,用户继续投递会导致卡书甚至损坏设备。

2.4 电源与低功耗策略

供电方案上,系统统一采用12V/3A的直流电源适配器输入,然后通过MP1584降压模块转为5V给舵机和显示屏供电,再通过AMS1117-3.3稳压芯片转为3.3V给主控、RFID和ESP8266供电。

这里有一个很容易被忽视的细节:SG90舵机启动瞬间电流会冲到500mA以上,如果5V电源带载能力不足,会导致电压跌落,进而引起STM32复位。所以在电源设计上,我是把舵机电源和逻辑电源分开走线的,5V经过一个大容量的电解电容滤波后再给舵机,控制信号和地线独立走线,避免大电流干扰数字电路。

低功耗方面,这个设备是7x24小时通电运行的,我在软件中加入了待机模式:当红外传感器检测到有人在设备前停留时,系统从STOP模式唤醒,点亮屏幕并进入工作状态;如果3分钟内无操作,系统自动关闭屏幕、进入低功耗状态。STM32的STOP模式电流可以降到几十微安级别,整体功耗大部分被ESP8266的WiFi模块消耗掉了,后续可以考虑给ESP8266也加上电源控制,在不需要通信时彻底关断供电。

3. 软件架构与核心流程实现

3.1 软件分层设计与模块划分

软件部分我采用了三层架构:驱动层、业务逻辑层和应用层。

驱动层封装了对硬件的具体操作,包括HX711读取函数、RC522读写函数、ST7735显示函数、舵机PWM控制函数等。这些函数只做最基本的硬件操作,不包含业务判断。比如HX711读取函数只负责读取ADC原始值并返回,至于这个值对应多少克重量,是业务层需要计算的事。

业务逻辑层是整个系统的核心,实现了状态机的流转、重量数据的标定与滤波、图书价格评估、通信协议组装等功能。应用层负责具体的业务流程编排,比如用户投递一本书,应用层会依次调用“检测舱门状态—执行开锁—读取RFID—执行称重—评估价格—显示结果—确认回收—执行关锁”这一系列动作。

这样的分层设计好处很明显:驱动层可以复用,换一块屏幕只需要改驱动层,业务层完全不用动;业务逻辑可以单独调试,我可以写一个测试脚本模拟传感器数据,在没有硬件的情况下验证状态机逻辑是否正确;代码可读性也更好,每个文件职责单一,维护起来不头疼。

3.2 核心状态机:一次完整的回收流程

整个设备的核心是一个有限状态机,我定义了以下几个状态:IDLE空闲态、DETECT检测态、ASSESS评估态、PROCESS执行态、SUCCESS成功态、ERROR错误态。

用户把书放进投递口后,红外传感器触发中断,系统从IDLE进入DETECT态。DETECT态下,系统延时500毫秒等待书籍稳定,然后读取RFID信息和称重数据。这里增加一个延时环节很有必要,因为书籍在投入过程中的晃动会导致重量读数不稳定,延时可以让数据收敛到一个稳定的值。

数据采集完成后进入ASSESS态,系统根据RFID识别到的ISBN号在本地数据库中查询图书定价,再结合书籍重量和磨损程度给出回收估价。如果没有查询到ISBN,系统会提示用户书籍暂不支持回收,并执行退回动作。

用户确认回收后,状态机进入PROCESS态,系统控制舵机打开回收舱门,书籍落入回收箱,舱门关闭,同时通过ESP8266将回收记录上报到云平台。全部动作完成后,状态机回到IDLE态,等待下一次投递。

下面是我写的核心状态机代码:

typedef enum { STATE_IDLE, STATE_DETECT, STATE_ASSESS, STATE_PROCESS, STATE_SUCCESS, STATE_ERROR } SystemState; SystemState currentState = STATE_IDLE; while (1) { switch (currentState) { case STATE_IDLE: if (ir_triggered()) { system_screen_power_on(); currentState = STATE_DETECT; } break; case STATE_DETECT: HAL_Delay(500); book_weight = hx711_read_filtered(); book_rfid = rc522_read_id(); currentState = STATE_ASSESS; break; case STATE_ASSESS: price = assess_book(book_rfid, book_weight); if (price > 0) { display_offer(price); currentState = STATE_PROCESS; } else { display_unsupported(); currentState = STATE_ERROR; } break; // 后续状态处理逻辑省略 } }

3.3 传感器数据处理与标定方法

称重传感器的数据处理是这个项目里比较需要耐心的环节。HX711输出的原始ADC值是一个大约从0到16777215的整数,它和实际重量之间是线性关系,但比例系数需要标定。

我的标定方法是:第一步,传感器空载时读取100次ADC值取平均,记录为零点值;第二步,放上一个已知重量的标准砝码,比如500克的砝码,同样读取100次取平均,记录为标准重量值;第三步,根据公式计算出比例系数。

这只是静态标定,实际运行中还会遇到一个问题:重量信号的抖动很厉害。这是因为传感器本身有噪声,加上设备可能受到附近电机或其他电磁干扰影响。为了解决这个问题,我在软件中加入了滑动平均滤波算法,维护一个长度为10的数据缓冲区,每次取最新值覆盖最旧值,然后计算平均值。这样处理之后,重量读数非常稳定,波动范围控制在正负2克以内。

RFID数据处理的坑则比较隐蔽。RC522读取到的标签ID是4字节或7字节的十六进制数据,不同厂家的标签存储格式不统一,有的带校验位,有的不带。我在做图书信息关联时,是先把RFID标签的UID转成字符串,再去本地数据库匹配。这里一定要注意的是编码格式统一问题,数据库里存的UID字符串必须和RFID读出来的字符串完全一致,大小写和字节序都不能有偏差,否则会出现明明贴了标签却识别不出来的情况。

3.4 数据上报与远程管理

设备产生的每一条回收记录都需要上报到服务器,这里我选择了ESP8266加MQTT协议的方式。MQTT是基于发布/订阅模式的轻量级通信协议,非常适合这种低带宽、不稳定的物联网场景。

数据上报的内容包括:设备ID、回收时间戳、ISBN号、书籍重量、回收价格、是否成功。数据格式用JSON封装,结构清晰,服务器端解析方便。我在STM32端的做法是维护一个发送缓冲区,传感器和业务逻辑层产生的数据都先写入缓冲区,由通信模块统一打包成JSON并通过MQTT客户端发布到指定Topic。

{ "device_id": "BR-001", "timestamp": 1700000000, "isbn": "9787111213826", "weight_g": 483, "price_cny": 12.5, "status": "SUCCESS" }

远程管理的另一个重要功能是设备状态监控。设备每隔30秒发布一次心跳消息,上报当前状态、回收箱容量和固件版本号。如果服务器连续5分钟没有收到某台设备的心跳消息,运维后台就会发出告警,提示设备可能离线或故障。这条逻辑虽然简单,但在实际部署中非常实用——很多时候设备出问题不是因为硬件坏了,而是因为WiFi断开了、电源被意外拔掉了,远程心跳机制能第一时间发现问题。

4. 关键环节实操详解

4.1 PCB设计要点与打样经验

很多人做嵌入式项目喜欢用现成的开发板搭积木,但对于这种需要量产或者长期稳定运行的设备,最后还是得自己画PCB。我在这个项目中设计了主控底板,把所有功能模块的接口和电源电路集成到一块板上。

PCB设计中有几个经验可以分享。首先是地线处理,模拟地和数字地要分开走,在电源入口处单点汇合。HX711采集到的重量信号是毫伏级别的微弱信号,如果数字电路的高频噪声耦合进模拟地,会直接导致测量数据抖动。其次是电源走线加宽,5V和3.3V电源线至少要保证1毫米以上的线宽,减少线路压降。再有就是天线区域的净空,RFID天线下方和周围不能铺铜,否则会影响射频性能。

电容布局上,每个芯片的电源引脚旁边都要放一个104去耦电容,这个属于常规操作,但很多人会偷懒不上。实践下来,少了这些电容的板子在抗干扰测试中问题很多,尤其在有舵机启动和电机运转的场景下,复位现象频发。

板子画好后发嘉立创打样,工艺选的是1.6mm板厚、双面覆铜、绿色阻焊,50x50mm以内的板子5块钱就能打5片,成本非常低。焊接时候注意STM32是LQFP48封装,引脚间距0.5mm,手焊需要一定的技术,建议至少准备一把尖头烙铁和助焊剂,或者直接找工厂贴片,价格也不贵。

4.2 结构组装与整机调试顺序

硬件和软件都准备好之后,最考验耐心的是整机组装阶段。我的经验是遵循“先模块后整机”的调试顺序——先把每一个模块单独通电测试,确认正常工作后再逐步组合起来。

第一步,烧录一个最简单的GPIO控制程序,点亮板载LED,确认最小系统正常运行。这一步能排除芯片虚焊、电源短路等基础问题。

第二步,分别测试各个外设模块。HX711接上传感器后空载读值,确认ADC读数稳定;RC522放一张卡上去,确认能读到UID;屏幕显示测试图案,确认颜色和分辨率正常。每个模块单独测试通过之后,再逐步加入主程序中,一旦出现问题可以立刻锁定是哪个模块带来的。

第三步才是整机联合调试。先测试空舱状态下舵机开关门是否顺畅,再放入一本贴着RFID标签的书做完整流程测试。这里要注意,舵机开关门机构需要多次调校——舵机的初始角度和旋转方向必须和机械结构匹配,如果方向反了,舵机会直接卡死甚至烧坏。

整机连续运行测试我建议至少跑48小时,模拟真实使用场景,每隔一段时间投递一本书,观察系统是否出现死机、数据丢失、舵机失灵等问题。实测下来,最容易出问题的是长时间运行后ESP8266模块的TCP连接断开,需要加上自动重连机制,以及在MQTT断线后缓存未上报的数据,等恢复连接后再补报。

4.3 HX711称重标定实操

HX711的标定是整个项目中为数不多需要反复做的步骤。因为应变片传感器存在温漂和蠕变,每台设备的标定系数都会有细微差别,建议在出厂前逐台进行标定。

我提供一个完整的标定流程参考:

第一步:传感器空载,程序延时2秒让电路稳定,然后连续读取100次ADC值,去掉最大值和最小值后求平均,记录为零点值offset。

第二步:在传感器上放置一个标准砝码,重量记为known_weight,比如500克。同样连续读取100次ADC值,处理方式同上,记录为加载值load_value。

第三步:计算比例系数scale = (load_value - offset) / known_weight。

第四步:将offset和scale保存到STM32内部Flash的特定扇区,程序启动时读取这两个参数用于重量换算。实测重量 = (当前ADC值 - offset) / scale。

这里有一个坑要特别提醒:HX711的ADC值是带符号的24位整数,数据类型要用int32_t,不能直接用uint32_t,否则空载时的负向偏移会导致计算错误。我自己第一次调试时就是吃了这个亏,重量数值忽正忽负,排查了很久才发现是数据类型的问题。

另外,设备在运行过程中每半年应该重新标定一次,因为应变片随着使用会逐渐发生零漂。我们可以在程序中设计一个定时提醒功能,每到标定周期自动提示运维人员执行标定。

4.4 稳定性设计:看门狗与掉电保护

自助设备有一个特点:没有现场人工维护,必须自己处理异常。程序跑飞怎么办?死循环怎么办?断电了数据丢了怎么办?

针对程序跑飞的问题,我在软件中启用了独立看门狗IWDG。主循环每执行一轮都会重置看门狗计数器,如果程序出现死循环或者跑飞无法及时喂狗,看门狗就会自动复位系统,让设备重新启动。看门狗超时时间我设置为2秒,这个时间要大于主循环最坏情况下的执行时间,同时也要保证系统能在合理时间内恢复。

针对断电数据丢失的问题,我做了两层保护。第一层:关键数据如回收记录、标定参数、计数统计值,存储在STM32的Flash模拟EEPROM区域,不依赖外部存储芯片。第二层:在写入数据是采用双备份机制,每次写入先写备份区,再写主数据区,读取时校验主数据区,如果发现校验不通过则自动从备份区恢复。这个机制看起来简单,但能有效防止写入过程中突然断电导致的数据损坏。

还有一个容易被忽略的细节是舵机的堵转保护。舵机在开关舱门时如果被异物卡住,会持续堵转,电流飙高,发热严重,时间长了必烧。我在软件中加了一个超时检测——舵机控制信号发出后3秒内限位开关没有反馈到位信号,系统自动切断舵机电源并报错,同时向云端发送故障告警。这个功能在多台设备部署后真正帮了大忙,至少避免了3台设备舵机烧毁。

5. 调试中的常见问题与排查

这个项目调试过程中,我整理了常见的几类问题和排查方法,做成了速查表,方便你遇到问题时快速定位:

故障现象可能原因排查步骤
STM32无法烧录程序BOOT0引脚电平不对确认BOOT0接GND,烧录时要点复位
称重数据漂移严重地线处理不佳或滤波不够检查模拟地单点接地,加大滑动平均窗口长度
RFID读不到标签天线距金属过近或供电不足天线下方垫亚克力隔离,检查3.3V电源电流
屏幕白屏无显示ST7735初始化时序不对检查复位引脚时序,确认SPI时钟极性配置
ESP8266反复离线电源电压跌落或网络不稳单独给ESP8266加100uF电容缓冲,增加断线重连机制
舵机抖动或转动不到位电源电流不够或机械卡滞舵机电源与逻辑电源隔离,检查拨杆机构运动路径
设备自动重启看门狗超时或电源不稳先排查电源波动,再看主循环是否有长时间阻塞

每一个问题都有背后的深层原因。比如ESP8266反复离线,本质原因是WiFi模块在发射瞬间电流脉冲会拉低电源电压,而STM32和ESP8266共用一条5V供电线的时候,电压跌落会传导给整个系统。把ESP8266的电源单独走线,并在模块旁边加大容量电容之后,这个问题就基本绝迹了。

再比如舵机抖动的问题,很多人第一反应是PID控制参数不对,但如果是开关门这种只有两个位置的场合,根本不需要PID,就是电源带载能力不足。我后来找了块旧手机电池并联在舵机电源上,相当于一个超大容量电容,问题立即消失了。这个经验虽然听起来土,但在应急处理时非常管用。

还有一个调试手法推荐给大家:善用串口日志。我在代码中实现了一个简单的串口日志系统,通过调试串口输出每个状态机的切换信息、关键传感器读数和错误码。曾经有一次设备在运行过程中随机死机,打印出来的日志显示是RFID读取函数在等待响应时没有设置超时,导致程序阻塞在那里。加了一个串口超时判断之后,问题彻底解决。说实话,没有串口日志,这种偶发性问题排查起来基本等于大海捞针。

6. 功能扩展与低成本优化方向

6.1 从单机到联网:云端管理平台的搭建

目前的系统走的是单机设备加MQTT上报的架构,服务器端我用的是一台轻量云服务器,部署了EMQX作为MQTT Broker,后端用Node-RED做数据流转,把回收记录存入MySQL数据库。这样做的好处是部署灵活,逻辑改动不用重新编译设备端代码,直接在服务端改流程就行。

如果你不只是想做一台设备,而是想把多台设备统一管理起来,可以考虑增加一个Web管理后台,用Vue加Element Plus做一个简单的仪表盘,展示各设备的在线状态、今日回收量、回收箱剩余容量、累计回收金额等指标。运维人员可以远程查看设备状态,不需要跑到现场去看。

设备端这边,还可以加入OTA远程固件升级功能。STM32的OTA方案比较成熟,通过串口接收固件包写入外部Flash,然后跳转到Bootloader执行升级。升级包可以先上传到服务器,设备在空闲时段自动下载并升级,这样即使是已经部署到现场的设备,也能持续获得功能更新和bug修复,不用派人到现场拆机刷固件。

6.2 识别方案升级:从RFID到条码识别的低成本替代

RFID方案有一个绕不开的问题:标签成本。虽然有源标签也不贵,但运营方需要提前把每一本书都贴上RFID标签并录入系统,这个工作量在图书量大的时候会变得非常大。

一个可以考虑的低成本替代方案是条码扫码模块。现在的书籍封底基本都有ISBN条码,用户把书放进回收口后,设备通过一个嵌入式的条码扫描模块,直接扫描ISBN条码,自动联网查询书籍信息,无需提前贴标签。这样运营方就不需要做图书预录入,设备部署的灵活性会大幅提升。

嵌入式条码扫描模块目前的价格已经降到几十元,接口是串口,数据格式是ASCII码,和STM32对接非常方便。如果要切换到这个方案,硬件上只需要把RFID模块换成扫码模块,软件上增加一个解析条码数据的函数,其他流程不用改动,成本节约效果和用户体验提升都比较明显。

6.3 书况检测与回收定价优化

在回收定价环节,现在的逻辑比较粗糙,主要根据ISBN和重量估算。但实际上一本九成新的教材和一本画满笔记、封面破损的教材,回收价格应该不同。后续可以考虑加入摄像头图像识别来判断书况。

STM32F103算力有限,跑不了复杂的图像识别模型,但可以走两条路:一条是选用带摄像头接口和DSP的STM32H7系列,板载跑轻量级的图像分类模型,判断书的磨损程度;另一条是设备端只负责拍照,把图片上传到服务器,由服务器端的AI模型做书况评估,再把结果返回给设备终端。

我在测试中发现,对于异常磨损状态的判断,一个简单的思路是用图像中的文字完整度来做参考——书页边缘是否泛黄、封面是否有明显折痕。这些特征用传统的图像处理算法,比如颜色直方图、边缘检测、纹理分析,也能提取出来,不一定要上深度学习模型。考虑到硬件成本,目前阶段我更推荐传统图像处理方案。

6.4 多品类回收与模块化设计展望

这个项目的硬件架构其实不局限于收书,只要把识别模块和执行模块换成对应的类型,就可以扩展到旧衣回收、塑料瓶回收、电子产品回收等场景。我把设备主板上的接口都做成了模块化设计,传感器、执行机构、通信模块都通过排针插座连接,换一个场景只要换对应模块,主控板和软件框架完全不用动。

在结构设计上也可以考虑加入双箱体,一类书籍回收箱,一类是其他物品回收箱,通过识别结果自动选择落入哪个箱体。这个思路我在论文答辩时老师提过,确实是个值得探索的方向,做出来会让应用场景宽很多。

我个人在实际调试中的一点体会是:模块化设计虽然前期会多花一些时间和精力,但后期维护和功能扩展省下来的时间远远超过投入。比如有次一个HX711模块烧坏了,现场没有同型号,我直接从另一台闲置设备上拆了一个下来换上,代码一行没改就能用。这种便利性,只有真正做过模块化设计的人才能体会到。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询