Low-cost open-source two-axis barcode-scanning platform for automated inventory of small storage grids

preprint OA: closed
Full text JSON View at publisher

Abstract

Abstract Manual inventory of storage racks in small warehouses, maintenance workshops, and teaching laboratories is time-consuming and exposes workers to awkward postures. Several small organizations do not deploy industrial warehouse management systems and continue to rely on ad hoc stock checks with handheld scanners. Here, we present a low-cost, open-source two-axis motion platform with an integrated two-dimensional barcode scanner, designed to automate the reading and logging of barcodes over a small storage grid. The hardware consists of a compact X–Y gantry mounted over a removable shelf, providing a usable scan area of approximately 40 x 40 cm within a 60 x 60 x 42 cm frame. Two stepper motors, driven by an Arduino Uno with CNC shield and A4988 drivers, position the scanner head above each cell of the grid in a parameterized scan pattern. The design only uses widely available mechanical and electronic components, and all CAD models, wiring diagrams, firmware, and host-side scripts are released under open-source licenses. We describe the mechanical structure, electronics, and firmware in sufficient detail for replication and adaptation, and provide build and operation instructions aimed at non-specialist users. At present, the prototype has undergone basic functional testing to verify end-to-end operation (gantry motion, barcode decoding, and data logging); however, it has not yet been characterized quantitatively. We propose a minimal validation protocol and example data formats for measuring throughput, read reliability, and scan-to-scan repeatability. The platform is can aid further development of small-scale inventory automation.
Full text 147,356 characters · extracted from preprint-html · click to expand
Low-cost open-source two-axis barcode-scanning platform for automated inventory of small storage grids | Research Square window.SnipcartSettings = { analytics: { enabled: false } }; (function() { var accessVector = localStorage.getItem('access_vector') || ''; window.dataLayer = window.dataLayer || []; if (accessVector) { window.dataLayer.push({ user: { profile: { profileInfo: { snid: accessVector } } } }); } })(); (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-K279D39R'); Browse Preprints In Review Journals COVID-19 Preprints AJE Video Bytes Research Tools Research Promotion AJE Professional Editing AJE Rubriq About Preprint Platform In Review Editorial Policies Our Team Advisory Board Help Center Sign In Submit a Preprint Cite Share Download PDF Research Article Low-cost open-source two-axis barcode-scanning platform for automated inventory of small storage grids Liang-Ching Hsu, Chen-Yu Chang, Hung-Yu Liang, Bo-Chang Dong This is a preprint; it has not been peer reviewed by a journal. https://doi.org/ 10.21203/rs.3.rs-8926424/v1 This work is licensed under a CC BY 4.0 License Status: Posted Version 1 posted You are reading this latest preprint version Abstract Manual inventory of storage racks in small warehouses, maintenance workshops, and teaching laboratories is time-consuming and exposes workers to awkward postures. Several small organizations do not deploy industrial warehouse management systems and continue to rely on ad hoc stock checks with handheld scanners. Here, we present a low-cost, open-source two-axis motion platform with an integrated two-dimensional barcode scanner, designed to automate the reading and logging of barcodes over a small storage grid. The hardware consists of a compact X–Y gantry mounted over a removable shelf, providing a usable scan area of approximately 40 x 40 cm within a 60 x 60 x 42 cm frame. Two stepper motors, driven by an Arduino Uno with CNC shield and A4988 drivers, position the scanner head above each cell of the grid in a parameterized scan pattern. The design only uses widely available mechanical and electronic components, and all CAD models, wiring diagrams, firmware, and host-side scripts are released under open-source licenses. We describe the mechanical structure, electronics, and firmware in sufficient detail for replication and adaptation, and provide build and operation instructions aimed at non-specialist users. At present, the prototype has undergone basic functional testing to verify end-to-end operation (gantry motion, barcode decoding, and data logging); however, it has not yet been characterized quantitatively. We propose a minimal validation protocol and example data formats for measuring throughput, read reliability, and scan-to-scan repeatability. The platform is can aid further development of small-scale inventory automation. Automated inventory Barcode scanning Open-source hardware Arduino Warehouse automation Educational platform Figures Figure 1 Figure 2 Figure 3 1. Introduction Inventory control and warehouse management are persistent challenges for small and medium-sized enterprises, particularly those operating in constrained spaces such as repair workshops, university laboratories, or small production facilities. Empirical studies in manufacturing and agri-food sectors show that basic warehouse management practices—material handling, storage, and inventory control—are strongly correlated with business performance; however, several small firms still rely on manual counting and ad hoc record keeping [ 1 , 2 ]. In practice, stock is often dispersed across shelves, boxes, and workbenches, with few visual cues to indicate location or status; this results in misplacements, stock-outs, duplicate purchases, and extended search times for technicians. Over the last decade, the software side of inventory management has matured rapidly. Commercial warehouse management systems provide real-time stock visibility, automatic re-ordering, and integration with enterprise resource planning (platforms. However, surveys and industry reports consistently highlight that small organizations struggle to adopt these systems owing to high licensing costs, customization effort, and integration overheads [ 2 – 6 ]. Even when affordable licences are available, the underlying physical processes (labeling, location coding, and systematic storage) are often not adapted to micro-warehouses with highly heterogeneous items and frequent one-off parts. At the lower end of the spectrum, open-source inventory software, such as InvenTree, offers lightweight, browser-based tools for parts and stock tracking that are well suited to small labs or makerspaces [ 7 ]. These tools close part of the gap by providing structured part catalogs, bill of materials (BOMs) management, and barcode integration; however, they do not directly address the physical task of locating and retrieving items in cluttered, three-dimensional (3D) storage spaces. As a result, the most time-consuming aspect of inventory work—searching for a component that is “somewhere on the shelf”—remains manual. In parallel, a growing body of research explores mechatronic and robotic approaches to inventory automation. A prominent line of work uses unmanned aerial vehicles equipped with cameras and barcode or QR-code readers to perform inventory scans in large warehouses [ 8 – 11 ]. These drone-based systems can significantly reduce cycle-counting time and improve safety in high-bay storage environments; however, they require wide aisles, line-of-sight access to labels, and substantial indoor navigation infrastructure. Therefore, they are poorly matched to small, crowded storage rooms where the ceiling height is low and obstacles are dense. Closer in spirit to the present work are open-source gantry and shuttle systems developed for automated plant phenotyping and vertical farming. Projects, such as MACARONS, a modular open-sourced automation system for vertical farming, and the inexpensive robotic gantry for soil moisture control, show that low-cost XY(Z) gantries built from commodity aluminum extrusions, stepper motors, and open-source control electronics can reliably move payloads over grid-like workspaces while remaining accessible to non-specialist builders [ 12 , 13 ]. These platforms show that open hardware can compete with industrial systems at orders of magnitude lower cost, provided that the design is carefully documented and modular. The hardware presented in this paper extends these open-hardware ideas to the context of small-scale technical inventory. Instead of transporting plants or pallets, the system is designed to move a camera and lighting module over a shelving unit, enabling automated visual scanning of labeled bins and parts boxes in a footprint comparable to a typical workbench. By integrating this tabletop gantry with open-source inventory software, such as InvenTree [ 7 ], the aim is to provide a bridge between digital stock records and the physical layout of a micro-warehouse: a low-cost, reproducible hardware layer that can be built, modified, and maintained by small organizations without access to industrial automation budgets. 2. Materials and Methods 2.1 Hardware description 2.1.1 Overall architecture and intended use The proposed device is a tabletop two-axis (X–Y) motion platform that carries a commercial two-dimensional (2D) barcode scanner over a flat storage surface. The intended use is automated inventory of small parts stored in a grid of locations on a shelf or workbench, such as containers of fasteners, electronic components, or maintenance parts. Instead of a worker manually pointing a handheld scanner at each item, the platform moves the scanner head over the predefined grid and logs all detected barcodes to an inventory database. Figure 1 shows the overall hardware architecture and scanning workflow. A rigid frame supports an X-axis gantry that spans the width of the storage area. A Y-axis carriage moves along this gantry, carrying the barcode scanner at a fixed height above the storage plane. Two stepper motors drive the X and Y axes via belt or screw transmissions. An Arduino Uno with a CNC shield and A4988 stepper drivers generates the motion commands and enforces travel limits. The barcode scanner communicates either directly with a host PC (USB HID mode) or via a serial link to the Arduino. The host PC runs a simple control script that initiates scan cycles, receives decoded barcodes, and stores them together with the corresponding grid positions and timestamps. The functional workflow is as follows. At the start of an inventory cycle, the operator defines a scan grid that covers the usable \(40\times40\) cm storage area and specifies the order in which cells should be visited (e.g., a raster pattern). After homing, the controller moves the scanner to the first cell, optionally dwells for a short time, and then advances to the next cell. At each position, the scanner attempts to read a barcode. If a valid code is decoded, the host logs the code, position, and timestamp; if not, the cell can be flagged as empty or unread. Once all cells have been visited, the platform returns to a safe position and the resulting inventory file can be imported into an existing stock-management tool. 2.2 Mechanical structure and scan workspace The mechanical structure is designed to be compact, rigid, and easy to fabricate using common workshop tools. The frame footprint is approximately \(60\times60\) cm with a height of approximately 42 cm, providing enough clearance for a flat storage surface and the moving gantry while remaining small enough to sit on a workbench. The usable scan area on the storage plane is approximately \(40\times40\) cm, which is sufficient to accommodate a grid of 2–4 rows and columns of parts containers, depending on their size. The main stages of the mechanical design and prototype realization are summarized in Fig. 2 . Panel (a) shows a CAD model of the frame, shelf, and gantry arrangement. Panel (b) illustrates the machined shelf and frame after fabrication. Panel (c) provides a close-up view of the scanner mount under the Y-axis carriage, and panel (d) shows the fully assembled prototype on a workbench with the scan area highlighted. Together, these views clarify the overall geometry of the system and the relationship between the scanner, gantry, and storage plane. The X-axis rails are mounted along the sides of the frame; the Y-axis carriage spans between them. The barcode scanner is mounted on the Y-axis carriage such that its lens is at a fixed distance (approximately 15 cm) above the storage plane, within the depth-of-field specified by the scanner datasheet. The scan area is indicated as a shaded rectangle in the CAD view; its dimensions and coordinate origin are used for mechanical design and for defining the scan grid in software. The storage surface is implemented as a removable shelf or tray. In the prototype, this shelf is a machined panel with a simple lip or locating features to keep parts containers from sliding; however, the design is intentionally non-specific so that users can adapt it to their own bins or boxes. Because the shelf is removable, different layouts (e.g., different grid spacings or special fixtures for irregular parts) can be tested without modifying the gantry. 2.3 Electronics and control hardware The electronics are built from widely available components to keep cost and complexity low. The core controller is an Arduino Uno, which is stacked with a CNC shield that hosts two A4988 stepper driver modules for the X and Y axes. Each driver provides step and direction control signals to a bipolar stepper motor, with configurable microstepping (typically 1/8 or 1/16) set via jumpers on the shield. The drivers share a common DC power supply in the range 12–24 V, sized as per the current requirements of the motors. Figure 3 summarizes the electronics and control architecture. Panel (a) shows the main subsystems and data flows: the Arduino Uno with CNC shield and A4988 stepper drivers interfaces with the host PC over USB, with the barcode scanner either connected directly to the PC in HID mode or, optionally, via a serial link to the controller. The joystick or rocker provides jog inputs for manual positioning, while two limit switches (SW1–SW2) can be wired to dedicated inputs for homing and travel protection. The DC power supply P1 provides a single low-voltage rail to the CNC shield, which in turn powers the stepper drivers and controller. Panel (b) provides a simplified wiring map of the connections used in the prototype. The X and Y stepper motors (M1 and M2) are connected to the corresponding motor outputs on the CNC shield, the DC supply is wired to the + V and GND terminals, and the limit switches and joystick are connected to the labeled headers (X-LIM, Y-LIM, 5 V, JX, JY, and GND). This abstraction is intended to help new users reproduce the wiring without requiring to interpret a full pinout diagram of the shield or driver modules. All connectors are labeled consistently with the silkscreen legends on the hardware and with the signal names used in the firmware. 2.4 Firmware and software Platform motion is controlled by firmware running on the Arduino, with two alternative approaches supported. In the first approach, the Arduino is flashed with the open-source GRBL motion-control firmware. Scan trajectories are encoded as G-code programs generated on the host PC. A G-code sender application streams these programs to the controller over the USB serial link. The G-code file defines the scan grid as a series of linear moves in the X–Y plane, typically arranged in a raster pattern. GRBL handles step generation, acceleration and deceleration profiles, and limit-switch handling. The barcode scanner operates concurrently, sending decoded barcodes directly to the host PC, where a logging script associates each code with the current position in the scan sequence. In the second approach, a custom Arduino sketch is used instead of GRBL. The sketch relies on a stepper-control library (e.g., AccelStepper) to generate coordinated motion on the X and Y axes, but hard-codes the grid coordinates and scan sequence in a compact data structure. This mode is easier to understand for users who are less familiar with G-code; it simplifies the host-side software because the controller can directly report motion status and barcode events in a single serial protocol. The trade-off is reduced flexibility in defining arbitrary trajectories. In both cases, the host-side software remains lightweight. A short Python or C# script is sufficient to initiate a scan, listen on the serial port for status messages or barcode strings, and write results to a CSV file with columns for timestamp, cell coordinates, and decoded barcode. By decoupling the low-level motion control from the host, the same hardware platform can be integrated with a range of inventory or laboratory information management systems, or used in teaching to demonstrate the interaction between embedded controllers and higher-level applications. 3. Design Files Summary The hardware and software required to reproduce the platform are provided as open-source design files. Table 1 lists the main files, their type, license, and where they can be obtained. The online repository also contains auxiliary assets such as STEP versions of the CAD models, editable diagrams, and example configuration files. Table 1 . Design files provided with the inventory scanning platform. File name File type Open-source license Location frame_assembly.dwg CAD drawing CC BY 4.0 (or CERN-OHL-S) Main public repository for this article. xy_gantry.stl 3D model CC BY 4.0 (or CERN-OHL-S) Same repository, directory /mechanics/. scanner_mount.stl 3D model CC BY 4.0 (or CERN-OHL-S) Same repository, directory /mechanics/. wiring_diagram.pdf Schematic CC BY 4.0 Same repository, directory /electronics/. inventory_scanner.ino Arduino firmware MIT or GPL v3 Same repository, directory /firmware/. grbl_config_settings.txt Configuration file CC BY 4.0 Same repository, directory /firmware/. scan_route_3x3.csv Example route file CC BY 4.0 Same repository, directory /examples/. scan_logger_python.py Host-side script MIT Same repository, directory /software/. bom_detailed.xlsx Spreadsheet (BOM) CC BY 4.0 Same repository, directory /docs/. build_steps_photos.pdf Build guide (PDF) CC BY 4.0 Same repository, directory /docs/. The accompanying README file in the repository briefly describes the purpose of each design file and provides instructions for adapting the hardware and firmware to different scan areas, storage layouts, or barcode scanners. 4. BOMs Summary A concise BOMs for the prototype is presented in Table 2 . The full BOM, including supplier links, part numbers, and cost breakdown, is provided as a spreadsheet design file (bom_detailed.xlsx). Table 2 Summary of main components used in the prototype. Designator Component Qty Key specifications Approx. unit cost* Subtotal* Notes M1–M2 NEMA 17 stepper motor 2 2-phase, \({1.8}^{\circ}\) /step, suitable torque for X and Y axes EUR xx EUR xx X and Y axis actuation U1 Arduino Uno (or compatible) 1 ATmega328P-based microcontroller board EUR xx EUR xx Motion controller U2 CNC shield for Arduino 1 Compatible with A4988 stepper drivers EUR xx EUR xx Breakout for motor drivers U3–U4 A4988 stepper driver module 2 Up to \(\sim2\) A/coil, microstepping capability EUR xx EUR xx X and Y axis drivers S1 DK-5105 barcode scanner 1 1D/2D codes, depth-of-field 40–250 mm EUR xx EUR xx Inventory sensing P1 DC power supply 1 e.g., 12–24 V, \(\ge3\) –5 A EUR xx EUR xx Motors and electronics F1 Frame profiles (steel/aluminum) 1 set Lengths for \(60\times60\times42\) cm frame EUR xx EUR xx Structural frame L1–L2 Linear guides/rods + bearings 1 set For X and Y axes, \(\sim40\) cm travel EUR xx EUR xx Linear motion C1 Motion transmission (belt/screw) 1 set Timing belts + pulleys or lead screws + nuts EUR xx EUR xx Coupling motors to axes H1 Scanner mount bracket 1 3D-printed or machined holder EUR xx EUR xx Holds scanner at \(\sim15\) cm above plane SW1–SW2 Limit switches (optional) 2 Mechanical endstops EUR xx EUR xx Homing and travel limits CAB Cables, connectors, fasteners 1 set Wiring, screws, nuts, etc. EUR xx EUR xx Assembly hardware The total hardware cost of the prototype is expected to be on the order of EURXXX, assuming small-quantity purchases from typical online suppliers. The cost can be reduced further by reusing available components (e.g., existing motors or power supplies) or by simplifying the frame construction. 5. Build Instructions The platform can be assembled in a small workshop or teaching laboratory using basic hand tools. The build process separates into three stages: (i) mechanical assembly of the frame, gantry, and shelf; (ii) installation and wiring of the electronics; and (iii) firmware upload and basic functional checks. The mechanical design and realized prototype are shown in Fig. 2 , while the electronics architecture and wiring are summarized in Fig. 3 . A more detailed, photo-based guide is provided in the file build_steps_photos.pdf in the online repository. 5.1 Required tools and preparation Before starting, the builder should verify that all mechanical and electronic parts listed in the BOMs (Section 5) are available. The following tools are recommended: hex keys or screwdrivers matching the fasteners used in the frame and gantry; a small adjustable spanner or socket set; a drill and drill bits (if any additional holes must be made in the frame); wire cutters, wire strippers, and a small flat screwdriver for terminal blocks; a multimeter for continuity checks and verifying supply voltages. It is good practice to lay out the frame profiles, linear guides, motors, and scanner on a clean work surface and to label the electronic components (Arduino, CNC shield, drivers, power supply, etc.) to avoid confusion later. 5.2 Mechanical assembly The aim of the mechanical assembly stage is to obtain a rigid frame with a smoothly moving X–Y gantry and a fixed scanner mount at the correct height above the storage plane. The primary elements and final geometry are shown in Fig. 2 . A recommended assembly sequence is as follows: Assemble the frame. Join the frame profiles to form a rigid \(60\times60\) cm base and attach the vertical supports as in the CAD view of Fig. 2 a. Check all corners with a square and tighten the fasteners only after the frame stands flat on the work surface. Install the shelf. Fit the removable shelf or tray into the base of the frame, ensuring that it sits level and does not rock. Any locating features for parts containers (lips and stops) should be installed at this stage. Install the X-axis. Mount the X-axis linear guides along the side members of the frame and assemble the X-axis carriage spanning between them (cf. Figure 2 b). The carriage should slide without binding from one end of the travel to the other. Install the X-axis stepper motor and the belt or lead screw, and adjust tension or alignment until motion is smooth. Install the Y-axis and scanner mount. Fix the Y-axis guides to the X-axis carriage and mount the Y-axis carriage. Attach the scanner bracket (or 3D-printed mount) to the Y-axis carriage as in Fig. 2 c. Position the scanner so that its focal region coincides with the storage plane, typically at a distance of about 15 cm, and tighten the mounting screws. Verify reach over the scan area. With motors still unpowered, move the gantry by hand to verify that the scanner can reach all corners of the intended \(40\times40\) cm scan area without collision (Fig. 2 d). Adjust any interfering elements or cable routes before proceeding. If mechanical endstops are used, they can be mounted at this stage at the ends of the X and Y travel, with their actuating levers positioned to be triggered by the moving carriages. 5.3 Electronics installation and wiring The next stage is to mount the controller electronics on the frame and wire the motors, scanner, and any input devices. The overall architecture and the connections used in the prototype are summarized in Fig. 3 . A typical wiring sequence is as follows: Mount the controller and power supply. Fix the Arduino Uno with CNC shield and the DC power supply to a rigid panel or to the frame, ensuring that all terminals and the USB connector remain accessible. If required, add a small protective cover to avoid accidental contact. Install the stepper drivers. Plug the A4988 driver boards into the X and Y slots on the CNC shield, set the microstepping jumpers as recommended in the design files, and adjust the current limit trimmer potentiometers to values suited to the motors used. Wire the motors and power. Connect the X and Y stepper motors (M1 and M2) to the corresponding motor outputs on the CNC shield, respecting coil pairings (Fig. 3 b). Connect the DC power supply P1 to the shield power input, and double-check polarity with a multimeter before energizing the drivers. Connect the scanner and inputs. If the scanner operates in USB HID mode, connect it directly to the host PC as in Fig. 3 a. If it has a serial mode, wire its Tx, Rx and ground to the Arduino pins specified in the firmware. Wire the joystick and any limit switches to the assigned digital input pins as indicated by the labels in Fig. 3 b. Route and secure cables. Route all cables along the frame, avoiding sharp bends and moving parts. Use cable ties or cable chains to prevent wires from interfering with the motion of the axes. After wiring is complete, visually inspect all connections. It is advisable to perform basic continuity checks on the motor phases and to verify that no supply leads are shorted to ground before applying power. 5.4 Firmware upload and initial tests Once the mechanical and electrical build is complete, the controller firmware can be installed: Connect the Arduino to the host PC over USB and select the correct board and port in the Arduino IDE or GRBL flashing tool. Either flash GRBL (for a G-code-based workflow) or upload the custom sketch inventory_scanner.ino from the design files repository. With the motors unloaded, issue small motion commands (or use a jogging mode) to verify that the X and Y axes move in the expected directions. Reverse motor wiring or axis direction settings in firmware if required. Trigger limit switches manually (if installed) and confirm that the controller enters a limit or homing state as expected. Present a test barcode to the scanner and confirm that decoded codes appear either directly on the host PC or in the serial monitor, depending on the chosen interface mode. At this stage, the platform should be mechanically and electrically ready. The next section (Section 7) describes the routine operating procedure for performing inventory scans. 6. Results 6.1 Operation instructions Once the platform has been assembled and wired as described in Section 6, routine operation consists of (i) verifying that the system is mechanically clear and electrically safe, (ii) homing and calibrating the axes, (iii) defining the storage grid and scan pattern, and (iv) running inventory scans and exporting the resulting data. The overall workflow is summarized in Fig. 1 . 6.2 Pre-operation checks Before each use, the operator should perform a short checklist to ensure safe and reliable operation: Mechanical clearance : Verify that no tools, cables, or loose objects obstruct the motion of the X and Y axes. Check that the shelf is seated correctly on the frame and that parts containers are stable within their cells (cf. Figure 2 d). Electrical connections : Inspect the power and motor connectors on the CNC shield and power supply. Confirm that the emergency stop (if present) is accessible and functional. Scanner function : Power the scanner and present a test barcode by hand to verify that decoded codes appear either on the host PC or in the serial monitor, depending on the chosen interface. Software configuration : Confirm that the correct firmware (GRBL or custom sketch) is installed on the Arduino and that the host-side script or G-code sender is configured to use the appropriate serial port. Typically, these checks take less than 1 minute and reduce the risk of unexpected stops due to wiring issues or mechanical interference. 6.3 Homing and basic calibration At the start of each inventory session, the platform should be brought into a known reference state; this can be done fully automatically if limit switches are installed, or semi-manually otherwise. Power-up : Switch on the DC power supply to energize the stepper drivers and connect the Arduino to the host PC via USB. Automatic homing (with limit switches) : If X and Y limit switches are fitted, issue the homing command in the GRBL interface or the custom firmware (e.g., $ H in GRBL). The axes will move toward their home positions, trigger the switches, and back off to a defined origin. Once homing is complete, the controller coordinate system is aligned with the physical scan area. Manual referencing (without limit switches) : If no switches are available, jog the axes using the joystick or host interface until the scanner is positioned above a chosen corner of the shelf (typically the front-left corner). In the host software, reset the working coordinates to \((x,y)=(0,0)\) at this position. Reachability check : Jog the scanner toward the opposite corner (rear-right) and verify that the intended \(40\times40\) cm scan area is reachable without collision or exceeding the mechanical limits of the axes. If the axes do not move as expected (wrong direction, rough motion), the operator should revisit the configuration or wiring as described in Section 6.3 before proceeding. 6.4 Defining the storage grid and scan pattern The storage plane can be divided into a regular grid of cells corresponding to locations where parts containers or individual items are placed. Typically, the grid is defined over the \(40\times40\) cm scan area shown in Fig. 2 a. Two approaches are supported: 6.4.1. G-code route files (with GRBL) In the GRBL-based workflow, the grid is encoded in a G-code program or in a CSV file that is converted to G-code by a small script. Each cell corresponds to a pair of coordinates \(({x}_{i},{y}_{j})\) , and the scan pattern is a sequence of linear moves connecting these points in a raster or serpentine pattern. An example route file (scan_route_3x3.csv) is provided in the design files (Section 4). 6.4.2. Embedded grid (with custom firmware) In the custom Arduino sketch, the grid coordinates are stored directly in the firmware as an array of positions. The order in which the array entries are visited determines the scan pattern. This approach simplifies use in teaching or small labs because the host PC only has to send a single “start scan” command and does not need to stream G-code. In both cases, the grid definition should be consistent with the physical layout of the shelf. If parts containers are re-arranged or a different shelf is installed, the grid coordinates must be updated accordingly. 6.5. Running an inventory scan Once the grid and scan pattern are defined, an inventory scan proceeds as follows: Load items. Place barcoded items or containers in the grid cells on the shelf. Ensure that barcodes face upward and are not obscured by other objects. Start the scan. In the host application or serial terminal, issue the command to start a scan (for instance, sending a specific character to the custom firmware, or starting the G-code program in a GRBL sender). The controller executes the workflow outlined in Fig. 1 : it moves to the first cell, optionally dwells for a short time, and then advances to the next cell. Monitor motion and reads. During the scan, the operator should verify that the motion is smooth and that the scanner successfully reads barcodes at representative positions. In the GRBL-based workflow, the host PC will log decoded barcode strings as they appear; in the custom firmware workflow, the controller will report motion status and barcode events over the serial link. Completion. At the end of the route, the controller returns the scanner to a safe parking position (e.g., front-left corner) and signals completion to the host. The motors can be disabled or powered down if no further scans are planned. If a barcode cannot be decoded at a particular cell, the corresponding entry in the log file can be marked as empty or unread. In practice, unread cells are often because of barcodes placed at extreme angles or partially covered, and can be corrected by adjusting item placement or scanner height. 6.6. Data output and integration with inventory systems The host-side script records each successful read in a simple text or CSV file. A minimal format consists of one line per event: timestamp (ISO 8601 string), cell coordinates or indices, decoded barcode string. For example: 2025-03-10T14:12:05, 0, 0, “ABC123” 2025-03-10T14:12:07, 1, 0, “DEF456” 2025-03-10T14:12:09, 2, 0, “GHI789” This file can be imported into a spreadsheet application or joined with an existing inventory database by using the barcode as a key. For open-source inventory tools, such as InvenTree, it is straightforward to write a small adapter script that converts the log file into the required format for bulk stock updates. 6.7 Safety and troubleshooting Although the platform operates at modest speeds and forces, basic safety precautions should be observed during operation: Do not place hands or tools inside the scan area while the axes are moving. Avoid looking directly into any visible aiming beam from the scanner at close range. Ensure that cables are routed so they cannot be snagged by the moving gantry (cf. Figure 3). Switch off the power supply before modifying the wiring or changing driver settings. Common issues and remedies are as follows: Missed steps or rough motion: reduce acceleration and maximum speed settings in the firmware, increase microstepping, or verify that belts and pulleys are correctly tensioned. Inconsistent barcode reads: check scanner focus and height, increase dwell time over each cell, or adjust lighting conditions if the scanner is sensitive to glare from the shelf. Communication errors: ensure that only one application is connected to the Arduino serial port at a time, and verify that the baud rate and port settings match the firmware configuration. With these procedures in place, the platform can be operated routinely by non-expert users in small warehouses, workshops, or teaching laboratories. 7. Discussion 7.1 Validation and characterization The present prototype was verified to operate correctly at a functional level: the X–Y gantry covers the intended scan area, the barcode scanner successfully reads standard printed codes at the chosen height, and decoded barcodes are logged on the host PC while the platform executes a grid scan as described in Section 7. However, no systematic quantitative characterization of throughput, read reliability, or repeatability has yet been conducted. Therefore, this section serves two purposes: (i) to document the current functional tests that confirm basic operation, and (ii) to propose a minimal validation protocol that future users can follow to quantify performance. Tables 3 and 4 present suitable data formats for reporting results. The numerical values shown are illustrative placeholders only and must be replaced with measured data before submission of the final article. Table 3 Example format for reporting throughput versus number of items. Note: numerical values are illustrative placeholders only. Run Number of items Scan area (cm \(\times\) cm) Cycle time (s) Read success (%) 1 4 \(20\times20\) 12 100 2 9 \(30\times30\) 28 100 3 16 \(40\times40\) 55 94 Table 4 Example format for reporting position-dependent read reliability. Note: numerical values are illustrative placeholders only. Position ID Coordinates (cm) Attempts Successful reads Success rate (%) P1 (5, 5) 10 10 100 P2 (35, 5) 10 9 90 P3 (5, 35) 10 9 90 P4 (35, 35) 10 8 80 P5 (20, 20) 10 10 100 7.2 Current functional tests During development, the prototype underwent a series of informal tests to verify that all major subsystems behave as intended: Motion range and smoothness : With the scanner mounted at the nominal height, both axes were driven manually and under controller command across the full mechanical travel. The scanner head could reach all four corners of the planned \(40\times40\) cm scan area without collision. No binding or severe vibration was observed at moderate speeds. Scanner operation over the shelf : Standard 1D and 2D barcodes printed on paper labels were placed at several positions on the shelf. While the gantry was slowly moved by hand and in simple straight-line trajectories, the scanner reliably decoded the labels when they passed through its specified depth-of-field. End-to-end logging : With the firmware and host script configured as described in Sections 3 and 7, the system was commanded to follow a short grid scan. Decoded barcodes appeared in the host console and were written to a CSV file together with timestamps. Spot checks confirmed that the recorded codes matched the physical labels placed on the shelf. These checks establish that the device functions as a complete inventory scanning loop; however, they are insufficient to quantify performance. The subsections below outline a minimal validation campaign for future measurements. 7.3 Proposed quantitative characterization A practical characterization can be built around three questions: How does throughput (cycle time) scale with the number of items to scan? How reliable are barcode reads across the scan area? How repeatable are successive scans under identical conditions? The following protocols can be implemented using the existing hardware and design files. 7.3.1 Throughput versus number of items Objective quantify how the total scan time and read success rate depend on the number of items and the size of the scan area. Procedure : Define several grid layouts within the \(40\times40\) cm scan area, for example \(2\times2\) , \(3\times3\) , and \(4\times4\) cells. Place a barcoded item in each cell of the grid. Ensure that all barcodes are clearly visible and within the scanner’s depth-of-field. For each grid, perform at least three complete scans using the standard scan pattern and controller settings. For each run, record the total cycle time and the number of cells where a barcode was successfully read. Reporting format Table 3 shows an example of how results can be summarized. The values are placeholders and are only included to illustrate the structure of the table. From such data, users can compute the average cycle time per item and check whether the platform meets their requirements for periodic inventory counts or teaching laboratory exercises. 7.3.2 Position-dependent read reliability Objective Assess how reliably the scanner decodes barcodes at different positions within the scan area. Procedure : Select representative positions in the scan area; for instance, the four corners and the center. At each position, place a standard barcode label and command the platform to stop above that position multiple times (e.g., 10 attempts). For each attempt, record whether the barcode is successfully decoded and logged. Reporting format Table 4 presents an example of the data structure; the numbers shown are placeholders. Such measurements reveal whether read reliability degrades near the limits of the mechanical travel owing to small changes in scanner angle or distance. If significant variation is observed, users can adjust the scanner height, tilt, or dwell time at each cell. 7.3.3 Repeatability of scan results Objective Evaluate how consistent the scan results are when the same grid is scanned repeatedly under identical conditions. Procedure : Choose a fixed grid layout (for example \(3\times3\) cells) and populate all cells with barcoded items. Perform a sequence of \(N\) scans (for example \(N=5\) –10) without changing the physical setup. For each scan, record the total cycle time and the ordered list of decoded barcodes. Compare the sequences from different scans to detect any missing or mis-ordered reads, and compute the mean and standard deviation of the cycle time. Reporting format The results can be summarized in text, for example mean cycle time \({T}_{\text{m}\text{e}\text{a}\text{n}}\pm{\sigma}_{T}\) , number of scans with identical barcode sequences out of \(N\) , list of any observed failure modes (cells where reads were intermittently missed or mis-assigned). Optionally, a small table or plot can be included to show the distribution of cycle times or the cumulative number of errors as a function of scan index. 7.4 Interpretation and limitations Until the proposed measurements are performed, the validation of the platform remains qualitative: the current prototype demonstrates that the hardware and software form a working system capable of automated barcode scanning over a small storage grid; however, it does not yet establish quantitative limits on throughput or reliability. The protocols and example data formats outlined above are intended to make it straightforward for other users—including the original developers—to conduct such measurements and report them in a consistent manner. In the final version of this article, the placeholder values in Tables 3 and 4 should be replaced by experimentally obtained data, and the text in this section should be updated to highlight the primary quantitative findings (for instance, typical cycle time per item and overall read success rate under representative conditions). 8. Conclusion This article presents a low-cost, open-source platform for automated barcode inventory over a small storage grid. The device combines a simple X–Y gantry, a commercially available 2D barcode scanner, and an Arduino-based controller to perform automated scans of barcoded items over a \(40\times40\) cm shelf area. The mechanical design, electronics, firmware, and host-side scripts are documented in detail; all design files are made available under open licenses to facilitate replication and modification. From a hardware perspective, the platform demonstrates that standard motion components (stepper motors, belts or screws, and low-cost guides) and widely available microcontroller hardware are sufficient to build a tabletop scanner that can be integrated with existing inventory systems. The modular structure of the design allows users to swap individual subsystems (for example, using different frame materials, alternative scanner models, or other open-source firmware such as GRBL) without changing the overall architecture. The build and operation instructions are aimed at small warehouses, workshops, and teaching laboratories, where access to industrial automation is limited but basic mechanical and electronics skills are available. The current prototype was validated qualitatively: the gantry covers the intended scan area, barcodes placed on the shelf are reliably decoded under typical conditions, and decoded codes are logged on the host PC while the platform executes a grid scan. However, we have not yet performed the quantitative validation that would normally accompany a mature industrial solution. To address this, Section 8 proposes a minimal characterization protocol and example data formats that future users can apply to measure throughput, spatial read reliability, and scan-to-scan repeatability. In the intended final version of this work, these placeholders should be replaced by experimental data obtained from systematic tests. Beyond its immediate use for inventory tasks, the platform has reuse potential in several directions. In teaching, it provides a concrete example of mechatronic system integration, covering kinematics, motion control, sensor interfacing, and data handling within a single, physically compact device. In research and development, the same mechanical and electronic infrastructure could be adapted to other sensor heads (for instance, cameras or distance sensors) or to different types of labels and markers, enabling small-scale experiments on automated inspection or sample handling. Because the design files are open and the BOMs is modest, the platform can also serve as a starting point for communities interested in participatory or citizen-led automation of local storage and repair spaces. In summary, the hardware described here is not yet a fully optimized product but a reproducible, adaptable baseline for small-scale inventory automation. By making the complete design and a clear validation roadmap openly available, we aim to lower the barrier for others to build upon this work, to contribute quantitative performance data, and to explore new application domains for similar low-cost scanning platforms. Declarations Acknowledgments This article thanks 和美 Steel Limited Company for their assistance in fabricating the steel frame structure. Ethics and safety No human or animal experiments were conducted as part of this work. The hardware operates at low voltage and moderate mechanical speeds; however, users should follow standard safety practices when assembling and operating the device, including: disconnecting power before modifying wiring; avoiding contact with moving mechanical components; and complying with local electrical safety regulations. When used in educational environments, students should receive basic training on mechanical and electrical safety before operating the hardware. CRediT authorship contribution statement Liang-Ching Hsu: Conceptualization Chen-Yu Chang: Investigation, Writing – review & editing Hung-Yu Liang: Software, Writing – review & editing Bo-Chang Dong: Supervision, Writing – original draft. Declaration of competing interest The authors declare that they have no known competing financial interests or personal relationships that could have appeared to influence the work reported in this paper. Funding No funding was received for conducting this study. Availability of Data and Materials All data generated or analysed during this study are included in this published article. 1. Specifications table Hardware name Low-cost open-source 2-axis barcode inventory scanner Subject area Engineering and Materials Science; Industrial Engineering and Automation; Educational tools and open-source alternatives to existing infrastructure Hardware type Measurement and control; Laboratory and warehouse automation; Robotics and motion systems Open-source license Design files: e.g., Creative Commons Attribution 4.0 International (CC BY 4.0); Firmware/software: e.g., MIT or GNU GPL v3 Cost of hardware ≈ EUR XXX (prototype as described; to be updated with actual bill of materials [BOMs]) Source file repository To be added (e.g., Zenodo/OSF DOI or GitHub URL) References Kisinga DC, Mchopa AD, Mwagike LR (2024) Warehouse management practices and business performance of small-scale grapes processing firms: evidence from Tanzania. Cogent Bus Manag 11:2427215. https://doi.org/10.1080/23311975.2024.2427215 Carpitella S, Izquierdo J (2025) Trends in sustainable inventory management practices in industry 4.0. Processes 13:1131. https://doi.org/10.3390/pr13041131 Unleashed Software (2024) 19 inventory management statistics you need to know in 2024. https://www.unleashedsoftware.com/blog/inventory-management-statistics Netstock (2024) Inventory management 2024 benchmark report. https://www.netstock.com/research/inventory-management-report/ Ailyn D, Lapine C (2024) Advanced warehouse management systems and inventory optimization for SMEs. White Paper, available via ResearchGate Prakoso BS, Nur Masruriyah AF, Prasetyo RT, Mardiah RT, Ardika SB, Feriadi SB (2024) Optimizing a warehouse management system (WMS) for small and medium enterprises (SMEs) using Odoo ERP. In: International Conference on Informatics, Multimedia, Cyber and Information System (ICIMCIS). IEEE, Jakarta, pp 880–885. https://doi.org/10.1109/ICIMCIS63449.2024.10957438 InvenTree Project (2025) InvenTree documentation: intuitive inventory management. https://docs.inventree.org/en/stable/ Manjrekar A, Jha S, Khapare S, Jagtap P, Yadav V (2021) Warehouse inventory management with cycle counting using drones. In: Proceedings of the 4th International Conference on Advances in Science & Technology (ICAST 2021). https://doi.org/10.2139/ssrn.3869512 Martinez-Carranza J, Rojas-Perez LO (2022) Warehouse inspection with an autonomous micro air vehicle. Unmanned Syst 10:329–342. https://doi.org/10.1142/S2301385022410011 Yoon B, Kim H, Youn G, Rhee J (2023) 3D position estimation of objects for inventory management automation using drones. Appl Sci 13:10830. https://doi.org/10.3390/app131910830 Pawale S, Kunder H, D J S PP (2024) S V Warehouse inventory management: drone-powered semi-automation with raspberry pi and network integration. In: Proceedings of the 2024 IEEE international conference on electronics, computing and communication technologies (CONECCT). IEEE, New York, pp 1–5. https://doi.org/10.1109/CONECCT62155.2024.10677264 Wichitwechkarn V, Fox C (2023) MACARONS: a modular and open-sourced automation system for vertical farming. J Open Hardw 7:1–13. https://doi.org/10.5334/joh.53 Takara G, Zachary Trimble AZ, Arata R, Brown S, Jaime Gonzalez H, Mora C (2021) An inexpensive robotic gantry to screen and control soil moisture for plant experiments. HardwareX 9:e00174. https://doi.org/10.1016/j.ohx.2021.e00174 Cite Share Download PDF Status: Posted Version 1 posted You are reading this latest preprint version Research Square lets you share your work early, gain feedback from the community, and start making changes to your manuscript prior to peer review in a journal. As a division of Research Square Company, we’re committed to making research communication faster, fairer, and more useful. We do this by developing innovative software and high quality services for the global research community. Our growing team is made up of researchers and industry professionals working together to solve the most critical problems facing scientific publishing. Also discoverable on Platform About Our Team In Review Editorial Policies Advisory Board Help Center Resources Author Services Accessibility API Access RSS feed Manage Cookie Preferences © Research Square 2026 | ISSN 2693-5015 (online) Privacy Policy Terms of Service Do Not Sell My Personal Information {"props":{"pageProps":{"initialData":{"identity":"rs-8926424","acceptedTermsAndConditions":true,"allowDirectSubmit":true,"archivedVersions":[],"articleType":"Research Article","associatedPublications":[],"authors":[{"id":605679536,"identity":"c77a02a7-441c-4e3b-abfe-e2081320d7b9","order_by":0,"name":"Liang-Ching Hsu","email":"","orcid":"","institution":"","correspondingAuthor":false,"prefix":"","firstName":"Liang-Ching","middleName":"","lastName":"Hsu","suffix":""},{"id":605679537,"identity":"56949cb0-c95c-4d08-9439-ec76bc9f6cc5","order_by":1,"name":"Chen-Yu Chang","email":"","orcid":"","institution":"","correspondingAuthor":false,"prefix":"","firstName":"Chen-Yu","middleName":"","lastName":"Chang","suffix":""},{"id":605679538,"identity":"c64a326e-e879-47ed-b980-5a5b2ebd94af","order_by":2,"name":"Hung-Yu Liang","email":"","orcid":"","institution":"","correspondingAuthor":false,"prefix":"","firstName":"Hung-Yu","middleName":"","lastName":"Liang","suffix":""},{"id":605679539,"identity":"b515ae96-5814-4a39-9b30-091ce63c6c4f","order_by":3,"name":"Bo-Chang Dong","email":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAAyAQMAAABI0h/eAAAABlBMVEX///8AAABVwtN+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA5UlEQVRIiWNgGAWjYBACAzBisGFgYGZuQBIkrCUNqIWxAaYaSCQQ1HIYiInVYs5+eOPjgl/no/nbGRuYC3f8SWxgb94mwfjjME4tlj1pxcYz+27nzjgM1DLzjEFiA8+xMgmGBNxaDG7wmEnz9tzObQBp4W0DapHIMQNquU1Iy7nc+XAt8m+I0MLz40DuBoQtPPi1gP3C25CcuxGo5TDvGWPjNp60YouEtP84tYBDjOePXe6884cPPubdISfbDxS58cEmDacWMGBsg9AHQFHDBmIl4NcABH9gehsIKh0Fo2AUjIIRCACbeFPxvjG4zAAAAABJRU5ErkJggg==","orcid":"https://orcid.org/0000-0002-9408-3358","institution":"National PingTung University","correspondingAuthor":true,"prefix":"","firstName":"Bo-Chang","middleName":"","lastName":"Dong","suffix":""}],"badges":[],"createdAt":"2026-02-20 13:36:10","currentVersionCode":1,"declarations":"","doi":"10.21203/rs.3.rs-8926424/v1","doiUrl":"https://doi.org/10.21203/rs.3.rs-8926424/v1","draftVersion":[],"editorialEvents":[],"editorialNote":"","failedWorkflow":false,"files":[{"id":104875155,"identity":"3560d2a1-77cf-4a32-919b-57f331a696bc","added_by":"auto","created_at":"2026-03-18 08:37:45","extension":"png","order_by":1,"title":"Figure 1","display":"","copyAsset":false,"role":"figure","size":263911,"visible":true,"origin":"","legend":"\u003cp\u003eSystem architecture and scanning workflow of the automated inventory platform. Hardware architecture. The storage grid is covered by a two-axis gantry carrying the barcode scanner head. An Arduino+shield drives the X/Y stepper motors and exchanges data with the host PC, which runs the inventory application and stores decoded barcodes. The scanner can communicate either directly with the PC (USB HID) or via a serial link to the controller\u003c/p\u003e","description":"","filename":"Fig1.png","url":"https://assets-eu.researchsquare.com/files/rs-8926424/v1/86efa174072678ca8323a39d.png"},{"id":104875157,"identity":"fb817f64-92e3-40fb-b1e3-84363d062216","added_by":"auto","created_at":"2026-03-18 08:37:45","extension":"png","order_by":2,"title":"Figure 2","display":"","copyAsset":false,"role":"figure","size":921636,"visible":true,"origin":"","legend":"\u003cp\u003eMechanical design and prototype of the scanning platform. (a) CAD model of the frame, gantry, and scan area. (b) Prototype frame with the machined shelf and X–Y gantry installed. (c) Close-up of the barcode scanner mount on the Y-axis carriage at the nominal 15 cm working distance above the storage plane. (d) Fully assembled prototype on a workbench, showing the usable 40 × 40 cm scan area above the shelf\u003c/p\u003e","description":"","filename":"Fig2.png","url":"https://assets-eu.researchsquare.com/files/rs-8926424/v1/804b0dd598286bb950277944.png"},{"id":105034237,"identity":"10c48570-6ae4-4e87-9d4b-d76bd2e6666d","added_by":"auto","created_at":"2026-03-20 07:22:55","extension":"png","order_by":3,"title":"Figure 3","display":"","copyAsset":false,"role":"figure","size":268047,"visible":true,"origin":"","legend":"\u003cp\u003eElectronics and control architecture of the inventory scanning platform. (a) Block diagram of the Arduino Uno with CNC shield and A4988 stepper drivers, showing interfaces to the host PC, barcode scanner, joystick, limit switches, stepper motors, and DC power supply. (b) Simplified wiring map highlighting the connectors used in the prototype (motor outputs, power input, joystick inputs, and limit-switch inputs)\u003c/p\u003e","description":"","filename":"Fig3.png","url":"https://assets-eu.researchsquare.com/files/rs-8926424/v1/bc78d57e90abe9553370b839.png"},{"id":106960431,"identity":"c50607f0-8373-43ed-b405-7c1c36ecfcb0","added_by":"auto","created_at":"2026-04-15 09:21:03","extension":"pdf","order_by":0,"title":"","display":"","copyAsset":false,"role":"manuscript-pdf","size":3263673,"visible":true,"origin":"","legend":"","description":"","filename":"manuscript.pdf","url":"https://assets-eu.researchsquare.com/files/rs-8926424/v1/8217d53a-01ba-4505-aebc-d343ba0e396e.pdf"}],"financialInterests":"","formattedTitle":"Low-cost open-source two-axis barcode-scanning platform for automated inventory of small storage grids","fulltext":[{"header":"1. Introduction","content":"\u003cp\u003eInventory control and warehouse management are persistent challenges for small and medium-sized enterprises, particularly those operating in constrained spaces such as repair workshops, university laboratories, or small production facilities. Empirical studies in manufacturing and agri-food sectors show that basic warehouse management practices\u0026mdash;material handling, storage, and inventory control\u0026mdash;are strongly correlated with business performance; however, several small firms still rely on manual counting and ad hoc record keeping [\u003cspan citationid=\"CR1\" class=\"CitationRef\"\u003e1\u003c/span\u003e, \u003cspan citationid=\"CR2\" class=\"CitationRef\"\u003e2\u003c/span\u003e]. In practice, stock is often dispersed across shelves, boxes, and workbenches, with few visual cues to indicate location or status; this results in misplacements, stock-outs, duplicate purchases, and extended search times for technicians.\u003c/p\u003e \u003cp\u003eOver the last decade, the software side of inventory management has matured rapidly. Commercial warehouse management systems provide real-time stock visibility, automatic re-ordering, and integration with enterprise resource planning (platforms. However, surveys and industry reports consistently highlight that small organizations struggle to adopt these systems owing to high licensing costs, customization effort, and integration overheads [\u003cspan additionalcitationids=\"CR3 CR4 CR5\" citationid=\"CR2\" class=\"CitationRef\"\u003e2\u003c/span\u003e\u0026ndash;\u003cspan citationid=\"CR6\" class=\"CitationRef\"\u003e6\u003c/span\u003e]. Even when affordable licences are available, the underlying physical processes (labeling, location coding, and systematic storage) are often not adapted to micro-warehouses with highly heterogeneous items and frequent one-off parts.\u003c/p\u003e \u003cp\u003eAt the lower end of the spectrum, open-source inventory software, such as InvenTree, offers lightweight, browser-based tools for parts and stock tracking that are well suited to small labs or makerspaces [\u003cspan citationid=\"CR7\" class=\"CitationRef\"\u003e7\u003c/span\u003e]. These tools close part of the gap by providing structured part catalogs, bill of materials (BOMs) management, and barcode integration; however, they do not directly address the physical task of locating and retrieving items in cluttered, three-dimensional (3D) storage spaces. As a result, the most time-consuming aspect of inventory work\u0026mdash;searching for a component that is \u0026ldquo;somewhere on the shelf\u0026rdquo;\u0026mdash;remains manual.\u003c/p\u003e \u003cp\u003eIn parallel, a growing body of research explores mechatronic and robotic approaches to inventory automation. A prominent line of work uses unmanned aerial vehicles equipped with cameras and barcode or QR-code readers to perform inventory scans in large warehouses [\u003cspan additionalcitationids=\"CR9 CR10\" citationid=\"CR8\" class=\"CitationRef\"\u003e8\u003c/span\u003e\u0026ndash;\u003cspan citationid=\"CR11\" class=\"CitationRef\"\u003e11\u003c/span\u003e]. These drone-based systems can significantly reduce cycle-counting time and improve safety in high-bay storage environments; however, they require wide aisles, line-of-sight access to labels, and substantial indoor navigation infrastructure. Therefore, they are poorly matched to small, crowded storage rooms where the ceiling height is low and obstacles are dense.\u003c/p\u003e \u003cp\u003eCloser in spirit to the present work are open-source gantry and shuttle systems developed for automated plant phenotyping and vertical farming. Projects, such as MACARONS, a modular open-sourced automation system for vertical farming, and the inexpensive robotic gantry for soil moisture control, show that low-cost XY(Z) gantries built from commodity aluminum extrusions, stepper motors, and open-source control electronics can reliably move payloads over grid-like workspaces while remaining accessible to non-specialist builders [\u003cspan citationid=\"CR12\" class=\"CitationRef\"\u003e12\u003c/span\u003e, \u003cspan citationid=\"CR13\" class=\"CitationRef\"\u003e13\u003c/span\u003e]. These platforms show that open hardware can compete with industrial systems at orders of magnitude lower cost, provided that the design is carefully documented and modular.\u003c/p\u003e \u003cp\u003eThe hardware presented in this paper extends these open-hardware ideas to the context of small-scale technical inventory. Instead of transporting plants or pallets, the system is designed to move a camera and lighting module over a shelving unit, enabling automated visual scanning of labeled bins and parts boxes in a footprint comparable to a typical workbench. By integrating this tabletop gantry with open-source inventory software, such as InvenTree [\u003cspan citationid=\"CR7\" class=\"CitationRef\"\u003e7\u003c/span\u003e], the aim is to provide a bridge between digital stock records and the physical layout of a micro-warehouse: a low-cost, reproducible hardware layer that can be built, modified, and maintained by small organizations without access to industrial automation budgets.\u003c/p\u003e"},{"header":"2. Materials and Methods","content":"\u003cdiv id=\"Sec3\" class=\"Section2\"\u003e \u003ch2\u003e2.1 Hardware description\u003c/h2\u003e \u003cdiv id=\"Sec4\" class=\"Section3\"\u003e \u003ch2\u003e2.1.1 Overall architecture and intended use\u003c/h2\u003e \u003cp\u003eThe proposed device is a tabletop two-axis (X\u0026ndash;Y) motion platform that carries a commercial two-dimensional (2D) barcode scanner over a flat storage surface. The intended use is automated inventory of small parts stored in a grid of locations on a shelf or workbench, such as containers of fasteners, electronic components, or maintenance parts. Instead of a worker manually pointing a handheld scanner at each item, the platform moves the scanner head over the predefined grid and logs all detected barcodes to an inventory database.\u003c/p\u003e \u003cp\u003eFigure \u003cspan refid=\"Fig1\" class=\"InternalRef\"\u003e1\u003c/span\u003e shows the overall hardware architecture and scanning workflow. A rigid frame supports an X-axis gantry that spans the width of the storage area. A Y-axis carriage moves along this gantry, carrying the barcode scanner at a fixed height above the storage plane. Two stepper motors drive the X and Y axes via belt or screw transmissions. An Arduino Uno with a CNC shield and A4988 stepper drivers generates the motion commands and enforces travel limits. The barcode scanner communicates either directly with a host PC (USB HID mode) or via a serial link to the Arduino. The host PC runs a simple control script that initiates scan cycles, receives decoded barcodes, and stores them together with the corresponding grid positions and timestamps.\u003c/p\u003e \u003cp\u003e \u003c/p\u003e \u003cp\u003eThe functional workflow is as follows. At the start of an inventory cycle, the operator defines a scan grid that covers the usable \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e cm storage area and specifies the order in which cells should be visited (e.g., a raster pattern). After homing, the controller moves the scanner to the first cell, optionally dwells for a short time, and then advances to the next cell. At each position, the scanner attempts to read a barcode. If a valid code is decoded, the host logs the code, position, and timestamp; if not, the cell can be flagged as empty or unread. Once all cells have been visited, the platform returns to a safe position and the resulting inventory file can be imported into an existing stock-management tool.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv id=\"Sec5\" class=\"Section2\"\u003e \u003ch2\u003e2.2 Mechanical structure and scan workspace\u003c/h2\u003e \u003cp\u003eThe mechanical structure is designed to be compact, rigid, and easy to fabricate using common workshop tools. The frame footprint is approximately \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(60\\times60\\)\u003c/span\u003e\u003c/span\u003e cm with a height of approximately 42 cm, providing enough clearance for a flat storage surface and the moving gantry while remaining small enough to sit on a workbench. The usable scan area on the storage plane is approximately \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e cm, which is sufficient to accommodate a grid of 2\u0026ndash;4 rows and columns of parts containers, depending on their size.\u003c/p\u003e \u003cp\u003eThe main stages of the mechanical design and prototype realization are summarized in Fig.\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003e. Panel (a) shows a CAD model of the frame, shelf, and gantry arrangement. Panel (b) illustrates the machined shelf and frame after fabrication. Panel (c) provides a close-up view of the scanner mount under the Y-axis carriage, and panel (d) shows the fully assembled prototype on a workbench with the scan area highlighted. Together, these views clarify the overall geometry of the system and the relationship between the scanner, gantry, and storage plane.\u003c/p\u003e \u003cp\u003e \u003c/p\u003e \u003cp\u003eThe X-axis rails are mounted along the sides of the frame; the Y-axis carriage spans between them. The barcode scanner is mounted on the Y-axis carriage such that its lens is at a fixed distance (approximately 15 cm) above the storage plane, within the depth-of-field specified by the scanner datasheet. The scan area is indicated as a shaded rectangle in the CAD view; its dimensions and coordinate origin are used for mechanical design and for defining the scan grid in software.\u003c/p\u003e \u003cp\u003eThe storage surface is implemented as a removable shelf or tray. In the prototype, this shelf is a machined panel with a simple lip or locating features to keep parts containers from sliding; however, the design is intentionally non-specific so that users can adapt it to their own bins or boxes. Because the shelf is removable, different layouts (e.g., different grid spacings or special fixtures for irregular parts) can be tested without modifying the gantry.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec6\" class=\"Section2\"\u003e \u003ch2\u003e2.3 Electronics and control hardware\u003c/h2\u003e \u003cp\u003eThe electronics are built from widely available components to keep cost and complexity low. The core controller is an Arduino Uno, which is stacked with a CNC shield that hosts two A4988 stepper driver modules for the X and Y axes. Each driver provides step and direction control signals to a bipolar stepper motor, with configurable microstepping (typically 1/8 or 1/16) set via jumpers on the shield. The drivers share a common DC power supply in the range 12\u0026ndash;24 V, sized as per the current requirements of the motors.\u003c/p\u003e \u003cp\u003eFigure \u003cspan refid=\"Fig3\" class=\"InternalRef\"\u003e3\u003c/span\u003e summarizes the electronics and control architecture. Panel (a) shows the main subsystems and data flows: the Arduino Uno with CNC shield and A4988 stepper drivers interfaces with the host PC over USB, with the barcode scanner either connected directly to the PC in HID mode or, optionally, via a serial link to the controller. The joystick or rocker provides jog inputs for manual positioning, while two limit switches (SW1\u0026ndash;SW2) can be wired to dedicated inputs for homing and travel protection. The DC power supply P1 provides a single low-voltage rail to the CNC shield, which in turn powers the stepper drivers and controller.\u003c/p\u003e \u003cp\u003e \u003c/p\u003e \u003cp\u003ePanel (b) provides a simplified wiring map of the connections used in the prototype. The X and Y stepper motors (M1 and M2) are connected to the corresponding motor outputs on the CNC shield, the DC supply is wired to the +\u0026thinsp;V and GND terminals, and the limit switches and joystick are connected to the labeled headers (X-LIM, Y-LIM, 5 V, JX, JY, and GND). This abstraction is intended to help new users reproduce the wiring without requiring to interpret a full pinout diagram of the shield or driver modules. All connectors are labeled consistently with the silkscreen legends on the hardware and with the signal names used in the firmware.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec7\" class=\"Section2\"\u003e \u003ch2\u003e2.4 Firmware and software\u003c/h2\u003e \u003cp\u003ePlatform motion is controlled by firmware running on the Arduino, with two alternative approaches supported.\u003c/p\u003e \u003cp\u003eIn the first approach, the Arduino is flashed with the open-source GRBL motion-control firmware. Scan trajectories are encoded as G-code programs generated on the host PC. A G-code sender application streams these programs to the controller over the USB serial link. The G-code file defines the scan grid as a series of linear moves in the X\u0026ndash;Y plane, typically arranged in a raster pattern. GRBL handles step generation, acceleration and deceleration profiles, and limit-switch handling. The barcode scanner operates concurrently, sending decoded barcodes directly to the host PC, where a logging script associates each code with the current position in the scan sequence.\u003c/p\u003e \u003cp\u003eIn the second approach, a custom Arduino sketch is used instead of GRBL. The sketch relies on a stepper-control library (e.g., AccelStepper) to generate coordinated motion on the X and Y axes, but hard-codes the grid coordinates and scan sequence in a compact data structure. This mode is easier to understand for users who are less familiar with G-code; it simplifies the host-side software because the controller can directly report motion status and barcode events in a single serial protocol. The trade-off is reduced flexibility in defining arbitrary trajectories.\u003c/p\u003e \u003cp\u003eIn both cases, the host-side software remains lightweight. A short Python or C# script is sufficient to initiate a scan, listen on the serial port for status messages or barcode strings, and write results to a CSV file with columns for timestamp, cell coordinates, and decoded barcode. By decoupling the low-level motion control from the host, the same hardware platform can be integrated with a range of inventory or laboratory information management systems, or used in teaching to demonstrate the interaction between embedded controllers and higher-level applications.\u003c/p\u003e \u003c/div\u003e"},{"header":"3.\tDesign Files Summary","content":"\u003cp\u003eThe hardware and software required to reproduce the platform are provided as open-source design files. Table 1 lists the main files, their type, license, and where they can be obtained. The online repository also contains auxiliary assets such as STEP versions of the CAD models, editable diagrams, and example configuration files.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTable\u0026nbsp;\u003c/strong\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003cstrong\u003e.\u003c/strong\u003e Design files provided with the inventory scanning platform.\u003c/p\u003e\n\u003ctable border=\"0\" cellspacing=\"0\" cellpadding=\"0\"\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003e\u003cstrong\u003eFile name\u003c/strong\u003e\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003e\u003cstrong\u003eFile type\u003c/strong\u003e\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003e\u003cstrong\u003eOpen-source license\u003c/strong\u003e\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003e\u003cstrong\u003eLocation\u003c/strong\u003e\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003eframe_assembly.dwg\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCAD drawing\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCC BY 4.0 (or CERN-OHL-S)\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eMain public repository for this article.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003exy_gantry.stl\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003e3D model\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCC BY 4.0 (or CERN-OHL-S)\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /mechanics/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003escanner_mount.stl\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003e3D model\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCC BY 4.0 (or CERN-OHL-S)\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /mechanics/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003ewiring_diagram.pdf\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSchematic\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCC BY 4.0\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /electronics/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003einventory_scanner.ino\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eArduino firmware\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eMIT or GPL v3\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /firmware/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003egrbl_config_settings.txt\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eConfiguration file\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCC BY 4.0\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /firmware/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003escan_route_3x3.csv\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eExample route file\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCC BY 4.0\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /examples/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003escan_logger_python.py\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eHost-side script\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eMIT\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /software/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003ebom_detailed.xlsx\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSpreadsheet (BOM)\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCC BY 4.0\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /docs/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\n \u003cp\u003ebuild_steps_photos.pdf\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eBuild guide (PDF)\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eCC BY 4.0\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n \u003cp\u003eSame repository, directory /docs/.\u003c/p\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n\u003c/table\u003e\u003c/br\u003e\n\u003cp\u003eThe accompanying README file in the repository briefly describes the purpose of each design file and provides instructions for adapting the hardware and firmware to different scan areas, storage layouts, or barcode scanners.\u003c/p\u003e"},{"header":"4. BOMs Summary","content":"\u003cp\u003eA concise BOMs for the prototype is presented in Table\u0026nbsp;\u003cspan refid=\"Tab2\" class=\"InternalRef\"\u003e2\u003c/span\u003e. The full BOM, including supplier links, part numbers, and cost breakdown, is provided as a spreadsheet design file (bom_detailed.xlsx).\u003c/p\u003e \u003cp\u003e \u003cdiv class=\"gridtable\"\u003e\u003ctable float=\"Yes\" id=\"Tab2\" border=\"1\"\u003e \u003ccaption language=\"En\"\u003e \u003cdiv class=\"CaptionNumber\"\u003eTable 2\u003c/div\u003e \u003cdiv class=\"CaptionContent\"\u003e \u003cp\u003eSummary of main components used in the prototype.\u003c/p\u003e \u003c/div\u003e \u003c/caption\u003e \u003ccolgroup cols=\"7\"\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c1\" colnum=\"1\"\u003e\u003c/div\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c2\" colnum=\"2\"\u003e\u003c/div\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c3\" colnum=\"3\"\u003e\u003c/div\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c4\" colnum=\"4\"\u003e\u003c/div\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c5\" colnum=\"5\"\u003e\u003c/div\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c6\" colnum=\"6\"\u003e\u003c/div\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c7\" colnum=\"7\"\u003e\u003c/div\u003e \u003cthead\u003e \u003ctr\u003e \u003cth align=\"left\" colname=\"c1\"\u003e \u003cp\u003eDesignator\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c2\"\u003e \u003cp\u003eComponent\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c3\"\u003e \u003cp\u003eQty\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c4\"\u003e \u003cp\u003eKey specifications\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c5\"\u003e \u003cp\u003eApprox. unit cost*\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c6\"\u003e \u003cp\u003eSubtotal*\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c7\"\u003e \u003cp\u003eNotes\u003c/p\u003e \u003c/th\u003e \u003c/tr\u003e \u003c/thead\u003e \u003ctbody\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eM1\u0026ndash;M2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eNEMA 17 stepper motor\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003e2-phase, \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\({1.8}^{\\circ}\\)\u003c/span\u003e\u003c/span\u003e/step, suitable torque for X and Y axes\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eX and Y axis actuation\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eU1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eArduino Uno (or compatible)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003eATmega328P-based microcontroller board\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eMotion controller\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eU2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eCNC shield for Arduino\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003eCompatible with A4988 stepper drivers\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eBreakout for motor drivers\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eU3\u0026ndash;U4\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eA4988 stepper driver module\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003eUp to \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(\\sim2\\)\u003c/span\u003e\u003c/span\u003e\u0026nbsp;A/coil, microstepping capability\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eX and Y axis drivers\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eS1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eDK-5105 barcode scanner\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003e1D/2D codes, depth-of-field 40\u0026ndash;250\u0026nbsp;mm\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eInventory sensing\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eP1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eDC power supply\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003ee.g.,\u0026nbsp;12\u0026ndash;24\u0026nbsp;V, \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(\\ge3\\)\u003c/span\u003e\u003c/span\u003e\u0026ndash;5\u0026nbsp;A\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eMotors and electronics\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eF1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eFrame profiles (steel/aluminum)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1 set\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003eLengths for \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(60\\times60\\times42\\)\u003c/span\u003e\u003c/span\u003e\u0026nbsp;cm frame\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eStructural frame\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eL1\u0026ndash;L2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eLinear guides/rods\u0026thinsp;+\u0026thinsp;bearings\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1 set\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003eFor X and Y axes, \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(\\sim40\\)\u003c/span\u003e\u003c/span\u003e\u0026nbsp;cm travel\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eLinear motion\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eC1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eMotion transmission (belt/screw)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1 set\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003eTiming belts\u0026thinsp;+\u0026thinsp;pulleys or lead screws\u0026thinsp;+\u0026thinsp;nuts\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eCoupling motors to axes\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eH1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eScanner mount bracket\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003e3D-printed or machined holder\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eHolds scanner at \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(\\sim15\\)\u003c/span\u003e\u003c/span\u003e\u0026nbsp;cm above plane\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eSW1\u0026ndash;SW2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eLimit switches (optional)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003eMechanical endstops\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eHoming and travel limits\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eCAB\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003eCables, connectors, fasteners\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e1 set\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c4\"\u003e \u003cp\u003eWiring, screws, nuts, etc.\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c5\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c6\"\u003e \u003cp\u003eEUR xx\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c7\"\u003e \u003cp\u003eAssembly hardware\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003c/tbody\u003e \u003c/colgroup\u003e \u003c/table\u003e\u003c/div\u003e \u003c/p\u003e \u003cp\u003eThe total hardware cost of the prototype is expected to be on the order of EURXXX, assuming small-quantity purchases from typical online suppliers. The cost can be reduced further by reusing available components (e.g., existing motors or power supplies) or by simplifying the frame construction.\u003c/p\u003e"},{"header":"5. Build Instructions","content":"\u003cp\u003eThe platform can be assembled in a small workshop or teaching laboratory using basic hand tools. The build process separates into three stages: (i) mechanical assembly of the frame, gantry, and shelf; (ii) installation and wiring of the electronics; and (iii) firmware upload and basic functional checks. The mechanical design and realized prototype are shown in Fig.\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003e, while the electronics architecture and wiring are summarized in Fig.\u0026nbsp;\u003cspan refid=\"Fig3\" class=\"InternalRef\"\u003e3\u003c/span\u003e. A more detailed, photo-based guide is provided in the file build_steps_photos.pdf in the online repository.\u003c/p\u003e \u003cdiv id=\"Sec11\" class=\"Section2\"\u003e \u003ch2\u003e5.1 Required tools and preparation\u003c/h2\u003e \u003cp\u003eBefore starting, the builder should verify that all mechanical and electronic parts listed in the BOMs (Section 5) are available. The following tools are recommended:\u003c/p\u003e \u003cp\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003ehex keys or screwdrivers matching the fasteners used in the frame and gantry;\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003ea small adjustable spanner or socket set;\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003ea drill and drill bits (if any additional holes must be made in the frame);\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003ewire cutters, wire strippers, and a small flat screwdriver for terminal blocks;\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003ea multimeter for continuity checks and verifying supply voltages.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/p\u003e \u003cp\u003eIt is good practice to lay out the frame profiles, linear guides, motors, and scanner on a clean work surface and to label the electronic components (Arduino, CNC shield, drivers, power supply, etc.) to avoid confusion later.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec12\" class=\"Section2\"\u003e \u003ch2\u003e5.2 Mechanical assembly\u003c/h2\u003e \u003cp\u003eThe aim of the mechanical assembly stage is to obtain a rigid frame with a smoothly moving X\u0026ndash;Y gantry and a fixed scanner mount at the correct height above the storage plane. The primary elements and final geometry are shown in Fig.\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003e.\u003c/p\u003e \u003cp\u003eA recommended assembly sequence is as follows:\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eAssemble the frame.\u003c/b\u003e Join the frame profiles to form a rigid \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(60\\times60\\)\u003c/span\u003e\u003c/span\u003e cm base and attach the vertical supports as in the CAD view of Fig.\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003ea. Check all corners with a square and tighten the fasteners only after the frame stands flat on the work surface.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eInstall the shelf.\u003c/b\u003e Fit the removable shelf or tray into the base of the frame, ensuring that it sits level and does not rock. Any locating features for parts containers (lips and stops) should be installed at this stage.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eInstall the X-axis.\u003c/b\u003e Mount the X-axis linear guides along the side members of the frame and assemble the X-axis carriage spanning between them (cf. Figure\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003eb). The carriage should slide without binding from one end of the travel to the other. Install the X-axis stepper motor and the belt or lead screw, and adjust tension or alignment until motion is smooth.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eInstall the Y-axis and scanner mount.\u003c/b\u003e Fix the Y-axis guides to the X-axis carriage and mount the Y-axis carriage. Attach the scanner bracket (or 3D-printed mount) to the Y-axis carriage as in Fig.\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003ec. Position the scanner so that its focal region coincides with the storage plane, typically at a distance of about 15 cm, and tighten the mounting screws.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eVerify reach over the scan area.\u003c/b\u003e With motors still unpowered, move the gantry by hand to verify that the scanner can reach all corners of the intended \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e cm scan area without collision (Fig.\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003ed). Adjust any interfering elements or cable routes before proceeding.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003eIf mechanical endstops are used, they can be mounted at this stage at the ends of the X and Y travel, with their actuating levers positioned to be triggered by the moving carriages.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec13\" class=\"Section2\"\u003e \u003ch2\u003e5.3 Electronics installation and wiring\u003c/h2\u003e \u003cp\u003eThe next stage is to mount the controller electronics on the frame and wire the motors, scanner, and any input devices. The overall architecture and the connections used in the prototype are summarized in Fig.\u0026nbsp;\u003cspan refid=\"Fig3\" class=\"InternalRef\"\u003e3\u003c/span\u003e.\u003c/p\u003e \u003cp\u003eA typical wiring sequence is as follows:\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eMount the controller and power supply.\u003c/b\u003e Fix the Arduino Uno with CNC shield and the DC power supply to a rigid panel or to the frame, ensuring that all terminals and the USB connector remain accessible. If required, add a small protective cover to avoid accidental contact.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eInstall the stepper drivers.\u003c/b\u003e Plug the A4988 driver boards into the X and Y slots on the CNC shield, set the microstepping jumpers as recommended in the design files, and adjust the current limit trimmer potentiometers to values suited to the motors used.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eWire the motors and power.\u003c/b\u003e Connect the X and Y stepper motors (M1 and M2) to the corresponding motor outputs on the CNC shield, respecting coil pairings (Fig.\u0026nbsp;\u003cspan refid=\"Fig3\" class=\"InternalRef\"\u003e3\u003c/span\u003eb). Connect the DC power supply P1 to the shield power input, and double-check polarity with a multimeter before energizing the drivers.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eConnect the scanner and inputs.\u003c/b\u003e If the scanner operates in USB HID mode, connect it directly to the host PC as in Fig.\u0026nbsp;\u003cspan refid=\"Fig3\" class=\"InternalRef\"\u003e3\u003c/span\u003ea. If it has a serial mode, wire its Tx, Rx and ground to the Arduino pins specified in the firmware. Wire the joystick and any limit switches to the assigned digital input pins as indicated by the labels in Fig.\u0026nbsp;\u003cspan refid=\"Fig3\" class=\"InternalRef\"\u003e3\u003c/span\u003eb.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eRoute and secure cables.\u003c/b\u003e Route all cables along the frame, avoiding sharp bends and moving parts. Use cable ties or cable chains to prevent wires from interfering with the motion of the axes.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003eAfter wiring is complete, visually inspect all connections. It is advisable to perform basic continuity checks on the motor phases and to verify that no supply leads are shorted to ground before applying power.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec14\" class=\"Section2\"\u003e \u003ch2\u003e5.4 Firmware upload and initial tests\u003c/h2\u003e \u003cp\u003eOnce the mechanical and electrical build is complete, the controller firmware can be installed:\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eConnect the Arduino to the host PC over USB and select the correct board and port in the Arduino IDE or GRBL flashing tool.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eEither flash GRBL (for a G-code-based workflow) or upload the custom sketch inventory_scanner.ino from the design files repository.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eWith the motors unloaded, issue small motion commands (or use a jogging mode) to verify that the X and Y axes move in the expected directions. Reverse motor wiring or axis direction settings in firmware if required.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eTrigger limit switches manually (if installed) and confirm that the controller enters a limit or homing state as expected.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003ePresent a test barcode to the scanner and confirm that decoded codes appear either directly on the host PC or in the serial monitor, depending on the chosen interface mode.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003eAt this stage, the platform should be mechanically and electrically ready. The next section (Section 7) describes the routine operating procedure for performing inventory scans.\u003c/p\u003e \u003c/div\u003e"},{"header":"6. Results","content":"\u003cdiv id=\"Sec16\" class=\"Section2\"\u003e \u003ch2\u003e6.1 Operation instructions\u003c/h2\u003e \u003cp\u003eOnce the platform has been assembled and wired as described in Section 6, routine operation consists of (i) verifying that the system is mechanically clear and electrically safe, (ii) homing and calibrating the axes, (iii) defining the storage grid and scan pattern, and (iv) running inventory scans and exporting the resulting data. The overall workflow is summarized in Fig.\u0026nbsp;\u003cspan refid=\"Fig1\" class=\"InternalRef\"\u003e1\u003c/span\u003e.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec17\" class=\"Section2\"\u003e \u003ch2\u003e6.2 Pre-operation checks\u003c/h2\u003e \u003cp\u003eBefore each use, the operator should perform a short checklist to ensure safe and reliable operation:\u003c/p\u003e \u003cp\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eMechanical clearance\u003c/b\u003e: Verify that no tools, cables, or loose objects obstruct the motion of the X and Y axes. Check that the shelf is seated correctly on the frame and that parts containers are stable within their cells (cf. Figure\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003ed).\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eElectrical connections\u003c/b\u003e: Inspect the power and motor connectors on the CNC shield and power supply. Confirm that the emergency stop (if present) is accessible and functional.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eScanner function\u003c/b\u003e: Power the scanner and present a test barcode by hand to verify that decoded codes appear either on the host PC or in the serial monitor, depending on the chosen interface.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eSoftware configuration\u003c/b\u003e: Confirm that the correct firmware (GRBL or custom sketch) is installed on the Arduino and that the host-side script or G-code sender is configured to use the appropriate serial port.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/p\u003e \u003cp\u003eTypically, these checks take less than 1 minute and reduce the risk of unexpected stops due to wiring issues or mechanical interference.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec18\" class=\"Section2\"\u003e \u003ch2\u003e6.3 Homing and basic calibration\u003c/h2\u003e \u003cp\u003eAt the start of each inventory session, the platform should be brought into a known reference state; this can be done fully automatically if limit switches are installed, or semi-manually otherwise.\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003ePower-up\u003c/b\u003e: Switch on the DC power supply to energize the stepper drivers and connect the Arduino to the host PC via USB.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eAutomatic homing (with limit switches)\u003c/b\u003e: If X and Y limit switches are fitted, issue the homing command in the GRBL interface or the custom firmware (e.g., \u003cspan\u003e$\u003c/span\u003eH in GRBL). The axes will move toward their home positions, trigger the switches, and back off to a defined origin. Once homing is complete, the controller coordinate system is aligned with the physical scan area.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eManual referencing (without limit switches)\u003c/b\u003e: If no switches are available, jog the axes using the joystick or host interface until the scanner is positioned above a chosen corner of the shelf (typically the front-left corner). In the host software, reset the working coordinates to \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\((x,y)=(0,0)\\)\u003c/span\u003e\u003c/span\u003e at this position.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eReachability check\u003c/b\u003e: Jog the scanner toward the opposite corner (rear-right) and verify that the intended \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e cm scan area is reachable without collision or exceeding the mechanical limits of the axes.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003eIf the axes do not move as expected (wrong direction, rough motion), the operator should revisit the configuration or wiring as described in Section 6.3 before proceeding.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec19\" class=\"Section2\"\u003e \u003ch2\u003e6.4 Defining the storage grid and scan pattern\u003c/h2\u003e \u003cp\u003eThe storage plane can be divided into a regular grid of cells corresponding to locations where parts containers or individual items are placed. Typically, the grid is defined over the \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e cm scan area shown in Fig.\u0026nbsp;\u003cspan refid=\"Fig2\" class=\"InternalRef\"\u003e2\u003c/span\u003ea.\u003c/p\u003e \u003cp\u003eTwo approaches are supported:\u003c/p\u003e \u003cdiv id=\"Sec20\" class=\"Section3\"\u003e \u003ch2\u003e6.4.1. G-code route files (with GRBL)\u003c/h2\u003e \u003cp\u003eIn the GRBL-based workflow, the grid is encoded in a G-code program or in a CSV file that is converted to G-code by a small script. Each cell corresponds to a pair of coordinates \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(({x}_{i},{y}_{j})\\)\u003c/span\u003e\u003c/span\u003e, and the scan pattern is a sequence of linear moves connecting these points in a raster or serpentine pattern. An example route file (scan_route_3x3.csv) is provided in the design files (Section 4).\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec21\" class=\"Section3\"\u003e \u003ch2\u003e6.4.2. Embedded grid (with custom firmware)\u003c/h2\u003e \u003cp\u003eIn the custom Arduino sketch, the grid coordinates are stored directly in the firmware as an array of positions. The order in which the array entries are visited determines the scan pattern. This approach simplifies use in teaching or small labs because the host PC only has to send a single \u0026ldquo;start scan\u0026rdquo; command and does not need to stream G-code.\u003c/p\u003e \u003cp\u003eIn both cases, the grid definition should be consistent with the physical layout of the shelf. If parts containers are re-arranged or a different shelf is installed, the grid coordinates must be updated accordingly.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv id=\"Sec22\" class=\"Section2\"\u003e \u003ch2\u003e6.5. Running an inventory scan\u003c/h2\u003e \u003cp\u003eOnce the grid and scan pattern are defined, an inventory scan proceeds as follows:\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eLoad items.\u003c/b\u003e Place barcoded items or containers in the grid cells on the shelf. Ensure that barcodes face upward and are not obscured by other objects.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eStart the scan.\u003c/b\u003e In the host application or serial terminal, issue the command to start a scan (for instance, sending a specific character to the custom firmware, or starting the G-code program in a GRBL sender). The controller executes the workflow outlined in Fig.\u0026nbsp;\u003cspan refid=\"Fig1\" class=\"InternalRef\"\u003e1\u003c/span\u003e: it moves to the first cell, optionally dwells for a short time, and then advances to the next cell.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eMonitor motion and reads.\u003c/b\u003e During the scan, the operator should verify that the motion is smooth and that the scanner successfully reads barcodes at representative positions. In the GRBL-based workflow, the host PC will log decoded barcode strings as they appear; in the custom firmware workflow, the controller will report motion status and barcode events over the serial link.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eCompletion.\u003c/b\u003e At the end of the route, the controller returns the scanner to a safe parking position (e.g., front-left corner) and signals completion to the host. The motors can be disabled or powered down if no further scans are planned.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003eIf a barcode cannot be decoded at a particular cell, the corresponding entry in the log file can be marked as empty or unread. In practice, unread cells are often because of barcodes placed at extreme angles or partially covered, and can be corrected by adjusting item placement or scanner height.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec23\" class=\"Section2\"\u003e \u003ch2\u003e6.6. Data output and integration with inventory systems\u003c/h2\u003e \u003cp\u003eThe host-side script records each successful read in a simple text or CSV file. A minimal format consists of one line per event:\u003c/p\u003e \u003cp\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003etimestamp (ISO 8601 string),\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003ecell coordinates or indices,\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003edecoded barcode string.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/p\u003e \u003c/div\u003e\n\u003cp\u003eFor example:\u003c/p\u003e\n\u003cp\u003e2025-03-10T14:12:05,\u0026nbsp; \u0026nbsp; \u0026nbsp;0,\u0026nbsp; \u0026nbsp; \u0026nbsp;0,\u0026nbsp; \u0026nbsp; \u0026nbsp;\u0026ldquo;ABC123\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e2025-03-10T14:12:07,\u0026nbsp; \u0026nbsp; \u0026nbsp;1,\u0026nbsp; \u0026nbsp; \u0026nbsp;0,\u0026nbsp; \u0026nbsp; \u0026nbsp;\u0026ldquo;DEF456\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e2025-03-10T14:12:09,\u0026nbsp; \u0026nbsp; \u0026nbsp;2,\u0026nbsp; \u0026nbsp; \u0026nbsp;0,\u0026nbsp; \u0026nbsp; \u0026nbsp;\u0026ldquo;GHI789\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThis file can be imported into a spreadsheet application or joined with an existing inventory database by using the barcode as a key. For open-source inventory tools, such as InvenTree, it is straightforward to write a small adapter script that converts the log file into the required format for bulk stock updates.\u003c/p\u003e\n\u003ch2\u003e6.7 Safety and troubleshooting\u003c/h2\u003e\n\u003cp\u003eAlthough the platform operates at modest speeds and forces, basic safety precautions should be observed during operation:\u003c/p\u003e\n\u003cul type=\"disc\"\u003e\n \u003cli\u003eDo not place hands or tools inside the scan area while the axes are moving.\u003c/li\u003e\n \u003cli\u003eAvoid looking directly into any visible aiming beam from the scanner at close range.\u003c/li\u003e\n \u003cli\u003eEnsure that cables are routed so they cannot be snagged by the moving gantry (cf. Figure 3).\u003c/li\u003e\n \u003cli\u003eSwitch off the power supply before modifying the wiring or changing driver settings.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCommon issues and remedies are as follows:\u003c/p\u003e\n\u003cul type=\"disc\"\u003e\n \u003cli\u003e\u003cstrong\u003eMissed steps or rough motion:\u003c/strong\u003e reduce acceleration and maximum speed settings in the firmware, increase microstepping, or verify that belts and pulleys are correctly tensioned.\u003c/li\u003e\n \u003cli\u003e\u003cstrong\u003eInconsistent barcode reads:\u003c/strong\u003e check scanner focus and height, increase dwell time over each cell, or adjust lighting conditions if the scanner is sensitive to glare from the shelf.\u003c/li\u003e\n \u003cli\u003e\u003cstrong\u003eCommunication errors:\u003c/strong\u003e ensure that only one application is connected to the Arduino serial port at a time, and verify that the baud rate and port settings match the firmware configuration.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWith these procedures in place, the platform can be operated routinely by non-expert users in small warehouses, workshops, or teaching laboratories.\u003c/p\u003e"},{"header":"7. Discussion","content":"\u003cdiv id=\"Sec29\" class=\"Section2\"\u003e \u003ch2\u003e7.1 Validation and characterization\u003c/h2\u003e \u003cp\u003eThe present prototype was verified to operate correctly at a functional level: the X\u0026ndash;Y gantry covers the intended scan area, the barcode scanner successfully reads standard printed codes at the chosen height, and decoded barcodes are logged on the host PC while the platform executes a grid scan as described in Section 7. However, no systematic quantitative characterization of throughput, read reliability, or repeatability has yet been conducted.\u003c/p\u003e \u003cp\u003eTherefore, this section serves two purposes: (i) to document the current functional tests that confirm basic operation, and (ii) to propose a minimal validation protocol that future users can follow to quantify performance. Tables\u0026nbsp;\u003cspan refid=\"Tab3\" class=\"InternalRef\"\u003e3\u003c/span\u003e and \u003cspan refid=\"Tab4\" class=\"InternalRef\"\u003e4\u003c/span\u003e present suitable data formats for reporting results. The numerical values shown are \u003cem\u003eillustrative placeholders only\u003c/em\u003e and must be replaced with measured data before submission of the final article.\u003c/p\u003e \u003cp\u003e \u003cdiv class=\"gridtable\"\u003e\u003ctable float=\"Yes\" id=\"Tab3\" border=\"1\"\u003e \u003ccaption language=\"En\"\u003e \u003cdiv class=\"CaptionNumber\"\u003eTable 3\u003c/div\u003e \u003cdiv class=\"CaptionContent\"\u003e \u003cp\u003eExample format for reporting throughput versus number of items. Note: numerical values are illustrative placeholders only.\u003c/p\u003e \u003c/div\u003e \u003c/caption\u003e \u003ccolgroup cols=\"5\"\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c1\" colnum=\"1\"\u003e\u003c/div\u003e \u003cdiv align=\"char\" char=\".\" class=\"colspec\" colname=\"c2\" colnum=\"2\"\u003e\u003c/div\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c3\" colnum=\"3\"\u003e\u003c/div\u003e \u003cdiv align=\"char\" char=\".\" class=\"colspec\" colname=\"c4\" colnum=\"4\"\u003e\u003c/div\u003e \u003cdiv align=\"char\" char=\".\" class=\"colspec\" colname=\"c5\" colnum=\"5\"\u003e\u003c/div\u003e \u003cthead\u003e \u003ctr\u003e \u003cth align=\"left\" colname=\"c1\"\u003e \u003cp\u003eRun\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c2\"\u003e \u003cp\u003eNumber of items\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c3\"\u003e \u003cp\u003eScan area (cm\u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(\\times\\)\u003c/span\u003e\u003c/span\u003ecm)\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c4\"\u003e \u003cp\u003eCycle time (s)\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c5\"\u003e \u003cp\u003eRead success (%)\u003c/p\u003e \u003c/th\u003e \u003c/tr\u003e \u003c/thead\u003e \u003ctbody\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003e1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c2\"\u003e \u003cp\u003e4\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e\u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(20\\times20\\)\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c4\"\u003e \u003cp\u003e12\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c5\"\u003e \u003cp\u003e100\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003e2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c2\"\u003e \u003cp\u003e9\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e\u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(30\\times30\\)\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c4\"\u003e \u003cp\u003e28\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c5\"\u003e \u003cp\u003e100\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003e3\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c2\"\u003e \u003cp\u003e16\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c3\"\u003e \u003cp\u003e\u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c4\"\u003e \u003cp\u003e55\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c5\"\u003e \u003cp\u003e94\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003c/tbody\u003e \u003c/colgroup\u003e \u003c/table\u003e\u003c/div\u003e \u003c/p\u003e \u003cp\u003e \u003cdiv class=\"gridtable\"\u003e\u003ctable float=\"Yes\" id=\"Tab4\" border=\"1\"\u003e \u003ccaption language=\"En\"\u003e \u003cdiv class=\"CaptionNumber\"\u003eTable 4\u003c/div\u003e \u003cdiv class=\"CaptionContent\"\u003e \u003cp\u003eExample format for reporting position-dependent read reliability. Note: numerical values are illustrative placeholders only.\u003c/p\u003e \u003c/div\u003e \u003c/caption\u003e \u003ccolgroup cols=\"5\"\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c1\" colnum=\"1\"\u003e\u003c/div\u003e \u003cdiv align=\"left\" class=\"colspec\" colname=\"c2\" colnum=\"2\"\u003e\u003c/div\u003e \u003cdiv align=\"char\" char=\".\" class=\"colspec\" colname=\"c3\" colnum=\"3\"\u003e\u003c/div\u003e \u003cdiv align=\"char\" char=\".\" class=\"colspec\" colname=\"c4\" colnum=\"4\"\u003e\u003c/div\u003e \u003cdiv align=\"char\" char=\".\" class=\"colspec\" colname=\"c5\" colnum=\"5\"\u003e\u003c/div\u003e \u003cthead\u003e \u003ctr\u003e \u003cth align=\"left\" colname=\"c1\"\u003e \u003cp\u003ePosition ID\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c2\"\u003e \u003cp\u003eCoordinates (cm)\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c3\"\u003e \u003cp\u003eAttempts\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c4\"\u003e \u003cp\u003eSuccessful reads\u003c/p\u003e \u003c/th\u003e \u003cth align=\"left\" colname=\"c5\"\u003e \u003cp\u003eSuccess rate (%)\u003c/p\u003e \u003c/th\u003e \u003c/tr\u003e \u003c/thead\u003e \u003ctbody\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eP1\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003e(5, 5)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c3\"\u003e \u003cp\u003e10\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c4\"\u003e \u003cp\u003e10\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c5\"\u003e \u003cp\u003e100\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eP2\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003e(35, 5)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c3\"\u003e \u003cp\u003e10\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c4\"\u003e \u003cp\u003e9\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c5\"\u003e \u003cp\u003e90\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eP3\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003e(5, 35)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c3\"\u003e \u003cp\u003e10\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c4\"\u003e \u003cp\u003e9\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c5\"\u003e \u003cp\u003e90\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eP4\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003e(35, 35)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c3\"\u003e \u003cp\u003e10\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c4\"\u003e \u003cp\u003e8\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c5\"\u003e \u003cp\u003e80\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd align=\"left\" colname=\"c1\"\u003e \u003cp\u003eP5\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"left\" colname=\"c2\"\u003e \u003cp\u003e(20, 20)\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c3\"\u003e \u003cp\u003e10\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c4\"\u003e \u003cp\u003e10\u003c/p\u003e \u003c/td\u003e \u003ctd align=\"char\" char=\".\" colname=\"c5\"\u003e \u003cp\u003e100\u003c/p\u003e \u003c/td\u003e \u003c/tr\u003e \u003c/tbody\u003e \u003c/colgroup\u003e \u003c/table\u003e\u003c/div\u003e \u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec30\" class=\"Section2\"\u003e \u003ch2\u003e7.2 Current functional tests\u003c/h2\u003e \u003cp\u003eDuring development, the prototype underwent a series of informal tests to verify that all major subsystems behave as intended:\u003c/p\u003e \u003cp\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eMotion range and smoothness\u003c/b\u003e: With the scanner mounted at the nominal height, both axes were driven manually and under controller command across the full mechanical travel. The scanner head could reach all four corners of the planned \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e cm scan area without collision. No binding or severe vibration was observed at moderate speeds.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eScanner operation over the shelf\u003c/b\u003e: Standard 1D and 2D barcodes printed on paper labels were placed at several positions on the shelf. While the gantry was slowly moved by hand and in simple straight-line trajectories, the scanner reliably decoded the labels when they passed through its specified depth-of-field.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e \u003cb\u003eEnd-to-end logging\u003c/b\u003e: With the firmware and host script configured as described in Sections 3 and 7, the system was commanded to follow a short grid scan. Decoded barcodes appeared in the host console and were written to a CSV file together with timestamps. Spot checks confirmed that the recorded codes matched the physical labels placed on the shelf.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/p\u003e \u003cp\u003eThese checks establish that the device functions as a complete inventory scanning loop; however, they are insufficient to quantify performance. The subsections below outline a minimal validation campaign for future measurements.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec31\" class=\"Section2\"\u003e \u003ch2\u003e7.3 Proposed quantitative characterization\u003c/h2\u003e \u003cp\u003eA practical characterization can be built around three questions:\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eHow does \u003cem\u003ethroughput\u003c/em\u003e (cycle time) scale with the number of items to scan?\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eHow \u003cem\u003ereliable\u003c/em\u003e are barcode reads across the scan area?\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eHow \u003cem\u003erepeatable\u003c/em\u003e are successive scans under identical conditions?\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003eThe following protocols can be implemented using the existing hardware and design files.\u003c/p\u003e \u003cdiv id=\"Sec32\" class=\"Section3\"\u003e \u003ch2\u003e7.3.1 Throughput versus number of items\u003c/h2\u003e \u003cp\u003e \u003cstrong\u003eObjective\u003c/strong\u003e \u003cp\u003equantify how the total scan time and read success rate depend on the number of items and the size of the scan area.\u003c/p\u003e \u003c/p\u003e \u003cp\u003e \u003cb\u003eProcedure\u003c/b\u003e:\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eDefine several grid layouts within the \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e cm scan area, for example \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(2\\times2\\)\u003c/span\u003e\u003c/span\u003e, \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(3\\times3\\)\u003c/span\u003e\u003c/span\u003e, and \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(4\\times4\\)\u003c/span\u003e\u003c/span\u003e cells.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003ePlace a barcoded item in each cell of the grid. Ensure that all barcodes are clearly visible and within the scanner\u0026rsquo;s depth-of-field.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eFor each grid, perform at least three complete scans using the standard scan pattern and controller settings.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eFor each run, record the total cycle time and the number of cells where a barcode was successfully read.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003e \u003cstrong\u003eReporting format\u003c/strong\u003e \u003cp\u003eTable\u0026nbsp;\u003cspan refid=\"Tab3\" class=\"InternalRef\"\u003e3\u003c/span\u003e shows an example of how results can be summarized. The values are placeholders and are only included to illustrate the structure of the table.\u003c/p\u003e \u003c/p\u003e \u003cp\u003eFrom such data, users can compute the average cycle time per item and check whether the platform meets their requirements for periodic inventory counts or teaching laboratory exercises.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec33\" class=\"Section3\"\u003e \u003ch2\u003e7.3.2 Position-dependent read reliability\u003c/h2\u003e \u003cp\u003e \u003cstrong\u003eObjective\u003c/strong\u003e \u003cp\u003eAssess how reliably the scanner decodes barcodes at different positions within the scan area.\u003c/p\u003e \u003c/p\u003e \u003cp\u003e \u003cb\u003eProcedure\u003c/b\u003e:\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eSelect representative positions in the scan area; for instance, the four corners and the center.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eAt each position, place a standard barcode label and command the platform to stop above that position multiple times (e.g., 10 attempts).\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eFor each attempt, record whether the barcode is successfully decoded and logged.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003e \u003cstrong\u003eReporting format\u003c/strong\u003e \u003cp\u003eTable\u0026nbsp;\u003cspan refid=\"Tab4\" class=\"InternalRef\"\u003e4\u003c/span\u003e presents an example of the data structure; the numbers shown are placeholders.\u003c/p\u003e \u003c/p\u003e \u003cp\u003eSuch measurements reveal whether read reliability degrades near the limits of the mechanical travel owing to small changes in scanner angle or distance. If significant variation is observed, users can adjust the scanner height, tilt, or dwell time at each cell.\u003c/p\u003e \u003c/div\u003e \u003cdiv id=\"Sec34\" class=\"Section3\"\u003e \u003ch2\u003e7.3.3 Repeatability of scan results\u003c/h2\u003e \u003cp\u003e \u003cstrong\u003eObjective\u003c/strong\u003e \u003cp\u003eEvaluate how consistent the scan results are when the same grid is scanned repeatedly under identical conditions.\u003c/p\u003e \u003c/p\u003e \u003cp\u003e \u003cb\u003eProcedure\u003c/b\u003e:\u003c/p\u003e \u003cp\u003e \u003col\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eChoose a fixed grid layout (for example \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(3\\times3\\)\u003c/span\u003e\u003c/span\u003e cells) and populate all cells with barcoded items.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003ePerform a sequence of \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(N\\)\u003c/span\u003e\u003c/span\u003e scans (for example \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(N=5\\)\u003c/span\u003e\u003c/span\u003e\u0026ndash;10) without changing the physical setup.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eFor each scan, record the total cycle time and the ordered list of decoded barcodes.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003cspan\u003e \u003cli\u003e \u003cp\u003eCompare the sequences from different scans to detect any missing or mis-ordered reads, and compute the mean and standard deviation of the cycle time.\u003c/p\u003e \u003c/li\u003e \u003c/span\u003e \u003c/ol\u003e \u003c/p\u003e \u003cp\u003e \u003cstrong\u003eReporting format\u003c/strong\u003e \u003cp\u003eThe results can be summarized in text, for example\u003c/p\u003e \u003c/p\u003e \u003cp\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003emean cycle time \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\({T}_{\\text{m}\\text{e}\\text{a}\\text{n}}\\pm{\\sigma}_{T}\\)\u003c/span\u003e\u003c/span\u003e,\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003enumber of scans with identical barcode sequences out of \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(N\\)\u003c/span\u003e\u003c/span\u003e,\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003elist of any observed failure modes (cells where reads were intermittently missed or mis-assigned).\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/p\u003e \u003cp\u003eOptionally, a small table or plot can be included to show the distribution of cycle times or the cumulative number of errors as a function of scan index.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv id=\"Sec35\" class=\"Section2\"\u003e \u003ch2\u003e7.4 Interpretation and limitations\u003c/h2\u003e \u003cp\u003eUntil the proposed measurements are performed, the validation of the platform remains qualitative: the current prototype demonstrates that the hardware and software form a working system capable of automated barcode scanning over a small storage grid; however, it does not yet establish quantitative limits on throughput or reliability. The protocols and example data formats outlined above are intended to make it straightforward for other users\u0026mdash;including the original developers\u0026mdash;to conduct such measurements and report them in a consistent manner.\u003c/p\u003e \u003cp\u003eIn the final version of this article, the placeholder values in Tables\u0026nbsp;\u003cspan refid=\"Tab3\" class=\"InternalRef\"\u003e3\u003c/span\u003e and \u003cspan refid=\"Tab4\" class=\"InternalRef\"\u003e4\u003c/span\u003e should be replaced by experimentally obtained data, and the text in this section should be updated to highlight the primary quantitative findings (for instance, typical cycle time per item and overall read success rate under representative conditions).\u003c/p\u003e \u003c/div\u003e"},{"header":"8. Conclusion","content":"\u003cp\u003eThis article presents a low-cost, open-source platform for automated barcode inventory over a small storage grid. The device combines a simple X\u0026ndash;Y gantry, a commercially available 2D barcode scanner, and an Arduino-based controller to perform automated scans of barcoded items over a \u003cspan class=\"InlineEquation\"\u003e\u003cspan class=\"mathinline\"\u003e\\(40\\times40\\)\u003c/span\u003e\u003c/span\u003e cm shelf area. The mechanical design, electronics, firmware, and host-side scripts are documented in detail; all design files are made available under open licenses to facilitate replication and modification.\u003c/p\u003e \u003cp\u003eFrom a hardware perspective, the platform demonstrates that standard motion components (stepper motors, belts or screws, and low-cost guides) and widely available microcontroller hardware are sufficient to build a tabletop scanner that can be integrated with existing inventory systems. The modular structure of the design allows users to swap individual subsystems (for example, using different frame materials, alternative scanner models, or other open-source firmware such as GRBL) without changing the overall architecture. The build and operation instructions are aimed at small warehouses, workshops, and teaching laboratories, where access to industrial automation is limited but basic mechanical and electronics skills are available.\u003c/p\u003e \u003cp\u003eThe current prototype was validated qualitatively: the gantry covers the intended scan area, barcodes placed on the shelf are reliably decoded under typical conditions, and decoded codes are logged on the host PC while the platform executes a grid scan. However, we have not yet performed the quantitative validation that would normally accompany a mature industrial solution. To address this, Section 8 proposes a minimal characterization protocol and example data formats that future users can apply to measure throughput, spatial read reliability, and scan-to-scan repeatability. In the intended final version of this work, these placeholders should be replaced by experimental data obtained from systematic tests.\u003c/p\u003e \u003cp\u003eBeyond its immediate use for inventory tasks, the platform has reuse potential in several directions. In teaching, it provides a concrete example of mechatronic system integration, covering kinematics, motion control, sensor interfacing, and data handling within a single, physically compact device. In research and development, the same mechanical and electronic infrastructure could be adapted to other sensor heads (for instance, cameras or distance sensors) or to different types of labels and markers, enabling small-scale experiments on automated inspection or sample handling. Because the design files are open and the BOMs is modest, the platform can also serve as a starting point for communities interested in participatory or citizen-led automation of local storage and repair spaces.\u003c/p\u003e \u003cp\u003eIn summary, the hardware described here is not yet a fully optimized product but a reproducible, adaptable baseline for small-scale inventory automation. By making the complete design and a clear validation roadmap openly available, we aim to lower the barrier for others to build upon this work, to contribute quantitative performance data, and to explore new application domains for similar low-cost scanning platforms.\u003c/p\u003e"},{"header":"Declarations","content":"\u003cp\u003e\u003cstrong\u003eAcknowledgments\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThis article thanks 和美 Steel Limited Company for their assistance in fabricating the steel frame structure.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEthics and safety\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eNo human or animal experiments were conducted as part of this work. The hardware operates at low voltage and moderate mechanical speeds; however, users should follow standard safety practices when assembling and operating the device, including:\u003c/p\u003e\n\u003cul type=\"disc\"\u003e\n \u003cli\u003edisconnecting power before modifying wiring;\u003c/li\u003e\n \u003cli\u003eavoiding contact with moving mechanical components; and\u003c/li\u003e\n \u003cli\u003ecomplying with local electrical safety regulations.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhen used in educational environments, students should receive basic training on mechanical and electrical safety before operating the hardware.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCRediT authorship contribution statement\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLiang-Ching Hsu: Conceptualization\u003c/p\u003e\n\u003cp\u003eChen-Yu Chang: Investigation, Writing \u0026ndash; review \u0026amp; editing\u003c/p\u003e\n\u003cp\u003eHung-Yu Liang: Software, Writing \u0026ndash; review \u0026amp; editing\u003c/p\u003e\n\u003cp\u003eBo-Chang Dong: Supervision, Writing \u0026ndash; original draft.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDeclaration of competing interest\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe authors declare that they have no known competing financial interests or personal relationships that could have appeared to influence the work reported in this paper.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFunding\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eNo funding was received for conducting this study.\u0026nbsp;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAvailability of Data and Materials\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAll data generated or analysed during this study are included in this published article.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Specifications table\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHardware name\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLow-cost open-source 2-axis barcode inventory scanner\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSubject area\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eEngineering and Materials Science; Industrial Engineering and Automation; Educational tools and open-source alternatives to existing infrastructure\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHardware type\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMeasurement and control; Laboratory and warehouse automation; Robotics and motion systems\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOpen-source license\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDesign files: e.g., Creative Commons Attribution 4.0 International (CC BY 4.0); Firmware/software: e.g., MIT or GNU GPL v3\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCost of hardware\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u0026asymp; EUR XXX (prototype as described; to be updated with actual bill of materials [BOMs])\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSource file repository\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTo be added (e.g., Zenodo/OSF DOI or GitHub URL)\u003c/p\u003e"},{"header":"References","content":"\u003col\u003e\u003cli\u003e\u003cspan\u003eKisinga DC, Mchopa AD, Mwagike LR (2024) Warehouse management practices and business performance of small-scale grapes processing firms: evidence from Tanzania. Cogent Bus Manag 11:2427215. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.1080/23311975.2024.2427215\u003c/span\u003e\u003cspan address=\"10.1080/23311975.2024.2427215\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eCarpitella S, Izquierdo J (2025) Trends in sustainable inventory management practices in industry 4.0. Processes 13:1131. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.3390/pr13041131\u003c/span\u003e\u003cspan address=\"10.3390/pr13041131\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eUnleashed Software (2024) 19 inventory management statistics you need to know in 2024. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://www.unleashedsoftware.com/blog/inventory-management-statistics\u003c/span\u003e\u003cspan address=\"https://www.unleashedsoftware.com/blog/inventory-management-statistics\" targettype=\"URL\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eNetstock (2024) Inventory management 2024 benchmark report. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://www.netstock.com/research/inventory-management-report/\u003c/span\u003e\u003cspan address=\"https://www.netstock.com/research/inventory-management-report/\" targettype=\"URL\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eAilyn D, Lapine C (2024) Advanced warehouse management systems and inventory optimization for SMEs. White Paper, available via ResearchGate\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003ePrakoso BS, Nur Masruriyah AF, Prasetyo RT, Mardiah RT, Ardika SB, Feriadi SB (2024) Optimizing a warehouse management system (WMS) for small and medium enterprises (SMEs) using Odoo ERP. In: International Conference on Informatics, Multimedia, Cyber and Information System (ICIMCIS). IEEE, Jakarta, pp 880\u0026ndash;885. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.1109/ICIMCIS63449.2024.10957438\u003c/span\u003e\u003cspan address=\"10.1109/ICIMCIS63449.2024.10957438\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eInvenTree Project (2025) InvenTree documentation: intuitive inventory management. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://docs.inventree.org/en/stable/\u003c/span\u003e\u003cspan address=\"https://docs.inventree.org/en/stable/\" targettype=\"URL\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eManjrekar A, Jha S, Khapare S, Jagtap P, Yadav V (2021) Warehouse inventory management with cycle counting using drones. In: Proceedings of the 4th International Conference on Advances in Science \u0026amp; Technology (ICAST 2021). \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.2139/ssrn.3869512\u003c/span\u003e\u003cspan address=\"10.2139/ssrn.3869512\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eMartinez-Carranza J, Rojas-Perez LO (2022) Warehouse inspection with an autonomous micro air vehicle. Unmanned Syst 10:329\u0026ndash;342. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.1142/S2301385022410011\u003c/span\u003e\u003cspan address=\"10.1142/S2301385022410011\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eYoon B, Kim H, Youn G, Rhee J (2023) 3D position estimation of objects for inventory management automation using drones. Appl Sci 13:10830. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.3390/app131910830\u003c/span\u003e\u003cspan address=\"10.3390/app131910830\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003ePawale S, Kunder H, D J S PP (2024) S V Warehouse inventory management: drone-powered semi-automation with raspberry pi and network integration. In: Proceedings of the 2024 IEEE international conference on electronics, computing and communication technologies (CONECCT). IEEE, New York, pp 1\u0026ndash;5. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.1109/CONECCT62155.2024.10677264\u003c/span\u003e\u003cspan address=\"10.1109/CONECCT62155.2024.10677264\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eWichitwechkarn V, Fox C (2023) MACARONS: a modular and open-sourced automation system for vertical farming. J Open Hardw 7:1\u0026ndash;13. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.5334/joh.53\u003c/span\u003e\u003cspan address=\"10.5334/joh.53\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e \u003cli\u003e\u003cspan\u003eTakara G, Zachary Trimble AZ, Arata R, Brown S, Jaime Gonzalez H, Mora C (2021) An inexpensive robotic gantry to screen and control soil moisture for plant experiments. HardwareX 9:e00174. \u003cspan class=\"ExternalRef\"\u003e\u003cspan class=\"RefSource\"\u003ehttps://doi.org/10.1016/j.ohx.2021.e00174\u003c/span\u003e\u003cspan address=\"10.1016/j.ohx.2021.e00174\" targettype=\"DOI\" class=\"RefTarget\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e"}],"fulltextSource":"","fullText":"","funders":[],"hasAdminPriorityOnWorkflow":false,"hasManuscriptDocX":true,"hasOptedInToPreprint":true,"hasPassedJournalQc":"","hasAnyPriority":false,"hideJournal":true,"highlight":"","institution":"","isAcceptedByJournal":false,"isAuthorSuppliedPdf":false,"isDeskRejected":"","isHiddenFromSearch":false,"isInQc":false,"isInWorkflow":false,"isPdf":false,"isPdfUpToDate":true,"isWithdrawnOrRetracted":false,"journal":{"display":true,"email":"[email protected]","identity":"researchsquare","isNatureJournal":false,"hasQc":true,"allowDirectSubmit":true,"externalIdentity":"","sideBox":"","snPcode":"","submissionUrl":"/submission","title":"Research Square","twitterHandle":"researchsquare","acdcEnabled":true,"dfaEnabled":false,"editorialSystem":"","reportingPortfolio":"","inReviewEnabled":false,"inReviewRevisionsEnabled":true},"keywords":"Automated inventory, Barcode scanning, Open-source hardware, Arduino, Warehouse automation, Educational platform","lastPublishedDoi":"10.21203/rs.3.rs-8926424/v1","lastPublishedDoiUrl":"https://doi.org/10.21203/rs.3.rs-8926424/v1","license":{"name":"CC BY 4.0","url":"https://creativecommons.org/licenses/by/4.0/"},"manuscriptAbstract":"\u003cp\u003eManual inventory of storage racks in small warehouses, maintenance workshops, and teaching laboratories is time-consuming and exposes workers to awkward postures. Several small organizations do not deploy industrial warehouse management systems and continue to rely on ad hoc stock checks with handheld scanners. Here, we present a low-cost, open-source two-axis motion platform with an integrated two-dimensional barcode scanner, designed to automate the reading and logging of barcodes over a small storage grid. The hardware consists of a compact X–Y gantry mounted over a removable shelf, providing a usable scan area of approximately 40 x 40 cm within a 60 x 60 x 42 cm frame. Two stepper motors, driven by an Arduino Uno with CNC shield and A4988 drivers, position the scanner head above each cell of the grid in a parameterized scan pattern. The design only uses widely available mechanical and electronic components, and all CAD models, wiring diagrams, firmware, and host-side scripts are released under open-source licenses. We describe the mechanical structure, electronics, and firmware in sufficient detail for replication and adaptation, and provide build and operation instructions aimed at non-specialist users. At present, the prototype has undergone basic functional testing to verify end-to-end operation (gantry motion, barcode decoding, and data logging); however, it has not yet been characterized quantitatively. We propose a minimal validation protocol and example data formats for measuring throughput, read reliability, and scan-to-scan repeatability. The platform is can aid further development of small-scale inventory automation.\u003c/p\u003e","manuscriptTitle":"Low-cost open-source two-axis barcode-scanning platform for automated inventory of small storage grids","msid":"","msnumber":"","nonDraftVersions":[{"code":1,"date":"2026-03-18 08:37:35","doi":"10.21203/rs.3.rs-8926424/v1","editorialEvents":[{"type":"communityComments","content":0}],"status":"published","journal":{"display":true,"email":"[email protected]","identity":"researchsquare","isNatureJournal":false,"hasQc":true,"allowDirectSubmit":true,"externalIdentity":"","sideBox":"","snPcode":"","submissionUrl":"/submission","title":"Research Square","twitterHandle":"researchsquare","acdcEnabled":true,"dfaEnabled":false,"editorialSystem":"","reportingPortfolio":"","inReviewEnabled":false,"inReviewRevisionsEnabled":true}}],"origin":"","ownerIdentity":"b1f4cc94-89e3-49b0-bf9f-5083b7a06b29","owner":[],"postedDate":"March 18th, 2026","published":true,"recentEditorialEvents":[],"rejectedJournal":[],"revision":"","amendment":"","status":"posted","subjectAreas":[],"tags":[],"updatedAt":"2026-04-14T12:00:09+00:00","versionOfRecord":[],"versionCreatedAt":"2026-03-18 08:37:35","video":"","vorDoi":"","vorDoiUrl":"","workflowStages":[]},"version":"v1","identity":"rs-8926424","journalConfig":"researchsquare"},"__N_SSP":true},"page":"/article/[identity]/[[...version]]","query":{"redirect":"/article/rs-8926424","identity":"rs-8926424","version":["v1"]},"buildId":"XKTyCvWXoU3ODBz1xrDgd","isFallback":false,"isExperimentalCompile":false,"dynamicIds":[84888],"gssp":true,"scriptLoader":[]}

Text is read by the "Ask this paper" AI Q&A widget below. Extraction quality varies by source — PMC NXML preserves structure cleanly, OA-HTML may include some navigation residue, and OA-PDF can have broken hyphenation. The publisher copy (via DOI) is the canonical version.

My notes (saved in your browser only)

Ask this paper AI returns verbatim quotes from the full text · source: preprint-html

Answers must be backed by verbatim quotes from this paper's full text. Hallucinated quotes are dropped automatically; if no verbatim passage answers the question, we say so. How this works

Citation neighborhood (no data yet)

We don't have any in-corpus citations linked to this paper yet. This is a recent paper (2026) — citers typically take a year or two to land, and the OpenAlex reference graph may still be filling in.

Source provenance

europepmc
last seen: 2026-05-20T01:45:00.602351+00:00