Hi im new to arduino. What im trying to do is move the stepper motor and servo according to the angle calculation. But first, my angle calculation need to get the latitude and longitude from gps. im using GPS module using this code.
#include <SoftwareSerial.h>
#include <TinyGPS.h>
SoftwareSerial mySerial(10, 9);
TinyGPS gps;
void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);
void setup()
{
// Oploen serial communications and wait for port to open:
Serial.begin(9600);
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
delay(1000);
Serial.println("uBlox Neo 6M");
Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
Serial.print("Sizeof(gpsobject) = ");
Serial.println(sizeof(TinyGPS));
Serial.println();
}
void loop() // run over and over
{
bool newdata = false;
unsigned long start = millis();
// Every 5 seconds we print an update
while (millis() - start < 5000)
{
if (mySerial.available())
{
char c = mySerial.read();
//Serial.print(c); // uncomment to see raw GPS data
if (gps.encode(c))
{
newdata = true;
break; // uncomment to print new data immediately!
}
}
}
if (newdata)
{
Serial.println("Acquired Data");
Serial.println("-------------");
gpsdump(gps);
Serial.println("-------------");
Serial.println();
}
}
void gpsdump(TinyGPS &gps)
{
long lat, lon;
float flat, flon;
unsigned long age, date, time, chars;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned short sentences, failed;
gps.get_position(&lat, &lon, &age);
Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
// On Arduino, GPS characters may be lost during lengthy Serial.print()
// On Teensy, Serial prints to USB, which has large output buffering and
// runs very fast, so it's not necessary to worry about missing 4800
// baud GPS characters.
gps.f_get_position(&flat, &flon, &age);
Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
gps.get_datetime(&date, &time, &age);
Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): ");
Serial.print(time);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/");
Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
Serial.print(" Time: "); Serial.print(static_cast<int>(hour+8)); Serial.print(":"); //Serial.print("UTC +08:00 Malaysia");
Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second));
Serial.print("."); Serial.print(static_cast<int>(hundredths)); Serial.print(" UTC +08:00 Malaysia");
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): ");
Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): ");
printFloat(gps.f_course()); Serial.println();
Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");
printFloat(gps.f_speed_mph());
Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): ");
printFloat(gps.f_speed_kmph()); Serial.println();
gps.stats(&chars, &sentences, &failed);
Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: ");
Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}
void printFloat(double number, int digits)
{
// Handle negative numbers
if (number < 0.0)
{
Serial.print('-');
number = -number;
}
// Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5;
for (uint8_t i=0; i<digits; ++i)
rounding /= 10.0;
number += rounding;
// Extract the integer part of the number and print it
unsigned long int_part = (unsigned long)number;
double remainder = number - (double)int_part;
Serial.print(int_part);
// Print the decimal point, but only if there are digits beyond
if (digits > 0)
Serial.print(".");
// Extract digits from the remainder one at a time
while (digits-- > 0)
{
remainder *= 10.0;
int toPrint = int(remainder);
Serial.print(toPrint);
remainder -= toPrint;
}
}
This works fine. But the error shown when i try to combine my code with the GPS code. It shows 'TinyGPS::f_get_position(float&)' error. i did many thing to fix this but failed. This is the code that i made.
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <Servo.h>
#include <Stepper.h>
const int stepsPerRevolution = 200; // number of steps per revolution - stepper motor
// initialize the stepper library on pins 2 through 5:
Stepper myStepper(stepsPerRevolution, 2, 3, 4, 5);
int stepCount = 0; // number of steps the stepper motor has taken
Servo myservo; // servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
SoftwareSerial mySerial(12, 13);
TinyGPS gps;
void setup()
{
Serial.begin(9600);
void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);
myservo.attach(30); // attaches the servo on pin 9 to the servo object
myStepper.setSpeed(60);
const float pi = 3.141592654;
const float Re = 6378.137;
const float h = 35786;
const float r = 42164.137;
const float Satlon = 91.5;
float flat = gps.TinyGPS::f_get_position(flat);
float flon = gps.TinyGPS::f_get_position(flon);
float Adeg = (flon - Satlon);
float Arad = (Adeg*(pi/180));
float Bdeg = flat;
float Brad = (Bdeg*(pi/180));
float y = (acos((cos(Arad))*(cos(Brad))));
float d = (sqrt(((Re*Re)+(r*r)) - ((2*Re*r)*(cos(y)))));
float el = (acos ((r/d)*(sin(y))));
float eldeg = (el*(180/pi));
float az = (asin (sin(Arad)/sin(y)));
float azdeg = (az*(180/pi));
float azStep = (azdeg/1.8);
if (pos < eldeg){
myservo.write(eldeg);// servo go for elevation angle
}
else if (pos > 90) {
myservo.write(pos);
}
if (stepCount < azStep)
{
myStepper.step(azStep);
delay(500);
}
else if (stepCount > azStep);
{
myStepper.step(stepCount);
delay (500);
}
}
void loop()
{
bool newdata = false;
unsigned long start = millis();
// Every 5 seconds we print an update
while (millis() - start < 5000)
{
if (mySerial.available())
{
char c = mySerial.read();
//Serial.print(c); // uncomment to see raw GPS data
if (gps.encode(c))
{
newdata = true;
break; // uncomment to print new data immediately!
}
}
}
if (newdata)
{
gpsdump(gps);
}
}
void gpsdump(TinyGPS &gps)
{
float flat, flon;
gps.f_get_position(&flat, &flon);
printFloat(flat, 5); printFloat(flon, 5);
// get float point latitude and longitude
}
void printFloat(double number, int digits)
{
// Handle negative numbers
if (number < 0.0)
{
number = -number;
}
// Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5;
for (uint8_t i=0; i<digits; ++i)
rounding /= 10.0;
number += rounding;
// Extract the integer part of the number and print it
unsigned long int_part = (unsigned long)number;
double remainder = number - (double)int_part;
// Print the decimal point, but only if there are digits beyond
if (digits > 0)
// Extract digits from the remainder one at a time
while (digits-- > 0)
{
remainder *= 10.0;
int toPrint = int(remainder);
remainder -= toPrint;
}
}
i want to store the gps data latitude and longitude in the variable flat and flon for the calculation.
Thank you for your help.