桌上巡游车能够在桌子上到处跑,但不会跌落下来,这个智能车蛮聪明的。它长了两个触须,触须上连接触碰传感器,当触须到达桌子边沿,其上的触碰传感器会压下,给智能车的“大脑”发出一个信号,于是“大脑”进行逻辑判断,给智能车的驱动电机发出命令,让小车后退,再转弯,躲开桌沿而不跌落,并继续在桌上巡游,以此往复。

看看视频:

为了完成视频上的任务,我用NXC编制了程序。您可以先看看我的NXC的入门文章: https://www.eefocus.com/zhang700309/blog/11-11/234833_a4815.html,NXC软件是免费的,该软件下载地址在我的入门文章里。

 不会跌落的桌上巡游车的NXC程序:(详细注释)

task main()

{
   //设定“右”触碰传感器接在NXT控制器的传感器接口1上
   SetSensorTouch(S1);
   //设定“左”触碰传感器接在NXT控制器的传感器接口2上
   SetSensorTouch(S2);
   //设定超声波传感器接在NXT控制器的传感器接口4上
   SetSensorLowspeed(S4);
   while(!ButtonState(BTNCENTER)); //NXT控制器的橙色按键是否按下
  //按下橙色按键,程序进入“while(true)”死循环
  while(true)
  {
    //如果超声波检测的距离小于15CM
    if(SensorUS(S4)<15)
    {
      //小车后退,然后右转挑头
      RotateMotor(OUT_BC,-75,360);
      RotateMotorEx(OUT_BC,75,4*360,100,true,true);
    }
    //如果超声波检测的距离大于15CM
    else
    {
      //如果“右”触碰和“左”触碰同时检测的桌子边沿
      if(SENSOR_1==1&&SENSOR_2==1)
      {
         //小车后退,然后大角度左转
         RotateMotor(OUT_BC,-75,360);
         RotateMotorEx(OUT_BC,75,480,-100,true,true);
      }
       //如果只有“右”触碰检测到桌子边沿
      if(SENSOR_1==1&&SENSOR_2==0)
      {
         //小车后退,然后小角度左转
         RotateMotor(OUT_BC,-75,180);
         RotateMotorEx(OUT_BC,75,360,-50,true,true);
      }
      //如果只有“左”触碰检测到桌子边沿
      if(SENSOR_1==0&&SENSOR_2==1)
      {
         //小车后退,然后小角度右转
         RotateMotor(OUT_BC,-75,180);
         RotateMotorEx(OUT_BC,75,360,50,true,true);
      }
      //如果“右”触碰和“左”触碰都没检测到桌子边沿
      if(SENSOR_1==0&&SENSOR_2==0)
      {
         //小车继续前进
         OnFwd(OUT_BC,75);
      }
    }
  }
}
    桌上巡游车不仅安装了两个检测桌子边沿的触碰传感器,还在智能车上安装了一双“眼睛”,即超声波传感器。当桌上巡游车在安全位置行使时,你用障碍物挡住智能车的那双“眼睛”,小车会后退,然后右转挑头,重新改变路线。其实没有这个超声波传感器,小车靠着两个触碰传感器,完全可以自由地在桌上到处游逛,而不跌落到地面,我主要是为了给智能车加个“头”,这样“COOL”些!
   
    在上面程序中,有两个电机命令学习下。它们是:
 
RotateMotor(马达输出端,功率,角度);
//如果小车的两个驱动电机连在NXT控制器马达输出端B和C,则马达输出端应写成OUT_BC。
//功率范围是-100~100,小车正向行使的最大功率为100,反向行使的最大功率为-100,功率最小值为0.
//角度为驱动电机的转动角度,角度设置得越大,小车行使的距离越长。
 
RotatemotorEx(马达输出端,功率,角度,转弯百分比,是否同步?,是否刹车?)
//RotatemotorEx命令是RotateMotor命令的加强版,又多了几个好用的参数项。
//转弯百分比:0为直走,50为以一马达为圆心来转弯,100为以两轮中点为圆心来转弯。如果是负值,则反方向转弯。
//是否同步?:(true、flase)设定两个马达是否同步。
//是否刹车?:(true、flase)指定马达在完成动作后是否需要刹车。
 
    还有一个命令,是判断NXT控制器上的按键是否按下。
     while(!ButtonState(BTNCENTER));//NXT控制器中间那个橙色按键,按下,则ButtonState(BTNCENTER)为1,没按下,则ButtonState(BTNCENTER)为0。"!"为逻辑非。
    于是“ while(!ButtonState(BTNCENTER));”命令的含义是:如果橙色按键没有按下,就反复执行这个命令,直到按键按下,再执行下一条命令。
我再给大家介绍一本介绍NXC编程的台湾书,书名: 機器人新視界NXC與NXT(第二版)
 
 
 
      这几天,我又用NXC语言编程了两个项目,用惯了图形化编程软件,再用用文本化C软件编程,也蛮爽!看来乐高NXT机器人套件在国际上真的很流行,多种软件都支撑她,乐高套件可能是被国际认可的最便宜的机器人套件了。还有一种支持NXT机器人的C语言软件,名为“RobotC”,是美国肯耐基.梅隆大学开发的,要收费的,好像是79美元,寄钱过去,然后他给你软件序列号,就可以用了。
肯耐基.梅隆大学机器人技术研究院网址:https://www.education.rec.ri.cmu.edu/
RobotC软件网址: https://www.robotc.net/
     
桌上巡游车的几张搭建照片:
触须构建
 
 
搭建细节