Pick-and-Place Machine Based on a 3D Printer Emil Arnika Skydsgaard s193579 DTU Elektro Technical University of Denmark 31015 - Introductory Project Mikkel Berrig Rasmussen s203854 DTU Elektro Technical University of Denmark 31015 - Introductory Project Jonas Attrup Rasmussen s203859 DTU Elektro Technical University of Denmark 31015 - Introductory Project Abstract —This paper investigates whether it is possible to convert a decommissioned 3D printer into a pick-and-place-machine (PNP) at a much lower cost than existing entry-level PNP machines. First we define what constitutes a minimal working PNP machine both in terms of required parts and functionality. We then present a design that shows how to convert nearly any 3D printer into a PNP machine using of-the-shelf parts (Arduino Mega R3, Ramps 1.6 Board w. DRV8825 Stepper Drivers, Juki 503 Nozzle and 2 pcs. ELP OV9712 720p webcams), open source software (Grbl and OpenPNP) and 3D printed parts while reusing as much as possible of the existing hardware. Next, we cover how we realized the design on a Bits from Bytes 3D Touch 3D printer from 2008 assembling all the parts together and integrating everything with the software, resulting in a fully functional prototype of a PNP machine at a total cost of 1,764 DKK (equivalent to 248 USD). We present the results of our tests showing how the machine is consistently able to place various sized components well within the required tolerances for producing a successful Printed Circuit Board (PCB). Finally this paper concludes that is feasible to convert a 3D printer into a working PNP machine with sufficient capabilities for populating typical PCBs at a cost that is 5-10 times lower than existing solutions. I. I NTRODUCTION Printed Circuit Boards (PCB) are an essential part of modern consumer electronics, playing a crucial role in the rapid reduc- tion of product sizes during the last 50 years. Ever decreasing component sizes, allows the creation of smaller PCBs and in turn smaller products, while keeping the functionality the same. With components in the μ m size now common in everyday electronics, assembling and soldering PCBs by hand is in- herently inefficient and impractical. As a result the industry shifted to the use of pick-and-place-machines (PNP) back in the 80’s, when submillimeter components was first intro- duced. Machine population (using PNP machines to place components) is vastly more efficient, allowing industry lead- ing machines to place around 200,000 components per hour (CPH). With such capabilities, PNP machines have, like PCBs, evolved to be a cornerstone of modern electronics production. Commercially available PNP machines start at 30,000 DKK going beyond 1,000,000 DKK, placing them well out of range for start-ups and personal use. Hobbyist kits like [1] and [2] have recently surfaced with prices from 10,000 DKK, however with some compromises, including greatly reduced speeds (around 500 CPH) compared to the commercial variants and requiring both a complicated setup and some tinkering before becoming operational. This leaves PNP machines out of reach, for makerspaces and small start-ups, as PNP machines priced towards prototypes and small batches of PCBs (Rapid prototyping in particular), does not exist. As an alternative, custom PCB manufacturers like JLCPCB and PCBWay offer machine population services, however the price of the specialized production facilities that are required is high, in turn raising the price of the service. As an example, the price of 10 rudimentary 60x60mm two layer PCBs is around 100 DKK. Machine population of the PCBs, raise the price to around 1,150 DKK for the 10 PCBs, excluding the cost of the components and limiting the quantity to just 50 components on only one side. In addition, delivery times can be in the order of weeks. A. Problem Statement PNP machines are currently expensive and difficult to come by for students, makerspaces and small-scale start-ups. On the other hand, devices that largely share the motion platform, like 3D printers, are becoming more and more common, to a point where they are available for everyone. This paper seeks to investigate the following: • To what extent is it possible to convert a 3D printer to a PNP machine with adequate functionality? • Is it possible to reduce the cost by a factor 10x in the process? Thus our goal was to transform a decommissioned 3D printer into a working PNP Machine with the lowest possible cost. II. S PECIFICATIONS First we must define what constitutes a working PNP Machine in terms of required parts and functionality. To ensure the highest probability of success we aimed to find the minimal set of specifications that would result in a working and relevant PNP Machine. A. Essential parts For a PNP Machine to place components in three-dimensional space at any horizontal orientation, requires a mechanical setup with four degrees of freedom, which is usually accomplished with three linear axes (XYZ) and one rotational axis, all equipped with motors. The machine must be able to move around its designated work area, which in turn must be large enough to encompass both component feeders and the PCB. 03.1 To execute coordinated movements a motion controller is required, and hence it will be the main interface for controlling the machine. It is commonplace to use the G-code protocol [3] which is a standardized set of instructions to control automated machine tools. Having a motion controller also provides an interface that encapsulates all the machine specific operations such as homing and limits. To pick up and move components, the machine must feature a tool that is able to grab and release components of various sizes. The most common method used in the industry [4] is to use a small nozzle in conjunction with a vacuum pump. The size of the nozzle imposes a limit on both maximum and minimum sizes of components the machine can handle, hence a machine will ideally have either multiple nozzles attached or different nozzles available to change between during assembly. Despite it theoretically is possible to run a PNP machine open loop, this is not feasible. In practice a two camera setup (one top and bottom camera) is used to aid navigation, locating component trays and correcting for errors. The error-correction is necessary since the components are allowed to move a bit inside the compartments in the trays, which would lead to problematic placement errors if not compensated for. It is important that the cameras have a decent resolution and manual focus to ensure detailed and consistent image capture. To make it all work, a computer running dedicated PNP software is needed to configure and execute placement jobs. For each component in the job the computer must locate it, pick it up, correct for potential errors and place it on the corresponding pad on the PCB. To accomplish this the computer must take inputs from the cameras and output commands to the motion controller. B. Required Functionality The core functionality of a PNP machine is its ability to pick and place components with great accuracy and speed. Since we are aiming to make a minimal prototype we have put great emphasis on accuracy and have not set ambitious goals with regard to speed. As long as the machine is able to assemble PCB in the order of hours, it will be a significant improvement compared to ordering assembled PCBs from overseas assembly services, which can take weeks. To be useful, a PNP machine must be able to place a broad range of components in order to populate typical PCBs. Based on a selection of sample PCBs a reasonable assumption would be to support SMD packages between the 0603 and SOIC- 8 package sizes (see Fig. 1). In addition We will assume that a PNP machine supporting PCBs up to 100cm 2 will be sufficient. A typical PCB of this size features 150 components or less. A PNP machine has three types of areas necessary for operation: component feeders, PCB work area, and fixed space for a bottom camera. For resistors and other small package components in a 8mm tape, we can assume a 8x4mm footprint. For 150 components this requires at least 48cm 2 for component feeders. In addition some constant space is required for two fixed fiducials and a camera looking up. The Fig. 1. A sample selection of SMD packages our prototype should support. cameras usual footprint is around 40x40mm and the same area is given to each of the two fixed fiducials. In total the reachable area (both nozzle and top camera can reach this point) should be 196cm 2 . With a nozzle offset of 50mm, one axis will be reduced by a total of 100mm. Therefore, assuming a compact setup, a square work area of 19.9cm or more should be able to function as a PNP machine. Once populated the PCB is soldered using a reflow oven. This process will move the components slightly due to surface- tension of the liquid solder. This phenomenon is known as self-alignment as it pulls the component in the direction of pads correcting slight errors. Depending on the solder paste and method of heating, this can correct up to 80% of the angular error [5]. For a working PNP machine it means that as long as the component pins hit the correct pads, relatively large placement errors can be tolerated. III. S OLUTION A. Design The single most comprehensive task in making a PNP ma- chine, is developing PNP software to control it. For our prototype, developing our own PNP software was unfeasible for the scope of this project. Instead we opted to use OpenPNP [6], an open source PNP software with a strong community and many successful PNP machines documented. Furthermore it is the only well documented nonproprietary PNP software available for free. OpenPNP is intended for both do-it-yourself (DIY) and commercial machines, and can be customized to fit just about any solution, making it perfect for our prototype. Every component will be mounted to the 3D printer, creat- ing the need for a stable and modular platform. To ensure full compatibility, component selection for the rest of the machine thus also depends on the choice of 3D printer, besides the low cost objective. We chose a decommissioned Bits from Bytes 3D Touch 3D printer from 2008 as our platform, primarily as it was free and available at the time. It has a large 40x35cm printing plate, providing more than enough space in the work area. Function wise, four stepper motors are used for the XYZ- axis, with dual motors on the Y-axis, and a larger stepper for the Z-axis, lifting the entire print bed, while the XY-axes are fixed in place. In the end, just about any 3D printer will suffice mechanically, the limiting factor is whether the size of the print bed, is larger than the 19.9x19.9cm determined to be the minimum suitable size. However most of the common 3D printers like [7], [8], [9] etc. all have larger work areas, allowing them to be used. 03.2 Due to the age of our 3D printer, the on-board controller did not support any form of control via USB or serial and was thus unfit as a motion controller. Instead we replaced it with a Ramps 1.6 board, mounted on a Arduino Mega R3 and paired with Pololu DRV8825 stepper drivers. A lot of other 4-axis CNC and 3D printer controllers are available, even dedicated PNP controller boards, like [1] can be obtained. The Ramps board is targeted at 3D printers or CNC routers and is basically a passive shield for the Arduino Mega, providing slots for stepper drivers, limit switches, on-board MOSFETs and general IO connections to the Arduino. It was chosen as it combines the required control with low cost, and although it is quite easy to replicate the function, it provided a tried and tested solution, minimizing the chance of hardware failure due to flawed design on our end. Stepper drivers are easy to come by, and ours were selected based on their low cost, and the ability to provide ample current (2.2A per coil) for the stepper motors already installed on the 3D printer. The Arduino platform was chosen as it is notoriously easy to work with, and has an extensive list of libraries, including a number of G-code interpreters. To run on the Arduino, we chose a modified version of the open source software Grbl, called Grbl-Mega [10] (From here on referred to as Grbl). The modified version is required to enable control of more than 3 axes, and require an Arduino Mega (whereas standard Grbl can be run on an Arduino Uno). Grbl stands out among the motion controllers for Arduino, as it is very easy to get up and running, furthermore it is listed on the OpenPNP wiki as being supported [6]. We chose to use existing motion controller software, as writing our own was beyond the scope of the project. Enabling proper computer vision (CV) requires careful camera and lens selection. The main factors to consider is sensor resolution, focal length and PCB component sizes. We selected two manual focus ELP OV9712 720p webcams, with a focal length of 3.6mm and 6mm. OpenPNP documentation recommends this exact camera model [6], or webcams with manual focus and a resolution of at least 1280x720p. Using a PNP lens calculator [11], the focal length required to accom- modate components from 0603 to SOIC-8, was determined to be 3.6mm for the bottom camera at a distance of 30mm and 6mm for the top camera at a distance of 50mm. Fig. 2. CAD model of the complete camera assembly. To ensure consistent CV performance, we designed custom ring lights, light diffusers and mounts for the webcams, creating a camera assembly [12]. Designing every part of the camera assembly ourselves, allowed us to customize the mounting and size of the assembly to our desire. To move components around, we went for the industry standard, using a nozzle assembly paired with a vacuum pump and a solenoid valve to quickly toggle vacuum in the nozzle. This approach was chosen as it is both very well documented and tested, and a lot of products enabling this are commercially available. The nozzle assembly consists of a hollow shaft Nema 8 stepper, custom brass adapter and Juki 503 nozzle. Fig. 3. Picture of the nozzle assembly, consisting of a Juki 503 nozzle, Nema 8 hollow shaft stepper, and custom brass adapter. The stepper allows rotation of the nozzle, while passing a vacuum through the shaft. For the nozzle, the Juki system was selected as it is a industry standard, allowing multiple nozzles to be seamlessly swapped into the same assembly if required, expanding the range of compatible components. Specifically the Juki 503 nozzle was selected, as it is the largest nozzle that is compatible with the 0603 package, while its size does allow lifting of larger components, including SOIC-8 packages (Officially the 503 nozzle is only compatible with 0603, 0805 and SOT-23 packages). To aid in lifting the larger components, we opted for a over dimensioned vacuum pump, capable of 12L/min at a vacuum of -80kPa below atmospheric pressure. The diagram below shows how all our selected parts are connected, and the direction of communication between them. Laptop (OpenPNP) Arduino (Grbl) Webcams Motors Valve Axis stops Ring lights Fig. 4. System design overview To utilize the available work area in the best possible way, we opted to design PCB and component mounting ourselves. The focus of the design was to create a modular work area, allowing it to be changed around quickly, to suit a variety of use cases. In a process that spanned multiple iterations, we ended up with a simple magnet mounted plate using double sided tape to attach the component tape reels. Using a plate allows mounting the tape reels outside the PNP machine where 03.3 it is easily reachable. Furthermore the protective tape can be removed at the last second, reducing the chance of losing components. To mount the PCBs, a simple brick sandwiching the PCB with the work area, kept it in place. Fig. 5. The final prototype with magnet mounted component tray and PCB (in orange) B. Assembly When assembling our design, the print bed had to be modified to fit the bottom camera into it and to enable mounting of PCBs and components. We mounted a 0.5mm steel sheet (enabling magnetic mounting) to the existing print bed, with a cutout and mounting holes for the bottom camera. The original control board and power supply along with the extruders was removed, but the rest of the 3D printer needed no modifications to suit our needs. When mounting the top camera and nozzle, the distance between them was minimized to maximize reachable area. The solenoid was mounted as close to the nozzle assembly as possible, to enable faster actuation due to less volume in the tube. As the 3D printer has a much larger range in Z than necessary, the space below the print bed was utilized by moving the Z-axis limit switch to half the printer height, allowing the vacuum pump and motion control board, along with the power supply to be mounted in the bottom of the 3D printer enclosure. Due to the way Grbl works, a G-code command sent to the motion controller cannot be canceled, creating the risk of damaging the delicate nozzle with an incorrect G-code command. To mitigate this, a kill switch was installed allowing us to kill power to the motion controller and motors at any moment. Each axis has a hard limit with a limit switch, where the homing sequence is modified to ensure safe operation. We deemed it important to home Z away from the nozzle, again to minimize the risk of damage. We control Grbl using absolute coordinates and it is there- fore important to define the same homing coordinate as well as possible travel in both Grbl and OpenPNP. Our nozzle model is mounted on a spring allowing us for some inaccuracy in the Z coordinate. This is ideal as the obtained tolerance can be used to be sure contact is made with the components without needing a more expensive nozzle with a probe installed, while ensuring the components are not damaged as the force is fairly limited [13]. C. Integration With the prototype assembled, every part of the PNP machine needs to be integrated. As OpenPNP is designed to support any PNP machine, it has no presets, and needs to be set up for the used motion controller. To operate as a PNP machine, OpenPNP has a set of commands, like move to coordinates, initialize machine, or enable actuator. For each of the relevant commands, a string of G-code commands compatible with the motion controller has to be defined. Grbl is made for CNC routers, which the supported command set mirror. Basic rotational and XYZ movement is supported, but beyond that Grbl is somewhat limited. As a workaround, the actuators for light and vacuum have been set up with coolant-flood-control- (M7, M8, M9), and spindle-speed-commands (S100, S0). Enabling CV requires setup and calibration of the two cameras. Using two fiducials mounted at different heights in the work area, the parallax of the top camera lens can be automatically calibrated. This enables OpenPNP to calculate height differences, purely based on the camera input. After the automated procedure succeeds, fiducial checks can be added to the homing sequence, allowing OpenPNP to use the fiducials to home the nozzle position with even higher accuracy. It proved necessary to calibrate the cameras for lens distortion, to improve the CV performance. OpenPNP has a built in correction algorithm, and simply needs a calibration pattern [14] to tune the algorithm to the individual cameras. With CV enabled, the final step was to calibrate the nozzle offset. This is a fixed value, that describes the offset between the center of top camera and the center of the nozzle. This allows OpenPNP to position the nozzle based on the camera coordinates. This was done by manually by homing to a fiducial, followed by placing the nozzle on top of it (the nozzle offset is then the difference in XYZ). Finally a nozzle tip and bottom camera calibration is re- quired. This allows OpenPNP to compensate for a slight tilt in the nozzle, and calculate a component offset to the center of the nozzle, if the picked up component is not grabbed at the center. OpenPNP requires specifications on all components and packages that will be used. This allows OpenPNP to calculate 03.4 height offsets, and where the center of the component is expected to be. All unique components are assigned a package with a feeder. There exist a lot of feeder options, the set up we use is the simplest possible with the tape reels mounted on a magnetic plate. This allows OpenPNP to use the holes in the tape reel as fiducials, and thus locate the exact position of each component in the reel. To actually use the machine, it is required to set up a job. A job is a list of parts with specific positions for the machine to place. This is done by importing position files generated by a PCB program (like KiCad), followed by assigning each location a part, (OpenPNP is capable of this as well). Based on this information and the location of the PCB, OpenPNP runs the entire job placing all the specified parts, and will only stop when complete, or if any errors occur during it. IV. E VALUATION To assess how well our prototype meets the desired specifica- tions, it was evaluated in terms of performance, usability and cost. A. Performance Test To test the PNP functionality of our prototype, we designed a test PCB to emulate a realistic use case. The test PCB is 56x50mm and features in total 78 components ranging from tiny 0603 resistors, capacitors and LED’s (placed in various angles) to large SOIC-8 and TSSOP-16 packages. The test PCB thus enables testing of both precision and repeatability of our prototype (which can be inspected visually) covering an adequately diversified selection of components. Furthermore the test PCB is designed such that when the components are soldered on and power is applied to the terminals of the board the LED’s will start blinking in a predictable pattern. This establishes yet another way of testing whether or not the components was placed within satisfactory tolerances. In the first test a PNP job was carried out by our prototype where a test PCB was covered in transparent double-sided tape to capture the exact placement of each component. By visual inspection the result (displayed in figure 6) shows that every component was placed well within its respective target area (approx. between 75% and 99% of each component’s body lies within its target bounding box). In the second test a PNP job was executed where a test PCB was covered with solder paste, simulating how a real job would be carried out. The resulting placements was very close to the outcome of the first test, and when the test PCB was reflowed binding the components to the pads the placements were further improved by the self-alignment phenomenon. In addition the final test PCB was working as expected when applying power, which indicate that all components was placed correctly. A time-lapse documenting the second test job is available at [15]. In both tests the prototype managed to place all components autonomously in accordance with the planned job and without errors or misdetects. The run time of the jobs was around 40 minutes, which is not particularly fast, but well within the specifications. Fig. 6. Placement results on PCB with double-sided tape. The yellow boxes indicate intended placement. B. Usability As a whole the machine is quite easy to use when it is set up and OpenPNP is configured correctly, but this only has to be done once. Setting up a job (installing the PCB, component feeders and locating everything in OpenPNP) is fairly quick; it takes about 20 minutes in total. In addition much of the setup is aided by the CV in OpenPNP making it quite easy to use without prior much prior experience. In addition our modular workspace design has proven to be quite intuitive and easy to work with Currently setting up the component feeders is the slowest and most finicky part of use. If the tape fiducials are located poorly it will cause a constant offset on pickup that can fail on the smaller parts. C. Cost In terms of cost our expenses during the project have mainly come from acquiring the necessary components. During the construction of the prototype we have had access to a small workshop and a 3D printer, which have covered all our needs for tools and manufacturing. Hence the total cost for convert- ing the 3D printer into a working PNP Machine prototype amounts to 1 , 764 DKK which is equivalent to 248 USD (see detailed list of expenses in table I). D. Future Improvements Despite the prototype working very well we believe it has the potential to work even better, making it an even more relevant and attractive solution. First of all it is possible to improve the speed significantly by installing an extra nozzle on the tool head, since this would allow the machine to pick up two components at a time, reducing the amount of travel needed. In our case the tool head itself is made out of aluminum and is quite heavy. Reducing 03.5 TABLE I T OTAL COST Item Cost (in DKK) Arduino Mega R3 148.00 Ramps 1.6 shield 135.00 DRV8825 stepper driver (4 pcs.) 86.00 Nozzle incl. stepper motor 510.00 Camera (2 pcs.) 552.00 Vacuum pump 151.00 Solenoid valve 51.00 Ring light PCB 74.00 Magnets 57.00 Total 1764.00 the weight of the tool head would allow for faster acceleration, hence improving the travel speed. Using better stepper drivers (eg. Trinamic branded drivers with CoolStep and StealthChop functionality [16]) would allow us to run the stepper motors even faster while at the same time reducing the vibrations from the motors. Another area to improve is the range of components the machine is able to place. Simple buying extra nozzles would enable the machine to place a wider selection of components, although it will require manually changing the nozzle at some point during the job. This could be further optimized by using a different nozzle system with a quick change adapter, that would allow for automated nozzle exchange (OpenPNP already supports this). The noise from the vacuum pump makes the machine a bit annoying to be around when it is operating. The noise could be reduced by adding shielding around it and/or damping pads to its mounting points on the machine. Many of these improvements comes at a increase cost, so if keeping the budget low is the highest priority, these improvements can be considered optional, since the machine works well without them. Even though OpenPNP is a great tool, we have encountered some things we would like to improve (by filing a pull re- quest). The main improvement would be adding the capability to do a fiducial homing routine on the spot at all times. Especially when performing the feeder auto setup we have experienced problems with getting the right level of precision. By being able to perform fiducial homing here, we believe it would result in a faster and more reliable setup process. V. C ONCLUSION The question of whether or not it is feasible to convert a 3D printer to a PNP machine has been evaluated in this letter. Using standard SMD component (0603 to SOIC-8 packages) and PCB sizes ( ≤ 100cm 2 ), along with at most 150 components per PCB, we have determined that a print bed of at least 19.9x19.9cm will suffice as work area for a PNP machine. With a Bits from Bytes 3D touch 3D printer as our platform, and applying a handful of carefully selected parts (Arduino Mega, Ramps 1.6 Board, DRV8825 Stepper drivers, ELP OV9712 720p webcams and a Juki 503 nozzle) we created a functioning PNP prototype, capable of lifting the required component sizes. The prototype populated our test PCB with 78 components in 40 minutes, yielding around 120 CPH. More importantly all component placements had beyond acceptable accuracy, and resulted in a working PCB once reflowed. Careful part selection kept the prototype cost down, without compromising functionality and ended in a total cost of 1764 DKK for the entire machine. Based on our experience, we can confidently state that it is possible to convert a 3D printer to a PNP machine, with the required accuracy to place common component sizes. Furthermore it can be done for 5 to 10 times less than existing solutions on the market. Although we did not fully achieve the goal of 10x cheaper, our prototype has proven that just about anyone can obtain a PNP machine for less than 2000 DKK. While the prototype has accomplished what we set out to do, future improvements like multiple nozzles, nozzle sizes and better stepper drivers could possibly bring the machine up to par with the hobbyist machines (500 CPH), with only a slight increase in cost. R EFERENCES [1] “LumenPnP Kit – Opulo.” [Online]. Available: https://opulo.io/products/ lumenpnp-kit [2] “LitePlacer — The Pick and Place Machine for Your Lab.” [Online]. Available: https://liteplacer.com/ [3] “G-Code: What is it? Commands, Reference List, Examples (CNC).” [Online]. Available: https://www.iqsdirectory.com/articles/ cnc-machining/g-code.html [4] “Gripper Nozzles.” [Online]. Available: https://www.nozzles4smt.com/ Gripper-Nozzles c 304.html [5] K. Duˇ sek, M. Nov ́ ak, and A. Rudajevov ́ a, “Study of the components self-alignment in surface mount technology,” Proceedings of the Inter- national Spring Seminar on Electronics Technology , pp. 197–200, 2012. [6] “Home · openpnp/openpnp Wiki.” [Online]. Available: https://github. com/openpnp/openpnp/wiki [7] “Professional 3D printing made accessible — Ultimaker.” [Online]. Available: https://ultimaker.com/ [8] “Ender-3 3D Printer.” [Online]. Available: https://www.creality.com/ products/ender-3-3d-printer [9] “Original Prusa 3D printers directly from Josef Prusa.” [Online]. Available: https://www.prusa3d.com/ [10] “gnea/grbl-Mega: An open source, embedded, high performance g-code-parser and CNC milling controller written in optimized C that will run on an Arduino Mega2560.” [Online]. Available: https://github.com/gnea/grbl-Mega [11] “Pick and Place Lens Calculator – Ikosi Vision.” [Online]. Available: http://www.ikosivision.com/index.php/pick-and-place-lens-calculator/ [12] “Attrup/PNP42: Custom parts and PCBs used in the PNP42 prototype.” [Online]. Available: https://github.com/Attrup/PNP42/tree/main [13] S. Meyer, H. Wohlrabe, K. J. Wolter, H. Rcuter, and M. Keil, “Investiga- tions on the mechanical stability and integrity of chip components after picking and placing in the surface mount technology process chain,” Proceedings of the 2013 IEEE 15th Electronics Packaging Technology Conference, EPTC 2013 , pp. 873–877, 2013. [14] “Camera Calibration Patterns – Nerian Vision Technologies.” [Online]. Available: https://nerian.com/support/calibration-patterns/ [15] E. A. Skydsgaard, M. B. Rasmussen, and J. A. Rasmussen, “PNP42 — Test-PCB Assembly Time Lapse - YouTube,” 2022. [Online]. Avail- able: https://www.youtube.com/watch?v=4Yg3GeWl18o&ab channel= EmilSkydsgaard [16] “Trinamic Motion Control - Trinamic.” [Online]. Available: https: //www.trinamic.com/ 03.6