发新帖本帖赏金 100.00元(功能说明)我要提问
返回列表
[技术讨论]

智能垃圾桶维修和改造

[复制链接]
1207|12
手机看帖
扫描二维码
随时随地手机跟帖
zhoushangshi|  楼主 | 2024-4-25 15:15 | 显示全部楼层 |阅读模式
本帖最后由 zhoushangshi 于 2024-4-27 09:26 编辑

#申请原创#  @21小跑堂             智能垃圾桶维修和改造
1 背景
      现在AI都这么火,相信不少家庭多多少少都配有智能家居家电,智能电视、智能空调、智能洗衣机、智能马桶、智能窗帘等等...智能垃圾桶我相信也有很多家庭都有吧,最近我家里智能垃圾桶盖子不能自动开关了,再加上家里小孩不会手势,也不回触摸按键,经常用手抠智能垃圾桶盖子,关盖子则是用手按盖子,总觉得用手不干净,心想用脚踢盖子就开了多好呀了,可惜这款垃圾桶没有脚踢的功能,买一个新的把这个扔掉就可惜了,于是拆卸下来看看。

2 拆卸


15d838ba1e5de01bc2167c7262aa0b9e
手势开不了盖子,红灯亮,绿灯不会亮,正常的话会亮绿灯,然后盖子自动打开。

513c3342b8ca0676b6b6c0dab9f39068
先掀开盖子看看里面的结构,大家能看到装电池的槽,两节五号电池串联起来的,就是3V电源。

8ea64065523e24c118d51158157eb999
螺丝刀拆下红圈位置的螺丝

c4299d4a806ecdd6a11a09ca8e61f253
螺丝卸掉后,拆开面板,就看到了主控板子和电机

a501b3ecef18b0c17db41dd58b023001

6615cc3789ff5d7e570ff8cf4911a0ee

c4e6cfd65a1a7340a6730787a5461337
电机转动带动齿轮来开关盖子。

204d123db60c64eddd0084ab11fa8b44
卸掉主板上螺丝,拿下主板研究,正面看到的是一个8段的数码管,手势开盖子的时候,数码管会流水灯一下;两个触摸弹簧,分别负责开和关盖子;一对红外发射管和接收管,发射管发出特定的频率的红外线,当没有障碍物挡住的时候,接收管收不到红外线发射出去的红外线,当有障碍物或者人的手挡住的时候,发射管发射出去的红外线经障碍物反射回来就会被接收管接收到;一个双色直插LED灯,可以显示红色和绿色。

d051a4367ebf14174ac088a84bf72631
主板反面看到三个芯片,一些电阻电容。

530502553c599296539af40a2566adeb
电机驱动芯片,看到型号是SA8301,工作电压范围2.0-7.0V,两节电池串起来3V在这工作范围,低待机电流,此器件能够驱动一个直流无刷电机, 由功率PMOS和NMOS组成, 集成了电机正转、反转、停止、刹车四个功能。广泛用到小家电、玩具、手机支架。

c154f69295dd2107123bf21bd24492d2
触摸按键芯片打磨掉了,看不到信号,看封装和引脚分布这个芯片应该是MTC202SE,两通道电容感应式触摸按键芯片,工作电压范围2.4-5.5V,有效触摸反应时间小于80ms,低功耗带休眠模式,休眠唤醒无延时,休眠功耗7uA左右,在有绝缘介质(玻璃、 亚克力、 塑料、 陶瓷等) 隔离保护的情况下实现触摸功能。

2493c8400fba9fd5312b0cc96e6aea89
9d24e72411719a7793df5bcb7c3c809f
MTC202SE

a6093f3d8ac3adb51333080d3db0403b
MCU型号是晟矽的MC32F7062,8位CPU内核,18个I/O口,4Kx16位FLASH型程序存储器。

03c388084df639f3b666ad3ad92f78b9

3 维修


0f69d37ac15b8fb13a4ef4c44ca9037b
拆下来后先通电看看,夹上3V电源,电流检测不到,应该是很小没有显示出来。

aa8e60a4d7a1a309fd816ebb01661953
手挡住,看到灯会亮绿灯,数码管也会亮。

827ccc277876210906d0a29d7c736ee0
用示波器看一下驱动电机信号正常,用手挡一下,灯亮绿灯,数码管流水一下最后全亮,都是正常的。

822634511e16074d007cef38f89b8af0
图片蓝色和红色表笔测的是驱动电机的信号,前面是开盖子的信号,后面是关盖子的信号,看波形都是正常的波形,应该可以自动开盖子,5秒后关盖子。

603df1514dee080e1899c7c086ad66d1
MCU的IO口分配图


6ae0e2f33a20ed870effde8853150f13
红外线发射和接收的电路,发射管是由IO口P04发出的PWM驱动的

fcca1adefe936ea2a95357d6a5b5783f
示波器红色通道是发射管信号,黄色通道是接收管的A极IFR_A,蓝色通道是接收管接收脚IFR_R,在红外发射管发出特定的频率的时候,红外接收管没有遮挡的话,蓝色是高电平的。

1d8f6815d32195dcbca4804d330d08e0
红外接收管有遮挡物的时候,接收脚蓝色通道是低电平的。靠着电平高低判断就能知道有没有遮挡物。

1ba0716dc00e07652612b8a789940744
红色通道就是发射管的pwm信号,频率大概36Khz

触摸电路,TP1OUT,TP0OUT接到MCU IO上,TP1OUT\TP1OUT平时是高电平,弹簧触摸后会拉低几十毫秒。
d367a887f21f08d771a15fdfa0e3dd93


0721a027c23ab06f0cbfba4d391c1a0b
触摸一下按键,MTC202对应的脚会拉低60毫秒左右。

3083456bfb9616a7e2e273556c8a4fe0
数码管的电路图,需要哪段亮,IO口拉低即可。
看这电路和测试波形都是正常的,重新把板子装回去功能也是正常的,触摸按键正常,手遮挡也是可以开盖子的,5秒后自动关盖子,一切都正常。之前手遮挡开不了盖子估计是红外接收外面面板脏了。

4 改造
      下面就该开始改造了,
脚踢开盖子,需要一个检测震动的东西。

想到有三种检测震动的东西:
1 SMD滚珠震动感应开关
2 电阻型震动传感器
3 震动模块

震动模块太大不合适,电阻型震动传感器是直插的不方便,滚珠震动感应开关是贴片的,小封装的,买这个回来测试一下。
de0ffd9ecc69b886547f905ed707466d
滚珠震动感应开关

dc1b787acd7e87d694d40ee175e51e5d
把买回来的开关,一脚直接接到MCU的P12脚上,一脚接GND上,接到OPEN触摸检测的IO口,一震动相当于触摸OPEN触摸弹簧了,测一下震动波形。

b45246bec03a1957f52b12a9501037b5
一震动电平是有拉低,但是电平拉低的时间不够,没有达到几十毫秒的时候,垃圾桶里的程序是不能判断,不能执行开盖子的动作,把开关接到红外接收管接收IO口上也不行,因为得需要在红外发射管发出特定频率的PWM的时候拉低才可以,而且我测试过红外接收管接收IO口一直拉低也是不行的,这就证明不发PWM时候得是高电平。
震动是瞬间的,震动信号肯定达不到几十毫秒的,用垃圾桶现有的程序肯定实现不了脚踢的功能。

想要实现脚踢的办法:

1 买一个脚踢功能的垃圾桶
2 用垃圾桶现有板子,重新写代码重新烧写
3 加一个模块检测震动信号

第一个办法,再买一个带有脚踢功能的垃圾桶,旧垃圾桶就该扔掉。第二个办法用垃圾桶现有板子,重新写代码重新烧写,烧写就需要买晟矽MCU的烧录器。思来想去还是第三个办法更有性价比,用淘汰掉的老板子重新拾起来,来检测震动信号,也算是废物利用,电子垃圾再发挥余热。
c07905f96a066d69c7b1e84d5ed62401 96220f1bb5fd022c1e967c5d1340992a 99b3cce0f5c5443c0e804a0417c09532 95ad2d9c198cb1a06917eb70a1396ffc
震动开关一头串一个电阻接3V,,另外一端接IO口,IO口平时是低电平,一震动有高电平,以此判断是否震动。自己旧板子用到三个IO,一个IO检测震动,一个IO控制触摸开,接到垃圾桶板子的P12上,一个IO控制触摸关,接到垃圾桶板子上的P11。旧板子电源和GND连到垃圾桶板子上的电源和GND,信号线两条和电源线总共四条线。

硬件接好了,就该敲软件了,MCU用的ST的STM32.

首先先配置IO口,开关门的IO口配置:
e06ee13018a273f56b2b6ed3a79f70d6

检测震动开关的IO口配置:
0a7fb9f17f78bddfb21af7d7e13e6de6

主流程代码,加上休眠,震动后唤醒:
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();
        }
}



代码敲好了,用示波器看看波形。
b5f7551a8e7c0778e46d642e283ede61
蓝色道通是震动开关的信号,黄色通道是开盖子信号,绿色通道是关盖子信号,一检测到震动信号先开盖子然后延时4秒后关盖子,流程正常,装上垃圾桶上试一试。

1259b059ba0403372783fdfff6437c21

装上去,用脚踢一下,终于可以开盖子了,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小跑堂 打赏了 100.00 元 2024-04-28
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
zhoushangshi 2024-4-28 16:04 回复TA
@21小跑堂 :谢谢小跑堂大佬的肯定! 
21小跑堂 2024-4-28 15:50 回复TA
超级详细的智能垃圾桶改造升级过程,从硬件拆解到方案分析再到软件升级,每一步都很详细,改造难度可能不是很大,但是动手和记录的过程值得肯定。 
zhoushangshi 2024-4-26 10:32 回复TA
@qintian0303 :维修和改造,原本遮挡是开不了的,拆完后重新按上去就好了,估计是线松了或者是红外感应的问题,后来加了脚踢功能,也算是DIY了吧。 
qintian0303 2024-4-26 10:22 回复TA
你这不是修啊,这是大改了,自己写控制代码,索性器件都没有坏 

相关帖子

springvirus| | 2024-4-26 08:31 | 显示全部楼层
灰常不错!!!!

使用特权

评论回复
zhoushangshi|  楼主 | 2024-4-26 09:24 | 显示全部楼层
springvirus 发表于 2024-4-26 08:31
灰常不错!!!!

使用特权

评论回复
qintian0303| | 2024-4-26 10:36 | 显示全部楼层
我有个洗手机也是,现在开开就停不了了,只能拔电池,准备研究一下,然后看看能不能修,不能就自己设计一个新的控制板

使用特权

评论回复
zhoushangshi|  楼主 | 2024-4-26 10:41 | 显示全部楼层
qintian0303 发表于 2024-4-26 10:36
我有个洗手机也是,现在开开就停不了了,只能拔电池,准备研究一下,然后看看能不能修,不能就自己设计一个 ...

对,有想法就行动起来

使用特权

评论回复
mwxpk| | 2024-4-27 10:12 | 显示全部楼层
纯智商玩具。孩子会模仿学的,有一个重点就是怕痛,打他几次就记住了。

使用特权

评论回复
zhoushangshi|  楼主 | 2024-4-27 10:17 | 显示全部楼层
mwxpk 发表于 2024-4-27 10:12
纯智商玩具。孩子会模仿学的,有一个重点就是怕痛,打他几次就记住了。

连狗都嫌弃的两岁小孩,讲道理听不懂的,打不可取吧,又不是很危险的动作,不能打

使用特权

评论回复
天意无罪| | 2024-4-27 23:45 | 显示全部楼层
不错哦,先给楼主点个赞,另外这个电机楼主确定是伺服电机?

使用特权

评论回复
zhoushangshi|  楼主 | 2024-4-28 08:44 | 显示全部楼层
天意无罪 发表于 2024-4-27 23:45
不错哦,先给楼主点个赞,另外这个电机楼主确定是伺服电机?

谢谢!确定不是伺服电机

使用特权

评论回复
发新帖 本帖赏金 100.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

124

帖子

0

粉丝