# introduction

This is an LED array that lights up in response to motion and sends waves across the array. The array consists of identical "units" connected in a grid, with 16 units per board. Boards are tileable to make an arbitrarily large array.

What makes this array unique is that the LEDs are controlled entirely by analog circuitry. No digital logic anywhere! (Except perhaps the switching regulators on each board.) All "computation" is done by operational amplifiers (opamps). There is no need for it to boot up or communicate with anything else, and the dimming and wave effect are completely smooth with no modulation or discrete levels.

# concept and design

A Long Time Ago(TM) I was curious about the uses of opamps. I learned that they were capable of implementing many mathematical operations, including differentiation and integration. It also happened that I had recently learned about differential equations, which can be solved by (you guessed it) differentiation and integration. Putting two and two together...

I got the idea to visualize differential equations using an array of LEDs and motion sensors driven by opamps. I wanted to create a circuit to model a physical process by solving a differential equation, like the wave equation or the heat equation. In particular, I thought the wave equation would be fun; waving your hand over the array would be like stirring a pool of water.

This idea then languished for some ten years.

## math (danger: math)

Translating a differential equation into a circuit requires some math, but fortunately it's not as complicated as it looks.

Fundamentally, a (scalar) wave exists in a scalar field - a quantity like height, temperature, or intensity that varies over space and time. This field can be described by a function u(x, t) of (possibly multidimensional) space x and time t. The wave equation describes how an ideal wave propagates in a scalar field; it is the second order partial differential equation It states that the second time derivative, or "acceleration", of the field's value at any one point is proportional to its second space derivative (roughly speaking, the curvature) at any point, with the constant c controlling the speed of acceleration and thus wave propagation.

Opamps can integrate and differentiate continuously over time, but because the array consists of discrete units in a square grid, we have to approximate the second derivative in space. There are several ways to do this. The method used here is the discrete Laplacian on a five-point stencil, which is a fancy way of saying "find the difference between a point and the average of its four direct neighbors".

Substituting the discrete second derivative and considering value at a single point, the wave equation becomes with u_1, u_2, u_3, u_4 being the values at each of the four neighbors. This is the equation that each unit solves, by integrating twice over time.

For a physical analogue, imagine a horizontal grid of point masses that are each constrained to move vertically, connected by springs. This forms a 2D discrete scalar field where the height of each point is its value. Any single point mass will remain stationary if there is no net force on it - in other words, if forces trying to pull it up are exactly balanced by forces trying to pull it down. This is the case if the height of the point is equal to the average heights of its neighbors. If a point is higher than the average of its neighbors, the springs will try to pull it down, and vice versa. The greater the difference is, the stronger the force, which is proportional to acceleration.

## theory to reality

It's relatively straightforward to put together an opamp circuit to solve the above, but the details can be tricky. After much time with circuit simulators and even more time with a few prototypes, I had a circuit suitable for production.

The circuit I came up with is a grid...