Entropy And The Arduino: When Clock Jitter Is Useful

What do you do, when you need a random number in your programming? The chances are that you reach for your environment’s function to do the job, usually something like rand() or similar. This returns the required number, and you go happily on your way.

A shift register configured as a pseudo-random number generator.
A shift register configured as a pseudo-random
number generator. [by KCAuXy4p CC0 1.0]
Except of course the reality isn’t quite that simple, and as many of you will know it all comes down to the level of randomness that you require. The simplest way to generate a random number in software is through a pseudo-random number generator, or PRNG. If you prefer to think in hardware terms, the most elementary PRNG is a shift register with a feedback loop from two of its cells through an XOR gate. While it provides a steady stream of bits it suffers from the fatal flaw that the stream is an endlessly repeating sequence rather than truly random. A PRNG is random enough to provide a level of chance in a computer game, but that predictability would make it entirely unsuitable to be used in cryptographic security for a financial transaction.

There is a handy way to deal with the PRNG predictability problem, and it lies in ensuring that its random number generation starts at a random point. Imagine the  shift register in the previous paragraph being initialised with a random number rather than a string of zeros. This random point is referred to as the seed, and if a PRNG algorithm can be started with a seed derived from a truly unpredictable source, then its output becomes no longer predictable.

Selecting Unpredictable Seeds

Computer systems that use a PRNG will therefore often have some form of seed() function alongside their rand() function. Sometimes this will take a number as an argument allowing the user to provide their own random number, at other times they will take a random number from some source of their own. The Sinclair 8-bit home computers for example took their seed from a count of the number of TV frames since switch-on.

The not-very-random result of a thousand analogRead() calls.
The not-very-random result of a thousand analogRead() calls.

The Arduino Uno has a random() function that returns a random number from a PRNG, and as you might expect it also has a randomSeed() function to ensure that the PRNG is seeded with something that will underpin its randomness. All well and good, you might think, but sadly the Atmel processor on which it depends has no hardware entropy source from which to derive that seed. The user is left to search for a random number of their own, and sadly as we were alerted by a Twitter conversation between @scanlime and @cybergibbons, this is the point at which matters start to go awry. The documentation for randomSeed() suggests reading the random noise on an unused pin via analogRead(), and using that figure does not return anything like the required level of entropy. A very quick test using the Arduino Graph example yields a stream of readings from a pin, and aggregating several thousand of them into a spreadsheet shows an extremely narrow distribution. Clearly a better source is called for.

Noisy Hardware or a Jittery Clock

As a slightly old-school electronic engineer, my thoughts turn straight to a piece of hardware. Source a nice and noisy germanium diode, give it a couple of op-amps to amplify and filter the noise before feeding it to that Arduino pin. Maybe you were thinking about radioactive decay and Geiger counters at that point, or even bouncing balls. Unfortunately though, even if they scratch the urge to make an interesting piece of engineering, these pieces of hardware run the risk of becoming overcomplex and perhaps a bit messy.

The significantly more random result of a thousand Arduino Entropy Library calls.
The significantly more random result of a thousand Arduino Entropy Library calls.

The best of the suggestions in the Twitter thread brings us to the Arduino Entropy Library, which uses jitter in the microcontroller clock to generate truly random numbers that can be used as seeds. Lifting code from the library’s random number example gave us a continuous stream of numbers, and taking a thousand of them for the same spreadsheet treatment shows a much more even distribution. The library performs as it should, though it should be noted that it’s not a particularly fast way to generate a random number.

So should you ever need a truly random number in your Arduino sketch rather than one that appears random enough for some purposes, you now know that you can safely disregard the documentation for a random seed and use the entropy library instead. Of course this comes at the expense of adding an extra library to the overhead of your sketch, but if space is at a premium you still have the option of some form of hardware noise generator. Meanwhile perhaps it is time for the Arduino folks to re-appraise their documentation.

The subject of entropy and generating random numbers is one that has appeared on these pages many times. [Voja Antonic] made a in-depth study using uninitialized RAM as an entropy source for microcontrollers. If you have an insatiable appetite for understanding Linux entropy, we point you at [Elliot Williams]’ comprehensive examination of the subject.

[Arduino image: DustyDingo Public domain]

A Stepper Motor For Two Dimensions

We’ve all heard linear motors, like those propelling Maglev trains, described as “unrolled” versions of regular electric motors. The analogy is apt and helps to understand how a linear motor works, but it begs the question: what if we could unroll the stator in two dimensions instead of just one?

That’s the idea behind [BetaChecker’s] two-axis stepper motor, which looks like it has a lot of potential for some interesting applications. Build details are sparse, but from what we can gather from the videos and the Hackaday.io post, [BetaChecker] has created a platen of 288 hand-wound copper coils, each of which can be selectively controlled through a large number of L293 H-bridge chips and an Arduino Mega. A variety of sleds, each with neodymium magnets in the base, can be applied to the platen, and depending on how the coils are energized, the sled can move in either dimension. For vertical applications, it looks like some coils are used to hold the sled to the platen while others are used to propel it. There are RGB LEDs inside the bore of each coil, although their function beyond zazzle is unclear.

We’d love more details to gauge where this is going, but with better resolution, something like this could make a great 3D-printer bed. If one-dimensional movement is enough for you, though, check out this linear stepper motor that works on a similar principle.

Continue reading “A Stepper Motor For Two Dimensions”

First Light: The Story Of The Laser

Lasers are such a fundamental piece of technology today that we hardly notice them. So cheap that they can be given away as toys and so versatile that they make everything from DVD players to corneal surgery a reality, lasers are one of the building blocks of the modern world. Yet lasers were once the exclusive province of physicists, laboring over expansive and expensive experimental setups that seemed more the stuff of science fiction than workhouse tool of communications and so many other fields. The laser has been wildly successful, and the story of its development is an intriguing tale of observation, perseverance, and the importance of keeping good notes.

Continue reading “First Light: The Story Of The Laser”

The Majesty Of Saturn’s Rings Lighting Your Abode

[Modustrial Maker] is at it again with another seriously cool LED visualizer. This time around, he’s built pair of pendant lights inspired by the rings of Saturn.

The rings are made mostly of walnut plywood using a circle router jig to make the cut easier. If you are inspired to make these for yourself, [Modustrial Maker] is clear — the order in which you cut out the pieces of the rings is absolutely critical. The pieces are glued together — with any edges sanded smooth — and edgebanding applied using a hot air gun due to the curved surface before staining. Duplicate for the second (or more if you so choose!) rings. Be forewarned — a little geometry will be needed to find anchor points that will keep the rings properly balanced.

[Modustrial Maker] suggests an off-the shelf LED controller to handle the visualizations and lighting effects, but he used an Arduino Mega clone as the brains — code available here, a MonkeyJack MAX9814 electret mic, and a four-channel RF remote/transceiver to control the different modes. Pulsing along to the music, these rings make for sleek lighting indeed.

Continue reading “The Majesty Of Saturn’s Rings Lighting Your Abode”

Mom, I’ll Be In My Attic Spaceship

Most attics sit empty or serve as storage space to keep infrequently used items out of sight. Many of us keep boxes of half-completed abandoned projects there. But some people turn the attic itself into the project: this past Christmas some very lucky children received a spaceship playroom in the attic. [Titospot] shared his project via an Imgur album.

The cramped space lends itself to the theme as real-life spacecraft have never been known for interior spaciousness. The builders are skilled enough at standard home improvement tasks of building out and finishing a room, then they took their step into the unknown by building a control panel for the spaceship.  [Titospot’s] caption text reveals some insecurity with his electronics build quality but, hey, we all had to start somewhere! Few of our first electronics projects were as much fun as his spaceship control panel. Packed with buttons and switches that trigger light and sound, it is sure to become the focus of many imaginary adventures to galaxies far, far away.

Continue reading “Mom, I’ll Be In My Attic Spaceship”

Go Retro To Build A Spectre And Meltdown-Proof X86 Desktop

[Yeo Kheng Meng] had a question: what is the oldest x86 processor that is still supported by a modern Linux kernel? Furthermore, is it actually possible to use modern software with this processor? It’s a question that surely involves experimentation, staring into the bluescreen abyss of BIOS configurations, and compiling your own kernel. Considering Linux dropped support for the 386 in 2012, the obvious answer is a 486. This supposition was tested, and the results are fantastic. You can, indeed, install a modern Linux on an ancient desktop.

This project got its start last month at a Super Silly Hackathon where [Yeo] and [Hui Jing] installed Damn Small Linux on an ancient IBM PS/1 desktop of 1993 vintage. The hardware consists of an AMD 486 clone running at 133MHz, 64 MB of RAM, a 48x IDE CDROM drive (wow!), a floppy emulator, a Sound Blaster, 10Mbps Ethernet card, and a CompactFlash to IDE adapter. By any account, this is a pimped-out rig for 1993 that would have cost more than a car at the time. The hardware works, but can you run a modern Linux kernel on it?

[Yeo] decided to install the Gentoo x86 minimal installation, but sanity and time constraints meant compiling a kernel on a 486 wasn’t happening. That was done on a modern Thinkpad after partitioning all the drives, verifying all the compilation parameters, and configuring the kernel itself. The bootloader is LILO (Grub2 didn’t work), but for the most part, this is entirely modern software running on a 25-year-old machine. The step-by-step instructions for becoming a /g/entooman on a 486 are available on GitHub.

The entire (boring) boot process can be seen in the video below. One interesting application of this build is that the 486 does not support out-of-order execution, making this completely safe from Meltdown and Spectre attacks. It’s an impressive retrocomputing achievement that right now could not be more timely.

Continue reading “Go Retro To Build A Spectre And Meltdown-Proof X86 Desktop”

Retro Rear-Projection Numeric Display Gets A Teardown

We recently featured an entertaining project here, a digital clock with a variety of different retro display technologies forming its numerals. Among those was an extremely unusual device, a rear-projection display with an array of bulbs each able to shine through a different letter or numeral slide. There was such interest in this device that its owner [Suedbunker] subjected one to a teardown for all to see.

The displays came from an organ which he suggests may have been manufactured around 1900. We suspect that may be a rather early estimate due to its use of a printed circuit board, but it is no less a fascinating device for it. A rectangular enclosure secured by twist-tabs opens to reveal a matrix of small filament bulbs on a PCB and supported by a stack of resin boards, in front of which was placed a slide with a letter or number for each one. Before that lies a sheet of glass, and then a molded plastic lens assembly which provides an individual lens for each of the 12 bulbs. When a bulb is illuminated with these in place, the letter or number is projected on the screen at the front of the unit.

It has the advantage of simplicity, no need for a high voltage, and high-quality characters and flexibility in displaying alternatives through different slides, though at the expense of quite a bulky package. The bulbs are quite energy-sapping, so for his clock he replaced them with LEDs. We like it as one of the more practical retro numeric displays, but its size means we probably won’t see a comeback.

You can see our write-up of the clock using the projection display here.