I am blind or visually impaired: the story in one minute
Third Eye Kit

Research, Archive, Proposal, with its design review

Submitted by the founder, Said Mohaddes Sadeqi, and published as written. One supplier listing it links to has since gone offline; the text is kept as submitted. The design review of this proposal is published beside it: Design review: depth to tactile matrix.

Technical Specification and Architectural Framework for Real-Time Spatial Depth to Tactile Haptic Matrix Conversion Systems

Submitted by the founder for board review. The text below is his, unedited. Where the paste lost a value or a formula, the original showed a placeholder character (); the review notes what each one most likely stood for.

1. Architectural System Architecture and Multi-Tier Operational Topology

The real-time conversion of three-dimensional spatial depth maps into localized tactile vibrations requires a multi-tiered, tightly synchronized hardware and software processing pipeline. The system captures ambient environmental geometry, processes high-density point clouds into downsampled spatial matrices, and streams driver control signals to high-density physical actuator arrays. The complete architecture functions across six distinct operational tiers: [1][2][3][4][5]

The Spatial Depth Acquisition Tier uses a low-latency USB Video Class (UVC) camera module equipped with high-sensitivity image sensors, such as 4K Sony Starvis sensors, or active infrared (IR) structured-light/time-of-flight depth engines. Operating at rates up to 60 frames per second, this tier outputs raw spatial depth frames over a high-speed USB interface. [1][2][3][4][5]

The Physical Transport and Power Bridge Tier utilizes a specialized dual-role USB-C On-The-Go (OTG) power-delivery splitter. This hardware layer isolates data paths while routing external high-current DC power, enabling simultaneous high-throughput UVC data streaming and host battery charging via Power Delivery (PD) pass-through protocols. [1][2][3][4][5]

The Spatial Processing Engine Tier runs on a host computing unit, such as an Android-based edge processor or a embedded system-on-chip. This tier executes spatial region-of-interest (ROI) cropping, minimum depth pooling, temporal median filtering, and inverted exponential depth-to-intensity mapping. [1][2][3][4][5]

The Embedded Microcontroller Orchestration Tier relies on an ESP32 dual-core microcontroller running a real-time operating system (FreeRTOS). Core 0 handles incoming frame parsing and communication protocols, while Core 1 executes a deterministic 50 Hz control loop that formats and dispatches channel payloads over an Inter-Integrated Circuit (I2C) bus. [1][2][3][4][5]

The Multi-Channel PWM Driver Matrix Tier uses chain-linked PCA9685 12-bit PWM driver modules. Communicating over I2C at clock speeds up to 1 MHz, these controllers generate independent 4096-step PWM signals at a base frequency optimized for human tactile perception. [1][2][3][4][5]

The Discrete Actuator and Switch Array Tier consists of individual low-side transistor switching circuits, incorporating NPN bipolar junction transistors or logic-level N-channel MOSFETs, anti-parallel flyback diodes, and decoupling networks, that regulate high-current DC power to Eccentric Rotating Mass (ERM) coin vibration motors. [1][2][3][4][5]

This architecture provides low glass-to-vibration latency (under 30 milliseconds), preventing sensory lag during dynamic obstacle navigation.

2. Component-Level Circuit Topologies and Electrical Interconnect Dynamics

Interfacing an ESP32 host microcontroller with high-density actuator arrays driven by PCA9685 controllers requires precise low-level circuit design to maintain signal integrity and hardware reliability.

Microcontroller and I2C Peripheral Interconnects

The ESP32 communicates with the PCA9685 driver via hardware I2C peripherals. The Serial Data (SDA) line connects from ESP32 GPIO21 to the PCA9685 SDA pin, and the Serial Clock (SCL) line connects from ESP32 GPIO22 to the PCA9685 SCL pin. Because I2C relies on open-drain drivers, dual  metal-film pull-up resistors are installed between the SDA/SCL lines and the  power bus. These resistors maintain sharp rise times during 400 kHz Fast-Mode operations, preventing bus stall conditions caused by parasitic trace capacitance. [1][2][3][4][5]

The PCA9685 accepts  logic signals from the ESP32 while operating at a digital logic supply () of  to , eliminating the need for active bidirectional logic-level shifters. Up to 62 PCA9685 driver boards can be daisy-chained on a single I2C bus by configuring the hardware address solder jumpers ( through ), allowing the system to scale from 16 to 992 independent PWM channels. The Active-Low Output Enable () pin is connected to an ESP32 GPIO and pulled low to GND through a  resistor, enabling instant output shutdown during fault conditions or system boot sequences. [1][2][3][4][5]

Discrete Motor Driver and Protection Circuitry

The PCA9685 cannot directly power ERM coin vibration motors. The chip's internal output drivers sink up to  and source up to  per channel, whereas standard  ERM coin motors draw  to  during steady-state operation and up to  inrush current at startup. Connecting actuators directly to the PCA9685 damages its internal driver stages, causes severe thermal stress, and corrupts I2C bus transactions. [1][2][3][4][5]

To resolve this, each output channel uses a discrete low-side switching circuit: [1][2][3][4][5]

The switching element uses a high-gain NPN bipolar junction transistor (such as the BC337) or a logic-level N-channel MOSFET (such as the AO3400). [1][2][3][4][5]

A  series base/milestone resistor limits current drawn from the PCA9685 output pin to approximately  at  logic levels, well within safe operating limits. [1][2][3][4][5]

A  pull-down resistor connected between the transistor base (or MOSFET milestone) and Ground keeps the driver off during system power-up or microcontroller resets, preventing uncommanded motor activation.

An anti-parallel flyback diode (a  silicon rectifier or  Schottky diode) is connected directly across the motor terminals. This diode provides a safe dissipation path for high-voltage inductive spikes generated when the motor brushes disengage or when PWM switching cuts off current. [1][2][3][4][5]

A bulk decoupling network, combining a  low-ESR electrolytic capacitor across the main  terminal block and  ceramic capacitors near each motor branch, suppresses supply voltage dips and high-frequency electrical noise caused by motor commutation.

Hardware Component Nominal Parameter Operational Limit Circuit Function
ESP32 Microcontroller 3.3 V Logic, 240 MHz 240 mA Peak Current System orchestrator, I2C host, spatial frame mapping
PCA9685 PWM Controller 2.3 V to 5.5 V Logic, 12-Bit 400 kHz / 1 MHz I2C Multi-channel PWM generation, 4096-step resolution
BC337 Transistor NPN, VCEO = 45 V IC max = 800 mA Low-side power switching array per channel
1N4001 Diode VRRM = 50 V, IF = 1 A VF = 1.1 V at 1 A Inductive back-EMF flyback protection
ERM Coin Vibration Motor 3.0 V to 5.0 V DC, 10 mm 80 mA Run, 180 mA Inrush Converts PWM electrical pulses into physical vibration
I2C Pull-Up Resistors 4.7 kΩ Metal Film 3.3 V Rail Maintains I2C SDA/SCL signal integrity

3. Dual-Rail Power Distribution, USB-C OTG Host Integration, and Thermal Safeguards

Power routing in dense tactile arrays requires separating digital control logic from high-current motor supplies. Common-rail setups often fail when multiple ERM motors switch on simultaneously. This creates an instantaneous current draw that can exceed , causing supply voltage drops that trigger ESP32 brownout resets, clear PCA9685 configuration registers, and disrupt USB data connections on the host processor.

Dual-Rail Electrical Topology and Noise Isolation

To eliminate power interference, the system uses an isolated dual-rail architecture:

The Logic Power Rail () operates at  powered by an onboard Low-Dropout (LDO) regulator connected to the primary supply. This rail supplies regulated, noise-free current exclusively to the ESP32 core, I2C pull-up networks, and internal logic of the PCA9685 controllers. [1][2][3][4][5][6]

The Actuator High-Current Power Rail () connects directly from an external regulated  power supply (capable of supplying at least  continuous current) to the screw terminals on the PCA9685 board. This rail powers the motor collector/drain nodes without passing through microcontroller regulators. [1][2][3][4][5][6]

Grounding uses a single-point star ground topology. The digital ground () and high-current motor ground () remain isolated across PCB traces, joining only at the main power supply input terminal. This prevents ground bounce and heavy switching noise from corrupting digital signals. [1][2][3][4][5][6]

USB-C OTG Pass-Through and SimulCharge Protocol Dynamics

Mobile host processing units must stream spatial data from UVC sensors while receiving continuous power to avoid battery drain. Standard USB OTG defaults to placing the mobile device in host mode, forcing it to supply power to attached peripherals. [1][2][3][4][5][6]

To support simultaneous data transfer and host charging, the physical bridge implements SimulCharge / USB Power Delivery (PD) pass-through protocols: [1][2][3][4][5][6]

Configuration Channel (CC) Termination uses  pull-down resistors installed on the  and  lines of the upstream-facing port to set correct cable-orientation and device-role detection. [1][2][3][4][5][6]

Power Delivery (PD) Negotiation uses an onboard USB PD controller IC to manage Vendor Defined Message (VDM) handshakes over the CC lines. This negotiation commands the mobile device to accept external power (Power Sink role) while maintaining its data mode as a USB Host. [1][2][3][4][5][6]

Signal lines ( and ) route directly from the UVC depth camera module to the mobile host, forming a dedicated  USB 2.0 High-Speed data link.

Power Bus Rail Operating Voltage Maximum Target Current Connected System Subsystems Electrical Isolation / Protection
Logic Supply (VCC) 3.3 V DC 350 mA ESP32 Core, PCA9685 Logic, Sensors LDO Regulation, 0.1 µF Decoupling
Actuator Supply (V+) 5.0 V DC 3.2 A 16x ERM Motors, Transistor Collectors 470 µF Low-ESR Cap, Schottky Diode
USB PD Pass-Through 5.0 V to 9.0 V 2.0 A to 3.0 A Mobile Host Spatial Engine Charging CC Pin Negotiation IC, Current Limiter

4. Psychophysics of Cutaneous Mechanoreception and Spatial Tactile Resolution

Designing effective tactile arrays requires matching actuator outputs to the biological characteristics of human skin mechanoreceptors. Human skin contains four main types of mechanoreceptors, distinguished by their adaptation rates and receptive field sizes.

Mechanoreceptor Characteristics and Activation Targets

Meissner's Corpuscles (RA1 - Rapidly Adapting Type 1) are shallow receptors located in the dermis-epidermis boundary. They have small receptive fields () and respond strongest to low-frequency vibrations (), making them ideal for detecting localized movement and skin slip. [1][2][3][4]

Pacinian Corpuscles (RA2 - Rapidly Adapting Type 2) are deep receptors located in subcutaneous tissue. They feature large receptive fields with indistinct borders and show high sensitivity to high-frequency vibrations (), peaking sharply between  and . They process transient impacts, texture, and intensity gradients. [1][2][3][4]

Merkel Disks (SA1 - Slowly Adapting Type 1) are superficial receptors with small receptive fields that process static indentation and edge contours. [1][2][3][4]

Ruffini Endings (SA2 - Slowly Adapting Type 2) are deep receptors with large receptive fields that respond primarily to continuous lateral skin stretch. [1][2][3][4]

Two-Point Discrimination Limits and Array Geometry

Spacing between physical actuators must respect spatial two-point discrimination thresholds to prevent spatial aliasing, where adjacent vibration points blur into an ambiguous sensation. [1][2][3][4]

On fingertips, high receptor density yields a two-point threshold of , enabling dense actuator placement. [1][2][3][4]

On the forearm and upper arm, thresholds broaden to . Actuators in arm-mounted wearables must maintain a center-to-center spacing of at least . [1][2][3][4]

On the torso and back, thresholds extend to . Vest-mounted arrays require wider spacing to ensure individual channels remain clearly distinguishable. [1][2][3][4]

Modulation Strategy and Intensity Scaling

Operating the PCA9685 at a base PWM frequency of  aligns actuator outputs directly with the maximum sensitivity band of Pacinian corpuscles. Modulating the 12-bit PWM duty cycle alters average voltage delivery, driving variations in vibration amplitude and perceived intensity. Perceived intensity follows Stevens' Power Law (), where perceived strength () scales with physical stimulus magnitude () raised to an exponent ( for tactile vibration), enabling smooth, linear sensation scaling.

Mechanoreceptor Type Anatomical Layer Adaptation Rate Receptive Field Peak Sensitivity Range Target Perception
Meissner (RA1) Upper Dermis (0.5 to 1.0 mm) Rapid Small (2 to 4 mm) 3 Hz to 50 Hz Surface movement, low-frequency flutter
Pacinian (RA2) Subcutaneous (2.0 to 3.0 mm) Rapid Large (10 to 30 mm) 50 Hz to 400 Hz High-frequency vibration, texture
Merkel (SA1) Epidermis Base (0.2 to 0.5 mm) Slow Small (2 to 3 mm) 0.5 Hz to 10 Hz Sustained point pressure, edge detail
Ruffini (SA2) Deep Dermis (1.0 to 2.0 mm) Slow Large (10 to 25 mm) 0 Hz to 10 Hz Sustained skin stretch, lateral motion

5. Mathematical Framework for Real-Time Depth Map Downsampling and Signal Conversion

Translating high-resolution spatial point clouds into low-density haptic matrices requires downsampling depth frames while retaining critical proximity hazards. [1][2][3][4]

Spatial Grid Partitioning and Minimum Depth Pooling

An incoming raw depth frame  with resolution  (e.g.,  pixels) is mapped onto a discrete physical actuator matrix of size  (such as a  array). The image space is partitioned into contiguous spatial cells , where  and . [1][2][3][4]

Rather than using mean pooling, which can wash out narrow hazard features like poles or hanging branches, the framework uses Minimum Spatial Depth Pooling:

This operation extracts the closest surface point within each spatial region, preserving critical obstacle alerts. [1][2][3][4]

Spatial Temporal Smoothing Filter

To suppress depth sensor noise and temporal flickering, a temporal median filter is applied across a rolling 3-frame window:

This filter eliminates single-frame transient errors without adding noticeable phase delay. [1][2][3]

Inverted Exponential Depth-to-PWM Transfer Function

To provide stronger tactile feedback for closer obstacles, filtered depth values are mapped to 12-bit PCA9685 duty cycle counts () using an inverted non-linear transfer function:

Where parameters are defined as:

  (Immediate hazard threshold; maps to maximum vibration duty cycle ).

  (Outer perception boundary; maps to minimum active duty cycle ).

 γ = 1.0 (Linear mapping scaling factor, adjustable based on psychophysical preference).

6. Embedded Firmware Architecture, Register Configuration, and Concurrency

The ESP32 firmware manages hardware peripherals using low-level memory writes over I2C and concurrent execution threads.

PCA9685 Prescaler Math and Clock Configuration

The base PWM frequency () is programmed by writing a prescaler value to the PRE_SCALE register (0xFE). The prescaler value is calculated from the chip's internal  oscillator ():

To set a target haptic drive frequency of :

Writing this prescaler value requires a specific bit-manipulation sequence in the MODE1 register (0x00):

  1. Read MODE1 (0x00), set the SLEEP bit (Bit 4) to 1, and write back. This halts the internal oscillator, unlocking the PRE_SCALE register.
  2. Write 0x1E () to PRE_SCALE (0xFE).
  3. Read MODE1 (0x00), clear the SLEEP bit to 0, and write back to re-enable the oscillator.
  4. Delay  to allow the oscillator to stabilize.
  5. Read MODE1 (0x00), set the RESTART bit (Bit 7) and AUTO-INC bit (Bit 5) to 1. Auto-Increment enables multi-byte I2C streaming without re-sending register addresses for every channel.

Multi-Byte I2C Auto-Increment Streaming

With Auto-Increment enabled, the ESP32 updates all 16 channels in a single  block I2C transaction. Each channel uses four 8-bit registers: LEDn_ON_L, LEDn_ON_H, LEDn_OFF_L, and LEDn_OFF_H. Setting turn-on times to 0 phase-aligns all outputs. Duty cycle counts () are loaded directly into the turn-off registers:

FreeRTOS Dual-Core Concurrency Allocation

The ESP32 firmware splits tasks across its execution cores to guarantee deterministic timing:

Core 0 runs Communication and Protocol Tasks. It receives raw depth matrices over serial, USB, or Wi-Fi interfaces, parses binary array payloads, validates checksums, and pushes formatted frames into a shared double-buffered queue. [1][2][3][4][5]

Core 1 handles Real-Time Control and I2C Dispatch. A high-priority thread (Priority 24) pops frames from the shared queue, applies temporal filters, evaluates the depth-to-PWM transfer function, and streams 64-byte payloads over I2C at a steady 50 Hz update rate ( interval).

Register Symbol Register Memory Address Configured Bitmask Functional Purpose
MODE1 0x00 Bit 4: SLEEP, Bit 5: AI, Bit 7: RESTART Control oscillator state and auto-increment mode
MODE2 0x01 Bit 2: OUTDRV (1 = Totem Pole) Select totem-pole output structure
LED0_ON_L 0x06 0x00 (Low byte turn-on time) Channel 0 turn-on phase start
LED0_ON_H 0x07 0x00 (High byte turn-on time) Channel 0 turn-on phase start
LED0_OFF_L 0x08 D(i,j) & 0xFF Channel 0 turn-off marker (Duty cycle low byte)
LED0_OFF_H 0x09 (D(i,j) >> 8) & 0x0F Channel 0 turn-off marker (Duty cycle high byte)
PRE_SCALE 0xFE 0x1E (30 Decimal) Sets 200 Hz base PWM frequency

7. Operational Performance Metrics and Systems Engineering Synthesis

Combining hardware selection, power separation, software downsampling, and embedded control creates a complete, high-performance haptic matrix conversion system. [1][2][3][4][5][6][7]

Operational Subsystem Design Parameter Measured Metric Operational Boundary / Target
Spatial Acquisition Camera Stream  Real-time environmental tracking
Power Bridge Protocol Bridge USB-C OTG + USB PD Pass-Through Simultaneous data host & charging
Embedded Core Architecture Dual-Core Tensilica LX6 @  Real-time matrix downsampling
Bus Interface Clock Rate I2C Fast-Mode @ 400 kHz High-speed channel block writes
PWM Driver Resolution 12-Bit (4096 Steps) per Channel Fine-grained vibration adjustment
Drive Frequency Target   (Prescaler ) Matches Pacinian frequency peak
Physical Actuator Actuator Type  ERM Coin Motor Direct cutaneous vibration feedback
Driver Transistor Component Type NPN BC337 / N-Channel AO3400 Low-side motor power switching
Transient Protection Suppression 1N4001 Flyback +  Cap Voltage spike and noise filter
Power Distribution Rail Separation  Prevents MCU brownout resets
Spatial Matrix Downsampling Method Minimum Depth Pooling () Preserves critical proximity hazards
Tactile Resolution Array Spacing Arm: , Fingertip:  Prevents tactile spatial aliasing

8. Engineering Synthesis and Architectural Outlook

Developing real-time spatial depth to tactile matrix conversion systems requires balancing mechanical, electrical, firmware, and psychophysical requirements. Electrical isolation between high-current motor supplies () and digital control logic () prevents power instability, voltage brownouts, and signal corruption. Low-side switching arrays featuring flyback diodes and decoupling capacitors suppress inductive voltage spikes and electrical noise. [1][2][3][4][5][6][7]

Using USB-C OTG pass-through architectures managed by USB PD controllers enables mobile spatial engines to stream UVC data continuously while receiving charging power. Offloading PWM generation to hardware drivers like the PCA9685 over Fast-Mode I2C minimizes CPU load, allowing embedded processors to focus on downsampling point clouds and filtering spatial noise. [1][2][3][4][5][6][7]

Aligning system output parameters with human physiology, driving arrays at  to target Pacinian corpuscles and spacing actuators according to local two-point discrimination limits, ensures tactile feedback remains clear, intuitive, and comfortable. [1][2][3][4][5][6][7]

Future developments include scaling matrix densities beyond  arrays to high-resolution  wearable tactile grids. Achieving this requires higher-bandwidth communication buses like SPI or CAN-FD, alongside advanced spatial compression algorithms, to preserve real-time responsiveness for spatial awareness and non-visual navigation applications.

References as submitted

  1. https://arxiv.org/abs/2209.08258 (A real-time dynamic obstacle tracking and mapping system for UAV)
  2. https://pmc.ncbi.nlm.nih.gov/articles/PMC11861736/ (Sensor-Fusion Based Navigation for Autonomous Mobile Robot - PMC)
  3. https://arxiv.org/abs/2209.08258 (A real-time dynamic obstacle tracking and mapping system for UAV)
  4. https://www.ebay.com/itm/192366568903 (PCA9685 16-Channel 12-Bit PWM Servo Motor Driver I2C ... - eBay)
  5. https://augmentedperception.github.io/depthlab/assets/Du_DepthLab-Real-Time3DInteractionWithDepthMapsForMobileAugmentedReality_UIST2020.pdf (DepthLab: Real-time 3D Interaction with Depth Maps for Mobile)
  6. https://electronics.stackexchange.com/questions/755839/usb-c-android-otg-for-data-and-charge-at-the-same-time (USB C Android OTG for data and charge at the same time)
  7. https://www.reddit.com/r/arduino/comments/14x5f9i/help_with_pca9685_and_vibration_motors/ (Help with PCA9685 and vibration motors : r/arduino - Reddit)
  8. https://lavalink.com/lavaaccessory/charge-plus/ (USB-C OTG adapter hub with simultaneous charging and access to)
  9. https://www.adafruit.com/product/815 (Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface)
  10. https://thecustomizewindows.com/2021/08/esp32-and-coin-vibrator-motor/ (ESP32 and Coin Vibrator Motor - The Customize Windows)
  11. https://www.ebay.com/itm/192366568903 (PCA9685 16-Channel 12-Bit PWM Servo Motor Driver I2C ... - eBay)
  12. https://forum.dronebotworkshop.com/2020/using-servo-motors-with-esp32/ (Using Servo Motors with ESP32 - DroneBot Workshop Forums)
  13. https://forum.arduino.cc/t/help-with-pca9685-and-vibration-motors/1146634 (Help with PCA9685 and vibration motors - Arduino Forum)
  14. https://www.ebay.com/itm/192366568903 (PCA9685 16-Channel 12-Bit PWM Servo Motor Driver I2C ... - eBay)
  15. https://arxiv.org/abs/2209.08258 (A real-time dynamic obstacle tracking and mapping system for UAV)
  16. https://forum.arduino.cc/t/help-with-pca9685-and-vibration-motors/1146634 (Help with PCA9685 and vibration motors - Arduino Forum)
  17. https://www.ebay.com/itm/192366568903 (PCA9685 16-Channel 12-Bit PWM Servo Motor Driver I2C ... - eBay)
  18. https://www.frontiersin.org/journals/human-neuroscience/articles/10.3389/fnhum.2022.862344/full (Skin and Mechanoreceptor Contribution to Tactile Input for Perception)