A hackable, multi-functional, and modular extrusion 3D

Mechanical design

‘Printer.HM’ is an open-source extrusion 3D printer that consists of a commercially available open-source robotic arm (uArm Swift Pro Desktop Robotic Arm) and a dispensing module as the core part, and heating systems, a UV module and an inspection camera as optional utilities. The robotic arm controlled the x, y and z axis motion of the 3D printed stage. Various stages were custom-designed to fit different sizes of receiving substrates or reservoirs, including standard glass slides, petri dishes (90, 55 and 35 mm) and rectangular containers (40 and 30 mm) (Supplementary Fig. 2b). The dispensing module is composed of do-it-yourself (DIY) piston-driven printheads that were built 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 of ‘Printer.HM’ are accessible and are available on our Github repository, thus users can freely amend the parts to better tailor to 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 were built here and they were designed to accommodate 1 ml or 3 ml syringes, but users can adjust the number of printheads or amend the design of the syringe holder to fit other sizes of dispensing tools in accordance with their experimental need.

The stage and syringe heating systems in ‘Printer.HM’ are composed of a custom-made aluminium holder that was wrapped with nichrome wires (UMNICWIRE2, Ultimachine) as the heating element and a K-type thermocouple (Z2-K-1M, Labfacility) as the temperature sensor. A UV LED light source (5 W, 365 nm, NSUV365, Nightsearcher) was employed here and was mounted onto the aluminium breadboard of ‘Printer.HM’. Meanwhile, users can select different light sources based on the choice of the photo-initiators. An inspection camera unit was mounted onto the aluminium breadboard for in-situ monitoring and recording the printing process. The dispensing module and the heating systems were connected to Arduino boards, while the robotic arm has a built-in Arduino for controlling. Assembly instruction of the printer and the electrical circuit of ‘Printer.HM’ is described in Supplementary Note III.

Programme description

The printing operation was implemented by a custom-written Python programme that synchronously communicates with the Arduino boards of the robotic arm and the dispensing module, whereas the heating modules were independently controlled by graphical user interfaces (GUI) that communicate with the Arduino boards of the heaters which users can freely customise the programme for their needs. All the operation programme used in this study are available on Github.

Printing operation

Prior to printing, the ink was centrifuged at 1000 g for 3 min to remove bubbles. The ink was drawn into a 1 ml or 3 ml syringe, and the syringe was loaded to the syringe holder of the setup. A collecting reservoir, such as petri dish or glass slides, was loaded to the 3D printed custom-made stage. Four Python control programmes were written for importing different types of geometry inputs—coordinates, equation, CAD model and picture inputs. Printing parameters, such as printing speed, offset position, extrusion flowrate and initial z-position, are user-adjustable and can be defined in the control programme. By default, the constructs were printed at the centre of the collecting reservoir, unless an offset position was defined.

Printing with coordinate input

A list of coordinates (x = [x1, x2, …, xn], y = [y1, y2, …, yn]) was directly loaded to the programme, where xn and yn denote the x and y coordinates of the nth point (see Supplementary Fig. 10).

Printing with equation input

A set of cartesian or parametric equations together with the defined range of the independent variable was inputted in the control programme (see Supplementary Fig. 11). The curve was discretised by at least 100 evenly spaced points, depending on the length of the curve. The constructs shown in Fig. 3b were fabricated using equations of sine wave, butterfly curve and circle. 3D features were produced by printing stacked layers of the 2D curve according to the 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 printing process, the CAD model was converted to a G-code file using Slic3r (https://slic3r.org/) with the user-defined slicing parameters (i.e. fill pattern, fill density, extrusion width and layer height). The G-code file was then imported to the Python control programme (see Supplementary Fig. 12).

Printing with picture input

Pictures of the printing design or photos of the hand-drawn sketches were imported to Inkscape. They were converted to G-code using the ‘Gcodetools’ extension on Inkscape (https://inkscape.org/), which was an extension designed for CNC machines. Step-by-step procedure of the conversion can be found in Supplementary Note IX. The generated G-code was then imported to the control programme for picture input, which was written to accept the G-code generated by this extension (see Supplementary Fig. 13).

Heating operation

Syringe heating and stage heating were applied when required. They were controlled by a custom-written graphical user interface (GUI), where users can directly specify the desired set-point temperature. The acceptable deviation from the desired set-point temperature was defaulted to ± 0.5 °C here. The control programme for the heating operation are available on Github.

Non-planar printing

A 2D line pattern for printing was designed on Inkscape and was 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 a STL file. To analyse the surface of the target object, the STL file of the nose model was converted into a G-code file using Slic3R with the following slicing settings (fill pattern = ‘Hilbert curve’, extrusion width = 0.2 mm, fill density = 100% and layer height = 0.2 mm). A dense infill setting and a Hilbert curve infill pattern were used here for precisely describing the target object. The G-codes of the target object (the nose model) and the printing pattern (a line pattern) were then imported to a custom-written path planning Python programme. In the programme, the z-position of the printing pattern was projected in accordance with the z-position of the target object at the similar x, y positions. By default, the programme assumes that the pattern is printed around the centre of the target object, but an offset position can be used if needed. The programme outputs a text file of the projected coordinate array, which was then imported to the control programme used for Picture input to implement the printing.

Dispensing of cell suspension

3T3 mouse embryo fibroblast cell line was cultured in a 25 cm2 flask and was passaged using standard protocol. 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 the dispensing experiments, with the cells stained with Calcein AM (C3099, Fisher Scientific) at 2 μM working concentration for live cell staining. To prevent cell sedimentation, immediately after resuspension, the cell ink was drawn into a 1 ml luer-lok syringe and was loaded into the syringe holder of the printer for dispensing operation. The control programme for dispensing operation are available on Github.

Ink preparation

Supplementary Table 6 summarises the inks and the support baths used for fabricating the constructs demonstrated in this work. The inks used here were SE1700 (Dow), 30 w/v% and 40 w/v% Pluronic F127 (P2443, Sigma), a pre-crosslinked alginate ink, a pre-crosslinked hydroxyapatite-alginate ink, 10 w/v% carboxymethyl cellulose sodium salt (21902, Sigma), 10% gelatin (G1890, Sigma), 25% polyacrylic acid (450 kDa, 181285, Merck Life), collagen (50201, Ibidi), a PEGDA solution, 68 wt% methacrylate hydroxypropyl cellulose 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 further specified, the inks were prepared by dissolving the desired concentration of the chemical powder in deionised water. The methacrylate hydroxypropyl cellulose ink was prepared following the method described in our previous study29. The SE1700 ink was produced by mixing the base precursor and the catalyst at a weight ratio of 10:1. The alginate ink was prepared by pre-crosslinking a 10 w/v% alginate (W201502, Sigma) solution with a 200 mM CaCl2 (C5670, Sigma) solution at a 10:3 volumetric ratio. The hydroxyapatite-alginate ink was made of 15 w/v% hydroxyapatite (21223, Sigma) dispersed in a 5 w/v% alginate solution, which was then pre-crosslinked with a 200 mM CaCl2 solution at a 10:1 volumetric ratio. The PEGDA ink was prepared by mixing PEGDA (Mn 700, 455008, Merck Life), deionised water and a 10 w/v% Irgacure 2959 (g/100 ml ethanol, 410869, Sigma) at a 2:8:1 volumetric ratio. Ecoflex ink (Smooth-On Inc.) was prepared following a similar formulation reported in literature34, where Part A Ecoflex 00-30 was mixed with Part B Ecoflex 00-30 (with 1.2w/v% Slo-jo and 1.2 w/v% Thivex) with the addition of a drop of acrylic light orange color ink for visualisation. The supportive baths used here were 1.3% xanthan gum (G1253, Sigma), 1 w/v% Carbopol ETD 2020 (Lubrizol), 4.5 w/v% gelatin slurry and 6 w/v% fumed silica (S5130, Merck Life) in mineral oil (330760, Merck Life). The Carbopol, gelatin slurry and fumed silica-mineral oil supportive baths were prepared following the protocols described in previous studies35,36,37.