Cracow Linux Users Group

10Hz Bluetooth GPS na NodeMCU32-S

Typowy GPS w telefonie ma rozdzielczość 1Hz, co oznacza że wysyła jedną aktualizację lokalizacji na sekundę. Do większości zastosowań 1Hz w zupełności to wystarczy, ale czasami potrzeba więcej. Można łatwo samemu zmontować taki odbiornik.

Lista części:

  • Adafruit Ultimate GPS
  • NodeMCU-32S
  • kabelki jump-wire F-F
  • obudowa z drukarki 3D (na bazie Ultimate Box maker)
Ultimate GPS - moduł GPS MTK3339  z anteną - Adafruit 746
  • NodeMCU-32S, albo inna płytka z UART i Bluetooth kompatybilna z Arduino
NodeMCU ESP32 — ESPHome
  • kabelki jump-wire F-F
File:FF Jumper Wires.jpg - Wikimedia Commons
This image has an empty alt attribute; its file name is VGPS-1-744x475.png

Montaż

Moduł GPS podłączamy do NodeMCU32-S:

VIN <-> 3.3V
GND <-> GND

RX <-> GPIO17
TX <-> GPIO16

Następnie podłączamy NodeMCU32-S do komputera kablem USB. Dioda na GPS powinna zacząć rzadko mrugać.

Arduino IDE

Do programowania użyjemy platformy Arduino IDE 2 z https://www.arduino.cc/en/software

Po zainstalowaniu trzeba dodać obsługę płytek ESP32:

Otwórz File > Preferences > Settings (Ctrl+Comma) (i w pole Additional boards manager URLs wpisz adres: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

Teraz można dodać obsługę ESP32:

Otwórz Tools > Board > Board Manager (Ctrl+Alt+B) i zainstaluj pakiet esp32:

esp32

Programowanie

Kod programu to zmodyfikowany projekt ESP32 Serial Bridge: https://github.com/vovcia-clug/ESP32-VGPS

Ściągamy repozytorium i otwieramy ESP32-VGPS.ino w Arduino IDE

Wybieramy model płytki (NodeMCU-32S) w Tools > Board > esp32.

Wybieramy port w Tools > Port, na Linux to będzie /dev/ttyUSB0, na Windows jeden z COM

Wciskając przycisk FLASH/BOOT na płytce, wgrywamy program przez Sketch > Upload (Ctrl+U). Przycisk FLASH/BOOT można zwolnić po tym jak przejdzie Connecting…. Po udanym wgraniu programu GPS powinien pojawić się jako urządzenie Bluetooth VGPS i być od razu gotowy do użycia. Można się z nim sparować i użyć w ulubionym programie, np. RaceChrono, OpenCPN, Serial Bluetooth Terminal itp.

Obudowa

Do zrobienia obudowy użyłem OpenSCAD, program ściągamy z: https://openscad.org/downloads.html.

Model bazuje na Ultimate Box maker z małym dodatkiem (honeycomb przy antenach w celu poprawy odbioru, znaleziony na gist).

Jeżeli chcecie edytować model to ściagnijcie plik OpenSCAD, jeżeli nie to wystarczą gotowe pliki STL. Płytkę do obudowy przymocowałem klejem silikonowym, jeżeli macie otwory montażowe, w OpenSCAD można włączyć generowanie nóżek.

Montaż jest na śrubki M4, jest też opcja montażu snap-in – należy zmienić opcje w OpenSCAD.

Szczegóły konfiguracji modułu GPS

Żeby przełączyć moduł GPS w tryb 10Hz, najpierw należy zmienić prędkość konsoli szeregowej z 9600 na 115200, ponieważ 9600 nie wystarczy do takiego odświeżania. Należy wysłać komendę PMTK:

  • 251,115200

W pełnej formie, z sumą kontrolną, wygląda ona tak:

  • $PMTK251,115200*1F

Suma kontrolna jest taka sama jak w protokole NMEA, czyli XOR wszystkich bajtów między $ a * zapisany w hex.
Generator online: https://nmeachecksum.eqth.net/

Następnie ustawiamy które sentencje NMEA http://aprs.gids.nl/nmea/ chcemy dostawać. Służy do tego komenda PMTK 314. Poszczególne liczby w komendzie PMTK oznaczają, co ile fixów ma być raportowana dana sentencja.

  • 0 NMEA_SEN_GLL, // GPGLL interval – Geographic Position – Latitude longitude
  • 1 NMEA_SEN_RMC, // GPRMC interval – Recommended Minimum Specific GNSS Sentence
  • 2 NMEA_SEN_VTG, // GPVTG interval – Course over Ground and Ground Speed
  • 3 NMEA_SEN_GGA, // GPGGA interval – GPS Fix Data
  • 4 NMEA_SEN_GSA, // GPGSA interval – GNSS DOPS and Active Satellites
  • 5 NMEA_SEN_GSV, // GPGSV interval – GNSS Satellites in View
  • 6 //Reserved
  • 7 //Reserved
  • 13 //Reserved
  • 14 //Reserved
  • 15 //Reserved
  • 16 //Reserved
  • 17 //Reserved
  • 18 NMEA_SEN_MCHN, // PMTKCHN interval – GPS channel status

Przykładowo, ustawiamy raportowanie pierwszych pięciu sentencji przy każdym fixie, a GPGSV co 5 fixów:

  • $PMTK314,1,1,1,1,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0*2C

Na koniec ustawiamy odświeżanie 10Hz:

  • $PMTK220,100*2F

Pełna dokumentacja komend PMTK: https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf

TODO

Jeżeli macie pytania lub uwagi do projektu, zapraszam do kontaktu na discordzie @vovcia, albo mail vovcia (at) clug.space.