---
# System prepended metadata

title: 3D Printer
tags: [3D列印]

---

# 3D Printer
###### `Equipment`

[TOC]

## Skymaker X3
### Info
- Motherboard: Mightyboard V2
    - BOARD_MIGHTYBOARD_REVE
    - [Schematics](https://green-candy.osdn.jp/external/MarlinFW/board_schematics/Mightyboard%20Rev.E/MakerBot%20MightyBoard%20REVE%20Schematic.pdf)
    - [Atmega1280 pinout](https://avrhelp.mcselec.com/index.html?atmega1280.htm)
    - [Wiki](https://beta.ivc.no/wiki/index.php/MakerBot_Replicator_1_Upgrades_and_Repairs)
    - Pin map for board is in `<pins_MIGHTYBOARD_REVE.h>`
    - Pin map for Atmega1280 is in `<pinsDebug_plus_70.h>`
- Stepper motor driver
    - Origin: A4982
        - [A4982 module pinout](https://beta.ivc.no/wiki/images/thumb/7/70/MakerBot_Replicator_MightyStep17.jpg/450px-MakerBot_Replicator_MightyStep17.jpg)
    - New: TMC2208
        - [TMC2208 set voltage](https://www.youtube.com/watch?v=7VHwcEroHPk#t=4m16s)

### Code
- [github page](https://github.com/Chungchiyu/CSPLAB-skymaker)

### New feature
#### Auto bed leveling
- `#define AUTO_BED_LEVELING_BILINEAR`
- add probe
    - `#define FIX_MOUNTED_PROBE`
    - (for inductive probe)
- `#define Z_MIN_PROBE_ENDSTOP_INVERTING true`
- `#define Z_SAFE_HOMING`
#### Control button
:::spoiler Left button changes to backward.
```cpp
// buttons.h
#if BUTTON_EXISTS(LEFT)
  #define _BUTTON_PRESSED_LEFT _BUTTON_PRESSED(LEFT)
  #define BLEN_D 3            // Overide the no back button 
  #define EN_D _BV(BLEN_D)    // by assigning left button as back button
```
```cpp
// marlinui.cpp
else {
    newbutton |= EN_D; // Change left button to back button
    btn_pressed = false;
}
```
:::
:::spoiler Right button changes to select.
```cpp
// marlinui.cpp
else {
    newbutton |= EN_C; // Change left button to back button
    btn_pressed = false;
}
```
:::
:::spoiler Long press button can speed up the adjustment.
```cpp
// marlinui.cpp
// Custom settings
      static millis_t update_ms_interval = 300;
      static uint8_t long_press_num = 0;
      static bool btn_pressed = false;

      if (ELAPSED(now, next_button_update_ms)) {

        #if HAS_DIGITAL_BUTTONS

          #if ANY_BUTTON(EN1, EN2, ENC, BACK)

            uint8_t newbutton = 0;
            if (BUTTON_PRESSED(EN1))                 newbutton |= EN_A;
            if (BUTTON_PRESSED(EN2))                 newbutton |= EN_B;
            if (can_encode() && BUTTON_PRESSED(ENC)) newbutton |= EN_C;
            if (BUTTON_PRESSED(BACK))                newbutton |= EN_D;

          #else

            constexpr uint8_t newbutton = 0;

          #endif

          //
          // Directional buttons
          //
          #if ANY_BUTTON(UP, DOWN, LEFT, RIGHT)

            static int8_t pulses = epps * encoderDirection;

            if (btn_pressed && update_ms_interval > 5) {
              long_press_num++;
            } else if (!btn_pressed) {
              long_press_num = 0;
              pulses = epps * encoderDirection;
            } else if (update_ms_interval < 11) {
              pulses = 10 * encoderDirection;
            }
            update_ms_interval = 160 - 20 * long_press_num;

            if (BUTTON_PRESSED(UP)) {
              encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses;
              next_button_update_ms = now + update_ms_interval;
              btn_pressed = true;
            }
            else if (BUTTON_PRESSED(DOWN)) {
              encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses;
              next_button_update_ms = now + update_ms_interval;
              btn_pressed = true;
            }
            else if (BUTTON_PRESSED(LEFT)) {
              if (currentScreen == status_screen) {
                encoderDiff = -pulses;
                next_button_update_ms = now + update_ms_interval;
                btn_pressed = true;
              }
              else {
                newbutton |= EN_D; // Change left button to back button
                btn_pressed = false;
              }
            }
            else if (BUTTON_PRESSED(RIGHT)) {
              if (currentScreen == status_screen) {
                encoderDiff = pulses;
                next_button_update_ms = now + update_ms_interval;
                btn_pressed = true;
              }
              else {
                newbutton |= EN_C; // Change right button to center button
                btn_pressed = false;
              }
            } else {
              btn_pressed = false;
            }
```
:::
#### LCD PID Menu
- PID auto tuning in menu
    - `#define PID_AUTOTUNE_MENU`
#### Babystepping
In `<Configuration_adv.h>`
- `#define BABYSTEPPING`
- `#define DOUBLECLICK_FOR_Z_BABYSTEPPING`
#### Encoder sets the feedrate multiplier on the Status Screen
In `<Configuration_adv.h`
- `#define ULTIPANEL_FEEDMULTIPLY`
#### Auto bed leveling(will original z-min pin can be competible to z probe?)
- Add inductive z height probe.
- #define AUTO_BED_LEVELING_BILINEAR
- #define FIX_MOUNTED_PROBE
- Force the use of the probe for Z-axis homing
    - `#define USE_PROBE_FOR_Z_HOMING`
    - `#define Z_MIN_PROBE_PIN 42  // L7-Original Z-max pin`
#### Runout filament check
In `Configuration.h`
- #define FILAMENT_RUNOUT_SENSOR
- #define NOZZLE_PARK_FEATURE
In `Configuration_adv.h`
- #define ADVANCED_PAUSE_FEATURE
#### 
### Fix
#### SD card
- Issue: Can not read sd card.
- Reason: The state of sd detection is opposite.
- Fix: #define SD_DETECT_STATE LOW
#### Hotend temperature
- Issue: Hotend temerature reverse.
- Reason: The K-type thermalcouple has polarity.
- Fix: Swap the pins.
#### Hotend
- Issue: Hotend throat stucked.
- Reason: The filament will stuck the throat after cool down.
- Fix: Change hotend to V6.
#### Hotend temperature 2
- Issue: The hotend temperature can not be identified.
- Reason: V6 hotend is using E3D (ATC Semitec 104GT-2/104NT-4-R025H42G), not MAX6675.
- Fix: Connect and additional wire from ATmega1280 (PK6(ADC14/PCINT22)), and add a 4.7k ohm resistor for pull-up, and extend the thermocouple pins for input.
In pins_MIGHTYBOARD_REVE.h
    - #define TEMP_0_PIN 14
#### Z_SAFE_HOMING
- Issue: Moving out of boundary after homing XY.
- Reason: The Z_SAFE_HOMING setting goes to X0 Y0.
- Fix: Go to half bed position.
    - #define Z_SAFE_HOMING_X_POINT _X_HALF_BED  // X point for Z homing
    - #define Z_SAFE_HOMING_Y_POINT _Y_HALF_BED  // Y point for Z homing
#### Bed Size
- #define X_BED_SIZE 280
- #define Y_BED_SIZE 200
#### Step/mm
- Issue: Steps per unit is wrong.
- Fix:(Needs to command M92 to overide then M500 save to EEPROM)
    - #define DEFAULT_AXIS_STEPS_PER_UNIT   {  80, 80, 400, 96.275201870 }
:::spoiler Information image
![](https://hackmd.io/_uploads/HJIJJm2WT.png)
![](https://hackmd.io/_uploads/H1ygkmnZT.png)
![](https://hackmd.io/_uploads/BJaeymnZ6.png)
:::
#### PID Tuning
- Issue: The hotend temperature fluctuates.
- Reason: Hotend changes to V6, the pid parameters aren't the same.
- Fix: Redo the PID tuning.
Type command: E0 extruder, 200^C, 8 times
    - M303 E0 S200 C8
    - #define DEFAULT_Kp 18.38
    - #define DEFAULT_Ki 1.38
    - #define DEFAULT_Kd 61.35
#### Skew Compensation
- Issue: The printed parts aren't orthogonally correct.
- Reasson: The gantry is not orthogonally aligned.
- Fix: Run bed skew compensation.
`In configuration.h`
    - #define SKEW_CORRECTION
    - #define XY_DIAG_AC 141.1
      #define XY_DIAG_BD 141.36
      #define XY_SIDE_AD 99.65

#### Lack of flash memory
- Issue: Atmega1280 is lack of flash memory.
- Fix:
    - [Feature memory usage](https://www.crosslink.io/marlin-2-0-memory-usage-by-feature/)
    - [Optimisations of AVR programs using avr-gcc](https://p5r.uk/blog/2008/avr-gcc-optimisations.html)
    1. Disable to save 638 bytes memory. You only need this to see EEPROM messages when connected to serial console.
        - // #define EEPROM_CHITCHAT
    2. Readonly support for SD card. Disables capabilites to write to SD card, so gcode uploading and Power loss recovery won't work. Save 2000 bytes.
        - #define SDCARD_READONLY

#### Head Creep problem
- Date: 2024/03/10
- Issue: The hotend was lack of cooling, causing serious head creep.
- Fix:
    - Add two side cooling fans to cool down filament.
    - ![image](https://hackmd.io/_uploads/rJHFcFoaa.png =60%x)
    - Lower flow rate to 75%. The original flow is too high.

#### Accuracy
- Date: 2024/03/11
- Issue: The Y axis is much more inaccurate.
- Fix:
    - Calibrate by printing califlower calibration grid.
    - [Link page](https://www.printables.com/model/164261-calibration-bro-califlower-calilantern-alternative)
    - ![image](https://hackmd.io/_uploads/SkVj3KsaT.png)

#### Bed Leveling Keep Turning Off
- Date: 2024/03/15
- Issue: Bed leveling keep turning off automatically after bed homing.
- Fix: Change firmware with `RESTORE_LEVELING_AFTER_G28` leveling is restored to whatever state it was in before homing.