Close
0%
0%

PulpPro

Made a Paper Maché Machine from scratch using 3D-printed parts and a custom circuit.

Similar projects worth following
Greetings, everyone, and welcome back, and here's something useful.

The PulpPro is a useful DIY answer for anyone interested in papier-mâché arts. This device, made from a salvaged Vegetable Chopper, streamlines the process of converting paper trimmings into smooth pulp.
Our goal here was to simplify the paper pulp-making process, which involved manually mixing paper with water, which took time to soften the paper, and then manually mixing the solution to make the pulp. This process was extremely time-consuming, and I was going to be working on a paper pulp project in the future, so we created the PulpPro to simplify the process and make the task easier.

We took the jar and blade from a vegetable chopper, removed the mechanical element, and installed a motor to spin the blade. For controlling the motor, we designed a Custom XIAO ESP32 S3-powered Motor Driver Board with an OLED screen that displays the motor's run time.

We designed the body in Fusion360 and even added a handle to allow it to be easily carried around or moved from one location to another.

This device works by connecting a gear motor to the Blade part, which revolves inside the Jar. We power the motor with an onboard battery, and to regulate the motor speed and time, we utilize a microcontroller setup with buttons as input and a display to show the device's run time.

To test this project, we also created a small card out of paper pulp that we prepared inside our PulpPro.

3D DESIGN

We started our project by designing our own blender, using an existing vegetable chopper's jar and blade. Jar and Blade were difficult to 3D print because the blade needed to be created by retrofitting a paper cutter blade, and the jar could be 3D printed but there would be a water leak issue, so we used the jar and blade from the vegetable chopper. We designed the remaining elements, which comprised the base body, which houses the motor and battery pack within, and the lid, which is put over the base body and holds the circuit in place. To keep the motor in place, we designed a motor holder that attaches to the bottom side of the base body.

The whole model was made in Fusion360, and we incorporated industrial design into this project by conducting research on the design of various types of blenders, and then we came up with our own sleek design that mounts on top of the jar and appears to be an extension of the jar rather than something retrofitted.

Also, we divided the Base body into two sections so that we could print them both fast. The entire time for printing the Base body was more than 24 hours, but by splitting the model in two halves, we were able to cut the time to 10 hours for each print.

we created a custom circuit with four mounting holes that are attached to the lid using four screw bosses. On the circuit, we've added an XIAO Microcontroller model, followed by the SSD1306 OLED screen, four buttons, and a barrel DC jack. We will use the dimensions from this Cad file to create the board outline and position components during the PCB editing phase.

To give the 3D printed parts a visually appealing look, we 3D printed the base body in transparent PLA and the remaining components in brown PLA.

XIAO MOTOR DRIVER - CIRCUIT DESIGN

We began the Motor Driver Board design process by constructing a simple schematic that included an XIAO ESP32 S3 microcontroller linked to an AO4406A N Channel Mosfet IC. We are using the Mosfet as a switch setup, with our motor linked to the Mosfet and a 10K resistor connected to the gate of the mosfet via GPIO0 of the XIAO MCU. We can control this mosfet using GPIO0. In addition, we added four buttons with GPIOs 1, 2, 3, and 6.

OLED display is also used and is connected to XIAO's SDA and SCL pins, which are GPIO4 and GPIO5.

In this arrangement, we're utilizing a 12V battery and a 12V motor, but the XIAO is a 5V device, which means any voltage above 5V would fry the controller. To convert 12V to a stable 5V for XIAO and display operation, we used an AMS1117 voltage regulator configuration, which consists of an AM1117 coupled to two capacitors at the input and output.

After finalizing the schematic, we prepare the board design for this project by following the board outline from the cad design and arranging all of the components according to the layout.

We complete the PCB design and prepare the Gerber data. 

SEEED FUSION PCB SERVICE

Following the completion of the Gerber data, we uploaded the file to Seeed Fusion's website and placed an order for a RED Solder mask with white silkscreen.

PCBs were received in a week, and their quality was super good...

Read more »

Paper Mache maker v11.step

step - 4.26 MB - 04/14/2025 at 11:52

Download

Paper Mashe maker v11.f3d

fusion - 5.71 MB - 04/14/2025 at 11:52

Download

BASE BODY.stl

Standard Tesselated Geometry - 842.66 kB - 04/14/2025 at 11:52

Download

LOWER HLAF.stl

Standard Tesselated Geometry - 565.51 kB - 04/14/2025 at 11:52

Download

UPPER HALF.stl

Standard Tesselated Geometry - 353.01 kB - 04/14/2025 at 11:52

Download

View all 9 files

  • 1
    PCB ASSEMBLY PROCESS
    • The PCB assembly process begins by applying solder paste to each SMD component pad one at a time with a solder paste dispensing syringe.
    • We then use an ESD Tweezer to pick and install each component in its proper location.
    • The PCB is then placed on the reflow hotplate, which heats it from below up to the solder paste melting temperature in order to melt the solder paste and permanently solder all of the SMD component pads.
    • We then replaced them with through-hole components such as push buttons, a CON7 header pin for the XIAO Dev board, a DC barrel jack connector, and an OLED display.
    • The board is then flipped over, and all through-hole components and pads are soldered to the PCB with a soldering iron.
    • Finally, we install the XIAO ESO32 S3 DEV Board over the CON7 Header Pin Connector.
  • 2
    CODE

    Now let's have a look at aour code and it's a simple one.

    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    // OLED display dimensions
    #define OLED_WIDTH 128
    #define OLED_HEIGHT 64
    #define OLED_ADDR 0x3C
    Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT);
    // Define pins
    #define MOTOR_PIN D10
    #define START_STOP_BUTTON_PIN D1
    #define ADD_TIME_BUTTON_PIN D6
    #define SUBTRACT_TIME_BUTTON_PIN D3
    // Motor timer variables
    unsigned long motorRunTime = 60000; // Default 1 minute in milliseconds
    unsigned long timeAdjustment = 10000; // 10 seconds in milliseconds
    bool motorRunning = false; // Motor state
    unsigned long motorStartTime;
    // Button state tracking
    bool lastStartStopButtonState = HIGH;
    bool buttonPressed = false;
    bool lastAddTimeButtonState = HIGH;
    bool lastSubtractTimeButtonState = HIGH;
    void setup() {
    // Motor and button pins setup
    pinMode(MOTOR_PIN, OUTPUT);
    digitalWrite(MOTOR_PIN, LOW); // Ensure motor is off at startup
    pinMode(START_STOP_BUTTON_PIN, INPUT_PULLUP);
    pinMode(ADD_TIME_BUTTON_PIN, INPUT_PULLUP);
    pinMode(SUBTRACT_TIME_BUTTON_PIN, INPUT_PULLUP);
    // Serial communication setup
    Serial.begin(115200);
    // OLED display setup using your example method
    if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { // Initialize display
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Halt execution if OLED fails
    }
    // Initial display output
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(10, 20); // Adjust cursor for centering the single-line text
    display.println(F("Paper Mache Maker"));
    display.display();
    delay(2000); // Hold the welcome screen for 2 seconds
    updateDisplay(); // Display the initial timer value
    }
    // Function to update the OLED display with the current time
    void updateDisplay() {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(5, 20); // Moved closer to the left
    display.print("Time: ");
    display.print(motorRunTime / 1000); // Time in seconds
    display.print("s");
    display.display();
    }
    void loop() {
    // Handle Start/Stop button
    bool currentStartStopButtonState = digitalRead(START_STOP_BUTTON_PIN);
    if (currentStartStopButtonState == LOW && lastStartStopButtonState == HIGH) {
    buttonPressed = true; // Button pressed
    }
    if (currentStartStopButtonState == HIGH && lastStartStopButtonState == LOW && buttonPressed) {
    motorRunning = !motorRunning; // Toggle motor state
    if (motorRunning) {
    motorStartTime = millis();
    digitalWrite(MOTOR_PIN, HIGH); // Turn on motor
    Serial.println("Motor started.");
    } else {
    digitalWrite(MOTOR_PIN, LOW); // Turn off motor
    Serial.println("Motor stopped.");
    }
    buttonPressed = false; // Reset the flag
    }
    lastStartStopButtonState = currentStartStopButtonState;
    // Handle Add Time button
    bool currentAddTimeButtonState = digitalRead(ADD_TIME_BUTTON_PIN);
    if (currentAddTimeButtonState == LOW && lastAddTimeButtonState == HIGH) {
    motorRunTime += timeAdjustment;
    updateDisplay(); // Update the time on the display
    delay(50); // Debounce
    }
    lastAddTimeButtonState = currentAddTimeButtonState;
    // Handle Subtract Time button
    bool currentSubtractTimeButtonState = digitalRead(SUBTRACT_TIME_BUTTON_PIN);
    if (currentSubtractTimeButtonState == LOW && lastSubtractTimeButtonState == HIGH) {
    if (motorRunTime > timeAdjustment) {
    motorRunTime -= timeAdjustment;
    updateDisplay(); // Update the time on the display
    } else {
    Serial.println("Cannot reduce time below 0.");
    }
    delay(50); // Debounce
    }
    lastSubtractTimeButtonState = currentSubtractTimeButtonState;
    // Countdown Timer and Motor Off
    if (motorRunning) {
    if (millis() - motorStartTime >= motorRunTime) {
    motorRunning = false;
    digitalWrite(MOTOR_PIN, LOW); // Turn off motor
    Serial.println("Motor stopped automatically after timeout.");
    updateDisplay(); // Reset display after timeout
    } else {
    unsigned long timeLeft = (motorRunTime - (millis() - motorStartTime)) / 1000;
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(5, 20); // Timer display moved closer to the left
    display.print("Time: ");
    display.print(timeLeft);
    display.print("s");
    display.display();
    }
    }
    }
  • 3
    MOTOR TEST

    After uploading code to our Motor Driver board, we used a soldering iron to connect a 12V Gear Motor to our Circuit's Motor connector.

    A 12V power supply is linked via the onboard Barrel DC connector.

    We set the run time using the Timer+ and Time- buttons, which is displayed on the LCD screen, and the motor begins to rotate when we push the Start/Stop button.

    This demonstration confirms that our setup is operational, and we can now proceed to the body assembly procedure.

View all 12 instructions

Enjoy this project?

Share

Discussions

Rich text editor

Similar Projects

Does this project spark your interest?

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