‘Printer.HM’ is an open source extrusion 3D printer which consists of a commercially available open source robotic arm (uArm Swift Pro Desktop Robotic Arm) and a delivery module as the core part, and heater, UV module and inspection camera as optional utilities. The robotic arm controlled the movement of the x, y and z axes of the 3D printed stage. Various stages have been custom designed to fit different sizes of substrates or receiving reservoirs, including standard glass slides, petri dishes (90, 55 and 35 mm) and rectangular vessels (40 and 30 mm ) (Supplementary Fig. 2b). The dispensing module is made up of do-it-yourself (DIY) piston printheads that have been constructed from simple mechanical components (i.e. stepper motor, linear rail and ball bearing ) and custom designed 3D printed parts. All CAD files of the 3D printed parts from ‘Printer.HM’ are accessible and available on our Github repository, so users can freely modify the parts to better suit their applications if needed. The 3D printed parts were printed with polylactic acid (PLA) or acrylonitrile butadiene styrene (ABS) using an Ultimaker S3 3D printer. As a proof of concept, four printheads have been built here and they have been designed to accommodate either 1ml or 3ml syringes, but users can adjust the number of printheads or change the design of the syringe holder to fit other sizes of dispensing tools in according to their experimental need.
The platen and syringe heating systems of “Printer.HM” are composed of a custom-made aluminum support which has been wrapped with nichrome wires (UMNICWIRE2, Ultimachine) as a heating element and a type thermocouple K (Z2-K-1M, Labfacility) as temperature sensor. A UV LED light source (5 W, 365 nm, NSUV365, Nightsearcher) was used here and mounted on the aluminum breadboard of ‘Printer.HM’. Meanwhile, users can select different light sources according to the choice of photoinitiators. An inspection camera was mounted on the aluminum breadboard to monitor and record the printing process in situ. The distribution module and heaters have been connected to Arduino boards, while the robotic arm has an integrated Arduino for control. The assembly instructions for the printer and the electrical circuit of “Printer.HM” are described in Supplementary Note III.
Description of the program
The print operation was implemented by a custom-written Python program that communicated synchronously with the robotic arm and dispensing module Arduino boards, while the heating modules were independently controlled by graphical user interfaces. (GUI) which communicate with the Arduino boards of the radiator whose users can freely customize the program according to their needs. All exploits used in this study are available on Github.
Prior to printing, the ink was centrifuged at 1000g for 3 min to remove bubbles. Ink was drawn into a 1ml or 3ml syringe, and the syringe was loaded into the syringe holder of the setup. A collection reservoir, such as a Petri dish or glass slides, was loaded onto the custom 3D-printed stage. Four Python control programs have been written to import different types of geometry inputs: coordinates, equation, CAD model, and image inputs. Print parameters, such as print speed, offset position, extrusion rate, and initial z-position, are user adjustable and can be set in the control program. By default, builds were printed in the center of the collecting tank, unless an offset position was set.
Printing with coordinate input
A list of coordinates (X =[x1, x2, …, xn], there =[y1, y2, …, yn]) was loaded directly into the program, where Xnot and therenot denote the Xand therecoordinates of the nth point (see Supplementary Fig. 10).
Printing with equation entry
A set of Cartesian or parametric equations along with the defined range of the independent variable were entered into the control program (see Supplementary Fig. 11). The curve has been discretized by at least 100 regularly spaced points, depending on the length of the curve. The constructs shown in Figure 3b were fabricated using sine wave, butterfly curve, and circle equations. 3D features were produced by printing stacked layers of the 2D curve based on defined object and layer heights.
Printing with CAD model input
3D CAD models were either designed using Autodesk Inventor or downloaded from GradCAD (https://grabcad.com/library/software/stl) or Thingiverse (www.thingiverse.com). Prior to the print process, the CAD model was converted to a G-code file using Slic3r (https://slic3r.org/) with user defined slicing parameters (i.e. i.e. infill pattern, infill density, extrusion width and layer height). The G-code file was then imported into the Python control program (see Supplementary Fig. 12).
Printing with image capture
Images of the print design or photos of the hand drawn sketches have been imported into Inkscape. They were converted to G-code using the ‘Gcodetools’ extension on Inkscape (https://inkscape.org/), which was an extension designed for CNC machines. The step-by-step procedure for the conversion can be found in Supplementary Note IX. The generated G-code was then imported into the control program for image input, which was written to accept the G-code generated by this extension (see Supplementary Fig. 13).
Syringe heating and stage heating were applied where necessary. They were controlled by a custom graphical user interface (GUI), where users can directly specify the desired set temperature. The acceptable deviation from the desired set temperature has been defaulted to ±0.5°C here. The heating operation control program is available on Github.
A 2D line pattern for printing was designed in Inkscape and converted to a G-code file. The 3D shape of the target object (a nose model made of Ecoflex, Supplementary Fig. 8) was captured using a 3D scanner (EinScan H, SHINING 3D®) and was saved as an STL file. To analyze the surface of the target object, the nose model STL file was converted to a G-code file using Slic3R with the following clipping parameters (fill pattern = ‘Hilbert curve’, d extrusion = 0.2mm, infill density = 100% and layer height = 0.2mm). A dense fill parameter and a Hilbert curve fill pattern have been used here to accurately describe the target object. The target object’s G-codes (the nose model) and the print pattern (a line pattern) were then imported into a custom-written path planning Python program. In the program, the z-position of the print pattern was projected in accordance with the z-position of the target object at similar x, y positions. By default, the program assumes the pattern is printed around the center of the target object, but an offset position can be used if needed. The program generated a text file of the projected coordinate table, which was then imported into the control program used for image input to implement printing.
Distribution of cell suspension
The 3T3 mouse embryo fibroblast cell line was cultured in a2 vial and was passed using the standard protocol. The cell culture media used here were 10% v/v fetal bovine serum (F0804, Sigma) and 1% v/v penicillin-streptomycin (P43333, Sigma) in DMEM (31885023, Life technologies). A cell suspension with 2 × 106 cells/ml was used in dispensing experiments, with cells stained with Calcein AM (C3099, Fisher Scientific) at a working concentration of 2 μM for live cell staining. To prevent cell sedimentation, immediately after resuspension, the cell ink was drawn into a 1 ml luer-lok syringe and loaded into the syringe holder of the printer for dispensing operation. The distribution operations control program is available on Github.
Preparing the ink
Supplementary Table 6 summarizes the inks and support baths used to fabricate the constructs demonstrated in this work. The inks used here were SE1700 (Dow), 30% w/v and 40% w/v Pluronic F127 (P2443, Sigma), pre-cured alginate ink, pre-cured hydroxyapatite-alginate ink, 10% w /v sodium salt of carboxymethylcellulose (21902, Sigma), 10% gelatin (G1890, Sigma), 25% polyacrylic acid (450 kDa, 181285, Merck Life), collagen (50201, Ibidi), a solution of PEGDA , 68 wt% hydroxypropyl cellulose methacrylate and 3% w/v sodium hyaluronate (251770250, Fisher Scientific). Some of the inks were stained with sodium fluorescein (46960, Sigma) or rhodamine B (A13572.18, Alfa Aesar). Unless otherwise specified, inks were prepared by dissolving the desired concentration of chemical powder in deionized water. The hydroxypropyl cellulose methacrylate ink was prepared according to the method described in our previous study29. SE1700 ink was produced by mixing base precursor and catalyst at a weight ratio of 10:1. Alginate ink was prepared by pre-crosslinking 10% w/v alginate solution (W201502, Sigma) with 200 mM CaCl solution2 (C5670, Sigma) at a compression ratio of 10:3. The hydroxyapatite-alginate ink consisted of 15% w/v hydroxyapatite (21223, Sigma) dispersed in a 5% w/v alginate solution, which was then pre-crosslinked with 200 mM CaCl .2 solution at a 10:1 volumetric ratio. PEGDA ink was prepared by mixing PEGDA (Mn 700, 455008, Merck Life), deionized water and Irgacure 2959 at 10% w/v (g/100 ml ethanol, 410869, Sigma) to a volumetric ratio of 2:8:1. Ecoflex ink (Smooth-On Inc.) was prepared according to a similar formulation reported in the literature34, where Part A Ecoflex 00-30 was mixed with Part B Ecoflex 00-30 (with 1.2 w/v% Slo-jo and 1.2 w/v% Thivex) with the addition of one drop of light orange acrylic ink for visualization. The support baths used here were 1.3% xanthan gum (G1253, Sigma), 1% w/v Carbopol ETD 2020 (Lubrizol), 4.5% w/v gelatin suspension and 6% w/v /v of fumed silica (S5130, Merck Life) in mineral oil (330760, Merck Life). Carbopol, gelatin suspension, and fumed silica and mineral oil support baths were prepared according to the protocols described in previous studies.35,36,37.