• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Moduł GPS Neo-6M-0-001 i problem z odbiorem danych
#11
(25-02-2023, 17:42)kaczakat napisał(a): Poza tym wyrażaj się jasno, łapie sygnał to dla modułu GPS oznacza łapanie fixa na satelity, a Ty walczyłeś z komunikacją.
Mój błąd, tak chodziło o komunikację.

(25-02-2023, 17:42)kaczakat napisał(a): Soft serial może lepiej działać na pinach 2 i 3.
Niestety byłem zmuszony na zmianę, ponieważ na pinach 2 i 3 mam moduł bluetooth.

Udało mi się złapać komunikację pomiędzy modułem a Arduino, dioda Tx zaczęła migać, a w monitorze portu szeregowego dostawałem odpowiedź na test, nawet nie ma żadnych dziwnych krzaczków i znaków zapytania. Chociaż zauważyłem, że czasem działa, a czasem nie łapie komunikacji.
[Obrazek: nhf2PJv.png]

//Edit: Sprawdziłem drugi kod
Kod:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
/*
   This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 12, TXPin = 13;
static const uint32_t GPSBaud = 9600;
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);
  Serial.println(F("DeviceExample.ino"));
  Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
}
void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.
  while (ss.available() > 0)
    if (gps.encode(ss.read()))
      displayInfo();
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
}
void displayInfo()
{
  Serial.print(F("Location: "));
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.println();
}
I z tym kodem wyświetla mi lokalizację w monitorze, ale dioda nie miga na module, może być wina uszkodzonej diody czy po prostu tak też się zdarza?
 
Odpowiedź
#12
Brawo Ty!

Jak działa to nie wnikaj. Czy uszkodzona dioda multimetrem nawet sprawdzisz.
 
Odpowiedź
#13
Pojawił się nowy problem z modułem GPS. Napisałem osobno kod dla serwa i dla GPS, wszystko działało bez zarzutu, jednak po połączeniu obu kodów serwo zaczyna wariować. Wykonuje dowolne ruchy bez żadnej ingerencji z mojej strony. Szukałem na forum angielskim odpowiedzi jak to naprawić i znalazłem rozwiązanie z wykorzystaniem biblioteki ServoTimer2.h. Niestety biblioteka nie była w stanie mi pomóc, serwo nadal porusza się samodzielnie, choć jest lepiej niż z Servo.h, ale nadal nie reaguje na wartości wysyłane z telefonu, czyli na "1" lub "0", po prostu obraca się samo co jakiś czas.
Działanie miało być następujące. Po włączeniu aplikacji z urządzeniem sparowanym z telefonem, telefon wysyłałby wartość "1", co automatycznie poruszałoby serwem, następnie po wyłączeniu aplikacji, telefon wysyłałby "0" i serw powróciłby do pozycji wyjściowej(tak zrobiłem i działało to do momentu podłączenia modułu GPS). Jako dodatkową opcję chciałem, aby urządzenie wysyłało lokalizację do telefonu i pokazywało gdzie urządzenie się znajduje po naciśnięciu przycisku w aplikacji. Czy jest jakiś sposób, aby to naprawić i aby GPS nie kolidował z serwo? Rozumiem, że projekt może wydawać się bez sensu, ponieważ bluetooth ma ograniczoną odległość połączenia, więc pokazywanie lokalizacji z takiej odległości jest bez sensu, ale to po prostu prowizoryczne urządzenie, aby pokazać jak działa.
Mój sprzęt to:
-Arduino Uno
-Bluetooth HC-05
-Servo SG90
-GPS Neo-6M

Kod:
#include <LiquidCrystal_I2C.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <ServoTimer2.h>

ServoTimer2 myservo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inicjalizacja obiektu wyświetlacza LCD
SoftwareSerial bluetooth(2, 3); // RX, TX
TinyGPSPlus gps; // Inicjalizacja obiektu TinyGPSPlus
SoftwareSerial ss(4, 5);

// Zmienne przechowujące dane o prędkości
float speedKMH = 0;
int currentPos = 0; // początkowa pozycja serwomechanizmu

void setup()
{
  Serial.begin(9600); // Inicjalizacja połączenia szeregowego
  bluetooth.begin(9600); // inicjalizacja modułu Bluetooth
  ss.begin(9600);
  myservo.attach(7); // podłączenie serwomechanizmu do pinu 7
  myservo.write(currentPos); // ustawienie początkowej pozycji serwomechanizmu

  // Inicjalizacja wyświetlacza LCD
  lcd.begin();
  lcd.backlight();

  // Wyświetlenie napisu "Predkosciomierz" na wyświetlaczu LCD
  lcd.setCursor(0, 0);
  lcd.print("Predkosciomierz");
}

void loop()
{
  if (bluetooth.available()) { // jeśli dane są dostępne z modułu Bluetooth
    char incomingByte = bluetooth.read(); // odczytaj dane
    if (incomingByte == '1') { // jeśli otrzymano wartość 1
      if (currentPos != 90) { // jeśli serwomechanizm nie jest w pozycji 90 stopni
        myservo.write(90);
        currentPos = 90; // aktualizuj pozycję serwomechanizmu
      }
    }
    if (incomingByte == '0') { // jeśli otrzymano wartość 0
      if (currentPos != 0) { // jeśli serwomechanizm nie jest już w pozycji 0 stopni
        myservo.write(0);
        currentPos = 0; // aktualizuj pozycję serwomechanizmu
      }
    }
    if (incomingByte == '2') {
      while (ss.available() > 0) {
        if (gps.encode(ss.read())) {
          // Pobranie danych o lokalizacji
          double latitude = gps.location.lat();
          double longitude = gps.location.lng();
          // Wysłanie danych o lokalizacji przez moduł Bluetooth
          bluetooth.print(latitude, 6);
          bluetooth.print(",");
          bluetooth.println(longitude, 6);
          Serial.print(latitude, 6);
          Serial.print(",");
          Serial.println(longitude, 6);
        }


      }
    }
  }
  // Obliczenie prędkości w km/h
  float speedMS = gps.speed.mps();
  speedKMH = speedMS * 3.6;
  // Wyświetlenie prędkości na wyświetlaczu LCD
  lcd.setCursor(0, 1);
  lcd.print("Speed:");
  lcd.print(speedKMH, 1);
  lcd.print(" km/h ");
}
Napisałem prawie identyczny post na angielskim forum, jednak tam nie dostałem zbytniej pomocy, co więcej jedna osoba stwierdziła, że patrząc realistycznie, to nie da się zrobić tego, aby działało. Może jednak ktoś zna się lepiej i wie co można zrobić i czy w ogóle?
 
Odpowiedź
#14
Nie wspomniałeś wcześniej o BT na pinach 2 i 3, to oznacza już 2 softseriale na tym cienkim sprzęcie. Zainwestuj w coś co ma więcej sprzętowych, MEGA ma 4, jest niewielka, stosunkowo, MEGA PRO MINI, można spróbować też płytki bluepill, ma co najmniej 2 dodatkowe, choć jakieś biblioteki mocno związane ze sprzętem mogą nie być zgodne i logika komunikacji jest 3.3V.
W obecnej konfiguracji nic dziwnego, że doświadczasz tego co opisujesz, działa jako tako, czasem lepiej, czasem gorzej.
Soft serial blokuje przerwania na czas transmisji, co może wpływać na działanie innych komponentów programu.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#15
Kod:
myservo.write(90)
W bibliotece użytej przez Ciebie wartość 90 jest bez sensu.

Zamiast 90 musisz użyć wartości określonej jako pulsewidth - szerokość impulsu. Wartość typowa dla serw dla 90st to 1500ms. Zakres dolny i górny może być 750 i 2250 albo 1000 i 2000.
 
Odpowiedź
#16
@MadMrQ, przecież mu to działa gdy nie używa serial? Biblioteka myservo już jest tak stworzona, że wartości zazwyczaj powinny być określone jako kąt ustawienia 0-180o.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości