For the second year in a row I volunteered to design an electronic badge for theDORS/CLUC conference. The last year's badge was a great success, especially the "social quest" game, where the goal was to mingle with other attendees (or at least stand in front of them for a minute or two) in order to unlock the hidden image. So the goal was to have something similar this year but hopefully even better (this is the 30th iteration of the conference making it one of the oldest open source conferences in Europe).
The concept
During the first meeting (in February) with Andrei, Svebor and Marija, we made decisions to have some sort of treasure hunt game, to go with NFC for communication and to have some LED based display. The rest was up to me. I also wanted to have USB port in order to be able to give it some new purpose after the conference.
This year we had two "quests" and even some prizes for the winners: first one was to find the NFC tags hidden throughout the conference area and the second one was to interact other badges and have the highest badge counter.
In addition to the quests, the badge could be switched to a few different operation modes: a clock (which doesn't work properly as I forgot to put RTC crystal on the board), a simple game, and a "passthrough" mode in which the content of the badge can be set through USB connection and also all of the badge actions (button press, click, NFC tag) are printed so it can be used as a desktop notifier/action trigger (and there's a simple script in the repository monitoring the linux desktop notifications and sending them to the badge). While in the conference mode the USB connection also provides the configuration menu allowing to set some options, such as the brightness and text scrolling speed.
My first idea for the display was to simulate 9-segment display using LEDs (I also wanted to use actual 9+ segment displays but they are harder to find and either too small or too expensive for this). For the front panel/diffuser my initial idea was to have another PCB with copper and solder mask removed on both sides in the segments' area. But that turned out to be a bad idea as the light was leaking too much into other segments and it required the brightness to be much higher. But dark acrylic gave it a super cool retro look (with the downside of having to get it separately and it couldn't have as nice graphics as the PCB).
Prototype
Since I wanted to have a USB port, I needed a MCU which supports it and went with STM32L053 as they had it in stock at JLCPCB. I also found a nice LED matrix driver chip (IS31FL3731) capable of running up to 144 charlieplexed LEDs. For the NFC I went with ST25R3916 which, even though it was NRND, was available in large quantities on JLCPCB and its price was ok. Additionally, ST provides the evaluation board and demo code for it. Unfortunately, after enabling the USB and NFC stacks its turned out that I need way more flash and RAM in order to fit everything. Luckily, there's a fully pin compatible STM32L073 with a lot more RAM and flash. I odered one from Mouser to test it and it worked (actually, the one available on Mouser had 192Kb of flash, and the ones available on JLCPCB had only 128Kb which was a bit tight and I could flash it only with the optimised Release version of the firmware as the Debug version wouldn't fit).
The schematic is pretty straightforward with the MCU driving the LED matrix controller and the NFC frontend. The NFC antenna was designed with the help of ST provided calculator. The LED matrix driver contains the constant current source but since I wanted to have three LEDs for each segment I had to add a small resistor for each LED making the character LEDs quite lower in brightness compared to the green logo LEDs. Luckily, the driver allows for setting the brightmess of each LED (among some other nice features) so it was easy to set all LEDs to similar brightness.
Production challenges
Even though I did the prototype early enough, due to my work on other projects (mainly JellyfishOPP) I wasn't able to confirm the prototype functionality until the end of April. When I went to order the 100 badges for the conference there was an unfortunate surprise: JLCPCB was missing both the ST25R3916 (NFC frontend) and IS31FL3731 (LED matrix driver). And there was no more time to order it from other distributor for assembly. So the idea was to order the assembled boards without those two chips and I would solder them later. Like, how hard would it be to add two small QFN chips to 100 PCBs :). Turns out, not that hard but takes time.
So, due to some small QC delays, I received the boards on Tuesday, two days before the conference (and I already had some stuff which filled most of the Wednesday). So, on Tuesday I soldered all of the chips and then spent the Wednesday night finishing the firmware (until around midnight), flashing and testing the boards (until around 1:30), soldering the battery holders (until around 3:00), mounting the acrylic plates (until 5:00) and writing the documentation. Initially, those steps were meant to be distributed among a couple of people but due to everything happening at the last possible moment I did it all. It was an allnighter but I managed to finish everything in time.
Results
The badge again turned up as a success and attendees really liked it - all of the badges were given away/sold out on the first day. It was really fun seeing people searching for the hidden tags through the conference space. One attendee also "cracked" the game (which was actually encouraged) by figuring out the tag IDs from the firmware and using Flipper Zero to emulate them (I did add a very simple layer of obfuscation to the stored IDs in the firmware so they weren't stored as plain text).
At the end I want to give a special thanks to Goran Mahovlić from RADIONA/Intergalaktik for taking his own time to cut the acrylic plates and RADIONA for providing the laser cutter.
I'm also super proud that the DORS/CLUC organizers decided to give me the Relentless Freedom Penguin Award for my work on the badge. It's a special prize for individuals and/or groups who gave some special contribution to the conference.
Links
- talk slides: Google Slides link
- official manual: https://www.dorscluc.org/badge/
- source repository: https://gitlab.com/hyperglitch/dc2025badge