Skip to the content
2 layers127 × 76.2 mmBall heater controller, the printed circuit board in 3D

Ball heater controller

jazzlw/ball_heater_controller

This repo contains the schematics and associated code for a controller to control the temperature of a ball holder or other device using closed loop PID drive of a resistive heater.

Size
127 × 76.2 mm
Copper layers
2
Thickness
1.6 mm
Parts
43
Nets
36
Pads
140
Tracks, vias
212, 35
Pours
4
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
3 Aug 2025
Updated
24 Jun 2025

Overview

Ball heater controller is an open-source printed circuit board by jazzlw, from the jazzlw/ball_heater_controller repository on GitHub. It is a 2-layer board of 127 × 76.2 mm with 43 parts on 36 nets, routed with 212 tracks and 35 vias.

It is built around the ARDUINO UNO R3, F0512S-1WR3 and B3B-PH-SM4-TB(LF)(SN), with the BSS138DW-7-F-ES, CL-SB-12A-01T and M8S-04PFFR-SF8001 among its other parts. Its parts include 12 capacitors, 6 resistors, 6 connectors, 2 transistors and 2 switches. It belongs with the AVR (ATmega, ATtiny) boards of this library.

Main components

8

README

README.md

Ball Heater Controller

This repo contains the schematics and associated code for a controller to control the temperature of a ball holder or other device using closed loop PID drive of a resistive heater. There is a Python class to interact with the controller over USB-Serial, as well as a ROS2 Node to send and receive commands with the controller using ROS2.

For instructions on building a Ball Heater Controller, see Assembly.

Basic Usage

The Ball Heater Controller can be used independently of a computer by simply supplying it with AC power and attaching a ball heater and thermistor assembly to the main 4 pin output port on the front.

You can then change the mode by pressing and holding the control knob (see Modes), and set the temperature setpoint (shown lower left as SP: on the LCD) by turning the knob. Current temperature is shown bottom right on the LCD.

Python

The device can also be used with a computer for greater control and temperature logging. Interaction is done over USB-Serial, and the computer side is managed through the BallHeaterDriver Python class found in ball_heater_driver.py. An example of how this class can be used can be found in the Jupyter Notebook ball_heater_controller_testing.ipynb

In short, after creating a BallHeaterDriver object, providing the correct serial port, commands can be sent using the send_command method. The main commands you will use are status, set_target_temp, and set_control_mode. Valid syntax for creating an object and sending these commands is shown below, with the first valid serial port chosen by default.

python
import ball_heater_driver 
from list_ports import list_ports
import time

ports = [
    port
    for port in list_ports()
    if port["manufacturer"] is not None and "Silicon Labs" in port["manufacturer"]
]
port = ports[0]["port"]
print(f"Using Port: {port}")
ball_heater = ball_heater_driver.BallHeaterDriver(port=port)

# wait for the device to reset
time.sleep(5)

# Get and print status
success, status = ball_heater.send_command('status', [])
print('current status is:')
print('\n'.join((f"{key} : {value}") for key, value in status.items()))


# Set the target temperature to 35 (will also set control mode to remote)
ball_heater.send_command("set_target_temp", [35])

ROS2

There is also a ROS2 Node provided for interacting with the Ball Heater Controller, ball_heater_node.py. The launch file example_ball_heater.launch.py, along with the config file example_config.yaml will launch the node, as well as an example client node that can interact with the ball_heater_node. It will also launch the ball_heater_gui that will subscribe to and print the heater status, and let the user set the temperature setpoint. Once installed, set the serial_port or device_serial_number in example_config.yaml and launch the launch file using

bash
ros2 launch ball_heater_controller example_ball_heater.launch.py 

Generally, the BallHeaterNode must be given a serial_port or a device_serial_number to specify the controller. Then, the status information will be published to the ball_heater_status_topic (default ball_heater_controller/status_topic), and the temperature can be set by another node by publishing to the ball_heater_set_temp_topic (default ball_heater_controller/set_temp_topic)

Sub-directories

  • ball_heater_controller -- ROS2 Package with a Node to interact with and control the heater, as well as ball_heater_driver.py which contains a Python class BallHeaterDriver to interact with the controller.
  • ball_heater_controller_interfaces -- ROS2 Package with custom message types associated with the above package.
  • ball_heater_controller_firmware -- Firmware for the microcontroller at the center of the PCB.
  • ball_heater_controller_pcb -- Design files and gerbers for the printed circuit board for the Ball Heater Controller.
  • ball_heater_controller_case -- Vector files for laser cuttting the case for the Ball Heater Controller.
  • docs -- Additional documentation.

Controller Modes

The controller has several different modes, shown upper left on the LCD display, and its behavior will be different depending on what mode it is in. The mode can be changed using the set_control_mode command through the interface, or by pressing and holding the control knob on the front of the device for >= 1 second.

  • Standby On startup, the controller will be in standby mode, and the heater will not be driven, but the temperature will be shown on screen.
  • Local Control Pressing the control from standby mode will switch into local control mode, and the temperature setpoint can then be adjusted by turning the control knob. This mode is useful for running the ball heater without a computer attached, or without needing to set the temp from the computer.
  • Remote Control In this mode, the setpoint temperature is set from the computer using the set_target_temp command. Any set_target_temp commands received by the controller will automatically switch the controller into this mode.
  • Error Mode There are also several error modes discussed below in Safety Cutoffs

Install

Run the installation script

bash
./install_dependencies.sh

Safety Cutoffs / Troubleshooting

The ball heater firmware has several different safety cutoffs built in that will trigger different errors and shut down the heater to prevent overheating. Once one of these error modes has been activated, the heater output will shut down, and the type of error will be displayed on the LCD. Pressing and holding the control knob down will reset the device into standby mode if the error state has been resolved.

  1. High temp error: If the heater temperature sensor reads over 60 °C, the device will go into High temp error and shutdown.
  2. No Temp Sensor: If the temperature sensor for the ball heater is not detected because it has been unpluged or a wire has broken, the device will go into No Temp Sensor Error and shutdown. When the sensor is replaced, the device will return to standby mode. Note that this is only for the integrated temp sensor in the ball heater, not the optional aux temp sensor.
  3. Heater Non Responsive: If the control loop drives the heater at a high power for too long, eg if the temperature is not responding properly, the device will go into Heater Non Responsive error and shutdown.

Parts

43
QtyValueFootprintReferences
4MountingHoleMountingHole:MountingHole_3.7mmH1, H2, H3, H4
4TestPointTestPoint:TestPoint_Loop_D2.60mm_Drill1.6mm_BeadedTP1, TP2, TP3, TP4
3100nFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC9, C10, C11
310kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR1, R5, R6
20.1uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC6, C8
210kResistor_SMD:R_Array_Convex_4x1206RN1, RN2
210k 1%Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR3, R4
210uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC2, C12
24.7uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC3, C4
2B3B-PH-SM4-TB(LF)(SN)Connector_JST:JST_PH_B3B-PH-SM4-TB_1x03-1MP_P2.00mm_VerticalJ3, J4
1.1uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC7
110RResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR2
12.2uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC5
1470uFCapacitor_THT:CP_Radial_D12.5mm_P5.00mmC1
1Arduino_UNO_R3Misc_custom:Metro_miniA1
1BSS138DW-7-Fdigikey-footprints:SOT-363Q1
1Barrel_Jack_SwitchConnector_BarrelJack:BarrelJack_HorizontalJ6
1CL-SB-12A-01TMisc_custom:CL-SB-12A-01TSW2
1F0512S-1WR3Misc_custom:CONV_F0512S-1WR3PS1
1LOGOtest:ball_heater_blackG***
1LOGOtest:ball_heater_goldG***
1M8S-04PFFR-SF8001Misc_custom:AMPHENOL_M8S-04PFFR-SF8001J5
1RotaryEncoder_SwitchRotary_Encoder:RotaryEncoder_Bourns_Horizontal_PEC09-2xxxF-SxxxxSW1
1S1Gdigikey-footprints:DO-214ACD1
1Screw_Terminal_01x02digikey-footprints:Term_Block_1x2_P5.08MMJ1
1TSM170N06CPdigikey-footprints:TO-252-3Q2
1qwiicMisc_custom:BM04B-SRSS-TB(LF)(SN)J2

Similar boards

  • 6 layers160 × 100 mmAwohali, the printed circuit board in 3D

    Awohali

    DeepSpace00/Awohali

    An open soure GNSS station for flash flood nowcasting

    556 parts
  • 4 layers70 × 100 mmSTM32POE, the printed circuit board in 3D

    STM32POE

    KunoDLK/POE-Test

    114 parts
  • 4 layers80 × 60 mmBytebeam ble can, the printed circuit board in 3D

    Bytebeam ble can

    Atif6894/automotive-ble-can-pcb

    A small 4-layer board that sits on a vehicle's 12/24 V harness, talks CAN FD through a TCAN4550-Q1, and exposes it over Bluetooth LE through a CC2340R5-Q1.

    153 parts
  • 4 layers191.5 × 121.8 mmFoxhunt1, the printed circuit board in 3D

    Foxhunt1

    gx1400/kicad_foxhunt_batterytest

    Custom amateur radio fox hunt (hidden transmitter) controller, aimed at being a flexible, dynamic platform for a wide range of fox-hunt formats — not just a fixed single-mode beacon.

    260 parts
  • 4 layers110 × 80 mmSpin rig controller, the printed circuit board in 3D

    Spin rig controller

    Tinkerbug-Robotics/TinkerRocket

    Model rocket flight computer, ground station, iOS app, and simulation

    170 parts1GPL-3.0
  • 2 layers90 × 37 mmLipo BMS, the printed circuit board in 3D

    Lipo BMS

    nguyen-v/goombot_kicad

    82 parts
  • 4 layers33 × 90 mmActive drag system, the printed circuit board in 3D

    Active drag system

    RocketryVT/active-drag-system

    Eigen Library, cmake, and arm-none-eabi-gcc tooling required for successful build.

    100 parts6MIT
  • 2 layers50 × 47.3 mmSR Aktor, the printed circuit board in 3D

    SR Aktor

    gerryvel/SR-Aktor

    Switch Relais Aktor N2k

    26 parts3GPL-3.0

Questions

How big is the Ball heater controller PCB?

It measures 127 × 76.2 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Ball heater controller use?

43 parts, built around the ARDUINO UNO R3, F0512S-1WR3, B3B-PH-SM4-TB(LF)(SN) and BSS138DW-7-F-ES. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Ball heater controller KiCad files?

From the jazzlw/ball_heater_controller repository on GitHub, at the commit this page was made from: the board is ball_heater_controller_pcb/ball_heater_controller.kicad_pcb and its schematic ball_heater_controller_pcb/ball_heater_controller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Ball heater controller design in my own project?

Its repository states no licence, so its author keeps all rights: ask jazzlw before reusing the design.