A compact RaspberryPi Zero pHAT 3D printer and CNC controller

Similar projects worth following
I am working on a compact portable 3D printer, and currently focusing on the electronics. I wanted something that allow maximum stand-alone functionality, so I designed it as a RPi pHAT so as to work with OctoPrint. Additionally, the extruder electronics are on a separate expansion board to allow for removable versatile toolheads. The pHAT has an Arduino compatible (Sanguino) core running Marlin.

Features (stepZeroR1)

  • ATmega1284p Sanguino (Arduino compatible) core running at 20MHz
  • Switching regulator DC-DC converter to power the RPi (1.5A OKI-78SR)
  • Communicates to RPi via UART to upload firmware and connect to OctoPrint
  • Headers for three StepStick stepper drivers (micro step adjusted via solder jumbers)
  • Connectors for three end stop limit switches
  • Four expansion ports (I2C based) for driving extruders, heated bed, spindle, etc

brd - 246.40 kB - 06/24/2017 at 08:58


sch - 492.61 kB - 06/24/2017 at 08:58


  • 1 × ATmega1284p Microprocessors, Microcontrollers, DSPs / Microcontrollers (MCUs)
  • 1 × OKI-78SR-5/1.5 Power Management ICs / Power Supply Modules
  • 3 × StepStick

  • stepZeroR2 designed and ordered

    Mo Badr06/26/2017 at 21:41 0 comments

    I finally finished modifying stepZero and ordered the PCBs today, ETA 2 weeks. Hopefully I didn't make any mistakes -_-

    The first revision had a couple of minor problems:

    • I accidentally connected the RPi UART to the ATmega1284p UART1 instead of UART0, which was easily fixed in Optiboot and Marlin
    • I placed the ISP pins under the DC-DC converter, which meant that once I solder the converter I can no longer re-upload the bootloader

    and one major problem:

    • I had four connectors connected in parallel to the ATmega1284p I2C port and VMOT with the intention of using those to drive an extruder and a heated bed (using an expansion board with its own DC-DC converter)

    I had initially intended to attempt to modify Marlin so that it passes the extruder commands to the daughter board over I2C (or even using the pins as SoftwareSerial). When that seemed like a bad idea, I thought I can have Marlin set and query the heater and motor direction using I2C, then switch one of the pins to a mode that would simply pass on the incoming steps signal to the step pin on the expansion board and the second pin to switch it back to I2C. After a second though, I decided that's probably not a good idea either.

    Thus the modifications I made are as follows:

    • RPi UART is now connected to ATmega1284p UART0
    • The ISP header is now on the same side as the expansion ports and can always be accessed easily; furthermore, he SPI pins are connected to the RPi GPIO pins 22, 23, and 24 (through a logic level converter of course) thus allowing programming the ATmega1284p directly without bootloader (see
    • The axes endstop pins now have two signal connectors for MIN and MAX (previously I used only one for MIN)
    • The two expansion ports (expPort) ow breaks out both I2C and UART1 as well as VMOT and VCC, this allows me to test a new approach where I would use one communication protocol (either I2C or UART, probably the latter) for setting and querying the expansion board while the signal on the two other pins will be passed directly to or from other pins (such as stepper step, dir, and a probe pin) selected using the communication line (sort of multiplexing)
    • There is now a dedicated connector for a cooling fan controlled by PWM, and a bootloader LED next to the RESET button
    • Finally, the DC-DC converter is moved a little back allowing a regular screw terminal to be placed instead of the removable one which was extending outwards, while the extended one was initially selected to allow removing the power input wires without having to remove the Z-stepper driver, it would collide with the USB ports on the larger RPi 3 (although I doubt anyone would want to use stepZero with a full RPi anyway)


    Aside from fixing a small problem with the stepper driver footprint being a bit too wide, stepZeroExp did not have any problematic issues. I had already broken out the UART pins in addition to the I2C pins in stepZeroExpR1, so I would have been able to use the new stepZeroR2 expPort, but I redesigned it to use the newer pinout for convenience. I also added a MOSFET to control a second fan, thus having one fan cooling the extruder itself while the other is cooling the print. Finally, I changed the stepper driver headers to two regular full rows (unlike on the main board) and moved it to the center of the board.

View project log

Enjoy this project?



Eric Lowe wrote 07/14/2018 at 01:29 point

You should check out for software juiciness.

  Are you sure? yes | no

Marc Peltier wrote 03/26/2018 at 13:22 point

Congratulations !

Seems like it's done on purpose to support Klipper. Have you thought about that?

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates