Subject:
|
Re: NQC Code
|
Newsgroups:
|
lugnet.robotics
|
Date:
|
Thu, 3 Dec 1998 04:12:34 GMT
|
Viewed:
|
5046 times
|
| |
| |
In article <3665A4B9.861224B6@ghg.net>, lego-robotics@crynwr.com (John
Donaldson) wrote:
> I got two questions.
>
> 1. How do you use the timer() function under NQC?
> 2. What is best way to determine if bot is stuck in corner make it turn
> 180 deg to get out?
>
> John A. Donaldson
I'm going from memory here - sorry if I goof something up....
There are three timers (0, 1, and 2). They are free running at 10Hz
(100ms per tick). They do not run while the RCX is "off", but they do
retain their count. You can clear a timer with ClearTimer(n), where n is
0, 1 or 2. You an retrive the current timer value with Timer(n).
This can be a good way to repeat a certain series of steps for a certain
amount of time. I've appended a sample program I used for a line follower
robot. There's a loop in the follow() subroutine where the program turns
until it either hits a line or a timeout expires.
Dave
---------------
/* tracker.nqc
* written by Dave Baum for nqcc 0.5 b1
*
* This is a more complex program for a line-following robot.
* As usual, outputs A and C drive right and left tank treads,
* while input 1 is a light sensor at the front of the robot.
*
* The follow() subroutine follows a thin line until in
* encounters a very dark spot, at which point the robot
* stops. When following a line, the robot runs forward
* until the light sensor reading exceeds a given value,
* at which point it starts turning right (or left) a bit
* looking for the rest of the line. It continues to
* oscillate left and right until it finds the line, then
* continues forward. The program remembers the direction
* previously used to find the line, so it can start turning
* the same way next time it loses the line.
*
* The main program follows a line until it reaches the end (a
* dark spot), then beeps, turns around, and follows the line
* back to the start. The "test" surface should be white with
* a thin black line (1/8 inch thick) which can turn and curve
* as you desire. Solid dark "endpoint" should be at both ends
* of the line - 1" wide black squares work well.
*
*/
#define EYE IN_1
#define LEFT OUT_C
#define RIGHT OUT_A
#define NORMAL_SPEED 6
#define TURN_SPEED 2
#define DELAY 20
#define CUTOFF 55
#define STOP 48
int direction, time, eye;
#define INITIAL_TIME 2
task main
{
Sensor(EYE, IN_LIGHT);
direction = 1;
time = INITIAL_TIME;
follow();
PlaySound(5);
turn_around();
follow();
}
sub turn_around
{
Fwd(LEFT, TURN_SPEED);
Rev(RIGHT, TURN_SPEED);
wait(EYE > CUTOFF);
Sleep(25);
wait(EYE < CUTOFF);
Off(LEFT+RIGHT);
}
sub follow
{
Fwd(LEFT+RIGHT, NORMAL_SPEED);
while(true)
{
eye = EYE;
if (eye < STOP) break;
if (eye <= CUTOFF) continue;
{
ClearTimer(0);
if (direction == 1)
{
Fwd(RIGHT, TURN_SPEED);
Rev(LEFT, TURN_SPEED);
}
else
{
Fwd(LEFT, TURN_SPEED);
Rev(RIGHT, TURN_SPEED);
}
while(true)
{
if (EYE < CUTOFF)
{
time = INITIAL_TIME;
break;
}
if (Timer(0) > time)
{
direction *= -1;
time *= 2;
break;
}
}
Fwd(RIGHT+LEFT, NORMAL_SPEED);
}
}
Off(RIGHT+LEFT);
}
--
reply to: dbaum at enteract dot com
|
|
Message has 1 Reply: | | Re: NQC Code
|
| Dave, Sorry for not getting back sooner. Been out of town. Anyway, thanks for the reply. This is what I am looking for. I am going to combine this wirh another routine. Basicly 1. Right Touch Sensor hits object. RCount += 1; IF RCount >= 2 { RCount (...) (26 years ago, 9-Dec-98, to lugnet.robotics)
|
Message is in Reply To:
| | NQC Code
|
| I got two questions. 1. How do you use the timer() function under NQC? 2. What is best way to determine if bot is stuck in corner make it turn 180 deg to get out? John A. Donaldson (26 years ago, 2-Dec-98, to lugnet.robotics)
|
5 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
This Message and its Replies on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
Active threads in Robotics
|
|
|
|