|
楼主 |
发表于 2011-2-7 01:39:25
|
显示全部楼层
本帖最后由 grant7788 于 2011-2-7 01:41 编辑
唉,还是没忍住... 把那个高手的NXT-G程序写成了NXC,并调试了Gain的值,目前工作基本正常。
发现有个小问题... 有些颜色会造成干扰。目前的工作模式下,颜色传感器工作时是亮三色光,是否可设成红光?
明天再试吧... 代码上传如下... 速度和NXT-G差不多。主要是,电池快没电了,感觉测不大准。- // 参数设定值
- #define iPower 90 // 初始速度,直线的话,此值越大越快;但若路径复杂的话此值过大会造成偏离。
- #define iGain 60 // 增益。数字越大,跟随性越好;但过大的数值会造成振荡,过小的数值无法跟踪曲线。
- int ReadSensorColorFast(int iPort)
- {
- unsigned int raw[3]={0,0,0};
- int Y;
- ReadSensorColorRaw(iPort, raw);
- // Y = 0.299*raw[0] + 0.587*raw[1] + 0.114*raw[2];
- // Y = (299*raw[0] + 587*raw[1] + 114*raw[2])/1000;
- Y = (raw[0]*19595 + raw[1]*38469 + raw[2]*7472) >> 16;
- return Y;
- }
- task main()
- {
- int iMin = 9999;
- int iMax = 0;
- int iRange, iMid;
- int light;
- float sCorrection;
- long degold, degnew;
-
- // 开传感器
- SetSensorColorFull(IN_3);
- Wait(200);
- OnFwd(OUT_B, 25);
- OnRev(OUT_C, 25);
- degnew = MotorRotationCount(OUT_B);
- degold = degnew;
- while(degnew - degold < 120)
- {
- light = ReadSensorColorFast(S3);
- if (light < iMin) iMin = light;
- if (light > iMax) iMax = light;
- degnew = MotorRotationCount(OUT_B);
- }
- iRange = iMax - iMin;
- iMid = (iMax + iMin) / 2;
-
- OnRev(OUT_B, 25);
- OnFwd(OUT_C, 25);
- light = iMax;
- while(light>iMid)
- {
- light = ReadSensorColorFast(S3);
- }
-
- while (true)
- {
- light = ReadSensorColorFast(S3);
- sCorrection = (iMid - light) * iGain / iRange;
- OnFwd(OUT_B, iPower + sCorrection);
- OnFwd(OUT_C, iPower - sCorrection);
- }
- }
复制代码
|
|