无火不进房间回家程序及说明(广茂达灭火机器人)

传感器接法
     红外传感器接法
       前红外: 数字9
       左红外: 数字15
       左45度角红外: 数字10
       右45度角红外: 数字8
       右红外: 数字14
     火焰传感器接法
       左火焰: 模拟3
       中火焰: 模拟5
       右火焰: 模拟4
     (底部)灰度传感器:  模拟2
     声控传感器:  模拟6
       
     程序说明
    
     #define p 120    //定义火焰传感器检测到火焰的返回值
     int k,j,i=0,n,b=1,c=1;   //程序控制变量,不必更改
     int m=i;
     int pro,end=1;
    
     void main()    //主程序
     {
         while(analog(6)>100)   //声控启动
           {
         }
        
         while(!(analog(2)>100))  //走出白色超始区
           {
             motor(0,80); 
             motor(1,80);
         }
        
         pro=start_process(test());  //启动地面标志线检测进程
        
         while(1)    //灭火与迷宫程序切换
           {
             if (analog(3)               {
                 fire();
             }
             else        //没有发现火焰,进入迷宫子程序
               {
                 migong();
             }
         }
     }
    
     void migong()    //迷宫子程序
     {   
         if(digital(8)==0 II digital(9)==0)     //如果前方 或 右45度角红外检测到障碍物,左转
           {
             motor(0,-70);       //根据情况,调节功率参数,以下雷同
             motor(1,70);
         }
         else if(digital(14)==0 && digital(9)==1 && digital(8)==1)  //如果只右方有障碍物,直行
             {
               motor(0,100);
               motor(1,100);
           }
           else        //如果没有障碍物,右转
             {               
               motor(0,100);
               motor(1,-100);
              
               motor(1,10);
               motor(0,90);
           }
         if((i>2)&&(i>m))       //如果标志线数大于2且标志线有变化(针对1、2、3号房间)
           {
             stop();
             while(analog(3)>150 && analog(5)>150 && analog(4)>150)   //如果没有检测到火焰
               {
                 motor(0,70);       //右转
                 motor(1,-70);
                 if(digital(14)==0)       //右红外检测到障碍物,停止转动
                   break;
             }
             m=i+1;         //更改标志线的对比变量
         }
         if(i==1 && b && (analog(3)>150 && analog(5)>150 && analog(4)>150)) //4号房间,检测到第1条标志线,且没有火焰
           {
             while(digital(9)==0 II digital(8)==0 II digital(14)==0)   //任意右手红外传感器有障碍物,右转
               {           
                 motor(0,70);
                 motor(1,-70);
             }
             while(digital(9)==1)       //前方传感器没有障碍物,右前进
               {
                 motor(0,100);
                 motor(1,70);
             }
             b=0;         //控制变量
         }   
     }
    
     void fire()    //灭火子程序
     {
         if((i>4 II i<8) && c)      //如果在2号房间
           {
             while(analog(3)               {
                 motor(0,-60);
                 motor(1,60);
             }
             motor(0,60);        //强制直行一段
             motor(1,60);       //主要是解决2号房间右手法则灭火时的碰墙的情况
             sleep(0.6);
             c=0;
         }
         while(analog(5)<10 && analog(2)<60)     //如果火焰距离合适 且 检测到地面标志线,灭火
           {
             motor(0,-10);       //后退一段
             motor(1,-10);
             sleep(0.15);
             stop();
             motor(2,100);       //灭火
             sleep(2.000);
             stop();
             motor(0,-70);       //灭完火,后退一段
             motor(1,-100);
             sleep(0.2);
            
             kill_process(pro);      //关掉地面标志线检测进程
             select();       //进入回家子程序选择子程序
         }
         while(analog(3)-analog(4)> 3)     //向右调整,如果调整较频繁,修改最后的3
           {
             motor(0,50);
             motor(1,-50);
         }
         while(analog(4)-analog(3)> 3)     //向左调整,同上
           {
             motor(0,-50);
             motor(1,50);
         }
         motor(0,40);       //直行
         motor(1,40);
     }
    
     void test()        //地面标志线检测子程序
     {    
         while(1)
           {
             k=analog(2);
             if(k<30 II k>150)      //30 和 150 分别为底部传感器检测到的的标志线和黑地面
               j=k;        //的值,请根据实际测试值适当修改
             if((j<30) && (n>150))      //如果更改,此处也一并更改
               {
                 i++;
                 beep();
             }
             n=j;
         }
     }
    
     void select()        //回家程序选择子程序
     {
         if(i<3)        //如果地面标志线条数小于3(即在4号房间)
           gohome_4();       //进入4号房间回家子程序,下同
         else if(i<5)
             gohome_3();
           else if(i<8)
               gohome_2();
             else
               gohome_1();
     }
    
     void gohome_4()     //4号房间回家子程序
     {
         start_process(endstop());   //开启终(起)点停止进程序,下同
         mg_right();     //右手法则回家
         stop();     //停止
         sleep(100.0);
     }
    
     void gohome_3()     //3号房间回家子程序
     {
         start_process(endstop());
         mg_left();     //左手法则回家
         stop();
         sleep(100.0);
     }
    
     void gohome_2()     //2号房间的特殊回家程序
     {   
         motor(0,60);    //灭完火后右转一段
         motor(1,-60);
         sleep(0.2);
         reset_system_time();   //系统时间复位
         while(mseconds()<2100L)   //运行左手法则走迷宫2.1秒(时间长短为可以走出房间门口且不到3号房间的走廊)
           {
             while(digital(9)==0 II digital(10)==0)
               {
                 motor(0,60);
                 motor(1,-50);
             }
             while(digital(15)==0 && digital(9)==1 && digital(10)==1)
               {
                 motor(0,50);
                 motor(1,50);
             }
             while(digital(15)==1 && digital(9)==1 && digital(10)==1)
               {
                 motor(0,-80);
                 motor(1,80);
                
                 motor(0,45);
                 motor(1,80);
             }
         }
         stop();
         sleep(0.1);
         while(digital(9)==0)   //如果前方有障碍物,右转(调整姿势)
           {
             motor(0,60);
             motor(1,-60);
         }
         while(digital(9) == 1)   //如果前方没有障碍物,左、右手法则并进,基本上直行到另一端(3号房间旁)
           {
             if(digital(8)==0 )   //右边45度有障碍物,左转
               {
                 motor(0,-50);
                 motor(1,50);
             }
             if(digital(14)==0 && digital(8)==1) //右边有障碍物且右45度角无障碍物,直行
               {
                 motor(0,50);
                 motor(1,50);
             }
             if(digital(10)==0)   //左边45度有障碍物,右转
               {
                 motor(0,50);
                 motor(1,-50);
             }
             if(digital(15)==0 && digital(10)==1) //左边有障碍物且左45度角无障碍物,直行
               {
                 motor(0,50);
                 motor(1,50);
             }
             motor(0,50);    //直行
             motor(1,50);
         }
         start_process(endstop());   //前方有障碍物时,退出循环,开启终点停止进程
         while(end)     //左手法则走迷宫
           {
             if(digital(9)==0 II digital(10)==0)
               {
                 motor(0,60);
                 motor(1,-50);
             }
             else if (digital(15)==0 && digital(9)==1 && digital(10)==1)
               {
                 motor(0,70);
                 motor(1,70);
             }
             else
               {
                 motor(0,-80);
                 motor(1,80);
                
                 motor(0,40);
                 motor(1,100);
             }
         }
         motor(0,-100);    //终点刹车
         motor(1,-100);
         sleep(0.1);
         stop();     //停止
         sleep(100.0);   
     }
    
     void gohome_1()     //1号房间回家
     {
         start_process(endstop());   //开启终点停止进程
         mg_right();     //右手法则走迷宫
         stop();
         sleep(100.0);
     }
    
     void mg_right()     //右手法则走迷宫子程序
     {
         while(end)
           {
             if(digital(8)==0 II digital(9)==0)
               {
                 motor(0,-70);
                 motor(1,70);
             }
             else if(digital(14)==0 && digital(9)==1 && digital(8)==1)
                 {
                   motor(0,100);
                   motor(1,100);
               }
               else
                 {               
                   motor(0,100);
                   motor(1,-100);
                  
                   motor(1,20);
                   motor(0,100);
               }
         }   
     }
    
     void mg_left()     //左手法则走迷宫子程序
     {
         while(end)
           {       
             if(digital(9)==0 II digital(10)==0 )
               {
                 motor(0,60);
                 motor(1,-50);
             }
             else if(digital(15)==0 && digital(9)==1 && digital(10)==1)
               {
                 motor(0,70);
                 motor(1,70);
             }
             else
               {
                 motor(0,-100);
                 motor(1,100);
                
                 motor(0,30);
                 motor(1,100);
             }
         }   
     }
    
     void endstop()     //终点停止进程子程序
     {
         while(1)
           {
             k=analog(2);    //检测1次
             sleep(0.02);    //间隔0.02秒,再检测 //可适当缩短或延长时间
             if(k<50 && analog(2)<50)  //如果2次都是白色,终点到,停止
               {
                 end=0;
                 stop();
                 sleep(1.0);           
             }
         }
     }
    
     //全部程序结束
posted @ 2009-05-08 08:35  shiningrise  阅读(923)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css