Studying John van Neumann’s self-reproducing universal constructor* reminded me of some unfinished business in my earlier Cellular Automata (CA) projects. Always looking for coding challenges, I wondered if I could write a sketch for simulating self-reproducing CA loops that would fit inside an ESP32.
The general idea is to have a 2-dimensional grid of cells, each of which can be in one out of n states. These cells periodically change their states simultaneously, according to a set of rules. Each cell complies with the same set of rules, which lets it calculate its new state based on its current state and that of its direct neighbours. The way this ‘organism’ will evolve also depends on its initial pattern. A self-reproducing CA is a combination of states, rules and initial pattern that will continuously produce copies of the initial pattern, that will produce copies of the initial pattern… etc. etc.
Surely, von Neumann’s universal automaton, with its 29 possible cell states and inevitably large set of rules, would be out of ESP32’s league. Fortunately there are some famous (be it less universal) simplifications, so I started with the simplest I could find: Chou-Reggia-2.
ESP32 WROVER simulating Chou-Reggia-2 on a 320×240 display (1-pixel per cell)
The video shows the indefatigable CA at work, producing ever more copies of the initial pattern (just 5 cells). It mimics a much sought after form of life: old cells don’t die…
They’re just like kids, they grow up so fast 😉
In order to squeeze my Chou-Reggia-2 algorithm into the ESP32, I had to come up with some new programming- and storage techniques for cellular automata. I ended up writing a framework for CA sketches, that can import patterns and rules from Golly. It runs on ESP32 WROVER modules, using its PSRAM for storing a double display/states buffer. The two cores of the ESP32 cooperatively calculate a new grid state based on the current one.
Once my framework was ready for use, I could easily apply it to a slightly more complicated self-replicating cellular automaton: Langton’s Loop. It’s basically the same sketch that produced Chou-Reggia-2, only the rules and initial pattern are different.
[ After further optimization, my CA sketches run 5x faster than what is shown in the videos! ]
Close up of Langton’s Loop on an ESP32-driven 320×240 TFT display
Because every ‘cell’ is represented by a single pixel on a small 2.4″ display, I had to zoom in on the pattern in order to show the difference between ‘living’ and ‘dead’ cells (Langton’s ‘organism’ grows like coral: inner cells die, but their cell-walls are preserved).
* Von Neumann’s abstract and purely logical reasoning about self-replication eventually helped biologists to understand how (real) cells manage to make exact copies of themselves.