The incubot: A 3D printer-based microscope for long-term live cell imaging within a tissue culture incubator

Graphical abstract

The open source movement within science has been providing innovations in affordable laboratory equipment, including microscopy and optics [6][7][8][9]. Open source approaches for low-cost incubator microscopes have been explored [10][11][12][13] and serve as great examples of affordable microscopes for live-cell imaging. Specific examples such as that created by Schneidereit et al [14] provide a cheap solution for high-content screening microscopy within an incubator, however its design for a single purpose makes adaptation for other experimental processes difficult. Designs such as work by Wincott et al [15] offer adaptability along with a low-cost, however imaging quality may not be sufficient for a large range of research applications. Additionally, work by Katunin et al [16] bridges these concerns, allowing for adaptability and reasonable imaging quality, but for a substantially higher price if fluorescence imaging is desired. General limitations with other examples of current designs curtail their potential widespread use within laboratories. The use of a CNC machine is neither common nor accessible amongst biomedical researchers. Options that allow for in-incubator microscopy but lack a motion control system result in a low-throughput. The use of only transmitted white light reduces the range of potential applications of other builds. An ideal scenario would be an affordable open source system that makes use of conventional low-cost commercial products, achieving a high imaging quality, while allowing for adaptability as a group's research interests or capabilities may change.
Microscopy is always a trade-off between field of view (FOV) and resolution. A static microscope is simple and effective, but only allows a small FOV to be imaged. Imaging more than a single FOV requires some element of motion control of either the optics or the sample. The open flexure microscope is a remarkable solution to this problem, as it includes very precise motion control at a low cost [17]. The main drawback is that the range of movement is limited and does not allow for the scanning of plates or flasks that are routinely used in cell culture experiments. Luckily, the problem of precise and repeatable control of three-dimensional movement has been solved in another field: 3D printing. Commercial 3D printers require submillimetre precision over a range of travel of tens of centimetres. Therefore, we designed an incubator microscope, the Incubot, which repurposes the core motion control system from a simple, entry-level cartesian 3D printer (a Tronxy X1). An associated user guide has been made available (https://osf.io/ht24j/) to help explain all steps in construction of this system, with the aim that non-experts in microscopy or optics can construct and use this equipment.

Hardware description
The Incubot uses a Tronxy X1 3D printer as a motorised stage for optics movement allowing for XYZ imaging of tissue culture flasks or plates (Fig. 1.). The X and Z axes are coupled directly to the Y axis to allow for the 3-dimensional movement of the optics unit which is coupled to the mount point that originally supported the extruder of the printer. A tissue culture plate is positioned above the optics via a stage composed of 15x15 mm aluminium extrusion and 3D-printed components, which remains stationary while the optics are translated. Moving the optics while keeping the sample static prevents movement of the medium during imaging, which may affect the cells. The optics unit is composed of 1 00 ø tubes, connecting a commercial infinite-conjugate objective lens to a Raspberry Pi Camera (V2), using an achromatic doublet tube lens to allow for microscopic image acquisition. The optional inclusion of a long pass filter allows for fluorescent imaging of samples. A silicone moulded rig was used to mount 8 LEDs around the objective lens, and thus allow for several illumination techniques to be performed, such as reflected, oblique, and fluorescent. Both the motorised stage and the plate-holder are mounted onto a 300 mm Â 300 mm breadboard (M6) with vibration-absorbing feet. The whole unit can be placed within a tissue culture incubator for long term use, allowing for inverted imaging of a tissue culture plate/flask within an incubator maintained at physiological conditions. As the entire system is maintained at 37°C it avoids the negative impact of thermal drift associated with temperature gradients present in heated stages.
A Graphical User Interface (GUI) was developed using Kivy 2.0.0 for Python 3, allowing for simple user control over parameters for live cell imaging, including the number of time points to image over, the temporal spacing between them, the number and layout of wells, the area of each well imaged, and automated focusing for each well. The total cost of this system (~€1000) represents a substantial saving over commercial equipment [18]. We have established an additional repository on GitHub (https://github.com/GeorgeMerces/Incubot/upload/main) for greater interactivity between us and potential users for distribution of improvements.
This build represents a low-cost alternative to commercial microscopy systems for physiological imaging of cells, with specific utility in simple imaging experimentations. The use of simple components and 3D printing for construction of the build allow for modification and adaptation of the build based on individual user needs.
Potential uses of the Incubot: Long-term monitoring of tissue culture experiments Long-term monitoring of tissue culture flasks for determination of optimum time for passaging/experimentation Semi-portable device for tissue culture information outreach Use as a regular scanning microscope for fixed cell imaging  XYZ_Coupler: 3D printed unit designed to couple the X and Z axes of the original Tronxy X1 to its Y axis. Optics_Holder: 3D printed unit to replace the extruder portion of the original Tronxy X1. Used to clamp hold of the optics and to couple XYZ motion to the camera.
Pi_Camera_Holder: 3D printed unit to hold the Raspberry Pi Camera in the correct orientation and distance from the lenses of the optical system.
LED_Holder_Mould: 3D printed negative mould for casting a silicone LED-holding ring. Plate_Holder: 3D printed unit to allow for stable elevation of a tissue culture plate over the optics of the Incubot for imaging.
MotionValidationProtocol: Python script to perform sequential positive and negative movements of known distance in the X and Y axes independently. Images are acquired after each movement to allow for later confirmation of movement distances.
IncubotGUI: Python script that uses Kivy to generate a graphical user interface for interacting with the Incubot and performing imaging experiments.
StationaryStabilityTesting: Python script to perform repeat imaging of a stationary location over time for XY drift tracking.
MotionRestTesting: Python script to determine the necessary time between movement commands and image acquisition for optimum Incubot function.
PairwiseStitchingMotionValidation: ImageJ Macro to stitch sequential images from the MotionValidationProtocol.py script for analysis of motion distances moved.
Movement Validation Template: Excel file template to input data resulting from the PairwiseStitchingMotionValidation. ijm ImageJ macro.
Motion Validation GUI: Python GUI script to guide the user through the process of calibrating their Incubot to move correctly in response to motion commands.
Well Location GUI: Python GUI script to guide users through the calibration process for specifying the location of key well landmarks necessary for defining the region where a tissue culture plate will be present.

Bill of materials
Please note that suppliers mentioned here are just suggestions and are in no way endorsements of the sites/products themselves. Material costs may vary over time and depending on location, and alternative sources may provide better prices than those listed here. We encourage readers building this design to identify their own sources for materials suitable for their location and needs. In addition to this list, we have included a list using institutionally approved suppliers, based on our own institution (https://doi.org/10.17605/OSF.IO/ES3HR). Please note that three items were unable to be found from approved vendors, these items being the 3D printer itself, the CNC motor shield, and the Drv8825 stepper motor drivers. Build instructions:

General Safety Notice
The build will ultimately require a 12 V power supply to the CNC motor shield, and 5 V power supply to the Raspberry Pi. Take care when performing any soldering to prevent short circuit generation or injury while working with intense heat.

General Assembly Notice
There are many connections listed below that rely on a M3 screw and a M3 nut. Please note that in most cases it is possible to reverse the orientation of these while constructing the Incubot, with no negative impact on build stability or quality. If you find inserting the screws into a MakerBeam groove to be easier during construction than sliding the nut, then please do whatever is easiest for you.
An animated assembly overview can be found within the online repository (https://doi.org/10.17605/OSF.IO/ES3HR). Rail Assembly (Fig. 2.) 1. Orientate the M6 breadboard (BB) on a flat surface. 2. Roughly align two 15x15x300 mm MakerBeam beams (MBXL300) on the BB 110 mm apart. 3. Incorporate 13 M3 nuts (M3N) into each MBXL300 topmost groove. Ensure these are evenly spaced and will line up with the holes in the 300 mm rails (MBR). 4. Align an MBR with each MBXL300, pressing the ends of both components against a flat surface. Ensure the M3N from step 1 are aligned with the holes in the MBR. 5. Insert a M3 6 mm screw (M3S6) into each of the holes of the rail, and loosely screw into the underlying M3Ns. 6. Once all M3S6s are loosely fit into their M3Ns, double-check the alignment of the MBR and the MBXL300. Alternating between all the M3S6s, gradually tighten until all M3S6s are strongly tightened, maintaining alignment throughout the tightening process. a. NOTE: Aligning the MBR and the MBXL300 at the ends can be done by pressing the ends of both against a flat object and maintaining pressure during the screw tightening process. 7. Use large-head M6 screws (M6S20) to affix the rails to the BB. The large heads of the screws are to be used as clamps to secure the rail units to the BB. Use two screws at each end of each rail unit, as close to the end as possible so as not to impede movement along the rail carriage. 8. Ensure the rail units are affixed with a separation of 110 mm and are maintained parallel along their axes.
Coupling the X, Y and Z axes ( Fig. 3. Fig. 4.) 1. Affix a corner bracket (MBCB) to each of the rail carriages using two M3S6s. 2. Align a 50 mm MakerBeam XL beam (MBXL50) with each of the MBCB and insert 2 M3Ns into each in the groove facing the MBCB. 3. Align the M3Ns with the holes in the MBCBs and affix to the MBCB using a M3S6 for each M3N. 4. Insert an additional M3N into each MBXL50 into the groove facing away from the other MBXL50, leaving it to rest at the bottom of the MBXL50 groove. 5. Insert 4 large-head M6 screws (M6S20) into the BB with roughly 9 mm of threading left above the BB. a. NOTE: Orientate these screws so that there is one pair in the very back row of BB holes, and the other pair is roughly 230 mm away. The screws within each pair should be in adjacent BB holes. 6. Attach the wheels to the Y axis of the Tronxy X1 3D printer (X1P) using M5 50 mm screws (M5S50) and the 3D-printed wheel spacer (3DWS). a. NOTE: This unit will not be firmly adhered as the nuts (M5Ns, originally from X1P) will not be attached until later, so be careful when moving this unit until then. 7. Insert a M3 12 mm screw (M3S12) into each of the two holes at the front end of the X1P plate, and loosely affix a M3N to each of the M3S12s achieving a loose fit where the screw head is partially mobile. 8. Slot a MakerBeam XL 200 mm beam (MBXL200) onto the X1P plate surface, aligning the M3S12 with its bottom-most groove. Tighten the M3Ns from below until firmly affixed, ensuring the MBXL200 is centred relative to the X1P plate. 9. Slide the Y axis of the X1P onto the BB so that the M6S20s (step 5) are resting in the large groove on each side of the axis. 10. Tighten the M6S20s in the BB (step 5) until the Y axis is firmly adhered to the BB, ensuring the X1P plate is allowed the full range of motion possible, and attach the X1P plate through the M5S50 screws used in wheel incorporation. 11. Place 2 M3Ns in the back groove of the MBXL200, bringing close to the centre. 12. Place 2 M3Ns in the front groove of the MBXL200, one at each end, leaving it lateral to the MBXL50. 13. Align a MakerBeam XL corner cube (MBXLCC) with each MBXL50 at the junction between the MBXL50 and the MBXL200 with the nuts aligned to the holes of the MBXLCC. 14. Affix each MBXLCC using these M3Ns and M3S6s to couple the MBXL50 to the MBXL200. 15. Gather 2 new MBXL50s and insert a M3N within the bottom groove of each. Align a MBXLCC with each M3N, and affix using a M3S6, ensuring alignment with the end of each MBXL50, forming a ''L" shape. 16. Rest the unit from step 15 on the MBXL200 top surface, so that the angle created by the MBXLCC addition fits perfectly onto the corner of the MBXL200. 17. Insert a M3S6 into the build plate from below and attach a M3N to hold it loosely in place. 18. Slide a MakerBeam XL 150 mm (MBXL150) and a MakerBeam XL 100 mm (MBXL100) through the right and left M3Ns (step 17) of the X1P plate, respectively. Tighten the screws. a. NOTE: Ensure the shorter beam is on the same side as the Y axis motor to prevent obstruction of the full Y axis movement.   i. NOTE: One rod should be to the left of the RCL when the PiCV2 is orientated with the lens facing upwards. g. Tighten the mounting screws on CAR1 units to secure the camera unit in place.
3. Screw the entire unit resulting from step 1 into the camera unit generated in step 2. 4. Attach the SM1 to RMS adapter (SRA) to the lens tube and tighten until fully secured. 5. Screw the objective lens (OBJL) into the SRA until fully tightened. 6. Construct the LED Holder a. Generate 50 g of Dragon Skin silicone (DSSil) by mixing 25 g of part A with 25 g of part B and mixing thoroughly.
Cast the DSSil to the LEDHM. i. NOTE: It may be necessary to vacuum the silicone to remove large air bubbles, however this is unlikely to be necessary unless you are overly enthusiastic with your mixing. b. Seal the chamber with the lid and cure (either room temp overnight or higher temp for faster curing). c. Remove the DSSil from the LEDHM once fully cured to get the silicone LED holder (SilLEDH). i. NOTE: Use tools to try and pry free the lid portion from the mould. This is difficult and may break the lid of the LEDHM in the process. d. Insert LEDs in the appropriately sized holes within the SilLEDH, forcing their pins through the silicone. Arrange the LEDs in the pattern: White, Red, Green, Blue, White, Red, Green, Blue. This will lead to pairs of the same colour LEDs opposite each other (Fig. 6.). i. NOTE: Each LED should be orientated at 45°to the plane of the SilLEDH. e. Solder the LEDs to wires on their positive and negative pins. f. Collate the ends of the negative wires onto a single small metal ring and solder to secure. g. Solder a long wire to this metal ring, and then insert the free end into a female-female jumper wire. h. Label each of the positive wires appropriately.
i. NOTE: The silicone moulded LED holder was easier to use, but harder to fabricate than a directly 3D printed holder. We have included the 3D model of the LED holder for users that prefer that option.
2. Attach the 3DOH to the plate using M3Ns and firmly tighten the M3Ns until the 3DOH is stable against the extruder plate. 3. Stabilise the extruder plate on the X axis beam using the wheels, M5Ss, spacers, and M5Ns (all originally from the X1P). 4. Insert a M3N into each of the hex spaces in the tightening portion of the 3DOH. 5. Insert a M3 25 mm screw (M3S25) into each of the tightening spaces on the opposite side to the M3Ns and loosely tighten. 6. Insert the optics unit into the hole in the 3DOH and tighten the M3S25 until the optics unit is held in place by the tension of the 3DOH. 7. Insert the 3 00 cage assembly rod (CAR3) into the corner hole of the top TLCP and tighten the cage assembly screw. 8. Attach an additional TLCP onto the top of the CAR3 and tighten its cage assembly screw to hold in place. 9. Stretch the constructed silicone SilLEDH over the top TLCP so that it is securely affixed to the optics unit, and the LEDs are surrounding the OBJL at an appropriate level for illumination of a sample without impeding the focal length of the OBJL. a. NOTE: Confirm a roughly 45°angle between the objective direction and the LED orientation to allow for oblique imaging later.
Plate Holder Construction (Fig. 8 10 & 11) to the base of the MBXL300 units from step 9 using two M3S6s and 2 M3Ns for each MBCB. Attach 2 of the units to the groove on the side of the 3DPH, and the 3rd unit to the medial groove of the right MBXL300. 13. Incorporate the plate-holding unit onto the BB using M6S25s. It may be necessary to apply a large washer to improve stability of the plate-holder relative to the BB. Electronics (Fig. 9.) NOTE: For a full guide on CNC motor shield establishment, please see [19]. 1. Affix the heat sinks to the stepper motor drivers (SMD) [20].
2. Apply any connectors to the microstepping pins on the CNC motor shield (CNCMS) that you wish, keeping note of the impact this will have on microstepping and torque ability. 3. Insert the SMDs into the appropriate positions for the X, Y, and Z axes of the CNCMS, leaving the A axis without a driver and ensuring the SMDs are orientated correctly. 4. Attach a red wire to the positive inlet of the CNCMS, and a black wire to the negative inlet of the CNCMS. 5. Solder/connect these wires to the corresponding wires/connectors of a 12 V/1250 mA power supply.  6. Connect the stepper motor cables to their appropriate pins on the CNCMS: X-X, Y-Y, Z-Z, leaving the A pins blank. a. NOTE: Depending on the distance from your motors to your CNC motor shield, it is likely necessary to replace the cables that come standard with the X1P with a longer alternative.
7. Attach the CNCMS to the Arduino Uno R3 (AUR3), ensuring all pins are firmly in their appropriate openings, taking care not to bend or damage any pins. 8. Connect the AUR3 to the Pi3B + using a USB cable. 9. Establish the GPIO pins and any additional cables as specified (Fig. 9.). 10. Connect the AUR3 to the Pi3B + using the USB cable.

Incubator Incorporation
1. Detach any cables connecting the Incubot to the Pi3B+, AUR3, or power supply. Leave the connections in place on the Incubot for ease of re-connecting. 2. Ensure a grating is present on the bottom rung of your incubator and confirm this is securely in place and level. 3. Remove enough gratings above this to facilitate the maximum height of the Incubot (Z-axis lead screw). 4. Spray down the disconnected Incubot with 70% ethanol and use an ethanol-soaked wipe to scrub the build as much as possible. 5. Apply WD40 or alternative lubricant to all bearings, moving parts, and parts potentially prone to corrosion to prevent damage from the humidity within the incubator. 6. Re-spray the Incubot with 70% ethanol, and place quickly onto the bottom grating of the incubator. Ensure the Incubot is placed with the Y axis motor towards the hinge of the incubator, to allow for the full range of motion in X, Y, and Z axes. 7. Ensure all wires and cables connected to the Incubot are led safely out of the incubator towards the opening side of the incubator. Orientate the X, Y and Z axes so that the Pi Camera is at the furthest possible distance from the opening of the incubator 8. Leaving a little bit of slack in the cables, affix them to the external incubator wall using electrical tape or an alternative adhesive, making sure to spread the cables so that there are no major gaps in the incubator seals that could allow for gas leakage while the doors are closed. 9. Re-connect the cables to their appropriate positions in the Pi3B + and the AUR3. 10. Return the X, Y, and Z axes to their ''resting position". For our lab, we choose to bring the Y axis as far away from the opening as possible, and the X axis as close to the opening as possible. The Z axis will be left at a height suitable for future imaging, however the level of the Z axis is not important at this point in the construction. Software

Initial Operation
Once the hardware has been established, code imported onto the Pi3B+, and the software is installed correctly, the device is ready to be calibrated. The depth of calibration will depend on the intended use of the Incubot and can be updated at any time. Calibration focuses on the key steps:

1) Validation of Motion 2) Calibration of Plate and Well Location 3) Objective Lens Calibration 4)
Imaging Folder Generation

Validation of Motion Settings
This section will cover the details of validation of Incubot motion prior to starting any experiments, describing how the user should confirm that the Incubot was capable of following movement commands reliably. The user should assess how closely the motion we requested is followed by giving the Incubot commands to move a specified distance in a specified direction while the optics is focussed on a scale graticule. Using this graticule, we can then calculate the actual distance moved by the Incubot and compare this to the commanded motion. G-code is a method of communicating specific instructions to a 3D printer to command it to move in a specific direction at a specific velocity. In the case of Arduino hardware, GRBL then converts the command into stepper motor function, rotating the motor for each axis in such a way that the hot end of the printer will end up in the correct final location. The conversion of the distance commanded to a specific number of stepper motor rotations can be adjusted within the Arduino IDE using GRBL.
To start, calculate the theoretically expected number of steps the stepper motor will need to rotate to move one mm based on the stepper motor brand (e.g. Nema-17) and the amount of microstepping used. Open the Arduino IDE and open a serial monitor. Type ''$$" and press the ''enter" button to bring up the current settings. Alter your specific setting by typing ''$" and the number designation of the setting, followed by an ''=" sign, and the new setting value. Then, open the source code for the script ''MotionValidationGUI.py". Make sure a folder is correctly specified in line 73, for your images to be saved to. Then, run the script from your Raspberry Pi terminal. This will open a GUI that will guide you through motion validation. Use the motion control system on the left side of the screen until the scale graticule is located centrally within your FOV. Once you are ready, select the ''Begin Imaging" button. This will send G-code commands to the Incubot, imaging prior to the command and then imaging again after the command. It will save these images to the pre-defined folder in the source code. Once imaging is complete, there should be 800 images saved within the folder, each labelled according to the axis, direction, repeat number, and whether it is the start image or the end image. Transfer all image files from the appropriate folder to a standard computer/laptop with FIJI [22] installed. Open ImageJ and ensure the program is up to date, updating the program if necessary. Open the script ''PairwiseStitchingMotionValidation.ijm" within ImageJ. Alter the ''folder" parameter to reflect the folder you have placed your images into. The ImageJ script will sequentially stitch images within this folder, two at a time, recording the pixel translation along with other details of the stitching process. If a results box is currently open, ensure you clear this, then run the stitching script and leave to complete. Once the script has completed, you will be left with a results box with 1600 lines of information.
Copy and paste this information into the first column of the sheet ''Raw Data Input" of the template excel file ''Movement Validation Template.xlsx". The excel sheet will automatically extract the important information from the cells and bring the data into the subsequent sheets. Use an image of your scale graticule taken by the Incubot and determine the pixel-to-mm conversion factor (we recommend using ImageJ). Input the number of pixels per mm into cell C1 within the following sheet ''Data Visualisation. This will automatically convert your raw pixel data into real distances in mm. The tables should now update, informing you of the average disparity between commanded motion and observed motion. If the median observed motion is more than 5% greater or smaller than the commanded motion, then calculate the over-movement or undermovement. If movements are unexpectedly inaccurate for a specific movement range, attempt to stitch a selection of images for this movement range and observe the result; it may just be a stitching issue. If it is an actual movement issue, adjust the parameters within GRBL. Repeat the validation process through the GUI and determine if the change was effective.

Calibration of Plate and Well Location
For the Incubot to accurately image a plate, it needs to be informed of where your plate is relative to its home position. To do this, place a plate of the type you wish to calibrate in the plate holder. Run the python script ''WellLocationGUI.py" and wait for the camera to initialise. Select the type of plate you are calibrating for, then use the X, Y, and Z motion control system on the left side of the screen to orientate your plate into the FOV. For the Incubot to calculate well locations, you need to define key well landmarks as outlined in Fig. 10. Use the motion control system to orientate each key well landmark into the centre of the FOV and then press the corresponding button for that landmark. Once you have selected all the key landmarks, select the ''Save Parameters" button. This will determine the starting location for this plate type and will calculate the necessary spacing between individual wells. It will output five arrays into the terminal. Simply copy these arrays into the Incubot GUI python source code into the corresponding section for your well type. Once performed, provided the plate location is stable between experiments, this calibration will only need to be performed once for each plate type. If at any point the plate-holder design is rearranged, or altered in any way, this calibration step will need to be re-performed.

Objective Calibration
If using a different objective lens to that described in this build, you will need to adjust the objective lens parameters within the ''IncubotGUI.py" script (lines 682-708). Simply attach the objective lens to be used (infinity conjugate is necessary to keep the light path short enough for use, however a modified longer lens tube would facilitate use of a finite conjugate objective lens), and open the script titled ''CameraPreview.py". Adjust the camera parameters to capture and display a preview of the appropriate dimensions for normal Incubot functioning, save the script, and run the script using Python3 via the terminal. Establish focus on a graticule with known dimensions and exit out of the script. Un-comment lines 41-43 (''CameraPreview.py") to enable image acquisition, input desired image save location (line 41) and image name (line 42), save the script, and re-run from the terminal. Transfer the resultant image to a desktop computer and determine the scale factor (pixels per mm) for the objective lens using FIJI. Use this scale factor to determine the size of the FOV in mm (both X and Y). Multiply these numbers by a factor of 0.8 to give the X and Y increments when using this objective to ensure enough image overlap for image stitching during image processing and analysis. Update the ''IncubotGUI.py" script at line 682-708 within the magnification setting functions with the modified values for xMod and yMod, depending on the mag- Fig. 10. Schematic Representation of a 6-Well Plate with Landmarks for Well Location Annotated. The positional points for well A1 are defined as the topmost (A1S) the bottom-most (A1I), the left-most (A1L) and the right-most (A1R) points on the well. The difference between A1S and A1I will give the diameter of the well (D), as will the difference between A1L and A1R which should be the same. The difference between the same landmark on adjacent wells will give the distance in X (A1L-A2L or A1R-A2R) between wells (DX), and the distance in Y (A1S-B1S or A1I-B1I) between wells (DY). Full available imaging area is shown below, with segments for later user selection highlighted. nification you are calibrating for. If using a different objective lens magnification, it would be worth updating the label for one of the provided magnification buttons, along with updating the function to reflect your different objective lens specifications.

Image Folder Generation
Additional parameters at the start of the ''IncubotGUI.py" script specify folders of importance for image saving. It is crucial that you determine and create an appropriate imaging folder for centralised image saving, whether that is on the raspberry pi itself or on an external storage device. Create a folder in your desired location and paste the folder location into the variable ''folder" (line 105, ''IncubotGUI.py"). If you possess a subscription to a large-volume Dropbox, I would recommend following the instructions within [23] and establish the settings as desired. Rename the Dropbox Upload script ''dbupload.py" and uncomment the import bpupload (''IncubotGUI.py", line 22), and ensure it is in the same directory as ''IncubotGUI.py". Please note that the Incubot will upload between imaging sweeps and will wait for upload to complete prior to beginning the next sweep, potentially impacting time between sweeps. If Dropbox upload is selected, ensure your upload speed is sufficient to transfer all image files from an imaging sweep in the time between sweeps.

Routine Operation
An annotated version of the Incubot GUI is provided in Fig. 11. For a quick-start GUI guide, please review Fig. 12. A video of the Incubot during movement has also been uploaded to the OSF repository (https://doi.org/10.17605/OSF.IO/ES3HR).
You may manually determine the appropriate Z level for general imaging by using the ''CameraPreview.py" script with a small image preview in conjunction to sending G-code directly using the Arduino IDE program. To do this, establish an image preview and send G-code to move the X and Y axes to an appropriate coordinate for sample visualization. Adjust the Z axis until focus is achieved. Command this location as the new Z0 point using the G-code command ''G92Z0". Alternatively, this  can be performed within the Incubot GUI. Select your objective lens magnification and plate-type (bottom left corner). The box to the right of this section will update to reflect the plate type you have selected. Press the ''Move to Well" button to use the simulated plate to move to the default XY coordinate specified for the selected well, which will not have the well base visible. Use the X and Y motion control sections to move the FOV to a region within the well where cells should be visible. Use the Z motion control section to adjust Z axis until focus is achieved. It may be necessary to adjust your Camera Parameter Selection options to optimise image preview/acquisition parameters. The LED ''White 02" will be active by default, so you may also need to select alternative LED(s) using the LED Control Box (middle right). Select/deselect options relating to Dropbox uploading, image file save type, and whole-plate imaging using the buttons within the Image Saving/Misc. Parameters section. If you would like to acquire an image or recording now for your records, you can do so using the Image Acquisition section to the right of the Camera Preview. If you wish to exclude certain wells from imaging, press the Add/Remove Well button and then select the wells you wish to exclude (excluded wells will be highlighted in dark blue).
To alter parameters relating to your imaging experiment needs, use the right hand side of the GUI. The imaging area by default will start outside of each well, at the minimum X and Y coordinate location as defined by the user during plate and well calibration. To alter this start location, select an appropriate button within the Well Imaging Start Location layout. A representative well is shown using a blue circle to allow for visualization of your rough start location. Select the area you would like to image using the XY Step Determination section to select your X and Y imaging dimensions in terms of number Adjust the image acquisition parameters if needed and alter any image acquisition parameters you wish to. 5) Select an appropriate start location for your experiment and select the number of images in the X and Y axes you wish to collect. Alter the scan number and scan interval parameters to suit your experimental needs. 6) Once all settings are to your liking, confirm the parameters by pressing the ''Confirm Parameters" button. 7) Once sure that imaging is established to your liking, press the ''Begin Imaging" button to begin the process of imaging. The Incubot will be unresponsive during the imaging run, so if emergency stopping is required, the Pi must be physically switched off and back on again. Note that this will result in the loss of positional XYZ information and the Incubot will assume the position it is left in is X0Y0Z0. You may need to manually move the Incubot to its X0Y0, or via the Arduino IDE once rebooted using negative X and Y coordinates. of images along the X axis and images along the Y axis. Below this, select the number of times you would like to scan the plate, along with your desired interval between scans (start time to start time). It is possible to set impossible requirements here by requesting an interval that is shorter than the actual time required for a single scan. Under these conditions, the Incubot will begin scans immediately after the previous one, however it will not inform you if this is expected to be the case. You can reduce the time required for a complete scan by reducing the area of imaging, or by saving in JPEG format as opposed to BMP. Ensure the LED(s) you would like to use during imaging are selected in the LED Control section (selected LEDs will be highlighted in blue). Once you are happy with your parameter selection, set the parameters using the Confirm Parameters button.
At this point you may wish to review your settings selection by observing the Incubot Setting Dialogue Box. If you wish to change parameters you may either alter the slider/button individually or press the Reset All Parameters button to begin the process from scratch (this will only affect parameters, and not the current Incubot coordinates). Once all parameters are to your liking, you are ready to begin imaging by pressing the Begin Imaging button. This will trigger the start of the scanning process. The Incubot will begin imaging at the first non-excluded well in the order of A1, A2, A3. . . B1, B2. . .etc. Once imaging has concluded, provided you have opted not to automatically upload your files to Dropbox, exit out of the GUI by pressing the Esc button on your keyboard. The imaging folder will be within your selected directory ready for transfer to a desktop computer for image processing, stitching, and analysis.

Routine Maintenance
Due to the use of the Incubot within a tissue culture incubator, regular coating of parts with WD-40 (or alternative lubricant) is required to prevent corrosion of parts. We recommend performing this every 2 months, however more frequently is not problematic.
Cleaning should be carried out when needed by removing the Incubot from the incubator and scrubbing down the build using tissue soaked in ethanol. WD-40 should be reapplied following each cleaning. Provided there are no tissue culture infections or visible build-up of matter, cleaning of the build can be kept to roughly every 6 months.

Validation and characterization
Hardware Validation

Plate Stability
Plate stability was assessed by imaging a single location of a USAF 1951 resolution testing slide every minute for 60 min (''StationaryStabilityTesting.py"). The coordinate location of a defined high-contrast line corner within the image was manually determined, and the displacement over time was calculated in both the X and Y axes. The X axis (Fig. 13A.) showed a higher level of stability than the Y axis (Fig. 13B.), and only moved a on average +/-1.3 mm over the time span. The Y axis showed greater displacement (+/-5.8 mm), indicating a minor degree of motion between images, however as the variations showed no trend over time (linear regression, P = 0.1998), there is no evidence of persistent drift.

Movement Fidelity
Movement fidelity was calculated according to the protocol established earlier in this manuscript (Operation Instructions > Validation of Motion Settings). Motion was requested in the range of 0.1-1.0 mm (Y axis) or 0.1-1.0 mm (X axis) in 0.1 mm increments. Following optimisation of the GRBL parameters controlling steps per mm, motion was highly reliable for a given requested motion, showing very little variability (<5% variation from requested motion) (Fig. 13C, D.).
The reliability of coordinate motion was also calculated by repeated imaging of a fixed tissue culture plate. The Incubot was commanded to scan single points within wells 10 times, moving back to the home location between each imaging sweep. Location of a structurally defined point (the termination of a cell process) was manually determined and the displacement was compared between imaging sweeps for 3 wells in both X and Y axes (Fig. 13E, F.). Y axis repeatability showed more variation than the X axis. This is likely due to greater instability caused by the Y axis carrying the mass of both the X and Z axes, compared to the X axis just carrying the optical components. This increased Y axis displacement is not significant enough to disrupt normal image processing/stitching procedures.

Minimum Time Between Movement and Imaging
As the Incubot hardware rests within a tissue culture incubator, it is impossible to completely protect against vibration and its effect on image quality. The major source of vibration within the incubator comes from the Incubot itself during periods of X or Y axis movement, necessitating a rest period between movement and image acquisition. To calculate the minimum delay required between movement and imaging, testing was performed to identify the shortest necessary period between movement and imaging. The Incubot was set up focused on human dermal fibroblasts (HDF) fixed with 4% paraformaldehyde. We used a script (''MotionRestTesting.py") to trigger movement of the optics 1 mm in either the X or the X axis compared to requested distance via G-Code. D) Distance moved by the Incubot in the Y axis compared to requested distance via G-Code. E) Deviation in X coordinate location of a landmark when the Incubot is commanded to move from a set location from a different location. F) Deviation in Y coordinate location of a landmark when the Incubot is commanded to move from a set location from a different location. G) Sharpness [7] of images taken by the Incubot following movement in the X axis with variable rest time delay durations. H) Sharpness [7] of images taken by the Incubot following movement in the Y axis with variable rest time delay durations. Y axis and collected images at 0.1 s intervals over a period of 2 s. Stability was measured by the sharpness of the image, calculated using the ImageJ plugin ''Microscope Focus Plugin" [24]. Stability was achieved 0.6 s after movement command in the X axis, and 1.0 s after movement command in the Y axis (Fig. 13G, H.).

Resolution Testing
Maximum image resolution was determined by imaging a USAF 1951 resolving power grid (Fig. 14A.) [25] and also by calculating the slant edge modulation transfer function (MTF) in FIJI [26]. The FOV was split into 20 subregions in a 4x5 grid, and the test pattern was imaged (using transmitted white light illumination) with the smallest resolvable elements moved between each of the subregions. The smallest lines clearly visible in each quadrant was recorded and converted into its equivalent lines.mm À1 . The maximum testable resolution able using our USAF 1951 slide was a series of lines with a density of 228.1 lines.mm-1 (group 7 element 6). This structure was resolved within all subregions of the Incubot FOV, meaning that resolution for all subregions is at least 228.1 lines.mm À1 . Slant edge modulation transfer function (MTF) was also assessed on an image of the USAF 1951 slide taken by the Incubot using transmission illumination at three different pixel resolutions: high resolution (2464x1500), the default Incubot resolution (1680x1200), and a 4X binned resolution (820x616). The MTF curves are presented in Fig. 14B, C,D. Increases in resolving ability was observed in the Incubot settings compared to the binned settings, while increasing pixel resolution further did not result in similar increases in resolving ability. Therefore, the Incubot pixel resolution settings were applied to balance resolving ability with saved image storage space required and time required for image saving. Users should note that depending on their own requirements, the binning automatically used within the Incubot may result in under-sampling of their images. We encourage users to adjust these parameters based on their own requirements.

Validation of imaging with multiple light sources
Reflected and Oblique Illumination HDF cells were cultured in a 6-well plate and imaged using both white LEDs, then just a single white LED to compare reflected white illumination with oblique white illumination. Oblique illumination revealed additional cellular details not visible with dual white LED illumination, highlighting the utility of low-cost single LED illumination at a 45°angle for visualising cellular morphology (Fig. 15A.). Introducing excitation light at an oblique angle eliminates the need for dichroic mirrors along the optical path, but it does introduce issues relating to illumination uniformity. The LEDs used in our build were dome-shaped, and the blue, red, and green LEDs emitted light in a 70-80°arc from their dome. The white LEDs emitted light in only a 55°arc. In our work, the unevenness of illumination in reflected/oblique imaging has not caused any major problems, and grid/collection stitching using ImageJ is still capable of stitching adjacent FOVs correctly.

Fluorescence
Fluorescence illumination uniformity was assessed by illuminating a fluorescent slide (Thorlabs, FSK2, green emission) using both blue LEDs (Fig. 15B.). While the slide was illuminated to the point of fluorescence, the illumination was not completely even. For our purposes, the uniformity is sufficient, however other users may wish to improve the illumination uniformity if performing quantitative fluorescent analyses. For fluorescence imaging the Incubot needs to be capable of fluorescence illumination and detection, but importantly because this system needs to be capable of fluorescence imaging repeatedly over a long time frame, it should not induce significant photodamage to cells over the course of this imaging. We assessed this by culturing commercially available HeLa cells stably expressing GFP [27]. GFP was excited by both blue LEDs and the emission was detected and overlaid well with oblique images taken in the same coordinate location immediately after (Fig. 15C.). To assess phototoxicity induced by repeated imaging, two 6-well plates of HeLa cells were seeded at a density of 15,000 cells per well and left for 4 h to allow for cell attachment. One plate was covered from light within the incubator, while the other was subjected to repeated imaging under blue LED excitation every hour for 24 h. Following the imaging protocol, the light-protected plate was imaged once in the same relative locations as the imaged plate. Cell density was calculated at this 24-hour point for all wells exposed to the LEDs (fluorescent) and all wells protected from light (negative control) (Fig. 15D.). There was no significant difference between the density of cells in wells exposed to the blue LEDs compared to control wells (Mann Whitney, P = 0.4206), indicating no significant impact of LED exposure on cell viability.

Imaging area
Tissue culture 6-well plates were seeded with HeLa-GFP cells and placed in the plate-holder of the Incubot. An area of 7x6 FOVs within each well was imaged. The ImageJ plugin ''Grid/Collection Stitching" [28] was applied and established using the appropriate conditions for the order of images and ordered to compute overlap, with the resultant image saved (Fig. 16A.). Stitching was successful and generated a large area view with cellular resolution. Optical Validation of the Incubot. A) USAF 1951 resolution testing grid representative image taken on Incubot at 10X magnification using collimated white light transmission illumination. Analysis of resolution using slant edge MTF with comparisons between a highly binned image (820x616 pixels) (B), the pixel resolution used for Incubot function (1680x1200 pixels) (C), and a higher pixel resolution (2464x1500 pixels) (D). Slant edge MTF [9] was calculated from the major right-hand slope present in each of these images, and is shown next to each tested image. Modulation factor is labelled on the y-axes, while spatial resolution measured in line pairs per millimetre (lp/mm) is labelled on the x-axis. Scale bars represent 500 mm.  Fig. 15. Image Acquisition Validation of the Incubot. A) Representative image of live HDF cells using dual white LED illumination (reflected) or single white LED illumination (oblique) with processes uniquely identified using oblique illumination highlighted with (*) (scale bars = 500 mm). B) Uniformity of fluorescent imaging assessed using a Thorlabs green fluorescent slide (FSK2) in greyscale (scale bar = 400 mm) with mean pixel intensity value from each column along the image's width. C) Live HeLa-GFP visualization using oblique illumination, blue LED fluorescent illumination (acquisition exposure time < 1 sec), and overlay (scale bars = 500 mm). D) Assessment of phototoxicity revealed no significant difference in cell density between LED-exposed and control cell after 24 h of repeat illumination of live HeLa-GFP cells (scale bars = 500 mm, representative images subjected to background subtraction processing in ImageJ). (For interpretation of the references to colour in this figure legend, the reader is referred to the web version of this article.)

Long-Term Imaging
HeLa-GFP seeding was repeated for a fresh 6-well plate which was then placed in the Incubot plate-holder. A single region of a single FOV was assessed over time, showing clear visibility of cells over the duration of the experiment (Fig. 16B.) Software Validation

Raspberry Pi Compatibility
The Incubot GUI (''IncubotGUI.py") was designed to be used on a Raspberry Pi 3B + with Python 3.7.3. To date, no alternative equipment has been tested for compatibility with the Incubot, however it is theoretically possible to generate a new code on an alternative system. The initial portion of python code is responsible for importing all the relevant dependencies for running of the full code, this is partitioned into a general section and a Kivy section. Kivy is a GUI designing module for python 3 which allows for generation of ''apps" within a python environment [29]. Each button within the app is generated within Kivy and bound to a function. The functions vary based on the button, for example pressing the ''6-Well" button will allow the raspberry pi to change the variables associated with plate type, such as number of wells, well diameter, and the [X,Y] coordinate locations for the default initial imaging of each well. This button, along with others, also commands Kivy to re-initialise the user interface, allowing for an updated screen view for greater ease of use. Of important note is that the GUI developed and distributed here was only tested on a monitor with aspect ratio of 4:3. Other display ratios may require some alterations to the code. The camera preview uses manually specified coordinate and size positions within the code, and so will not be applicable for other screen sizes. This can be adapted within the source python code where the camera preview dimensions are specified to orientate correctly for your specific screen size. The following dimensions should work more effectively for the camera preview on the touch screen: [96,17,263,139). Unfortunately, we were unable to test the GUI with a raspberry pi touchscreen.

Z-Axis Automated Focussing
Z-axis automated focussing was optimised using an image stack taken of low-density HeLa-GFP cells grown in monolayer conditions. A Z-stack with slice intervals of 0.2 mm was acquired using the Incubot (1680x1200, BMP format). Images were assessed for sharpness of edges using a Laplacian filter with, or without, a Gaussian filter or varying radius applied beforehand. The images were manually assessed for the slice with optimal focus, and then the output sharpness measurements were compared to determine which parameters allowed for correct selection of the most in-focus slice. Pure Laplacian filtering, and Laplacian filtering with a Gaussian pre-filtering (radius = 1) resulted in the selection of the correct image slice. Increasing radius of the Gaussian pre-filtering step (radius = 2, radius = 3) resulted in increasingly inaccurate assessment of optimal image slice. Thus, a Laplacian filter was applied to images with a Gaussian pre-filtering step using a radius of 1 pixel.

Adaptability
A key benefit of open source hardware is the facilitation of adaptation and modification. We here discuss some of the potential modifications to this build that could enhance its utility for specific purposes.

Optics
The build described here makes use of a Raspberry Pi camera system for image acquisition and Thorlabs optics components with a commercial objective lens. Each component in this system could easily be redesigned in numerous ways. The Thorlabs components may be replaceable using 3D printed components designed with well-designed threading. For example, the OpenFlexure microscope has already shown 3D printed optical components don't pose a barrier to quality imaging [17], and could serve to replace our entire optics system. Any image acquisition equipment compatible with Raspberry Pi will work in place of the PiCamera used here and could further facilitate either cost-reduction (e.g. using a webcam sensor) or increased imaging ability/quality (e.g. using a high-quality sensor). The use of the open-source PiCameraX system (https://pypi.org/project/picamerax/) could also boost the imaging performance of this build. Many potential improvements are offered by this package, including lens shading correction, which could prove very useful for imaging quality. Incorporation of specific improvements would be up to individual users, but please note this would require significant alterations to the IncubotGUI source code.

Maximum Plate Capacity
The area capable of being imaged was limited in our build by two key parameters: 1) the dimensions of the incubator, and 2) the range of the X and Y axes of the original Tronxy 3D printer. The dimensions of the incubator are fixed for any incubator, while the range of the printer can be extended. Recreational 3D printer users have increased the print areas for cheap printers using some easily accessible components [30]. For the Tronxy X1 printer used in our build, the X and Y axes could be extended using longer aluminium extrusion components to allow for a larger area capable of being imaged, which could facilitate the imaging of multiple plates simultaneously. While we utilise the Tronxy 3D printer's full Z axis range, it is not essential for imaging. Therefore, adaptation of the Z axis to be shorter could increase stability of the build while not impacting the necessary range of the device.

LED Assembly
We utilised cheap, readily available, 5 mm diameter LEDs for this build. It would be easy to replace the LEDs here with more sophisticated diodes, potentially with higher degrees of directionality, more specific wavelength emission, and controllable illumination power. A NeoPixel LED ring was originally tested with the Incubot and showed some success. A specific advantage of this system is the highly coordinated and specialised control of LED illumination, with RGBW illumination possible from multiple directions at a range of intensities. Issues may arise from the fact that the light was not directed towards the focal point of the optics, however this may be correctable through the addition of small silicone lenses to focus the LEDs to a desirable focal point. Adaptation by using LEDs with highly specific wavelength emission, in conjunction with the use of specific filters within the optics system, fluorescent imaging of a wide range of fluorophores is theoretically possible using this microscope.

Concluding Remarks
The Incubot represents an addition to the current open source microscopy options available to research scientists. It has proven ability in white light and fluorescent imaging of live and fixed cell culture monolayer within a tissue culture incubator, maintaining stability and reliability. The low-cost of the build compared to commercial options and the open source nature of the microscope facilitate its accessibility to a wide range of potential users.

Capabilities
Long-term fluorescent or oblique imaging of samples Structurally stable within the incubator Allows for physiological imaging of live cell monolayers User-friendly GUI for easy-to-use microscopy system Individual cells and cell processes visible over time

Limitations
Upload to Dropbox cannot occur simultaneously with imaging Time for imaging may impede on some desired imaging experiments, requiring compromise from the researchers Unable to exit imaging experiment without hard shutdown While oblique illumination simplifies the process of fluorescent imaging, it does result in illumination that is not uniform across the field of view (Fig. 15B).