[STM32F1] 拆解irobot扫地机器人【分析自动充电功能】附STM32解码代码

[复制链接]
27748|106
 楼主| yunyoushuaiqi 发表于 2017-1-16 15:51 | 显示全部楼层
有些同学提问当采集到红外编码信号以后应该如何控制机器人的移动问题。我这里贴一个分析文档。只不过这个是分析的科沃兹扫地机器人。具体方法其实都大同小异,大家可以借鉴一下。如果有不合理的地方可以一起讨论。
 楼主| yunyoushuaiqi 发表于 2017-1-16 15:54 | 显示全部楼层
shiji.png
这个是机器人跟充电底座的简图,四个字母分别是发射红外的管子,和接收红外的管子
 楼主| yunyoushuaiqi 发表于 2017-1-16 15:55 | 显示全部楼层
anzhuang.jpg
这个是四个管子的安装角度
两边的是90度散射的红外管
具体发射的红外光线示意图如下
1111.jpg
 楼主| yunyoushuaiqi 发表于 2017-1-16 15:57 | 显示全部楼层
自动充电对准过程分析:
粗调:
当机器人刚进入红外监测区域时进行粗调,此时只要有任何一个探头采集到左则机器人往右移动,反之往左移动。
细调:利用中间两个小角度探头进行对接,原理与粗调大致相同。
具体情况根据实际情况具体分析:见下表格
粗调:
a采集信号        b采集信号        c采集信号        d采集信号        右轮        左轮
0        0        0        A        1        0
0        0        A        A        1        0
0        A        A        A        1        0
A        A        A        A        1        0
A        A        A        B/C        1        0
A        A        B/C        B/C        1        0
A        A        B/C        B/C        1        0
A        B/C        B/C        B/C        0        0

只要探头b检测到A机器人就需要向右偏移

D        0        0        0        0        1
D        D        0        0        0        1
D        D        D        0        0        1
D        D        D        D        0        1
B/C        D        D        D        0        1
B/C        B/C        D        D        0        1
B/C        B/C        B/C        D        0        1
只要探头C检测到D机器人就需要向左偏移
细调:
判断  A,B,C,D是否对准a,b,c,d。主要对B,C进行调节。
b采集信号        c采集信号        右轮        左轮
A        B        1        0
B        C        0        0
C        D        0        1

未考虑到的特殊情况根据实际环境再进行调整
 楼主| yunyoushuaiqi 发表于 2017-1-16 16:06 | 显示全部楼层
这里有一点需要提醒大家的就是,因为红外线受干扰因素很多,包括反射,强光都会产生影响。所以实际在调试的时候会出现一些例如乱码,编码错位等问题,甚至会出现接收到的信号直接交叉了而编码值都是对的。所以代码一定要有一定的容错功能。还有一点就是因为红外接收只能使用中断进行检测,所以当有多个红外发射的时候中断其实要使用轮询的思想,不能几个中断同时接收,这样会出现紊乱。一定要分时开启,也就是说分时接收。发射端发射红外编码的时候也要分时发送。另外STM32F103的单片机还有一个问题就是有些中断是共用一个中断函数的如10到15.这时候就需要使用关闭line的方法去实现分时开启。另外标准的红外编码协议大约要120ms的时间,所以可以根据实际情况改变一下协议,把数据压缩,不用发32位那么多。压缩的好处就是可以减少一个编码的时间提高数据的刷新率。
 楼主| yunyoushuaiqi 发表于 2017-1-16 16:08 | 显示全部楼层
这个就是关闭中断线程的参考代码,大家可以借鉴一下。

//*********************中断开关1************************************************
void HWJS_Key1(u8 en)
{
    EXTI->PR=1<<8;  //清除LINE8上的中断标志位
    if(en)EXTI->IMR|=1<<8;//不屏蔽line8上的中断
    else EXTI->IMR&=~(1<<8);//屏蔽line8上的中断   
}
//*********************中断开关2************************************************
void HWJS_Key2(u8 en)
{
    EXTI->PR=1<<9;  //清除LINE9上的中断标志位
    if(en)EXTI->IMR|=1<<9;//不屏蔽line9上的中断
    else EXTI->IMR&=~(1<<9);//屏蔽line9上的中断   
}
//*********************中断开关3************************************************
void HWJS_Key3(u8 en)
{
    EXTI->PR=1<<10;  //清除LINE11上的中断标志位
    if(en)EXTI->IMR|=1<<10;//不屏蔽line10上的中断
    else EXTI->IMR&=~(1<<10);//屏蔽line10上的中断   
}
//*********************中断开关4************************************************
void HWJS_Key4(u8 en)
{
    EXTI->PR=1<<11;  //清除LINE11上的中断标志位
    if(en)EXTI->IMR|=1<<11;//不屏蔽line11上的中断
    else EXTI->IMR&=~(1<<11);//屏蔽line11上的中断   
}
liuhongping 发表于 2017-1-16 16:48 | 显示全部楼层
牛!!!
wolfgang_z 发表于 2017-1-16 17:18 | 显示全部楼层
STR735~~~定制的MCU~~~
279853867 发表于 2017-2-24 19:46 | 显示全部楼层
精华帖!!!
yishuifu 发表于 2017-3-16 12:23 | 显示全部楼层
做工不错
nyszx 发表于 2017-3-16 12:36 | 显示全部楼层
分析很透彻,简单易懂,赞一个
yihui184 发表于 2017-3-31 17:56 | 显示全部楼层
请问出现该如何解决?
yihui184 发表于 2017-3-31 17:58 | 显示全部楼层
请问出现反射该如何解决呢?
戈卫东 发表于 2017-3-31 18:24 | 显示全部楼层
dongnanxibei 发表于 2017-1-14 22:05
这个系列单片机很少见啊。

古代的。ARM7TDMI那一类的核心。
dongnanxibei 发表于 2017-4-8 11:24 | 显示全部楼层
充电器发射信号给机器人,机器人根据信号判断在哪儿找到充电器。
study1234 发表于 2017-4-8 12:23 | 显示全部楼层
mask   
springvirus 发表于 2017-4-8 13:35 | 显示全部楼层
顶楼主,感谢精彩拆解和讲解!
springvirus 发表于 2017-4-8 13:36 | 显示全部楼层
楼主应该是开发过类似产品~~
swledcn 发表于 2017-4-11 15:46 | 显示全部楼层
谢谢分享,赞一下
saturn99 发表于 2017-4-11 19:21 | 显示全部楼层
感谢分享,一个对位就不简单。。。还有其他的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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