转载请注明出处:http://blog.csdn.net/lxk7280
简介:
利用STM32和STC12C5A60S2(增强型51)做的一款作品。其中STM32控制触摸屏、按键等模块,STC12C5160S2处理手绘的轨迹数据控制小车,两大部分通过NRF24L01通信。(由于时序原因,两者的通信部分程序一定要处理好,否则无法通信。)
用户在触摸屏(电阻屏)上绘画出自己指定的轨迹,如:圆形,S形等。绘画之后按下发送按键,STM32便会将各个点的坐标数据处理,然后无线发送给STC12C5160S2,继而控制小车进行与手绘的轨迹相同的运动。
软件设计:
分为两个部分,一部分在触摸屏上,如:路径分析,坐标取点等;另一部分在小车上。(后面我会把程序完全贴出来)
1. 路径分析算法
因为人在触摸屏手绘的路径是在一个固定的坐标系上的移动轨迹,为了尽可能的靠近轨迹,我们加大轨迹的取点数量,基本的思想是从现在的点走向下一点,一直走到最后一点。为了发送的数据简洁,我们设计了一些算法,下面取其中几个自己绘画的对坐标的分析图。分析图中为了方便查看和分析,取点数量减少。
黄色为手绘出的轨迹,红色为取的点和坐标原点形成的唯一矩形,分析可知:
Θ3 = Θ2 - Θ1,Θ5 = Θ4 - Θ3;
注:如果Θ<0,那么以四轴自身形成的坐标系而言,小车此时应该向左拐弯;如果Θ>0,那么以小车自身形成的坐标系而言,小车此时应该向右拐弯。所以这个的关键就是固定坐标系和相对坐标系之间的一些参数的转化。
例如:
Move_Step(Path_Set_x[x-2],Path_Set_y[x-2],Path_Set_x[x-1],Path_Set_y[x-1]);
Ang[x-2]=Time_Move_Buf*(180/pi);
b = (int)(Time_Move_Buf+0.5) + 32; //解码时前进的时间要-32
if(x==2) a=Ang[0];
else
a=(int)((Ang[x-2] - Ang[x-3])/Speed_Turn + 0.5) + 150; //解码时 大于150的向右转,小于150的向左转
Time_Turn[x-2] = (unsigned char)a;
Time_Move[x-2] = (unsigned char)b;
例如:
void Move_Step(double Now_x,double Now_y,double Next_x,double Next_y)
{
Time_Turn_Buf = atan(Next_x - Now_x)/(Next_y - Now_y);
Time_Move_Buf = (sqrt((Next_x - Now_x)*(Next_x - Now_x)+(Next_y - Now_y)*(Next_y - Now_y)))/Speed_Move;
}
2. 不同频率单片机之间的无线通信
由于不同频率单片机之间的无线通信需要解决不少的时序问题,因为以前研究过STM32单片机和51单片机之间由于频率不同造成的无法进行无线的通信的问题,所以在STM32的程序加上了一些必要的延时,以实现时序上的一致,从而使通信数据完善不会丢失或者造成通信失败。
例如:
delayms(250);
硬件设计:
同样分为两部分,一个是触摸屏的硬件设计,另外一个是小车的硬件设计。
触摸屏:
效果图:
触摸屏和STM32的连接图:
小车:
1.
2.
3.
4.