My TinyGS hardware kit just arrived today (Heltec LoRa 32 board, antenna, case, and accessories). I’m very excited to set it up, but looking at the parts spread out on my desk, I’m a bit overwhelmed on where to begin.
Hi, it is very important NOT to use the inluded so called “antenna” - this does not work at all. you find a lot of stuff about TinyGS on my QRZ-page OE6ISP - Callsign Lookup by QRZ Ham Radio , and in case you are not familiar with this topic – a short description how to build a groundplane-antenna, which is not only the best point to start, but in my opinion the best antenna for this purpose.
When you are familiar with visual code, you should compile the firmware yourself, which gives a lot of flexibility. The sources are available from github GitHub - tinygs/tinyGS: 📡 Open Ground Station Network 🛰 · GitHub, where you can pull the latest betas with new functionality as well as the stable releases.
Thank you so much for the fantastic advice and the reference to your QRZ page!
I checked out your page (OE6ISP) and was really impressed by your setup and the groundplane antenna guide. I will definitely keep that in mind and look into upgrading from the stock antenna.
My USB cable is on its way, and I’m getting more and more excited to dive into this project. Thanks again for sharing your expertise!
Following up on the earlier Wi-Fi/MQTT tests, I’ve completely bypassed wireless dependencies to achieve maximum stability for satellite signal monitoring.
Hardware/Wired Bridge: Connected the Heltec V3 directly via USB-C to my main Debian 13 server (the NEC machine), which runs parallel alongside its primary role as my SatNOGS server.
Data Flow: The device runs in a minimal serial-output mode (Serial.println()), streaming JSON payloads straight through /dev/ttyUSB0.
Backend Processing: A robust Python bridge script (serial_to_mqtt.py) on the server captures the serial stream in real-time and publishes it locally to the Mosquitto MQTT broker.
No more router dropouts or AP isolation issues—just a rock-solid, hardwired data pipeline feeding right into the heart of my station setup, perfectly primed for serious LoRa satellite tracking!
What went right: Successfully built the wired direct connection to the NEC Debian host and got the serial data pipeline nicely structured.
Where it went wrong: But wait—the Heltec V3 is refusing to cooperate properly, and after diving head-first into a pointless troubleshooting rabbit hole with AI, I am officially stuck in the mud and unable to move an inch!
Bailing out for today and calling it quits. Time to step away before things get worse!
Host Machine: Linux (NEC machine running Python, MQTT broker, and Skyfield).
Connection: USB Serial (/dev/ttyUSB0 via CP210x, 115200 bps).
2. Key Hardware Gotchas & Fixes (for Heltec V3)
Getting the SX1262 on the Heltec V3 to initialize properly required a few specific configurations in RadioLib:
Power: Vext (GPIO 36) must be pulled LOW to supply power to the RF section.
TCXO: Voltage must be explicitly set to 1.8V.
RF Switch: DIO2 must be enabled as an RF switch (radio.setDio2AsRfSwitch(true)).
Explicit SPI Initialization:SPI.begin(9, 11, 10, 8); with module pins mapped to (8, 14, 12, 13).
3. Software Architecture
Orbit Calculation (sat_commander.py): Uses Skyfield with local TLE data (CelesTrak amateur group) to calculate pass events (Rise, Culmination, Set) for target satellites (e.g., NETSAT-1) based on observer location (Hirosaki, Japan).
MQTT & Serial Bridge (mqtt_serial_bridge.py): Listens to the heltec/control MQTT topic and translates target parameters into serial commands (SET,FREQ:<val>,BW:<val>,SF:<val>).
Firmware (sketch.ino): Parses incoming serial commands dynamically and applies real-time frequency adjustments (crucial for tracking Doppler shifts) using RadioLib while continuously monitoring for downlink packets with RSSI/SNR feedback.
4. Arduino Firmware Snippet
C++
#include <RadioLib.h>
SX1262 radio = new Module(8, 14, 12, 13);
void setup() {
Serial.begin(115200);
while(!Serial);
delay(1000);
// Power up Vext and initialize SPI
pinMode(36, OUTPUT);
digitalWrite(36, LOW);
delay(100);
SPI.begin(9, 11, 10, 8);
// Initialize RadioLib with 1.8V TCXO
int state = radio.begin(435.6, 125.0, 9, 5, 0x34, 10, 8, 1.8);
if (state == RADIOLIB_ERR_NONE) {
radio.setDio2AsRfSwitch(true);
radio.startReceive();
}
}
void loop() {
if (Serial.available() > 0) {
String command = Serial.readStringUntil(10);
command.trim();
if (command.startsWith("SET")) {
// Parse and apply frequency/BW/SF dynamically for Doppler tracking
parseAndApplyCommand(command);
}
}
// Packet reception check
if (radio.getPacketLength() > 0) {
String recvStr = "";
if (radio.readData(recvStr) == RADIOLIB_ERR_NONE) {
// Log packet, RSSI, and SNR
}
radio.startReceive();
}
delay(10);
}
This setup bridges orbital calculation directly down to a low-cost embedded LoRa receiver, enabling smooth real-time parameter tuning for satellite passes. Feedback or suggestions are always welcome!
73!
Current Status Note: Please note that this is an interim report. While I have successfully verified the hardware initialization, MQTT-to-serial bridging, and dynamic parameter tuning, I have not yet confirmed actual reception or decoding of live LoRa satellite downlinks in the field. I hope to share a follow-up report once I successfully capture a pass!
Managed to get the virtual environment and skyfield sorted out on the Linux host (Debian), and finally booted up both the MQTT-to-serial bridge and the orbit commander script!
As you can see in the terminal screenshot below, the bridge is successfully hooked up to /dev/ttyUSB0 listening on heltec/control, and the tracker has successfully pulled the TLE data, showing upcoming passes (like AO-7 starting around 16:55 JST).
Fingers crossed—I’m hoping to test out actual live tracking. To be honest, I’m a bit skeptical if that tiny stock antenna bundled with the kit can actually pull in a signal, but I’m excited to find out!
Any thoughts or advice as I step into the live test phase are always welcome. 73!
Yes, exactly! I’ve just updated and modified my Python script on the PC (handling orbit calculation via Skyfield and MQTT bridging) into a persistent monitoring loop, and I’m currently waiting for the next pass to test it out live.
Fingers crossed it works—I’ll be sure to share how the live test goes soon! 73!
I’ve now integrated it with an automated Linux server pipeline (using Skyfield for satellite pass calculation, an MQTT-serial bridge, and SQLite logging) running persistently via systemd. Everything is fully automated now—ready to track AO-7 passes without manual terminal intervention!
Thanks for all the inspiration, and good luck with your setups! 73!
Even though there are many different antennas in my station overview, most of them are experimental or for very specific purposes, where they provide the best performance. For general purpose applications, the groundplane is by far the best. It offers pretty the same performance as the j-pole, but I cannot recommend the j-pole, because it is difficult to tune and decouple from the feed-line, as it has no ground-plane as reference. The 165mm groundplane based on a N-connector (SMA and PL are not waterproof!) is easy to assemble and does not need any tuning, because its SWR is usually below 1.5 after assembly. Circular polarized omnidirectional antennas like QFH, turnstile or eggbeater are working to a certain degree, but with a permanent 3dB loss, as the satellites are usually linear pol.
I’m having an issue with my Heltec V3 module running TinyGS. The display is stuck indefinitely on the “LoRa Gateway” screen, and I cannot seem to get any serial output from it.
My setup:
Hardware: NEC server (running Debian) connected via USB to a Silicon Labs CP210x UART Bridge (Heltec V3) and an RTL-SDR Blog V4.
The device is correctly recognized as /dev/ttyUSB0 (lsusb shows the CP210x bridge), and the orange LED on the board is slowly blinking.
However, when I try to read the serial port using screen or cat (even after stopping any background services that might conflict), no data flows, or it immediately terminates.
Has anyone experienced a similar issue where the board gets stuck on the “LoRa Gateway” screen with no serial logs? Any advice on how to troubleshoot this would be greatly appreciated!