| 
 | 
 
    写教程前先发下牢骚,首先不满LEGO把NXTG设计得这么傻瓜,让初学者即容易入门,又容易学得似懂非懂;接着鄙视一下我们伟大的机器人代理商SEMIA,把NXT卖得死贵死贵,让LEGO机器人在中国不能普及,并且把教程写得含糊不清,连最基本的程序是什么,程序结构这么弄都不说一下;最后,我求求各位初学者甚至是老师你们能自己先思考一下么,别大小程序都问下我,让我帮写,谢谢了! 
 
     今天讲的是运动模块,好多朋友都问在用NXT-G编程的时候,明明是给马达块设置了无限制方式了,编译下载后,马达只是运行一下就停止了呢? 
      先给大家介绍一下NXTG中块的工作方式,大多数块只是做了一个初始化的工作,只是做了点定义变量(参量)和定义模块相关IO的工作。定义完,块就相当于结束了,如果在运行块时没有变量什么的操作,这个部分就结束了。说得好像有点不清除,那我还是举例解释吧。 
 
更具上面的说法,马达模块也是定义IO的操作和定义变量。定义IO的操作为使能AVR单片机的PWM管脚,根据功率(速度)百分比设置PWM占空比。定义变量的操作为为一个等待(循环)设定条件。对于NXTG块中的无限制而言,就只是做了IO定义的操作,没有变量定义的操作。 
相当于NXC中 
 
- task main()
 
 - {
 
 -     OnFwd(OUT_A,100);
 
 -     while(0);
 
 - }
 
  复制代码 
 
原型应该是有个不循环的,结果调不出 
 
而设置了时间的模块相当于 
 
 
- task main()
 
 - {
 
 -   unsigned long startTick=CurrentTick();
 
 -   unsigned long T=3000;
 
 -   do
 
 -   {
 
 -       OnFwd(OUT_A,100);
 
 -       startTick=CurrentTick();
 
 -   }while(CurrentTick() - startTick < T);
 
 - }
 
  复制代码 
 
原型为 
 
设置角度的模块相当于 
 
 
- task main()
 
 - {
 
 -   int tacho;
 
 -   int D=500;
 
 -   tacho=MotorTachoCount(OUT_A);
 
 -   do
 
 -   {
 
 -        OnFwd(OUT_A,100);
 
 -   }while(MotorTachoCount(OUT_A) != tacho + D);
 
 - }
 
  复制代码 
 
原型为 
 
看完上面的东西后应该可以知道第一个程序之所以会转一下就停,是因为后面没有循环条件,如果想实现真正的无限转的话,必须加上个等待或者循环,以保证任务没有运行到结束。 
NXC程序为 
 
- task main()
 
 - {
 
 -     OnFwd(OUT_A,100);
 
 -     while(1)
 
 -     {
 
 -     }
 
 - }
 
  复制代码 
 
如果看完我写的东西还不明白的可以试着把上面的程序都做一遍,自己体会一下。 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?马上注册 
 
 
 
×
 
 
 
 
 |