Physical Response Emulation System for Secure Testing Operations is a low-cost, fully automated, and reproducible hardware analysis platform. It enables precise and repeatable testing of devices by simulating human interaction such as button presses and screen reading without compromising cryptographic security assumptions.
PRESSTO testing a hardware wallet
- Automated physical interaction via Arduino-controlled servos
- OCR-based display capture
- Test physical inputs – Consistently automate physical interaction like button presses or screen taps.
- Endurance testing – Simulate hours or days of human interaction to reveal wear or intermittent faults.
- Automated testing – Fully automate operation of devices that can’t be driven purely by software, such as IoT appliances, hardware wallets etc.
This project requires a combination of 3D-printed parts, electronics, and standard mechanical fasteners. Below is the complete list of components:
Part | Description | DIN Spec | Quantity |
---|---|---|---|
M4 Hex Nuts | Standard M4 nuts for fastening | DIN 934 | Variable |
M4 Machine Screws | M4 × 16 mm flat-head screws | DIN 965 | Variable |
M4 Wing Nuts | Tool-free tightening, used for adjustable parts | DIN 315 | Variable |
M4 Washers | Standard washers for load distribution | DIN 125A | Variable |
Most joints can be assembled using a mix of these fasteners. Quantities depend on your specific configuration (number of arms, modules, etc.).
- STL files are provided in the
stl/
directory for immediate use. - Original Autodesk Inventor (
.ipt
) files are also included in theipt/
directory, allowing for easy customization and adaptation to your specific hardware or setup needs. - Recommended print settings:
- Material: PLA or PETG
- Layer Height: 0.15 mm
- Infill: 15–30% for strength
- Supports: As needed per part
Component | Notes | Quantity |
---|---|---|
Arduino Uno (or compatible) | For controlling servos | 1 |
Raspberry Pi (any model with camera support) | For running OCR, camera capture, and automation scripts | 1 |
SG90 Micro Servos | 2 per arm (e.g., one for press, one for movement) | ≥ 2 |
Raspberry Pi Camera or USB Webcam | Used for OCR display capture | 1 |
Power Supply | Depending on servo load | 1 |
You can use a camera like the Raspberry Pi Camera Module, Arducam or any USB webcam.
Base
The base forms the main support structure of the setup. It consists of 8 interlocking 3D-printed parts that slot together like a puzzle to create a rigid square frame.
- 4 ×
base_inner.stl
- 4 ×
base_outer.stl
- Arrange the 4 outer parts to form the perimeter of the square.
- Position the 4 inner parts so they form a cross-bracing pattern.
- Slot all pieces together using the integrated puzzle joints.
- Ensure the central circular section interlocks firmly with no gaps.
- No screws or adhesives are required — the snap-fit design holds everything in place.
Description | Image |
---|---|
Individual STL preview – base_inner and base_outer |
![]() ![]() |
Printed individual pieces laid out | ![]() ![]() |
Fully assembled base |
Holder (Device Clamp)
The holder secures the device in place using a simple mechanical clamp. It is fastened through the radial slots on the base and tightened manually using M4 hardware.
- 1 ×
holder.stl
- 1 × M4 × 16 mm screw (DIN 965)
- 1 × M4 washer (DIN 125A)
- 1 × M4 wing nut (DIN 315)
- Insert the M4 screw from below through one of the radial slots in the base.
- Place the 3D-printed holder part onto the protruding screw (on top of the base).
- Add a washer on top of the holder.
- Thread a wing nut onto the screw and hand-tighten it.
- Adjust the position of the holder as needed so it presses against the edge of your device.
- Tighten the wing nut to lock the holder in place.
Description | Image |
---|---|
STL preview of holder |
![]() |
Hardware + printed holder | ![]() |
Mounted holders | ![]() |
Holders with a device | ![]() |
Camera Arm
The camera arm consists of three main components:
- Arm Base – fits into the outer slots of the main base, no fasteners required.
- Ball Joints – form the adjustable arm; hollow and designed with side hooks for cable management or threading smaller cables inside.
- Camera Holder – attaches to the last ball joint to securely hold the camera.
- 1 ×
arm_base.stl
- Multiple ×
ball_joint.stl
(depending on desired arm length) - 1 ×
camera_holder.stl
- Insert the arm base into one of the outer slots of the main base.
- Connect ball joints together until you reach the desired arm length.
- Ball joints can be rotated to adjust the arm angle.
- Use the built-in hooks or hollow core for cable routing.
- Attach the camera holder to the last ball joint.
- Mount the camera into the holder.
- Adjust the arm’s position and angles as needed for optimal camera view.
Description | Image |
---|---|
Arm base (STL preview) | ![]() |
Ball joint (STL preview) | ![]() |
Camera holder (STL preview) | ![]() |
Printed camera arm components | ![]() |
Fully assembled camera arm | ![]() |
Actuator Arm – Pinion Gear
The pinion gear connects directly to the SG90 servo’s output shaft. It is used to transfer rotational motion from the servo to other moving parts in the actuator assembly.
- 1 ×
pinion_gear.stl
- 1 × SG90 servo motor
- 1 × Servo mounting screw (comes with SG90)
- Place the printed pinion gear onto the output shaft of the SG90 servo.
- Align the gear so that it sits flush against the servo horn mount.
- Secure the gear using the small screw provided with the SG90 servo.
Description | Image |
---|---|
STL preview – pinion_gear |
![]() |
Printed gear + SG90 servo | ![]() |
Actuator Arm Base
The Actuator Arm Base moves the actuator over the device and retracts it to give the camera an unobstructed view.
- 1 ×
pinion_gear.stl
— attached to the SG90 servo output shaft - 1 × SG90 micro servo (with 2 × mounting screws supplied with the servo)
- 1 ×
actuator_arm_motor_holder.stl
— to secure the servo - 1 ×
actuator_arm_base_rack.stl
— for linear motion - 1 ×
actuator_arm_base_stand.stl
— to mount the assembly to the base - 2 × M4 × 16 mm machine screws (DIN 965)
- 2 × M4 washers (DIN 125A)
- 2 × M4 wing nuts (DIN 315) — to attach motor holder to the stand
- 1 × M4 × 16 mm machine screw (DIN 965)
- 1 × M4 washer (DIN 125A)
- 1 × M4 wing nut (DIN 315) — to mount the stand to the base
- The SG90 servo is fixed into the motor holder using the two screws supplied with the SG90.
- The stand mounts to the outer base slot in the same way as the device holder — using an M4 screw, washer, and wing nut from below.
- The motor holder attaches to the stand at the desired height using two M4 screws, washers, and wing nuts.
- If space is tight (for example, with multiple arms close together), a regular M4 machine screw with a hex nut (DIN 934) may be used instead of the wing nut on one side.
- For easier assembly, insert at least the inside M4 screw into the motor holder before inserting the rack — otherwise, it will be blocked.
Recommended assembly sequence
- Insert the inside M4 screw into the motor holder.
- Slide in the rack.
- Attach the SG90 servo with the pinion gear already mounted, using its supplied screws.
- Insert the remaining M4 screw.
- Attach the motor holder to the stand with the two M4 screws, washers, and wing nuts.
- Mount the stand to the base.
Actuator Arm
The actuator arm is the moving element that pushes buttons or touches a screen.
It connects directly to the actuator_arm_base_rack.stl
and is driven by an SG90 servo with the pinion_gear.stl
attached.
- 1 ×
pinion_gear.stl
— attached to the SG90 servo output shaft - 1 × SG90 micro servo (with 2 × mounting screws supplied with the servo)
- 1 ×
actuator_arm_motor_holder_mount.stl
— bracket to secure the servo - 1 ×
actuator_arm_rack.stl
oractuator_arm_rack_wide.stl
— for linear motion - 1 ×
actuator_arm_motor_holder.stl
— attaches to the rack and connects to the base - 2 × M4 × 16 mm machine screws (DIN 965)
- 2 × M4 washers (DIN 125A)
- 2 × M4 hex nuts (DIN 934) — to attach the motor holder to the mount
- Optional: counterweight bracket (BOM screws, washers, nuts)
- Optional: stylus tip for touchscreens
- Attach the bracket (
actuator_arm_motor_holder_mount.stl
) to the motor holder using 2 × M4 machine screws with washers and hex nuts. - Insert the rack (
actuator_arm_rack.stl
oractuator_arm_rack_wide.stl
) into the motor holder. - Install the SG90 servo: attach the
pinion_gear.stl
to the servo output shaft, align with the rack teeth, and fasten the servo using the 2 screws supplied with the SG90. - Optional – add a counterweight bracket on the opposite side of the base rack to balance longer racks.
No screws are needed for this step – simply slide the actuator_arm_base_rack.stl
into the actuator_arm_motor_holder.stl
mount hole until it seats fully.
Step | Image |
---|---|
Align the base rack with the actuator arm mount hole | ![]() |
Slide until seated fully |