资源描述
模块化程序设计基本原理
模块化的灭火机器人程序基本语句由顺序语句、选择语句、循环语句构成,为了便于重复利用和修改调试,要求把功能相对独立的程序段封装成函数。下面举些简单例子:
顺序语句:代码一句一句往下运行,如:
motor(0,100);
motor(1,100);
sleep(1.0);
stop();
选择语句:有条件的决定运行不运行,下面是一些简单的形式:
1)if//如果满足条件就运行里面的语句
2)if//如果满足条件就运行里面的语句
else//否则就运行里面的语句
3)if//如果满足条件就运行里面的语句
else if//如果满足条件就运行里面的语句
else if//如果满足条件就运行里面的语句
4) if//如果满足条件就运行里面的语句
else if//如果满足条件就运行里面的语句
else if//如果满足条件就运行里面的语句
else//否则就运行里面的语句
循环语句:循环运行直到条件不满足
1)while(1)//无条件循环
2)while(条件)//条件循环
循环语句必须要有不满足退出的条件,否则机器人就会永远不动, 或者永远在做相同的动作.
封装成函数:
如 把整个灭火程序分为
fire()//灭火函数
gohome()//回家函数
migong_left()//左手行走函数
本文的论述基于下面的简单机器人
简单配置的纳英特灭火机器人除了基本套件外,需要1个火焰检测传感器,3个红外避障传感器,1个灭火风扇,及把他们组装在机器人身体上的积木套件.
灭火风扇安装在机器人前部,17.5cm高度,假设接motor2接口.
1个火焰检测传感器安装在机器人前部,17.5cm高度,假设接3号模拟口.
硬件的组装调试请问你的指导老师.
在这里我们先不讨论怎样走4个房间,怎样走的快,怎样灭的稳,怎样回家,那么
灭火程序的基本原理就是:
1)没有发现火时走迷宫
2)发现火后去灭火
根据上面的基本原理,主要程序可以有下面一些形式
--------------------------------------------------------------------------------
例1)
void main()//左手灭火程序
{
while(1)//永远循环使用下面的代码检测所有传感器
{ migong_left();//如果没有发现火焰,走左手法则
if (analog(3)<50)//如果发现了火焰
{ fire();//灭火
break;//退出左手法则
}
}
}
--------------------------------------------------------------------------------
例2:
void main()//左手灭火程序
{
while(1)//永远循环使用下面的代码检测所有传感器
{
if (analog(3)>50)//如果没有发现火焰,走左手法则
migong_left();
else//如果发现了火焰
{ fire();//灭火
break;//退出左手法则
}
}
}
--------------------------------------------------------------------------------
例3:
void main()//左手灭火程序
{
while(analog(3)>50)//如果没有发现火焰,走左手法则
{migong_left();}
fire();//灭火//发现了火焰//退出了上面的循环后
stop();
}
--------------------------------------------------------------------------------
灭火程序设计的基本方法
1)从顶往下的设计方法
例如:我们设计了下面的主程序
void main()//左手灭火程序
{
while(analog(3)>15)//如果没有发现火焰,走左手法则
{migong_left();}
fire();//灭火//发现了火焰//退出了上面的循环后
stop();
}
但由于migong_left()和fire()函数没有设计好,机器人还是不会灭火,我们可以增加2个函数:
void migong_left()
{
motor(0,60);
motor(1,60);
}
void fire()
{
motor(2,100);//如果发现风扇转反,修改为 motor(2,-100)
sleep(5.0);
}
就这样,你一生中第一个机器人灭火程序就产生了,只是他不会真的走迷宫,需要把蜡烛放在机器人前面1米左右的地方,然后打开电源开关.你只要把migong_left()函数修改为真正的左手法则,就这样,一个不是很稳定,很慢的机器人灭火程序就在你的手下产生了!!
2)自下往上的设计方法
例如:
先编写程序让你的机器人能走迷宫
void main()//主程序
{
while(1)
{migong_left();}
}
void migong_left()//左手法则代码 假设左红外接11口,左前红外接12口,前红外接13口.
{
if (digital(12)==0 || digital(13)==0) //前有墙右转
{
motor(0, 30);
motor(1, -90);
}
else if (digital(11) == 0) //左有墙前进
{
motor(0, 70);
motor(1, 70);
}
else //什么也没看到,左转
{
motor(0, -60);
motor(1, 60);
motor(0, 80);
motor(1, 80);
motor(0, -40);
motor(1, 40);
}
}
但他只会走迷宫,不会灭火,我们把主程序修改为:
void main()//主程序
{
while(1)
{migong_left();
if (analog(3)<30)//如果发现了火焰
{ motor(2,100);//灭火如果发现风扇转反,修改为 motor(2,-100)
sleep(5.0);
stop();
break;//退出左手法则
}
}
}
左手法则迷宫搜索算法
左手法则:1左边有墙前进,2前面有墙右转,3什么也看不到左转.
或者:看到墙壁划右弧,看不到墙壁划左弧.
如果是纳英特机器人,假设左红外接11口,左前红外接12口,前红外接13口.
参考代码如下:
-------------------------------------------------------------------------------
void migong_left()//左手法则代码
{
if (digital(12)==0 || digital(13)==0) //前有墙右转
{
motor(0, 30);
motor(1, -90);
}
else if (digital(11) == 0) //左有墙前进
{
motor(0, 70);
motor(1, 70);
}
else //什么也没看到,左转
{
motor(0, -60);
motor(1, 60);
motor(0, 80);
motor(1, 80);
motor(0, -40);
motor(1, 40);
}
}
为了调试这段代码,可以加上主程序
void main()
{
while(1)
{
migong_left();
}
}
另一种算法,使用2个传感器.
-------------------------------------------------------------------------------
void migong_left()//左手法则代码 假设左红外接11口,前红外接13口.
{
if (digital(11)==0 || digital(13)==0) //看到墙壁划右弧
{
st=mseconds();//记下现在的时间
while(mseconds()-st<100L)//划右弧0.1秒,请大家调节好100毫秒这个时间变量
{
motor(0, 70);// 转动分量可调节
motor(1, -70);
motor(0, 70); //前进分量可调节
motor(1, 70);
}
}
else //看不到墙壁划左弧
{
st=mseconds();//记下现在的时间
while(mseconds()-st<100L)//划左弧0.1秒,请大家调节好100毫秒这个时间变量
{
motor(0, -70);// 转动分量可调节
motor(1, 70);
motor(0, 70); //前进分量可调节
motor(1, 70);
}
}
6
展开阅读全文