Project in progress
DNA-Dave, the Transcription Translation Robot Educator

DNA-Dave, the Transcription Translation Robot Educator © MIT

DNA-Dave is striving to be the best tool to teach kids molecular biology concepts. The key word is "striving."

  • 500 views
  • 0 comments
  • 3 respects

Components and supplies

Apps and online services

About this project

--this is a mockup--

In the spirit of Simone Giertz, we embarked on a journey to make a fun robot. The goal was to help kids understand basic biology. DNA-Dave has a nucleus for a head, mRNA for hair, DNA complementary strands for eyes and lips. in his belly, there is a ribosome: the protein complex that is responsible for translating RNA to protein. By interacting with Dave, a child is immersed in a completely new world, where "transcription" and "translation" are the ideas it needs to understand to get to the goal: a working protein, dispensed by Dave!

Here we will present how Dave works, how kids interact with him, his quirks and features, and then document his transition from an Arduino board to a micro:bit. We will also present microDaves, little working DNA translators that kids will be making using micro:bits and LED strips, at a workshop designed to teach how you get from DNA to protein, the universal genetic code, and how folding of RNA and protein can happen due to the sequence of the molecular chain.

In the first iteration of DNA-Dave we used an Arduino Uno as the microcontroller to drive the various components. You can find the schematics, pictures of the build and Arduino code bellow:

Interacting with Dave

Late night coding session with Dave

We made a simpler version of the DNA Dave software to work with the BBC micro:bit microcontroller. We then made the wiring of Dave to be easily accessible for a micro:bit using a breakout board (octopus:bit) and a small breadboard. This part of the project is ongoing, as the micro:bit has limited IO pins that affect or are affected by the peripherals of the controller, making driving all the components of Dave difficult. We are close to giving a relatively simple solution.

miniDaves:

Big Dave, in his quest to teach kids the core concepts of biology, needs little helpers. They come in the form of miniDaves, the DNA translators! We use a micro:bit connected to a string of individually addressable LEDs to write and visualise arbitrary DNA sequences, then translate them and visualise their corresponding amino-acid sequences. The setup is as follows:

There are two versions of the code for miniDaves. The first version is the simple case where we want to write a "DNA sequence" using the two buttons of the microbit, tilting the microbit to the left to write A and Ts and to the right to write C and Gs. If we press both buttons at the same time we delete the sequence. We then light up the LEDs, each light representing with a color a nucleotide. We would like this code to be as easy as possible, so that kids can write it and modify it with us during a workshop. The kids will also learn how DNA or RNA, due to complementarity in is sequence, forms loops and folds into shapes, that sometimes has functional significance.

The second version of miniDaves is a fully working DNA translator. Additional code makes the microbit able to "transcribe" the DNA sequence by triplets to a corresponding amino-acid, using the Universal Genetic Code. We access this function-state by shaking the microbit: we have added this second state in the main loop of the program, and when in that state, the miniDave will light up the LEDs and represent the peptide chain that this DNA sequence corresponds to. We used the RasMol amino color scheme for amino-acid chains that makes polar residues appear bright in color, and non-polar be more dull. We hope that we can then make apparent how proteins fold due to their sequence. In a workshop setting, the kids can lookup online using BLAST what the sequence they came up with might be actually be doing, by looking up what proteins-DNA have this sequence. We hope that by working with this miniDave DNA translator kids can be exposed to the wonder of the Universal Genetic Code, transcription, translation, the basic molecular chains of life, and concepts like the transition from sequence to structure.

miniDave in action. Could work as a DNA-Protein nightlight!

Code

miniDave_microbit_DNA_translatorJavaScript
this is Javascript MakeCode code for a microbit connected to a strip of individually addressable LEDs, where you can input and visualise a DNA sequence, then translate it into an amino-acid sequence! Just paste it into the Javascript Window of MakeCode online editor. The AminoAcid color scheme is similar to RasMol amino color scheme, itself similar to Shapely scheme.
function transcribe_and_translate_the_DNA_string () {
    RNA_string = []
    AminoAcid_string = []
    for (let index = 0; index <= DNA_string.length; index++) {
        if (DNA_string[index] == "t") {
            RNA_string.insertAt(index, "u")
        } else {
            RNA_string.insertAt(index, DNA_string[index])
        }
    }
    number_of_triplets = RNA_string.length / 3
    for (let index2 = 0; index2 <= number_of_triplets; index2++) {
        RNA_triplet_position_1 = RNA_string.shift()
        RNA_triplet_position_2 = RNA_string.shift()
        RNA_triplet_position_3 = RNA_string.shift()
        RNA_triplet = "" + RNA_triplet_position_1 + RNA_triplet_position_2 + RNA_triplet_position_3
        AminoAcid = Universal_Genetic_Code_squashed[Universal_Genetic_Code_squashed.indexOf(RNA_triplet) + 1]
        AminoAcid_string.push(AminoAcid)
    }
}
input.onButtonPressed(Button.B, function () {
    if (tilt_state == 1) {
        DNA_string.push("g")
        basic.showLeds(`
            . # # # .
            # . . . .
            # . # # .
            # . . # .
            . # # # .
            `)
    } else {
        DNA_string.push("a")
        basic.showLeds(`
            . # # . .
            # . . # .
            # . . # .
            # # # # .
            # . . # .
            `)
    }
})
input.onButtonPressed(Button.A, function () {
    if (tilt_state == 0) {
        DNA_string.push("t")
        basic.showLeds(`
            # # # # #
            . . # . .
            . . # . .
            . . # . .
            . . # . .
            `)
    } else {
        DNA_string.push("c")
        basic.showLeds(`
            . # # # .
            # . . . .
            # . . . .
            # . . . .
            . # # # .
            `)
    }
})
input.onGesture(Gesture.Shake, function () {
    if (translate_state == 0) {
        translate_state = 1
        strip.clear()
        strip.show()
        basic.showString("Protein")
    } else {
        translate_state = 0
        basic.showString("DNA")
        strip.clear()
        strip.show()
    }
})
input.onGesture(Gesture.TiltRight, function () {
    tilt_state = 1
    basic.showLeds(`
        # # . . .
        # . # # #
        # # # . .
        . . # . #
        . . # # #
        `)
})
input.onButtonPressed(Button.AB, function () {
    DNA_string = []
    basic.showLeds(`
        # . . . #
        . # . # .
        . . # . .
        . # . # .
        # . . . #
        `)
    strip.clear()
})
input.onGesture(Gesture.TiltLeft, function () {
    tilt_state = 0
    basic.showLeds(`
        # # # . .
        . # . # .
        . # # . #
        . . # # #
        . . # . #
        `)
})
let position = 0
let AminoAcid = ""
let RNA_triplet = ""
let RNA_triplet_position_3 = ""
let RNA_triplet_position_2 = ""
let RNA_triplet_position_1 = ""
let number_of_triplets = 0
let RNA_string: string[] = []
let Universal_Genetic_Code_squashed: string[] = []
let AminoAcid_string: string[] = []
let DNA_string: string[] = []
let translate_state = 0
let tilt_state = 0
let strip: neopixel.Strip = null
strip = neopixel.create(DigitalPin.P0, 40, NeoPixelMode.RGB)
tilt_state = 0
translate_state = 0
DNA_string = []
AminoAcid_string = []
basic.showString("DNA!")
Universal_Genetic_Code_squashed = ["uuu", "phe", "uuc", "phe", "uua", "leu", "uug", "leu", "ucu", "ser", "ucc", "ser", "uca", "ser", "ucg", "ser", "uau", "tyr", "uac", "tyr", "uaa", "stop", "uag", "stop", "ugu", "cys", "ugc", "cys", "uga", "stop", "ugg", "trp", "cuu", "leu", "cuc", "leu", "cua", "leu", "cug", "leu", "ccu", "pro", "ccc", "pro", "cca", "pro", "ccg", "pro", "cau", "his", "cac", "his", "caa", "gln", "cag", "gln", "cgu", "arg", "cgc", "arg", "cga", "arg", "cgg", "arg", "auu", "ile", "auc", "ile", "aua", "ile", "aug", "met", "acu", "thr", "acc", "thr", "aca", "thr", "acg", "thr", "aau", "asn", "aac", "asn", "aaa", "lys", "aag", "lys", "agu", "ser", "agc", "ser", "aga", "arg", "agg", "arg", "guu", "val", "guc", "val", "gua", "val", "gug", "val", "gcu", "ala", "gcc", "ala", "gca", "ala", "gcg", "ala", "gau", "asp", "gac", "asp", "gaa", "glu", "gag", "glu", "ggu", "gly", "ggc", "gly", "gga", "gly", "ggg", "gly"]
basic.forever(function () {
    position = -1
    if (translate_state == 0) {
        for (let deoxyribonucleotide of DNA_string) {
            position += 1
            if (deoxyribonucleotide == "a") {
                strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Blue))
            } else if (deoxyribonucleotide == "t") {
                strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Green))
            } else if (deoxyribonucleotide == "c") {
                strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Orange))
            } else if (deoxyribonucleotide == "g") {
                strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Red))
            }
        }
    } else {
        transcribe_and_translate_the_DNA_string()
        for (let AminoAcid2 of AminoAcid_string) {
            position += 1
            if (AminoAcid2 == "ala") {
                strip.setPixelColor(position, neopixel.rgb(10, 10, 10))
            } else if (AminoAcid2 == "arg") {
                strip.setPixelColor(position, neopixel.rgb(40, 10, 235))
            } else if (AminoAcid2 == "asn") {
                strip.setPixelColor(position, neopixel.rgb(0, 150, 255))
            } else if (AminoAcid2 == "asp") {
                strip.setPixelColor(position, neopixel.rgb(255, 0, 0))
            } else if (AminoAcid2 == "cys") {
                strip.setPixelColor(position, neopixel.rgb(255, 200, 0))
            } else if (AminoAcid2 == "glu") {
                strip.setPixelColor(position, neopixel.rgb(230, 10, 10))
            } else if (AminoAcid2 == "gln") {
                strip.setPixelColor(position, neopixel.rgb(0, 255, 150))
            } else if (AminoAcid2 == "gly") {
                strip.setPixelColor(position, neopixel.rgb(235, 235, 235))
            } else if (AminoAcid2 == "his") {
                strip.setPixelColor(position, neopixel.rgb(255, 0, 255))
            } else if (AminoAcid2 == "ile") {
                strip.setPixelColor(position, neopixel.rgb(15, 90, 15))
            } else if (AminoAcid2 == "leu") {
                strip.setPixelColor(position, neopixel.rgb(0, 255, 0))
            } else if (AminoAcid2 == "lys") {
                strip.setPixelColor(position, neopixel.rgb(0, 0, 255))
            } else if (AminoAcid2 == "met") {
                strip.setPixelColor(position, neopixel.rgb(200, 255, 5))
            } else if (AminoAcid2 == "phe") {
                strip.setPixelColor(position, neopixel.rgb(0, 0, 50))
            } else if (AminoAcid2 == "pro") {
                strip.setPixelColor(position, neopixel.rgb(200, 100, 40))
            } else if (AminoAcid2 == "ser") {
                strip.setPixelColor(position, neopixel.rgb(255, 100, 0))
            } else if (AminoAcid2 == "thr") {
                strip.setPixelColor(position, neopixel.rgb(255, 50, 0))
            } else if (AminoAcid2 == "trp") {
                strip.setPixelColor(position, neopixel.rgb(180, 40, 60))
            } else if (AminoAcid2 == "tyr") {
                strip.setPixelColor(position, neopixel.rgb(10, 0, 40))
            } else if (AminoAcid2 == "val") {
                strip.setPixelColor(position, neopixel.rgb(10, 200, 10))
            } else if (AminoAcid2 == "stop") {
                strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Black))
            }
        }
    }
    strip.show()
})
miniDave_microbit_DNA_only_visualiser_simpleJavaScript
This is MakeCode JavaScript code to use with a microbit that is connected to a strip/string of individually addressable LEDs. The user can input a DNA sequence using the microbit and see it in the strip of LEDs! It uses the neopixel extension.
input.onButtonPressed(Button.A, function () {
    if (tilt_state == 0) {
        DNA_string.push("t")
        basic.showLeds(`
            # # # # #
            . . # . .
            . . # . .
            . . # . .
            . . # . .
            `)
    } else {
        DNA_string.push("c")
        basic.showLeds(`
            . # # # .
            # . . . .
            # . . . .
            # . . . .
            . # # # .
            `)
    }
})
input.onButtonPressed(Button.B, function () {
    if (tilt_state == 1) {
        DNA_string.push("g")
        basic.showLeds(`
            . # # # .
            # . . . .
            # . # # .
            # . . # .
            . # # # .
            `)
    } else {
        DNA_string.push("a")
        basic.showLeds(`
            . # # . .
            # . . # .
            # . . # .
            # # # # .
            # . . # .
            `)
    }
})
input.onGesture(Gesture.TiltLeft, function () {
    tilt_state = 0
    basic.showLeds(`
        # # # . .
        . # . # .
        . # # . #
        . . # # #
        . . # . #
        `)
})
input.onGesture(Gesture.TiltRight, function () {
    tilt_state = 1
    basic.showLeds(`
        # # . . .
        # . # # #
        # # # . .
        . . # . #
        . . # # #
        `)
})
input.onButtonPressed(Button.AB, function () {
    DNA_string = []
    basic.showLeds(`
        # . . . #
        . # . # .
        . . # . .
        . # . # .
        # . . . #
        `)
    strip.clear()
})
let position = 0
let DNA_string: string[] = []
let tilt_state = 0
let strip: neopixel.Strip = null
strip = neopixel.create(DigitalPin.P16, 150, NeoPixelMode.RGB)
tilt_state = 0
DNA_string = []
basic.showString("DNA!")
basic.forever(function () {
    position = -1
    for (let deoxyribonucleotide of DNA_string) {
        position += 1
        if (deoxyribonucleotide == "a") {
            strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Red))
        } else if (deoxyribonucleotide == "t") {
            strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Orange))
        } else if (deoxyribonucleotide == "c") {
            strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Blue))
        } else if (deoxyribonucleotide == "g") {
            strip.setPixelColor(position, neopixel.colors(NeoPixelColors.Indigo))
        }
    }
    strip.show()
})
DNA-Dave_Arduino
This is the code that runs on the arduino version of DNA-Dave

Schematics

DNA-Dave_Arduino
fritzing schematic file
dna-dave_arduino_gHiMUAC7Ki.fzz
DNA-Dave_Arduino_png
schematic png file
Dna dave arduino bb ra9qusnykt

Comments

Similar projects you might like

Gesture-Controlled Robot

Project tutorial by Romina Abachi and Youssef El-Gendy

  • 4,714 views
  • 0 comments
  • 12 respects

Amazing 6WD Off-Road Robot | Arduino RC Robot

Project tutorial by Jithin Sanal

  • 6,000 views
  • 1 comment
  • 46 respects

MeArm Robot Arm - Your Robot - V1.0

Project tutorial by Benjamin Gray

  • 25,065 views
  • 4 comments
  • 41 respects

End-Effector and Control Logic for Robot

Project showcase by Team PowerBerry

  • 8,274 views
  • 2 comments
  • 43 respects

Mini Me 1.5 - Adafruit HUZZAH Robot Doll

Project tutorial by Kitty Yeung

  • 5,848 views
  • 2 comments
  • 28 respects

Rory the Robot Plant

Project tutorial by AhmedAzouz

  • 5,415 views
  • 2 comments
  • 30 respects
Add projectSign up / Login