Skocz do zawartości

Pomocna odpowiedź

Napisano

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) ?

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
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?

(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

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...