![]() |
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
To start using it, the necessary steps are detailed in the project's README. In short, you'll need:
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:
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.
|
|
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 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. |
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 ? |
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. gist.github.com zsellera/5b5b2cb178dd1cdd0c35bc6f06a974b8 |
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.
|
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.
|
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, ] |
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 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. |
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 |
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. |
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. |
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. 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. |
Open practice lap counter application - FYI
https://github.com/zsellera/openstint-lapcounter/ | live cloud instance Features:
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. |
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.