PlayTone(494, 10);
PlayTone(660, 10);
SendMessage (RELEASE_MESSAGE);
lastArmMessage = RELEASE_MESSAGE;
}
if (SENSOR_1 >= (middle + TOLERANCE) &&
lastArmMessage != GRAB_MESSAGE) {
PlayTone(660, 10);
PlayTone(494, 10);
SendMessage(GRAB_MESSAGE);
lastArmMessage = GRAB_MESSAGE;
}
}
}
task heartbeat() {
while (true) {
SendMessage (HEARTBEAT_MESSAGE);
Wait (HEARTBEAT_TIME);
}
}
The main task configures the inputs on the remote control and starts up the other tasks.
The touchWatcher task is fairly straightforward. It listens for a touch on either touch sensor. When one is detected, the remote sends out an IR command to Minerva to go forward or to spin in
place. Then the task waits for the touch sensor to be released and sends a stop command to Minerva.
The call to Wait(10) deserves more mention; it's an example of a technique called debouncing. Debouncing is a way of making touch sensors (and buttons in general) work reliably. The basic
problem occurs just at the point where you press the touch sensor enough to make its state change from off to on. Tiny motions or electrical variations can cause the touch sensor's output to switch
back and forth very quickly between on and off. This effect is called bounce, and it occurs while you're pressing or releasing the switch, between the steady states of off and on. Bounce can be
eliminated with an electronic circuit or by special programming, as I've done here. The call to Wait(10) gives the touch sensor signal a chance to settle down before touchWatcher starts
looking for the release of the touch sensor.
The slider on the remote changes the value of the light sensor. lightWatcher is the task that monitors the light sensor. If the sensor value changes from light to dark, the remote tells Minerva to
release the grabber. A dark-to-light transition causes the remote to send a grab command to Minerva.
Just what exactly what "light" and "dark" are is a little tricky to define. I had originally hard-coded light values, but then the remote had to be reprogrammed depending on whether I was using it in
daylight or at night. Instead, the remote uses a scheme to calibrate itself on the fly. It keeps track of its minimum and maximum light readings in the minimum and maximum variables, as shown
here:
current = SENSOR_1;
if (current < minimum) minimum = current;
if (current > maximum) maximum = current;
midline = minimum + (maximum - minimum) / 2;
Then lightWatcher calculates the midpoint of the minimum and maximum values. This value is used to determine exactly what light and dark values cause the remote to fire commands to
Minerva. lightWatcher also keeps track of the last
Page 153
Need help?
Do you have a question about the MINDSTORMS Robots and is the answer not in the manual?
Questions and answers