Modding the Bambu Lab X1C: Adding Ethernet for a 'Poor Man’s X1E'

updated 7 min read #3d printing #hardware #networking

The Bambu Lab X1C is one of the most capable prosumer 3D printers. Its enterprise sibling, the X1E, adds wired Ethernet and a hotter nozzle, but costs a lot more. This post shows how I brought my X1C part of the way there: a USB Ethernet adapter on the internal USB bus, and a resistor that lets the nozzle reach 340–350 °C. It is for X1C owners who are comfortable with opening the printer, custom firmware and a soldering iron.

The software: X1Plus#

The stock firmware is closed and doesn’t let you add peripherals. This mod therefore uses X1Plus, a custom firmware for the X1 series.

X1Plus includes a patch for CDC-ECM (Ethernet Control Model). With it, the printer’s operating system recognises standard USB Ethernet chipsets. Without this kernel-level change, the printer ignores the adapter on its internal USB bus.

The idea of putting a USB hub into the camera connection came from a community discussion in the X1Plus GitHub repository about USB Ethernet on the X1C.

Hardware and power#

Power is the main constraint. The internal USB header on the X1C mainboard is meant to power the built-in camera, and overloading it could damage the board or make the printer unstable.

I took a 3 € USB-to-Ethernet adapter out of its housing. It uses the CH9151 from WCH, a 10/100 Mbit/s controller. There is little documentation for this chip, but its power draw suits this use:

  • Idle (no link): about 72 mA
  • Full load: at most 94 mA

Staying under 100 mA leaves a safe margin for the printer’s existing circuitry.

Adding a USB hub#

The X1C has no spare internal USB port: the chamber camera uses the only one. A USB 2.0 hub based on the FE1.1s hub IC splits that connection.

I used JST 1.25 mm micro connectors for all wiring, so the installation stays clean and reversible. Once the harness is made, the parts simply plug in.

Checking the result#

With the hardware installed and X1Plus running, the printer recognises all the new parts.

lsusb shows the new bus. Both the new Ethernet adapter (1a86:e396) and the original camera (0c45:6366) now sit behind the FE1.1s hub (1a40:0101):

[root@BL-P001-sdcard:~]# lsusb
Bus 001 Device 001: ID 1d6b:0002 # Linux Host Controller
Bus 001 Device 002: ID 1a40:0101 # FE1.1s USB 2.0 Hub
Bus 002 Device 001: ID 1d6b:0001
Bus 001 Device 003: ID 1a86:e396 # CH9151 Ethernet Adapter
Bus 001 Device 005: ID 0c45:6366 # Original PC Camera

In the kernel log (dmesg), the cdc_ether driver registers the device as eth0, so the CDC-ECM patch works:

[    1.523349] usb 1-1.4: New USB device found, idVendor=1a86, idProduct=e396, bcdDevice= 7.3a
[    1.523418] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    1.523447] usb 1-1.4: Product: USB 10/100 LAN
[    1.523468] usb 1-1.4: Manufacturer: wch.cn
[    1.530685] cdc_ether 1-1.4:2.0 eth0: register 'cdc_ether' at usb-ffe00000.usb-1.4, CDC Ethernet Device

Wi-Fi (wlan0) and the new Ethernet interface (eth0) run in parallel. In my network, eth0 got its address via DHCP:

[root@BL-P001-sdcard:~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr C8:17:F5:XX:XX:XX  
          inet addr:192.168.2.240  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:59106 errors:950 dropped:15052 overruns:0 frame:0
          TX packets:27828 errors:0 dropped:0 overruns:0 carrier:0

More Heat: The 33 Ω Thermistor Mod#

The X1C limits the nozzle to 300 °C; the X1E goes to 320 °C (comparison). Materials like PPS-CF want more. Instead of patching the firmware’s limit, I made the firmware misjudge the temperature: a 33 Ω resistor in series with the hotend thermistor. Set to 300 °C, my nozzle now reaches 340–350 °C, measured with a temperature probe on the nozzle.

Why a resistor makes the nozzle hotter#

The hotend temperature is measured with an NTC thermistor: its resistance falls steeply as it gets hotter. The printer measures that resistance and converts it into a temperature with a fixed curve (the β equation or Steinhart–Hart; see Vishay’s application note). It keeps heating until the measured resistance has dropped to the value that belongs to the setpoint.

With 33 Ω in series, the printer always measures the thermistor plus 33 Ω. To reach the resistance it expects for 300 °C, the thermistor alone has to drop 33 Ω further, and it only does that at a higher temperature:

Chart: thermistor resistance against real temperature, with and without 33 ohms in series. The firmware's 300 °C resistance is reached at 300 °C without and at about 345 °C with the resistor.
The firmware stops heating at the resistance it expects for 300 °C. With the extra 33 Ω, the thermistor reaches that value only at about 345 °C.

At low temperatures the thermistor has kilo-ohms, and 33 Ω hardly matters. Near 300 °C it is down to well under 100 Ω, so the same 33 Ω shift a lot of degrees. The offset therefore grows with temperature instead of being a constant:

Chart: temperature shown by the printer against real nozzle temperature. With the resistor the real temperature is about 4 K higher at 200 °C, 15 K at 250 °C, 29 K at 280 °C and 45 K at 300 °C.
Shown vs. real temperature. Model curve, fitted to my measurement at 300 °C.

Bambu Lab does not publish the thermistor’s curve. The model behind both charts is a 100 kΩ NTC with β = 4461 K, a value I fitted so that 33 Ω turn 300 °C into the 345 °C I measured. The shape follows from the physics; the exact numbers below 300 °C are an estimate.

Installation#

I cut one of the two thermistor wires in the cable that runs from the hotend into the toolhead board and soldered the 33 Ω resistor in between, insulated with heat-shrink tubing. The thermistor has no polarity, so either wire works. To undo the mod, replace the resistor with a plain solder joint, or swap in a new thermistor.

The firmware doesn’t notice#

The printer has no second sensor to compare against: from its point of view nothing changed. The display, Bambu Studio and the MQTT data all report 300 °C while the nozzle is at 340–350 °C. That also means:

  • Every temperature is shifted, not just the top end. A PETG profile at 250 °C actually prints at about 265 °C. Lower your profiles accordingly, or remove the resistor for everyday materials.
  • The safety functions work on the wrong temperature. Whatever the firmware checks, it checks against the shifted reading, and the 300 °C limit no longer protects anything: the parts now run 40–50 K above it.
  • The hotend runs outside its specification. The X1C hotend is specified for 300 °C, and thermistor, heater and nozzle are not meant for more. Use a hardened steel nozzle for CF materials and keep an eye on the hotend.

Monitoring the real temperature in Home Assistant#

Because the printer can’t show the real temperature, I added a template sensor to Home Assistant that does the same calculation backwards: it takes the temperature the printer reports, converts it back to a resistance, subtracts the 33 Ω and converts the result into the real temperature. The source entity comes from the Bambu Lab integration; use your printer’s nozzle temperature entity:

template:
  - sensor:
      - name: "X1C nozzle real temperature"
        unique_id: x1c_nozzle_real_temperature
        unit_of_measurement: "°C"
        device_class: temperature
        state_class: measurement
        availability: "{{ has_value('sensor.x1c_nozzle_temperature') }}"
        state: >
          {% set t = states('sensor.x1c_nozzle_temperature') | float %}
          {% set b = 4461 %}{% set r25 = 100000 %}{% set rs = 33 %}
          {% set r = r25 * e ** (b * (1 / (t + 273.15) - 1 / 298.15)) - rs %}
          {{ (1 / (1 / 298.15 + log(r / r25) / b) - 273.15) | round(1) if r > 0 else none }}

With b fitted to your own measurement, the sensor shows 345 °C while the printer shows 300 °C, and the difference shrinks towards room temperature.

Other X1C owners discuss the same idea in this Reddit thread (community experience, not a reference for the numbers).

Conclusion#

A 3 € USB adapter, a USB hub and a 33 Ω resistor bring the X1C a good part of the way towards an X1E: a wired, more reliable network connection, and nozzle temperatures above the X1E’s 320 °C. The Ethernet mod is clean and reversible. The resistor mod is reversible too, but it trades the printer’s own temperature limit for your own monitoring, so only use it when you need the heat.

Sources#

cd ~/projects