Electric orrery and mirrored-pinhole heliostat

This serves both:


Dial the control knob to the desired mode:


The calculated directions should be accurate, but the cheap stepper motors used have a lot of backlash (approximately 10 sun angular diameters), the pointer and mirror are not exactly parallel, and the initial calibration is usually rough. Pointer directions should be good to within maybe 10 degrees, and the sun reflection is kept stable within something like 10 sun angular diameters. The steppers have approximately 2048 steps / revolution, so one step is roughly 1/3 of the sun's angular diameter.


The mirror gives a good image of clouds moving across the sun, but the resolution is probably not good enough to see sunspots (at least at the viewing distances we've tried, up to 30m or so). If projecting into a darkened room, one could use a smaller aperture by blanking off some of the mirror, as in Hugh Hunt's Venus Transit setup.

Calibration and setup

The client code, pointer_aa, should build just with make. The device should be connected to the USB before running the client code.

Control-C will reset the device to its initial position and exit.

Before power-on, the pointer should be pointing horizontally due North, with at least half a turn of slack in both directions in the ribbon cable. If not, power up in Manual mode, start up the client code, use the knobs to adjust the pointer, unplug, and start again. Printing out a Google map image that shows the orientation of the building gives an easy way to orient with respect to North.

The latitude and longitude of the observer need to be set in aa.ini.

The device name of the USB serial link differs between operating systems and can vary. On an Ubuntu Linux machine it's usually ttyACMx for some number x, and the client code tries several options. On other machines this may need to be edited. To set the right permissions, on Linux one can sudo chmod 666 /dev/ttyACMx, or more permanently add the user to the dialout group with sudo usermod -a -G dialout USERNAME (and log out and in).


The device uses two cheap geared stepper motors connected to an Arduino pro micro, controlled over a USB serial link by C client code running on a PC. The client code does most of the work, using code from Moshier's aa-56.zip to compute topocentric coordinates of astronomical objects. The Arduino code uses the AccelStepper library to control the stepper motors; it also reads the knob values and discretises the control knob.


This hardware is cheap, easy to build, and easy to source, but it has several downsides:

Possible minor improvements




vertical (azimuth) axis, arduino pin to stepper controller board pin: 15 1N1 14 1N2 16 1N3 10 1N4 horizontal (elevation) axis: A3 21 1N1 A2 20 1N2 A1 19 1N3 A0 18 1N4 stepper controller power: RAW "+" red GND "-" blue potentiometers: GND pot gnd 2 3 A6 4 Azimuth 5 A7 6 Control 7 A8 8 Elevation 9 potentiometer ribbon cable, from red side: Azimuth -> 4 Control -> 6 GND -> GND Elevation -> 8 VCC -> VCC


This description, the Arduino code (pointer.ino), the client top-level code (pointer_aa.c, pointer_aa.c, pointer_aa_interface.h) and the case design (box2.svg, box2-pathed.{svg,dxf,ecp}) are (c) Peter Sewell, 2016; they are made available under the Creative Commons Attribution-NonCommercial 4.0 International Public License (CC BY-NC 4.0) (original source). The astronomy code files (the remainder of the client code) are by Stephen L. Moshier; they appear to have been placed in the public domain (November 1987 and December 1998).