Galaxy Pattern Generator
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Avocamentum Galactica (, the
galaxy, a kinetic sculpture by Douglas Ruuska with electronics by Joshua
Krueger, features at its core a PIC18F452 microcontroller running a pattern
generator written in C. The pattern generator creates a serial broadcast that
is received by the LED drivers to produce the color effects seen across the
fiber optic stars of the galaxy's spiral arms. This project is that pattern

The star fibers are driven by 42 individually addressable RGB LEDs at 24 bits
per pixel color resolution. There are 21 RGB LEDs per arm, aligned roughly

The software project consists of two build targets. The primary target is the
galaxy's PIC and uses the serial port and galaxy hardware as the display output.
This code was written using the C90 standard (with extensions) for the MicroChip
XC8 compiler (v1.33). The secondary target was written to allow the code to be
run on a general purpose computer with an emulated output shown in a graphical
window. The build instructions in this file apply to the emulator target.

To make this project in a build directory separate from the source:

1) Extract the archive somewhere convenient (like your home directory or
  tar -zxvf galaxyEmulator-
  Or, using git (preferred method):
  git clone EmulatorTarget

2) Enter the extracted directory and make a build directory.

  cd EmulatorTarget
  mkdir build
  cd build

3) Run cmake to generate the build scripts.

  cmake ..

4) Run make to compile and link the project.


5) Once build is successful, run galaxyEmulator in the build/bin directory:



  You may need to install the following packages:
    build-essential, cmake, libsdl2-gfx-dev, git

  To do this in an Ubuntu derivative environment, run the following command:
    sudo aptitude install build-essential cmake libsdl2-gfx-dev git

When looking at this code, keep in mind that there are two build targets. 
Emulator code is demarcated in the source files using the c pre-processor
define, "EMULATOR" (source enclosed in #ifdef EMULATOR / #endif), which the
cmake build process automatically activates. It is sort of like having two
overlapping programs that share a lot of common code. The emulator outputs the
patterns to a window so that you can see a preview without needing the galaxy 
hardware on hand. I've broken the code into several files. Here is a manifest:

README.txt - This file. The project build instructions and the file manifest.

LICENSE.txt - Copyright notice and license for the project source and
CMakeLists.txt - These files contain the cmake build instructions. Don't worry
    about them unless you want to change the version numbers. - Totally unimportant. Used for versioning.

deviceConfig.h - Lots of defines for setting up the PIC hardware. Not important
    for writing pattern code.
galaxyConfig.h - Definitions specific to the galaxy. Some convenient constants
    and typdefs in here.
init.h, init.c - PIC hardware initialization functions. Unimportant.

display.h, display.c - Functions to write the pattern out to the LEDs. You won't
    need to change any of this.
master.c - Contains main(). Calls the pattern generators. You probably won't
    need to change any of this.
patternSupport.h, patternSupport.c - Contains helper functions that are useful
    in generating patterns. Currently available are:
    FadeChannel - Increases or decreases the intensity of all the LEDs of a
        given color channel.
    Shift - Rotates the color of all the LEDs up or down the arms by one step
    ColorAll - Set the color of all the pixels on the galaxy to a chosen
    GetRandomColor - Returns a random color in accordance with a selected 
    Examples of how these functions are used can be found in pattern.c
pattern.h, pattern.c - A collection of pattern generation functions. This is
    where you put your pattern code. There are 6 examples already in this
    file. Add new patterns to patternList in pattern.h to get them to run.

Pattern functions manipulate the galaxy->pixels array one step at a time. The
loop in master.c calls your function over and over again and sends the results
to the serial port (or to the emulator window) each time. The iterations field 
in the patternList tells the program how many times to call a particular pattern
function before moving on to the next one. Patterns have access to the "initial"
variable, which is set to TRUE the first time a new pattern function is called,
and FALSE every time thereafter. Pattern functions can use static variables to
keep track of state information between calls. Code pieces that you write that
might be useful for multiple patterns may be candidates for inclusion as 
functions in patternSupport.c.

The emulator timing is not exact and may be thought of as suggestive of what a
pattern might look like on the galaxy itself. When run, the emulator will print
out a list of available key-presses to the terminal window so that you'll know
how to use it.

The code, as it stands, occupies 22% of the PIC data memory (RAM) and 30% of the
PIC program space (flash). The PIC can use floating point variables and
functions, but these are very memory and CPU intensive and may not result in the
timing you desire. The PIC only has 1536 bytes of RAM, so keep in mind that
though the emulator target can compile and run anything (I personally have giga-
bytes of RAM available to it), the galaxy itself is somewhat more limited.

I built this project using the Linux Mint operating system, which is an Ubuntu
derivative. It should be very easy to get it running on any Ubuntu derivative,
and relatively easy to get it running on other popular linux distributions.
With the right software and libraries installed, you may even be able to build
it in Windows or MAC (thanks to cmake), but I have little experience programming 
for either of these platforms.

To build the code for the PIC target rather than the emulator target, I suggest
obtaining a copy of MPLAB X IDE:
as well as the XC8 compiler:
both of which are available for multiple operating systems at no charge from
MicroChip. Create a simple Microchip Embedded, standalone project with the
PIC18F452 and the XC8 compiler selected and add the source files to your 
project. There should be no special settings or flags required for compilation
in this environment. If you use a different PIC for this project, you'll find
most of the stuff you need to change in deviceConfig.h

This project's use of git and presence on github are the author's efforts to
learn to use these tools.