Skocz do zawartości

Robot śledzący GPS z telefonu


konx8

Pomocna odpowiedź

Witam

Zwracam się z prośbą o pomoc dotyczącej robota którego właśnie tworzę.

Zaczynając od początku, robot działa na Arduino UNO posiada moduł GPS, BT, kompas oraz w przyszłości będzie posiadał napęd składający się z 2 silników.
Zamysł był taki aby korzystając z aplikacji Blynk (wybrałem taką ponieważ jest bardzo prosta a ja nie będę potrzebował dużo zadań wykonywanych z telefonu) poprzez moduł BT, telefon łączył się z robotem, następnie odczytał wartość GPS z robota porównał ją z GPS z telefonu następnie obliczając dystans kąt i kilka innych rzeczy rozpoczął  podążać z telefonem podłączonym do robota.

Niestety mam problemy z danymi które szczytuje z GPS ponieważ wyświetla mi on co tylko 0.
Każdy program z osobna działa poprawnie i odczytuje poprawne wartości GPSów. Niestety podczas łączenia ich w jedno nie działa.

Myślałem na początku ,że problem może być ze strony portów które nie nadążają wysyłać i odbierać dane z BT oraz z 2 GPS.

Wtedy zacząłem korzystać z biblioteki ALTSerial i początkowo dało to jakiś progres jednak GPS w telefonie zaczął  przypisywać wartości GPS z robota. Aktualnie mam robota który nie działa poprawnie gdy są 2 GPS podłączone i próbują odczytać dane.

Oto kod :

#include "TinyGPS++.h"         // GPS   
#include "SoftwareSerial.h"
#include <AltSoftSerial.h>
#include <BlynkSimpleSerialBLE.h> // Biblioteka odpowiadająca za BT
#include <QMC5883LCompass.h>  // Compas Library
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT  // BT
#define BLYNK_PRINT BT_Serial   // BT


SoftwareSerial BT_Serial(2, 3); // BT podłączony do Seriala na pinach 2-RX, 3-TX

SoftwareSerial GPS_Serial (10, 11); //GPS nowy Serial 10-TX, 11-RX
TinyGPSPlus gps2; // GPS z robota fizyczny

WidgetTerminal terminal(V2); // przypisanie terminala do V2
QMC5883LCompass compass;     // deklaracja 

char auth[] = "ok3q9uiJKllXv9dtOR7XyewQq0EL-_H6"; // Token przypisany do aplikacji BLYNK

struct GeoLoc {
  float szer;
  float dlu;
}Phone,Robo;

void Distance () // in KM 
{
  float X = ((Phone.szer - Robo.szer) * 6378,14 * cos(Robo.dlu)) / 360.0;
  float Y = ((Phone.dlu - Robo.dlu) * 6356,75) / 360.0;

  float X2 = X * X;
  float Y2 = Y * Y;

  float Distance = sqrt(X2 + Y2);

  Serial.println("Distance");
  Serial.println(Distance);
}
//----------------------------------------------------------------------------------------------------------------------------
void Compas()
{
 int x, y, z;
  // Read compass values
  compass.read();
  // Return XYZ readings
  x = compass.getX();
  y = compass.getY();
  z = compass.getZ();
  Blynk.virtualWrite(V2," X:",x ," Y:",y ," Z:",z );
}
void GPS_robot()  // Data GPS form robot ---------------------------------------------------------------------------------
{
   while(GPS_Serial.available() > 0)
  {
    gps2.encode(GPS_Serial.read());
  }
    if(gps2.location.isUpdated())
    {
      Serial.print("Lotitude");
      Serial.println((gps2.location.lat()),6 );
      Serial.print("Longitude:");
      Serial.println((gps2.location.lng()),6 );

      Robo.szer = gps2.location.lat();
      Robo.dlu = gps2.location.lng();
    } 
}
BLYNK_WRITE (V0) // GPS Stream Widget  Data from Phone ------------------------------------------------------------
{
  GpsParam gps(param);
  Serial.println("Received remote GPS: ");
  // Print 7 decimal places for Lat
  Serial.print(gps.getLat(), 7);
  Serial.print(", ");
  Serial.println(gps.getLon(), 7);
  
  Phone.szer = gps.getLat();
  Phone.dlu = gps.getLon();
}
BLYNK_WRITE (V1) // Wirtualny przycisk --------------------------------------------------------------------------------------
{
  
}
BLYNK_WRITE (V2) // Terminal Widget  ------------------------------------------------------------------------------------------
{
  if (String("clear") == param.asStr()) 
  {
    terminal.clear ();
  } 
  else if (String("compas") == param.asStr())
  {
    Compas();
  }
    else if (String("rob") == param.asStr())
  {
  
  } 
}
void setup()     //-------------------------------------------------------------------------------------------
{ 
  //Debugging
  Serial.begin(9600);
  
  //GPS
  GPS_Serial.begin(9600);
    
  //Bluetooth
 BT_Serial.begin(9600); 
 Blynk.begin(BT_Serial, auth);
  
  //Terminal
  terminal.clear();  
   
  //Compas
  compass.init(); 

}

void loop()     //-------------------------------------------------------------------------------------------------------
{
    Blynk.run(); 
    
    Serial.println("dane z tele");
    Serial.println(Phone.szer, 5);
    Serial.println(Phone.dlu, 5);
    Serial.println("dane z robota");
    Serial.println(Robo.szer, 5);
    Serial.println(Robo.dlu, 5);
    delay (2000);
   
    Distance ();
    delay (2000);
}

Czy ktoś mógłbym pomóc mi z otrzymywaniem poprawnych danych z 2 GPS ( z telefonu oraz robota) ?

Link do komentarza
Share on other sites

Przeniosłem temat do innego działu, tamten służy bardziej do publikacji gotowych robotów. Jeżeli dokończysz projekt, możesz śmiało go tam umieścić. Ewentualnie założyć temat w sekcji nieukończone / worklog, gdzie możesz pochwalić się postępem prac.

  • Lubię! 1
Link do komentarza
Share on other sites

8 godzin temu, konx8 napisał:

Aktualnie mam robota który nie działa poprawnie gdy są 2 GPS podłączone i próbują odczytać dane.

@konx8 możesz trochę dokładniej to opisać? Jak podłączasz te 2 GPSy? Wydaje się jakbyś trochę za dużo namieszał z tymi serialami, nie jest ich za dużo różnych?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Seriale które używam to od BT oraz od GPS

SoftwareSerial BT_Serial(2, 3);

SoftwareSerial GPS_Serial (10, 11);

Jeden jest normalnie podłączony do Ardunio (GPS od robota) na pinach 10/11, natomiast drugi GPS to GPS z telefonu. Udało mi się dziś uruchomić GPS z telefonu który na bieżąco wysyła dane i wyświetla w porcie. Jednak dane z GPS z robota są odbierane jako 0 co nie jest prawdą. GPS z telefonu działa za pomocą aplikacji BLYNK. Funkcja dotycząca go jest zawarta w funkcji :
BLYNK_WRITE (V0)

A co do seriali tam masz racje ten ALT nie jest tam potrzebny.

Dodaje troszkę zmieniony program w którym działa GPS odczytujący dane z telefonu.

Dodaję również to co widzę na porcie.

 

Aktualnie brakuje mi odczytywania danych z GPS z robota abym mógł ruszyć dalej z obliczaniem dystansu itd.

Wydaje mi się ,że gdy port dotyczący BT wysyła i odbiera dane z telfonu to dane z GPS nie są już wysyłane ponieważ BT zajmuje wszystko.

Ale to tylko moje gdybanie, mogę się mylić.

#include "TinyGPS++.h"         // GPS   
#include "SoftwareSerial.h"
#include <BlynkSimpleSerialBLE.h> // Biblioteka odpowiadająca za BT
#include <QMC5883LCompass.h>  // Compas Library
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT  // BT
#define BLYNK_PRINT BT_Serial   // BT

SoftwareSerial BT_Serial(2, 3); // BT podłączony do Seriala na pinach 2-RX, 3-TX
SoftwareSerial GPS_Serial (10,255 ); //GPS nowy Serial 10-TX, 11-RX

TinyGPSPlus gps2; // GPS z robota fizyczny
WidgetTerminal terminal(V2); // przypisanie terminala do V2
QMC5883LCompass compass;     // deklaracja 
char auth[] = "ok3q9uiJKllXv9dtOR7XyewQq0EL-_H6"; // Token przypisany do aplikacji BLYNK

struct GeoLoc {
  float szer;
  float dlu;
}Phone,Robo;

void Distance () // in KM 
{
  float X = ((Phone.szer - Robo.szer) * 6378,14 * cos(Robo.dlu)) / 360.0;
  float Y = ((Phone.dlu - Robo.dlu) * 6356,75) / 360.0;

  float X2 = X * X;
  float Y2 = Y * Y;

  float Distance = sqrt(X2 + Y2);
  Serial.println("Distance");
  Serial.println(Distance);
}
//----------------------------------------------------------------------------------------------------------------------------
void Compas()
{
 int x, y, z;
  // Read compass values
  compass.read();
  // Return XYZ readings
  x = compass.getX();
  y = compass.getY();
  z = compass.getZ();
  Blynk.virtualWrite(V2," X:",x ," Y:",y ," Z:",z );
}
void GPS_robot()  // Data GPS form robot ---------------------------------------------------------------------------------
{
   while(GPS_Serial.available() > 0)
  {
    gps2.encode(GPS_Serial.read());
  }
    if(gps2.location.isUpdated())
    {
     // Serial.print("Lotitude");
      //Serial.println((gps2.location.lat()),6 );
      //Serial.print("Longitude:");
      //Serial.println((gps2.location.lng()),6 );

      Robo.szer = gps2.location.lat();
      Robo.dlu = gps2.location.lng();
    }
}
BLYNK_WRITE (V0) // GPS Stream Widget  Data from Phone ------------------------------------------------------------
{
  GpsParam gps(param);
  Serial.println("Received remote GPS: ");
  // Print 7 decimal places for Lat
  Serial.print(gps.getLat(), 7);
  Serial.print(", ");
  Serial.println(gps.getLon(), 7);
  
  Phone.szer = gps.getLat();
  Phone.dlu = gps.getLon();
}
BLYNK_WRITE (V1) // Wirtualny przycisk --------------------------------------------------------------------------------------
{
  
}
BLYNK_WRITE (V2) // Terminal Widget  ------------------------------------------------------------------------------------------
{
  if (String("clear") == param.asStr()) 
  {
    terminal.clear ();
  } 
  else if (String("compas") == param.asStr())
  {
    Compas();
  }
    else if (String("rob") == param.asStr())
  {
  
  } 
}
void setup()     //-------------------------------------------------------------------------------------------
{ 
  //Debugging
  Serial.begin(9600);
  //GPS
  GPS_Serial.begin(9600);
  //Bluetooth
 BT_Serial.begin(9600); 
 Blynk.begin(BT_Serial, auth);
 
  //Terminal
  terminal.clear();   
  //Compas
  compass.init(); 

}

void loop()     //-------------------------------------------------------------------------------------------------------
{
    Blynk.run(); 
    
    Serial.println("dane z robota");
    Serial.println(Robo.szer, 5);
    Serial.println(Robo.dlu, 5);
    delay (2000); 
}

 

Port.PNG

Edytowano przez konx8
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.