Description

By employing techniques from statistical mechanics and nonlinear dynamics, we are able to study the underlying mechanisms of how biomolecules move and interact to perform cellular processes. Processes such as transcription, diffusion, and other molecular interactions are explored by studying energy landscapes of given molecules as well as running molecular dynamics (MD) simulations of biomolecules in specific landscapes.



Protocols

PCR

Goal: Construct a simple PCR machine with three water baths, amplify DNA with your PCR machine, and perform gel electrophoresis to confirm DNA amplification..

Download pdf

  • Arduino uno (2)
  • jumper cables
  • solid state relay (SSR) (3)
  • immersion heater (3)
  • extension cord (3)
  • waterproof temperature sensor, DS18B20 (3)
  • high temperature thermometer for calibration
  • thermos (3)
  • breadboard (3)
  • servo motors (2)
  • LED (optional)
  • LEGOs
  • scrap wood (for stand)
  • microcentrifuge tubes
  • 5-50uL micropipette
  • 5X loading dye (Lonza)
  • 100 bp DNA marker (Lonza)
  • DNA cocktail (dependent on DNA being amplified)
  • wire
  1. Stack servos such that the bottom one rotates horizontally and the top one rotates vertically.
  2. Build a stand for the servo motors.
  3. Place water baths around the stand and determine angular positions.
  4. Use the servo circuit below to connect the servos to the Arduino.
  5. With the servo code, calibrate the water bath locations and servo control. The time constants can be shortened during testing.
  6. Once the servos are working, use the heater circuit below to connect the water baths, temperature sensors and temperature sensors to the second Arduino.
  7. Then with the heater code, test that all three water baths can maintain a relatively constant temperature using the high temperature thermometer.
  8. Finally, reset the time constants (if necessary) and run both codes (one on each Arduino) to amplify DNA.

Servo Code

 

#include 

Servo blue; // left / right servo
Servo yellow; // up / down servo

int LED = 13; // LED on pin 13

// time constants
long int firstT = 1200; // 2 mins in bath (at beginning)
long int downT = 30000;      // 30s in each bath
long int lastT = 3000; // 5 mins in bath (at end)
long int endT = 6000; // long hold time (after amplifying)

// water bath angular positions
int bath_92 = 10;
int bath_58 = 90;
int bath_72 = 180;

// arm angular position
int up = 0;
int down = 90;

void setup() {

  Serial.begin(9600);
  pinMode(LED, OUTPUT);

  blue.attach(9);
  yellow.attach(11);

}

void loop() {
   int first = 1;
   int count;
   int flash = 0;
   
   yellow.write(0);
   delay(500);
   blue.write(0);
   Serial.println("ready");
   delay(1000);
   
   for (int i = 0; i = 35; i++) { 
       if (first == 1) {
       first = 0;
       count = 0;
       blue.write(bath_92);  // Turn Servo Left to 45 degrees (92 bath)
       delay(500);
       yellow.write(down);
       Serial.println("wait 2 mins; 92");
       delay(firstT*100);  // wait 2 mins
    }
    else {
      blue.write(bath_92);  // Turn Servo to (92 bath)
      delay(500);
      yellow.write(down);
      count++;
      digitalWrite(LED, HIGH);
      Serial.println("\n");
      Serial.println(count);
      Serial.println("wait 30s; 92");
      delay(downT);    
      digitalWrite(LED, LOW);
      yellow.write(up);
      delay(500);

      blue.write(bath_58);  // Turn Servo to  (58 bath)
      delay(500);
      yellow.write(down);
      digitalWrite(LED, HIGH);
      Serial.println("wait 30s; 58");
      delay(downT);    
      digitalWrite(LED, LOW);
      yellow.write(up);
      delay(500);

      blue.write(bath_72); // turn servo to 72 bath
      delay(500);
      yellow.write(down);
      digitalWrite(LED, HIGH);
      Serial.println("wait 30s; 72");
      delay(downT);
      digitalWrite(LED, LOW);
      yellow.write(up);
      delay(500);

      if (count == 35) {
        yellow.write(down);
        digitalWrite(LED, HIGH);
        Serial.println("");
        Serial.println("wait 5 mins; 72");
        delay(lastT*100);
        yellow.write(up);
        delay(500);
        blue.write(0);
        digitalWrite(LED, LOW);
        Serial.println("done!");

        for (int j = 0; j = 4; j++) {
        flash++;
        digitalWrite(LED, HIGH);
        delay(1000);
        digitalWrite(LED, LOW);
        delay(1000);
        Serial.println("turn me off!");
        if (flash == 4) {
          break;
          //delay(endT);
        }
        }
        digitalWrite(LED, HIGH);
        delay(endT);
        break;
      }
     }
   }

   digitalWrite(LED, HIGH);
   delay(endT*100);

   Serial.println("turn me off!");
   digitalWrite(LED, LOW);
   delay(1000);
   digitalWrite(LED, HIGH);
   delay(1000);
   Serial.println("turn me off!");
   delay(endT);

   digitalWrite(LED, LOW);
   delay(1000);
   digitalWrite(LED, HIGH);
   delay(1000);
   Serial.println("turn me off!");
   delay(endT);
}
		

Heater Code

 
#include OneWire.h 

int DS18S20_58 = 2; //DS18S20 Signal pin on digital 12
int DS18S20_72 = 13;
int DS18S20_92 = 12;
int relay_58 = 4;
int relay_72 = 8;
int relay_92 = 7;

float gain_high=80;
float gain_low=0.5;

long t58_old = 0;
long t72_old = 0;
long t92_old = 0;

//Temperature chip i/o
OneWire ds(DS18S20_58);  // on digital pin 2
OneWire ds72(DS18S20_72); // on pin 12
OneWire ds92(DS18S20_92); // on pin 13

void setup() {
  Serial.begin(9600);
  pinMode(relay_58, OUTPUT);
  pinMode(relay_72, OUTPUT);
  pinMode(relay_92, OUTPUT);

}

void loop() {

  // control for 58
  long t58_new = millis();
  float temp58 = getTemp58();

  //Serial.println(temp58);
  
  float diff_58=58-temp58;
  long wait58 = gain_high*diff_58;
  
  if (t58_new - t58_old >= wait58){
    t58_old = t58_new;
  
  if (diff_58 < 0){
    digitalWrite(relay_58, LOW);
    //digitalWrite(LED, LOW);

    Serial.println(diff_58);
    Serial.println(temp58);
    Serial.println("58 Off");
    Serial.println("\n");
  }
  else{
    while(diff_58 > 0){
      float temp58 = getTemp58();
  
      float diff_58=58-temp58;
      long wait58 = gain_low*abs(diff_58);
      
      digitalWrite(relay_58, HIGH);
      Serial.println(diff_58);
      Serial.println(temp58);
      Serial.println("58 on");
      Serial.println("\n");

      delay(wait58);
      if(diff_58 < 0){
        digitalWrite(relay_58, LOW);
        Serial.println("58 off / break");
        Serial.println("\n");
        break;
      }
      //digitalWrite(relay_58, LOW);
      //Serial.println("58 off");
      //Serial.println("\n");
    }
  }
  }

  // control for 72
  long t72_new = millis();
  float temp72 = getTemp72();
  
  float diff_72=72-temp72;
  long wait72 = gain_high*diff_72;
  
  if (t72_new - t72_old >= wait72){
    t72_old = t72_new;
  
  if (diff_72 < 0){
    digitalWrite(relay_72, LOW);
    //digitalWrite(LED, LOW);

    Serial.println(diff_72);
    Serial.println(temp72);
    Serial.println("72 Off");
    Serial.println("\n");
  }
  else{
    while(diff_72 > 0){
      float temp72 = getTemp72();
  
      float diff_72=72-temp72;
      long wait72 = gain_low*abs(diff_72);
      
      digitalWrite(relay_72, HIGH);
      Serial.println(diff_72);
      Serial.println(temp72);
      Serial.println("72 on");
      Serial.println("\n");

      delay(wait72);
      if(diff_72 < 0){
        digitalWrite(relay_72, LOW);
        Serial.println("72 off / break");
        Serial.println("\n");
        break;
      }
    }
  }
  }

    // control for 92
  long t92_new = millis();
  float temp92 = getTemp92();
  
  float diff_92=92-temp92;
  long wait92 = gain_high*diff_92;
  
  if (t92_new - t92_old >= wait92){
    t92_old = t92_new;
  
  if (diff_92 < 0){
    digitalWrite(relay_92, LOW);
    //digitalWrite(LED, LOW);

    Serial.println(diff_92);
    Serial.println(temp92);
    Serial.println("92 Off");
    Serial.println("\n");
  }
  else{
    while(diff_92 > 0){
      float temp92 = getTemp92();
  
      float diff_92=92-temp92;
      long wait92 = gain_low*abs(diff_92);
      
      digitalWrite(relay_92, HIGH);
      Serial.println(diff_92);
      Serial.println(temp92);
      Serial.println("92 on");
      Serial.println("\n");

      delay(wait92);
      if(diff_92 < 0){
        digitalWrite(relay_92, LOW);
        Serial.println("92 off / break");
        Serial.println("\n");
        break;
      }
 
    }
  }
  }
}

float getTemp58(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad

  
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
  
  ds.reset_search();
  
  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
  
  return TemperatureSum;
  
}

float getTemp72(){
    // control for 72
    byte data[12];
    byte addr[8];
    
  if ( !ds72.search(addr)) {
      //no more sensors on chain, reset search
      ds72.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  ds72.reset();
  ds72.select(addr);
  ds72.write(0x44,1); // start conversion, with parasite power on at the end

  byte present72 = ds72.reset();
  ds72.select(addr);    
  ds72.write(0xBE); // Read Scratchpad

  
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds72.read();
  }
  
  ds72.reset_search();
   
  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
  
  return TemperatureSum;
}

float getTemp92(){
    // control for 92
 byte data[12];
    byte addr[8];
    
  if ( !ds92.search(addr)) {
      //no more sensors on chain, reset search
      ds92.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  ds92.reset();
  ds92.select(addr);
  ds92.write(0x44,1); // start conversion, with parasite power on at the end

  byte present92 = ds92.reset();
  ds92.select(addr);    
  ds92.write(0xBE); // Read Scratchpad

  
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds92.read();
  }
  
  ds92.reset_search();
  
  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
  
  return TemperatureSum;
  }

							
PCR

Goal: Instructions on how to do PCR with DNA.

Download pdf

  • Yello Jacket DNA
  • Mixture for a 14 ul reaction
    • sterile ddH20 6.90 ul
    • 25mM MgCl2 2.40 ul
    • 10X PCR buffer 1.50 ul
    • dNTPs (2.5 mM) 1.20
    • 10uM F1 0.75 ul
    • 10uM R1 0.75 ul
    • Taq (5U/ul) 0.50 ul
  • Electrophoresis power supply
  • Gloves
  • P-10 Micropipette
  • FlashGel Cassette
  • Lonza 5X loading dye
  • Lonza 100bp DNA marker dye
  • Pipette tips
  • Deionized water
  • Alligator clip wires (2)
  • Chemwipes
  • PCR'd DNA
  • UV light

    Total volume: 15 ul: 12 ul DNA cocktail + 0.75 ul R1 + 0.75 ul F1 + 0.5 Taq + 1.0 ul DNA The first four entries in the table are pre-mixed as a "DNA cocktail". The DNA cocktail makes 12 ul. The remaining 2ul comes from the F1, R1, and Taq reagents. Students need to mix the remaining items prior to PCR. The primers are Rufa 5 locus.

  1. Using a micropipette, add each reagent at the corresponding volume in the order above to a centrifuge tube.
  2. Run PCR for 35 cycles using the following PCR cycle chart and directions. ONLY RUN THE 2nd denature, anneal, and 1st extension for 35 cycles.
    • 1st denature 94 degrees C 120 seconds
    • 2nd denature 94 degrees C 30 seconds
    • Anneal 58 degrees C 30 seconds
    • 1st Extension 72 degrees C 30 seconds
    • 2nd Extension 72 degrees C 330 seconds
    • Rest 22 degrees C infinity

    Gel Instructions

    This instructions were modified from Lonza's FlashGel System Quick Start Guide. The FlashGel System does not use ethidium bromide stain to mark DNA, it uses a proprietary stain that is 5-20 times more sensitive.

    Important Point

    • Do not exceed 5 ul sample volume per lane.
    • Optimal sample concentrations are approximately 1/5 the typical per band concentration of an ethidium bromide gel.
    • For best results, flood sample wells with water prior to loading.

  3. Add 1 ul of Lonza 5X FlashGel Loading Dye to 5 ul deionized water to make the 1X Loading Dye.
  4. Dilute PCR'd DNA with 2.5 ul of 1X Loading Dye. Optimal DNA load levels are 5-20 ng/band in a 5 ul load.
  5. Remove white well seals from cassette. Do not remove the clear side vent seals.
  6. Flood sample wells with distilled or deionized water. Tilt cassette to move excess fluid to the edge and blot off with a lint free wipe. DO not blot wells directly.
  7. In the first well, add 5ul of Lonza DNA Marker.
  8. Load 5ul of PCR'd DNA samples in the adjacent wells.
  9. Make sure the power supply is set to hold. Turn voltage number to ~275V and turn the timer knob to 7 minutes.
  10. Plug in high voltage cables. The red wire should clip from (+) to the far end lead on the cassette. The black wire should clip from (-) to the lead adjacent to the wells.
  11. Turn on UV lights.
  12. Wait 5-7 minutes, watching DNA migration across gel.
  13. After 7 minutes, disconnect cassette from power supply.
  14. Photograph with your phone's camera.


Assignments and Results


Module 3 Homework