I’ve just uploaded a YouTube video of my 3pi robot I call Fourtophi (4^phi is about 3pi, don’t you see) running my SpinLineFollow code. It is basically a line follower that is constant spinning in circles, while it is following a black line. It is not a very fast line follower, but won the “Best in Show” award at our last LVBots Challenge robot competition.
If there is interest, I’d be happy to clean up my code and share it. It’s only about a page’s worth.
OK, Here it is. I just call this after the normal sensor calibration code.
Byon
// 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
}
}
Hello,
I´d like know how many library used in the program, because I can´t compiler this program in my 3PI… thank you and sorry because my english is not very well…
You should only need the Pololu AVR library. You can download the library and find installation instructions in its user’s guide. Good luck getting it working. If you continue to have problems, please post the errors you’re getting.
In the attachment there’s the code and makefile to compile and program
Untar the file and do make or make program from the bash.
Cheers. 4picode.tar (100 KB)