DNA synthesis

Short term goal: inkjet printer based phosphoramidite oligo synthesis

Piezoelectric Oligonucleotide Synthesizer And Microarrayer (POSAM), paper
Pogo control software

Hardware:
Manual for National Instruments PCI-DIO-32HS IO board, $50-$100 used
Manual for National Instruments PCI-6040E, specs, $150+ used

Software:
Pogo (unavailable)
Lombardi v.0.7.3, tgz
Arrayer v.0.9.2, tgz

Arrayer software exploration
-Requires Traditional NI-DAC drivers, only runs on Win XP or earlier.

From Inkjet.cls:
Jets 1-32: Black; 33-64: Dark Cyan.
Jets 65-96: Light Cyan; 97-128: Dark Magenta.
Jets 129-160: Light Magenta; 161-192: Yellow.
mboolNozzle(192) As Boolean
NCHG As Integer = 8192

Private Const REQINTERVALFAST As Integer = 20 #Make interval 1 microseconds or 1MHz.
Private Const REQINTERVALSLOW As Integer = 2000 #Make interval 100 microseconds or 10kHz.

#Load buffer with pzt waveform. This is used for startnstop printing.
trpz = Array(0, 5, 10, 15, 20, 23, 24, 25, 25, 25, 25, 27, 27, 27, 27, 27, _
26, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1, 0.5, 0, 0, 0, 0, _
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
For j = 1 To 50000 Step 100
For i = 1 To 49
wBuffer(j + i) = Int(trpz(i) * 255 / 30) #8 bits, 30 volts fs.
Next i
Next j
## wBuffer = 2..50 102..150 202..250 (500 total copies) 49902..49950 values scaled to 255=30V

sub SelectPztJets:
Private Const LAT As Integer = 256
Private Const CLK As Integer = 512
Private Const SG1 As Integer = 1024
Private Const SG2 As Integer = 2048
Private Const SG3 As Integer = 4096
Private Const NCHG As Integer = 8192
Private Const WBIGSIZE As Long = 1510002
Private Const WBUFFERTEMPSIZE As Long = 415

#Load a buffer with the digital output that selects nozzles.
cnt = 1
buffer(cnt) = NCHG: cnt = cnt + 1
stat = DIG_Out_Grp(DEV, GROUP, 0)
For i = 1 To 64
pulse = (mboolNozzle(i) * SG1 * -1) + _
(mboolNozzle(i + 64) * SG2 * -1) + (mboolNozzle(i + 128) * SG3 * -1)
buffer(cnt) = pulse: cnt = cnt + 1
buffer(cnt) = pulse + CLK: cnt = cnt + 1
buffer(cnt) = 0: cnt = cnt + 1
Next i

--
30 bits each
buffer(1) = 8192
pulse= -1024(i1) - 2048(i65) - 4096(i129)
buffer(2) = pulse
buffer(3) = pulse + 512
buffer(4) = 0
pulse= -1024(i2) - 2048(i66) - 4096(i130)
buffer(5) = pulse
buffer(6) = pulse + 512
buffer(7) = 0
...
buffer(193) = 0

buffer(194) = 256
buffer(195) = 0
sent to printhead to select nozzles for print or not at 100us speed.
--

buffer(cnt) = LAT: cnt = cnt + 1
buffer(cnt) = 0

sub Spew
SelectPztJets
If drops < 1 Then Exit Sub
If drops > 500 Then drops = 500
count = 100 * drops

#Output piezo drive waveform.

#Enable pattern generation.
stat = DIG_Block_PG_Config(DEV, GROUP, ENABLEPG, REQSOURCEINTCLK, TIMEBASE, _
REQINTERVALFAST, EXTERNALGATE)
If (stat <> 0) Then ErrorMessage.Display ("DIG_Block_PG_Config error:" & stat), 15

stat = DIG_Block_Out(DEV, GROUP, wBuffer(1), count)

MainFrm.frm:
'Which banks are used?
For x = 1 To 6: usedBanks(x) = False: Next x
For x = 1 To COLZ
For y = 1 To ROWZ
i = theArray(x, y)
If (i > 0) Then usedBanks(i) = True
Next y
Next x

'Actually print.
Screen.MousePointer = vbHourglass
For b = 1 To 6 'For each bank of nozzles.
If (usedBanks(b)) Then
servo.MoveX (BankXOffset(b) - 1500)
For x = 1 To COLZ
Rem For x = 1 To 49 Step 2
'Turn on desired nozzles.
ink.NozzlesAllOff
For y = 1 To ROWZ
If (theArray(x, y) = b) Then ink.Nozzle((b - 1) * 32 + y) = True
Next y
'Spew drops and move 280 microns.
ink.Spew (d)
servo.MoveX (222)
Rem servo.MoveX (444)
Next x
servo.MoveX (-222 * COLZ - BankXOffset(b) + 1500)
End If
Next b

Printhead waveform:
R code:
trap<-c(0, 5, 10, 15, 20, 23, 24, 25, 25, 25, 25, 27, 27, 27, 27, 27, 26, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1, 0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
par(las=2)
barplot(trap,names.arg=c(1:55),cex.names=.85,main="Epson printhead trapezoidal waveform",xlab="microseconds",ylab="Voltage")

Chemicals:
0.02M Iodine in Tetrahydrofuran/ Pyridine/ Water, 40-4330-57 450mL $72.00, Glen Research
dA-CE Phosphoramidite, 10-1000-10M 1.0g $50.00, Glen Research (each)
dA-CE Phosphoramidite, 10-1000-02M 0.25g $12.50, Glen Research (each)
5-ethylthio-1H-tetrazole, 30-3140-52 200mL $100.00, Glen Research
3-Methoxypropionitrile, 500mL $55.00
Glutaronitril, 25g $34.00
Acetonitrile, 500mL $22.00
Dichloromethane, 500mL $23.00
Dichloroacetic acid, 500g $70.00
Grove O² Gas Sensor, $55
Ammonia Solution (28% in Water), 500mL $16.00
Methylamine (ca. 40% in Water, ca. 12mol/L), 500mL $19.00

Oligo/gene synthesis approaches under investigation
Step-by-step synthesis of DNA by Andy Extance

POSAM

A system is offered by Azco Biotech called the OligoArray for making oligos on a chip using electronic deprotection.

Info about DNA synthesis chemistry
DNA synthesis project, only prelim notes

Kwan inkjet printer project
Design of Electronics for a High-Resolution, Multi-Material, and Modular 3D Printer, pdf
Part of the MultiFab project, pdf, supplement

Epson Workforce 30 (ebay $60-$300): F3-3 Mach Turbo II printhead, 600 DPI resolution and 540 nozzles that can eject droplets ranging from 6 pL to 26 pL. 5 channels, 2 rows with 180 nozzles, 3 channels with 60 nozzles each.

Control:

Eight digital signals control printing:
S12, S13, and CK. NCHG determines whether the trapezoidal waveform is applied to the ink chambers; CHA, CHB, and LAT indicate the beginning of a sub-waveform; SI1, S12, and S13 determine drop size; and CK is the clock signal.

DAC is AD5424, $5. Two stage amp LT1632, $9 and Class AB amplifier (5 transistor) as the output stage.

Epson Artisan 50 (ebay $105-400): six rows, 90 nozzles per row. Twice as fast as Workforce 30.

General piezo driver info
Driving piezoelectric actuators in industrial inkjet printers
Design around MP111FD, $140.

Low-Cost Inkjet Process for 3-D Printing by Christopher T. Schmitt, pdf