图1:玩具枪全景图

      儿子让我给他买玩具,口袋里没钱,于是想,不如用乐高工程积木给他做一个玩,就像小时候爸爸给我做的那个木船一样,我用线牵着木船在小水池里荡来荡去,高兴得很!现在我也可以给我儿子亲手制作玩具了,心里也很爽。

     看看上图,就是我花了半个小时,搭建的乐高玩具枪,可以发射子弹,同时配上“COOL”的音效。

视频:

    这个玩具枪有一个触动传感器和一个伺服电机,分别连线到NXT控制器的传感器端口1和马达端口A,用手指扣动扳机,即压下触动传感器,A伺服电机以功率为100的速度旋转360度,电机带到曲柄滑杆机构动作,滑杆顶出一颗子弹,把纸杯打倒。手指再扣动一次扳机,又发出一颗子弹。

    以上任务逻辑,我这次是使用NXC编程实现的,NXC为John C.Hansen所开发的类C语言,NXC是取Not eXactly C之意。它完整支援所有NXT硬件资源,包括:控制器、伺服电机、传感器和许多第三方外设。NXC程序在Brick Command Center编程环境下(Brick Command Center简称BrickCC),进行编辑,编译,下载。

    由于NXC是直接针对NXT硬件开发的语言,所以仅针对NXT来说,它的指令针对性强,语句精炼,功能强大,如果用NXT-G甚至我经常使用Labview为一个小任务编程,NXT-G和Labview需要好几条语句才能实现,而NXC可能一条命令就实现了,所以您是乐高专门人士,用NXC编程是一个很好的选择,会发现,当您对它功能细分的指令熟悉后,编程时会很顺手,感觉它好像考虑到您的NXT编程需求一样处处贴心。NXT-G和Labview都是图形化编程软件,所以它们编译出来的机器码程序将占去NXT控制器比较多的存储空间,而且相对NXC,NXT-G和Labview在执行上效率比较慢,所以当用NXT系统做机器人快速响应控制时,NXC当然好些。

     最棒的事,NXC是免费的!你可以在该网址下载: https://sourceforge.net/projects/bricxcc/files/bricxcc/

    玩具枪C语言程序:

 //任务“shot”

task shot()
{
  //A电机以功率100的速度转一圈,发射一颗子弹
  RotateMotor(OUT_A, 100, 360);
}
task sound()
{
  //播放“扳机声和枪声”音效
  PlayFileEx("shotgun.rso",4,FALSE);
}
//主程序
task main()
{
  while(true)
  {
   //设定触碰传感器接在NXT控制器的传感器接口1上
   SetSensorTouch(S1);
   //如果触碰传感器被压下
   if (SENSOR_1==1)
   {
     //呼叫任务“shot”
     start shot;
     //呼叫任务“sound”
     start sound;
     //等待触动传感器弹起松开
     //任务“shot”和任务“sound”同时执行
     while(SENSOR_1==1);
   }
  }
}

    以上程序有详细注释,task main()中有两个子任务,task shot()和task sound(),如果在主程序中连续呼叫子任务,这些子任务并不是按照呼叫顺序,依次执行,而是同时并行执行,这就是NXC一个显著的特点。这样就可以做到在发射子弹时,NXT控制器的喇叭同步发出枪声。看看视频,可以见证。

    程序编制完后,就可以下载程序到NXT控制器,当然PC机要与NXT控制器联机,点击菜单栏→Tools,再下拉菜单里再点击Find Brick,出现联机对话窗口。

图2 寻找与PC机USB连线的NXT控制器

    按照以下参数设置联机模式:

图3 设置联机模式

    把程序编译和下载到NXT控制器,如图:

图4 编译和下载程序     

    运行程序,你会发现,扣动扳机,只射出子弹,而不发出声响,这是因为你并没有把枪声的音效下载到控制器。NXT的声音格式是“.rso”,BrickCC很贴心地提供了将“.wav”格式转换成“.rso”格式的功能,我在网络上找到了一个枪声的“.wav”格式文件,请下载:shotgun.rar按照我说得方法转换成“.rso”格式文件。看下图:

图5 声音文件格式转换    

    仔细看,转换后的shot.rso文件存在哪个地方,然后还有一个问题,如何把shot.rso文件下载到NXT控制器的存储空间里,BrickCC又有一个好用的功能。您可以把NXT控制器的存储器当成一个移动硬盘,直接把存在D:\NXC\shotgun.rso的文件,“拖到”NXT控制器的存储器即可,这个功能对于常使用NXT-G软件编程的人士来说,应该感觉蛮酷的。看图2,我用红圈标注的,Tools→NXT Explorer,点击一下,出现下图,看我正在拖到shotgun.rso文件从PC硬盘文件夹里“拖到”NXT控制器存储器。

     如果想单独测试枪声,您可以马上把下面的程序,按照我说的方法下载到NXT控制器里运行,运行情况是每隔3秒钟,会发出一声枪响。

       task main()

{

  while(true)
  {
       PlayFileEx("shotgun.rso",4,FALSE);
       Wait(3000);
   }
  }
}

     这是我的第一篇NXC软件介绍文章,从文章中可以看出NXC软件有一些好用的特征,比如子任务并行处理,声音文件格式转换和文件拖放下载,这些功能都考虑到NXT玩家的编程关切,当然BrickCC还有众多功能应用不可能一篇文章讲述完,所以这篇文章也是抛砖引玉,让我们在任务实践的驱动下,不断探索和应用NXC吧。

     网上的NXC中文教程可以看看:LEGO+NXC+编程快速入门.pdf

      NXC外文教程NXC_tutorial.pdf

        请注意BrickCC不包含NXT驱动程序,如您的电脑无NXT-G软件,请到乐高MindStorms官方网站下载NXT驱动程序。

 https://mindstorms.lego.com/en-us/support/files/Driver.aspx

    再来一张搭建细节照片