Skip to main content
F3D
Đầu dò cảm biến lực tự chế giá $10 cho Ender 3 11 / 7

7 images

Máy In 3D

Đầu dò cảm biến lực tự chế giá $10 cho Ender 3

By Brokentooth_designs

Downloads
141
Likes
17
Views
380

Files 4 534.8 KB

  • Main_body_1785764913.stepSTEP · 211.5 KB
  • Hotend_Mount_1785764914.stepSTEP · 101.3 KB
  • Fan_Shroud_for_5015_1785764915.stepSTEP · 172.1 KB
  • RP2040_Mount_1785764916.stepSTEP · 49.9 KB

Make a variant with AI

Build another version of this model.

Open Studio

Description

This project uses a Creality K2 strain gauge, an HX711 amplifier, and an RP2040-Zero to detect when the nozzle touches the print bed. Unlike a BLTouch or other external probes, the nozzle itself is used for probing, so there are no probe offsets to account for. This results in PERFECT first layers every time!

The project includes the printable parts, firmware changes, wiring information, and electronics needed to build your own low-cost load cell probe for an Ender 3. It's intended for anyone who wants to experiment with nozzle-based bed probing or build an alternative to conventional bed leveling sensors.

Minimal BOM (just to try it out)

  • Creality K2 Plus Strain Gauge 

  • HX711 Load Cell Amplifier (in 80Hz mode)

  • RP2040 (Other 3.3v MCU will work)

  • 3x M3 heatset inserts

  • 2xM3x8

  • 4xM3x12

  • 2xM3x16

  • 4xM3x6

  • 2xBrass Standoff >6mm

  • Screws for M3 standoff

  • 2x M4x25 (for 4020 fan

Total cost $10-$15

Before You Start

Please note the following:

  • This guide covers only the minimum required to get the probe working.

  • All of my files are included, but since printer setups vary considerably. Rather than supporting every configuration, I've provided the STEP files so you can remix them to suit your printer.

  • Your printer firmware MUST be modified for this project to work.

  • You MUST check the voltage your motherboard is expecting. My Creality 4.2.7 wants max 3.3v on the PB1 pin so a 3.3v microcontroller is what I will use. 

  • This is a prototype. Long-term durability and reliability have not been fully tested, so use it at your own discretion.

Assembly

  1. Print all required parts.

    • I printed the structural components in PLA due to its high stiffness. 4 parimeters/top and bottom layers and 50% infill.

    • The fan shroud was printed in PETG for improved heat resistance.

      1.5 Assembly like pictures show.

  1. Wire everything like this.

Firmware Configuration (Marlin)

Ive programmed the RP2040 to output a HIGH signal when bed contact is detected. This will mimic the logic the motherboard is expecting. Endstop pins are pulled up, but switches are NC (normally closed to GND). So the nominal voltage at idle state is GND and when endstop is triggerd (ie opened) it will rise to 3.3v thanks to pullups!

Modify your Marlin configuration as follows:

(REQUIRED)

//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN 

#define USE_PROBE_FOR_Z_HOMING

#define Z_MIN_PROBE_PIN PB1

#define NOZZLE_AS_PROBE

(OPTIONAL)

#define Z_AFTER_PROBING 5 // (mm) Z position after probing is done

#define INDIVIDUAL_AXIS_HOMING_MENU

#define INDIVIDUAL_AXIS_HOMING_SUBMENU

RP2040 Firmware

// ENDER 3 LOADCELL HOTEND NOZZLE PROBE V1
// 2026-07-19

#include "HX711.h"
#include <Adafruit_NeoPixel.h>

#define OUTPUT_PIN 12

#define HX_DOUT 10
#define HX_SCK 11

#define LED_PIN 16
#define NUMPIXELS 1

HX711 scale;
Adafruit_NeoPixel pixel(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

long zeroOffset = 0;
const long triggerDelta = 20000; // TO BE CALIBRATED
const long hysteresis = 2000; // TO BE CALIBRATED
bool triggered = false;

void setup() {

// CONFIGURE HARDWARE
pinMode(OUTPUT_PIN, OUTPUT);
digitalWrite(OUTPUT_PIN, LOW);

// CONFIGURE LED
pixel.begin();
pixel.setBrightness(50); // Adjust brightness (0-255)
pixel.show();

// SET LED TO RED
setLEDtoColor(255, 0, 0);

// ALLOW USB SERIAL TO CATCH UP
delay(3000);

// START SERIAL
Serial.begin(9600);
Serial.println("");
Serial.println("ENDER_3 NOZZLE LOADCELL v1");
Serial.println("");

// START SCALE
scale.begin(HX_DOUT, HX_SCK);

// Wait until HX711 is connected
while (!scale.is_ready()) {
Serial.println("Waiting for HX711...");
delay(500);
}

// SET LED TO ORANGE
setLEDtoColor(255, 100, 0);
Serial.println("HX711 Connected");

// Give ADC time to settle
delay(1000);

// Take zero reading over 2s (at 80HZ)
zeroOffset = scale.read_average(2 * 80);

Serial.print("Zero Offset = ");
Serial.println(zeroOffset);

delay(1000);
Serial.println("Probe Ready");
// SET LED TO GREEN
setLEDtoColor(0, 255, 0);
delay(1000);
setLEDtoColor(0, 0, 0);
}

void loop() {
delay(1); //Reduce CPU Usage

if (!scale.is_ready()) {
return;
}

// Read current ADC value
long reading = scale.read_average(4);

// Calculate load
long load = reading - zeroOffset;

if (!triggered && abs(load) > triggerDelta + hysteresis) {
triggered = true;
pinMode(OUTPUT_PIN, INPUT); // Sets the pin to high-impedance state. Let Motherboard pullup do work!
Serial.println("CONTACT DETECTED");
setLEDtoColor(0, 0, 255);
} else if (triggered && abs(load) < triggerDelta - hysteresis) {
triggered = false;
pinMode(OUTPUT_PIN, OUTPUT); // Set pin to GND
digitalWrite(OUTPUT_PIN, LOW);
Serial.println("CONTACT REMOVED");
setLEDtoColor(0, 0, 0);
}

/*
// CALIBRATION
static unsigned long lastPrint = 0;

if (millis() - lastPrint >= 100) {
Serial.println(load);
lastPrint = millis();
}
*/
}

void setLEDtoColor(uint8_t r, uint8_t g, uint8_t b) {
pixel.setPixelColor(0, pixel.Color(r, g, b));
pixel.show();
}

Notes

The detection theadshold and hysteresis is intended as a starting point and may need adjustment depending on your specific strain gauge, mounting method, and printer.

This project is experimental, and feedback or remixes are always welcome. If you build one, I'd love to hear how it performs on your printer.

Read more Show less

Print spec

Formats
step
Model files
4
Total size
534.8 KB
Largest file
211.5 KB

0 comments

See all