Digital dice roller
Recommendations: 392
About the Project
This is the 21st century, not the Stone Age! Still rolling little shaped bits of bone to generate a bit of randomness in your gaming? Get with the future guys!
Related Genre: Game Aid
Related Contest: Spring Clean Hobby Challenge (Old)
This Project is Active
Building the production line
Making cool stuff with technology is great fun. But often we need to make more than one of a “thing”. Which is fine. But by the time I’m hot-gluing the eighth or ninth digital dice roller, I’m starting to get more than a little bit fed up with it!
Anyway, after the new OLEDs from Amazon arrived this morning, I set about soldering up the rest of the dice roller/miniature bases.
To be honest, it does look pretty impressive, seeing all eight of them activated at the same time (the ninth is my own device, which I’ll keep for myself – I’ve yet to decide on my own name font, so it’s not shown here)
Bzzzzzzt! Who let out the smoke?
There are a few smells that are instantly recognisable. Nobody can mistake the smell of burnt toast. Hair on fire has a unique smell you can’t mistake for anything else. That hot asbestos-y smell as the clutch of your car gives out, or that acrid stench of burning rubber are other examples (laser-cut lasagne absolutely stinks like nothing else, but I’m not sure there are many people who could testify to that one).
Another instantly recognisable smell is one of burning electronics. At first, it just smells “warm”. It’s hard to describe. But it’s a smell that says “something (that isn’t toast or hair or rubber) is getting *very* hot”.
And then, inevitably, the electronic component gives up and lets all smoke out. (you know that’s how electronics work, right? Magic smoke).
It all started when when my latest order from Amazon arrived – replacement OLED/LCD screens to replace the ones that have driven me crazy over two days, by remaining resolutely hidden (despite my turning the workshop upsidedown – twice – trying to find them).
I’d already built the circuit, tested the code, made the circuit boards (the ones I ordered from China *still* haven’t turned up yet) and built a working prototype; https://www.beastsofwar.com/project-entry/1634402/ – it was just a matter of repeating a known, working sequence.
But as soon as I completed my second circuit and hooked up a battery, nothing happened – the screen didn’t light up. There was no evidence of anything actually working. I left it connected while I looked at my circuit on screen….
…. and that familiar smell of “getting hot” wafted across my desk. Sadly I was too slow disconnecting the battery – the fizz-pop as the magic smoke was released was as disheartening as it was inevitable.
This is the OLED I used for my (working) prototype:
And eventually I got the new screen working. But there was one major difference…
If you look really, really closely at the labelling of the pins you might spot that the power and ground pins have been swapped around! Which means using my original design, somewhere in the circuit, I was creating a “dead short” to ground. And that made things go fzzzt pop!
Fixing it was easy enough. But it also means I’ve had to create a second design of the PCB for these OLEDs.
All of which means, it’s time to crack out the ferric chloride again.
And that’s another of those unmistakable smells – overriding the thermostat on your tank heater to heat the ferric chloride, then forgetting about it and going for a brew in the garden for half an hour… don’t ever do that! (again).
More font images
I really liked the custom font on the first digital dice roller, and while I’m waiting for the other OLEDs to arrive from Amazon (I’m sure I bought a dozen a while back, but for the life of me, I can’t seem to find them anywhere!) I had a play about some “logos” for the other characters
I hit 1001fonts.com and simply used the preview screen to see how the names would appear in different fonts. When I found one I liked, I took a screenshot, imported into Paint Shop Pro (yeah, yeah, pipe down – some of us still us it, ok?) and resized to 128 x 32 pixels.
Then uploaded each image into an online bitmap-to-byte-array editor to generate the appropriate byte array to make it appear on the LCD
So now I’ve got all my character names drawn out as bitmaps, it’s simply a case of amending the firmware code, just prior to uploading each one to the microcontroller(s).
But of course, until those other OLED/LCD screens arrive, there’s not really much to test….
First full test - success!
I decided on some last-second changes to the code before committing to the circuit board (it’s easy to change the code on an Arduino prototyping board, but less easy to do on a custom PCB with “raw” AVR atmega328 chip with none of the serial programming pins exposed).
I thought it would be cool to personalise the displays for each of the characters. So I grabbed a few free fonts and played about making a “logo imge” for each of the character “toppers” for the dice roller devices. I created an image of the character name then, using an online bitmap-to-byte-array tool, I created the code to make a different name display on each separate device.
To conserve battery power, each device goes into “deep sleep” after a period of about two minutes with no activity. To wake the device up (and activate the screen when it’s showing blank) simply bang it down on the table!
(the shutter speed of my phone camera means you can see the scan-lines being drawn on the OLED as it refreshes: these are not evident in the actual device!)
This is the base for “The Pastel Raven”. I forget which font was used, but the end result – I think – looks pretty nice!
To roll your dice is easy – simply tap the base onto your desk or tabletop once for for D6 or twice for two.
But what if you’re one of those quirky D&D players who insist on using D10s or percentile dice? We’ve got you covered:
Three taps on the base and the dice go out – chaning the set-up from D6 to D10. Now, when you bang it down, once rolls a single D10 and twice rolls two D10. Let’s not get into the whole argument about how to read percentile dice here and who is and who isn’t doing right or reading it wrong…. that can be for another day – this is supposed to be a bit of frivolous fun, right?!
And, to be honest, if D10s are going to get you all hot and bothered, simply bang the thing three times once again, and it’ll revert back to D6.
Now all I need to do is make another seven of these and glue the miniatures on the top…..
Crack out the ferric chloride!
While everything had been proven on the breadboard and the code tested to destruction, it was finally time to push everything together and see if it actually worked as a final, completed, assembled “thing”.
Which meant home-etching a few PCBs to try things out (the PCBs I’d ordered from China are still nowhere to be seen – perhaps stuck onboard a ship wedged horizontally across the Persian Gulf I’ve no doubt).
So I dropped the PCB layout onto my laser cuttter and etched the car-paint mask off the copper clad surface and threw it into some heated ferric chloride. The result was a nice, shiny-looking circuit board:
Using a fine soldering iron tip, some tweezers, and some ever-handy blue-tack (to act like a third hand and hold everything in place) I soldered the AVR microcontroller onto the PCB and added in the 1206-sized discrete components
Then I jammed the whole lot inside my 3d-printed enclosure and filled with copious amounts of hot glue, to stop anything from moving around inside. The piezo was hot-glued to the underside and the device then plugged in to a phone charger (micro USB, 5v) supply and left for an hour or so to fully charge up.
Lloyd Shot
Brother Lloyd gets the full Horatio treatment with this mini. I mean, I can just about understand the bard/troubadour reference. But the James-Hetfield rock-star pose, I’m less sure about?
TGU3
Another member of the team often overlooked, is the half-man-half-computer-brain that keeps the website and all the clever tech running, Tom.
I reckon Tom does dream of electric sheep. I reckon he closes his eyes and constantly has to remind himself:
01001001 00100000 01100001 01101101 00100000 01101110 01101111 01110100 00100000 01100001 00100000 01110010 01101111 01100010 01101111 01110100 *
They say you should add a “back story” to your miniatures, to “bring them to life” on the tabletop. I had the opportunity to design this miniature (Horatio Noseblower having designed the rest of the gang) so I thought I’d design him with a backstory in mind.
See, it’s a Friday night, it’s around 10pm and Tom is already on his way out to the local nightclub (that explains the hotpants and the dog collar at least). But he’s had a last-second call from OTT Towers – there’s a server down and nobody can access the latest weekender video! So Tom grabs his laptop, his futuristic no-brand Android tablet, rucksack filled with wires and test equipment and a dirty great big spanner to give something a whack, when all else fails.
Don’t let the shy demeanour fool you – they say it’s the quiet ones you need to watch…
*clever you, if you deciphered the message!
Tank Boy John
Poor old John is often missed out or forgotten about, simply because he doesn’t get as much screen time as the others. So I was determined not to miss him out.
Due to the lack of screen time, I also don’t really know much about John. Other than he really likes tanks. And almost every time I see him, he has a respirator clamped to his face, like some face-hugger out of Aliens, and there’s always an airbrush never too far away…
Originally this mini had a quill in his hand; I hacked it about in Blender to create a rudimentary airbrush, then built a compressor out of cubes and cylinders. I’ve yet to decide what to use for the hose between the two (or – like the bow strings on elven archers – even whether to bother including it at all!)
Brother Badger
Contrast paints do a lot of heavy lifting in my painting. But that’s not to say it’s a case of slap it on and call it done. I still like the look of a neatly edge-highlight-ed model, and the slightly cartoon-y look of a high-contrast colour scheme.
I’ve spent years trying to improve my painting technique yet every time I finish a model, it’s clearly “one of mine”. Even my wife noticed it – in a display of different miniatures, she says she can always pick out the ones I’ve painted.
I spent ages trying to “lose” my own style – feeling that it should be “better” somehow – the contrast higher, the blends smoother, the details more detailed, the colours more exciting…..
In the end, I’ve finally learned to accept my painting style. It’s not the best in the world. But it’s noticeably “me”. In any other endeavour, to have your own recognisable style would be great. As a guitar player, I’d love if people heard my playing and could immediately tell it was me. As an artist, to paint a picture and know others could recognise the brushwork would be delightful.
So I’ve learned to accept (if not yet fully embrace) my own painting style for miniatures and stop trying to replicate someone else’s style.
I think this model of Badger Ben is typical of my current style of painting; zenith primer, slap on some contrast paint, get the eyes done, a t-shape for the nose, upside-down triangles for cheeks, a bit of edge highlighting and on to the next one!
The Girthy One
Sometimes you don’t question why, and just get on with the job you’ve been given. I felt a little bit like that while painting up Horatio’s personal visions of the OTT crew.
I’m not sure about the fetish for loin-cloths and topless heroes. But those were just the designs I had to work with, so set about painting what I’d been given!
The Pastel Raven
Free is a relatively new member of the team but is already a regular part of the weekender team. It seemed churlish to leave her out and the thought of her bravely smiling at everyone else as they opened their “gifts from afar” was just heartbreaking.
So behind the backs of the others, I told Free what we were up to, and asked her to provide an idea of what she’d like as a mini-me. More than just an idea, she replied with an .stl file attached to an email.
Biker jacket? Dr Martens boots? Tiny raven? Check, check, check!
The Squirrel Master
I scaled this model up to about 120% to accurately portray the fact that this character is meant to represent a 6′ 7″ hairy giant.
Unable to decide whether to go with grey or red squirrels, I decided to take the cowards way out and paint one of each.
Captain Alpha Strike
I never again want to see, let alone paint, another character in Space Marine-type armour, after painting all these panel lines!
Adding the "toppers"
Of course, there was always going to be more to this project than just some boring old electronics. The whole point of creating an enclosure with a 35mm diameter was so that it could act as a “plinth” for a beautifully painted miniature on a 32mm base.
Not only is this an electronic dice roller, but can be a “mascot stand” for players in their D&D campaigns or simply a little something to place on the tabletop to intimidate their opponents (while wow-ing them with techno-cool at the same time).
In fact, the entire project was designed, from the very start, as a collaboration with OTT member Horatio Noseblower to create something cool for a series of miniatures he’d designed on the Hero Forge website.
A few months earlier, I’d printed off a load of miniatures and posted them to the USA for him to paint – the idea being that while he was painting the minis, I would make the bases for them to stand on, completing a cool inter-continental, global members collab. as gift items for the OnTableTop crew.
Here’s “Captain Alpha Strike” in his 3d rendered form.
The months passed by and things went a little quiet on the US front. So while I was waiting for the custom PCBs to be delivered (thanks to a global pandemic, and the disaster-that-nobody-wants-to-talk-about-any-more that is Brexit, things seem to take an awful lot longer to arrive in the UK from anywhere “overseas”) I took to printing out duplicates of Horatio’s miniature designs and cracked out the paints…
Fitting it all together
Speaking of enclosures, after a quick rinse and final cure, my first three enclosures were ready.
Everything looks quite promising at this early stage….
….but I’ve yet to work out what happened to my letter ‘E’ or the OTT logo? Maybe there were some inverted normals or something?
I’ll have to get those sorted out before the next print run! In the meantime, I might try painting them in on these and hope nobody notices!
One thing I hadn’t noticed was that a lot of phone chargers now have quite chunky plugs on the micro USB end. And I’d only allowed for a small hole on the side of the enclosure to plug the charger into. I needed to modify the battery charger so that the micro USB plug didn’t sit “behind” the wall of resin, so that a charger would actually plug into the socket.
A bit of clumsy knife-work and a bit of filing later, and it was a nice, snug fit.
The little lip I left in the bottom of the enclosure….
….seats the piezo sensor just perfectly!
Making the controller board PCB
While the enclosure was printing, I set about designing the controller board for the LCD.
It’s really little more than an AVR chip with the diode and resistor from the earlier piezo schematic, a decoupling capacitor (to provide a steady supply voltage) and a 4-pin connector to join it to the LCD pins.
The whole thing fits onto a tiny PCB smaller than the actual LCD controller board, so I’m pretty confident that everything is going to fit inside the enclosures…
Creating an enclosure
The first thing to do is to measure up our components to work out how large a void we need to encapsulate our all electronic gubbins. From here we can work out how small we can make the enclosures.
Our components basically consist of an LCD (bottom) a 100mAh lipo rechargeable battery (middle) a USB charging circuit (top) to safely recharge the battery from any mobile phone type charger, and the control circuit (an Atmel AVR TQFP chip on a custom circuit board – not shown)
Taking these measurements, I drew a basic cube shape in Blender (to indicate the void space needed) and expanded it a bit.
Then I added various cubes and cylinders around it, and used multiple “boolean” operations to create a simple shape that could be 3d-printed on my AnyCubic Photon resin printer (the fdm-printer is currently being rebuilt).
Lastly, I drew the OnTableTop logo in Inkscape and extruded it as a series of 3d shapes, to recreate the logo on the front of the enclosure shape
Then it was off to the printer! And a four-hour wait while three of these things slowly emerged from the vat of gloop…..
Testing our dice roller
Here’s a demo of our electronic dice roller. The device has the piezo sensor connected to an “external interrupt” pin which can be used to wake the microcontroller from “deep sleep” (this means that after a period of inactivity, the device can shut down to conserve battery resources, but doesn’t need to be switched on or off via a switch between uses).
The basic premise is this:
When the interrupt first happens (the piezo is tapped) a timer is set running. If a second tap is detected before this timer hits 500 milliseconds, the device knows to roll two dice; if no second tap is detected, a single dice is “rolled”.
To roll the dice, a pseudo-random number is generated.
Within the Arduino library exists a pseudo-random number list; it’s basically a set list of numbers and each time you call the rand() function, the next number off the list is returned. Not so random, huh??
So whenever a dice roll is required, we sample the (floating) voltage from a disconnected pin and use this, along with the number of milliseconds that the device has been running, to determine where in this list of numbers we draw our next value from.
Since the analogue voltage on a disconnected pin is basically picking up atmospheric static, this means our seed number will always be some kind of random value; but even if perfect atmospheric conditions existed, and this value could be determined, by using the “milliseconds since start” it’s almost impossible to predict the starting point in the random number list – thus ensuring that the dice roll value returned is more or less truly random.
Now we’ve got it working, it’s time to miniaturise everything and try to squeeze it into an enclosure.
Let's see what we're doing
“The internet” is awash with cheap electronics components. If you know what you’re looking for, of course. And I’ve already had experience of working with some tiny little LCD screens but had a real time finding them. Until I stumbled upon the correct search term – “oled spi” and “oled i2c” (I forgot they’re oled, not LCD).
These little things are brilliant for displaying small amounts of data (I used to use them to display the IP address of internet-connected cameras) and, thanks to the user-friendly Arduino libraries, are really easy to interface with.
Using just two wires (plus power and ground) and the Adafruit_SSD1306.h library, it took just ten minutes to get some custom text to appear on the LCD screen.
And then not really that much longer to embed my own bitmap code, to create pretty pictures too…
And just like that, all the pieces were suddenly in place for creating a tap-to-active dice roller.
I could create the bitmaps I wanted, I could get them to display where I liked on the screen, and I had a tap-to-trigger input system that I could use to tell the device when I wanted another number selecting.
Refining the design
Now, we’ve got a fully protected, give-it-a-whack-to-create-a-digital-signal system here. And if we feed this voltage signal into a microcontroller, we can use it as a trigger (in this case, to say “hey, generate another dice roll, will you?”)
But there’s just one other thing to consider – remember that graph showing the output of a piezo when you give it a wallop?
We’ve filtered out the negative voltages. And we’ve clipped the input voltage so it can’t exceed 5V. But there are still lots of signals, each getting smaller as the signal decays, all in very close proximity to each other.
We can get rid of these by introducing a “sensitivity filter” – simply put, we can connect the lead with the generated voltage in it back to ground, through a resistor.
The smaller the resistor, the more easily current can flow through it – so a small resistor means that you need to give the piezo a real whack for any of the voltage to reach our microcontroller input (since the generated voltage would much prefer to go to ground that through a whole series of transistors and complicated logic gates that makes up a microcontroller).
A large value resistor makes current flowing through it difficult, so some of the signal will go to the microcontroller and some of it will pass through the resistor to ground. The larger the value, the more of the signal reaches the microcontroller. The smaller the value, the more of the signal just gets dumped to ground.
In practice a resistor of about 300K (300,000 ohms) is a nice “filter”. It means that a large part of the first, largest “wave” from the generated voltage reaches the microcontroller input pin. But the smaller “ripple” waves pass more easily through the resistor and dissipate to ground.
A resistor of 100K would still work (but it means you have to give the piezo a real clatter for any of the generated voltage to reach the input pin). It effectively “deadens” the piezo as a voltage generator. A resistor of 1M (1,000,000 ohms) means that most of the signal reaches the microcontroller, so the piezo is very sensistive (and creates a lot of signal voltage, even from a very small tap).
Now we could just choose a resistor value, through trial and error, and hope that everyone taps the piezo with a similar amount of force to activate it. And this would be a perfectly acceptable way to proceed.
But to just refine our design that little bit further, we can replace the fixed value resistor with a variable resistor or potentiometer.
This provides a means of changing the amount of resistance cross two terminals, allowing the end user to set their own preferred degree of “sensitivity”. Giving us our final piezo-input circuit: