# 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



:::
#### 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.
- 
- 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)
- 
#### 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.