Hi All,
I'm making an autonomous car with an Arduino Uno and a GPS module. I also want to use a compass to get a more accurate reading of the direction of the car. I was wondering if anyone could provide a modification of my code that would allow me to attach a compass and have it work in conjunction with the rest of the code and my GPS. I'll attach the code below. Thanks,
Chris
[quote]
[color=#7E7E7E]/* GPS Car v0.1 by Eric Barch (ttjcrew.com) */[/color]
#include <nmea.h>
#include <[color=#CC6600]Servo[/color].h>
#undef [color=#CC6600]abs[/color]
#undef [color=#CC6600]round[/color]
[color=#CC6600]int[/color] wpt = 0;
[color=#CC6600]float[/color] dest_latitude;
[color=#CC6600]float[/color] dest_longitude;
[color=#CC6600]NMEA[/color] gps([color=#006699]GPRMC[/color]); [color=#7E7E7E]// GPS data connection to GPRMC sentence type[/color]
[color=#7E7E7E]/* BEGIN EDITABLE CONSTANTS SECTION */[/color]
[color=#7E7E7E]//These define the positions for your steering servo[/color]
#define CENTER_SERVO 95
#define MAX_LEFT_SERVO 85
#define MAX_RIGHT_SERVO 108
[color=#7E7E7E]//When the car is within this range (meters), move to the next waypoint[/color]
#define WPT_IN_RANGE_M 12
[color=#7E7E7E]//These pins are your h-bridge output. If the car is running in reverse, swap these[/color]
#define MOTOR_OUTPUT_ONE 3
#define MOTOR_OUTPUT_TWO 4
[color=#7E7E7E]/* DEFINE GPS WPTS HERE - Create more cases as needed */[/color]
[color=#CC6600]void[/color] trackWpts() {
[color=#CC6600]switch[/color](wpt) {
[color=#CC6600]case[/color] 0:
dest_latitude = 37.764209;
dest_longitude = -122.428447;
[color=#CC6600]break[/color];
[color=#CC6600]case[/color] 1:
dest_latitude = 37.775206;
dest_longitude = -122.419209;
[color=#CC6600]break[/color];
[color=#CC6600]default[/color]:
dest_latitude = 0;
dest_longitude = 0;
[color=#CC6600]break[/color];
}
[color=#CC6600]if[/color] (gps.[color=#CC6600]gprmc_distance_to[/color](dest_latitude,dest_longitude,[color=#006699]MTR[/color]) < WPT_IN_RANGE_M)
wpt++;
}
[color=#7E7E7E]/* END EDITABLE CONSTANTS SECTION */[/color]
[color=#CC6600]Servo[/color] steering;
[color=#CC6600]float[/color] dir; [color=#7E7E7E]// relative direction to destination[/color]
[color=#CC6600]int[/color] servo_pos = CENTER_SERVO;
[color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]() {
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]begin[/color](4800);
[color=#CC6600]pinMode[/color](MOTOR_OUTPUT_ONE, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](MOTOR_OUTPUT_TWO, [color=#006699]OUTPUT[/color]);
steering.[color=#CC6600]attach[/color](9);
}
[color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]() {
trackWpts();
trackGPS();
}
[color=#CC6600]void[/color] trackGPS() {
[color=#CC6600]if[/color] (dest_latitude != 0 && dest_longitude != 0)
{
[color=#CC6600]if[/color] ([color=#CC6600][b]Serial[/b][/color].[color=#CC6600]available[/color]() > 0 ) {
[color=#CC6600]char[/color] c = [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]read[/color]();
[color=#CC6600]if[/color] (gps.[color=#CC6600]decode[/color](c)) {
[color=#7E7E7E]// check if GPS positioning was active[/color]
[color=#CC6600]if[/color] (gps.[color=#CC6600]gprmc_status[/color]() == [color=#006699]'A'[/color]) {
[color=#7E7E7E]// calculate relative direction to destination[/color]
dir = gps.[color=#CC6600]gprmc_course_to[/color](dest_latitude, dest_longitude) - gps.[color=#CC6600]gprmc_course[/color]();
[color=#CC6600]if[/color] (dir < 0)
dir += 360;
[color=#CC6600]if[/color] (dir > 180)
dir -= 360;
[color=#CC6600]if[/color] (dir < -75)
hardLeft();
[color=#CC6600]else[/color] [color=#CC6600]if[/color] (dir > 75)
hardRight();
[color=#CC6600]else[/color]
driveToTarget();
}
[color=#CC6600]else[/color] [color=#7E7E7E]//No GPS Fix...Wait for signal[/color]
[color=#CC6600]stop[/color]();
}
}
}
[color=#CC6600]else[/color]
[color=#CC6600]stop[/color]();
}
[color=#CC6600]void[/color] driveStraight() {
steering.[color=#CC6600]write[/color](CENTER_SERVO);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_ONE, [color=#006699]LOW[/color]);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_TWO, [color=#006699]HIGH[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"Driving straight..."[/color]);
}
[color=#CC6600]void[/color] driveToTarget() {
servo_pos = [color=#CC6600]map[/color](dir, -75, 75, MAX_LEFT_SERVO, MAX_RIGHT_SERVO);
steering.[color=#CC6600]write[/color](servo_pos);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_ONE, [color=#006699]LOW[/color]);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_TWO, [color=#006699]HIGH[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"Driving at "[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](dir);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]". - "[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](gps.[color=#CC6600]gprmc_distance_to[/color](dest_latitude,dest_longitude,[color=#006699]MTR[/color]));
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"m to go"[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"\n"[/color]);
}
[color=#CC6600]void[/color] hardLeft() {
steering.[color=#CC6600]write[/color](MAX_LEFT_SERVO);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_ONE, [color=#006699]LOW[/color]);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_TWO, [color=#006699]HIGH[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"Driving hard left. - "[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](gps.[color=#CC6600]gprmc_distance_to[/color](dest_latitude,dest_longitude,[color=#006699]MTR[/color]));
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"m to go"[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"\n"[/color]);
}
[color=#CC6600]void[/color] hardRight() {
steering.[color=#CC6600]write[/color](MAX_RIGHT_SERVO);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_ONE, [color=#006699]LOW[/color]);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_TWO, [color=#006699]HIGH[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"Driving hard right. - "[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color](gps.[color=#CC6600]gprmc_distance_to[/color](dest_latitude,dest_longitude,[color=#006699]MTR[/color]));
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"m to go"[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"\n"[/color]);
}
[color=#CC6600]void[/color] [color=#CC6600]stop[/color]() {
steering.[color=#CC6600]write[/color](CENTER_SERVO);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_ONE, [color=#006699]HIGH[/color]);
[color=#CC6600]digitalWrite[/color](MOTOR_OUTPUT_TWO, [color=#006699]HIGH[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"Stopped."[/color]);
[color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"\n"[/color]);
}
[/quote]