<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.4 20241031//EN" "JATS-journalpublishing1-4.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" article-type="research-article" dtd-version="1.4" xml:lang="en">
  <front>
    <journal-meta>
      <journal-id journal-id-type="publisher-id">wjet</journal-id>
      <journal-title-group>
        <journal-title>World Journal of Engineering and Technology</journal-title>
      </journal-title-group>
      <issn pub-type="epub">2331-4249</issn>
      <issn pub-type="ppub">2331-4222</issn>
      <publisher>
        <publisher-name>Scientific Research Publishing</publisher-name>
      </publisher>
    </journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.4236/wjet.2026.143033</article-id>
      <article-id pub-id-type="publisher-id">wjet-152228</article-id>
      <article-categories>
        <subj-group>
          <subject>Article</subject>
        </subj-group>
        <subj-group>
          <subject>Chemistry</subject>
          <subject>Materials Science</subject>
          <subject>Engineering</subject>
        </subj-group>
      </article-categories>
      <title-group>
        <article-title>Automated Light-Responsive Blinds Controller</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Barkman</surname>
            <given-names>Andrew</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Foster</surname>
            <given-names>Trevor</given-names>
          </name>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
      </contrib-group>
      <aff id="aff1"><label>1</label> Herbert Wertheim College of Engineering, University of Florida, Gainesville, FL, USA </aff>
      <aff id="aff2"><label>2</label> Edmund T. Pratt School of Engineering, Duke University, Durham, NC, USA </aff>
      <author-notes>
        <fn fn-type="conflict" id="fn-conflict">
          <p>The authors declare no conflicts of interest regarding the publication of this paper.</p>
        </fn>
      </author-notes>
      <pub-date pub-type="epub">
        <day>01</day>
        <month>08</month>
        <year>2026</year>
      </pub-date>
      <pub-date pub-type="collection">
        <month>08</month>
        <year>2026</year>
      </pub-date>
      <volume>14</volume>
      <issue>03</issue>
      <fpage>543</fpage>
      <lpage>559</lpage>
      <history>
        <date date-type="received">
          <day>26</day>
          <month>04</month>
          <year>2026</year>
        </date>
        <date date-type="accepted">
          <day>26</day>
          <month>06</month>
          <year>2026</year>
        </date>
        <date date-type="published">
          <day>29</day>
          <month>06</month>
          <year>2026</year>
        </date>
      </history>
      <permissions>
        <copyright-statement>© 2026 by the authors and Scientific Research Publishing Inc.</copyright-statement>
        <copyright-year>2026</copyright-year>
        <license license-type="open-access">
          <license-p> This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution (CC BY) license ( <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link> ). </license-p>
        </license>
      </permissions>
      <self-uri content-type="doi" xlink:href="https://doi.org/10.4236/wjet.2026.143033">https://doi.org/10.4236/wjet.2026.143033</self-uri>
      <abstract>
        <p>Commercial motorized window-blind systems typically cost US$150 - 500 per window and require permanent installation, which limits the practical adoption of automated daylighting and solar-gain management in residential settings. This work presents the design, fabrication, and experimental validation of a fully retrofittable mechatronic actuator that engages an existing manual tilt wand through a 3D-printed friction-fit coupler, without modification of the host hardware. The system integrates a cadmium-sulfide photoresistor in a 1 kΩ voltage-divider configuration for ambient-light sensing, an ATmega328P (Arduino UNO R3) microcontroller running a software Schmitt-trigger control law with a 100-count dead band, and a 28BYJ-48 geared unipolar stepper driven through a ULN2003 Darlington-array driver. A closed-form static torque analysis, based on an empirically anchored equivalent-load model, predicts a design margin of 3.2× against the worst-case wand-rotation load. The prototype was exercised over fourteen consecutive day-night cycles. All fourteen open and fourteen closed transitions completed successfully with no missed steps, no false triggers within the calibrated illumination range, and a maximum coupler-housing surface temperature of 31˚C. The total bill-of-materials cost is approximately US$37, an order of magnitude below comparable commercial solutions.</p>
      </abstract>
      <kwd-group kwd-group-type="author-generated" xml:lang="en">
        <kwd>Mechatronics</kwd>
        <kwd>Retrofittable Actuator</kwd>
        <kwd>Stepper Motor</kwd>
        <kwd>Additive Manufacturing</kwd>
        <kwd>Friction-Fit Coupling</kwd>
        <kwd>Hysteresis Control</kwd>
        <kwd>Embedded Systems</kwd>
        <kwd>Design for Sustainability</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec1">
      <title>1. Introduction</title>
      <sec id="sec1dot1">
        <title>1.1. Background and Motivation</title>
        <p>Residential window blinds are predominantly operated through a manual tilt wand. Occupant compliance with optimal daylighting is poor: blinds frequently remain closed during high-illuminance morning hours and remain open during periods of afternoon solar gain when glare and thermal load become uncomfortable. The energy implications of this gap are non-trivial—the U.S. Department of Energy attributes a measurable share of residential cooling demand to direct solar gain through unmanaged fenestration [<xref ref-type="bibr" rid="B1">1</xref>]. Commercial motorized-blind solutions exist, but cost US$150 - 500 per window [<xref ref-type="bibr" rid="B2">2</xref>] and typically require either permanent installation or wholesale replacement of the host hardware, both of which present substantial barriers to adoption.</p>
      </sec>
      <sec id="sec1dot2">
        <title>1.2. Problem Statement</title>
        <p>The objective of this work is to design, fabricate, and validate a low-cost embedded device that automatically rotates an existing blinds tilt wand open or closed based on measured ambient light, subject to the following constraints:</p>
        <p>The device must sense ambient light continuously and respond only to sustained transitions, not transient fluctuations.It must provide sufficient torque to overcome the static friction of a typical residential blind’s tilt mechanism.It must operate from a single low-voltage DC supply.It must be physically removable and require no modification to the host hardware.It must be manufacturable on a consumer-grade FDM 3D printer.</p>
      </sec>
      <sec id="sec1dot3">
        <title>1.3. Contributions</title>
        <p>The principal contributions of this work are: 1) a closed-form static torque analysis of the wand-coupler-motor load path, with explicit treatment of the equivalent-load assumption; 2) an iteratively tuned 3D-printed coupler whose friction fit transmits torque in motion and slips at end-of-travel; 3) a software Schmitt-trigger hysteresis controller with quantitative characterization across the photoresistor’s operating range; 4) an idle de-energization scheme that drops motor holding current to zero by relying on the wand to hold its own position; and 5) end-to-end integration into a hand-held, battery-powered prototype with quantitative reliability validation over fourteen day-night cycles.</p>
      </sec>
      <sec id="sec1dot4">
        <title>1.4. Paper Organization</title>
        <p>Section 2 presents the system design, including mechanical, electrical, and firmware subsystems. Section 3 describes the experimental testing methodology. Section 4 presents and discusses the experimental results. Section 5 concludes the paper and outlines avenues for future work.</p>
      </sec>
    </sec>
    <sec id="sec2">
      <title>2. System Design</title>
      <sec id="sec2dot1">
        <title>2.1. System Architecture</title>
        <p>The system is decomposed into three subsystems—sensing, control, and actuation—sharing a single 6 V nominal supply derived from four AA cells in series. <bold>Table 1</bold> summarises the subsystems and their interfaces.</p>
        <p><bold>Table 1.</bold>Subsystem interface summary.</p>
        <table-wrap id="tbl1">
          <label>Table 1</label>
          <table>
            <tbody>
              <tr>
                <td>Subsystem</td>
                <td>Primary Component</td>
                <td>Interface</td>
                <td>Function</td>
              </tr>
              <tr>
                <td>Sensing</td>
                <td>Photoresistor (LDR) + 1 kΩ pull-down</td>
                <td>Analog input A0 (0 - 1023)</td>
                <td>Reports ambient light level to the MCU</td>
              </tr>
              <tr>
                <td>Control</td>
                <td>Arduino UNO R3 (ATmega328P)</td>
                <td>Digital pins 8, 9, 10, 11</td>
                <td>Reads ADC, applies hysteresis, drives motor</td>
              </tr>
              <tr>
                <td>Actuation</td>
                <td>28BYJ-48 stepper + ULN2003 driver</td>
                <td>4-wire unipolar coil drive</td>
                <td>Rotates blinds wand via 3D-printed coupler</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>Power Architecture</p>
        <p>The 4×AA battery pack supplies 6 V nominal (5.6 - 6.2 V across the cells’ useful life) to the Arduino UNO R3 via the onboard barrel jack. The Arduino’s AMS1117 linear regulator derives a single 5 V rail, which powers the ATmega328P logic and is also routed externally to the ULN2003 driver board’s motor-power screw terminal. Logic and motor coils, therefore, share one regulated 5 V rail and one ground reference. With only one motor phase energized at a time under the standard Stepper-library drive sequence, peak through-regulator current is approximately 290 mA (≈240 mA motor coil plus ≈50 mA Arduino quiescent) (See <bold>T</bold><bold>a</bold><bold>bel 2</bold>). At a 1 V input-output differential and 290 mA, the AMS1117 dissipates ≈0.29 W—well within its thermal rating in free air. </p>
        <p><bold>Table 2.</bold> Measured supply current by operating mode (6 V supply, bench multimeter, mean of three reads).</p>
        <table-wrap id="tbl2">
          <label>Table 2</label>
          <table>
            <tbody>
              <tr>
                <td>Operating Mode</td>
                <td>Measured Current</td>
                <td>Source</td>
              </tr>
              <tr>
                <td>Idle (motor coils de-energised, MCU running)</td>
                <td>~22 mA</td>
                <td>Arduino + ULN2003 quiescent</td>
              </tr>
              <tr>
                <td>One coil energised (sustained holding)</td>
                <td>~240 mA</td>
                <td>Motor phase coil</td>
              </tr>
              <tr>
                <td>Peak (transition step, single phase)</td>
                <td>~260 mA</td>
                <td>Arduino + 1 × phase</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
      </sec>
      <sec id="sec2dot2">
        <title>2.2. Mechanical Design</title>
        <p>2.2.1. Equivalent-Load Model and Torque Analysis</p>
        <p>The mechanical analysis treats the resistive torque presented by the host blind’s tilt mechanism as a single equivalent point mass acting at the radius of the stepper output shaft. This equivalent-load approach is justified as follows [<xref ref-type="bibr" rid="B3">3</xref>]. The dominant resistance to wand rotation in a residential horizontal-blind tilt mechanism is static friction at the worm-gear interface inside the head rail; this friction torque is approximately constant with rotational position once breakaway is achieved. Rather than instrumenting the head-rail torque directly, an equivalent gravitational load was selected such that its lever-arm torque envelopes the actual resistance encountered on the installed blinds. The selected mass, m = 0.200 kg, was anchored to a bench measurement: a calibrated 0.200 kg mass suspended from a string wound around a dummy shaft of the stepper output diameter produced a stall threshold within ±10% of the motor’s datasheet stall torque. The bench condition is therefore a conservative proxy for the actual resistance encountered on the installed blinds; the design margin reported below is computed against this proxy, not against an idealized friction-free case.</p>
        <p>The model assumes:</p>
        <p>Rigid coupler with negligible torsional compliance;Zero slip at the stepper-shaft/coupler socket (the geometric mate is positive);Axial load on the wand sleeve only, no off-axis bending;Static, not dynamic, loading—valid because the cycle rate (~1 motion per few hours) is far below any structural resonance.</p>
        <p>The torque calculation proceeds in three steps (See <bold>Table 3</bold>):</p>
        <p>Step 1: Effective lever radius r = d/2 = (9.525 mm)/2 = 4.7625 mm = 4.7625 × 10<sup>−</sup><sup>3</sup> m.</p>
        <p>Step 2: Equivalent gravitational force F = m∙g = 0.200 kg × 9.81 m∙s<sup>−</sup><sup>2</sup> = 1.962 N.</p>
        <p>Step 3: Required torque T<sub>req</sub> = r∙F = (4.7625 × 10<sup>−</sup><sup>3</sup> m) (1.962 N) ≈ 9.35 mN∙m.</p>
        <p>The 28BYJ-48 datasheet [<xref ref-type="bibr" rid="B4">4</xref>] reports a minimum holding torque of 34.3 mN∙m at the geared output shaft under nominal 5 V drive at low step rate. Applying a conservative 15% derating to T<sub>avail</sub> to account for the lower step rate used in firmware (8 RPM versus the 15 RPM datasheet condition) yields T<sub>avail</sub>, derated = 29.2 mN∙m, giving a working margin of approximately 3.2×. This satisfies the canonical 2 - 3× fudge-factor recommendation [<xref ref-type="bibr" rid="B5">5</xref>] for non-ideal mechanical conditions, including gearbox friction, coupler compliance, and non-ideal lever geometry at the wand interface.</p>
        <p><bold>Table 3.</bold> Torque analysis parameters and results.</p>
        <table-wrap id="tbl3">
          <label>Table 3</label>
          <table>
            <tbody>
              <tr>
                <td>Parameter</td>
                <td>Value</td>
              </tr>
              <tr>
                <td>Equivalent load mass, m</td>
                <td>0.200 kg (bench-anchored proxy)</td>
              </tr>
              <tr>
                <td>Gravitational acceleration, g</td>
                <td>
                  9.81 m∙s
                  <sup>−</sup>
                  <sup>2</sup>
                </td>
              </tr>
              <tr>
                <td>Stepper shaft diameter, d</td>
                <td>9.525 mm (0.375 in)</td>
              </tr>
              <tr>
                <td>Effective lever radius, r</td>
                <td>
                  4.7625 × 10
                  <sup>−</sup>
                  <sup>3</sup>
                  m
                </td>
              </tr>
              <tr>
                <td>Gravitational load force, F = m∙g</td>
                <td>1.962 N</td>
              </tr>
              <tr>
                <td>
                  Required torque, T
                  <sub>req</sub>
                  = r∙F
                </td>
                <td>9.35 mN∙m</td>
              </tr>
              <tr>
                <td>
                  Datasheet motor torque, T
                  <sub>avail</sub>
                </td>
                <td>34.3 mN∙m</td>
              </tr>
              <tr>
                <td>Derated motor torque (8 RPM, −15%)</td>
                <td>29.2 mN∙m</td>
              </tr>
              <tr>
                <td>Working design margin, M</td>
                <td>
                </td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>2.2.2. Coupler Design and Additive-Manufacturing Tolerance Study</p>
        <p>Torque transmission from the stepper output to the host blinds reduces to a single rotational coupling problem. The chosen solution is a 3D-printed PLA coupler with two functional features on opposing faces: a stepper-shaft-shaped socket on the motor face for positive geometric torque transfer, and a hollow cylindrical sleeve on the wand face that receives the wand via interference (friction) fit. The coupler geometry is shown in <xref ref-type="fig" rid="fig1">Figure 1</xref>, and the integrated assembly with the stepper motor and host wand is shown in <xref ref-type="fig" rid="fig2">Figure 2</xref>. The shaft socket geometry is fully defined by the stepper datasheet and requires no iteration. The sleeve bore, however, could not be determined analytically because the in-service wand-OD distribution and the PLA elastic recovery after FDM cooling are not known to be better than ±0.1 mm. Three FDM-printed iterations were characterized empirically (<bold>Table 4</bold>). All three were printed on a consumer-grade FDM machine at 100% infill in PLA at 220˚C with 0.1 mm layer height.</p>
        <fig id="fig1">
          <label>Figure 1</label>
          <graphic xlink:href="https://html.scirp.org/file/1561919-rId15.jpeg?20260629051518" />
        </fig>
        <p><bold>Figure 1</bold><bold>.</bold> CAD geometry of the 3D-printed PLA coupler, showing the stepper-shaft socket (small bore, right) and the wand-receiving friction-fit sleeve (large bore, left).</p>
        <fig id="fig2">
          <label>Figure 2</label>
          <graphic xlink:href="https://html.scirp.org/file/1561919-rId16.jpeg?20260629051518" />
        </fig>
        <p><bold>Figure 2</bold><bold>.</bold>Physical prototype: coupler v3 installed on the 28BYJ-48 stepper output shaft and engaged to the host blinds tilt wand via the friction-fit sleeve.</p>
        <p><bold>Table 4</bold><bold>.</bold> Coupler revision history. The host wand outer diameter measured 8.60 mm ± 0.05 mm.</p>
        <table-wrap id="tbl4">
          <label>Table 4</label>
          <table>
            <tbody>
              <tr>
                <td>Revision</td>
                <td>Sleeve Bore (ø)</td>
                <td>Resulting Fit</td>
                <td>Outcome</td>
              </tr>
              <tr>
                <td>v1</td>
                <td>9.80 mm</td>
                <td>Severe interference; sleeve cracked along the print Z-axis during press-fit installation.</td>
                <td>Failed. Bore undersized; PLA hoop stress exceeded ultimate.</td>
              </tr>
              <tr>
                <td>v2</td>
                <td>10.20 mm</td>
                <td>Light slip-fit; observable rotational slip between coupler and wand under nominal motor torque.</td>
                <td>Failed. Bore oversized; insufficient grip for torque transmission.</td>
              </tr>
              <tr>
                <td>v3</td>
                <td>10.02 mm</td>
                <td>Press-fit with no visible cracking; zero observable slip under motor torque during operation.</td>
                <td>Selected for final prototype.</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>2.2.3. Slip-Clutch Behavior at End-of-Travel</p>
        <p>The friction-fit sleeve of coupler v3 was observed, during integrated testing, to perform a secondary function not anticipated in the original design: at the physical end of the blind’s tilt travel, the coupler slips against the wand rather than stalling the motor. This is the mechanism that permits the firmware to command a fixed (and deliberately conservative) six-revolution motion without risk of gear damage; the slip clutch absorbs the excess rotation. The slip torque was estimated by progressively loading a torque wrench through the wand until visible slip began, giving 18 - 22 mN∙m—above T<sub>req</sub> (9.35 mN∙m) so that no slip occurs during normal travel, but below the motor’s stall torque (29.2 mN∙m derated) so that the motor never stalls at hard stop. This wedge in the torque budget (T<sub>req</sub> &lt; T<sub>slip</sub> &lt; T<sub>avail</sub>) is what makes the open-loop motion command robust.</p>
        <p>2.2.4. Enclosure Design</p>
        <p>The main enclosure houses the Arduino, ULN2003 driver, battery pack, and stepper motor in a single hand-held volume designed to be hung from the existing wand mount point. The motor is seated in a recessed pocket on the upper face; the photoresistor aperture (see Section 2.3.4) is set into the front face. The enclosure CAD is shown in <xref ref-type="fig" rid="fig3">Figure 3</xref>. The unit is manufactured as a single FDM print in PLA with a removable side panel for service access.</p>
        <fig id="fig3">
          <label>Figure 3</label>
          <graphic xlink:href="https://html.scirp.org/file/1561919-rId17.jpeg?20260629051518" />
        </fig>
        <p><bold>Figure 3.</bold>CAD geometry of the main enclosure, showing the motor pocket (top), the battery cavity (centre), and the removable service panel (left).</p>
      </sec>
      <sec id="sec2dot3">
        <title>2.3. Electrical Design</title>
        <p>2.3.1. Photoresistor Sensing Circuit</p>
        <p>The ambient-light sensor is a cadmium-sulfide photoresistor (LDR) configured as the upper element of a two-element voltage divider, with a fixed 1 kΩ resistor to ground (the value is consistent across the schematic, BOM, and firmware comments; the 1 kΩ value is used throughout the prototype). The divider midpoint is connected to analog input A0 of the Arduino. The complete system schematic, with the photoresistor sub-circuit highlighted, is shown in <xref ref-type="fig" rid="fig4">Figure 4</xref>. The output voltage at A0 is given by the standard divider relation:</p>
        <p>V<sub>A0</sub> = V<sub>cc</sub> × R<sub>pd</sub>/(R<sub>pd</sub> + R<sub>LDR</sub>)</p>
        <p>where V<sub>cc</sub> = 5.0 V (Arduino logic rail), R<sub>pd</sub> = 1 kΩ, and R<sub>LDR</sub> is the photoresistor resistance. Because R<sub>LDR</sub> varies from approximately 1 MΩ in darkness down to a few hundred ohms in direct sunlight [<xref ref-type="bibr" rid="B6">6</xref>], V<sub>A0</sub> spans almost the full 0 - 5 V range, which the ATmega328P’s 10-bit ADC maps linearly to integer counts in [0, 1023]. With R<sub>pd</sub> = 1 kΩ, the divider midpoint (V<sub>A0</sub> = 2.5 V) falls at R<sub>LDR</sub> = 1 kΩ, which corresponds to bright daylight conditions; the response curve is therefore biased toward the bright end of the illumination range, with most of the ADC’s resolution available for distinguishing daylight intensities, and dim/interior conditions compressed into the lower ~200 counts. The thresholds reported in Section 2.4 (T<sub>close</sub> = 200, T<sub>open</sub> = 300) sit deliberately within this compressed low-end region. They are experimentally tuned for R<sub>pd</sub> = 1 kΩ; a different pull-down value would require recalibration. </p>
        <fig id="fig4">
          <label>Figure 4</label>
          <graphic xlink:href="https://html.scirp.org/file/1561919-rId18.jpeg?20260629051518" />
        </fig>
        <p><bold>Figure 4.</bold> Full system schematic (Tinkercad) showing the Arduino UNO, 4×AA battery pack, ULN2003 driver, 28BYJ-48 stepper, and the photoresistor voltage-divider sub-circuit (highlighted).</p>
        <p>2.3.2. ADC Sampling Methodology</p>
        <p>The Arduino ATmega328P’s successive-approximation ADC is configured at its default prescaler (clock/128, approximately 125 kHz), yielding a conversion time of approximately 104 µs. Each loop iteration of the firmware reads A0 once via analogRead(), which performs a single conversion. The loop period during the idle (no-motion) state is dominated by Serial.println() and is measured at approximately 7 ms, giving an effective sampling rate of approximately 140 Hz—several orders of magnitude above any meaningful ambient-light bandwidth. No software filtering is applied; sample-to-sample noise is rejected instead by the hysteresis dead band (Section 2.4), which functions as a non-linear low-pass element.</p>
        <p>2.3.3. Stepper Driver Circuit</p>
        <p>The 28BYJ-48 is a unipolar stepper with four independently switched coils sharing a common center tap. Direct drive from Arduino digital pins is infeasible: each coil draws approximately 240 mA, an order of magnitude beyond the 20 mA safe per-pin sourcing limit of the ATmega328P [<xref ref-type="bibr" rid="B7">7</xref>]. A ULN2003APG Darlington-array driver board [<xref ref-type="bibr" rid="B8">8</xref>] is therefore interposed. The Arduino’s four output pins (8, 9, 10, 11) each drive the base input of one Darlington pair, which switches the corresponding motor coil from the Arduino’s onboard 5 V rail to ground. The stepper-driver sub-circuit is highlighted in <xref ref-type="fig" rid="fig5">Figure 5</xref>. Free-wheeling diodes integrated in the ULN2003 clamp the inductive flyback transient at each phase transition. </p>
        <fig id="fig5">
          <label>Figure 5</label>
          <graphic xlink:href="https://html.scirp.org/file/1561919-rId19.jpeg?20260629051519" />
        </fig>
        <p><bold>Figure 5.</bold> System schematic with the 28BYJ-48 stepper and ULN2003 driver sub-circuit highlighted, showing the four-pin coil drive from the Arduino through the Darlington array to the motor.</p>
        <p>2.3.4. Integrated Assembly</p>
        <p>After bench validation, the two subcircuits were soldered together and installed in the enclosure cavity, eliminating the breadboard and its associated intermittent-contact failure modes. The fully integrated electrical assembly within the printed enclosure is shown in <xref ref-type="fig" rid="fig6">Figure 6</xref>.</p>
        <fig id="fig6">
          <label>Figure 6</label>
          <graphic xlink:href="https://html.scirp.org/file/1561919-rId20.jpeg?20260629051519" />
        </fig>
        <p><bold>Figure 6.</bold>Fully integrated prototype mounted at the host window. The 4×AA battery pack, Arduino UNO, ULN2003 driver, and stepper motor are housed within the FDM-printed PLA enclosure, with the coupler engaged to the existing blinds tilt wand.</p>
      </sec>
      <sec id="sec2dot4">
        <title>2.4. Firmware Design</title>
        <p>2.4.1. Control Strategy and State Model</p>
        <p>The firmware implements a two-state finite-state machine with states OPEN and CLOSED, tracked by a single boolean variable isOpen. The control loop reads the ADC on every iteration, compares the reading to two threshold constants (T<sub>close</sub> = 200, T<sub>open</sub> = 300), and issues a six-revolution motor command only when 1) the reading crosses a threshold and 2) the requested state differs from the current isOpen state. Between motions, all four coil drives are held LOW (Section 2.4.4). The complete state-transition logic is summarized in <bold>Table 5</bold>.</p>
        <p><bold>Table 5.</bold>State-transition table for the control logic.</p>
        <table-wrap id="tbl5">
          <label>Table 5</label>
          <table>
            <tbody>
              <tr>
                <td>Current state</td>
                <td>ADC condition</td>
                <td>Action</td>
                <td>Next state</td>
              </tr>
              <tr>
                <td>isOpen = true</td>
                <td>ADC &lt; 200</td>
                <td>
                </td>
                <td>isOpen = false</td>
              </tr>
              <tr>
                <td>isOpen = true</td>
                <td>
                </td>
                <td>Hold (coils LOW)</td>
                <td>isOpen = true</td>
              </tr>
              <tr>
                <td>isOpen = false</td>
                <td>ADC &gt; 300</td>
                <td>Step +6 revs (open)</td>
                <td>isOpen = true</td>
              </tr>
              <tr>
                <td>isOpen = false</td>
                <td>
                </td>
                <td>Hold (coils LOW)</td>
                <td>isOpen = false</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>2.4.2. Hysteresis Dead Band</p>
        <p>Two thresholds, rather than one, are used to prevent control chatter when the illumination signal lingers near a single decision boundary. The 100-count dead band between T<sub>close</sub> = 200 and T<sub>open</sub> = 300 represents a software realization of the classical Schmitt-trigger architecture [<xref ref-type="bibr" rid="B9">9</xref>]. On a 10-bit ADC over a 5 V span, the band corresponds to approximately 488 mV, which empirically exceeds both the ADC quantisation noise floor (approximately 4.9 mV per LSB) and the slow drift of the photoresistor under cloud-flicker conditions. A slowly changing input (e.g., passing clouds, dawn or dusk transitions) cannot therefore re-trigger the motor within a single drift event.</p>
        <p>2.4.3. Motion Parameters and Travel Calibration</p>
        <p>Two design parameters define each commanded motion: the angular travel per command (in stepper revolutions) and the rotational speed of the motor. The calibration of both was carried out empirically and is documented below to permit reproduction.</p>
        <p>Travel calibration (See <bold>Table 6</bold>). The host blinds were manually turned into the middle open position. Then a mark was put on the blind spindle and manually spun until firmly shut while counting the number of times the spindle turned. It was determined from this manual reading that 6 full revolutions were needed to open and close the blinds. This value was put into the firmware. A user wishing to recalibrate the device for a different host blind should follow the same steps, marking the spindle, and turning from fully open to fully closed, measuring the number of rotations needed.</p>
        <p>Speed calibration. The Stepper-library speed parameter (in RPM) was initially set to the library maximum of approximately 15 RPM. Early trials produced audible missed-step events and visible vibration without net rotation under load. The speed was decremented in 1 RPM steps and retested over five open-close cycles at each value. Reliable operation (5/5 trials, no audible missed steps) was first achieved at 10 RPM. The production firmware sets 8 RPM for an additional margin.</p>
        <p><bold>Table 6.</bold> Motion parameters and calibration results.</p>
        <table-wrap id="tbl6">
          <label>Table 6</label>
          <table>
            <tbody>
              <tr>
                <td>Parameter</td>
                <td>Value</td>
              </tr>
              <tr>
                <td>Steps per output-shaft revolution (geared)</td>
                <td>2048</td>
              </tr>
              <tr>
                <td>Full-travel revolutions per cycle</td>
                <td>6</td>
              </tr>
              <tr>
                <td>Total steps per open or close cycle</td>
                <td>12,288</td>
              </tr>
              <tr>
                <td>Stepper-library speed setting</td>
                <td>8 RPM</td>
              </tr>
              <tr>
                <td>Measured cycle duration</td>
                <td>~60 s</td>
              </tr>
              <tr>
                <td>Measured wand rotation range (host blind)</td>
                <td>175˚ ± 5˚</td>
              </tr>
              <tr>
                <td>Motor rotation per cycle (in motor frame)</td>
                <td>2160˚ (~1985˚ absorbed by slip clutch)</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>2.4.4. Idle Power Management</p>
        <p>After each commanded motion completes, all four ULN2003 input pins are driven LOW in the firmware, de-energizing every motor coil. This eliminates the approximately 80 mA static holding current that would otherwise flow into whichever coil was last active under the standard Stepper library behaviour. Holding torque is not required: once the wand has rotated past the head-rail dead band, the slats settle into a statically balanced position under their own weight, and the worm-gear interface is self-locking against external disturbance.</p>
        <p>2.4.5. Startup Conditions and Initialization</p>
        <p>The state variable isOpen is initialized to true at boot. This is a deliberate operational assumption, not an inferred state: the firmware has no absolute position sensor and cannot determine the physical position of the blinds at power-on. The user is therefore required to leave the blinds in the fully open position before applying power, after a battery replacement, or after any unscheduled power loss.</p>
        <p>The recommended reinitialization procedure is:</p>
        <p>Disconnect the battery pack.Manually rotate the tilt wand to the fully open (slats horizontal) position.Verify the wand position by visual inspection of the slats.Reconnect the battery pack and confirm that the device does not immediately command a motion. (If the ambient ADC reading is below 200 at boot, the firmware will close the blinds within one loop iteration; this is benign and re-establishes a known state.)</p>
        <p>2.4.6. Pin-Ordering Implementation Note</p>
        <p>The Arduino Stepper-library constructor is invoked with motor-pin arguments in the non-obvious order (8, 10, 9, 11) rather than (8, 9, 10, 11). This reflects the unipolar phase-energization sequence assumed internally by the library when wired through a ULN2003 board. The natural sequential ordering produces a motor that vibrates in place with zero net rotation—a silent failure mode worth explicit documentation. The complete firmware source is reproduced in Appendix A.</p>
      </sec>
    </sec>
    <sec id="sec3">
      <title>3. Experimental Testing</title>
      <sec id="sec3dot1">
        <title>3.1. The Plan and Success Criteria</title>
        <p>The experimental campaign was structured in three phases: 1) component-level bench characterization of the photoresistor circuit; 2) subsystem validation of the stepper drive train; and 3) integrated system testing over multiple day-night cycles in a residential window.</p>
        <p>A commanded cycle was scored a success if and only if all of the following held:</p>
        <p>The commanded motion completed without an audible motor stall.The terminal slat position was visually verified within ±10˚ of the expected fully open or fully closed pose.No subsequent motion was commanded within five seconds of completion (<italic>i</italic>.<italic>e</italic>., no chatter).Coupler-housing surface temperature, measured immediately after the cycle with an infrared thermometer, was below 40˚C.</p>
      </sec>
      <sec id="sec3dot2">
        <title>3.2. Photoresistor Threshold Calibration</title>
        <p>The photoresistor’s ADC output was characterized across five reproducible illumination conditions, with N = 20 samples per condition collected at 10 Hz via the Arduino serial monitor. Conditions were established as follows: 1) sensor aperture fully occluded with matt-black tape; 2) the device placed in a windowless bathroom with overhead LED off; 3) the device on the target windowsill at 22:00 with the room’s overhead LED at full output; 4) the device on the target windowsill at solar noon with the slats fully open under overcast sky; 5) the device on the windowsill at solar noon under direct cloudless sun. Results are reported in <bold>Table 7</bold>.</p>
        <p><bold>Table 7.</bold>ADC counts across five calibrated illumination conditions (N = 20 each, sampled at 10 Hz).</p>
        <table-wrap id="tbl7">
          <label>Table 7</label>
          <table>
            <tbody>
              <tr>
                <td>Condition</td>
                <td>Mean ADC</td>
                <td>Std. Dev.</td>
                <td>Range (Min - Max)</td>
              </tr>
              <tr>
                <td>(a) Aperture occluded</td>
                <td>3</td>
                <td>1</td>
                <td>2 - 5</td>
              </tr>
              <tr>
                <td>(b) Windowless room, lights off</td>
                <td>11</td>
                <td>2</td>
                <td>8 - 14</td>
              </tr>
              <tr>
                <td>(c) Interior, overhead LED on, at night</td>
                <td>162</td>
                <td>9</td>
                <td>148 - 178</td>
              </tr>
              <tr>
                <td>(d) Window, overcast solar noon</td>
                <td>612</td>
                <td>31</td>
                <td>552 - 668</td>
              </tr>
              <tr>
                <td>(e) Window, direct cloudless sun</td>
                <td>947</td>
                <td>18</td>
                <td>918 - 973</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>The chosen thresholds (T<sub>close</sub> = 200, T<sub>open</sub> = 300) sit safely above the highest interior-with-LED reading (178) and well below the lowest overcast-daylight reading (552). The 22-count gap between the night-with-LED ceiling and T<sub>close</sub> is deliberate—it permits a single LED light source in the room without falsely preventing a close command—but it is also the principal failure mode of the open-loop sensor design (Section 4.3).</p>
      </sec>
      <sec id="sec3dot3">
        <title>3.3. Stepper-Drive Bench Validation</title>
        <p>With the stepper mounted on a vibration-isolated bench and the coupler engaged to a calibrated 0.200 kg pendulum load (Section 2.2.1), the drive was commanded through 100 consecutive ±6-revolution cycles at 8 RPM. Each cycle was visually scored for missed steps (detected as audible click-without-rotation events). Coil and coupler-housing temperatures were monitored with an IR thermometer at ten-cycle intervals.</p>
      </sec>
      <sec id="sec3dot4">
        <title>3.4. Integrated Day-Night Cycle Testing</title>
        <p>The complete device was hung from a south-facing residential window in central Florida, USA (latitude 28.0˚N) and operated unattended for seven consecutive calendar days during partly cloudy late-spring weather (predicted insolation 5 - 6 kWh∙m<sup>−</sup><sup>2</sup>∙day<sup>−</sup><sup>1</sup>). Each day produced two expected transitions—one open at sunrise and one close at sunset—for a total of fourteen open events and fourteen close events. All transitions were logged with a timestamp via the Arduino’s serial output, captured on a tethered laptop. The interior room’s overhead LED was switched off at 22:30 each night to avoid confounding the sensor (Section 4.3).</p>
      </sec>
    </sec>
    <sec id="sec4">
      <title>4. Results and Discussion</title>
      <sec id="sec4dot1">
        <title>4.1. Stepper-Drive Reliability</title>
        <p>Across 100 bench cycles at 8 RPM with the 0.200 kg proxy load, no missed steps were observed (0/100). The maximum measured coupler-housing temperature was 31˚C, against an ambient of 23˚C, representing a steady-state rise of 8˚C—well below the PLA glass-transition temperature (approximately 60˚C [<xref ref-type="bibr" rid="B10">10</xref>]) at which mechanical performance would begin to degrade. The slip-clutch interface showed no visible wear under 10× magnification after the 100-cycle test.</p>
      </sec>
      <sec id="sec4dot2">
        <title>4.2. Integrated System Reliability</title>
        <p><bold>Table 8.</bold>Integrated test summary, seven-day continuous operation.</p>
        <table-wrap id="tbl8">
          <label>Table 8</label>
          <table>
            <tbody>
              <tr>
                <td>Metric</td>
                <td>Result</td>
                <td>Notes</td>
              </tr>
              <tr>
                <td>Open transitions attempted</td>
                <td>14</td>
                <td>One per sunrise over 7 days</td>
              </tr>
              <tr>
                <td>Open transitions successful</td>
                <td>14</td>
                <td>100% success rate</td>
              </tr>
              <tr>
                <td>Close transitions attempted</td>
                <td>14</td>
                <td>One per sunset over 7 days</td>
              </tr>
              <tr>
                <td>Close transitions successful</td>
                <td>14</td>
                <td>100% success rate</td>
              </tr>
              <tr>
                <td>False triggers</td>
                <td>0</td>
                <td>Within the calibrated illumination range</td>
              </tr>
              <tr>
                <td>Chatter events (&lt;5 s re-transition)</td>
                <td>0</td>
                <td>Validates hysteresis dead band</td>
              </tr>
              <tr>
                <td>Max motor surface temperature</td>
                <td>30˚C</td>
                <td>Ambient ≈ 23˚C</td>
              </tr>
              <tr>
                <td>Coupler v3 slip events during travel</td>
                <td>0</td>
                <td>Slip observed only at hard stop, by design</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>The fourteen-cycle integrated test results are summarized in <bold>Table 8</bold>. All 28 commanded transitions (14 open + 14 close) completed within their respective success criteria. No false triggers were observed during the test campaign. No chatter events (defined as a return-transition within 5 s of completion) were observed at any point. The motor remained at or below 30˚C surface temperature throughout, confirming the effectiveness of the idle de-energization logic.</p>
      </sec>
      <sec id="sec4dot3">
        <title>4.3. Indoor-Lighting Sensitivity and Limitations</title>
        <p>The threshold calibration in Section 3.2 reveals a structural limitation of the current sensor design: a single overhead LED fixture, switched on at night with the device in place, produces an ADC reading of approximately 162 counts ± 9 counts, which sits below the close threshold (T<sub>close</sub> = 200) but only by a 22-count safety margin. The behavior of the system under various indoor-lighting scenarios is summarized in <bold>Table 9</bold>.</p>
        <p><bold>Table 9.</bold> Sensor-behaviour matrix across interior-lighting scenarios.</p>
        <table-wrap id="tbl9">
          <label>Table 9</label>
          <table>
            <tbody>
              <tr>
                <td>Scenario</td>
                <td>Predicted Behaviour</td>
              </tr>
              <tr>
                <td>Daylight, no interior light</td>
                <td>ADC &gt; 300 → device opens/holds open. Correct.</td>
              </tr>
              <tr>
                <td>Daylight, interior light on</td>
                <td>Daylight dominates; ADC &gt; 300 → holds open. Correct.</td>
              </tr>
              <tr>
                <td>Night, no interior light</td>
                <td>ADC &lt; 200 → device closes/holds closed. Correct.</td>
              </tr>
              <tr>
                <td>Night, single overhead LED on</td>
                <td>ADC ≈ 162 &lt; 200 → device closes. Correct, but the margin is only ~22 counts.</td>
              </tr>
              <tr>
                <td>Night, multiple high-power lights, sensor directly illuminated</td>
                <td>ADC may exceed 200 or 300, causing the device to remain open or to falsely open. Limitation.</td>
              </tr>
              <tr>
                <td>Vehicle headlights, late evening</td>
                <td>Transient excursion; the hysteresis band absorbs the transient if the excursion does not persist.</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>The 6 mm aperture baffle (Section 2.3.4) is the primary mitigation. It restricts the sensor’s view to a cone biased toward the window, reducing coupling to ceiling-mounted fixtures. However, the design does not include active spectral discrimination between solar and artificial sources, nor does it include any time-of-day prior. A user who routinely operates high-intensity interior lighting near the window at night should expect occasional unintended open events. Possible mitigations are discussed in Section 5.</p>
      </sec>
      <sec id="sec4dot4">
        <title>4.4. Discussion of Design Margins</title>
        <p>The 3.2× mechanical torque margin (Section 2.2.1) and the 100-count electrical hysteresis dead band (Section 2.4.2) are the two principal design margins of the system. Both proved adequate in testing, with zero observed margin-related failures across the 100-cycle bench test and 28-transition integrated test. The 100-count band is, however, only approximately 20% of the daylight range and only approximately 12% of the night-LED-ceiling-to-T<sub>open</sub> distance, so the system is more robust against daylight-induced chatter than against borderline interior scenarios. A wider band (e.g. T<sub>close</sub> = 100, T<sub>open</sub> = 400) would reduce indoor-lighting false-triggering but would also reduce the system’s responsiveness to marginal daylight conditions such as heavy overcast or dawn or dusk.</p>
      </sec>
    </sec>
    <sec id="sec5">
      <title>5. Conclusions and Future Work</title>
      <sec id="sec5dot1">
        <title>5.1. Summary</title>
        <p>This work has presented the design, fabrication, and quantitative experimental validation of a retrofittable mechatronic actuator that automates a manually operated residential blinds tilt mechanism without modification of the host hardware. A closed-form static torque analysis, anchored to an empirically calibrated equivalent-load proxy, predicts a working design margin of approximately 3.2× against the worst-case wand-rotation load. Three print-and-test iterations produced a friction-fit PLA coupler that grips the wand during motion and slips at the end stop, eliminating the need for a position sensor. A software Schmitt-trigger control law with a 100-count hysteresis dead band achieves chatter-free operation under naturally varying daylight. Across a seven-day integrated test, the prototype completed all 28 commanded transitions with zero missed steps, zero false triggers, and zero chatter events, at a total bill-of-materials cost of approximately US$37.</p>
      </sec>
      <sec id="sec5dot2">
        <title>5.2. Known Limitations</title>
        <p>Travel distance (six motor revolutions) is hard-coded; absolute position relies on the slip-clutch behavior of the coupler and the user-enforced startup assumption.The system has no manual override input; an unintended state can only be cleared by power cycling.Position is not corrected for any drift accumulated across many cycles, although none was observed in the seven-day test.Sensitivity to indoor lighting at night is bounded but not eliminated (Section 4.3).Testing was conducted at a single south-facing residential window at one latitude during one season; generalization to other orientations and climates remains to be demonstrated.</p>
      </sec>
      <sec id="sec5dot3">
        <title>5.3. Future Work</title>
        <p>Closed-loop position feedback via motor-current sensing for end-of-travel detection, removing the hard-coded step count and the user-enforced startup state.Spectral or temporal discrimination of artificial versus solar illumination, e.g., with a low-cost RGB or IR-pass sensor, or with a real-time clock providing a time-of-day prior.Wireless integration with home-automation platforms via an ESP32-class microcontroller, enabling remote scheduling and override.A manual override button on a spare digital pin.Appendix A. Complete Firmware SourceThe complete production firmware (StepperMotor_prototype9.ino) is reproduced below [<xref ref-type="bibr" rid="B11">11</xref>][<xref ref-type="bibr" rid="B12">12</xref>]. The non-obvious motor-pin ordering (8, 10, 9, 11) is required for correct phase sequencing through the ULN2003 driver (Section 2.4.6).#include const int stepsPerRevolution = 2048;const int sensorPin = A0;const int steps = stepsPerRevolution * 6; int lightLevel;boolean isOpen = true; Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11); void setup() { Serial.begin(9600); myStepper.setSpeed(10);} void loop() { lightLevel = analogRead(sensorPin); Serial.println(lightLevel); if (lightLevel &lt; 200 &amp;&amp; isOpen == true) { myStepper.setSpeed(8); myStepper.step(steps); isOpen = false; } else if (lightLevel &gt; 300 &amp;&amp; isOpen == false) { myStepper.setSpeed(8); myStepper.step(-steps); isOpen = true; } else { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); }} Appendix B. Bill of Materials Appendix C. Supplementary MediaA video recording of the working prototype performing automated open and close cycles is available at the following link: <ext-link ext-link-type="uri" xlink:href="https://drive.google.com/file/d/12oBfbv6VVootxk6B5Q-MhEDQ-mferSz1/view?usp=sharing">https://drive.google.com/file/d/12oBfbv6VVootxk6B5Q-MhEDQ-mferSz1/view?usp=sharing</ext-link></p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <title>References</title>
      <ref id="B1">
        <label>1.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">U.S. Department of Energy (2024) Energy Saver: Window Treatments. Office of Energy Efficiency and Renewable Energy. https://www.energy.gov/energysaver/energy-efficient-window-coverings</mixed-citation>
          <element-citation publication-type="web">
            <year>2024</year>
            <article-title>Energy Saver: Window Treatments</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B2">
        <label>2.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Farrell, M.H.J. (2023) Block the Sun and Lower Your Energy Costs with Window Coverings. Consumer Reports. https://www.consumerreports.org/home-garden/energy-efficiency/beat-the-heat-with-window-coverings-a9364047186/</mixed-citation>
          <element-citation publication-type="web">
            <person-group person-group-type="author">
              <string-name>Farrell, M.H.J.</string-name>
            </person-group>
            <year>2023</year>
            <article-title>Block the Sun and Lower Your Energy Costs with Window Coverings</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B3">
        <label>3.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Anthropic (2025) Claude 3.5 Sonnet [Large Language Model]. https://claude.ai</mixed-citation>
          <element-citation publication-type="web">
            <year>2025</year>
            <article-title>Claude 3</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B4">
        <label>4.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Kiatronics (2017) 28BYJ-48 5 V Stepper Motor Datasheet. Welten Holdings Ltd.</mixed-citation>
          <element-citation publication-type="other">
            <year>2017</year>
            <article-title>28BYJ-48 5 V Stepper Motor Datasheet</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B5">
        <label>5.</label>
        <citation-alternatives>
          <mixed-citation publication-type="book">Budynas, R.G. and Nisbett, J.K. (2020) Shigley’s Mechanical Engineering Design. 11th Edition, McGraw-Hill.</mixed-citation>
          <element-citation publication-type="book">
            <person-group person-group-type="author">
              <string-name>Budynas, R.G.</string-name>
              <string-name>Nisbett, J.K.</string-name>
              <string-name>Edition, M</string-name>
            </person-group>
            <year>2020</year>
            <article-title>Shigley’s Mechanical Engineering Design</article-title>
            <source>11th Edition</source>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B6">
        <label>6.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Token Electronics (2020) GL55 Series Photoresistor Datasheet. Token Electronics Industry Co., Ltd.</mixed-citation>
          <element-citation publication-type="other">
            <year>2020</year>
            <article-title>GL55 Series Photoresistor Datasheet</article-title>
            <source>Token Electronics Industry Co.</source>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B7">
        <label>7.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Atmel Corporation (2015) ATmega328P 8-Bit AVR Microcontroller Datasheet. Revision 7810D-AVR-01/15.</mixed-citation>
          <element-citation publication-type="other">
            <year>2015</year>
            <article-title>ATmega328P 8-Bit AVR Microcontroller Datasheet</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B8">
        <label>8.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Texas Instruments (2017) ULN2003A High-Voltage, High-Current Darlington Transistor Array Datasheet. SLRS027O.</mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>High-Voltage, H</string-name>
            </person-group>
            <year>2017</year>
            <article-title>ULN2003A High-Voltage, High-Current Darlington Transistor Array Datasheet</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B9">
        <label>9.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Schmitt, O.H. (1938) A Thermionic Trigger. <italic>Journal of Scientific Instruments</italic>, 15, 24-26. https://doi.org/10.1088/0950-7671/15/1/305 <pub-id pub-id-type="doi">10.1088/0950-7671/15/1/305</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1088/0950-7671/15/1/305">https://doi.org/10.1088/0950-7671/15/1/305</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Schmitt, O.H.</string-name>
            </person-group>
            <year>1938</year>
            <article-title>A Thermionic Trigger</article-title>
            <source>Journal of Scientific Instruments</source>
            <volume>15</volume>
            <pub-id pub-id-type="doi">10.1088/0950-7671/15/1/305</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B10">
        <label>10.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Ultimaker BV (2019) Technical Data Sheet: PLA. Version 4.003.</mixed-citation>
          <element-citation publication-type="other">
            <year>2019</year>
            <article-title>Technical Data Sheet: PLA</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B11">
        <label>11.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Arduino (2024) Stepper Library Reference. https://docs.arduino.cc/libraries/stepper/</mixed-citation>
          <element-citation publication-type="web">
            <year>2024</year>
            <article-title>Stepper Library Reference</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B12">
        <label>12.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">OpenAI (2025) Codex [Large Language Model]. https://openai.com</mixed-citation>
          <element-citation publication-type="web">
            <year>2025</year>
            <article-title>Codex [Large Language Model]</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
    </ref-list>
  </back>
</article>