|
前段时间很多人在问我这个机器人的程序怎么写,说老实话,我其实也是只知道个原理,真写的话,不一定写得出
这几天,腾出点空来了,给大家分享一下这个机器人。
搭建的图纸以前我发过了,地址如下
http://www.cmnxt.cn/viewthread.php?tid=32&extra=page%3D1
现在给出它的程序,用的NBC写的。我写了一些注释,方便朋友看,不影响使用
PS:需要注意的是,这个机器人对光线的要求很高,最好在较黑暗的地方测试,不然效果不如作者视频的好哦
-
- //------------------------------------------------
- // NXTway - Philo - www.philohome.com - 6/5/2006
- //------------------------------------------------
- dseg segment
- // Sensor values
- NVal word
- offset word
- err sdword
- errold sdword
- errdiff sdword
- errint sdword
- // Motor values
- theUF byte
- thePower sbyte
- theOM byte OUT_MODE_MOTORON+OUT_MODE_BRAKE
- theRM byte OUT_REGMODE_IDLE
- theRS byte OUT_RUNSTATE_RUNNING
- thePorts byte[] OUT_B, OUT_C // motors B and C
- // pid coeffs
- kp sdword 30
- kd sdword 35
- ki sdword 5
- scale sdword 45
- // pid value
- pid sdword
- //temp var
- temp sdword
- // timer vars
- thenTick dword
- nowTick dword
- dseg ends
- thread main
- setin IN_TYPE_LIGHT_ACTIVE, IN_2, Type
- // initialize motors
- set thePower, 0
- set theUF, UF_UPDATE_SPEED+UF_UPDATE_MODE
- setout thePorts, OutputMode, theOM, RegMode, theRM, RunState, theRS, UpdateFlags, theUF, Power, thePower
- set theUF, UF_UPDATE_SPEED
-
- // wait a bit to let sensor stabilize
- gettick nowTick
- add thenTick, nowTick, 100 // 等 100 ms
- Waiting:
- gettick nowTick
- brcmp LT, Waiting, nowTick, thenTick //如果nowTick小于thenTick时,跳到Waiting
- // reads center value. NXTway must be balanced.
- getin NVal, IN_2, NormalizedValue // More precise than PercentValue
- mov offset, NVal
- Forever:
- getin NVal, IN_2, NormalizedValue // read sensor values
- sub err, NVal, offset // Substract center value
- brtst GT, ErrPos, err // 如果err大于0,跳到ErrPos
- mul err, err, 16 // (less variation if far from surface)
- div err, err, 10
- ErrPos:
- sub errdiff, err, errold // 计算微分错误
- mov errold, err
-
- add errint, errint, err // 计算积分错误
- mul errint, errint, 2 // (with fast damping)
- div errint, errint, 3
-
- mul pid, kd, errdiff // 微分部分
- mul temp, kp, err // 比例部分
- add pid, pid, temp // Add Diff+Prop
- mul temp, ki, errint // 积分部分
- add pid, pid, temp // Add int
- div pid, pid, scale // Scale PID value
-
- // saturate over 100 and under -100
- brcmp LT, under100, pid, 100 //pid小于100时,跳到under100
- mov pid, 100
- under100:
- brcmp GT, overMin100, pid, -100 //pid大于-100时,跳到overMin100
- mov pid, -100
- overMin100:
- mov thePower, pid // Update motor power
- setout thePorts, UpdateFlags, theUF, Power, thePower
- jmp Forever
- exit
- endt
复制代码 |
|