这个机械手车最聪明,它可以通过超声波传感器扇形扫描的方式,自主寻找离它最近的物体,确定物体方位,并向前把它抓起来,送到再远点的地方放下,然后快速退回起点位置,继续寻找其它最近的物体,循环三次,依次寻找、抓取、搬运、和放下三个物体。

看看这个机器人的表演吧。

    这个智能机器人脑子咋想的,这么聪明地完成了预设的任务,当然是通过程序实现的,这次我依然是用NXC软件编写程序。前面两篇文章先看看。

 C语言乐高玩具枪的制作

https://www.eefocus.com/zhang700309/blog/11-11/234833_a4815.html

不会跌落的桌上巡游车(NXC编程)

https://www.eefocus.com/zhang700309/blog/11-11/235020_c5e3b.html

 

   

     这个机械手车有三个电机,A电机控制着机械手的抬起和放下动作,B、C电机控制着小车的左右轮子,从而控制着小车的行走。

    看第一张图片,您可以找到几个传感器?最容易看到的是超声波传感器,超声波可以检测到小车与物体之间的距离,在超声波传感器的后面藏着的是触碰传感器,当机械手抬起来,机械手上的一个挡块会压下触碰传感器,这时A电机停转,机械手也停止在极限高度。还有传感器没被发现!原来NXT电机是伺服电机,电机里都有一个编码器,实时检测着电机转动的角度,正是因为编码器,它记录下了当超声波传感器找到最近物体的当时,C电机的转动角度,才使小车扇形扫描结束后,转回到与物体正对的方向。

NXC程序如下(有详细注释):

 

/*任务说明:
机械手车,搜寻三个物体,并依次扫描定位最近的物体,搜寻物体前,
先抬起机械手,然后靠近它,定位物体和靠近物体的动作循环两次,
这样可以提高抓取物体的成功率。
靠近物体后,机械手车先后退,放下机械手,
接着前进,抓取并抬起物体,再前进一小段距离,放下机械手,松开物体,
最后,小车长距离退回原位,再去搜索其它最近物体。
以此循环三次。
*/
//声明变量Closest和Direction
//Closest变量存储超声波传感器检测到与物体之间最近的距离
int Closest;
//Direction变量存储最近距离时,C电机的转角
int Direction;

//机械手抓取物体,并把物体抬起
sub Arm_Grab()
{
  //A电机正转,驱动机械手抓取物体,并抬起
  OnFwdReg(OUT_A,30,OUT_REGMODE_SPEED);
  //直到机械手的挡块压下触碰传感器
  while(SENSOR_1==0);
  //停止A电机
  Off(OUT_A);
}

//机械手放下
sub Arm_Release()
{
  //A电机反转,
  RotateMotor(OUT_A,-20,400);
}

//扫描寻找最近物体,并使小车定位、朝向待抓取物体
sub Find_Object()
{
  int val;
  //初始化Closest为255,超声波传感器检测的最大值是255
  Closest=255;
  Direction=0;
  //小车在B、C电机的带动下,向左旋转,到达扇形扫描的左端
  RotateMotorEx(OUT_BC,50,480,-100,true,true);
  //把C电机的转角重置为0
  ResetTachoCount(OUT_C);
  SetOutput(OUT_C,TachoCount,0);
  //小车向右扫描一个大角度扇面,直到C电机转过1000度
  OnFwdReg(OUT_B, -20, OUT_REGMODE_SPEED);
  OnFwdReg(OUT_C, 20, OUT_REGMODE_SPEED);
  while(MotorTachoCount(OUT_C)<1000)
  {
    //把扇面扫描中,检测到的传感器与物体的最近距离赋值给Closest
    //把最近距离时的C电机转角赋值给Direction
    if(SensorUS(S4) < Closest)
    {
    Closest=SensorUS(S4);
    Direction=MotorTachoCount(OUT_C);
    }
  }
  Off(OUT_BC);
  //扫描结束,把到达扇面左端时的C电机转角与最近距离时的转角之间的差值
  //赋值给val
  val=MotorTachoCount(OUT_C)-Direction;
  //把C电机的转角重置为0
  ResetTachoCount(OUT_C);
  SetOutput(OUT_C,TachoCount,0);
  //根据val转角差值,小车再左转,直到小车正对着最近物体
  OnFwdReg(OUT_B, 15, OUT_REGMODE_SPEED);
  OnFwdReg(OUT_C, -15, OUT_REGMODE_SPEED);
  until(MotorTachoCount(OUT_C)<-val);
}

//小车定位后,靠近物体
sub Move_Closer()
{
  int deg;
  //小车转过“deg”角度,向前靠近物体
  deg=Closest*25;
  RotateMotor(OUT_BC,60,deg);
}

//主程序
task main()
{
   int i,j;
   //设定触碰传感器连在NXT控制器的传感器端口1
   SetSensorTouch(S1);
   //设定超声波传感器连在NXT控制器的传感器端口4
   SetSensorUltrasonic(S4);
   //抓取物体,搬运物体的动作,执行三次
   for(i=0;i<3;i++)
   {
     //抓取并抬起物体
     Arm_Grab();
     //定位物体和靠近物体的动作循环两次
     for(j=0;j<2;j++)
     {
       Find_Object();
       Move_Closer();
     }
     //机械手车先后退,放下机械手,前进
     RotateMotor(OUT_BC,-40,2*360);
     Arm_Release();
     RotateMotor(OUT_BC,30,2*360);
     //抓取并抬起物体
     Arm_Grab();
     //前进一小段距离,放下机械手,松开物体
     RotateMotor(OUT_BC,40,2*360);
     Arm_Release();
     //小车长距离退回原位,
     RotateMotor(OUT_BC,-60,5*360);
   }
}
     这个C语言程序思路对超声波寻物的乐高智能车作品编程有普遍的指导意义,稍微对这个程序进行修改,就可以用到您的作品中了。所以大家把自己做的东西拿出来,分享在网络上,我的同道就可以研讨,进而为他们的工作提供素材,这是个好事!
比如下图作品也可以借用这个NXC程序。
 
    乐高官网提供了10个用9797+9695套件搭建的作品,这个智能机械手车就是其中一个作品。可以在我的115网盘链接下载:
    如果你不熟悉NXC软件,也可以看看我用乐高机器人套件自带的NXT-G软件编制的程序。以下是主程序图(点击图片,可以放大),完整程序请下载:Snatcher.rar
 
    以上主程序包含有若干个子程序,如果你直接点击菜单,文件→保存,并不能把子程序也保存下来,您必须点击,工具→创建包...,打包成rbtx文件才行。
     再见!