Application Engineer
Have a Question?

Contact us for device selection, troubleshooting & more!

Response time promise: 1 business day

Application Engineer
Have a Question?

Tactile Surface Mapping: Integrating Load Cells with Zaber Motion

By Xi Wen Goh, Mechanical Engineering Team

Published on Aug. 10, 2026

A stylus mapping the height of a wavy surface through tactile feedback from a load cell

Figure 1. Tactile feedback surface mapping through Load Cells with Zaber Motion.


Introduction

When building a tactile surface mapping system, the mechanical setup is only the first step. The primary technical hurdle is closing the force-feedback loop to prevent the probe from losing contact on declines or applying excessive force on inclines. If you have already selected your load cell, this guide shows you how to seamlessly integrate it with Zaber motion control.

By wiring your load cell amplifier directly into a Zaber X-MCC controller, you can leverage its native 10 kHz PID loop for autonomous dynamic force tracking. This eliminates the latency of PC-Controller serial communication, simplifies your software architecture, and removes the need for external DAQ hardware.

Here is what we will cover:

  • Hardware integration: Selecting the right stages and wiring your load cell directly to the Zaber X-MCC controller.
  • Software architecture: Using the Zaber Python API and native ASCII commands to automate touch, scan, and track routines.
  • Data acquisition & safety: Setting up onboard hardware triggers for overload protection and using the built-in oscilloscope for high-frequency data logging.
Note on Demonstration Hardware: The specific stage travel lengths (450 mm and 150 mm) and the Loadstar load cell used in this guide were chosen specifically to accommodate our wavy-surface demonstration rig. However, the principles, wiring, and code provided will work with any standard analog load cell (e.g., 0-10V) and any Zaber peripheral stages sized for your specific application.

Addressing Core Integration Challenges

Mapping unknown or variable surfaces requires tight synchronization between sensor data and motion control. A standard PC-based control loop often introduces communication latency that degrades tracking performance.

By integrating an XZ gantry system directly with a Zaber X-MCC controller, you can shift the feedback processing from your PC to the controller hardware. This single-ecosystem architecture directly addresses the three core requirements of tactile surface mapping:

  • Dynamic Force Tracking: Maintaining consistent contact force across variable topography requires rapid Z-axis adjustments. The X-MCC uses a native 10 kHz PID loop to instantaneously analyze load cell inputs. Using built-in ASCII commands (move track and move scan track once), the controller autonomously coordinates the Z-axis height, bypassing PC communication delays.
  • Synchronized Data Acquisition: Capturing reliable surface profiles requires high frequency without loss of data. The X-MCC includes an integrated oscilloscope feature that logs analog input signals alongside encoder coordinates. This allows you to capture comprehensive surface profiles directly on the controller without integrating a separate external DAQ.
  • Hardware-Level Overload Protection: Protecting sensitive equipment and samples from excessive force is critical in automated processes. Autonomous safety thresholds are enforced through the controller's trigger capabilities. By monitoring analog input channels, the system can automatically disable motor drives if force measurements cross specified limits, protecting both the load cell and the target specimen from damage.

Hardware Configuration & Integration

To execute this setup, you need an external controller capable of reading analog inputs paired with standard peripheral stages.

Motion System Components

Zaber Motion component callout for force control

Figure 2. Zaber Motion System components for tactile force feedback.


  • Controller: Zaber X-MCC2 (2-Axis External Controller)
  • X-Axis: Zaber LSQ450A-E01T3A
  • Z-Axis: Zaber LSQ150B-E01T3A
Pro-Tip: Match your mechanics to your tracking speeds. Force tracking relies on the mechanical responsiveness of your Z-axis. The X-MCC evaluates force at 10 kHz, but if your X-axis translation speed outpaces the Z-axis's ability to physically move, the probe will either float off a decline (dropping data) or crash into an incline (triggering a fault). Standard stepper lead-screw stages can handle tracking speeds up to 10 mm/s. If you are mapping steep gradients or need faster production cycle times, upgrading to a direct-drive linear motor stage (capable of tracking up to 30 mm/s) ensures the mechanics can keep up with the controller's PID loop.

Sensor Components

Force Sensor component callout for force control

Figure 3. Sensor components for tactile force feedback.


  • Load Cell: Loadstar RAPG 2kg Single-Point (4-wire)
  • Amplifier: Loadstar AI-1000
  • Mounting: Zaber Angle Bracket (AB104), custom stylus, and optical breadboard
Pro-Tip: Maximize your digital resolution. The analog input on Zaber's controller reads voltages up to 10 V with a 1 mV resolution. To optimize measurement capacity, select and calibrate the amplifier to deliver an output signal close to 10 V under full load. By scaling maximum expected force across the full 10V range, the controller's effective digital resolution is maximized, and the signal-to-noise ratio is improved. This feeds the 10 kHz PID loop more accurate data, allowing the system to react to microscopic surface variations. Practically, this translates to a significantly smoother tracking profile and eliminates noise as the probe traverses the part.

(Note: If your application requires stages with built-in controllers due to space constraints, Zaber can provide custom hardware modifications to route analog I/O ports directly into the stage housing. Contact us for layout options.)

Electrical Assembly Instructions

Wiring Zaber Motion and force sensor components for tactile force feedback

Figure 4. Wiring diagram to integrate force sensor with Zaber Motion system.


The wiring diagram above illustrates how you would connect a standard 4-wire load cell to a signal amplifier, and finally to the Zaber controller. Routing the sensor data directly into the controller—rather than back to a PC-based DAQ—is necessary to take advantage of our integration features including low-latency controller feedback loop, synchronized data logging and hardware triggers used in the software setup.

Pro-Tip: Hardware-level noise filtering. If you encounter signal instability during axis motion (common with lower-capacity load cells), bridge a 47nF capacitor across the X-MCC Analog Input and GND pins to clean the signal. To verify your connection, open the Oscilloscope tool in Zaber Launcher, plot the analog I/O pin, and apply some force to the cell to confirm the output graph moves.

Mapping Procedure & Code Logic

The mapping sequence is executed through a Python script, but the heavy lifting—like the trigger logic and PID tracking—happens natively on the controller. The procedure is structured into four distinct phases:

  1. Initial Approach
  2. Contact Scanning
  3. Height Tracking
  4. Retraction

The following code snippets are designed to guide you through the key commands and highlight the core logic. Visit the Zaber Community Code Examples for the complete, runnable script.

A diagram describing outlining each stage of the surface mapping procedure

Figure 5. Overview of each phase of the surface mapping procedure.


Initialization & Setup

Oscilloscope Initialization

The Oscilloscope feature is Zaber's built-in data logging tool. It can help to record values and settings at a high data rate. To begin, the scope is first initialized and set to record the encoder position of both the force axis and the translation axis.

A more detailed guide on using the Oscilloscope can be found in our motion library guide.

scope = force_axis.device.oscilloscope
scope.add_channel(force_axis.axis_number, "encoder.pos")
scope.add_channel(trans_axis.axis_number, "encoder.pos")

Trigger Initialization

Next, we set up a hardware trigger. The logic lives entirely on the controller, eliminating serial communication latency. If the analog reading exceeds the load cell's rated force, the trigger fires and instantly disables both axis drivers.

A more detailed guide on using Triggers can be found in our motion library guide.

overload_trigger = force_axis.device.triggers.get_trigger(trigger_number=2)
overload_trigger.fire_when_io(
    IoPortType.ANALOG_INPUT,
    settings.loadcell.mcc_analog_in,
    TriggerCondition.GT,
    settings.loadcell.to_voltage(settings.loadcell.lc_max_force_n),
)
overload_trigger.on_fire(TriggerAction.A, force_axis.axis_number, "driver disable")
overload_trigger.on_fire(TriggerAction.B, trans_axis.axis_number, "driver disable")
overload_trigger.enable()

Phase 1: Initial Approach

The probe is moved from its safe retracted height to a starting position directly above the sample target.

force_axis.move_absolute(settings.safe_z, "mm", velocity=25, velocity_unit="mm/s")
trans_axis.move_absolute(settings.start_trans_pos, "mm")

Phase 2: Contact Scanning

In the next phase, the probe starts moving downwards and uses the reading from the load cell to detect when it touches the surface.

To achieve this, the move scan track once ASCII command moves an axis to scan for an in-tolerance analog input signal and tracks the signal until it settles. In our Python API, the execution of the move scan track once command uses the generic_command() function to send and run this ASCII command on the controller.

The parameters of the move scan track once function can be set through the motion.tracking firmware settings. The documentation for the move scan track once function can be found in our ASCII Protocol Manual.

force_axis.move_absolute(settings.start_touch_height, "mm", velocity=25, velocity_unit="mm/s")
# Apply conservative PID tuning for initial gentle touch
set_pid(force_axis, settings.touch_ki, settings.touch_kp)
force_axis.generic_command("move scan track once")
force_axis.wait_until_idle()

Phase 3: Height Tracking

Once we touch the surface, we then use the reading of the load cell to actively adjust the height of the probe to follow the changing height during the traverse.

The move track command behaves similarly to the move scan track once except, instead of ending when the signal settles, it will indefinitely track until another command is sent.

The parameters of the move track function can be set through the motion.tracking firmware settings. The documentation for the move scan track once function can be found in our ASCII Protocol Manual.

We start the Oscilloscope, sweep the translation axis across the sample, and stop the scope once the traverse is complete.

# Apply responsive PID tuning for active surface tracking
set_pid(force_axis, settings.track_ki, settings.track_kp)
force_axis.generic_command("move track")
scope.start()
trans_axis.move_absolute(
    settings.end_trans_pos,
    "mm",
    velocity=settings.trans_maxspeed,
    velocity_unit="mm/s"
)
trans_axis.wait_until_idle()
scope.stop()

Phase 4: Retraction

When the translation axis reaches the end of its stroke, the probe retracts to a safe height. The safety trigger is disabled, and the raw Oscilloscope data is pulled from the controller for processing.

force_axis.move_absolute(settings.safe_z, "mm")
overload_trigger.disable()
raw_data = scope.read()

Results

To visualize the measured surface profile, Python and matplotlib are used to plot the data retrieved from the Zaber Oscilloscope. The resulting graph displays the translation axis encoder position on the x-axis against the force axis encoder position on the y-axis. This plot effectively captures the load cell's force-controlled path by illustrating the complete trajectory of the probe during the height tracking phase of the mapping procedure.

Figure 6. Complete surface mapping procedure and its resultant data.


Conclusion

Integrating a load cell directly with a Zaber X-MCC controller transforms complex mapping tasks into a streamlined, hardware-integrated process. By leveraging the controller's native 10 kHz PID control loop for dynamic tracking, the built-in Oscilloscope for high-frequency data acquisition, and programmable triggers for hardware safety, this approach eliminates the latency and wiring complexity often associated with external control systems.

This solution demonstrates that you can achieve stable, high-precision surface profiling with a simplified software architecture. Zaber's ecosystem provides a flexible foundation that minimizes setup time and ensures process repeatability.

Need assistance with your integration? Contact our Applications Engineers to discuss your specific surface mapping requirements and let us help you configure the right hardware and software for your system.