Mayur Rabadiya
Published © LGPL

Self Guided Rover

It is a self guided rover which is work based on GPS data. In this rover no need to control rover by any external device.

IntermediateProtip2 hours7,993
Self Guided Rover

Things used in this project

Story

Read more

Schematics

Self Guided Rover

Code

Self Guided Rover

Arduino
Make different tab in arduino for "GPS Heading", " Heading",etc .
#include <Wire.h>
#include <MechaQMC5883.h>
#include<TinyGPS++.h>
#include<SoftwareSerial.h>

float latc,logc;
float latd=22.555355,logd=72.915869;
float bearing;
float heading;

const int rp = 10;
const int rn = 11;
const int lp = 8;
const int ln = 9;

SoftwareSerial GPS_SoftSerial(2,3);
TinyGPSPlus gps;
MechaQMC5883 qmc;

void setup() 
{
 pinMode(rp,OUTPUT);
 pinMode(rn,OUTPUT);
 pinMode(ln,OUTPUT);
 pinMode(lp,OUTPUT);
 Wire.begin();
 Serial.begin(9600);
 GPS_SoftSerial.begin(9600); 
 qmc.init();
}

void loop() 
{
  headingcal();
   delay(200);
  gpsdata();
  delay(200);
  gpsheading();
   delay(200);
  steering();
   delay(200);
}

GPS:-
void gpsdata()
{
  smartDelay(1000);
  unsigned long start;
  double lat_val, lng_val, alt_m_val;
  bool loc_valid, alt_valid;
  lat_val = gps.location.lat(); 
  loc_valid = gps.location.isValid(); 
  lng_val = gps.location.lng();
  alt_m_val = gps.altitude.meters(); 
  alt_valid = gps.altitude.isValid(); 
  
  if (!loc_valid)
  {
    Serial.print("Latitude : ");
    Serial.println("*****");
    Serial.print("Longitude : ");
    Serial.println("*****");
    delay(100);
  }
  else
  {
   // Serial.println("GPS READING: ");
   // DegMinSec(lat_val);
  //  Serial.print("Latitude in Decimal Degrees : ");
   // Serial.println(lat_val, 6);

    //DegMinSec(lng_val); 
    //Serial.print("Longitude in Decimal Degrees : ");
    //Serial.println(lng_val, 6);
    delay(100);
  }

  latc=lat_val;
  logc=lng_val;  
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (GPS_SoftSerial.available()) 
    gps.encode(GPS_SoftSerial.read());
  } while (millis() - start < ms);
}

GPS Heading:-
void gpsheading()
{
  float x,y,deltalog,deltalat;
  deltalog= logd-logc;
  deltalat=latd-latc;

  x=cos(latd)*sin(deltalog);
  y=(cos(latc)*sin(latd))-(sin(latc)*cos(latd)*cos(deltalog));
  
  bearing=(atan2(x,y))*(180/3.14);
  Serial.print("bearing");
  Serial.println(bearing);

  float a,d,c;
  a=(((sin(deltalat/2)))*(sin(deltalat/2))) + ((cos(latc))*(cos(latd))* (((sin(deltalog/2)))*(sin(deltalog/2)))  );
  c=2*(atan2(sqrt(a),sqrt(1-a)));
  d=6371*c; 
//Serial.println(d);
}



Heading:-
void headingcal()
{
  int x,y,z;
  qmc.read(&x,&y,&z);
  delay(100);

  heading=atan2(x, y)/0.0174532925;
  if(heading < 0) 
  {
  heading+=360;
  }
  
  heading=360-heading; // N=0/360, E=90, S=180, W=270
  Serial.print("heading: ");
   Serial.println(heading);  
}

Motor:-

void steering()
{

float finalv;
finalv=heading/bearing;
Serial.print("finalv: ");
Serial.println(finalv);
  
if(finalv>=0&&finalv<=1)
{
  forward();
}

else if(finalv >1 && finalv <=8)
{
  left();
}

else if(finalv <=13 && finalv >=8)
{
  right();
}

else if(logd==logc && latc==latd)
{
  stop1();
}
}

void forward()
{
  digitalWrite(rp,HIGH);
  digitalWrite(rn,LOW);
  digitalWrite(lp,HIGH);
  digitalWrite(ln,LOW);
}

void right()
{
  digitalWrite(rp,HIGH);
  digitalWrite(rn,LOW);
  digitalWrite(lp,LOW);
  digitalWrite(ln,HIGH);
}

void left()
{
  digitalWrite(rp,LOW);
  digitalWrite(rn,HIGH);
  digitalWrite(lp,HIGH);
  digitalWrite(ln,LOW);
}

void back()
{
  digitalWrite(rn,HIGH);
  digitalWrite(rp,LOW);
  digitalWrite(ln,HIGH);
  digitalWrite(lp,LOW);
}
void stop1()
{
  digitalWrite(rp,LOW);
  digitalWrite(rn,LOW);
  digitalWrite(lp,LOW);
  digitalWrite(ln,LOW);
}

Credits

Mayur Rabadiya
6 projects • 28 followers
Contact

Comments

Please log in or sign up to comment.