返回列表 发新帖我要提问本帖赏金: 100.00元(功能说明)

[技术讨论] 智能垃圾桶维修和改造

[复制链接]
 楼主| zhoushangshi 发表于 2024-4-25 15:15 | 显示全部楼层 |阅读模式
<
本帖最后由 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口配置:


主流程代码,加上休眠,震动后唤醒:
  1. void SLEEP_WAIT_BUTTON(void)
  2. {
  3.         HAL_TIM_Base_DeInit(&htim2);
  4.         HAL_TIM_Base_DeInit(&htim21);
  5.         HAL_TIM_Base_DeInit(&htim22);
  6.         __HAL_SPI_DISABLE(&hspi1);
  7.         __HAL_UART_DISABLE(&huart2);
  8.         Usart_io_init_Sleep();
  9.         OPEN_CLOSE_KEY_Init_INPUT();
  10.         HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
  11.         HAL_SuspendTick();
  12.         HAL_PWREx_EnableUltraLowPower();
  13.         __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  14.         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);
  15.         HAL_ResumeTick();
  16.         while(1)
  17.         {
  18.                 if( flag_status ==1 )//是否有震动
  19.                 {
  20.                         flag_status=0;  //震动标志清零
  21.                         Led_out();
  22.                         Led_1();
  23.                         OPEN_CLOSE_KEY_Init_OUT();
  24.                         OPEN_Pin_L;
  25.                         TIM2_Init();
  26.                         time_start(2);
  27.                         TIM2->CNT=0;
  28.                         while( TIM2->CNT < 50000 ); //延时200ms
  29.                         TIM2->CNT=0;
  30.                         while( TIM2->CNT < 50000 );
  31.                         TIM2->CNT=0;
  32.                         while( TIM2->CNT < 50000 );
  33.                         TIM2->CNT=0;
  34.                         while( TIM2->CNT < 50000 );
  35.                         OPEN_Pin_H;
  36.                         Led_0();
  37.                         for(uint8_t i=0;i<40;i++)  //延时4秒
  38.                         {
  39.                                 TIM2->CNT=0;
  40.                                 while( TIM2->CNT < 50000 );
  41.                                 TIM2->CNT=0;
  42.                                 while( TIM2->CNT < 50000 );
  43.                         }
  44.                         CLOSE_Pin_L;
  45.                         TIM2_Init();
  46.                         time_start(2);
  47.                         TIM2->CNT=0;
  48.                         while( TIM2->CNT < 50000 ); //延时200ms
  49.                         TIM2->CNT=0;
  50.                         while( TIM2->CNT < 50000 );
  51.                         TIM2->CNT=0;
  52.                         while( TIM2->CNT < 50000 );
  53.                         TIM2->CNT=0;
  54.                         while( TIM2->CNT < 50000 );
  55.                         CLOSE_Pin_H;
  56.                 }
  57.                 OPEN_CLOSE_KEY_Init_INPUT();
  58.                 HAL_TIM_Base_DeInit(&htim2);
  59.                 HAL_TIM_Base_DeInit(&htim21);
  60.                 HAL_TIM_Base_DeInit(&htim22);
  61.                 __HAL_SPI_DISABLE(&hspi1);
  62.                 __HAL_UART_DISABLE(&huart2);
  63.                 Usart_io_init_Sleep();
  64.                 HAL_SuspendTick();
  65.                 HAL_PWREx_EnableUltraLowPower();
  66.                 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  67.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);
  68.                 HAL_ResumeTick();
  69.         }
  70. }



代码敲好了,用示波器看看波形。

蓝色道通是震动开关的信号,黄色通道是开盖子信号,绿色通道是关盖子信号,一检测到震动信号先开盖子然后延时4秒后关盖子,流程正常,装上垃圾桶上试一试。



装上去,用脚踢一下,终于可以开盖子了,4秒左右自动关盖子。挺灵敏的,可以说灵敏过头了,脚在垃圾桶边上的地上,
用力跺一下脚,它都可以感应到震动,哈哈....

通过测试发现问题了:
1 关盖子时候电机转,垃圾桶也是震动的,这点我忽略掉了,关盖子后我立马就去休眠了,这时候电机在关盖子会有震动,
然后执行开盖子动作,这时候请求开盖子,垃圾桶在关盖子就不会响应开这个动作,4秒后又执行关盖子动作,
导致关盖子动作来了两次。
【智能垃圾桶第一次改造,遮挡开后关了两次-哔哩哔哩】
https://www.bilibili.com/video/BV1Tt421778N/?buvid=ZB43ADB7CA19CA704E2AAE518E316C49CB6D&is_story_h5=false&mid=IJdwBnGUTq10v2wkJzDZ6Q%3D%3D&plat_id=147&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=F5BEA99E-DBEE-4D4F-9534-FB71F7D527E2&share_source=COPY&share_tag=s_i×tamp=1714180674&unique_k=HDlZRj1&up_id=1956038612

怎么解决呢?
在开盖子动作关盖子动作完成后,延时2秒后再清掉震动标志位,相当于在开盖子动作关盖子动作完成后
延时2秒后再开始检测震动,这样盖子就不会关两次了。

2 遮挡开盖子时候,原垃圾桶是5秒左右自动关盖子,开盖子时候会有震动,自己写的程序4秒后关盖子,这样
又导致了关两次盖子,自写程序关了一次,原垃圾桶又关了一次,所以我把延时4秒后关盖子改成延时6秒后关
盖子。遮挡开盖子后5秒后关盖子,我6秒后会请求关盖子,这时候元垃圾桶是不会执行关盖子的动作的。
至此完美解决掉这两个问题,不会关两次盖子。

【智能垃圾桶第一次改造,遮挡开后关了两次-哔哩哔哩】
https://www.bilibili.com/video/BV1Tt421778N/?buvid=ZB43ADB7CA19CA704E2AAE518E316C49CB6D&is_story_h5=false&mid=IJdwBnGUTq10v2wkJzDZ6Q%3D%3D&plat_id=147&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=F5BEA99E-DBEE-4D4F-9534-FB71F7D527E2&share_source=COPY&share_tag=s_i×tamp=1714180674&unique_k=HDlZRj1&up_id=1956038612

改完代码如下:
  1. void SLEEP_WAIT_BUTTON(void)
  2. {
  3.         HAL_TIM_Base_DeInit(&htim2);
  4.         HAL_TIM_Base_DeInit(&htim21);
  5.         HAL_TIM_Base_DeInit(&htim22);
  6.         //HAL_UART_DeInit(&huart2);
  7.         __HAL_SPI_DISABLE(&hspi1);
  8.         __HAL_UART_DISABLE(&huart2);
  9.         Usart_io_init_Sleep();
  10.         OPEN_CLOSE_KEY_Init_INPUT();
  11.         HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
  12.         HAL_SuspendTick();
  13.         HAL_PWREx_EnableUltraLowPower();
  14.         __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  15.         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);
  16.         HAL_ResumeTick();
  17.         while(1)
  18.         {
  19.                 if( flag_status ==1 ) //是否有震动
  20.                 {
  21.                         //  flag_status=0;  //此时清不合适,开盖子电机转起来会有震动,电机转动完震动标志再清零
  22.                         Led_out();
  23.                         Led_1();
  24.                         OPEN_CLOSE_KEY_Init_OUT();
  25.                         OPEN_Pin_L;
  26.                         TIM2_Init();
  27.                         time_start(2);
  28.                         TIM2->CNT=0;
  29.                         while( TIM2->CNT < 50000 ); //延时200ms
  30.                         TIM2->CNT=0;
  31.                         while( TIM2->CNT < 50000 );
  32.                         TIM2->CNT=0;
  33.                         while( TIM2->CNT < 50000 );
  34.                         TIM2->CNT=0;
  35.                         while( TIM2->CNT < 50000 );
  36.                         OPEN_Pin_H;
  37.                         Led_0();
  38.                         //for(uint8_t i=0;i<40;i++)  //延时4秒,遮挡物开盖会有震动,4秒后关盖子会影响遮挡开启后的关闭动作
  39.                         for(uint8_t i=0;i<60;i++)  //延时6秒,遮挡开盖会有震动,遮挡物开启关闭期间有5秒左右的时间
  40.                         {
  41.                                 TIM2->CNT=0;
  42.                                 while( TIM2->CNT < 50000 );
  43.                                 TIM2->CNT=0;
  44.                                 while( TIM2->CNT < 50000 );
  45.                         }
  46.                         CLOSE_Pin_L;
  47.                         TIM2_Init();
  48.                         time_start(2);
  49.                         TIM2->CNT=0;
  50.                         while( TIM2->CNT < 50000 ); //延时200ms
  51.                         TIM2->CNT=0;
  52.                         while( TIM2->CNT < 50000 );
  53.                         TIM2->CNT=0;
  54.                         while( TIM2->CNT < 50000 );
  55.                         TIM2->CNT=0;
  56.                         while( TIM2->CNT < 50000 );
  57.                         CLOSE_Pin_H;
  58.                         for(uint8_t i=0;i<20;i++)  //延时2秒等待盖子关上,震动标志再清零
  59.                         {
  60.                                 TIM2->CNT=0;
  61.                                 while( TIM2->CNT < 50000 );
  62.                                 TIM2->CNT=0;
  63.                                 while( TIM2->CNT < 50000 );
  64.                         }
  65.                         flag_status=0;  //震动标志再清零
  66.                 }
  67.                 OPEN_CLOSE_KEY_Init_INPUT();
  68.                 HAL_TIM_Base_DeInit(&htim2);
  69.                 HAL_TIM_Base_DeInit(&htim21);
  70.                 HAL_TIM_Base_DeInit(&htim22);
  71.                 __HAL_SPI_DISABLE(&hspi1);
  72.                 __HAL_UART_DISABLE(&huart2);
  73.                 Usart_io_init_Sleep();
  74.                 HAL_SuspendTick();
  75.                 HAL_PWREx_EnableUltraLowPower();
  76.                 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  77.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFE);
  78.                 HAL_ResumeTick();
  79.         }
  80. }

【第二次改造脚踢开正常-哔哩哔哩】
https://www.bilibili.com/video/BV1BD421J78D/?buvid=ZB43ADB7CA19CA704E2AAE518E316C49CB6D&is_story_h5=false&mid=IJdwBnGUTq10v2wkJzDZ6Q%3D%3D&p=1&plat_id=114&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=9521A303-536F-4EDF-A8B4-41215D0254AE&share_source=COPY&share_tag=s_i&spmid=united.player-video-detail.0.0×tamp=1714180302&unique_k=6fwsR3B&up_id=1956038612

【第二次改造遮挡开正常-哔哩哔哩】
https://www.bilibili.com/video/BV1im411y7dY/?buvid=ZB43ADB7CA19CA704E2AAE518E316C49CB6D&is_story_h5=false&mid=IJdwBnGUTq10v2wkJzDZ6Q%3D%3D&plat_id=147&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=9A001423-65D9-4D03-AAB8-BA671C365DFB&share_source=COPY&share_tag=s_i×tamp=1714180697&unique_k=Ivvx1gY&up_id=1956038612

至此宣布,垃圾桶改造完美结束!
虽然这期间不是很顺利,碰到一些问题,碰到问题积极想办法解决问题这种态度可取的.
特此记录!









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21小跑堂 打赏了 100.00 元 2024-04-28
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

[url=home.php?mod=space&uid=760190]@21小跑堂[/url] :谢谢小跑堂大佬的肯定!  发表于 2024-4-28 16:04
超级详细的智能垃圾桶改造升级过程,从硬件拆解到方案分析再到软件升级,每一步都很详细,改造难度可能不是很大,但是动手和记录的过程值得肯定。  发表于 2024-4-28 15:50
[url=home.php?mod=space&uid=2663552]@qintian0303[/url] :维修和改造,原本遮挡是开不了的,拆完后重新按上去就好了,估计是线松了或者是红外感应的问题,后来加了脚踢功能,也算是DIY了吧。  发表于 2024-4-26 10:32
你这不是修啊,这是大改了,自己写控制代码,索性器件都没有坏  发表于 2024-4-26 10:22
springvirus 发表于 2024-4-26 08:31 | 显示全部楼层
灰常不错!!!!
 楼主| zhoushangshi 发表于 2024-4-26 09:24 | 显示全部楼层
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
不错哦,先给楼主点个赞,另外这个电机楼主确定是伺服电机?

谢谢!确定不是伺服电机
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

133

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部