本帖最后由 zhoushangshi 于 2024-4-27 09:26 编辑
#申请原创# @21小跑堂 智能垃圾桶维修和改造
1 背景
现在AI都这么火,相信不少家庭多多少少都配有智能家居家电,智能电视、智能空调、智能洗衣机、智能马桶、智能窗帘等等...智能垃圾桶我相信也有很多家庭都有吧,最近我家里智能垃圾桶盖子不能自动开关了,再加上家里小孩不会手势,也不回触摸按键,经常用手抠智能垃圾桶盖子,关盖子则是用手按盖子,总觉得用手不干净,心想用脚踢盖子就开了多好呀了,可惜这款垃圾桶没有脚踢的功能,买一个新的把这个扔掉就可惜了,于是拆卸下来看看。
2 拆卸
手势开不了盖子,红灯亮,绿灯不会亮,正常的话会亮绿灯,然后盖子自动打开。
先掀开盖子看看里面的结构,大家能看到装电池的槽,两节五号电池串联起来的,就是3V电源。
螺丝刀拆下红圈位置的螺丝
螺丝卸掉后,拆开面板,就看到了主控板子和电机
电机转动带动齿轮来开关盖子。
卸掉主板上螺丝,拿下主板研究,正面看到的是一个8段的数码管,手势开盖子的时候,数码管会流水灯一下;两个触摸弹簧,分别负责开和关盖子;一对红外发射管和接收管,发射管发出特定的频率的红外线,当没有障碍物挡住的时候,接收管收不到红外线发射出去的红外线,当有障碍物或者人的手挡住的时候,发射管发射出去的红外线经障碍物反射回来就会被接收管接收到;一个双色直插LED灯,可以显示红色和绿色。
主板反面看到三个芯片,一些电阻电容。
电机驱动芯片,看到型号是SA8301,工作电压范围2.0-7.0V,两节电池串起来3V在这工作范围,低待机电流,此器件能够驱动一个直流无刷电机, 由功率PMOS和NMOS组成, 集成了电机正转、反转、停止、刹车四个功能。广泛用到小家电、玩具、手机支架。
触摸按键芯片打磨掉了,看不到信号,看封装和引脚分布这个芯片应该是MTC202SE,两通道电容感应式触摸按键芯片,工作电压范围2.4-5.5V,有效触摸反应时间小于80ms,低功耗带休眠模式,休眠唤醒无延时,休眠功耗7uA左右,在有绝缘介质(玻璃、 亚克力、 塑料、 陶瓷等) 隔离保护的情况下实现触摸功能。
MTC202SE
MCU型号是晟矽的MC32F7062,8位CPU内核,18个I/O口,4Kx16位FLASH型程序存储器。
3 维修
拆下来后先通电看看,夹上3V电源,电流检测不到,应该是很小没有显示出来。
手挡住,看到灯会亮绿灯,数码管也会亮。
用示波器看一下驱动电机信号正常,用手挡一下,灯亮绿灯,数码管流水一下最后全亮,都是正常的。
图片蓝色和红色表笔测的是驱动电机的信号,前面是开盖子的信号,后面是关盖子的信号,看波形都是正常的波形,应该可以自动开盖子,5秒后关盖子。
MCU的IO口分配图
红外线发射和接收的电路,发射管是由IO口P04发出的PWM驱动的
示波器红色通道是发射管信号,黄色通道是接收管的A极IFR_A,蓝色通道是接收管接收脚IFR_R,在红外发射管发出特定的频率的时候,红外接收管没有遮挡的话,蓝色是高电平的。
红外接收管有遮挡物的时候,接收脚蓝色通道是低电平的。靠着电平高低判断就能知道有没有遮挡物。
红色通道就是发射管的pwm信号,频率大概36Khz
触摸电路,TP1OUT,TP0OUT接到MCU IO上,TP1OUT\TP1OUT平时是高电平,弹簧触摸后会拉低几十毫秒。
触摸一下按键,MTC202对应的脚会拉低60毫秒左右。
数码管的电路图,需要哪段亮,IO口拉低即可。
看这电路和测试波形都是正常的,重新把板子装回去功能也是正常的,触摸按键正常,手遮挡也是可以开盖子的,5秒后自动关盖子,一切都正常。之前手遮挡开不了盖子估计是红外接收外面面板脏了。
4 改造
下面就该开始改造了,
脚踢开盖子,需要一个检测震动的东西。
想到有三种检测震动的东西:
1 SMD滚珠震动感应开关
2 电阻型震动传感器
3 震动模块
震动模块太大不合适,电阻型震动传感器是直插的不方便,滚珠震动感应开关是贴片的,小封装的,买这个回来测试一下。
滚珠震动感应开关
把买回来的开关,一脚直接接到MCU的P12脚上,一脚接GND上,接到OPEN触摸检测的IO口,一震动相当于触摸OPEN触摸弹簧了,测一下震动波形。
一震动电平是有拉低,但是电平拉低的时间不够,没有达到几十毫秒的时候,垃圾桶里的程序是不能判断,不能执行开盖子的动作,把开关接到红外接收管接收IO口上也不行,因为得需要在红外发射管发出特定频率的PWM的时候拉低才可以,而且我测试过红外接收管接收IO口一直拉低也是不行的,这就证明不发PWM时候得是高电平。
震动是瞬间的,震动信号肯定达不到几十毫秒的,用垃圾桶现有的程序肯定实现不了脚踢的功能。
想要实现脚踢的办法:
1 买一个脚踢功能的垃圾桶
2 用垃圾桶现有板子,重新写代码重新烧写
3 加一个模块检测震动信号
第一个办法,再买一个带有脚踢功能的垃圾桶,旧垃圾桶就该扔掉。第二个办法用垃圾桶现有板子,重新写代码重新烧写,烧写就需要买晟矽MCU的烧录器。思来想去还是第三个办法更有性价比,用淘汰掉的老板子重新拾起来,来检测震动信号,也算是废物利用,电子垃圾再发挥余热。
震动开关一头串一个电阻接3V,,另外一端接IO口,IO口平时是低电平,一震动有高电平,以此判断是否震动。自己旧板子用到三个IO,一个IO检测震动,一个IO控制触摸开,接到垃圾桶板子的P12上,一个IO控制触摸关,接到垃圾桶板子上的P11。旧板子电源和GND连到垃圾桶板子上的电源和GND,信号线两条和电源线总共四条线。
硬件接好了,就该敲软件了,MCU用的ST的STM32.
首先先配置IO口,开关门的IO口配置:
检测震动开关的IO口配置:
主流程代码,加上休眠,震动后唤醒:
void SLEEP_WAIT_BUTTON(void)
{
HAL_TIM_Base_DeInit(&htim2);
HAL_TIM_Base_DeInit(&htim21);
HAL_TIM_Base_DeInit(&htim22);
__HAL_SPI_DISABLE(&hspi1);
__HAL_UART_DISABLE(&huart2);
Usart_io_init_Sleep();
OPEN_CLOSE_KEY_Init_INPUT();
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
HAL_SuspendTick();
HAL_PWREx_EnableUltraLowPower();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);
HAL_ResumeTick();
while(1)
{
if( flag_status ==1 )//是否有震动
{
flag_status=0; //震动标志清零
Led_out();
Led_1();
OPEN_CLOSE_KEY_Init_OUT();
OPEN_Pin_L;
TIM2_Init();
time_start(2);
TIM2->CNT=0;
while( TIM2->CNT < 50000 ); //延时200ms
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
OPEN_Pin_H;
Led_0();
for(uint8_t i=0;i<40;i++) //延时4秒
{
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
}
CLOSE_Pin_L;
TIM2_Init();
time_start(2);
TIM2->CNT=0;
while( TIM2->CNT < 50000 ); //延时200ms
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
CLOSE_Pin_H;
}
OPEN_CLOSE_KEY_Init_INPUT();
HAL_TIM_Base_DeInit(&htim2);
HAL_TIM_Base_DeInit(&htim21);
HAL_TIM_Base_DeInit(&htim22);
__HAL_SPI_DISABLE(&hspi1);
__HAL_UART_DISABLE(&huart2);
Usart_io_init_Sleep();
HAL_SuspendTick();
HAL_PWREx_EnableUltraLowPower();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);
HAL_ResumeTick();
}
}
代码敲好了,用示波器看看波形。
蓝色道通是震动开关的信号,黄色通道是开盖子信号,绿色通道是关盖子信号,一检测到震动信号先开盖子然后延时4秒后关盖子,流程正常,装上垃圾桶上试一试。
装上去,用脚踢一下,终于可以开盖子了,4秒左右自动关盖子。挺灵敏的,可以说灵敏过头了,脚在垃圾桶边上的地上,
用力跺一下脚,它都可以感应到震动,哈哈....
通过测试发现问题了:
1 关盖子时候电机转,垃圾桶也是震动的,这点我忽略掉了,关盖子后我立马就去休眠了,这时候电机在关盖子会有震动,
然后执行开盖子动作,这时候请求开盖子,垃圾桶在关盖子就不会响应开这个动作,4秒后又执行关盖子动作,
导致关盖子动作来了两次。
【智能垃圾桶第一次改造,遮挡开后关了两次-哔哩哔哩】
怎么解决呢?
在开盖子动作关盖子动作完成后,延时2秒后再清掉震动标志位,相当于在开盖子动作关盖子动作完成后
延时2秒后再开始检测震动,这样盖子就不会关两次了。
2 遮挡开盖子时候,原垃圾桶是5秒左右自动关盖子,开盖子时候会有震动,自己写的程序4秒后关盖子,这样
又导致了关两次盖子,自写程序关了一次,原垃圾桶又关了一次,所以我把延时4秒后关盖子改成延时6秒后关
盖子。遮挡开盖子后5秒后关盖子,我6秒后会请求关盖子,这时候元垃圾桶是不会执行关盖子的动作的。
至此完美解决掉这两个问题,不会关两次盖子。
【智能垃圾桶第一次改造,遮挡开后关了两次-哔哩哔哩】
改完代码如下:void SLEEP_WAIT_BUTTON(void)
{
HAL_TIM_Base_DeInit(&htim2);
HAL_TIM_Base_DeInit(&htim21);
HAL_TIM_Base_DeInit(&htim22);
//HAL_UART_DeInit(&huart2);
__HAL_SPI_DISABLE(&hspi1);
__HAL_UART_DISABLE(&huart2);
Usart_io_init_Sleep();
OPEN_CLOSE_KEY_Init_INPUT();
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
HAL_SuspendTick();
HAL_PWREx_EnableUltraLowPower();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);
HAL_ResumeTick();
while(1)
{
if( flag_status ==1 ) //是否有震动
{
// flag_status=0; //此时清不合适,开盖子电机转起来会有震动,电机转动完震动标志再清零
Led_out();
Led_1();
OPEN_CLOSE_KEY_Init_OUT();
OPEN_Pin_L;
TIM2_Init();
time_start(2);
TIM2->CNT=0;
while( TIM2->CNT < 50000 ); //延时200ms
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
OPEN_Pin_H;
Led_0();
//for(uint8_t i=0;i<40;i++) //延时4秒,遮挡物开盖会有震动,4秒后关盖子会影响遮挡开启后的关闭动作
for(uint8_t i=0;i<60;i++) //延时6秒,遮挡开盖会有震动,遮挡物开启关闭期间有5秒左右的时间
{
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
}
CLOSE_Pin_L;
TIM2_Init();
time_start(2);
TIM2->CNT=0;
while( TIM2->CNT < 50000 ); //延时200ms
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
CLOSE_Pin_H;
for(uint8_t i=0;i<20;i++) //延时2秒等待盖子关上,震动标志再清零
{
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
TIM2->CNT=0;
while( TIM2->CNT < 50000 );
}
flag_status=0; //震动标志再清零
}
OPEN_CLOSE_KEY_Init_INPUT();
HAL_TIM_Base_DeInit(&htim2);
HAL_TIM_Base_DeInit(&htim21);
HAL_TIM_Base_DeInit(&htim22);
__HAL_SPI_DISABLE(&hspi1);
__HAL_UART_DISABLE(&huart2);
Usart_io_init_Sleep();
HAL_SuspendTick();
HAL_PWREx_EnableUltraLowPower();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);
HAL_ResumeTick();
}
}
【第二次改造脚踢开正常-哔哩哔哩】
【第二次改造遮挡开正常-哔哩哔哩】
至此宣布,垃圾桶改造完美结束!
虽然这期间不是很顺利,碰到一些问题,碰到问题积极想办法解决问题这种态度可取的.
特此记录!
|
@21小跑堂 :谢谢小跑堂大佬的肯定!
超级详细的智能垃圾桶改造升级过程,从硬件拆解到方案分析再到软件升级,每一步都很详细,改造难度可能不是很大,但是动手和记录的过程值得肯定。
@qintian0303 :维修和改造,原本遮挡是开不了的,拆完后重新按上去就好了,估计是线松了或者是红外感应的问题,后来加了脚踢功能,也算是DIY了吧。
你这不是修啊,这是大改了,自己写控制代码,索性器件都没有坏