R/C Tech Forums

R/C Tech Forums (https://www.rctech.net/forum/)
-   Radio and Electronics (https://www.rctech.net/forum/radio-electronics-137/)
-   -   OpenStint laptiming decoder (https://www.rctech.net/forum/radio-electronics/1137693-openstint-laptiming-decoder.html)

zsellera 11-13-2025 07:33 AM

OpenStint laptiming decoder
 
I'm proud to announce OpenStint, an open-source, RC3-compatible laptiming decoder project. Instead of custom hardware builds, it relies on inexpensive, ready-made software-defined radios. The primairly audience are small clubs and friendly gatherings, who either like thinkering or have no budget for a ready-made solution. It is also useful for tracks where RC3 compatibility is required, but compatible decoders are not available any more.

PROJECT URL: github.com /zsellera/openstint

The project is accompanied by a reference design of a transponder, and a low-noise balun & preamplifier side-project, custom-designed for RC timing loops.

HIGHLIGHTS
  • Off the shelf components only, no soldering is required. The heart of the decoder is a HackRF One, a software defined radio, available from $90 at opensourcesdrlab.com.
  • Supports RC3 protocol, with error-check and a makeshift error correction (little-to-no "ghost"/"shadow" transponder ids).
  • Defines (and decodes) an open transponder protocol. Known, easy-to-understand algorithms allowing 3 dB signal-to-noise ratio improvements (see docs/).
  • Runs on a Raspberry Pi Model 3 B+ (sub-$40 single board computer). A sub-$200 permanent installation is possible.
To watch it in action, here is a quick video: youtube.com /watch?v=YDW0eA1Szk4

To start using it, the necessary steps are detailed in the project's README. In short, you'll need:
  • HackRF One; RTL-SDR support is planned, but not available now.
  • A 1:9 or 1:8 HF balun (search for "noelec 1:9 balun" it's a $3 stuff) or a magnetic field probe.
  • Some 50-ohm coaxial cable (RG58 and RG316 are the inexpensive options)
  • An optional (but highly recommended) termination resistor: 330 ohm for surface installations and 470 ohm for above-the-track installations (see TDR measurements)
Note however, the project is in-the-making. See project roadmap in the aforementioned README file.

PICKUP ANTENNA
The detector antenna uses a similar design as other commercial solutions: it is a parallel wire transmission line, with a balun on one end, and a 330/470 ohm termination on the other end. The wires should be ideally 2 mm^2, and separated by 25 cm from each other. Use the 330 ohm termination for in-the-ground installations, and the 470 ohm termination for overhead wires. The inexpensive NoElec 1:9 HF balun gives a very good impedance match for the overhead installations, and is also usable for in-the-ground setups.

Note: I use the term "antenna" and not "loop". From a geometrical standpoint, it is a loop for sure. From electrical perspective, this is a parallel-wire transmission line, an unshielded arrangement to pick up external disturbances. There is no need for "resonance matching" or other similar magic.

TRANSPONDERS
While the project can decode RC3-compatible transponders, the preferred protocol is the OpenStint transponder protocol. The protocol is well documented, it makes sense (no deliberate obfuscation) and has pretty good SNR characteristics. A reference implementation is available (schematics, pcb and firmware). At club level, one can manufacture 40 pcs of these transponders for $130 (a cost less than a single RC4 hybrid).

The reference design is available at:
github.com /zsellera/openstint-transponder/

The reference design produce comparable signal levels to the commercial offerings when running from 7.2 V (servo port of the receiver). It requires 4.5 V minimum to function properly, and testing was done up to 8.5 V (2s). The output level depends on the input voltage.
Note: this is a "v2" design shared, I just submitted an order at JLCPCB for it. I'll update this thread when I could properly test them.

PREAMPLIFIER
The project comes with an optional, low noise preamp + filter, that does the differential to single-ended conversion as well. It fits into a Hammond 1590L die-cast aluminium case. It is useful at overhead antenna installations and in noisy environments. The design offers a good +13 dB power gain. The onboard filters get rid of out-of-band interferring radio signals, which may get downconverted to baseband due to non-idealities in the inexpensive radio receivers.

Project url:
github.com /zsellera/openstint-preamp

WHAT'S NEXT?
On the short run, I'd like to focus on:
  • lapcounter software: application for practice sessions, maybe clubraces later on.
  • STL-SDR v4 support: the cost of a 3rd-party HackRF One is ca. ~$90, while the cost of an original RTL-SDR is ~$50. On the other hand, RTL-SDR implementation is likely consists of a fractional resampler, which is resource-intensive (might need Raspberry Pi 4 or even 5).
  • sector timing: while this is primarily a lapcounter software feature, the clock-syncing required for it is a "first-class citizen" of the OpenStint project. See the "timesync messages" in the transponder protocol documentation.
I've spent about 2 months of a sabbatical on this project. While I think it was the best possible way to spend this time, I'd like to return to the world of 9-to-5 soon. As such, there are no promises on future features or project timelines.

HOW CAN YOU HELP OR CONTRIBUTE?
First off, this project converts a hardware problem into a software one, which is usually more likely to get solved.
  • This project severely needs integration with laptiming software. If you develop one, and you're interested in an integration, check out the decoder protocol documentation.
  • The project contain some basic integrations in the integrations folder, including a very basic laptiming software (for educational purposes). I'd like to work on a P3 bridge soon. If you have any documentation on the P3 protocol, please share it with me.
  • While reading the specs of the reference transponder, one might notice the gap between this and the RC4 transponder. Someone shared an X-ray image of an RC4-hybrid on this forum, and a "V7" text is visible on the copper layer. The design I shared is "V2" as of now. On the other hand, I unfortunately out of ideas on how to push it any further.
  • If you have developed your own transponder, let's talk. A reference implementation of the transponder protocol is available in github, and I can help making sense of it.
  • Test it out, preferably at your local track. I'll do the same. Initial tests are promising btw.
Also, if you like this project, please star them on Github.

hanulec 11-14-2025 04:27 AM

https://github.com/zsellera/openstint
https://github.com/zsellera/openstint-transponder
https://github.com/zsellera/openstint-preamp


zsellera 11-16-2025 08:27 AM

Yesterday we could test the system at our club. It ran the whole day, and counted 3170 laps in total. Out of these, 801 were made with OpenStint transponders, and the rest with RC3/RC4Hybrid/clone ones. I received no complaints about missed laps from people participating in the test.

As it was an indoor event and the pickup antenna was placed under the carpet. I used a lightly coated 26 AWG (0.14 mm2) wire. The wire separation was 30 cm, and a 330 Ohm termination resistor was soldered onto the remote end. At the business end, I added an openstint-preamp (see github for shematics), which was connected to the HackRF One. The HackRF was connected to a raspberry pi, which streamed the laptimes to a makeshift dashboard people could access with their phone.

I set the amplifier gains of the HackRF with the help of SDRAngel. It's a great tool to do all sort of RF magic with SDRs. To figure out the gains, we only need its' spectroscope though. Open the HackRF device with it, tune to 5 MHZ, set sample rate to 5 MSPS and IF filter bandwidth to 1.75 MHz. Park a car with a well-placed, strong transponder over the loop. Then, start from low values, and increase the LNA gains until you see sidelobes on the spectroscope. It indicates clipping. If seen, back off by 8 dB. Then do the same with the VGA gains (2 dB steps). I ended up starting the decoder with the following parameters:


./openstint -l 24 -v 22 -b
As such, gains are LNA=+24dB, VGA=+22dB, and enabled bias-tee for the optional openstint-preamp. With these settings, the highest signals used the full range of the 8-bit ADCs inside the radio, while weaker transponder placements utilized the lower ~4 bits only. The noise affected the ~1.5 least significant digits, yielding still a good SNR for less-than-ideal transponder placements as well.

The antenna was placed to a slow section of the track. During passings, a typical RC4-hybid registered 55-60 hits, while an OpenStint transponder did 170-180. This is in-line with the expectations, as the openstint transponders produce ~3x more decodable messages as an RC4-hybrid does.

Unfortunately, the decoder also reported (probably) RC3 status messages as passings. I added a patch, so next time (hopefully) this will be not a problem. Unfortunately I'm just guessing though. The real solution would be a monitor mode, similar to what RCHourGlass has, to aid solving these mysteries.

gjeremie 11-21-2025 12:43 AM

Hello,

your work is incredible.

I have a question, i want to detect when the car pass on the loop of our track (mylaps decoder) and send a telemetry signal to my radio (MT12 with elrs and csrf telemetry)
It seems i can do it with your transponder modifying the code to not emit and only a signal high on a pin when the car pass on the loop.

(now i use a gps inside the car to detect the pass of my car for my lap timing on the MT12)

By using your transponder as a a loop detector ?


Do you know how to do this ?

zsellera 11-22-2025 01:27 PM

You can absolutely achieve this. Chatgpt can even produce simple integrations. This was my prompt:


Write a python program which connects as a subscriber to a zeromq publisher, and toggles pins on a raspberry pi model 3 b+ based in the text messages received. The zeromq publisher implements openstint decoder protocol (URL REDACTED). The interresting messages are "Passings", which start with a letter "P" and has the following charactersistics:

```
P <decoder_timestamp:uint64> <transponder_type:string> <transponder_id:uint32_t> <rssi:float> <hit_count:uint32_t> <evm:float> [other future parameters]
```

Example messages:
```
P 1618706341 OPN 1615544 3.50 64 0.30 P 1618714251 OPN 1615544 3.08 40 0.25
```

Write a program that identifies transponders ids specified in a python dictionary, and sets the specified pin TRUE for 1 second whenever the transponder is detected, then resets the pin to FALSE:
```
TRANSPONDER_PINS = {
'1615544': 4 # transponder_id, GPIO pin
}
```

Use BCM pin numbering on the raspberry pi.
Both the chatgpt prompt and the generated code (I added minor modifications only) are available here:
gist.github.com zsellera/5b5b2cb178dd1cdd0c35bc6f06a974b8


tcb22185 11-24-2025 01:29 PM

now I'm interested and getting this system going. seems like a fairly cheap way for a local low budget club to get lap counting going.

danny325is 12-10-2025 08:15 AM

This is fantastic. I'm ordering some SDR tools and hopefully I can start working and contributing to this project. Thank you so much for all your hard work.

danny325is 12-24-2025 10:15 AM

I have put in a few hours of getting a STL-SDR to work. I am detecting the R3/R4 Hybrid, the issue is that i am only getting it 1 out of 25 times. My issues now is that i just don't know enough about SDR in general so my learning curve is steep. I am relying on AI alot right now. fun project though. my family is very confused with all the wires on dinner table. :)

Lowered the threshold and now getting better detection, but the EVM is not good and not getting transponder code detection. YET. might be my antenna build

From AI:
You're getting excellent frame detection (EVM as low as 0.45-0.46) but the demodulation still needs the preamp to reliably decode transponder IDs. The software side is working well - it's purely a signal/noise ratio limitation now."

[DEBUG] Max correlation: 0.7760 (threshold: 0.67), DC offset: (-1, 0)
F OPN T:24743 RSSI:-4.41127 EVM:0.619048 [0, 223, 0, 0, 1, 255, 255, 255, 255, 64, 246, 3, 0, 222, 176, 82, 220, 0, 255, 0, 0, 22, 114, 182, 0, 0, 226, 0, 255, 0, 0, 0, 255, 6, 0, 255, 30, 0, 3, 95, 45, 36, 0, 20, 230, 94, 226, 97, 62, 151, 3, 0, 0, 210, 0, 166, 79, 250, 4, 0, 242, 106, 249, 0, 0, 255, 17, 0, 24, 255, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 104, 80, 119, 136, 133, 129, 128, 128, 128, 128, 128, 129, 129, 127, 128, 127, 129, 129, 127, ]

zsellera 12-24-2025 04:10 PM

Nice, thanks for working on this. I tested your fork, and it works for me as well.

This is a typical passing:

[DEBUG] Max correlation: 0.9223 (threshold: 0.70), DC offset: (0, 0)
S 9346 -44.558327 0 451 426
P 9169 OPN 6551418 -14.75 3721 0.53
As seen, out of 451 detected preambles, it was able to successfully decode 426. It's in-line with my experience of HackRF.

Detection threshold: the lower you set the correlation threshold, the more likely it recognises random noise as valid preamble. On very low settings, it will recognise practically anything as valid frame. On the other hand, I indeed see worse correlation with the rtl-sdr implementation. You can get it into shape by not tweaking the resampling's filter bandwidth (just use resamp_crcf_create_default).
EVM: yep, it's far from being nice, but for a different reason (it's bad with HackRF as well, I think the symbol synchronizer is used with an incorrect filter).
Amplifiers: The "RSSI:-4.41127" means you're using practically the full scale of the radio's input.


zsellera 01-11-2026 07:54 AM

Hi,

There is a writeup with expected images in the repository on how to test a given setup with SDRAngel:
github.com/zsellera/openstint/blob/master/docs/setup-tutorial.md#testing-the-system-so-far

If you can receive signal using SDRAngel, you should be able to do so with the openstint software as well.

If there is no signal visible with sdrangel, try:

1. Can you receive any other signals with your hackrf, like fm-stations?

2. What balun/preamp do you use? It might need power from the built-in bias tee. Verify the voltage requirements, as the HackRF supplies 3.3 V 50 mA max.

3. Verify the transponders transmit. The transponders need 4.5 V minimum to transmit (this is a limitation of the mosfet driver used). The blinking is a good sign btw.

4. If you have access to rc3 or rc4 hybrids, you can give a try to those as well.



Originally Posted by pikwas (Post 16237228)
Hello everyone. Project is great but I`m having some troubles to get it working. I ordered transponders from JLCPCB, did compile of hex file under ubuntu next I programmed transponder with stm32 cube programmer via st-link v2. After powering up transponder blinks every second so it`s probably working properly. Next I compiled openstint under ubuntu. Nex I`m putting hackrf one to usb under ubuntu with openstint, connecting balut to hackrf and wire loop with resistor to balun as antenna. One thing which I changed is openstint is "float noise_floor = 10.0f * std::log10(noise_power) - 20.0f * std::log10(ADC_FULL_SCALE);" from log10f to log10 because problems with compiling. Could it be a reason ? I`m running openstint but I`m not getting any passes. How can I debug ? Where to search for problem ? I tried with -a -m -b -l -v parameters but with no success. Here is my output:

:~/openstint/build/src$ ./openstint
Listening on tcp://*:5556
HackRF RX: freq=5000000 Hz, sample_rate=5000000 Hz, LNA=24, VGA=24
HackRF SerNo.: 0000000000000000919068dc35943b1f
Streaming... stop with Ctrl-C
S 5019 -38.499035 2 0 0
S 10029 -38.502296 2 0 0
S 15041 -38.422245 2 0 0
S 20050 -38.551464 2 0 0
S 25060 -38.39564 2 0 0
S 30068 -38.534252 2 0 0
S 35078 -38.495895 2 0 0
S 40089 -38.576733 2 0 0
S 45099 -38.52184 2 0 0
S 50109 -38.53396 2 0 0
S 55118 -38.50404 2 0 0
S 60128 -38.711315 2 0 0
S 65139 -38.455574 2 0 0


durtman 01-21-2026 06:03 PM

It's exciting to see this project coming along, thanks for all your effort. I see you have support for windows using Zround. Registered for it a few days ago but can't download the software until "an admin" approves my account. Next Level Timing also supports Zround protocol among several others. Also seems responsive to adding hardware to their compatibility list. https://nextleveltiming.com/

I'm getting ready to buy the parts for the decoder. Banggood has the Hack RFOne for under $100. I have a couple mrt and rc3 transponders to test it out with.

I'm unsure of some things. My plan is: antenna> active SDR loop amp or 1:9 balun (both similar priced ~$12)> RFOne> - from there could I use an HP thin client running linux (i have one already collecting dust) instead of a RPi? Keep this all in a pelican case and connected to wifi. I would then be able to run timing software on a windows PC connected to the same lan ?

Regarding the OpenStint transponders, I plan on ordering them once I get the decoder working. I'll gladly share any .stls I create for 3d printed cases. Do you have any recommendations for flashing them? I figure it wouldn't be too hard to make a jig with pogo pins.

zsellera 01-22-2026 12:18 AM

HP thin client
I expect it to work; make sure you compile with optimalizations (-O2 or -O3), and it will perform nicely on older / less-capable CPUs (I'll update docs on how to do it).

Note: you can run the whole stack on a single windows laptop, the rbpi/minipc is a nice-to-have.

Active SDR loop amp or 1:9 balun
I'd prefer the active solution; the antenna *might* pick up disturbances (ie. sparking of motor commutation), and having an active device provides some additional safety. I haven't had issues with the 1:9 baluns neither so far (note though, I'm using the "clifford version" hackrfs, which have additional frontend protections).


Timing software
You can download ZRound Suite without admin approval or registration.
NextLevelTiming: unfortunately (last time I checked) it supports only serial port / usb based decoders, the TCP-based ZRound protocol is not supported.

Programming JIG for transponders:
Any contribution is welcome, and a programming JIG is a nice idea. If you share yours, I'll to link to it from project readme; or send a PR to the project having the files inside.

For now, I use pogo pins soldered to 2 mm pitch row header glued together.

durtman 01-22-2026 08:08 PM


Timing software
You can download ZRound Suite without admin approval or registration.
NextLevelTiming: unfortunately (last time I checked) it supports only serial port / usb based decoders, the TCP-based ZRound protocol is not supported.
I've tried, but the link at the top takes me to a login screen and when I try to log in, a popup with the message saying my "account hasn't been approved by an administrator" has prevented me downloading from the site. Aha, I just found the green download box at the bottom of the page.

It hadn't really occurred to me the difference in implementation of your decoder vs something like Hourglass until you spelled it out for me. I do ok following instructions but regarding hardware and software creation and implementation I'm fairly ignorant. Having now messed around with Zround, Next Level does seem rather simple in comparison. Still, I'll submit a request through their website and link your github. Maybe it'll encourage them to give your decoder a look.

I expect to have a Hackrf by mid February. I'm sure I'll have more questions. While I wait I'll try to get familiar with SDR. I'll probably order some OpenStint transponders in the next few days as well. I'm sure I'm not alone in appreciating how the affordability of this whole setup, especially sub $5 transponders, has the potential to benefit this expensive hobby.

zsellera 01-23-2026 10:29 AM

Open practice lap counter application - FYI
https://github.com/zsellera/openstint-lapcounter/ | live cloud instance

Features:
  • live laptime announcements, personal announcements
  • runs locally and optionally in the cloud as well
  • using a phone, listen to your personal laptimes live
  • practice days only
We're using this application on the practice days the club organizes, and people generally like it. As you make laps, it opens a new stint for you. If you're idle for 2 minutes, it closes your current stint, and a next lap opens a new one. When you select a pilot, you can listen to live time announcements via the web. It works from mobile phones with internet connection.

On our last practice day, this was my transponder. I set up a demo track so you can see how it works live.

The source code is available, so you can set up your own local & cloud instances as well. Although it uses the "openstint" naming, I have no long-term plans with this project. I just wanted to share it, as an alternative to ZRound practice mode.

Oldfan 01-27-2026 06:31 PM

I have successfully installed OrangePI 3b+RTL_SDR V4, but I'm having trouble connecting to ZRount. When I connect to the ZRount device, I select ZRount and set the IP and PORT. Although the connection is established, no vehicles pass by (-ID), and the connection drops after a while.
root@orangepi3b:~/openstint/build/src# ./openstint -r -g 40 -t 0.67 -p 5556
Detection threshold: 0.67
Listening on tcp://*:5556
Found Rafael Micro R828D tuner
RTL-SDR Blog V4 Detected
Device: Generic RTL2832U OEM (SN: 00000001)
RTL-SDR Blog V4 detected: using upconverter for HF (direct sampling disabled)
[DEBUG] Offset tuning ENABLED. Hardware freq: 4750000 Hz (target: 5000000 Hz)
RTL-SDR optimization: Using 2.5 MSPS hardware rate with 2:1 upsampler to reach 5.0 MSPS
Exact sample rate is: 2500000.107620 Hz
[DEBUG] Software mixer ENABLED. Phase step: -0.628319 rad/sample
RTL-SDR gain set to 19.7 dB
RTL-SDR RX: freq=5000000 Hz, sample_rate=5000000 Hz
Streaming... stop with Ctrl-C
S 1080 -inf 0 115 101
[DEBUG] Max correlation: 0.9408 (threshold: 0.67), DC offset: (0, 0)
S 2082 -45.361607 0 433 399
[DEBUG] Max correlation: 0.9440 (threshold: 0.67), DC offset: (0, 0)
S 3084 -45.361607 0 411 373
[DEBUG] Max correlation: 0.9312 (threshold: 0.67), DC offset: (0, 0)
S 4086 -45.361607 0 402 370
P 3153 AMB 4747720 -4.34 1312 0.55
[DEBUG] Max correlation: 0.9272 (threshold: 0.67), DC offset: (0, 0)
S 5088 -46.39358 0 81 69
[DEBUG] Max correlation: 0.9299 (threshold: 0.67), DC offset: (0, 0)
S 6090 -45.639183 0 326 297
[DEBUG] Max correlation: 0.9264 (threshold: 0.67), DC offset: (0, 0)
S 7092 -45.639183 0 400 371
[DEBUG] Max correlation: 0.9269 (threshold: 0.67), DC offset: (0, 0)
S 8094 -45.639183 0 402 366
[DEBUG] Max correlation: 0.9273 (threshold: 0.67), DC offset: (0, 0)
S 9096 -45.639183 0 402 362
[DEBUG] Max correlation: 0.9334 (threshold: 0.67), DC offset: (0, 0)
S 10098 -45.639183 0 403 365
[DEBUG] Max correlation: 0.9361 (threshold: 0.67), DC offset: (0, 0)
S 11100 -45.639183 0 400 374
[DEBUG] Max correlation: 0.9369 (threshold: 0.67), DC offset: (0, 0)
S 12102 -45.639183 0 407 369


All times are GMT -7. It is currently 07:40 PM.

Powered By: vBulletin v3.9.3.9 Patch Level 3
Copyright © 2026 MH Sub I, LLC dba Internet Brands. All rights reserved. Use of this site indicates your consent to the Terms of Use.