作者已經很大方的公佈程式碼 http://forum.pololu.com/viewtopic.php?t=1371#p6306
質問場合、彼求
======================
// Spinning Line Following code for the Pololu 3pi -- Byon Garrabrant - byon @ byon . com
// Ramp each wheel from MIN_SPEED to MAX_SPEED and back as it spins so it will translate along the line.
// Assumes the sensors have already been calibrated.
#include <pololu/3pi.h>
#define FORWARD_OFFSET 0xA0 // Offset (0..255) of forward from the the front line
#define MAX_SPEED 255 // Maximum speed the wheels will go
#define MIN_SPEED 200 // Minimum speed the wheels will go
void Spinning_Line_Follow( void )
{
unsigned short phase_start = get_ms(); // Start time of this rotation
unsigned short last_phase_len = 100; // Duration of the last rotation
char last_line_side = 0; // which side was the line on?
char line_count = 0; // Is this the front or back line?
char led_duration = 0; // How much longer should the LED be on
while ( 1 ) {
unsigned short cur_time = get_ms(); // Grab the current time in ms
unsigned int sensors[5]; // Is the line left or right?
char line_side = (read_line(sensors,IR_EMITTERS_ON) < 2000);
left_led( 0 ); // Turn off the "FRONT" LED
if (line_side & !last_line_side) { // If it just changed,
if ( ++line_count & 1 ) { // and if this is the front line
left_led( 1 ); // Turn on "FRONT" LED
last_phase_len = cur_time - phase_start;// save the last rotation duration
phase_start = cur_time; // and start counting this rotation
}
}
last_line_side = line_side; // Remember where the line was
unsigned short cur_phase = cur_time - phase_start; // How far are we into the curent rotation?
cur_phase <<= 8; // Multipy by 256
cur_phase /= last_phase_len; // based on the last rotation duration
cur_phase += FORWARD_OFFSET; // offset by which direction is "FORWARD"
short left = cur_phase & 0xFF; // Wrap back to 0 .. 255
if ( left >= 128 ) { // Convert to 0 .. 127 .. 0
left = 256 - left;
}
left = (((left * (MAX_SPEED - MIN_SPEED))>>7) + MIN_SPEED); // Scale the wheel speed to be MIN at 0, MAX at 127
short right = MAX_SPEED + MIN_SPEED - left; // the right is 180 degress out of phase from the left
set_motors(left, -right); // and the right goes backwards
}
}
Byon
Posts: 2
Joined: Thu Feb 26, 2009 4:34 pmTop
--------------------------------------------------------------------------------