├── images ├── z_stop.jpg ├── cold_end.jpg ├── elec_bay.jpg ├── spacers.jpg ├── din_rails.jpg ├── first_layer.jpg ├── flow_chart.png ├── flow_test.jpg ├── mks_nano4.jpg ├── acrylic_sides.jpg ├── adjust_zstop.jpg ├── klipper_dash.png ├── mks_nano4_v31.jpg ├── mks_terminals.jpg ├── psu_relocate.jpg ├── ptfe_compare.jpg ├── 60mm_noisy_fan.jpg ├── heatsink_screws.jpg ├── heatsink_weight.jpg ├── hotend_assembly.jpg ├── lower_carriage.jpg └── wiring-diagram.png ├── LICENSE ├── flow.md ├── orange_pi_z2.md ├── klipper.md └── readme.md /images/z_stop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/z_stop.jpg -------------------------------------------------------------------------------- /images/cold_end.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/cold_end.jpg -------------------------------------------------------------------------------- /images/elec_bay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/elec_bay.jpg -------------------------------------------------------------------------------- /images/spacers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/spacers.jpg -------------------------------------------------------------------------------- /images/din_rails.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/din_rails.jpg -------------------------------------------------------------------------------- /images/first_layer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/first_layer.jpg -------------------------------------------------------------------------------- /images/flow_chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/flow_chart.png -------------------------------------------------------------------------------- /images/flow_test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/flow_test.jpg -------------------------------------------------------------------------------- /images/mks_nano4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/mks_nano4.jpg -------------------------------------------------------------------------------- /images/acrylic_sides.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/acrylic_sides.jpg -------------------------------------------------------------------------------- /images/adjust_zstop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/adjust_zstop.jpg -------------------------------------------------------------------------------- /images/klipper_dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/klipper_dash.png -------------------------------------------------------------------------------- /images/mks_nano4_v31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/mks_nano4_v31.jpg -------------------------------------------------------------------------------- /images/mks_terminals.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/mks_terminals.jpg -------------------------------------------------------------------------------- /images/psu_relocate.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/psu_relocate.jpg -------------------------------------------------------------------------------- /images/ptfe_compare.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/ptfe_compare.jpg -------------------------------------------------------------------------------- /images/60mm_noisy_fan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/60mm_noisy_fan.jpg -------------------------------------------------------------------------------- /images/heatsink_screws.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/heatsink_screws.jpg -------------------------------------------------------------------------------- /images/heatsink_weight.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/heatsink_weight.jpg -------------------------------------------------------------------------------- /images/hotend_assembly.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/hotend_assembly.jpg -------------------------------------------------------------------------------- /images/lower_carriage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/lower_carriage.jpg -------------------------------------------------------------------------------- /images/wiring-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gknapp/ghost6/HEAD/images/wiring-diagram.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Greg Knapp 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /flow.md: -------------------------------------------------------------------------------- 1 | # Ghost 6 stock extruder & hot-end performance 2 | 3 | Tests conducted using Eryone orange PLA (1.75mm). 4 | 5 | I used a [flow test generator](https://hotend-flow-tester.netlify.app/) to produce Gcode requesting a range of flow rates 6 | across three printing temperatures: 200˚C, 210˚C and 220˚C. 7 | 8 | This is replicates method used by [CNC Kitchen](https://www.youtube.com/watch?v=0xRtypDjNvI), 9 | weighing the extruded PLA and comparing it to the requested flow rate in mm3/s. 10 | 11 | ![Grid of flow rate tests on the Ghost 6 build surface](images/flow_test.jpg) 12 | 13 | When fitting a CHC I also switched the nozzle from brass to tungsten carbide to print abrasive filament. Carbide nozzles have approx 80% of the thermal conductivity of brass, and benefit from slightly higher printing temperatures. 14 | 15 | Flow rate requested and weight extruded (g) using a brass 0.4mm nozzle. 16 | 17 | | Temp | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 18 | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | 19 | | 200 | 0.6 | 0.6 | 0.58 | 0.56 | 0.57 | 0.51 | 0.47 | 0.4 | 0.39 | 0.36 | 0.34 | 20 | | 200 CHC | 0.6 | 0.59 | 0.58 | 0.5 | 0.42 | 0.38 | 0.34 | 0.29 | 0.28 | 0.25 | 0.23 | 21 | | 210 | 0.6 | 0.6 | 0.57 | 0.58 | 0.58 | 0.56 | 0.53 | 0.46 | 0.43 | 0.39 | 0.37 | 22 | | 210 CHC | 0.6 | 0.58 | 0.59 | 0.53 | 0.48 | 0.42 | 0.37 | 0.34 | 0.29 | 0.25 | 0.23 | 23 | | 220 | 0.6 | 0.58 | 0.59 | 0.59 | 0.56 | 0.58 | 0.57 | 0.51 | 0.45 | 0.42 | 0.39 | 24 | | 220 CHC | 0.59 | 0.59 | 0.59 | 0.57 | 0.52 | 0.42 | 038 | 0.36 | 0.32 | 0.3 | 0.29 | 25 | | 225 CHC | - | - | 0.6 | 0.6 | 0.57 | 0.5 | 0.43 | 0.38 | - | - | - | 26 | | 235 CHC | - | - | 0.59 | 0.59 | 0.56 | 0.49 | 0.45 | 0.41 | - | - | - | 27 | | 245 CHC | - | - | 0.59 | 0.59 | 0.59 | 0.55 | 0.48 | 0.42 | - | - | - | 28 | 29 | Taking 0.6g as the maximum and dividing all test results into this, we 30 | can see the relative flow rate (under) performance. 31 | 32 | | Temp | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 33 | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | 34 | | 200 | 100 | 100 | 96.67 | 93.33 | 95.00 | 85.00 | 78.33 | 66.67 | 65.00 | 60.00 | 56.67 | 35 | | 200 CHC | 100 | 98.33 | 96.67 | 83.33 | 70.00 | 61.67 | 56.67 | 48.33 | 46.67 | 41.67 | 38.33 | 36 | | 210 | 100 | 100 | 95.00 | 96.67 | 96.67 | 93.33 | 88.33 | 76.67 | 71.67 | 65.00 | 61.67 | 37 | | 210 CHC | 100 | 96.67 | 98.33 | 88.33 | 80.00 | 70.00 | 61.67 | 56.67 | 48.33 | 41.67 | 38.33 | 38 | | 220 | 100 | 96.67 | 98.33 | 98.33 | 93.33 | 96.67 | 95.00 | 85.00 | 75.00 | 70.00 | 65.00 | 39 | | 220 CHC | 98.33 | 98.33 | 98.33 | 95.00 | 86.67 | 70.00 | 63.33 | 60.00 | 53.33 | 50.00 | 48.33 | 40 | | 225 CHC | - | - | 100 | 100 | 95.00 | 83.33 | 71.67 | 63.33 | - | - | - | 41 | | 235 CHC | - | - | 98.33 | 98.33 | 93.33 | 81.67 | 75.00 | 68.33 | - | - | - | 42 | | 245 CHC | - | - | 98.33 | 98.33 | 98.33 | 91.67 | 80.00 | 70.00 | - | - | - | 43 | 44 | ![Line chart of data in the table above, flow rate requested versus actual](images/flow_chart.png) 45 | 46 | The chart suggests a nozzle temp of around 240C might help restore flow rates. I'm yet to print at that temperature and assess the quality. -------------------------------------------------------------------------------- /orange_pi_z2.md: -------------------------------------------------------------------------------- 1 | # Orange Pi Zero 2 2 | 3 | I bought this SBC to run [klipper](https://www.klipper3d.org) on my [3D Printer](readme.md). 4 | 5 | My SBC came with Debian Bullseye pre-installed on a 32GB SDHC as it came as a [kit from TriangleLabs](https://www.aliexpress.com/item/1005004177544221.html). 6 | I connected this board to my network via ethernet and it is automatically provisioned an IP via DHCP. 7 | 8 | ## Connecting over SSH 9 | 10 | Once power and ethernet are connected, you can find the Orange Pi Z2's IP address from your router. When you have this you can login using the credentials: 11 | 12 | Username: `root` 13 | Password: `orangepi` 14 | 15 | ```bash 16 | ssh root@ip.from.router 17 | ``` 18 | 19 | After pressing [Enter] you'll be prompted for the password. 20 | 21 | ## Find local update servers (sources.list) 22 | 23 | When I received my board, the repositories were set to Chinese servers local to the supplier. I checked the [Debian mirror list](https://www.debian.org/mirror/list) to find a local mirror. 24 | 25 | > Note the supported architectures when selecting a mirror, must include 26 | `arm64`. 27 | 28 | When you've selected a local mirror server, note the hostname. 29 | 30 | ```bash 31 | vim /etc/apt/sources.list 32 | ``` 33 | 34 | Enter: 35 | 36 | `:%s/ftp.hk.debian.org/host.you.selected/` 37 | 38 | This will replace the hostnames with your chosen one. 39 | 40 | > You may need to find a different server for `debian-security` packages. 41 | 42 | To save changes and exit vim: 43 | 44 | `:x` 45 | 46 | > If you made a mistake, or don't want to save your changes, use `:q!` 47 | 48 | ## Update system packages 49 | 50 | ```bash 51 | apt update && apt upgrade 52 | ``` 53 | 54 | ## Add a new user 55 | 56 | It's good practice not to login as `root`, instead we should create a less privileged account with the ability to elevate it's privileges temporarily via the `sudo` command. 57 | 58 | ```bash 59 | adduser pi && passwd pi 60 | usermod -aG sudo pi 61 | ``` 62 | 63 | ## Change the hostname 64 | 65 | My Orange Pi Zero 2 was delivered with the hostname: `orangepizero2` 66 | 67 | We can change that to something shorter or more memorable. As I'm using this to run klipper on my 3D printer, I thought I'd use the inspired name of `klipper`. 68 | 69 | You can change it via one of two ways: 70 | 71 | 1) Use `orangepi-config` (recommended) 72 | 2) Bash commands 73 | 74 | Option one: 75 | 76 | ```bash 77 | orangepi-config 78 | ``` 79 | 80 | Select `Personal`, then the option to change the hostname. 81 | 82 | Option two, use bash: 83 | 84 | ```bash 85 | echo "klipper" > /etc/hostname 86 | hostnamectl set-hostname klipper 87 | ``` 88 | 89 | Then update your `hosts` file to match: 90 | 91 | ```bash 92 | sed -e 's/orangepizero2/klipper/' -i /etc/hosts 93 | ``` 94 | 95 | ## Make connecting easier 96 | 97 | Rather than remembering an IP address (that may change) to SSH into, we can make it easier for ourselves with a `.local` domain. This is done via mDNS (multi-cast DNS). 98 | 99 | This is easier than it might sound, just install a package called Avahi, an open-source mDNS service: 100 | 101 | ```bash 102 | apt update 103 | apt install avahi-daemon 104 | ``` 105 | 106 | ## Reduce memory usage 107 | 108 | We can save memory by not loading unused services and programs. As we're working on the command line using SSH, we can stop the GUI / Window manager from being loaded on boot: 109 | 110 | ```bash 111 | systemctl set-default multi-user.target 112 | reboot 113 | ``` 114 | 115 | In approximately 30 seconds, you can reconnect via SSH using: 116 | 117 | ```bash 118 | ssh pi@klipper.local 119 | ``` 120 | 121 | > When you log back in, you'll need to prefix system commands with `sudo` 122 | 123 | ## Prevent SSH logins as 'root' 124 | 125 | Now you have a working user, there's little reason to allow `root` to SSH into your OPi. Especially as the password is known. 126 | 127 | ```bash 128 | sudo sed -e '/PermitRootLogin/ s/^#*/#/' -i /etc/ssh/sshd_config 129 | ``` 130 | 131 | Restart the SSH service for config changes to take effect. 132 | 133 | ```bash 134 | sudo systemctl restart ssh 135 | ``` 136 | 137 | ## Memory usage 138 | 139 | You can see the available memory using the command: 140 | 141 | ```bash 142 | free 143 | ``` 144 | 145 | ## Reduce memory usage: Disable Bluetooth 146 | 147 | If you're not going to use Bluetooth you can save memory by disabling the software support using `orangepi-config`, run it and select `Network`: 148 | 149 | ```bash 150 | sudo orangepi-config 151 | ``` 152 | 153 | ## Reduce memory usage: Disable WiFi 154 | 155 | If you want to further reduce memory usage, you can disable `wpa_supplicant` via systemd and turn off `wlan0` in Network Manager. 156 | 157 | ```bash 158 | sudo systemctl stop wpa_supplicant 159 | sudo systemctl disable wpa_supplicant && sudo systemctl mask wpa_supplicant 160 | sudo nmcli radio wifi off 161 | ``` 162 | 163 | I hope this information proved useful. -------------------------------------------------------------------------------- /klipper.md: -------------------------------------------------------------------------------- 1 | ## Klipper 2 | 3 | ![Klipper dashboard](./images/klipper_dash.png) 4 | 5 | > **Note:** I don't run an ABL probe or a webcam. 6 | 7 | This configuration assumes the following directory structure (in `/home/pi` but could be any directory): 8 | 9 | ```bash 10 | ├── ghost6 11 | │ ├── backup 12 | │ ├── certs 13 | │ ├── comms 14 | │ ├── config 15 | │ ├── database 16 | │ ├── gcodes 17 | │ ├── logs 18 | │ ├── mainsail 19 | │ └── systemd 20 | ├── klipper 21 | │ ├── config 22 | │ ├── docs 23 | │ ├── klippy 24 | │ ├── lib 25 | │ ├── out 26 | │ ├── scripts 27 | │ ├── src 28 | │ └── test 29 | ├── klippy-env 30 | │ ├── bin 31 | │ ├── include 32 | │ └── lib 33 | ├── moonraker 34 | │ ├── docs 35 | │ ├── moonraker 36 | │ ├── scripts 37 | │ └── tests 38 | └── moonraker-env 39 | ├── bin 40 | └── lib 41 | ``` 42 | 43 | ### printer.cfg 44 | ```yaml 45 | [display_status] 46 | 47 | [gcode_arcs] 48 | # Arc welder support 49 | 50 | [pause_resume] 51 | 52 | [virtual_sdcard] 53 | path: ~/ghost6/gcodes 54 | 55 | # This file contains common pin mappings for MKS Robin Nano V3 56 | # boards. To use this config, the firmware should be compiled for the 57 | # stm32f407. When running "make menuconfig", select the 48KiB 58 | # bootloader. 59 | 60 | # The "make flash" command does not work on the MKS Robin. Instead, 61 | # after running "make", copy the generated "out/klipper.bin" file to a 62 | # file named "Robin_nano_v3.bin" on an SD card and then restart the 63 | # MKS Robin with that SD card. 64 | 65 | [stepper_x] 66 | step_pin: PE3 67 | dir_pin: !PE2 68 | enable_pin: !PE4 69 | microsteps: 16 70 | rotation_distance: 20 71 | endstop_pin: !PA15 72 | position_endstop: 1 73 | position_max: 255 74 | homing_speed: 50 75 | 76 | [stepper_y] 77 | step_pin: PE0 78 | dir_pin: !PB9 79 | enable_pin: !PE1 80 | microsteps: 16 81 | rotation_distance: 20 82 | endstop_pin: !PD2 83 | position_endstop: 1 84 | position_max: 215 85 | homing_speed: 50 86 | 87 | [stepper_z] 88 | step_pin: PB5 89 | dir_pin: !PB4 90 | enable_pin: !PB8 91 | microsteps: 16 92 | rotation_distance: 4 93 | endstop_pin: !PC8 94 | homing_speed: 14 95 | second_homing_speed: 2 96 | position_min: -5 97 | position_max: 205 98 | 99 | [extruder] 100 | dir_pin: PD3 101 | enable_pin: !PB3 102 | filament_diameter: 1.750 103 | heater_pin: PE5 104 | max_extrude_only_distance: 600 105 | max_extrude_cross_section: 14.4 106 | microsteps: 32 107 | min_extrude_temp: 180 108 | min_temp: 0 109 | max_temp: 290 # use 240 here for stock hot-end 110 | nozzle_diameter: 0.600 # stock nozzle = 0.4 111 | rotation_distance: 15.332 112 | sensor_pin: PC1 113 | # sensor_type: ATC Semitec 104GT-2 114 | sensor_type: EPCOS 100K B57560G104F 115 | step_pin: PD6 116 | 117 | [firmware_retraction] 118 | retract_length: 0.6 119 | retract_speed: 45 120 | unretract_extra_length: 0 121 | unretract_speed: 40 122 | 123 | [heater_fan nozzle_fan] 124 | pin: PC14 125 | shutdown_speed: 1.0 126 | heater: extruder 127 | heater_temp: 50 128 | fan_speed: 1.0 129 | 130 | [fan] 131 | pin: PB1 # Part cooling 132 | 133 | [heater_bed] 134 | heater_pin: PA0 135 | sensor_type: EPCOS 100K B57560G104F 136 | sensor_pin: PC0 137 | min_temp: 0 138 | max_temp: 115 139 | 140 | [bed_screws] # bed tramming 141 | screw1: 28,31 142 | screw1_name: Front Left 143 | screw2: 228,31 144 | screw2_name: Front Right 145 | screw3: 228,181 146 | screw3_name: Back Right 147 | screw4: 28,181 148 | screw4_name: Back Left 149 | speed: 150 150 | 151 | [mcu] 152 | serial: /dev/ttyS5 # UART connection 153 | restart_method: command 154 | 155 | [printer] 156 | kinematics: corexy 157 | max_velocity: 250 158 | max_accel: 3000 159 | max_accel_to_decel: 1500 160 | max_z_velocity: 25 161 | max_z_accel: 100 162 | 163 | [temperature_sensor orange_pi] 164 | sensor_type: temperature_host 165 | min_temp: 10 166 | max_temp: 100 167 | 168 | [temperature_sensor mks_nano] 169 | sensor_type: temperature_mcu 170 | min_temp: 0 171 | max_temp: 100 172 | 173 | [output_pin beeper] 174 | pin: PC5 175 | pwm: true 176 | value: 0 177 | shutdown_value: 0 178 | cycle_time: 0.001 179 | 180 | [led lights] # chamber 'floodlight' 181 | white_pin: !PE6 182 | 183 | ######################################## 184 | # EXP1 / EXP2 (display) pins 185 | ######################################## 186 | 187 | # Display not functional with klipper 188 | [board_pins] 189 | aliases: 190 | # EXP1 header 191 | EXP1_1=PC5, EXP1_3=PD13, EXP1_5=PE14, EXP1_7=PD11, EXP1_9=, 192 | EXP1_2=PE13, EXP1_4=PC6, EXP1_6=PE15, EXP1_8=PD10, EXP1_10=<5V>, 193 | # EXP2 header 194 | EXP2_1=PA6, EXP2_3=PE8, EXP2_5=PE11, EXP2_7=PE12, EXP2_9=, 195 | EXP2_2=PA5, EXP2_4=PE10, EXP2_6=PA7, EXP2_8=, EXP2_10=<3.3v> 196 | # Pins EXP2_1, EXP2_6, EXP2_2 are also MISO, MOSI, SCK of bus "ssp1" 197 | 198 | # See the sample-lcd.cfg file for definitions of common LCD displays. 199 | 200 | [include macros.cfg] 201 | ``` 202 | 203 | ### macros.cfg 204 | 205 | ```yaml 206 | [gcode_macro PAUSE] 207 | description: Pause the actual running print 208 | rename_existing: PAUSE_BASE 209 | gcode: 210 | PAUSE_BASE 211 | _TOOLHEAD_PARK_PAUSE_CANCEL 212 | 213 | [gcode_macro RESUME] 214 | description: Resume the actual running print 215 | rename_existing: RESUME_BASE 216 | gcode: 217 | ##### read extrude from _TOOLHEAD_PARK_PAUSE_CANCEL macro ##### 218 | {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} 219 | #### get VELOCITY parameter if specified #### 220 | {% if 'VELOCITY' in params|upper %} 221 | {% set get_params = ('VELOCITY=' + params.VELOCITY) %} 222 | {%else %} 223 | {% set get_params = "" %} 224 | {% endif %} 225 | ##### end of definitions ##### 226 | {% if printer.extruder.can_extrude|lower == 'true' %} 227 | M83 228 | G1 E{extrude} F2100 229 | {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} 230 | {% else %} 231 | {action_respond_info("Extruder not hot enough")} 232 | {% endif %} 233 | 234 | 235 | RESUME_BASE {get_params} 236 | 237 | [gcode_macro CANCEL_PRINT] 238 | description: Cancel the actual running print 239 | rename_existing: CANCEL_PRINT_BASE 240 | variable_park: True 241 | gcode: 242 | ## Move head and retract only if not already in the pause state and park set to true 243 | {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} 244 | _TOOLHEAD_PARK_PAUSE_CANCEL 245 | {% endif %} 246 | TURN_OFF_HEATERS 247 | CANCEL_PRINT_BASE 248 | 249 | [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] 250 | description: Helper: park toolhead used in PAUSE and CANCEL_PRINT 251 | variable_extrude: 1.0 252 | gcode: 253 | ##### set park positon for x and y ##### 254 | # default is your max posion from your printer.cfg 255 | {% set x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} 256 | {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} 257 | {% set z_park_delta = 2.0 %} 258 | ##### calculate save lift position ##### 259 | {% set max_z = printer.toolhead.axis_maximum.z|float %} 260 | {% set act_z = printer.toolhead.position.z|float %} 261 | {% if act_z < (max_z - z_park_delta) %} 262 | {% set z_safe = z_park_delta %} 263 | {% else %} 264 | {% set z_safe = max_z - act_z %} 265 | {% endif %} 266 | ##### end of definitions ##### 267 | {% if printer.extruder.can_extrude|lower == 'true' %} 268 | M83 269 | G1 E-{extrude} F2100 270 | {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} 271 | {% else %} 272 | {action_respond_info("Extruder not hot enough")} 273 | {% endif %} 274 | {% if "xyz" in printer.toolhead.homed_axes %} 275 | G91 276 | G1 Z{z_safe} F900 277 | G90 278 | G1 X{x_park} Y{y_park} F6000 279 | {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} 280 | {% else %} 281 | {action_respond_info("Printer not homed")} 282 | {% endif %} 283 | 284 | # From: https://github.com/Klipper3d/klipper/blob/master/config/sample-macros.cfg 285 | [gcode_macro M600] 286 | description: Starts process of Filament Change 287 | gcode: 288 | {% set X = params.X|default(50)|float %} 289 | {% set Y = params.Y|default(0)|float %} 290 | {% set Z = params.Z|default(10)|float %} 291 | SAVE_GCODE_STATE NAME=M600_state 292 | PAUSE 293 | G91 294 | G1 E-.8 F2700 295 | G1 Z{Z} 296 | G90 297 | G1 X{X} Y{Y} F3000 298 | G91 299 | G1 E-90 F1000 300 | RESTORE_GCODE_STATE NAME=M600_state 301 | 302 | [gcode_macro load] 303 | description: Loads filament 304 | gcode: 305 | {% set cfg = printer.configfile.settings %} 306 | {% if printer.extruder.temperature < cfg.extruder.min_extrude_temp %} 307 | M104 S190 308 | {action_respond_info("Hot-end temperature too low, heating to 190C ...")} 309 | {% else %} 310 | SAVE_GCODE_STATE NAME=LOAD_state 311 | G91 # relative movement 312 | {% if printer.toolhead.position.z|float < 25 %} # if bed closer than 25mm 313 | {% if printer.toolhead.homed_axes != "z" %} # conditionally home Z 314 | G28 Z 315 | {% endif %} 316 | G90 # absolute movement 317 | G1 Z25 F1200 # Move bed to 25mm below nozzle 318 | G91 # relative movement 319 | {% endif %} 320 | G1 E80 F{ 5 * 60 } # extrude 321 | G4 P1000 # dwell 1s 322 | G1 E50.0 F{ 5 * 60 } # extrude a little more 323 | RESTORE_GCODE_STATE NAME=LOAD_state 324 | {% endif %} 325 | 326 | [gcode_macro purge] 327 | description: Extrudes filament to purge previous filament 328 | gcode: 329 | {% set cfg = printer.configfile.settings %} 330 | {% if printer.extruder.temperature < cfg.extruder.min_extrude_temp %} 331 | M104 S190 332 | {action_respond_info("Hot-end temperature too low, heating to 190C ...")} 333 | {% else %} 334 | {% set PURGE_AMOUNT = params.PURGE_AMOUNT|default(40)|float %} 335 | SAVE_GCODE_STATE NAME=PURGE_state 336 | G91 # relative movement 337 | G1 E{PURGE_AMOUNT} F{ 5 * 60 } # purge 338 | RESTORE_GCODE_STATE NAME=PURGE_state 339 | {% endif %} 340 | 341 | [gcode_macro unload] 342 | description: Unloads filament 343 | gcode: 344 | {% set cfg = printer.configfile.settings %} 345 | {% if printer.extruder.temperature < cfg.extruder.min_extrude_temp %} 346 | M104 S190 347 | {action_respond_info("Hot-end temperature too low, heating to 190C ...")} 348 | {% else %} 349 | SAVE_GCODE_STATE NAME=UNLOAD_state 350 | G91 # relative movement 351 | {% if printer.toolhead.position.z|float < 25 %} # if bed closer than 25mm 352 | {% if printer.toolhead.homed_axes != "z" %} # conditionally home Z 353 | G28 Z 354 | {% endif %} 355 | G90 # absolute movement 356 | G1 Z25 F1200 # Move bed to 25mm below nozzle 357 | G91 # relative movement 358 | {% endif %} 359 | # Reset extruder position 360 | G92 E0 361 | G1 E5.0 F300 # extrude a little 362 | G1 E-55 F{ 10 * 60 } # perform the unload 363 | G1 E-55 F{ 5 * 60 } # finish the unload 364 | RESTORE_GCODE_STATE NAME=UNLOAD_state 365 | {% endif %} 366 | 367 | [gcode_macro PID_Hotend] 368 | gcode: 369 | {% set T = params.T|default(205) %} 370 | PID_CALIBRATE HEATER=extruder TARGET={T} 371 | 372 | [gcode_macro PID_Bed] 373 | gcode: 374 | {% set T = params.T|default(60) %} 375 | PID_CALIBRATE HEATER=heater_bed TARGET={T} 376 | 377 | [gcode_macro TRAM_BED] 378 | gcode: 379 | {% if printer.toolhead.homed_axes != "xyz" %} 380 | G28 381 | {% endif %} 382 | BED_SCREWS_ADJUST 383 | ``` 384 | 385 | ## Moonraker 386 | 387 | This is SBC specific, depending on your install layout. Mine is in `/home/pi/ghost6`. I run avahi-daemon so I can use a `.local` domain for my printer. 388 | 389 | ```yaml 390 | [server] 391 | # Bind server defaults of 0.0.0.0, port 7125 392 | klippy_uds_address: ~/ghost6/comms/klippy.sock 393 | 394 | [announcements] 395 | subscriptions: 396 | mainsail 397 | 398 | [authorization] 399 | cors_domains: 400 | http://ghost6.local:7125 401 | trusted_clients: 402 | # Enter your client IP here or range here 403 | 192.168.0.0/24 404 | 405 | [file_manager] 406 | enable_object_processing: False 407 | 408 | [history] 409 | 410 | # Enable OctoPrint compatibility for Slicer uploads 411 | # Supports Cura, Slic3r, and Slic3r dervivatives 412 | # (PrusaSlicer, SuperSlicer) 413 | [octoprint_compat] 414 | webcam_enabled: False 415 | 416 | [update_manager] 417 | refresh_interval: 168 418 | enable_auto_refresh: True 419 | 420 | [update_manager mainsail] 421 | type: web 422 | channel: stable 423 | repo: mainsail-crew/mainsail 424 | path: ~/ghost6/mainsail 425 | ``` -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # FlyingBear Ghost 6 2 | 3 | This 3D printer is an affordable Core XY option. I documented my assembly steps with additional information to supplement the manual, this may help those looking to make upgrades. 4 | 5 | ![Front photo of FlyingBear Ghost 6 with a filament spool on the left](https://cdn.shopify.com/s/files/1/0589/7352/0045/products/01_f026b7af-a317-4852-a214-f21e87a4394c_1800x1800.jpg) 6 | 7 | **Sections** 8 | 9 | - [Motherboard](#motherboard) 10 | - [Firmware](#stock-firmware) 11 | - [PID tune](#pid-tune) 12 | - [Hot-end](#hot-end) 13 | - [Z Stop](#z-stop) 14 | - [PTFE Tube](#ptfe-tube) 15 | - [Upgrades](#upgrades) 16 | - [Klipper](#klipper) 17 | 18 | [Nathan Builds Robots](https://www.youtube.com/@NathanBuildsRobots) posted a [review of this machine](https://www.youtube.com/watch?v=OnHAltxwU58), including some upgrades to the power connections and heat-break. I used this as a springboard of items to check when assembling my own Ghost 6. 19 | 20 | ## Motherboard 21 | 22 | As of March 2023 FlyingBear appear to ship the Ghost 6 with fork connectors on the power cables, a welcome change from tinned wires as seen in NBR's review. 23 | 24 | ![A picture of the Ghost 6's motherboard showing the power cables screwed into terminal blocks with fork connectors installed](images/mks_terminals.jpg "Fork connectors installed from factory") 25 | 26 | The motherboard is a [Makerbase Robin V3.1](https://www.makerbase.store/products/makerbase-mks-robin-nano-v3) (OEM Nano4 variant?) with four soldered stepper drivers and a socket to install an additional driver. The processor is a 32-bit single-core [STM32F407VET6](https://www.st.com/en/microcontrollers-microprocessors/stm32f407ve.html) running at 168Mhz. 27 | 28 | ![Overhead close up of the Makerbase Robin Nano V3.1 motherboard showing the STM32 processor, stepper drivers and UART pins next to the processor](images/mks_nano4.jpg) 29 | 30 | This board ships running Marlin 2.x but also supports RepRapFirmware (RRF) and Klipper. Firmware images are available from the Makerbase [Nano V3 Github repository](https://github.com/makerbase-mks/MKS-Robin-Nano-V3.X#firmware). 31 | 32 | The electronics bay, the noisiest component is the 60mm fan cooling the motherboard. The PSU fan is temperature controlled and only runs when needed. 33 | 34 | ![A side view of the printer with the metal panel removed to reveal the electronics bay that contains the motherboard, power supply and cabling](images/elec_bay.jpg) 35 | 36 | It's encouraging to see the frame has been grounded with a 16AWG earth wire (bottom left). 37 | 38 | This is a low profile [6010 fan](https://3dflyingbear.com/collections/ghost-6-parts/products/ball-bearing-fan-6010-for-3d-printer-ghost-6-5-4s-4). The noise it emits is exacerbated by it's close proximity to the metal side panel. 39 | 40 | ![A picture of the offending 60mm 24V fan](images/60mm_noisy_fan.jpg) 41 | 42 | Ghost 6 [wiring diagram (PDF)](https://drive.google.com/drive/folders/1w9E5SNaONkKEqfmt8eS9ygdIeusIUjcJ), provided by FlyingBear: 43 | 44 | ![Diagram of Ghost 6 components and how they're wired from the motherboard](images/wiring-diagram.png) 45 | 46 | A closer look at the MKS Nano4 V3.1 wiring: 47 | 48 | ![Photo of the MKS motherboard wired up](images/mks_nano4_v31.jpg) 49 | 50 | ### Stock firmware 51 | 52 | Connecting to the printer via serial console over USB allows us to retrieve the firmware settings. I used Pronterface as a serial terminal client. 53 | 54 | `M115` 55 | 56 | ``` 57 | FIRMWARE_NAME:Marlin 2.0.9.2 (Nov 11 2022 12:40:55) 58 | SOURCE_CODE_URL:github.com/MarlinFirmware/Marlin 59 | PROTOCOL_VERSION:1.0 60 | MACHINE_TYPE:3D Printer 61 | EXTRUDER_COUNT:1 62 | UUID:xxxx-xxxx-xxxx-xxxx-xxxx 63 | Cap:SERIAL_XON_XOFF:0 64 | Cap:BINARY_FILE_TRANSFER:0 65 | Cap:EEPROM:1 66 | Cap:VOLUMETRIC:1 67 | Cap:AUTOREPORT_POS:0 68 | Cap:AUTOREPORT_TEMP:1 69 | Cap:PROGRESS:0 70 | Cap:PRINT_JOB:1 71 | Cap:AUTOLEVEL:0 72 | Cap:RUNOUT:0 73 | Cap:Z_PROBE:0 74 | Cap:LEVELING_DATA:0 75 | Cap:BUILD_PERCENT:0 76 | Cap:SOFTWARE_POWER:0 77 | Cap:TOGGLE_LIGHTS:0 78 | Cap:CASE_LIGHT_BRIGHTNESS:0 79 | Cap:EMERGENCY_PARSER:0 80 | Cap:HOST_ACTION_COMMANDS:0 81 | Cap:PROMPT_SUPPORT:0 82 | Cap:SDCARD:1 83 | Cap:REPEAT:0 84 | Cap:SD_WRITE:1 85 | Cap:AUTOREPORT_SD_STATUS:0 86 | Cap:LONG_FILENAME:0 87 | Cap:THERMAL_PROTECTION:1 88 | Cap:MOTION_MODES:0 89 | Cap:ARCS:1 90 | Cap:BABYSTEPPING:1 91 | Cap:CHAMBER_TEMPERATURE:0 92 | Cap:COOLER_TEMPERATURE:0 93 | Cap:MEATPACK:0 94 | ``` 95 | 96 | `M503` 97 | 98 | ```gcode 99 | echo:; Linear Units: 100 | G21 ; (mm) 101 | echo:; Temperature Units: 102 | echo: M149 C ; Units in Celsius 103 | echo:; Filament settings (Disabled): 104 | echo: M200 S0 D1.75 105 | echo:; Steps per unit: 106 | echo: M92 X160.60 Y160.60 Z800.00 E405.00 107 | echo:; Max feedrates (units/s): 108 | echo: M203 X200.00 Y200.00 Z4.00 E45.00 109 | echo:; Max Acceleration (units/s2): 110 | echo: M201 X1500.00 Y1500.00 Z100.00 E2000.00 111 | echo:; Acceleration (units/s2) (P R T): 112 | echo: M204 P1500.00 R3000.00 T2000.00 113 | echo:; Advanced (B S T X Y Z E): 114 | echo: M205 B20000.00 S0.00 T0.00 X15.00 Y15.00 Z0.40 E2.00 115 | echo:; Home offset: 116 | echo: M206 X0.00 Y0.00 Z0.00 117 | echo:; Hotend PID: 118 | echo: M301 P11.58 I0.61 D55.36 119 | echo:; Bed PID: 120 | echo:echo: M304 P103.73 I17.06 D420.46 121 | echo:; Power-loss recovery: 122 | echo: M413 S1 ; ON 123 | ``` 124 | 125 | > I was **not** able to read or set the driver current with `M906` ([Marlin docs](https://marlinfw.org/docs/gcode/M906.html)), most likely because the MKS Nano4 board uses TMC-2225 stepper drivers that aren't supported. The stock firmware returns 'Unknown command'. 126 | 127 | ### PID Tune 128 | 129 | While I had a serial console session active, I took the opportunity to PID tune the hot-end and bed. 130 | 131 | - Hot-end (200C): 132 | `M303 E0 S200 C6 U1` 133 | - Bed (60C): 134 | `M303 E-1 S60 C8 U1` 135 | - Save to EEPROM: 136 | `M500` 137 | 138 | I encountered some errors after PID tuning using `U1` but the PID values had updated and just required saving (`M500`). 139 | 140 | ## Hot-end 141 | 142 | I disassembled the hot-end enclosure to inspect the heat sink and heat-break dimensions. This printer has a PTFE lined hot-end that runs down to the nozzle. As with other printers like the Ender 3, this limits the print temperatures to 240C as above this the PTFE tube burns. 143 | 144 | I have tested the stock extruder and hot-end [flow rate performance](flow.md). 145 | 146 | The heat-break can be swapped out. It is a [Chimera](https://www.aliexpress.com/item/1005001728155269.html) style, M6 threaded bottom that screws into the heater block and a smooth J-head M7 throat that inserts into the cold-end heat sink (Aokin sell a cheaper [bi-metal TA-C smooth short](https://www.aliexpress.com/item/1005004234162702.html) variant). 147 | 148 | ![View of digital calipers and a de-installed cold-end heat sink on a desk, shown from the underside with the filament path visible where a heat-break could be inserted](images/cold_end.jpg) 149 | 150 | The heat sink attachment in the yellow plastic hot-end enclosure appears bespoke. If you purchase an aftermarket alternative, you may need to drill and tap some M3 holes in the top of the heat sink near the perimeter to install it. 151 | 152 | ![Digital calipers showing a spacing of 12.34mm between M3 bolts screwed into the top of the aluminium cold-end heat sink either side of the filament path hole in the centre](images/heatsink_screws.jpg) 153 | 154 | ## Z Stop 155 | 156 | I found my Z stop micro-switch was not level from factory. This was easily remedied as it is mounted on a plate fixed with two bolts (circled in red), screwed into the rear panel of the frame. 157 | 158 | ![A view across the print bed showing the rear inside of the Ghost 6 where the Z stop switch is mounted between the Z axis lead screw and left hand side linear rod. The Z height stop position can be adjusted by rotating a ridged plastic cap mounted on a screw enclosed by a spring and washer](images/z_stop.jpg) 159 | 160 | The Z stop plate bolts can be loosened from the rear of the machine. 161 | 162 | ![A picture of the rear of the Ghost 6, showing two bolt heads circled in red that adjust the level of the Z stop plate that micro switch is mounted on](images/adjust_zstop.jpg) 163 | 164 | ## PTFE Tube 165 | 166 | When installing the PTFE tube from the frame edge to the extruder I checked the tube dimensions versus some Capricorn and Creality ender 3 tubing. The factory tubing appears to match Capricorn inner and outer dimensions. 167 | 168 | ![Three PTFE tubes held in pliers facing the camera end on, to compare the inner and outer diameters. Ghost 6 tube on the left, after-market Capricorn tube centre and Creality ender 3 tube on the right. The Creality tubing is noticeably larger in inner diameter](images/ptfe_compare.jpg) 169 | 170 | This printer has a direct drive extruder, slack in tube's filament path before reaching the extruder does not affect print quality versus Bowden configurations where the PTFE tube sits between the extruder and hot-end. 171 | 172 | ## Slicer settings 173 | 174 | I use Cura 5 to slice models. There is no Ghost 6 profile (at the time of writing) so I selected Ghost 5 and modified the print bed size and Z height (255 x 215 x 215 XYZ). 175 | 176 | Notable changes to date (PLA): 177 | 178 | - Retraction distance: 0.3mm (down from 6.5mm) 179 | - Minimum extrusion distance: 1mm (down from 10mm) 180 | 181 | Not a slicer setting but a Marlin change, disable power loss recovery that writes to the SD card at every layer, causing pauses during printing: `M413 S0` 182 | 183 | ## Upgrades 184 | 185 | ### Relocate the Power Supply 186 | 187 | To create space in the electronics compartment, the PSU can be relocated to the underside of the printer. This requires taller feet, those TPU feet shown below are temporary. I plan to print a voron style skirt for my Ghost 6 and raise the printer by 60~70mm. 188 | 189 | Without modification the bottom clearance is 19mm. 190 | 191 | The Ghost 6 ships with four holes in the bottom plate, these can accommodate M6 bolts allowing DIN rails to be attached. I installed mine across the underside. This allows components to be installed without adhesives or cutting holes in the original frame. The picture below shows the left hand side of the Ghost 6, with the door facing to the right. 192 | 193 | ![Underside of the Ghost 6 showing two DIN rails attached with M6 bolts](images/din_rails.jpg) 194 | Initially I installed two DIN rails. Only the power supply needed relocating, the remaining components can live in the electronics compartment. 195 | 196 | ![Ghost 6 placed on it's rear panel to show the underside of the printer. A DIN rail is attached to the frame and a PSU is mounted on the rail. Temporary blue TPU feet have been installed to provide sufficient clearance for the PSU](images/psu_relocate.jpg) 197 | 198 | I happened to have a spare Meanwell LRS 350 PSU, from a previous printer, that I'd modified with a 90mm noctua fan for near silent operation. 199 | 200 | ### Klipper 201 | 202 | Having moved my power supply to the underside of the printer, I could then accommodate a [single board computer](orange_pi_z2.md) to host klipper. I have posted my [Ghost 6 klipper configuration](./klipper.md) for others to use. Please run your own PID, retraction and pressure advance calibration. 203 | 204 | Robin Nano 4 `make menuconfig` settings if using UART pins for RX/TX communication: 205 | 206 | ![image](https://github.com/user-attachments/assets/2c126afc-67fc-41a7-b758-40c68a9d1f23) 207 | 208 | To flash your Robin Nano board with klipper, follow the [klipper installation](https://www.klipper3d.org/Installation.html) instructions. After producing a `.bin` file, rename it from `klipper.bin` to `robin_nano_4.bin`. Place the bin file on an SD card and power up your Ghost 6. 209 | 210 | ### Bi-metal heat break and hardened nozzle 211 | 212 | The original hot-end assembly weighs 39g, the lower X carriage weighs 97.7g, totalling ~137g not including the extruder (that probably weighs more) and top assembly housing the linear bearings. 213 | 214 | ![Stock hot-end assembly including cold-end heat sink, PTFE tube, heater block, heater cartridge, thermistor and brass nozzle](images/hotend_assembly.jpg) 215 |

The hot-end assembly

216 | 217 | ![Injection moulded carriage placed on a scale reading 97.69g](images/lower_carriage.jpg) 218 |

Lower X carriage that houses a break out board, fans and the hot-end assembly

219 | 220 | I'll need to retain the cold-end heat sink, the top is attached via custom placed M3 threaded holes instead of a J-head like many V6 hot-end printers. 221 | 222 | ![Cold-end heat sink placed on scales reading 15.9g](images/heatsink_weight.jpg) 223 | 224 | My [TriangleLabs CHC hot-end](https://www.aliexpress.com/item/1005002781227348.html) with nozzle weighs 20g. This upgrade will save a negligible 3g (36g vs 39g), allow print temperatures above 240C without burning the PTFE tube and be able to print abrasive materials without wearing the nozzle. 225 | 226 | ### Acrylic side panels 227 | 228 | Not a print quality upgrade but a quality of life one. I opted for light smoke acrylic side panels to increase the light inside the printer and to provide an easier view of print progress. 229 | 230 | ![Ghost 6 with smoked acrylic side panels and the chamber flood light turned on](images/acrylic_sides.jpg) 231 | 232 | As you can see from the photo, my panels are perhaps 1mm too narrow. If ordering your own, I recommend 342 x 315mm sized sheets. I drilled M3 (3.5mm drill) holes and attached using pre-existing mount points. 233 | 234 | Tip: to position your drill points, remove your metal side panels and lay your acrylic on it to mark the hole locations. 235 | 236 | ## Next 237 | 238 | I have some other modifications planned. I'll update these notes in due course but am happy with the quality of the hardware, particularly at this price point. 239 | 240 | # Useful Ghost 6 repositories 241 | 242 | - [Tom Tomich's Ghost 6 repository](https://github.com/Tombraider2006/klipperFB6) (Russian) 243 | - [Technarrus klipper config (Orange Pi 3 LTS)](https://github.com/Technarrus/Klipper_FBG6) (Russian) 244 | --------------------------------------------------------------------------------