Low budget running timing gates (Part 1?)

I am writing today laying on the couch both a little bit sick and with a sore knee (best to double up these things up to save on recovery time right?). This does present me with an opportunity to write about my budget running timing gate project.

At large running, cycling and probably countless other events, participants are usually given a bib containing their name / race number. Inside this bib is a little UHF chip/tag which transmits as it crosses a gate such as the start or finish line. The gates themselves are usually a mat that contain the antenna within. Many races usually contain multiple gates and recently have provided websites to monitor the progress of participants throughout the event.

Timing chip on the back of a bib

Prior to messing up my knee, then falling off my bike… again, I regularly took part in a run club near me. The run involves following the river then a short city section back to the start, totalling about 7.5km. It’s a really lovely run with a small group of people. At one point we joked about people cutting one of the corners and that they would be penalised. It got me thinking - could we build a low budget gate system for fun. Even +/- 10 seconds is going to be fine for this.

So when we think about these gates there are three main components, the gate, the tag, and the server/site. I wanted this to be super low budget so for the tag I decided to pick something that we all already had - smart watches. In this case specifically Garmin, however I think this approach could work for others as well. The idea here is to set up the watch to broadcast heart rate over bluetooth. The gate would monitor bluetooth signal strength and record a crossing when the bluetooth signal is strongest.

Graph showing bluetooth SNR for two mac addresses and lap activation. The blue mac address matches up with the lap activation
Some quick tests showed that this approach was possible. The above diagram shows my signal strength (in blue) and in yellow when I pressed the lap button as I cross the gate. Someone else (red) happened to be running at the same and were accidentally included into the experiment - I guess they had heart rate transmitting turned on.

For the gate, the constraints are even harder. It needs to be installed in public space, ideally without asking for permission, not getting in the way (eg no mat), be left unattended (so not expensive if stolen/lost), have some form of live communication. My first idea here was cheap smart phones. However I had concerns about them being stolen and the cost of mobile plans. My next thought was using LoRa WAN devices. Originally I went with a LILYGO TTGO but switched to a T-Beam.

The T-Beam gives me a GPS (good for time!), WiFi/Bluetooth, LoRa transmitter, 18650 battery, and a little display for diagnostics. These are used a lot with Meshtastic folk so there’s also lots of 3d printed case designs as well.

TBeam transmitter cable tied to a chain fence

I wasn’t sure if I wanted to hide these or make them look like they belong there.

In terms of communication I’ve been using the “The Things Network”. Likely Helium network would provide more coverage but fuck crypto. As a user crosses through the gate it records the time (this is why GPS was handy) and MAC address. After a waiting period it’ll transmit the seen bluetooth mac address and the time of the strongest signal. The Things Network receives this and triggers a web hook for my API.

Fun little side note here. My backend API doesn’t have any real code. There’s no Lambda function or container running. It’s just API gateway mapping the request into a DynamoDB request.

Screenshot showing API gateway mapping to DynamoDB

Before we get too far I wanted to talk about privacy. This system doesn’t really have an opt-in function - apart from turning bluetooth on or off on your smart watch. Any Garmin MAC address detected will get forwarded over the The Things Network and to my backend. The Things Network is encrypted so other people sniffing around won’t be able to see that data. I’ve had a think about how this might be able to be improved and the best I can do is a sort of registration process, where a user might sign up and register their MAC address with the service ahead of time. Possibly even require them to register at a specific gate. Because this is just a fun little project with friends I haven’t implemented any of that, but I thought it would be worth mentioning if anyone wanted to build this into a bigger system.

4 3d printed tbeam enxclosures with antenna

So I built four of these little gates. I think four is sort of the minium you can get away with for this system. You probably need one for the start and unless your start is also the finish you need 1 for the finish. Then you need one fairly close to the start so you have an initial pace estimate (I always wondered why there was a gate really close to the start at Run Melbourne). Which leaves one more for a half way point.

Alex running in Burnley park

I haven’t had much luck with actually doing practical tests with these, but on the weekend I got the opportunity to. Alex donated her time to help me, and I even did two laps of the test course myself.

Screenshot of the website showing a table of pace times and a map showing estimated location

So this is what the website looks like after the run. While running the red marker will indicate estimated runner position and lap times are updated once received. The route is programmed in via a small JSON config file like so:

{
    "name": "Burnley Park",
    "gates":{
        "eui-70b3d57ed00687e9": {
            "name": "Start / Finish",
            "lat":-37.82511038348801,
            "lng": 145.01353745417688
        },
        ....
    },
    "route": {
        "path": [
            {"gate": "eui-70b3d57ed00687e9", "distance": 0},
            {"gate": "eui-70b3d57ed00695ea", "distance": 220},
            ....
            {"gate": "eui-70b3d57ed00687e9", "distance": 273}
            
        ]
    }
}

And a GeoJSON file is used to provide the route for the map.

As you can see the screenshot, a number of gates were missed. One of the gates had a failed battery when we went to do the test so we had to only use 3 gates. One of the gates position didn’t have any The Things Network coverage, so never reported crossings. And just to make things worse, someone parked a car right where the start/finish gate was located. This stress tested the algorithm used for lining up the gate crossings with the route - something that has taken a lot of thinking. Handling missing gate crossings can be a bit tricky to get right.

Alex and myself running in the park

Even though not many data points were recorded in this test it was still a good outcome showing that the system can work. The coverage issue is somewhat known. I was running a gateway recently but didn’t like the overall setup so I’m in the process of rebuilding it which should improve that specific test track. Looking forward to trying this on a much longer track when I’m up for long runs again.


Longest Run Gippsland 2024

Last Sunday I took part in the Longest Run Gippsland. The Longest Run is a series of unofficial parkruns (5km) at 7 different locations completed near to the shortest day of the year (usually Monarchs birthday long weekend).

Gippsland’s Longest Run 2024 started at 7am in Warragul then moved through Newborough, Traralgon, Churchill, Grand Ridge Rail Trail, Koonwarra and finally finishing on the coast at Inverloch at 4:30pm. This gives about 1 hour to complete each run and 30ish minutes to have a snack + travel to the next location.

While North Melbourne Longest run probably made more sense for me, I first heard about the Longest Run Gippsland and the concept of doing some of the parkruns that Alex had told me about sounded super appealing. The idea of getting up at 5am to be ready in Warragul did not seem like a fun idea and as Alex and Geordie would be joining in we decided to share a hotel room in Warragul for the night. Luke decided to also join us in the morning.

We would all run at our own paces. My plan was for 6min/km - much slower than many of my runs recently. I packed several pairs of running clothes however I didn’t factor in how cold it would be on the day. I really need to get a running jacket.

Myself, Alex and Geordie in the dark ready for the first parkrun

Warragul

28:27 5:41/km 24m Ascent

Group photo of all the runners at Warragul - Probably around 30 people
After an introduction to the Longest Run and a quick briefing on the course we were off. I had actually completed this course officially once before during Antennapalooza. This course does a lap of the main park before turning north past the ovals towards the end of the park and returning. The northern section is performed twice before finishing near the start line.

I completed this course a little bit faster than I wanted but still kept it pretty easy. Afterwards some bananas and corn chips were consumed. My diet that day consisted mostly of corn chips.

Newborough

28:33 5:42/km 25m Ascent

This was a lovely course. A simple double out and back along the rail trail. The approach to the rail trail followed a lovely flowing stream that just looked so gorgeous this time of year.

Once again ran a bit faster than I really wanted but still felt good afterwards. This is also the first time I met Liz. We happened to be going about the same pace and chatted throughout most of the run. While everyone during this event was so friendly and supportive Liz was next level supportive and got me through some of the later parkruns.

Traralgon

27:26 5:29/km 20m Ascent

I’ve run sections of the Traralgon parkrun before so I knew what to expect. This is another double out and back which follows the creek, however you don’t get much of a view of the creek due to the path placement. It’s a reasonably flat course. I certainly ran a lot faster than I should have, not sure if this is because I needed to go to the bathroom or because I was running with Alex.

Chomped on some chocolate along with some sugar coated nuts in the short break.

Churchill

29:48 5:52/km 46m Ascent

We only just got to Churchill in time before the “official” start. It should be worth noting that as these aren’t official parkruns there are no timers, no finish funnel, no tokens. You record your own time. This means that you can start the courses early or late. Many of the people walking the courses started them early.

Churchill caught me a bit offguard. Up until this point I had been running with my very normal, not designed for running, cotton hoodie. The combination of slightly better weather and a bit more ascent on this course meant I had to remove it mid run and the some what sharp elevation changes meant that I ended up taking two short little walking segments on this one.

The course starts by heading south down the park, u-turning then heading back north towards the very top of the park. Two laps of this are completed with the exception of the very north section. When finishing I was bit confused to find that the finish line is a short distance away from the start on the grassy section, however I think under normal parkrun conditions this would be easy to identify.

We had lunch at this point, some wraps with tabouli, corn chips, salad, salad dressing and probably some other fillings I’ve forgotten to mention.

At this point I was feeling a little tired and there was a bit of pain in my knee. I think some of the aggravation in the knee had actually come from driving segments.

Grand Ridge Rail Trail

32:37 6:31/km 30m Ascent

Selfie with Luke and Alex while holding up the Grand Ridge Rail Trail parkrun selfie border cardboard

This is a fun course. Well I think it would be a fun course in the dry. It’s a single out and back course with a slight down hill grade for the entire way out. I decided before I even started this course that I should take it super easy and walk if needed to save energy and my limbs to complete all 7 courses. The approach I ended up with was run the down hill, then walk at the turn around point for about 500m then run the rest of the return. Towards the end I was feeling pretty good so picked up the pace a bit. Felt really good.

This also marks the point where you’ve completed a half marathon worth of running - and for me that also meant the most running I’ve done in a single day.

I really want to try this course again in the dry. I felt like I spent a lot of time focusing on not twisting my ankle with the slippery mud and clay rather than enjoying the track. The other reason is that this course often only gets around 20 people attending which means I’m in with a shot for getting in the top 10!

Only two more to go.

Koonwarra

37:55 7:22/km 34m Ascent

This is a gorgeous course. Probably my favorite of all 7. I’m not sure exactly how well I would go under normal parkrun conditions as the bridges were quite wobbly and that usually makes me feel a bit unwell, but the views were amazing.

Koonwarra parkrun is an out and back starting from the town and following the Great Southern Rail Trail. The start takes you through a tunnel under the highway where you become surrounded by trees, eventually opening up in plains / farm land which great visibility across the bridges.

At this point I had pretty much hit my limit. I ran ran, walked, ran, walked, ran. Walking roughly half of the 5km. I tried to keep the walking pace fast as possible. My knee was starting to hurt a lot more. It wasn’t bad but it also wasn’t good. I didn’t want to push it.

Inverloch

36:53 7:15/km 17m Ascent

Looking back at the stats I find it hard to believe that Inverloch only had 17m of ascent. Every little up section felt like pain to me. I had a secret weapon though. A progress pride flag worn as a cape to celebrate pride month.

Me running in Inverloch with a progress pride flag worn as cape

I was pretty tired at this point and didn’t really understand the course at all, luckily I had people to follow otherwise I would have been utterly confused when I arrived back at the start line having only done 2km. The course starts in the middle and runs east, turns around back west past the start line for another 500m. Two laps are done to make the 5km.

The first 2km I ran eager to finish the final parkrun without walking but I realised quickly it was not going to happen and switched back to walking. When I reached 1km to go I decided to give running another shot and was able to complete the final kilometer running. Just.

With that it was done. 7 parkruns in a single day. Even though it was only 14°C I threw myself under the outdoor beach shower for a few minutes before changing into some fresh cloths.

I’m super happy with the outcome. I wasn’t sure if I could do all 7 but considering I was still running by the end that was a win for me. My knee was a bit sore for a few days after but it’s now good. 4 days later I did a reasonable 5km run (5:16/km) followed by a 10km PB (5:24/km) on the Saturday - so I think its safe to say that most of my body has recovered pretty quickly from what has been the most running in a single day I’ve ever done.

I’m pretty sure I’ll find myself doing another Longest Run in the future, I’m just not sure which one yet.


Melbourne (Half) Marathon 2023

Yesterday I took part in the Melbourne Marathon Festival Half Marathon. While this was my first half marathon race, this wasn’t the first time I had competed in the festival having completed the 5km event last year in 30 minutes.

Alex and I running in front of Flinders St station

When people asked if I would be entering long racers or doing longer runs I shrugged it off as it would take significantly long to train for. I started the year off training for the 5km event again.

It probably sounds a bit silly, but my original goal was for a sub 25 minute 5km. The reasoning behind this is when you sign up for the Melbourne Marathon Festival each event has two different category. For the 5km this was below 25 minutes and above 25 minutes (inverted colours). I wanted to enter for the faster speed for the event. This would require shaving 5+ minutes off my personal best.

Goal: 5km sub 25 min

With the longer and longer training runs, and completing a few half marathons for fun, I realised that I might be in with a chance for entering the festival’s half marathon in the “faster” category @ 2:10:00 - so I did just that.

Goal: 5km sub 25 min 21.1km sub 2:10:00

Then in June I broke 2:06:18 during training, followed by 2:03:46 in July. Maybe I could do even better than I expected. Could I complete a sub 2:00:00 half?

Goal: 5km sub 25 min 21.1km sub 2:10:00 21.1km sub 2:00:00

Lead up

I ended up running about 30-35km a week, along with a bit of cycling. Tapering off about 2 weeks before. I think the distance could have been longer but its what I could fit in for time and recovery. Roughly every month or two I was also doing a half marathon.

Most of my training was less about getting my cardiovascular or leggies strong enough but actually getting my back used to the distance. While I’ve found 5 and 10km runs fine, 21.1km pushes the limit of my scoliosis.

The next problem I had was shoes. This turned into quite a conundrum for me. For short runs I had been using NB 1080v12 - these were soft and nice to run in but on long runs I started getting blisters. I switched to using my NB Hierro v7 - these I found a little more firm and grippy. However the Hierro v7’s were already somewhat past when they should be replaced, and were only going to get worse. They contained no grip, and barely any padding.

Hierro shoe with back and front grips worn down flat
Trail shoes should not look like this

This lead me to go buy new shoes. I was tempted to buy another pair of Hierro v7’s, however they aren’t really the best shoes for this kind of run. I ended up purchasing a pair of HOKA Clifton 9. Initial short runs these were amazing, and set some really good times with these shoes. But I quickly discovered on long runs I got large blisters.

I was once again stuck. It was too close to race day to try more shoes, so in the end I went with the NB 1080s. Some more practice runs showed that wearing better socks, the extra wear-in, and better form made the blister problem negligible.

Unfortunately after some of my tapering period some of my runs left me with some pain and issues in my knees and ankle areas. A 2 day rest before the event seemingly sorted that out - maybe or maybe not. On the good news my HRV status had moved from bad to great over the last week.

The day

I’m not sure if it was eating in the morning or the anxiety of running a half - but my stomach was not happy. Walking to the start feeling like I was going to puke the entire way. I guess for me it was lucky that the start chaos meant a fairly slow start to the race and my stomach was able to settle in the first kilometre.

Alex had an unfortunate series of events causing her not to be able to run the pace she had planned, but luckily for me she was able to be my own personal pacer. We placed our selves just behind the official 2:00:00 pacers, but due to the slow start I lost sight of them very quickly.

I’m really glad to have had Alex with me. I didn’t quite understand the sheer number of people who I would be running with and often got overwhelmed. Having her there with me was able to keep me calm. There were around 10,000 people in the half marathon - though the course contains sections that overlap with the full marathon, adding to the amount of people.

Around the 5km mark I saw the pacers in the distance and by around the 10km mark we weren’t far away from them. We were setting around 5:30min laps - a great pace and better than I thought.

My energy/food plan was to start eating a chocolate bar around the 8km mark and eat a little bit more of it over the next 4 or so km. I had done this on previous runs and it had worked well. This plan did not go so well however. At the 7.5km mark I tried to start eating only to find that I had managed to melt the entire chocolate bar into goo. I had a little bit of it but didn’t eat any more of it after that. Given I had been calorie negative for the last few weeks, this was not good.

Alex and I running around a corner on the road
32047 did a respectful 02:00:18 and a much more consistent pace than myself

The pace started to slow and at the 15km mark we were doing 6:00min/km. I could no longer see the 2:00:00 pacers. I felt completely out of energy along with some ankle and hip pain. At 17km I walked for a short amount, and again at 19km. The desire to push through was high but I’m glad I didn’t - seeing a number of people collapsed near the finish line made me remember that it’s not worth putting yourself at that risk.

Alex and I approaching the finishing line

I was definitely at my limit entering the MCG, barely making it through the entrance, but seeing the line gave me just that little bit of extra energy to get me to the end. Alex encouraging me to pick up the pace - though I didn’t really have much left in me. We crossed the line together holding hands. An amazing event.

Alex and I crossing the finish line holding hands

Official time of 2:02:06. Not quite the planned sub 2 hour, but still a personal best and an amazing achievement for someone who had only really just completed C25K in 2022.

Selfie of Alex and myself with finishing medals post run

I’m not entirely sure what’s next - but I have something special for myself planned for December. One thought I’ve had is trying for quicker Parkruns. I know next year I’m certainly going to try and work out the pre food and race fuel stuff a bit better - my stomach is still recovering.