|
写教程前先发下牢骚,首先不满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)
- {
- }
- }
复制代码
如果看完我写的东西还不明白的可以试着把上面的程序都做一遍,自己体会一下。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?马上注册
×
|