Micro Measurement Display 1 (µMD1)

Installation and Operation Manual

Version 1.60 (13-Apr-2017)

Copyright © 1994-2017
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 the use of 37 spools of ABS due to the office 3-D printer fabricating a part 25.4x too large in all dimensions, 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 certifiably nuts. ;-) Jan maintains the master GUI source code as well as slightly different versions of the firmware and a development blog on the overall project. And a version of the firmware providing basic readout of displacement on any Blue Tooth wireless device with a terminal APP, or with a bit more polished presentation (though not the complete GUI) on Android devices, may be found on Jan's Web site. See that and more under "References".


µMD1 is an inexpensive system for precision readout in metrology applications. It is designed and optimized for two-frequency HeNe laser (heterodyne) interferometry, but also provides limited support for single frequency (homodyne) interferometry, as well as other measurement applications using optical or mechanical encoders with Quad-A/B or up/down pulsed signals.

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 as shown below.

Typical Heterodyne 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 - or µMD0 - 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 together a single axis system, multiple axis system, and one with environmental sensors. All parts are available from major electronics distributors like Digikey and should total no more than around $30 to $35 for a basic system, perhaps $10 more for the deluxe version.

Note: Environment sensors are a works in progress. The parts may change, so it is recommended that these not be added just yet.

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.

Additional parts for 3 axis system

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.

Additional parts for temperature, pressure, and humidity sensors

Since environment sensors are a works in progress, it is recommended that these not be added just yet. Currently, due to timing issues, the sensors are updated ONLY when the chipKIT board is reset. We may be switching to a SHT20 I2C humidity/temperature sensor in place of the AM2301. It's about $10 installed on a PCB like the BMP180. The I2C bus timing is handled in hardware so there should be far fewer timing issues.

Note that as a practical matter, for hobbyist or experimental use, it's probably more than adequate to enter environmental compensation parameters manually (or use the defaults), so including the sensors is not essential. The errors will be no more than a few parts per million for typical variations in indoor ambient conditions.

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" and "SHT20" actually refers to the itty-bitty SMD sensor modules itselves. You really don't want to deal with those. :) Thus, they are usually provided soldered to a small PCB with the required support circuitry. There may be several versions of the PCBs for these sensor. For example, one for the BMP180 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. This likely also applies to the SHT20.

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, and the SHT20 on PCB for around $10.

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

  J4-1           0               RB5             RPB5
  J4-2           1               RB7             RPB7
  J4-3           2               RB8             RPB8
  J4-4           3               RB9             RPB9
  J4-5           4               RB10            RPB10
  J4-6           5               RB11            RPB11
  J4-7           6               RB13            RPB13
  J4-8           7               RB14            RPB14
  J4-9           8               RB15            RPB15
  J4-10          -                -                -
  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.

Wiring the basic system - single axis, no sensors

  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 go to 2IN+ and 2IN- (pins 6 and 5) respectively. REF Return goes to GND. See note below about the returns in the cables.

  6. MEAS and ~MEAS input pins to 1IN+ and 1IN- (pins 8 and 7) respectively. MEAS Return goes to GND. See note below about the returns in the cables.

  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 RB5. This voltage divider assures that the standard TTL output of the line receiver provides a 3.3 V compatible signal.

  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 RB0. This voltage divider assures that the standard TTL output of the line receiver provides a 3.3 V compatible signal.

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.)

It is recommended that bypass capacitors (0.1 µF ceramic and 22 uF electrolytic typical) be installed between Vcc and GND of the line receiver(s) as close to the chip(s) as possible. While I have not seen problems with power supply noise, others have, though it's not clear under what conditions. But bypass caps are inexpensive insurance. :)

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.) The chart below is from Digikey. (If the link decays, a Web search will readily find another one.)

Resistor Color Code Chart (from the Digikey Web site)

Below is the suggested wiring arrangement, color coded to differentiate REF, MEAS, VIN, and GND. It's not critical, but keeping wires short will minimize confusion. For the long runs, use thin insulated hookup wire or wirewrap wire. There are no issues of high current :) so #30 AWG is fine for all connections. The short (GND connections) can be done with bare wire. This should all be on the bottom of the board. Poke the stripped end of the wire through any convenient hole that is close to and electrically connected to the correct signal, or wrap it around the end of the resistor lead or connector pin before soldering.

chipKIT DP32 PCB Board Suggested Wiring Routing

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.

Wiring the cables

The specific wiring for REF and MEAS will depend on the setup. If using HP/Agilent/Keysight lasers:

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. :)

Refer to the various connection diagrams in Hewlett Packard/Agilent/Keysight Stabilied HeNe Lasers.

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

Wiring the 2nd and 3rd axes

  1. Replicate the layout of the 8 pin socket, headers, and terminating and level shifting resistors as for the single axis system.

  2. MEAS2 and ~MEAS2 input pins go to 1IN+ and 1IN- (pins 8 and 7) respectively. MEAS2 Return goes to GND. See note above about the returns in the cables.

  3. MEAS3 and ~MEAS3 input pins go to 2IN+ and 2IN- (pins 6 and 5) respectively. MEAS3 Return goes to GND. See note above about the returns in the cables.

  4. 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 MEAS2 clock signal and goes to pad RPB2.

  5. 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 MEAS2 clock signal and goes to pad RPB3.

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

If using the suggested layout, most of the pads are NOT connected together so this will need to be done with jumpers.

Wiring the BMP180 sensor

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. In addition, VIN may be called Vcc and 3Vo may be called 3.3V. However, they are the same function.

Select a location on the chipKIT board that does NOT have connected pads. The BMP180 can be soldered directly to the board, installed in a socket, or run remotely via a cable.

  1. Identify the version of the BMP180 you have and suitable locations on the chipKIT board that do NOT have connected pads. Use the labels on the BMP180 PCB to identify the signal pins, NOT their location.

  2. GND goes to a GND pad.
  3. SDA goes to RB9.
  4. SCL goes to RB8.
  5. Install jumpers at locations JP4 and JP5 as shown in the diagram, above.

Wiring the AM2302 sensor

Select a location on the chipKIT board that does NOT have connected pads. The AM2302 can be soldered directly to the board, installed in a socket, or run remotely via a cable.

  1. 3.3V goes to a 3V3 pad.
  2. Both GND pins go to a GND pad.
  3. DTA goes to RB7.
  4. Install a 10K ohm resistor between DTA and 3.3V.

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

These are absolutely guaranteed to be new and improved in terms of features, capabilities, and performance. This probably means there will be some new and improved bugs as well. Please contact us via the link at the top of this page should any dare to appear (or for any other legitimate reason). :)

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.)

Other signals that are currently used are RPB7 (AM2302), and RPB8 and RPB9 (I2C bus for BMP180 and SHT20).

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)

     20: Homodyne Interferometer (if non-zero)

     (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

(If you purchased the from me directly, or via eBay, the latest released version of the firmware has been preloaded, so the following step should not be necessary.)

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.ino, make a directory called uMD1_fw_v123. and put uMD1_FW_v123.ino in it. Note that case matters so the name of the directory and name of the firmware 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.

Testing chipKit Board and Firmware

With µMD1 firmware loaded, the simplest way to test that the board is working without running the GUI is to use the "Serial Terminal" (under "Tools" in UECIDE.) With the board reset, then open the Serial Terminal. The terminal window should begin spewing forth data similar to the following:

  0 0 0 0 31232 16927 0 0
  0 0 0 0 31232 16928 0 0
  0 0 0 0 31232 16929 10 5610
  0 0 0 0 31232 16930 8 45776
  0 0 0 0 31232 16931 3 -1
  0 0 0 0 31232 16932 4 -1

If there is a display like this with the 6th number incrementing by 1, then the board is probably working.

Installing and Running the µMD1 GUI

Save the µMD1 GUI .exe file into any convenient directory. (There's a small chance that the first time it's run, an error is 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 ot 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" (assuming error detection is enanbled) 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 rate of 457.76, 610.35, or 732.42 Hz depending on the measured REF frequency of the laser. (If you're curious, the precise sampling rate is the PIC CPU clock frequency divided by 65,536 - the number of counts between the 16 bit Timer1's overflows, used as the sample rate interrupt clock.) The CPU clock frequency is automatically changed based on the laser's REF frequency to optimize sub-count interpolation.) 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

Note: Temperature, pressure, and humidity values from installed sensors are currently only acquired when the chipKIT board is reset, but are sent periodically to the GUI.

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 handles 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. 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:

Using µMD1 GUI with Homodyne Interferometers

Note that the standard µMD1 does NOT support homodyne operation. If interested, a special version is available and it has no warranty whatsoever. :) Contact me via the Email Links page for more info.

While designed and optimized for heterodyne interferometers using two frequency HP/Agilent/Keysight and similar lasers, the µMD1 GUI can also be used with homodyne (single frequency) interferometers. The interferometer optics used with these systems are identical to those for two-frequency lasers, but the electronics provide baseband SIN/COS "quadrature" (and Intensity) outputs rather than REF and MEAS frequencies. In fact, other measurement instruments providing quadrature signals like those using high resolution optical encoders can also be used with µMD1. Firmware may use either the chipKit DP32 board or an even less expensive platform like the Atmega 328 Nano 3.0. (Under $3 on eBay.) However, without some minimal additional quadrature decoding hardware, performance will be severely limited with either.

As long as the communications format is adhered to, the GUI will interpret displacement correctly. So, rudimentary firmware would accept SIN/COS quadrature signals to increment or decrement displacement, resulting is up to 4 counts per cycle or a resolution of around 79 nm. (Interferometer Configuration set to 4X.) However, since the counting must be done in real-time, the uninterruptable portions of the USB serial data handler are a serious limitation. By minimizing the size of the unused values to reduce the time spent in the serial communications, this can be somewhat improved but it's still not pretty. Using the Atmega 328 Nano 3.0, the speed is currently limited to less than 1 mm per second, and some GUI functions like Velocity and Frequency won't do anything useful. Inquire for a copy of this firmware if interested in hacking it. ;-)

With minimal external logic to do the SIN/COS quadrature decoding, this speed limitation would virtually disappear using the chipKIT board with its internal counters. A PLD, discrete logic, commercial chip like the LS7083 "Encoder to Counter Interface", or even another microprocessor like the Atmega, would generate UP and DOWN pulses based on the SIN/COS signals. UP would increment the REF counter and DOWN would increment the MEAS counter. Their difference would then be the Displacement just as in the standard µMD1 firmware. Data would be sent at a fixed sample rate of 732.42 Hz and all GUI functions would be supported. A second measurement channel would use the other two counters. The internal counters can run at over 20 MHz, so perfomance would be limited mostly by the speed of the optical receiver and quad-to-pulse converter. An asynchronous logic implementation for the converter would provide full performance. Using a $2 Atmega 328 Nano 3.0, the maximum speed was measured to be order of 40 kHz for each of 2 channels using quick-and-dirty polling. Substituting a second chipKit DP32 board to be used only for the converter would likely result in at least a 5 to 10 fold increase.

The latest versions of the µMD1 firmware for the chipKit board and GUI support homodyne mode with 1 or 2 channels each using pairs of internal counters (>20M counts/second max), along with a third channel via direct polling of Quad-A and Quad-B digital inputs. The maximum speed of the third channel is under 350 counts/second but this could still be useful for some applications like the Z axis in a high resolution 3-D printer. ;) To accomodate non-interferometer measurements using optical or mechanical encoders, the entry for "Vacuum Wavelength" in the "Environmental Compensation" window (632.991372 nm for HP/Agilent lasers) has a range of 1 nm to 1,000,000 nm (1 mm) so it can be set to the appropriate resolution required for anything from an atomic force microscope to a construction crane. ;-)

Interpolation for higher resolution is possible using the raw SIN/COS analog signals. However, I have absolutely positively no intention of even thinking about any implementation using the existing µMD1 hardware.

Summary of homodyne inputs for µMD1

    Pin    Signal   Counter   Function         Maximum Speed
   0/RB5    RPB5    Timer3    Axis 1 Up    >20M counts/second
  11/RB0    RPB0    Timer5    Axis 1 Down       "          "
  13/RB2    RPB2    Timer4    Axis 2 Up         "          "
  14/RB3    RPB3    Timer2    Axis 2 Down       "          "
  10/RA1    RPA1      --      Axis 3 A     350 transitions/second
  18/RA4    RPA4      --      Axis 3 B          "          "

To achieve higher performance from a less expensive platform like the Atmega, an external up/down counter could also be added, which would be read by the firmware via the digital inputs.

Support for homodyne interferometers is currently a "works-in-progress" and will be available in a forthcoming release of the GUI and chipKit firmware. :) Hardware designs and/or firmware will also be available upon request for:

If using the Atmega, confirm that it has the bootloader already burnt into EEPROM. While there are step-by-step instructions on the Web for transferring it via another micro, this is a complication best to be avoided. Use the Arduino IDE for programming and upload. Links to Arduino info and software are in the Reference section, below.

The following sub-Alpha version firmware for the chipKit board and GUI supports homodyne operation with two high speed axes (pulse up/down) and one low speed axis (quad A-B) using the above pin assignments.

The value of Homodyne (in: #define Homodyne) near the top of the firmware will need to be changed to the number of homodyne axes. Error should be disabled with this version of the GUI and it will display "Homodyne Mode" when the homodyne firmware is open. This firmware and GUI *should* also work in normal (heterodyne) mode but this has not been completely tested. Use at your own risk. If running these results in the destruction of the Universe, I do not want to know about it. ;-)


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. Arduino IDE, Refernce, Tutorials, more
  2. Atmega 328 Nano 3.0
  3. How to Burn a Bootloader to Clone Adruino Nano 3.0 - 2
  4. Arduino Playground: Rotary Encoders
  5. Encoder Library, for Measuring Quadrature Encoded Position or Rotation Signals


  1. AM2302 Digital Humidity and Temperature Sensor Datasheet
  2. BMP180 Temperature and Pressure Sensor Datasheet
  3. Sensirion - Humidity & Temperature Sensor SHT2x Datasheet
  4. MPL115A2 Humidity/Temperature Sensor Datasheet

Jan Beck's Information

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