หลายสิบปีที่ตลาด DIY หรือตลาดระดับล่างจะเห็น UBlox Zed F9P ของสวิสเซอร์แลนด์โลดแล่นบนยุทธจักรนี้มานานหลายสิบปี จนในที่สุดก็มีคู่แข่งกันกลายๆคือ Unicorecomm จากจีนแผ่นดินใหญ่ โดยเฉพาะชิป UM980 ที่พร้อมจะท้าชนทุกสถาบัน ที่มี channel ทั้งหมด 1408 ช่อง พูดง่ายๆแบบชาวบ้านคือสามารถรับสัญญานดาวเทียมบนท้องฟ้าได้สูงสุด 1408 ดวง แต่ในปัจจุบันนี้ดาวเทียมนำหนบนท้องฟ้าประมาณแค่ 200 เครื่อง ดังนั้นถือว่าเผื่อมาแบบก่อนกาลกันเลยทีเดียว
ที่จริงยังมีตลาดบนๆคือชิป Septentrio ของเบลเยียม ฝั่งยุโรป มีคุณภาพและราคาที่สูงกว่าหลายช่วงตัว ปัจจุบันบริษัทผู้ผลิตดั้งเดิมถูกซื้อโดยยักษ์ใหญ่ Hexagon และผมจะไม่ขอกล่าวในที่นี้




และแล้วโครงการที่ผมรอมานานมาก จะทำแต่ไม่ได้ทำสักทีเนื่องจากหาเวลาว่างที่ต่อเนื่องไม่ค่อยมี ผมตั้งเป้าว่าจะทำ RTK Base Station ที่พร้อมจะอึดๆหน่อย และที่สำคัญจะทำยังไงให้ตัวสถานีฐานความละเอียดความถูกต้องอยู่ในระดับSurvey-grade พูดแบบชาวบ้านคือสามารถใช้เป็นสถานีฐานสำหรับโรเวอร์ ที่สามารถนำไปเซอร์เวย์เช่นให้ตำแหน่งในงานก่อสร้างได้ ทั้งระดับและค่าพิกัด หรือเป็นสถานีฐานสำหรับงานบินโดรนที่ถ่ายภาพหรือสแกนไลดาร์ สำหรับทำแผนที่ความละเอียดสูง
การใช้งานอื่นๆเช่นนำมาใช้ในงานการเกษตร เหล่านี้ไม่ต้องค่าระดับและพิกัดที่ถูกต้องมากนัก สังเกตว่าโครงการส่วนใหญ่ที่ฝากโค้ดไว้ใน Github ล้วนแล้วที่ไม่ใช้ในงานเซอร์เวย์ เพราะไม่มีการใช้ค่าพิกัดและระดับสำหรับสถานีฐานเป็นเรื่องเป็นราว ดูได้จากเว็บของแอพไม่สามารถตั้งค่าพิกัดและระดับให้กับสถานีฐานได้ บางเจ้าเน้นส่งสัญญาน NTRIP เข้า Caster พวก Onocoy เพื่อแปรเป็นเงินคริปโตไปนั่นเลยครับ
และที่สำคัญสำหรับ RTK Base Station สมัยนี้ ต้องสามารถส่งข้อมูลผ่านอินเทอร์เน็ตไปยัง NTRIP Caster ได้ ที่มีทั้งฟรี เสียเงิน เสียเงินยังแบ่งเป็นเสียมากหน่อยแบบว่าจ่ายแล้วจบสำหรับคนที่มีเงินหนา ส่วนอีกแบบคือเสียน้อยแต่ต้องลงทุนออกแรงเอง DIY อ่านได้ที่บทความก่อนของผมตามด้านล่างนี้
ระบบ RTK Base Station แบบส่งสัญญานวิทยุ UHF (Radio modem) ต้องบอกว่ามาถึงยุคที่สัญญาณโทรศัพท์และอินเทอร์เน็ตเข้าถึงทุกที่ ตอนนี้ได้ล้าสมัยไปเรียบร้อย เนื่องจากความยุ่งยาก ต้องลงทุนซื้อตัววิทยุโมเด็มที่ประกบกับเครื่อง GNSS สำหรับสถานีฐาน ในทะเลอาจจะไปถึง 20 กม. เพราะไม่มีอะไรมาบังสัญญาณ แต่บนบกไปได้สัก 5 กม. ถือว่าเยี่ยมแล้ว
ส่วนประกอบของฮาร์ดแวร์ของ DIY RTK Base Station (NTRIP Server)
- บอร์ด Unicorecomm UM980 ต่อกับสายอากาศไปยังจานรับสัญญาณ (Antenna) ราคาประมาณ 3000 – 8000 บาท
- บอร์ด ESP32 เป็นศูนย์กลาง รับข้อมูล GNSS จากบอร์ด UM980 โดยที่ตัวของมันเอง เราเรียกว่า NTRIP Server เมื่อรับข้อมูลจาก UM980 แล้ว จะส่งข้อมูลผ่านอินเทอร์เน็ตต่อให้กับ NTRIP Caster อีกที ราคาประมาณ 150 -300 บาท ควรจะเลือกรุ่นที่มีเสาอากาศ Wifi เพราะจะได้ส่งได้ไกลกว่า
- จานรับสัญญาณ (GNSS Antenna) และสายสัญญาณ เน้นว่าต้องสามารถรับสัญญาณได้อย่างน้อยที่ความถี่ L1 และ L2 หรือถ้าให้ดีกว่าจะเลือกเป็นสามความถี่คือ L1, L2 และ L5 ราคา 1500 – 10000 บาท
- กล่องใส่อุปกรณ์ ผมเลือกวัสดุเป็นอลูมิเนียมเนื่องความเบาและสามารถระบายความร้อนได้ดี ขนาดประมาณ 10 x 15 x 4 ซม. ราคาประมาณ 200 – 300 บาท
- พัดลมขนาดเล็ก 3 x 3 ซม. มีหน้ากากกันด้านนอกขนาด 4 x 4 ซม. ราคารวม 30 – 50 บาท
- สายสัญญาณไวไฟในกล่อง แถมมากับบอร์ด ESP32
- สายสัญญาณ GNSS สำหรับใช้ภายในกล่อง (ใช้สายไวไฟ) ราคาประมาณ 50 บาท
- ตัวแปลงไฟฟ้า DC 12V เป็น USB 5V เพื่อจ่ายเลี้ยงบอร์ด UM980 และ ESP32 ราคา 80 บาท




🧭 UM980 ปะทะ ZED-F9P: การตัดสินใจเลือก Base Station
UM980 นับว่าเป็นชิปที่อยู่ในเครื่อง GNSS ของจีนทั้งยี่ห้อชั้นนำ Top 10 ตลาดกลางและตลาดล่างล้วนแต่ใช้ชิปตัวนี้ ราคาของ GNSS จะต่างกันที่วัสดุที่ใช้ทำรวมถึงซอฟท์แวร์ที่มากับคอนโทรลเลอร์ และบริการหลังการขาย ทำให้เครื่องรับ GNSs ของจีนที่ขายในประเทศไทยมีราคาที่ต่างกัน
มาลองดูผลการเปรียบเทียบ
| หัวข้อการเปรียบเทียบ | Unicore UM980 (Triple-Frequency) | u-blox ZED-F9P (Dual-Frequency) |
|---|---|---|
| ความถี่สัญญาณ | สามความถี่ (L1, L2, L5/E5b) | สองความถี่ (L1, L2) |
| จำนวนช่องสัญญาณ | 1408 ช่องสัญญาณ | น้อยกว่า (แต่ประสิทธิภาพสูง) |
| ประสิทธิภาพ RTK | ดีมาก, แต่อาจใช้เวลาในการหาตำแหน่งเริ่มต้น (Fix) นานกว่า F9P เล็กน้อย | ยอดเยี่ยม, มีชื่อเสียงเรื่องการหาตำแหน่ง RTK Fix ได้รวดเร็วมาก |
| การรองรับสัญญาณ | รองรับสัญญาณกว้างขวางกว่า รวมถึง GPS L1C/A/L2C/L5, Galileo E1/E5b/E6, BeiDou B1I/B2I/B3I/B2b, GLONASS L1/L2, QZSS, SBAS | รองรับสัญญาณหลักๆ ได้ดี (GPS L1/L2, Galileo E1/E5b) แต่ครอบคลุมน้อยกว่า UM980 |
| ราคา | ถูกกว่าและคุ้มค่าเมื่อเทียบกับคุณสมบัติที่ได้รับ | คุ้มค่าและเป็นที่นิยม (โดยทั่วไปมักแพงกว่า UM980 เล็กน้อย) |
| ความง่ายในการใช้งาน/พัฒนา | ซับซ้อนกว่าเล็กน้อย, อาจต้องมีความรู้ด้าน RF เพิ่มเติม | ใช้งานง่าย, มีเอกสารเยอะ, รองรับในแพลตฟอร์มต่างๆ มากมาย (เช่น Ardupilot, Raspberry Pi) |


สรุปเบื้องต้น UM980 โดดเด่นเรื่อง ความสามารถในการรับสัญญาณที่เหนือกว่า ด้วยการใช้สามความถี่ ทำให้ทำงานได้ดีในสภาพแวดล้อมที่ท้าทาย (เช่น ในเมืองหรือใต้ต้นไม้) และให้ความคุ้มค่าด้านราคาต่อคุณสมบัติสูง u-blox ZED-F9P เป็นมาตรฐานอุตสาหกรรมที่ได้รับการพิสูจน์แล้ว มีจุดแข็งคือ ความน่าเชื่อถือและการหาตำแหน่ง RTK ที่รวดเร็ว ใช้งานง่าย มีชุมชนผู้ใช้และการสนับสนุนที่กว้างขวาง
🛠️ การตั้งค่าเริ่มต้น UM980 ผ่าน UPrecise
ในการใช้งานครั้งแรก ผู้ใช้จำเป็นต้องใช้โปรแกรม UPrecise ของ Unicore เพื่อกำหนดค่าพื้นฐานและบันทึกค่าลงในหน่วยความจำถาวรของโมดูล การใช้ UPrecise เพื่อติดต่อกับ UM980 นั้นมีความจำเป็นโดยเฉพาะคนที่ซื้อบอร์ด UM980 มาใหม่ จะต้องมาตั้งค่ากันก่อน การต่อบอร์ด UM980 อาจจะทำให้ผู้ใช้ที่ไม่เคยใช้ UM980 จะงงงันเพราะต่อด้วย USB port จะพบไม่มีข้อมูลดาวเทียมขึ้นบนหน้าจออย่างที่มันควรจะเป็น จะต้องมีการตั้งค่าก่อนเสมอ




การเชื่อมต่อและปรับ Baud Rate เริ่มต้น
- คำแนะนำ: ผู้ใช้ต้องเชื่อมต่อ UM980 เข้ากับคอมพิวเตอร์ผ่าน โดยใช้พอร์ต USB ของบอร์ด และเปิดโปรแกรม UPrecise
- การตั้งค่าเริ่มต้น: กำหนดค่า COM Port ที่เชื่อมต่อกับ UM980 และตั้งค่า Baud Rate เป็นค่าเริ่มต้นจากโรงงาน (โดยทั่วไปคือ 115200) แล้วกด Connect
- การตั้งค่า COM2 สำหรับ ESP32: เนื่องจากเราจะใช้ COM2 พอร์ต COM2 นี้ไม่ใช่ของคอมพิวเตอร์นะครับเป็นพอร์ต UART สำหรับเชื่อมต่อกับ ESP32 ในอัตราความเร็วสูง ผู้ใช้ควรตั้งค่านี้ผ่าน UPrecise ก่อน ที่ UPrecise ไปช่องป้อนคำสั่ง:
- คำสั่ง:
SETCOM COM2 BAUD 460800 - คำอธิบาย: การตั้งค่านี้จะทำให้ UM980 ส่งข้อมูล RTCM ออกทางขา UART ที่ต่อกับ ESP32 ที่ความเร็ว 460800 bps โดยอัตโนมัติเมื่อเปิดใช้งาน
- คำสั่ง:
ชุดคำสั่งกำหนดโหมดเป็นสถานีฐาน
serial port ของ UM980 ตั้งชื่อ COM1, COM2 และ COM3 (อย่าไปสับสนกับ serial port ของคอมพิวเตอร์) ไดอะแกรมของ serial port ของ UM980 ดังนี้
UM980 has 3 ports:
├─ COM1 (TTL UART1: RX1/TX1)
├─ COM2 (TTL UART2: RX2/TX2)
└─ COM3 (RS232)
เมื่อเปิดโปรแกรมแล้ว ให้คัดลอกคำสั่งไปใส่ใน Command Entry แล้วกด Enter โดยที่ผมต่อ ESP32 TX (GPIO 17) → UM980 RX1 และ ESP32 RX (GPIO 16) → UM980 TX1
mode base 12.708027694109 101.009721414363 3.320
GPGSV COM1 1
GLGSV COM1 1
GAGSV COM1 1
GBGSV COM1 1
GPGGA COM1 1
RTCM 1005 COM1 10
RTCM 1077 COM1 1
RTCM 1087 COM1 1
RTCM 1097 COM1 1
RTCM 1127 COM1 1
SAVECONFIG
คำอธิบาย: สังเกตว่า RTCM ที่ตั้งไว้ได้แก่ 1077, 1087, 1097, 1127 คือ MSM7 และคำสั่งปิดท้ายคือ saveconfig สำคัญที่สุด หากไม่ได้ทำ การตั้งค่าต่างๆจะหายไปเมื่อถอดปลั๊ก
💻 การเปลี่ยน ESP32 ให้เป็น NTRIP Server
นี่อาจจะเป็นส่วนที่ยากที่สุดแต่ก็ท้าทายที่สุด เพราะการทำส่วนติดต่อผู้ใช้ (UI) จะมาทำที่นี่ ข้อดีคือสามารถหาเอกสารอ่านได้ง่าย มีโครงการ repository ที่ฝากตาม github ไว้เยอะพอสมควร
- การเชื่อมต่อ (Hardware Interfacing):
- อุปกรณ์: ESP32 Dev Board ผมเลือกใช้ ESP32-WROOM-32U แบบมีสายอากาศไวไฟ จำนวนขา 38 ขา
- การเชื่อมต่อ UART: แผนภาพการต่อสาย TX/RX จาก UM980 ซึ่งส่งข้อมูล RTCM ไปยังขา RX/TX ของ ESP32 อย่างถูกต้อง ใช้แรงดันไฟฟ้า 3.3V
- แสดงการต่อจำนวน 5 สาย ESP32-WROOM-32 และ UM980 Board
- ต่อไปสวิตช์กดดับปล่อยติด (Reset) เพื่อให้สามารถมีปุ่มรีเซ็ตได้ในกรณีที่เครื่องค้าง
- โค้ดและตรรกกะสำหรับ ESP32 ใช้เครื่องมือจากผู้ผลิต ESP-IDF:
- โครงสร้างหลักของโค้ด ESP-IDF: มีฟังก์ชันหลัก 4 ส่วน
- WiFi Connection: การเชื่อมต่อ ESP32 เข้ากับเครือข่ายไวไฟ
- UART Listener: รับข้อมูล RTCM ไบนารีจากบอร์ด UM980 อย่างต่อเนื่องที่ Baud Rate สูง เช่น 460800
- NTRIP Server: เชื่อมต่อ TCP/IP ผ่านอินเทอร์เน็ตไปยัง NTRIP Caster และส่งผ่านข้อมูล RTCM ที่ได้รับจาก UART ไปยัง Caster ทันทีที่รับมา
- กำหนดค่าผ่าน Web Interface: เพื่อให้ผู้ใช้สามารถกำหนดค่า IP Caster, Port, Mountpoint, และ Password และแสดงข้อมูล GNSS ในขณะนั้นให้ผู้ใช้ทราบว่า
- โครงสร้างหลักของโค้ด ESP-IDF: มีฟังก์ชันหลัก 4 ส่วน

ESP32-WROOM-32 UM980 Board
┌─────────────────────┐ ┌──────────────────────┐
│ │ │ │
│ GPIO 17 (TX0) ─────┼────────>│ RX1 (COM1/UART1) │
│ │ │ │
│ GPIO 16 (RX0) <────┼─────────│ TX1 (COM1/UART1) │
│ │ │ │
│ GPIO 33 (TX1) ─────┼────────>│ RX2 (COM2/UART2) │
│ │ │ │
│ GPIO 32 (RX1) <────┼─────────│ TX2 (COM2/UART2) │
│ │ │ │
│ GND ┼─────────│ GND │
└─────────────────────┘ └──────────────────────┘
│
│ SMA Connector
▼
┌─────────────────┐
│ GNSS Antenna │
│ (L1+L2+L5) │
└─────────────────┘
🌐 Web Interface สำหรับการตั้งค่าและควบคุม
ส่วนที่น่าสนใจที่สุดของโครงการนี้คือการพัฒนา Web Interface ที่ทำงานบน ESP32 โดยตรง ผู้ใช้สามารถเข้าถึงผ่านเบราว์เซอร์ จากบนมือถือหรือคอมพิวเตอร์ได้ทันทีโดยไม่ต้องติดตั้งโปรแกรมเพิ่มเติม ผมออกแบบหน้าเว็บให้มีลักษณะเป็น Sidebar Navigation เพื่อให้เข้าถึงเมนูแบบง่ายๆ
ฟีเจอร์หลักของ Web Interface:
- WiFi – แสดงสถานะของ Wifi AP ตัวของ ESP32 สามารถเข้าถึงได้ด้วย AP อย่างง่ายๆ ในขณะเดียวกันสามารถสั่งให้ ESP32 เชื่อมต่อกับไวไฟที่เป็น Hotspot อื่นๆ เพื่อใช้อินเทอร์เน็ต ในการส่งข้อมูล ลักษณะ ทูอินวัน แบบนี้ทำให้ตามตัวง่ายหาง่าย การออกแบบนี้เป็นลักษณะของ แบบฉบับ iOT
- Satellite Tracking Display – แสดงจำนวนดาวเทียมแต่ละกลุ่มที่รับสัญญาณได้ (GPS, GLONASS, Galileo, BeiDou) ในรุ่นต่อไปจะสามารถแสดงกราฟและ SkyPlot ได้
- Base Station Configuration – หน้าเว็บสำหรับตั้งค่าพิกัดของสถานีฐาน (Latitude, Longitude, Ellipsoid Height) ผมออกแบบให้รองรับการป้อนค่าพิกัดแบบทศนิยม 12 ตำแหน่ง เพื่อความแม่นยำระดับมิลลิเมตร ซึ่งเป็นสิ่งที่สำคัญสำหรับงาน Survey-grade
- NTRIP Server Settings – หน้าเว็บตั้งค่าการเชื่อมต่อกับ NTRIP Caster ซึ่งสามารถส่งได้สอง Caster (Duo) ประกอบด้วย:
- IP Address หรือ Domain name ของ Caster
- Port (ปกติคือ 2101)
- Mountpoint ชื่อสถานีฐาน
- Username และ Password สำหรับการยืนยันตัวตน
- UART Configuration – ตั้งค่าสำหรับ UART ได้แค่หมายเลขขา (Pin) การตั้งค่าของ UART จะถูกเตือนว่าเป็นเรื่องแอดวานซ์ ถ้าไม่แน่ใจอย่าแก้ไข
- System Information – แสดงข้อมูลระบบ เช่น Firmware version, Uptime, Free Memory, และ IP Address ของ ESP32
ทุกการตั้งค่าจะถูกบันทึกลงใน NVS (Non-Volatile Storage) ของ ESP32 ทำให้ค่าคงอยู่แม้จะถอดปลั๊กไฟ และเมื่อเปิดเครื่องใหม่ ระบบจะโหลดค่าเดิมกลับมาใช้งานอัตโนมัติ
⚙️ การติดตั้งและทดสอบระบบ
เมื่อประกอบฮาร์ดแวร์เสร็จเรียบร้อย และอัพโหลดโค้ดลง ESP32 แล้ว ขั้นตอนการใช้งานมีดังนี้:
1. การเชื่อมต่อครั้งแรก (First-time Setup)
- เมื่อ ESP32 บูตครั้งแรก หากยังไม่มีการตั้งค่า WiFi มันจะเปิดโหมด Access Point (AP Mode) ขึ้นมา
- เชื่อมต่อมือถือหรือคอมพิวเตอร์เข้ากับ WiFi นี้ จากนั้นเปิดเบราว์เซอร์ไปที่ http://192.168.4.1
- ตั้งค่า WiFi ที่ต้องการให้เชื่อมต่อ และบันทึกการตั้งค่า ESP32 จะรีบูตและเชื่อมต่อกับ WiFi ที่กำหนด
- ตรวจสอบ IP Address ที่ ESP32 ได้ที่หน้า Wifi Station
2. การตั้งค่าพิกัดสถานีฐาน (Base Location Configuration)
นี่เป็นขั้นตอนที่สำคัญที่สุดสำหรับการทำ RTK Base Station ระดับ Survey-grade เพราะความถูกต้องของพิกัดสถานีฐานจะส่งผลโดยตรงต่อความแม่นยำของ Rover ที่ใช้งาน
วิธีการหาพิกัดที่ถูกต้อง:
- วิธีที่ 1: ใช้ Post-Processing – นำข้อมูล GNSS ดิบ (Raw data) จากสถานีฐานไปประมวลผลแบบ Static ใช้ GNSS RTSD ของออนไลน์ของกรมแผนที่ทหาร ระยะเวลา 1-24 ชั่วโมง จะได้พิกัดที่แม่นยำในระดับเซนติเมตร
- วิธีที่ 2: ใช้ Total Station วัดจากหมุดควบคุม – ถ้ามีหมุดควบคุมที่ใกล้เคียง สามารถใช้ Total Station วัดมาได้ (วิธีนี้แม่นยำและเชื่อถือได้มาก)
- วิธีที่ 3: ใช้ NTRIP Rover Mode – ใช้ UM980 เชื่อมต่อกับ NTRIP Caster อื่น (เช่น RTK2go หรือ GNSS RTSD ของกรมแผนที่ทหาร) เพื่อทำ RTK Fix แล้วบันทึกพิกัด Average 15-30 นาที (วิธีนี้สะดวกแต่ความแม่นยำขึ้นอยู่กับระยะห่างจากสถานีฐานอ้างอิง)
- วิธีการที่ 4: ถ้าเป็นงานก่อสร้างที่มีหมุดควบคุมจากเจ้าของงานอยู่แล้ว จะทำการรังวัดแบบโครงข่ายเพื่อขยายหมุดควบคุม และหนึ่งในหมุดนั้นก็คือหมุดสำหรับติดตั้งเป็น RTK Base Station
ในโครงการนี้ ผมใช้วิธีที่ 4 จากนั้นนำค่าพิกัดที่ปรับแก้แล้ว (Adjustment Network) มาใช้เป็นพิกัดสถานีฐาน
สิ่งที่ต้องระวัง:ผมพบว่าการใช้ ค่าระดับ WGS84 Ellipsoid Height เป็นค่าระดับสำหรับสถานีฐาน จะทำงานได้ดีกว่าการแปลงเป็น MSL (Mean Sea Level) ในประเทศไทย เนื่องจากปัญหาความไม่แน่นอนของ Geoid Model ดังนั้นผมจึงเลือกใช้ ECEF (Earth-Centered, Earth-Fixed) Coordinate System ในการคำนวณ ซึ่งให้ผลลัพธ์ที่สม่ำเสมอและแม่นยำกว่า
3. การตั้งค่า NTRIP Caster และทดสอบการส่งข้อมูล
- ป้อนข้อมูล NTRIP Caster ในหน้า Web Interface (ผมใช้ DigitalOcean VPS ที่ติดตั้ง NTRIP Caster ไว้แล้ว ตามบทความก่อนหน้า)
- กด “Save Configuration and Restart” จากนั้น ESP32 จะทำการรีสตาร์ท จากนั้นเข้าหน้าเว็บอีกครั้งสามารถตรวจสอบสถานะการเชื่อมต่อ หน้าเว็บจะแสดงว่าเชื่อมต่อสำเร็จหรือไม่ สามารถดูได้จากจำนวนไบต์ที่ส่งไปแล้ว
- ทดสอบการรับข้อมูลจาก Caster โดยใช้โปรแกรม SNIP Caster หรือ STRSVR (จาก RTKLib) เชื่อมต่อเข้ามาที่ Mountpoint ดูว่าได้รับข้อมูล RTCM หรือไม่ หรือถ้ามี RTK โรเวอร์ก็ลองต่อดูได้ว่ารับสัญญาน RTCM จาก NTRIP Caster แล้วค่า “Fix” หรือไม่
เมื่อทุกอย่างทำงานถูกต้อง อัตราการส่งข้อมูลประมาณ 2-4 KB/s ขึ้นอยู่กับจำนวนดาวเทียมและ RTCM Message ที่เปิดใช้งาน









📊 ผลการทดสอบความแม่นยำ (Accuracy Testing)
ผลลัพธ์นี้ถือว่ายอดเยี่ยมสำหรับระบบ DIY ที่ลงทุนไม่ถึง 10,000 บาท โดยเฉพาะค่า Vertical Accuracy ที่อยู่ในระดับ ±2.0 cm เหมาะสำหรับงานก่อสร้างทั่วไปและงานสำรวจภูมิประเทศระดับกลาง ถ้ามีโอกาสผมจะนำผลการทดสอบที่มากกว่านี้ในทางสถิติมานำเสนอกันดู
💡 สรุปและแนวทางในอนาคต
โครงการ DIY RTK Base Station ด้วย ESP32 และ UM980 นี้ พิสูจน์ให้เห็นแล้วว่า เราสามารถสร้างสถานีฐาน GNSS ระดับ Survey-grade ได้ด้วยงบประมาณที่ต่ำมาก เมื่อเทียบกับสินค้าสำเร็จรูปที่มีราคาหลายหมื่นบาทจนถึงหลายแสนบาท
✅ ข้อดีของระบบ
- ต้นทุนต่ำ: ลงทุนรวมประมาณ 10,000 บาท (ขึ้นอยู่กับจานรับสัญญาณที่เลือก) เทียบกับสินค้าสำเร็จรูปที่ราคา 50,000-800,000 บาท
- ความแม่นยำสูง: ให้ผลลัพธ์ระดับเซนติเมตร เทียบเท่ากับอุปกรณ์มืออาชีพ
- ปรับแต่งได้: สามารถเขียนโค้ดเพิ่มฟีเจอร์ตามต้องการได้เอง เช่น Data Logging, Remote Monitoring, หรือการส่งข้อมูลไปยัง Cloud
- Open Source: ใช้เครื่องมือและไลบรารีที่เป็น Open Source ทั้งหมด ไม่ต้องเสียค่าลิขสิทธิ์
- ขนาดเล็กกะทัดรัด: บรรจุในกล่องขนาดเล็ก พกพาสะดวก ติดตั้งง่าย
⚠️ ข้อจำกัด
- ต้องมีความรู้ทางเทคนิค: ต้องเข้าใจเรื่อง GNSS, UART, ESP-IDF, และ Web Development ในระดับหนึ่ง ในสมัยนี้มี AI ที่มาช่วยได้ เขียนโค้ดช่วยได้ แต่คนใช้ก็ต้องเก่งและเข้าใจในการใช้งานเขา ถึงจะได้ผลงานที่ดี
- ใช้เวลาในการติดตั้งและปรับแต่ง: ไม่ได้เป็น Plug-and-Play แบบสินค้าสำเร็จรูป
- ไม่มีการรับประกัน: ถ้าอุปกรณ์เสีย ต้องซ่อมแซมหรือเปลี่ยนเอง ถ้าสนุกกับงานพวก DIY นี่เป็นทางเลือกที่ถูกต้องและถูกใจ
- ความทนทานต่ำกว่า: อุปกรณ์ภายในกล่องไม่ได้มาตรฐาน IP67 เหมือนอุปกรณ์มืออาชีพ อาจไม่เหมาะสำหรับสภาพแวดล้อมที่อากาศรุนแรง
- ข้อจำกัดของ ESP32 WRoom 32U ที่ใช้งานอยู่ถึงแม้ไมโครคอนโทรลเลอร์ตัวนี้จะแรงเอาเรื่องในรุ่นราวคราวเดียวก้น แต่เมื่อทำงานงานหลายๆงาน ผมพบว่ามันหนักไม่ไหวและอีกอย่างคือแรม 512 KB มันน้อย ผมใช้หมดเหลือประมาณ 35% ตามสเป็คแล้วควรให้เหลือประมาณ 30% ก็ปริ่มๆ วิธีการแก้ข้อจำกัดของผมคือจะขยับไปใช้รุ่นที่แรงกว่าคือ ESP32 S3 N16R8 ที่ซีพียูดูอัลคอร์ที่แรงกว่า มีแรมมากกว่า
🚀 แผนพัฒนาต่อไป
ผมมีแผนจะพัฒนาระบบนี้ต่อไปในหลายด้าน:
- Data Logging: บันทึกข้อมูล Raw GNSS ลงใน SD Card หรือสื่อประเภทแฟลชเมโมรี เพื่อนำไป Post-Processing ภายหลัง
- Remote Monitoring: ส่งสถานะการทำงานไปแสดงผลบน Dashboard แบบ Real-time ผ่าน MQTT หรือ WebSocket
- Multi-Band Antenna: ทดลองใช้จานรับสัญญาณแบบ Survey-grade ที่รองรับความถี่ L1+L2+L5 อย่างเต็มรูปแบบ เนื่องจากของดีมีราคาระดับหลักหมื่นด้วยงบที่จำกัดจึงจำต้องใช้ของที่มีราคาถูกระดับหลักพันต้นๆไปก่อน
- Solar Power: ใช้ระบบจ่ายไฟด้วย Solar Panel + Battery เพื่อใช้งานในพื้นที่ห่างไกล เรื่องนี้เป็นเรื่องง่ายๆมีชุดนอนนาที่ราคา 2500-3500 บาท ที่ขายอยู่มากมาย
- OTA Update: เพิ่มฟีเจอร์ Over-The-Air firmware update เพื่ออัพเดต ESP32 ผ่านเน็ตได้โดยไม่ต้องถอดออกมา (ถ้าเปลี่ยนไปใช้ ESP32 N16R8)
- ให้ระบบพัดลมที่อยู่ข้างในสามารถเปิดปิดเองอัตโนมัติขึ้นอยู่กับอุณภูมิภายในกล่อง
- เปลี่ยนไมโครคอนโทรลเลอร์เป็น ESP21-N16R8 หรืออาจจะขยับไปยัง Orange PI Zero 3W


📦 ผู้สนับสนุนโครงการ
ขอขอบคุณคุณบัณฑิต คุ้มห้างสูงสำหรับการเป็นสปอนเซอร์ในการสร้าง DIY รุ่นที่หนึ่งในครั้งนี้ และเท่าที่คุยกันจะมีรุ่นที่สองที่จะปรับปรุงและพัฒนาดังที่กล่าวมาแล้วข้างต้น เนื่องจากโค้ดที่ปรับปรุงใหม่จากของเก่าที่มีบั๊กพอสมควร อีกทั้งมีบั๊กใหม่ๆ ผมไม่พร้อมที่จะเปิดโค้ดเป็นสาธารณะในเวลาอันใกล้นี้
🎯 สรุป
การสร้าง DIY RTK Base Station ด้วย ESP32 และ UM980 เป็นโครงการที่ท้าทายแต่คุ้มค่าอย่างยิ่ง ไม่เพียงแต่ประหยัดต้นทุนได้มหาศาล แต่ยังได้เรียนรู้เทคโนโลลยี GNSS, RTK, Embedded System, และ Web Development ในเชิงลึก
ในการทำสถานีฐาน RTK ที่มีงบประมาณจำกัด และผมได้เรียนรู้เทคโนโลยีเหล่านี้ด้วยตัวเอง แม้จะมีอุปสรรคบ้างในระหว่างทาง แต่เมื่อได้เห็นระบบทำงานจริงและให้ผลลัพธ์ที่แม่นยำระดับเซนติเมตร ทำให้มีกำลังใจที่จะพัฒนาต่อไปครับ โปรดติตตามตอนต่อไปครับ








📚 อ้างอิง
- Unicorecomm UM980 Datasheet: https://en.unicorecomm.com/products/detail/24
- ESP-IDF Programming Guide: https://docs.espressif.com/projects/esp-idf/
- RTCM Standard 10403.3: https://rtcm.myshopify.com/
- RTKLib – Open Source GNSS Software: http://www.rtklib.com/
อัพเดทล่าสุด: ธันวาคม 2025
ได้รับความรู้ทางด้านนี้จาก Blog มากครับ
ขอบคุณครับ
Can you share me esp32 Firmware in this guide. It work Ok? With UM980-982-960???? Can you update position of base from webUI.??? I will sent you back Ntrip Caster of South.
Hi,
Thank you for your interest!
YES – FIRMWARE AVAILABLE:
————————-
I can share the ESP32 firmware with you. It is tested and working.
HARDWARE COMPATIBILITY:
———————–
✅ UM980 – Fully tested and working
✅ UM982 – Should work (same Unicore protocol)
✅ UM960 – Should work (same Unicore protocol)
The firmware automatically detects and configures Unicore receivers.
WEB UI FEATURES:
—————-
✅ Update base position from web interface
✅ Configure NTRIP caster settings
✅ Monitor system status
PACKAGE INCLUDES:
—————–
– Firmware binary (ready to flash)
– Flash instructions (easy web-based)
– No programming needed
NTRIP CASTER:
————-
Thank you for offering to share your NTRIP caster for South!
That would be very helpful for the community.
Here’s the firmware link.
REQUIREMENTS:
————-
– ESP32 WROOM-32U (4MB flash minimum)
– Chrome or Edge browser for flashing
– USB cable
Best regards,
Prajuab
Good evening, Khun Priabroy,
That is great news! I’m glad to hear it worked out for you.
Regarding the ESP32 firmware: I attempted to upload it to both an ESP32-WROOM-32U (as you suggested) and an ESP32 DevKit. While the flashing process was successful via the Tasmota web installer, the Wi-Fi access point does not appear, even after waiting several minutes.
Could you please clarify the installation method or try re-uploading the firmware file?
Thank you for your help.
Kapun maak krub
Sawatdee krub Khun Hamza,
Thank you for your message!
GOOD NEWS – FIRMWARE IS TESTED:
——————————–
I personally tested this firmware with Tasmota web installer
(https://tasmota.github.io/install/) and it works correctly.
So we just need to find what’s different with your setup.
PLEASE TRY THESE STEPS CAREFULLY:
———————————-
STEP 1 – CHECK YOUR ESP32 CHIP:
Look at the metal chip on your board.
It should say one of these:
✅ ESP32-WROOM-32U
✅ ESP32-WROOM-32D
✅ ESP32-WROOM-32E
If it says ESP32-S2, ESP32-S3, or ESP32-C3:
❌ This firmware will NOT work (different chip)
STEP 2 – COMPLETE ERASE (VERY IMPORTANT!):
1. Go to: https://tasmota.github.io/install/
2. Connect ESP32 via USB cable
3. Click “Connect” button
4. Select your ESP32 port (COM3, COM4, etc.)
5. Click “ERASE” or “Erase Device” button
6. Wait until you see “Erase complete”
7. UNPLUG the USB cable completely
STEP 3 – FLASH THE FIRMWARE:
1. Plug USB cable back in
2. Go to: https://tasmota.github.io/install/
3. Click “Connect” → Select port again
4. Click “Install” or “Choose File”
5. Select: esp32-ntrip-rtk-v1-webflash.bin
6. Flash at offset: 0x0
7. Wait for “Installation complete”
STEP 4 – FIRST BOOT (BE PATIENT!):
1. Unplug USB cable
2. Wait 10 seconds
3. Plug USB cable back in
4. Wait 2 FULL MINUTES (first boot is very slow!)
5. Look for WiFi on your phone/computer
WHAT YOU SHOULD SEE:
——————–
WiFi Network Name: ESP_NTRIP_RBS_XXXXXX
Where XXXXXX = 6 random characters (your board’s ID)
Password: No password (open network)
STILL NOT WORKING?
——————
Please send me this information:
1. What is written on your ESP32 chip?
(Take a close photo if possible)
2. What happens during flash?
– Does it say “Success” or “Complete”?
– Any error messages?
3. After plugging in, do you see ANY LED lights?
– Blinking?
– Solid on?
– Nothing?
4. What board/kit did you buy?
(Send me the product link or photo)
With this information, I can help you find the exact problem
and send you the correct firmware for your board if needed.
REQUIREMENTS REMINDER:
———————-
✓ ESP32 WROOM-32U, 32D, or 32E (4MB flash)
✓ Chrome or Edge browser (NOT Firefox)
✓ Good USB cable (data cable, not charging-only)
✓ Patience on first boot (can take 1-2 minutes)
Kobkun mak krub,
Prajuab
P.S. – If you can read serial output, connect at 115200 baud
and send me what you see. But if you can’t, that’s okay,
just send me the information above.
Good Morning Khun Prajuab
✅ Thank you very much for your quick reply, following are the deetails you requested
❌ Unfortunetly it did not work kindly review my setup
✅ 1. What is written on your ESP32 chip?
its written ESP32-wroom-32U
i buy it from this link (no advertissement)
https://www.lazada.co.th/products/i5372726690-s22828941385.html?urlFlag=true&mp=1&tradePath=omItm&tradeOrderId=1085124160366630&tradeOrderLineId=1085124160466630&spm=spm%3Da2o42.order_details.item_title.1
✅ 2. What happens during a flash? Does it say “Success” or “Complete”?
– it say complete whe using tasmoha webflasher (i wait for 5 minites and wifi dont show up)
so i swith to using ESPtool please review the screen log below:
Connected to device: ESP32-D0WD-V3 (revision 3)
esptool.js
Serial port WebSerial VendorID 0x10c4 ProductID 0xea60
Connecting…
Detecting chip type… ESP32
Chip Revision: 3
Chip is ESP32-D0WD-V3 (revision 3)
Features: Wi-Fi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: f8:b3:b7:59:00:fc
Uploading stub…
Running stub…
Stub running…
Changing baudrate to 921600
Changed
If the chip does not respond to any further commands, consider using a lower baud rate.
Flash ID: 164068
Erasing flash (this may take a while)…
Chip erase completed successfully in 0.586s
Compressed 3211264 bytes to 752022…
Writing at 0x0… (2%)
Writing at 0x64dc… (4%)
Writing at 0x1cca5… (6%)
Writing at 0x28d79… (8%)
Writing at 0x31ba9… (10%)
Writing at 0x3bb91… (13%)
Writing at 0x419fd… (15%)
Writing at 0x47460… (17%)
Writing at 0x4d464… (19%)
Writing at 0x53075… (21%)
Writing at 0x58f2c… (23%)
Writing at 0x5efbf… (26%)
Writing at 0x64ca8… (28%)
Writing at 0x6a827… (30%)
Writing at 0x705b4… (32%)
Writing at 0x7639f… (34%)
Writing at 0x7c04a… (36%)
Writing at 0x81da6… (39%)
Writing at 0x87d0c… (41%)
Writing at 0x8d8b1… (43%)
Writing at 0x935b5… (45%)
Writing at 0x9886b… (47%)
Writing at 0x9df59… (50%)
Writing at 0xa367c… (52%)
Writing at 0xa89e5… (54%)
Writing at 0xade19… (56%)
Writing at 0xb3690… (58%)
Writing at 0xb92e4… (60%)
Writing at 0xbee52… (63%)
Writing at 0xc4b6d… (65%)
Writing at 0xcabdc… (67%)
Writing at 0xd05f1… (69%)
Writing at 0xd5bf9… (71%)
Writing at 0xdcd97… (73%)
Writing at 0xe699c… (76%)
Writing at 0xec9b5… (78%)
Writing at 0xf298f… (80%)
Writing at 0xf8ea0… (82%)
Writing at 0xfe034… (84%)
Writing at 0x211148… (86%)
Writing at 0x21e35c… (89%)
Writing at 0x230694… (91%)
Writing at 0x249805… (93%)
Writing at 0x2601f7… (95%)
Writing at 0x2722c3… (97%)
Writing at 0x27dac8… (100%)
Wrote 3211264 bytes (752022 compressed) at 0x0 in 18.154 seconds.
File md5: 5a003c4f24c6fdf64589cf5929583ebe
Flash md5: 5a003c4f24c6fdf64589cf5929583ebe
Hash of data verified.
Leaving…
Hard resetting via RTS pin…
✅ 3. After plugging in, do you see ANY LED lights?
– the led is in solid on state
✅ 4. Iam using a data cable and test it with other board before working on this board. (always double check the cable).
✅ 5. in your messsge you mention this bin file name (esp32-ntrip-rtk-v1-webflash.bin) however i downloaded the file you provided to Khun Thinh the bin file name is (esp32-ntrip-rtk-v1-final.bin).
✅ 6. in your discription you mention that esp32 is a 38 pin, now i seee thats mine is 30 pin, the iner achitecture is prety similar but potentiallly have an effect. if my esp is not compatible kindly suggest a link from were to buy in Thailand.
Thank you very much
Sawatdee krub Khun Hamza,
GOOD NEWS – I FOUND THE PROBLEM!
The file you downloaded was the OLD version that
doesn’t work with web flashers.
I have created a NEW PACKAGE with the CORRECT firmware:
✅ esp32-ntrip-rtk-v1-webflash.bin
WHAT WAS WRONG:
—————
Old file: esp32-ntrip-rtk-v1-final.bin ❌
New file: esp32-ntrip-rtk-v1-webflash.bin ✅
YOUR ESP32 BOARD IS PERFECT:
—————————-
✅ ESP32-WROOM-32U chip
✅ 30-pin board works fine (same as 38-pin)
✅ Flash process completed correctly
✅ Cable and setup are good
PLEASE TRY AGAIN WITH NEW FILE:
——————————-
1. Download new package (firmware link)
2. Use Tasmota: https://tasmota.github.io/install/
3. Click “ERASE” first
4. Flash: esp32-ntrip-rtk-v1-webflash.bin
5. Wait, unplug/replug USB
6. Wait 2 minutes
THIS WILL WORK! The problem was my wrong file,
not your board or setup. I hope you can get it done.
Kobkun mak krub,
Prajuab
Good afternoon Khun Prajuab,
Thank you very much for the firmware. Here is my update and feedback to help move forward:
1. Firmware Installation
I am happy to report that I successfully installed the firmware on different types of ESP32 (4MB or more). I cannot attach photos here, but the installation worked well.
2. Flashing Tools
I noticed that the Tasmota web installer failed many times. However, the Spacehuhn tool worked perfectly with a 100% success rate.
3. Issues with UM980 (v4)
I had some trouble connecting my UM980 because it is a Version 4 model:
Connection: COM1 is a USB-C port, so I could not wire the ESP32 to it to set the base coordinates.
Display: I used COM2. The web interface shows the number of satellites, but it cannot draw the “Satellite View.”
Commands: In UM980 v3 and v4, the commands have changed. Many old commands (GPGSV, GLGSV, etc.) are now combined into one command: GPGGA. Please check the manual for details.
4. NTRIP Caster
The NTRIP Caster shows “Online” on my laptop, but it is not receiving data (0KB in). It sends out random data instead of correct data. I would appreciate your help with this.
5. Base Position
Setting the base position is the most important feature. Great job on this! However, I cannot make it work because I cannot send commands to the UM980 through the other ports. Please let me know if I am doing something wrong.
Kobkun mak krub,
Sawatdee krub Khun Hamza,
Thank you for the detailed feedback! Let me help you:
1. FIRMWARE INSTALLATION ✅
—————————-
Excellent! Thank you for confirming Spacehuhn tool works better.
I will update recommendations.
2. SKYPLOT/SATELLITE VIEW 🛰️
—————————-
This feature is DISABLED by design to save ESP32 memory.
The firmware shows satellite count only, not the graphical plot.
This is normal and expected.
3. UM980 V4 HARDWARE ⚠️
———————–
I need more information about your UM980 V4:
CRITICAL QUESTIONS:
a) Please send me the purchase link or product page
b) Does your UM980 have TWO serial connectors (COM1 + COM2)?
Or just ONE serial connector?
c) Which serial port did you connect to ESP32?
– COM1 or COM2?
Different UM980 versions have different port configurations.
I need to know your exact hardware to help properly.
4. WIRING CHECK 🔌
——————
Please confirm your wiring:
ESP32 → UM980 (which COM port?)
– GPIO 17 (TX) → UM980 RX (which COM?)
– GPIO 16 (RX) ← UM980 TX (which COM?)
– GND → GND
Send me a photo if possible!
5. NTRIP 0KB DATA 📡
——————–
This is because UM980 is not configured yet.
After you tell me which COM port you’re using,
I will give you the exact commands.
6. BASE POSITION SETTING 📍
—————————-
The firmware sends configuration commands via GPIO 17.
Once we confirm your wiring, this will work.
TEMPORARY SOLUTION:
If your UM980 has USB port:
1. Connect to computer via USB
2. Open UPrecise software
3. Manually set base position:
MODE BASE [latitude] [longitude] [height]
Example: MODE BASE 13.7563 100.5018 10.5
SAVECONFIG
NEXT STEPS:
———–
Please provide:
1. UM980 purchase link or model number
2. Photo of your UM980 board (showing ports)
3. Which COM port you connected to ESP32
4. Photo of your wiring (if possible)
Then I can give you exact configuration!
Kobkun mak krub,
Prajuab
Dear Prajuab,
Thank you for your ongoing assistance with this setup. Please see the updates below regarding the hardware configuration:
1. Documentation & Wiring
I have documented the board layout, COM port identification, and current wiring in this image:
https://i.postimg.cc/C5jGy9cQ/setup.jpg
2. Current Configuration (COM2)
I have successfully wired the UM980 to the ESP32 (COM2). I’ve configured the UM980 to output both RAW data and RTCM corrections over this port.
3. Troubleshooting (COM3)
I attempted to mirror the wiring from your post by connecting UM980 COM3 to ESP32 pins 32 and 33, but I am not seeing any data flow yet.
Question: Should I try shifting this connection to the RX0/TX0 pins on the ESP32 instead?
Kobkun mak krub,
Sawatdee krub Khun Hamza,
Perfect! I now see your hardware clearly.
YOUR UM980 BOARD:
—————–
Your UM980 is the same model I use in my V3 version.
It has:
✅ COM3: Physical connector (easy to wire)
⚠️ COM2: Solder pads only (need to solder wires)
YOUR ESP32 BOARD (30-PIN):
————————–
Your ESP32 is a 30-pin version.
It does NOT have GPIO 32/33.
We will use GPIO 25/26 instead!
IMPORTANT – YOU NEED TO SOLDER COM2:
————————————-
Look at your UM980 board carefully.
You will see solder pads labeled:
– RXD2 (COM2 receive)
– TXD2 (COM2 transmit)
You must solder wires to these pads!
CORRECT WIRING (30-PIN ESP32):
——————————-
UM980 COM2 (solder pads) → ESP32:
– UM980 TXD2 → ESP32 GPIO 16 (RX0)
– UM980 RXD2 ← ESP32 GPIO 17 (TX0)
UM980 COM3 (connector) → ESP32:
– UM980 TXD3 → ESP32 GPIO 25 (RX1)
– UM980 RXD3 ← ESP32 GPIO 26 (TX1)
UM980 GND → ESP32 GND
FIRMWARE UPDATE NEEDED:
———————–
Because you’re using GPIO 25/26 instead of 32/33,
I need to rebuild the firmware for you!
PLEASE WAIT – I will create custom firmware:
– For 30-pin ESP32 (GPIO 25/26)
– For your UM980 configuration
– Should be ready in 1-2 days
MEANWHILE – SOLDER COM2:
————————
Please solder wires to RXD2/TXD2 pads on UM980.
This is required for the system to work.
NEXT STEPS:
———–
1. Solder wires to COM2 pads (RXD2/TXD2)
2. Wire according to diagram above
3. Wait for my custom firmware (1-2 days)
4. Flash new firmware
5. Test!
I will notify you when firmware is ready!
Kobkun mak krub,
Prajuab
Good Morning Khun Prajuab
All wiring are done, I will be waiting for your kind updates to flash the firmwear.
After testing i will provide a detailed feedback hoping it will be usufull for future developement and updates.
Have a good day.
Sawatdee krub Khun Hamza,
Excellent work on completing all the wiring! I have great news for you.
CUSTOM FIRMWARE READY:
———————-
I have built a SPECIAL firmware specifically for your 30-pin ESP32 board.
Your board does NOT have GPIO 32/33 (only 38-pin boards have these).
So I modified the firmware to use GPIO 25/26 instead.
DOWNLOAD HERE:
————–
[YOUR DOWNLOAD LINK]
Package contains:
– esp32-ntrip-rtk-v1-30pin.bin (your custom firmware)
– README.txt (complete instructions)
KEY DIFFERENCES FOR YOUR BOARD:
——————————–
Standard version uses: GPIO 32/33
YOUR version uses: GPIO 25/26
This matches your 30-pin ESP32 perfectly!
WIRING SUMMARY:
—————
UM980 COM2 (solder pads) → ESP32:
TXD2 → GPIO 16
RXD2 ← GPIO 17
UM980 COM3 (connector) → ESP32:
TXD3 → GPIO 25 ← Modified for 30-pin!
RXD3 ← GPIO 26 ← Modified for 30-pin!
FLASHING INSTRUCTIONS:
———————-
Use Spacehuhn (same tool you used successfully before):
https://esp.spacehuhn.com/
1. Connect ESP32 via USB
2. Click “Connect” → Select port
3. Click “Erase” (very important!)
4. Click “Add +”
5. Set offset: 0x0
6. Choose file: esp32-ntrip-rtk-v1-30pin.bin
7. Click “Program”
8. Wait about 5 minutes
9. Unplug and replug USB
10. Wait 2 minutes
FIRST BOOT – WiFi Setup:
————————
WiFi AP will appear: ESP_NTRIP_RBS_XXXXXX
Connect and open: http://192.168.4.1
IMPORTANT – CONFIGURE UART PINS:
———————————
After connecting to web UI, you MUST configure UART pins:
1. Go to: Settings → UART Configuration (UART2)
2. Set these values:
UART TX Pin: 17
UART RX Pin: 16
3. Click “Save”
4. Reboot ESP32
This step is REQUIRED for RTCM output to work!
(Default pins are wrong, must change to 17/16)
AUTOMATIC UM980 CONFIGURATION:
——————————
After UART pins are configured, the firmware will
AUTOMATICALLY configure your UM980 on next reboot:
– COM2: RTCM corrections (for NTRIP)
– COM3: NMEA satellite data (for web UI)
You don’t need to manually send commands via UPrecise!
SETUP CHECKLIST:
—————-
1. Flash firmware ✓
2. Connect to WiFi AP ✓
3. Configure UART2 pins to 17/16 ✓ ← DON’T FORGET!
4. Reboot ESP32 ✓
5. UM980 auto-configures ✓
6. Set base position in web UI ✓
7. Configure NTRIP settings ✓
8. Start streaming! ✓
TESTING STATUS:
—————
I tested this firmware on my spare 30-pin ESP32:
✓ Flashed successfully with Spacehuhn
✓ WiFi AP appeared correctly
✓ Web UI loaded without errors
✓ After UART config: UM980 commands work perfectly
NEED HELP?
———-
After flashing, if you have questions:
1. Check serial monitor at 115200 baud
2. Send me screenshots
3. Verify UART pins are set to 17/16
Good luck with the installation!
Looking forward to your feedback.
Kobkun mak krub,
Prajuab
P.S. – Don’t forget the UART configuration step!
UART TX: 17, UART RX: 16
This is critical for RTCM output!
Dear Prajuab,
Thank you for the custom firmware. I have tested the build and outlined my observations and feedback below:
1. Test Results & Technical Observations
Installation: Firmware upload was successful.
Hardware: UART changes on the ESP32 were applied as recommended. I can confirm data flow (IN/OUT) is visible on the UART.
NTRIP Status: The NTRIP service sends data out, but the “Byte In” count remains at 0. yet it work depending on the scenarios
Connectivity Scenarios:
Direct Command (Success): When I uploaded RTCM commands directly to the UM980 (outputting via COM2), the NTRIP caster receives and forwards data perfectly. andwork as intended to do.
WebUI Configuration (Issue): When I use the ESP32 WebUI to upload known base coordinates, the webui caster show sendong datat the uart too but the caster shows “Unknown Data Type,” rendering the stream unusable. (Please see the attached screenshots for timestamped comparisons).
Wiring Check: Even after unplugging the COM3 connector, the ESP32 WebUI continues to receive satellite data from COM2. witch is not a bad idea for less wirring.
https://i.postimg.cc/d1YCw3BT/collage.jpg
2. Development Suggestions
Regarding the ESP32’s role in configuring the UM980, I suggest the following approach for future iterations:
permanante Configuration: configure um980 permanently to oitput rtcm and nema using “Survey-In” commands (e.g., 120-second duration).
Temperarary configuration for Fresh Restarts: Using the ESP32 to inject base location configurations without saving them to the UM980’s flash memory. This will ensure a clean startup every time and prevent error accumulation.
3. Request
Could you please share the source code for the WebUI interface? I would like to review how the base coordinates are being injected from the ESP32 to the UM980 to help troubleshoot the data type error. and help in next updates. i will share all progress regarding the 30 pin while you keeep developping the 38 pin.
Best regards, Hamza
Sawatdee krub Khun Hamza,
Thank you for the detailed testing report and screenshots.
Let me address your findings:
1. FIRMWARE DESIGN – IMPORTANT:
——————————-
My V1 firmware is designed for SEPARATE data streams:
Expected Configuration:
– UM980 COM2: RTCM ONLY (pure RTCM stream)
– UM980 COM3: NMEA ONLY (pure NMEA stream)
My firmware does NOT support mixed RTCM+NMEA on one port.
There is no stream demultiplexer in the code.
2. WHAT LIKELY HAPPENED:
————————
When you configured UM980 via UPrecise and saved it,
your manual configuration OVERRODE the firmware’s automatic
configuration.
Firmware sends commands on boot, but if UM980 already has
saved config from UPrecise, it may ignore new commands.
3. YOUR OBSERVATION – “COM3 UNPLUGGED BUT STILL SATELLITE DATA”:
—————————————————————–
This confirms you configured UM980 to output BOTH RTCM and NMEA
on COM2 via UPrecise.
This is NOT the firmware’s design.
Firmware expects pure RTCM on COM2.
4. “UNKNOWN DATA TYPE” ERROR:
——————————
This might be related to mixed stream on COM2.
The NTRIP caster expects pure RTCM, but is receiving
mixed RTCM+NMEA data.
5. WIRING VERIFICATION NEEDED:
——————————
You mentioned UART shows “data out but no data in.”
This is concerning. It suggests:
– Either UM980 COM2 TX → ESP32 GPIO 16 not connected
– Or solder joints on COM2 pads not good
– Or UM980 not outputting on COM2 TX
CRITICAL REQUEST:
Please send clear photos of:
1. UM980 COM2 solder connections (TXD2/RXD2 pads)
2. Wiring from UM980 to ESP32 (both ends)
3. ESP32 GPIO 16/17 connections
Without seeing actual wiring, I cannot diagnose further.
6. CORRECT SETUP PROCEDURE:
—————————
To use my firmware as designed:
A) Power off everything
B) Connect wiring:
UM980 COM2 TXD2 → ESP32 GPIO 16
UM980 COM2 RXD2 ← ESP32 GPIO 17
UM980 COM3 TXD3 → ESP32 GPIO 25
UM980 COM3 RXD3 ← ESP32 GPIO 26
C) Power on – firmware auto-configures UM980
D) Do NOT use UPrecise after this!
E) Set base position via ESP32 web UI only
7. SOURCE CODE:
—————
I can share my modified V1 source code for academic use.
This is NOT the original nebkat code – it’s my modifications.
I did not use this commercially, so I have the right to
keep it private if I choose. However, I’m willing to share
for academic/learning purposes.
If you want the code, please confirm:
– Academic use only
– You understand it’s my modified version
– You won’t use commercially
Download here:
[YOUR DOWNLOAD LINK]
8. V1 DEVELOPMENT STATUS & SUPPORT:
———————————–
IMPORTANT NOTICE:
I have DISCONTINUED active development of V1 firmware.
I am currently working on V3, which is completely different:
– Hardware: Orange Pi Zero 3 (not ESP32)
– Programming: Python/C (not Arduino/ESP-IDF)
– Architecture: Linux-based system
– Same concept: NTRIP base station
– But entirely different implementation
This is why I must slow down V1 support.
The V1 (ESP32-based) version was my learning project.
V3 is my active project and developing.
I built this custom 30-pin firmware for you as a courtesy.
You are welcome to:
– Use the V1 firmware as-is
– Study the source code
– Modify for your needs
– Share findings with community
– Continue your own development
But please understand:
– V1 is frozen/discontinued
– V3 is my active project
– Limited time for V1 support
9. IMMEDIATE NEXT STEPS:
————————
Please provide:
1. Clear wiring photos (both UM980 and ESP32 ends)
2. Serial monitor log showing firmware boot messages
3. Confirm you want source code (academic use)
Then I can help diagnose the actual problem.
Kobkun mak krub,
Prajuab
P.S. – The “data out but no data in” issue is critical.
This suggests wiring problem, not firmware problem.
Photos will help identify this quickly.
Dear Khun Prajuab,
Thank you very much for your constant support; it is much appreciated.
1/ Configuration Reset: I recognize my mistake in uploading manual configurations via UPrecise. I will fully reset the UM980 and allow the ESP32 firmware to handle the configuration on startup as designed.
2/ Wiring: I have rechecked and tested all connections and wiring; everything is now in order.
3/ Data Streams: I can confirm that COM3 is now strictly carrying the NMEA stream for satellite data.
4/ NTRIP Observations: RTCM data is being received by UART2 and sent to the NTRIP caster. However, the caster still reports “Unknown Data Type.” I will continue to investigate why the stream isn’t being recognized correctly.
5/ Academic Context: I am conducting this project for my Master’s degree. My research compares the accuracy of budget-friendly GNSS receivers like the UM980 against high-end brands such as Sokkia GRX and Topcon Hiper, which are the standards in my country.
6/ V1 Transition: I fully understand that you have discontinued active development for V1 to focus on V3. I am grateful for the work you’ve already done for the community.
7/ Source Code Confirmation: I would be honored to continue developing and troubleshooting on the V1 platform for my research. I confirm the following:
* This work is for Academic use only.
* I understand and acknowledge this is your modified version.
* I will not use it for any commercial activity.
* I will academically cite your work and acknowledge your valuable contribution in my findings.
Thank you again for your kindness and support of my research.
Best regards,
Hamza
Dear Khun Prajuab,
Thank you again for all your help!
I am really looking forward to diving into the V1 source code and studying how you handled the WebUI and coordinate injection.
As we discussed, I’m happy to confirm that I will use the source code for non-commercial, academic purposes only and will be sure to credit your work.
I look forward to the download link whenever you have a moment!
kupun krab
Sawatdee krub Khun Hamza,
Thank you for confirming academic use!
CORRECTED SOURCE CODE LINK:
—————————-
[YOUR DOWNLOAD LINK TO: esp32-ntrip-DUO-Hamza-30pin-source.zip]
Previous link was incorrect – this is the right one.
PACKAGE CONTAINS:
—————–
– Complete V1 source code (30-pin modified version)
– main/um980_base.c – UM980 configuration & coordinate injection
– main/web_server.c – WebUI handlers
– main/uart.c – UART handling (GPIO 25/26 for your board)
– All other modules
KEY FILES FOR YOUR STUDY:
————————-
For coordinate injection:
→ main/um980_base.c (um980_send_base_ecef function)
For WebUI:
→ main/web_server.c
→ www/ directory (HTML/JS/CSS)
BUILD INSTRUCTIONS:
——————-
Requires ESP-IDF 5.3.0 or later
idf.py build
Feel free to modify and experiment!
Kobkun mak krub,
Prajuab