Micro Measurement Display 1 (µMD1)

Installation and Operation Manual

Version 1.34 (7-Jan-2016)

Copyright © 2015
Sam Goldwasser and Jan Beck
--- All Rights Reserved ---

For contact info, please see the Sci.Electronics.Repair FAQ Email Links Page.

Reproduction of this document in whole or in part is permitted if both of the following conditions are satisfied:
  1. This notice is included in its entirety at the beginning.
  2. There is no charge except to cover the costs of copying.

Table of Contents


Author and Copyright

Author: Samuel M. Goldwasser

For contact info, please see the Sci.Electronics.Repair FAQ Email Links Page.

Copyright © 1994-2016
All Rights Reserved

Reproduction of this document in whole or in part is permitted if both of the following conditions are satisfied:

1. This notice is included in its entirety at the beginning.
2. There is no charge except to cover the costs of copying.


µMD1 is intended for use in hobbyist, experimental, research, and other applications where a bug in the hardware, firmware, or software, will not have a significant impact on the future of the Universe or anything else. While every effort has been made to avoid this possibility, µMD1 is an on-going development effort. We will not be responsible for any consequences of such bugs including but not limited to damage to the wafer FAB you picked up on eBay for $1.98 + shipping, financial loss from excessive use of ABS due to the office 3-D printer fabricating a part 25.4x too large, or bruising to your pet's ego from any number of causes directly or indirectly related to µMD1. ;-)


Thanks to Jan Beck for selecting the chipKIT DP32 and writing and testing initial versions of the firmware and GUI. And for getting me interested in actually getting involved in this project. If anyone had told me six months ago that I'd be writing code in C, MIPS assembly language, and Visual Basic - and enjoying it (sort of) - I would have suggested they were slightly nuts. ;-) Jan maintains the master GUI source code as well as slightly different versions of the firmware and a development blog on the development of this overall project. Links to his Web information may be found under References.


µMD1 is an inexpensive system for precision readout in metrology applications based on two-frequency HeNe laser interferometry. While targeted for experimenters, hobbyists, and researchers, there is no reason why µMD1 can't also be of value in science and industry. The hardware platform is a readily available inexpensive microcontroller development board which communicates via USB to a Windows PC, laptop, netbook, or tablet.

Typical Interferometer Setup using µMD1

Note that µMD1 refers specifically to the combination of the chipKIT hardware and firmware. It's possible there could be µMD2, µMD3, .... µMDn in the future using the same GUI. :)

This document provides installation and operating instructions for the µMD1 hardware and software. It is assumed the reader is familiar with two-frequency interferometry in general as well as HP/Agilent/Keysight lasers and interferometer optics. If not, back up and start with Sam's Laser FAQ: Interferometers Using Two-Frequency Lasers and Hewlett-Packard/Agilent/Keysight Stabilized HeNe Lasers.


Specifications are subject to change without notice. :-)

Electronic Parts List

The following are the components required to put togetner a basic system (no environmental sensors or multiple axis support). All are available from major electronics distributors like Digikey and should total no more than around $30 to $35.

Parts for single axis system without environmental sensors

Typical headers are AMP MTA-100 series, though similar parts are available from Molex and others. And you're perfectly free to use your own favorite parts for these, or wire the cables in directly.

For a system with 2 or 3 axes, double everything associated with the RS422 receivers.

Here is the schematic for both along with the optional environmental sensors. Only the top circuits using U1 are required for a single channel system:

µMD1 Interferometer Signal Inputs and Sensors Schematic

The only jumper that should remain for a system without environmental sensors is the one on JP7 in the lower left of the photo, above.

For remote environmental sensor support, the following are required.

The only reason the 5 and 6 pin headers are listed for these is so they will be different than the 4 pin headers for the interferometer signals and prevent accidental wrong connections. The headers and connectors can be omitted entirely if the sensors are mounted on the chipKIT board or cables can be soldered in permanently.

Note that "BMP180" actually refers to the itty-bitty sensor module itself. You really don't want to deal with that. :) Thus, it is usually provided soldered to a small PCB with the required support circuitry. There ere are at least two versions of this PCB. One has a built-in 3.3 V so it can run from 5 VDC power. Both are shown in the schematic but only one of them is needed. :) Either can be used here since we have both 5 V (VIN) and 3.3 V available. Important: There are at least two different pinouts for the 5 pin version and yours may not agree with the photo, below. Adjust pin connections accordingly.

These sensors are available on eBay and many other sources. On eBay, the BMP180 PCB without regulator is going for less than $1, the AM2302 for around $3.

chipKIT DP32 Jumper Settings

Remove all jumpers and reinstall one on JP7 between the pins labeled "VBUS". This uses the USB bus for power. Even with all options, the current available from USB should be adequate. If the environmental sensors are used, install jumpers at locations JP4 and JP5.

chipKIT DP32 PCB Board Top View (Signal Labeling)

For a single axis system without environmental sensors, the only jumper that should remain is the one on JP7 in the lower left of the photo, above.

Wiring the chipKIT DP32 Board

This will require a low power soldering iron (preferably grounded and temperature-controlled) and rosen core solder. Your 250 watt Weller soldering gun or propane torch is NOT appropriate. ;-)

Pins on the UA9637/9 DIP are numbered counterclockwise as shown below, or starting at the dot or dimple if your part doesn't have a notch.

Pins on the chipKIT board are labeled on the silkscreen but there are at least two different revisions and the numbering isn't the same!

   Pin   Arduino Labeling   Signal Labeling   Signal Name
  J3-1           0               RB5             RPB5
  J3-2           1               RB7             RPB7
  J3-3           2               RB8             RPB8
  J3-4           3               RB9             RPB9
  J3-5           4               RB10            RPB10
  J3-6           5               RB11            RPB11
  J3-7           6               RB13            RPB13
  J3-8           7               RB14            RPB14
  J3-9           8               RB15            RPB15
  J3-10          -                -                -
  J3-11         3.3V             3.3V            3.3V
  J3-12       VIN (5V)         VIN (5V)        VIN (5V)
  J3-13         GND              GND             GND

  J4-1           9               RA0             RPA0
  J4-2          10               RA1             RPA1
  J4-3          11               RB0             RPB0
  J4-4          12               PGC (RB1)       RPGC (RPB1)
  J4-5          13               RB2             RPB2
  J4-6          14               RB3             RPB3
  J4-7          15               RA2             RPA2
  J4-8          16               RA3             RPA3
  J4-9          17               RB4             RPB4
  J4-10         18               RA4             RPA4
  J4-11         3.3V             3.3V            3.3V
  J4-12       VIN (5V)         VIN (5V)        VIN (5V)
  J4-13         GND              GND             GND

The numbers refer to standard Arduino signal "pin" designations while the RPBs refer to DP32 PORT A or B bits. The photo of the chipKIT board, below, has the Arduino designations. This is revision C and is what Digkey has been shipping. It also has the power LED, so perhaps that's an addition. :) The relevant board wiring is the same for the two versions, it's just the silkscreens that differ. But there are apparently older versions that may not be the same.

Note that the jumpers on JP7 are NOT in the correct position for our needs in the photo below.

chipKIT DP32 PCB Board Top View (Arduino Labeling)

CAUTION: Most PIC pins are NOT 5V tolerant - they will be unhappy if a 5 V signal is connected to them directly. Thus VIN (5V) or any signal that may go higher than 3.3V should NEVER be connected to them, even for an instant. Bad things may happen. 3.3V is acceptable through a current limiting resistor (just to be doubly safe, for the micro that is). Hooking raw power to what may be a logic output (accidentally or otherwise) is never a good thing! P.S. "Unhappy" and "Bad things may happen" could mean that you'll ruin the PIC chip.

  1. Install the 8 pin socket in any convenient location (though a suggestion is shown below). Orient it with pins 1-4 facing the DP32. Take note of the rows of pads that are connected on the PCB as indicated by white boxes surrounding them. These can be convenient to minimize jumpers and for common wiring, but may be confusing to the uninitiated. If using them, a recommended location for the DIP is near the middle of the area with connected pads straddling the long strips for power and GND. Note that the GND, 3V3, and VIN labeling apply ONLY to the single pads of J3 and J4, not the boxed in connected pads near them!

  2. Vcc (pin 1) goes to a VIN pad.

  3. GND (pin 4) goes to a GND pad.

  4. The four 150 ohm RS422 terminating resistors go between 1IN+,1IN-,2IN+,2IN- (pins 5,6,7,8) and GND pads.

  5. REF and ~REF input pins to 2IN+ and 2IN- (pins 6 and 5) respectively. REF Return to GND*.

  6. MEAS and ~MEAS input pins to 1IN+ and 1IN- (pins 8 and 7) respectively. MEAS Return to GND*.

  7. 2OUT (pin 3) goes to a 150 ohm resistor. The other end of this resistor goes to a 330 ohm resistor and its other end goes to GND. The junction of the two resistors is the REF clock signal and goes to pad RPB5. This voltage divider assures that the standard TTL output of the line receiver provides a 3.3 V compatible signal. (The destination may change so confirm prior to wiring.)

  8. 1OUT (pin 2) goes to a 150 ohm resistor. The other end of this resistor goes to a 330 ohm resistor and its other end goes to GND. The junction of the two resistors is the MEAS clock signal and goes to pad RPB0. This voltage divider assures that the standard TTL output of the line receiver provides a 3.3 V compatible signal. (The destination may change so confirm prior to wiring.)

* It's usually not necessary to run the REF and MEAS Return (RET) signals to the board even if there is no common ground connection between the chipKIT board, and laser and interferometer optical receiver(s). The terminating resistors will provide the ground reference. In fact, under some conditions where everything is tied together with a common ground, the RET connections could add noise due to a ground loop. The line receivers only care about the difference between the REF and ~REF or MEAS and ~MEAS voltage levels as long as the absolute voltage levels are within their common mode and absolute voltage specifications. For cables of a few feet or less, it's almost certain connections are required to the Returns. But for long runs, shielded cable or twisted pairs may be desirable. This won't apply to most hobbyist/experimenter applications. :)

The graphic below shows a suggested layout for the line receiver, the required resistors, and the jumper location. 4 pin headers are shown for REF and MEAS. Their presence and type are optional but the use of some type of connectors is recommended. This view is of the bare chipKIT PCB as it would look with no other parts present. It's then easy to follow the copper traces should you so desire. ;-)

chipKIT DP32 PCB Board Pattern with Suggested Parts Layout

(If constructing a multiple axis system and/or one with environmental sensors, there is more below on the suggested layout.)

For those not familiar with the common resistor color code (Black/0, Blown/1, Red/2, Orange/3, Yellow/4, Green/5, Blue/6, Violet/7, Gray/8, White/9), the resistors shown above are 150 ohms (brown-green-brown or 15 with 1 zero) ohms and 330 ohms (33 with 1 zero) ohms. The gold stripe indicates 5 percent tolerance on the value but for the use here, tolerance doesn't matter. (It's possible the resistors you use will have 4 stripes where 3 of them are the value and the 4th is the multiplier, along with one for tolerance. If in doubt confirm the value with a multimeter.)

For a 2 or 3 axis system, especially if adding environmental sensors, it may be desirable to squash this layout somewhat to make space for a second dual line receiver. This can be done easily by standing up some of the resistors. And/or use a quad line receiver chip. However, the layout below which replicates the pattern for a second RS422 line receiver will work. But note that most of the pads used by additional parts are NOT bussed so interconnecting them will have to be done by running jumper wires.

For the environmental sensors, the diagram shows headers to attach extension cables so that the sensors can be mounted close to the interferometer setup. It is also possible to mount them on the chipKIT board directly in place of the headers. But generally, the sensors should be located where the relevant environmental consitions are present, though only the temperature is at all likely to differ, and possibly be affected by the (very slight) power dissipated on the board. (Unless your interferometer is in a vacuum chamber!) The signals are all low frequency so a reasonable cable length can be used without concern for shielding, crosstalk, or frequency response. But using twisted pairs is probably prudent for anything longer than a few feet. Also note the additional jumpers at JP4 and JP5.

Once the board has been wired, mounting it in such a way that the bottom can't touch anything and short out is highly recommended. Use standoffs in the four corner holes or something similar, and an insulating sheet under it.

Much more on the details of the board can be found in the Diglent chipKIT DP32 references, below.

chipKIT DP32 PCB Board Pattern with Suggested Parts Layout for Multiple Axes and Environmental Sensors

Important: There are at least two different pinouts for the 5 pin version of the BMP180 and yours may not agree with the photo, above. Adjust pin connections accordingly.

Computer and Operating System Requirements

Everything that follows assumes the use of Windows. If you're smart and run Linux instead, sorry. ;-) MPIDE, UECIDE, and the µMD1 GUI are known to work under Win XP, Vista, 7, and 10, and should be fine on Win 8 as well. Microsoft Net Framework 4.0 or higher is required to run µMD1. Net 4.0 or a more recent version is probably on your computer already but is available free from the Microsoft Web site.

Latest Versions of the Firmware and GUI

Updated versions will be coming soon. :) In the meantime, if you can't wait, these should work:

Here are the DP32 Timer designations, select bits, bus addresses, and pin assignments for the interferometer input signals:

   Input   Counter   TxCKR    Bus Address    Pin    Signal   Notes
    REF    Timer3    0b0001   0xbf800A10    0/RB5    RPB5
   MEAS1   Timer5    0b0010   0xbf800E10   11/RB0    RPB0    LED4
   MEAS2   Timer4    0b0100   0xbf800C10   13/RB2    RPB2    LED2
   MEAS3   Timer2    0b0001   0xbf080810   14/RB3    RPB3    LED1
("x" designates the selected Timer.)

Most of these details are really only relevant if there is a desire to modify the firmware, which is not advised since no support will be provided if even 1 character in a comment field is changed without prior approval from µMD1 Central. :) This approval process normally requires a minimum of 3 years, 7 months, 24 days, 11 hours, 35 minutes, and 22 seconds, but often takes a lot longer. :-) For wiring using the firmware provided, only the pin assignments matter.

Depending on how the line receivers decide to behave in combination with the laser or optical receiver when there is no signal, the LEDs may provide an indication of MEAS signal status, though they do not appear to respond to MHz frequencies. The reason the LEDs are on the clock inputs is that there are only a very limited of pin/Timer combinations that are available and using those with the LEDs results in the fewest conflicts.

Note that if updating firmware, the GUI may also need to be updated and vice-versa.

Here is the communications format between the firmware and GUI. This information is of little relevance if using the GUI, but will be useful if writing your own application software or for data analysis. Each of the values is sent as an ASCII string representing a signed (if needed) decimal number separated by spaces at the sampling rate. The firmware maintains a FIFO buffer so that if the USB data is delayed for some reason, no data should be lost (hopefully):

 Standard (Single Axis) Data (8 values):

   0: REF Frequency Count = REF frequency/Sample Frequency
   1: MEAS Frequency Count 1 = MEAS 1 frequency/Sample Frequency
   2: Displacement 1 ( in 1/2, 1/4, or 1/8 wavelength)
   3: Velocity Count 1 = (Displacement 1 - Previous Displacement 1)/Sample Frequency
   4: Phase 1 = Signed fractional offset between Displacement increments * 256

      If Phase is not valid, then an error code is sent instead:

        0x200 = no counter 1st REF
        0x400 = no counter 2nd REF
        0x800 = no counter MEAS 1
        0x1000 = no PORTB 1st REF
        0x2000 = no PORTB 2nd REF
        0x4000 = no PORTB MEAS 1

   5: Sequence Number (Unique serial number for each sample)
   6: LowSpeedCode (See below)
   7: LowSpeedData (see below)
   The following 8 values will also be sent when Multiple Axis Mode is active:

   8: MEAS Frequency Count 2
   9: Displacement 2
  10: Velocity Count 2
  11: Phase 2
  12: MEAS Frequency Count 3
  13: Displacement 3
  14: Velocity Count 3
  15: Phase 3

  LowSpeedCode (specifies contents of LowSpeedData):

     0-99: GUI Data/Control:

      0: No Data
      1: Laser Power
      2: Signal Strength
      3: Temperature 1 (XXX.YY, °C, 0 to 70.00)
      4: Temperature 2 (XXX.YY, °C, 0 to 70.00)
      5: Pressure (XXX.YY mBar, 500.00 to 2000.00)
      6: Humidity (XXX.Y percent, 0 to 100.0)

      8: Sample Frequency (XXX.YY Hz, default is 610.34 Hz)

     10: Firmware Version (XXX.YY)

     (Not all of these are currently implemented.)

   100-199: Diagnostics

   200-255: Reserved

Installing the chipKIT DP32 Device Driver

Before the chipKIT board can be used, a Windows device driver must be installed. The Digilent chipKIT Quick Start Guide recommends MPIDE for the firmware development environment, which includes the device driver. Unfortunately, while its device driver is fine, versions of MPIDE we've seen so far have serious bugs in the libraries and c compiler, and it is thus NOT recommended for anything. :( :) The MPIDE references at the end of the manual are for, uh, reference only.

Installation of the device driver, which should be performed before the board is plugged in, can be done in several ways without using MPIDE. (1) is the simplest:

  1. Download and run the chipKITDriverInstaller_v10.exe file from chipKIT.net New Signed USB Drivers. chipKITDriverInstaller_v10.exe is a self extracting executable, which will extract the actual driver files and an installer application (USBDriverInstaller.exe) into the same directory as itself, and then launch the installer application.

  2. chipKITDriverInstaller_v10.zip can be downloaded from the same Web site, unzipped, and run manually if you feel more comfortable doing it that way.

  3. Search for, download, and save Stk500v2.inf, which is really the only file that Windows needs. You can point Windows to that inf file if you want to manually install the drivers at any time. Stk500v2.inf is available from several Web sites.

Once the driver has been successfully installed, plug the chipKIT board into any available USB port. The red power LED (if present) should come on. (Not all versions of the chipKIT DP32 have one; apparently someone decided to save 1/10th of a cent on an earlier or later revision!) If I (Sam) sent you the chipKIT DP32 board, it will have been loaded with a version of the µMD1 firmware and at least one of the green LEDs will be lit. But by the time you've received it, the firmware will probably be out of date, so reloading will be required in any case. :)

Windows should recognize the chipKIT board and ask to install a driver. Point it to the location of Stk500v2.inf.

Once the driver is successfully installed, the chipKIT board should come up as a serial port. Go to the Windows Device Manager to locate and select it.

Loading UECIDE

UECIDE will work with all versions of the firmware. But the only version of UECIDE I've had success compiling firmware without errors is Version 0.8.8alpha17 though I assume that more recent versions like 0.8.8alpha22 will also be satisfactory. Assuming that, download it from UECIDE Beta Programme. And other versions probably work, they just hate me. :( :)

The UECIDE files should be unzipped to any convenient location on your computer. UECIDE requires around 160 MB there, and another 600+ MB for support files typically somewhere like c:\users\YourUserID\AppData\Local\UECIDE. This location can be changed in File->Preferences. If doing this after having configured UECIDE, copy all the files to the desired destination first, then change the data directory in File->Preferences. DO NOT delete the original UECIDE directory or the preferences file! :) Otherwise, the configuration information will all be lost.

Compared to most applications, UECIDE takes forever to start up even on a fast PC. So be patient. That's the bad news. The good news is that compiling and uploading is about 5 times faster than MPIDE, another reason to ignore MPIDE. Go figure. :)

The first thing UECIDE will likely do is to tell you that no boards are installed and then open the Plugin Manager. If it does not, do it manually by going to Tools->Plugin Manager. At first the pane along the left will only show the word "Plugins". But after a couple minutes, it should update with a list: Plugins, Libraries, Boards, Cores, Compilers, System. The following are required:

For each of these click on "Install". Installing the chipKIT board will probably automagically install the other chipKIT-related files and may take several minutes. Confirm that each entry has a green check mark next to it.

Close the Plugin Manager and go to "Hardware" and confirm that the proper Board (chipKIT DP32), core (chipKIT), and Compiler (pic32-tools) has been selected. Click on it if not.

Some other quirks of UECIDE that I've found:

Plug the chipKIT board into any available USB port. The red power LED (if present) should come on. (Not all versions of the chipKIT DP32 have one; apparently someone decided to save 1/10th of a cent on an earlier or later revision!) If I (Sam) sent you the chipKIT DP32 board, it will have been loaded with a version of the µMD1 firmware and at least one of the green LEDs will be lit. But by the time you've received it, the firmware will probably be out of date, so reloading will be required in any case. :)

Assuming the driver has already been installed, go to Hardware->Serial Terminal and select its COM port. Typically, this will be the highest number COM port, or perhaps the only one, since no one uses these for much of anything anymore.

UECIDE should remember the configuration settings automatically upon exiting.

Uploading the chipKIT DP32 Firmware

The firmware is provided as a source file which probably has an extension of ".pde" or ".ino" (though the specific name doesn't matter - it's just a text file). However, the name may NOT contain any dashes "-" due to the peculiar restrictions of Java or something. Make a directory with the name of the firmware (without the extension) and put the firmware file there. For example, if the file is named uMD1_fw_v123.pde, make a directory called uMD1_fw_v123. and put uMD1_fw_v123.pde in it. Note that case matters so the name of the directory and name of the fimrware file (without the extension) must match case character-by-character exactly. Thus Interferometer.pde is not the same as interferometer.pde

  1. Plug the chipKIT board into a USB port. I've occasionally seen problems using a USB port replicator though these generally are acceptable. But if the board doesn't come up, go to a direct USB port.

  2. There are 3 pushbuttons on the board. BTN1 (next to the PIC and JP6) is RESET while BTN2 is PROGRAM. (BTN3 is unassigned.) Press RESET and hold it while also pressing PROGRAM. Release RESET and then release PROGRAM. LED1 should be flashing rapidly indicating that the board is salivating in anticipation of having new and improved firmware uploaded to it. :)

  3. Use Ctrl-O to open the firmware file. Select the directory. The source code should appear in the same window unless a file is already open, in which case a new window will appear. (If UECIDE thinks it's a firmware directory, it won't even allow you enter it to select the file but will immediately open the file. If the name of the directory and file don't match - including case - it will produce an error like "file not found".

  4. Use Ctrl-U to compile and upload the firmware to the board. This may take anywhere from a few seconds to a minute or more. Near the end, the green status bar will extend nearly all the way to the right and the LEDs on the board will then begin flashing in several different patterns in anticipation of getting new and improved firmware, finally ending with 8 rapid flashes. ;-) The board will be automatically reset and start running the firmware. During this time, confirmation messages similar to the following will appear:

         * Compiling sketch...
         * Compiling core...
           > api
         * Compiling libraries...
         * Linking sketch...
       Compiling done.
       Memory usage
         * Program size: 55532 bytes
         * Memory size: 3452 bytes
         * Compilation took 5.634 seconds
       Uploading firmware...
         * Resetting board...
         * Uploading...
         * Resetting board...
         * Upload Complete

    Windows should recognize that the chipKIT COM port dropped out momentarily and reappeared. The firmware will be spitting out sequences of numbers at the sampling rate. These may be viewed by going to: Tools->Serial Terminal. With no interferometer hardware, they will be rather boring with only one value incrementing, the sequence number. To Windows, the chipKIT board appears as a COM port. Thus any software that processes COM port data can be used in place of the µMD1 GUI, should this be desired.

    If the firmware crashed somehow, Windows may display a message saying something about the USB port not working. But that shouldn't happen with any firmware downloaded from here. :) And on rare occasions a cosmic ray or hardware glitch may result in the upload failing with a checksum or other error. Just put the board in program mode and try again. If the selected COM port is incorrect, cancel and retry.

Once loaded, the firmware is retained in non-volatile memory so this only needs to be done once - or until a firmware update is available!

The firmware may also be compiled without uploading by using Ctrl-R. Since you haven't messed with the code, it should compile without errors. This is slightly faster for testing and doesn't use the board at all so it can be off doing whatever it pleases. :)

Important: Terminate any instances of the µMD1 GUI before uploading the firmware and put the board into program mode (again if necessary) AFTER doing this even if LED1 is flashing.

Installing and Running the µMD1 GUI

Save the µMD1 GUI .exe file into any convenient directory. The first time it's run, an error may be produced since there is no configuration file associated with it. Simply continue and the GUI will come up. When it is closed using "Finish", valid settings will be saved so that the error should not appear again.

Even if there is no interferometer hardware attached to the board, it is possible to confirm that the PIC is talking to the GUI. Go to "USB Port" and select the same COM as used to upload the firmware. The graph should immediately start scrolling to the left indicating that it is accepting valid data, even if it is all 0s. The display will show "No Signal" since there are no REF or MEAS clocks. But the fact that it's scrolling means the communications link is working.

Important: DO NOT reset the board while the µMD1 GUI is running. The GUI will need to be aborted, the board may need to be reset again, and only then can the GUI be restarted.

GUI Operation

When started, the µMD1 GUI (henceforth simply called the "GUI") comes up in Displacement mode with graphing enabled. The only action required by the user is to select the USB COM port. Once selected, the readout and graph will begin displaying the interferometer data.

Important: The GUI can be started at any time but the firmware must be running before the USB COM port is selected or else the Universe may implode. :) Confirmation of this issue is left as an exercise for the user. ;-) There is usually no need to reset the firmware when restarting the GUI. However, if the GUI behaves strangely, exitting the GUI and resetting the firmware may be required. On rare occasions, it may be necessary to cycle power to the hardware by unplugging the USB cable for a few seconds to clear some weird errors that reset alone doesn't take care of. The µMD1 Technical Department is aware of these issues and is working around the clock to resolve them so there is no need for a bug report.

Data from the chipKIT board is sent at a default rate of approximately 610 samples per second. (If you're curious, the precise sampling rate is close 610.35 Hz, which is the 40 MHz PIC CPU clock divided by 65,536 - the number of counts between the 16 bit Timer1 overflows, used as the sample rate interrupt clock.) The data includes counts for REF, MEAS, displacement, velocity; a unique sequence number to identify samples; as well as other low speed data such as environmental sensors and diagnostics. (More info can be found a few paragraphs above.) The GUI displays are updated at approximately 60 Hz.

All the screenshots below except for interpolation use simulated data, which was more convenient for developing this manual! However, it also means you can play around and recreate these displays before building your interferometer. The screen shots showing the effects of interpolation are of actual data.

Main Window Controls and Readouts

This graphic below shows the typical GUI main window at startup.

µMD1 Main Window in Displacement Mode with Graphing Enabled (Startup Settings)

Main Window Controls

The first set are the selection buttons at the top of the window. Note that except for USB Port, these require only a single click to activate:

µMD1 Main Window with Test Mode Function Generator Triangle Displacement Waveform

These may all be accessed via Alt-first letter.

The next set are the buttons, checkboxes, and other widgets on the main window:

The format is slightly modified when Frequency mode is selected. This graphic shows the actual DFT of the triangle waveform in the one above. Note that the DFT coefficients go as 1/N rather than 1/N-squared because it's actually using the velocity data, which is a squarewave.

µMD1 Main Window in Frequency Mode with Graphing Enabled

Main Window Indicators

Next are the various fields for displaying information in the Main Window:

µMD1 Main Window Showing Most Indicator Fields

Interferometer Configuration Window

These entries provide for selection of the type of interferometer used for displacement/velocity measurements, the measurement units to be used for the Main Readout and graph, parameters for the strightness and angular optics, and whether to enable use sub-count interpolation. All interferometer configuration parameters are saved when exiting the GUI.

µMD1 Interferometer Configuration Window

Environmental Compensation Window

This provides for entry of temperature, pressure, and humidity, or to select the use of environmental sensor data if available. All environmental compensation parameters are saved when exiting the GUI.

µMD1 Environmental Compensation window

Test Mode Window

The primary use of Test Mode is to exercise the GUI without the need for a laser or actual interferometer hardware. :) The only other user function that is useful would to disable error detection suring setup and alignment of the laser and optics.

µMD1 Test Mode Window

Multiple Axis Support:

While the firmware fully supoprts up to three measurement axes, only limited support is provided in the GUI due to the software complexity and lack of demand at the present time. What is present should be enough to get started. It's possible this could chenge in the future but don't hold your breath in anticipation. It may never happen.

If the GUI detects data (MEAS clocks) on axes 2 or 3, the firmware and GUI enter Multiple Axis Mode utilizing an expanded communications format, and the appropriate readouts will appear as shown below.

µMD1 Main Window with Multiple Axes Active

All GUI functions apply to the primary axis, which defaults on startup to Axis 1. The primary axis is what the Main Readout, REF/MEAS/DIFF frequency displays, frequency analysis, averaging, and graph apply to. Clicking on the Axis 1, Axis 2, or Axis 3 labels will select it to be the primary axis and change the color of the selected axis label to identify it as the primary axis. The units of the primary axis are also used for the others and error detection (if enabled) only applies to the primary axis. Averaging is NOT applied to the Axis 1, Axis 2, or Axis 3 readouts, even the one that is the same as the primary axis.

Note that in Multiple Axis Mode, the communications format sends somewhat more data over the USB COM port and the GUI must perform more computation. Thus this may cause problems for a wimpy pre-Jurassic PC operating on the hairy edge of what's possible. Once Multiple Axis Mode is entered using the interferometer hardware, the only way to return to Single Axis Mode is to restart both the firmware and GUI. This is because neither has any way to know whether dropouts of measurement clock signals are due to a beam path being momentarily interruprted or an axis actually being shut off (whatever that might mean).

Test Mode is also capable of exercising all three axes singly or in combination but the function generator data will be the same for all. This is controlled by the Multiple Axis Mode checkbox. When enabled, Axis 1, Axis 2, and Axis 3 checkboxes will appear below it with Axis 1 being the default on startup. Turning Multiple Axis Mode off will put the GUI back in Single Axis Mode. But this will be overidden when Test Mode is turned off if the USB port is enabled and the firmware is running with multiple axes.

Multiple Axis GUI support is currently under development. Specifications and behavior are subject to numerous changes without notice. ;-) However, no major features beyond what are described above are anticipated to be implemented in the GUI.

Help Menu

µMD1 About Window


Naturally, all is expected to go smoothly. But if it doesn't, here are some common problems. Some of these may be bugs in the firmware or GUI as hard as that is to believe. So, if you find something that cannot be solved based on what's below, contact us for a timely response:


These links open in a single new window or tab.


  1. chipKIT DP32 Homepage.
  2. chipKIT DP32 Schematics.
  3. chipKIT DP32 Reference Manual (PDF).
  4. chipKIT DP32 Reference Manual (Web page). This one appears to be much more complete.


  1. Install chipKIT Software
  2. MPIDE Quick Start Guide


  1. UECIDE: The Universal Embedded Computing IDE
  2. UECIDE Beta Programme (Dowload)


  1. AM2302 Digital Humidity and Temperature Sensor Datasheet
  2. BMP180 Temperature and Pressure Sensor Datasheet

Jan Beck's Information

  1. Interferometer Project Pages
  2. Github µMD1 GUI Source Code Repository