-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFocusShifter.html
More file actions
211 lines (159 loc) · 10.8 KB
/
FocusShifter.html
File metadata and controls
211 lines (159 loc) · 10.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
<!DOCTYPE html>
<html>
<head>
<title>LifeHack Microscope: Focus Shifter Autofocus</title>
<meta name="description" content="The LifeHack Focus Shifter extends the range of reflection based autofocus devices up to 10 microns away from the cover-slip using an arduino controlled translatable lens.">
<meta name="author" content="Josh Edwards">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="main.css">
<link rel="stylesheet" type="text/css" href="menu.css">
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-B9XZF5GEV3"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-B9XZF5GEV3');
</script>
</head>
<body>
<div id="myNav" class="overlay">
<a href="javascript:void(0)" class="closebtn" onclick="closeNav()">×</a>
<div class="grid-container">
<a href="home.html"><div class="hero-image-home">
<div class="menu-text"><h1>Home</h1></div>
</div></a>
<a href="MainBody.html"><div class="hero-image-MainBody">
<div class="menu-text"><h1>Main Body</h1></div>
</div></a>
<a href="BeamExpansion.html"><div class="hero-image-BeamExpansion">
<div class="menu-text"><h1>Beam Expansion Module</h1></div>
</div></a>
<a href="Excitation.html"><div class="hero-image-Excitation">
<div class="menu-text"><h1>Excitation Module</h1></div>
</div></a>
<a href="FocusShifter.html"><div class="hero-image-FocusShifter">
<div class="menu-text"><h1>Focus Shifter</h1></div>
</div></a>
<a href="IncubationBox.html"><div class="hero-image-IncubationBox">
<div class="menu-text"><h1>Incubation Box</h1></div>
</div></a>
<a href="https://github.com/HoldenLab/LifeHack"><div class="hero-image-github">
<div class="menu-text"><h1>Git Hub</h1></div>
</div></a>
<a href="ImageAutofocus.html"><div class="hero-image-ImageAutofocus">
<div class="menu-text"><h1>ImLock</h1></div>
</div></a>
<a href="Operation.html"><div class="hero-image-Operation">
<div class="menu-text"><h1>Operation</h1></div>
</div></a>
</div>
</div>
<script>
function openNav() {
document.getElementById("myNav").style.height = "100%";
}
function closeNav() {
document.getElementById("myNav").style.height = "0px";
}
</script>
<div class="hero-image">
<div class="hero-text">
<h1>Focus Shifter</h1>
<p>Range Extender for Reflection Based Autofocus</p>
</div>
</div>
<div class="nav-wrapper" style="height:80px;">
<div id="navbar">
<a href="javascript:void(0)" onclick="openNav()">☰ Menu</a>
</div>
</div>
<div class="sidenav">
<a href="#Description">Description</a>
<a href="#Parts">Parts</a>
<a href="#Construction">Construction</a>
<a href="#Software">Software</a>
<a href="https://github.com/HoldenLab/LifeHack/tree/master/Focus%20Shifter">Go to GitHub</a>
<a href="https://github.com/HoldenLab/LifeHack/issues">Report Bug/Feedback</a>
<hr>
<p>Project Contributors: Josh Edwards, Kevin Whitley, Sudeer Peneti, Yann Cesbron, Seamus Holden</p>
<p>Website by Josh Edwards</p>
<p>Updated: May 2021</p>
</div>
<div class="page">
<video src="Video/focus-shifter-animation.mp4" width="90%" controls autoplay muted></video>
<h1 id="Description">Description</h1><hr>
<p>To add in-sample offset shift to reflection autofocus systems (either home built or commercial systems such as the ASI CRISP) We developed an Arduino based controller for shifting the focus lock position of reflection based autofocus systems.</p>
<img src="Images/Focus-Shifter.jpg" width="60%">
<p>LifeHack incorporates a reflection based ASI CRISP as its primary method of maintaining focus. Similar to many other systems, it reflects an IR beam off a coverslip, and uses shifts in the position of this beam to maintain constant objective-slide separation by closed loop control.</p>
<p>The limitation of this approach is that it only allows for focus lock at/ very near to the coverslip, in a range < 1 um for a 100x high NA objective. The lock position can be offset by a fixed amount by physically displacing the autofocus device. However, to image cells at different heights within the same sample, this approach is not sufficient.</p>
<p>As the Focus Shifter module on LifeHack has its own beam path and tube lens we were able to produce large changes in the lock position by implementing a motorized Arduino controlled tube lens on this path. This effectively offsets the lock position (the coverslide) and the camera/ excitation focus by a variable amount, in our case allowing ~ 10 um of lock range on 100x NA 1.49 TIRF objective, instead of the standard < 1 um with a fixed autofocus tube lens.</p>
<p>Although this implementation is built around an ASI CRISP, in principle it should work for any commercial or home built autofocus system. To allow for use in conjuction with the ImLock system we recomend operating at 940nm.</p>
<img src="Images/Focus-Shifter-Line.png" width="40%">
<h1 id="Parts">Parts</h1><hr>
<iframe src="Parts-List/FocusShifter-Parts.htm" width="100%" height="500px" title="Parts"></iframe>
<div class="minipage">
<a class="button-design" href="Parts-List/FocusShifter-Parts.xlsx">⇩ Download ⇩</a>
<a class="button-design" href="https://github.com/HoldenLab/LifeHack/tree/master/Focus%20Shifter/Parts">⇩ Get Custom Part Designs ⇩</a>
</div>
<h1 id="Construction">Construction</h1><hr>
<a class="button-design" href="https://a360.co/3rbyG3y" target="_blank">👁 View CAD Design Online 👁</a>
<p>The module can be constructed following the 3D design. The zoom lens housing should be fixed (just tape it a bit) with the lens 1 rotation away from the main body end for CRISP set up. This allows the focusing range to be biased into the sample. The set up instructions for the CRISP system can be found <a href="http://asiimaging.com/docs/crisp_manual">here</a>.</p>
<h2>Control Set Up</h2>
<p> Wire the motor to the Adafruit control board in 6-wire configuration. Ensure to connect an external 12V power supply to the Arduino board to supply sufficient power to the motor.</p>
<img src="Images/Arduino-MotorConnection.jpg" width="40%">
<p> <a href="#Software">Code</a> is included to control the stepper motor and microscope focus via Arduino. Download the Arduino IDE, and open the Arduino focus-controller.ino sketch. Install the <b>_Adafruit\_Motor\_Shield\_V2\_Library_</b> via the <b>_Sketch\>Include Library\>Manage Libraries_</b> interface. Upload the code to the Arduino board.</p>
<p> Connect to the Arduino board and control the motor using the Arduino (or any other) serial monitor interface. Commands are encorporated to move the motor, and hence the lens, in both directions and to a zero point. There are also commands to adjust movement limits and speed.</p>
<p> Axial magnification is proportional to the square of the lateral magnification. In order for a tube lens shift of several mm to cause sufficient focal shift, we need to use a shorter focal length tube lens for the autofocus, compared to the imaging tube lens. In our case, the imaging tube lens is f=200mm, and the autofocus is f=100mm, reducing the axial autofocus magnification by a factor of 4 – this gives us an ~10 um lock range.</p>
<h3>Control Box</h3>
<p>In practice the serial monitor control is too clunky for any more than initial tests. For regular use there is a dual throw switch to control the lens position and a home button to return to a set "zero" point. Both are contained in a 3d printed box.</p>
<img src="Images/FocusShifterController.jpg" width="60%">
<p>To produce this, simply solder suitable lengths of wire to the arduino ports (up=2, down=3, home=4, ground) at one end and to a 9 pin connector at the other. This is best done with the arduino and connector already seated in the box.</p>
<img src="Images/Arduino.jpg" width="40%">
<p>At the control box end, solder suitable lengths of wire to the corresponding pins on a 9 pin (DB9) connector at one end and spade crimp connectors at the other.</p>
<p>Each connection requires a ground but the arduino only provides one. Creating a multi-ended connector, as below, solves this and contains the solder point within the control box.</p>
<img src="Images/Ground.jpg" width="40%">
<p>The buttons and 9 pin connector can then be inserted into the control box and connected using the crimp connectors.</p>
<img src="Images/FocusShifterController-Internal.jpg" width="40%" style="margin-bottom:2px">
<div class="minipage">
<img src="Images/Switch-Connected.jpg" width="100%">
<img src="Images/Button-Connected.jpg" width="100%">
</div>
<h1 id="Software">Software</h1><hr>
<p>Software is included to be uploaded and run on the arduino. This will function either through serial command or control button input.</p>
<a class="button-design" href="https://github.com/HoldenLab/LifeHack/tree/master/Focus%20Shifter/Software">👁 Get Software from GitHub 👁</a>
<h2>Serial Commands</h2>
<ul>
<li><b>move [value]</b> - moves lens to specified value</li>
<li><b>speed [value]</b> - sets movement speed to specified value (valid values 0 - 255)</li>
<li><b>relmove [value]</b> - moves lens by specified number of steps</li>
<li><b>pos?</b> - returns current lens position</li>
<li><b>speed?</b> - returns set movement speed</li>
<li><b>setzero</b> - sets current position as zero</li>
<li><b>stepsize [value]</b> - sets the size of a movement step</li>
<li><b>stepsize?</b> - returns set "stepsize"</li>
<li><b>home</b> - moves lens to set zero position</li>
<li><b>setmax [value]</b> - sets upper limit of lens movement range</li>
<li><b>setmin [value]</b> - sets lower limit of lens movement range</li>
<li><b>poslim?</b> - returns values for "setmax" and "setmin"</li>
<li><b>help</b> - prints list of commands</li>
</ul>
</div>
<div class="bottomnav">
<a href="http://creativecommons.org/licenses/by-nc-sa/4.0/">License: Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
<a href="https://blogs.ncl.ac.uk/holdenlab/">Holden Lab Website</a>
</div>
<script>
window.onscroll = function() {myFunction()};
var navbar = document.getElementById("navbar");
var sticky = navbar.offsetTop;
function myFunction() {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky")
} else {
navbar.classList.remove("sticky");
}
}
</script>
</body>
</html>