Low Cost Microcontroller-based Digital Microfluidics using “Processing”

Posted by – July 1, 2009

I’ve now tested the digital microfluidics board via microcontroller. The digital microfluidics board moves a liquid droplet via Electrowetting-on-Dielectric (EWOD).  The microcontroller switches the high voltage via a switching board (pictured below, using Panasonic PhotoMOS chips), which controls the +930VDC output by the HVPS (posted earlier), and runs over USB using no cost Processing.org software.  This is alpha stage testing.. cleaner version to be built.  The goal of course is to scale the hardware to allow automation of microbiology protocols.

Labview is quite expensive, and industrial-grade high voltage switching boards are also quite expensive.  So I built my own hardware and the Processing.org language is an easy way to test things.  The Processing.org language is a free, open source graphics/media/IO layer on top of Java (as posted previously here).

What follows is the super simple test software written in Processing.org & Java.

This is pretty much a copy & paste of the previous simple Processing.org example, with some added error checks and non-optimized state machine.  (This will all be re-written as Microchip assembly.)

// UBW Microcontroller 'Digital Microfluidics'; jcline 2009-06
import processing.serial.*;
Serial ubw; // USB microcontroller communication
int portIndex = 0; // XXX Change portIndex to match the computer hardware
int loops = 0;
boolean found = false;
char toggle = '0';
char pinchar;
PFont font;
float tdelay;

void setup() {
  String ubwVersion;
  size(400,400);
  background(0); // black
  frameRate(1); // sets draw rate
  stroke(255); // white
  try {
    println(Serial.list());
    ubw = new Serial(this, Serial.list()[portIndex], 9600); // serial rate doesnt matter
    tdelay=millis() + 5000;
    // Read firmware version from connected UBW Microcontroller; jcline 2009-03
    for (int i=0; millis() < tdelay ; i++) {
        // Get+Verify UBW version string, print to console
        ubw.write("v\n");
        ubwVersion = ubw.readStringUntil('\n');
        if (ubwVersion != null) {
          if (ubwVersion.startsWith("UBW", 0)) {
            println("Found UBW attached to USB: ");
            print(ubwVersion);
            found = true;
            break;
          }
        }
    }
  }
  catch (Exception e) {
    println("device access error\n");
  }

  if (found != true) {
    println("UBW not found: exit\n");
    return;
  }
  else {
    ubw.write("PD,B,7,0\n");
    ubw.write("PD,B,6,0\n");
    ubw.write("PD,B,5,0\n");
  }

  hint(ENABLE_NATIVE_FONTS);
  font = createFont("Courier", 32);
  textFont(font);
  println("done\n");
  tdelay=millis() + 7000;
  print("pausing..");
  for (int i=0; millis() < tdelay ; i++) {
    ;
  }
  println("Go!");
}

// Step EWOD droplet along path and back again
void draw() {
  String cmd;
  if (found == false) { return; }

  if (loops > 39) {
    noLoop();
    ubw.write("PO,B,7,0\n");
    ubw.write("PO,B,6,0\n");
    ubw.write("PO,B,5,0\n");
    ubw.write("PO,B,4,0\n");
    tdelay=millis() + 1000;
    print("pausing..");
    for (int i=0; millis() < tdelay ; i++) {
      ;
    }
    println("done.");
    exit();
  }
  background(0);
  if (toggle == '0') {
    toggle = '1';
    line(0,10,width,10);
  }
  else {
    toggle = '0';
    line(0,height-10,width,height-10);
  }
  pinchar = '7';
  if (loops % 10 == 0) {
    pinchar = '7';
  }
  else if (loops % 10 == 0) {
    pinchar = '7';
  }
  else if (loops % 10 == 1) {
    pinchar = '7';
  }
  else if (loops % 10 == 2) {
    pinchar = '6';
  }
  else if (loops % 10 == 3) {
    pinchar = '6';
  }
  else if (loops % 10 == 4) {
    pinchar = '5';
  }
  else if (loops % 10 == 5) {
    pinchar = '5';
  }
  else if (loops % 10 == 6) {
    pinchar = '6';
  }
  else if (loops % 10 == 7) {
    pinchar = '6';
  }
  else if (loops % 10 == 8) {
    pinchar = '7';
  }
  else if (loops % 10 == 9) {
    pinchar = '7';
  }

  cmd="PO,B," + pinchar + "," + toggle;
  ubw.write(cmd + "\n");
  println(cmd);
  text(loops + ": " + cmd, 15, 60, -30);
  loops++;
}
// END

For the techies interested in digital microfluidics, check future posts for fabrication details.  Also read the Lab on a Chip Journal — though don’t immediately believe all of the stated results!

If you enjoyed this post, make sure you subscribe to my RSS feed!

2 Comments on Low Cost Microcontroller-based Digital Microfluidics using “Processing”

  1. James says:

    That is simply great.

  2. Norman says:

    Do you have a schematic or at least a parts list for the control board that handles the HVDC?