Hardware | GPS Sensor Replacement of bGeigie Nano

이 글은 GPS module 인 PA1616S 를 PA1616D 로 업그래이드 과정에 대한 글 입니다. GPS 칩의 비교는 아래 포스트에 있습니다.




1. PA1616D

PA1616 GPS 센서는 제가 가지고 놀고 있는 방사능 검출기 bGeigie Nano 에 사용되고 있습니다. 기존 PA1616S 센서가 장착되어 있었고, 새로운 센서로 이번에 교체하게 되었네요. 기존 센서를 적출하기 전에 비교샷 입니다. 새로 구입한 PA1616D 센서의 높이가 더 높아진 것 외에는 PCB 디자인이나, SMD 소자들 모두 동일합니다.


다시한번 센서의 비교를 올려 봅니다. 기존 GPS 뿐만 아니라 GLONASS 등, GN 위성을 잡을 수 있다고 합니다.
+---------------+-------------------+------------------------------------------+
| Aspect        | PA1616S (MTK3339) | PA1616D (MTK3333)                        |
+---------------+-------------------+------------------------------------------+
| NMEA Sentences| Standard GPS      | GPS + GLONASS (adds GNRMC, GNGGA, GLGSV) |
| Talker ID     | GP (GPS only)     | GN (combined), GL (GLONASS), GP (GPS)    |
| Baud Rate     | 9600 default      | 9600 default                             |
| Command Set   | MTK PMTK          | MTK PMTK (same)                          |
+---------------+-------------------+------------------------------------------+

판매 사이트의 주의 문구에는 분명하게 firmware 바꿔야 할껄~ 이라고 적혀 있는 것을 가볍게 무시하고 장착해 봅니다. 기존 1.4.3 버전 입니다.


아씨... 역시나 입니다. GPS 를 전혀 잡지 못합니다. 망했네.




2. Updated Source

이제 죽으나 사나 소스를 수정해야 합니다. 원본 소스 전체를 받으려면 아래로 가면 됩니다.

* Main Source

메모리 용량이 적은 Arduino Fio 에서 컴파일된 소스코드를 올리려면, 필요 없는 Library 들을 소스에서 삭제한 버전이 필요합니다. 해당 소스는 아래에 있습니다.

* Libraries
  - Adafruit_GFX / Disable unused ASCII code (below 0x20)
  - Adafruit_SSD1306 / changing huge bitmap to const so compiler can actually put it in progmem

위의 Library 들을 사용하지 않고, 저처럼 Arduino IDE 의 Library Manager 를 통해 최신버전을 그냥 인스톨 하면 안됩니다. 이걸로 삽질을 꽤나 했습니다.


이미 가지고 있는, 다이어트 된 Library 들을 사용하지 않으면, 결국 아래와 같은 에러를 발생 시킵니다.

Sketch uses 33942 bytes (110%) of program storage space. Maximum is 30720 bytes.
Global variables use 1331 bytes (64%) of dynamic memory, leaving 717 bytes for local variables. Maximum is 2048 bytes.
Sketch too big; see https://support.arduino.cc/hc/en-us/articles/360013825179 for tips on reducing it.
text section exceeds available space in board

Compilation error: text section exceeds available space in board

참고로, 소스코드 파일 하나씩은 받으려면, 아래에서 받을 수 있습니다.

* Git Source

이번 과정을 통해, 최적화된 완성 소스는 아래 링크에 올려 놨습니다.

* Updated Source of bGeigie Nano (1.4.5.1)



3. TinyGPS

TinyGPS 는 2018년부터 개선된 버전의 TinyGPS++ 가 소개 되었습니다. TinyGPS++ 는 GNRMC / GNGGA / GLONASS 를 지원하지만, 기존 bGeigie Nano 의 소스와는 너무 많은 수정이 필요하게 됩니다.  그리고, Arduino IDE 의 Library Manager 를 통한 TinyGPS 도 용량이 커서 맞지 않습니다. 이미 튜닝된, 꼭 필요한 기능을 넣은 bGeigie Nano 용 TinyGPS 를 사용해야 합니다.

현재 bGeigieNano 코드는 GPS-only NMEA sentences ($GPRMC, $GPGGA) 만을 인식하게끔 되어 있습니다. 이번에 업그래이드 한 PA1616D 센서는 GLONASS 위성도 읽을 수 있으므로, 새로운 ($GNRMC, $GNGGA) 출력값을 인지하게끔 변경하면 되겠습니다.

TinyGPS.cpp 의 27-28 줄을 아래와 같이 추가합니다.

  25, 25: #define _GPRMC_TERM   "GPRMC"
  26, 26: #define _GPGGA_TERM   "GPGGA"
+     27: #define _GNRMC_TERM   "GNRMC"
+     28: #define _GNGGA_TERM   "GNGGA"
  27, 29: 
  28, 30: TinyGPS::TinyGPS

그리고, 250 라인을 다음과 같이 수정하면 됩니다.

  245, 245:   // the first term determines the sentence type
  246, 246:   if (_term_number == 0)
  247, 247:   {
- 248     :     if (!gpsstrcmp(_term, _GPRMC_TERM))
+      248:     if (!gpsstrcmp(_term, _GPRMC_TERM) || !gpsstrcmp(_term, _GNRMC_TERM))
  249, 249:       _sentence_type = _GPS_SENTENCE_GPRMC;
- 250     :     else if (!gpsstrcmp(_term, _GPGGA_TERM))
+      250:     else if (!gpsstrcmp(_term, _GPGGA_TERM) || !gpsstrcmp(_term, _GNGGA_TERM))
  251, 251:       _sentence_type = _GPS_SENTENCE_GPGGA;
  252, 252:     else

GN 위성을 센싱하면, 기존의 GP 용으로 합하여 카운트 한다는 내용 입니다.



4. Version Number

소스 수정을 했으니, 버전을 수정할 필요가 있습니다. 기존 원래 버전과 구분을 해야 하니까요. 확인해 보니, 아래 소스에서 버전을 정의하고 있습니다. 최신버전이 1.4.5 여서,  1.4.5.1 로 수정하였습니다.

bGeigieNanoKit-master/src/NanoConfig.h

- 9   : #define NANO_VERSION       "1.4.5"
+    9: #define NANO_VERSION       "1.4.5.1"



5. SoftwareSerial

SoftwareSerial 은, 안정성 및 개선된 Arduino IDE 용을 사용하는게 좋다고 합니다. 거기에 더하여, RX buffer 를 64 에서 128 로 높혀 주는 것이 좋다고 하네요. 그래서 소스에 있는 SoftwareSerial 파일들을 모두 삭제하고, Arduino IDE 의 아래 파일에서 수정 합니다.

~/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/libraries/SoftwareSerial/src/SoftwareSerial.h

- 43   : #define _SS_MAX_RX_BUFF 44 // RX buffer size
+    43: #define _SS_MAX_RX_BUFF 128 // RX buffer size

최종적으로 아래 파일만 남으면 됩니다.
HardwareCounter.cpp
HardwareCounter.h
InterruptCounter.cpp
InterruptCounter.h
NanoConfig.h
NanoConfig_old_boards.h
NanoDebug.h
NanoSetup.cpp
NanoSetup.h
TinyGPS.cpp
TinyGPS.h
bGeigieNano.ino


6. Compile

Arduino IDE 에서 수정된 파일을 읽어들이고, Arduino AVR Borads 에서 Arduino Fio 를 선택해 줍니다. bGeigie Nano 는 Arduino Fio 를 MCU 로 사용하고 있습니다.


그런 다음, 아래 메뉴처럼 Export Compiled Binary 로 하여, hex 펌웨어 파일로 생성합니다.


저의 경우는 아래 폴더에 생성되었습니다.

~/bGeigieNano/src/bGeigieNano/build/arduino.avr.fio/bGeigieNano.ino.hex

이 파일을 버전으로 구분하기 위해 bGeigieNano-1.4.5.1.hex 파일로 이름변경을 했네요. 그런 다음, 예전에 했던 것 처럼, firmware update 를 실행 했습니다. 예전 기록은 아래 포스팅을 참고합니다.

* Hardware | Safecast bGeigi nano firmware upgrade

Firmware update 의 실제 command 는 아래와 같습니다. 실행이 문제없이 되었습니다.

% ~/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude \
  -C ~/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf \
  -DV -p atmega328p -P /dev/tty.usbserial-A50285BI -c arduino -b 57600 \
  -U flash:w:bGeigieNano-1.4.5.1.hex:i

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "bGeigieNano-1.4.5.1.hex"
avrdude: writing flash (27598 bytes):

Writing | ################################################## | 100% 13.80s

avrdude: 27598 bytes of flash written

avrdude: safemode: Fuses OK (E:00, H:00, L:00)

avrdude done.  Thank you.

원래 전원을 넣으면, 아래와 같은 사진의 버전이 표시 되었습니다. 1.4.3 이었습니다.


Firmware 업데이트 이후, 떨리는 마음으로 전원을 넣어 봅니다. 1.4.5.1 !!!


뭔가 된것 같군요. 바로 밖에 나가서 테스트 해 봅니다. 으아~! GPS 를 10초가 안되어서 잡습니다. 기존에는 30초 이상 걸린 느낌이 있었습니다.


집으로 들어와서, log 를 까 보았습니다. 오오오!!! 잘 동작 하네요!

...
$BNRDD,2981,2026-01-04T12:25:19Z,63,5,856,A,3720.1237,N,12705.7790,E,115.30,A,10,105*49
$BNRDD,2981,2026-01-04T12:25:24Z,67,6,862,A,3720.1238,N,12705.7789,E,115.30,A,9,115*79
$BNRDD,2981,2026-01-04T12:25:29Z,68,4,866,A,3720.1239,N,12705.7788,E,115.30,A,10,105*44
$BNRDD,2981,2026-01-04T12:25:34Z,68,3,869,A,3720.1240,N,12705.7788,E,115.30,A,9,105*76
$BNRDD,2981,2026-01-04T12:25:39Z,61,3,872,A,3720.1241,N,12705.7789,E,115.40,A,10,105*47
$BNRDD,2981,2026-01-04T12:25:44Z,53,2,874,A,3720.1243,N,12705.7788,E,115.20,A,10,105*4E
$BNRDD,2981,2026-01-04T12:25:49Z,50,4,878,A,3720.1244,N,12705.7784,E,114.90,A,10,105*4B
$BNRDD,2981,2026-01-04T12:25:54Z,46,4,882,A,3720.1237,N,12705.7783,E,114.90,A,10,105*46
$BNRDD,2981,2026-01-04T12:25:59Z,47,4,886,A,3720.1236,N,12705.7784,E,115.10,V,10,105*56
$BNRDD,2981,2026-01-04T12:26:04Z,50,7,893,A,3720.1235,N,12705.7785,E,115.10,A,10,115*48
$BNRDD,2981,2026-01-04T12:26:09Z,53,5,898,A,3720.1235,N,12705.7781,E,115.00,A,10,115*4A
$BNRDD,2981,2026-01-04T12:26:15Z,55,8,906,A,3720.1239,N,12705.7774,E,114.80,V,11,100*57
...


채집한 '방사능 + GPS' 로그를 Safecast 사이트에 업로드 해 보았습니다. 제가 firmware 업데이트 한 1.4.5.1 로 정상적으로 업로드까지 문제 없이 완료 되었습니다.

* The Safecast API


포항으로 출장갈 일이 있어, 당연하게 가지고 갔습니다. 뻥뚤린 해안가에서 측정해 봤습니다.


초기 GPS 잡는 속도도 10초 미만이지만, 개수가 10개 대에서 20개 대로 훌쩍 올랐습니다. 최고 22개까지 확인 되었습니다. 의외로 러시아(소련) 위성들 많네요.




7. Addendum

이번 과정을 거치면서 Arduino IDE 소스에서 라이브러리의 쌍따옴표와 꺽쇠의 의미를 알게 되었습니다. 아래의 쌍따옴표의 경우는 ino 파일이 있는 장소와 같은 곳에 있는 local 파일을 사용한다는 의미였습니다.

#include "TinyGPS.h"

그리고, 아래처럼 꺽쇠의 경우는 system 의 library 를 사용한다는 의미였네요.

#include <SoftwareSerial.h>

배움에는 끝이 없습니다.


FIN

댓글