In prusa slicer, I've set my color change gcode to let me insert nuts, magnets or anything else into a print with the G1 and M0 commands. This little bit of gcode will present the current print as if it were finished for 3 minutes before pulling it back in to complete it. It's very basic, but it works. G1 X0 Y220 ;Present print for objects to be inserted M0 S180 ;Resume print after 3 minutes
PrusaSlicer actually supports doing this -- pause at a specific layer, and wait until you press the button/knob before continuing. I've used it quite a few times to insert magnets or other "vitamins" into a print partway through.
G4 S180 do the trick also. G4 = Dwell, followed by P for miliseconds and S for seconds how long the machine should wait. The difference between M1 and M0 is that with M1 u can put a condition into the G code telling tha machine if it should care about the M1 or move on (Conditional stop) whilst with M0 the machine will always stop (unconditional stop) However from what I see this does not work on 3D printers, probably because M1 is mostly used with manual programming of CNC machines for test runs to avoid possible tool crashes on the first run and then when u seee the program runs properly u simply disable the condition and the machine will then ignore the M1 command and just continue. Like a debugging breakpoint in general programming. This is obviously not needed on 3D printers as there is no possibility for tool crashes like that and so only M0 is used here. M1 will maybee work as well (although it says deprecated on the Marlin page for M1) but u can I guess not put a stop condition in anywhere and so M1 and M0 will mean exactly the same to Marlin = unconditional stop.
Knowing a few lines of gcode is super helpful to make the machine do non-printer things too... for example, I needed to clean some small parts so I put them in a small container of cleaning solution on the printer's bed, then wrote a bit of code to heat up the bed and shake it around for a couple hours. Instant agitating hot plate. I also have my printer play a distinctive tone just after it completes waiting for heater temperatures, so I'm warned before it starts moving (I have a bad habit of sticking my fingers in there).
Same, I set a beep after the bed leveling (I do a 4x4 grid) is done, so I can clean up the filament purge if it wanders into the print area, and 3 beeps at the end to signal it's done.
I like your heat/agitation cleaning idea. Another one I thought of is to use the heated bed to precisely warm up a smartphone before attempting to remove the screen, which is glued in. I also used the heated bed to accurately determine the minimum temperature difference that would keep my Kontax low temperature Stirling engine running.
I do an M300 & M0 after heating but before homing. I have an annoying habit of leaving an empty plate of food, a tool or just junk on bed of my printers (all on Octoprint).
I used it to heat up chocolate to melt and then reduce to the exact temp needed for tempering. 3d print a mold, vacuum form the 3d print and then make chocolate bars, chocolate coins, or chocolate Grogu. LOL
"The number one ocomplaint I hear is that you guys don't have a Micro Center near you"... Well, a new Indianapolis store is still the wrong continent, lol!
@@Julia________ I feel your pain. Since Brexit, it's easier to order things from China than bother with the EU. Shame really, so many EU companies went "do not ship to Britain" after Brexit. Has improved some, a lot of companies started shipping again, like Prusa!
IMPORTANT NOTE FOR ENDER 3! The ender 3 saves firmware changes to the SD card, which includes PID tuning values. If you have multiple sd cards you need to have these changes on all cards, so I just stick with 1 sd card. I had a hell of a time figuring out why my printer kept under extruding after repeatedly calibrating e-steps, and it was because I was swapping sd cards. Edit: this is for all I know only for the v2 and other models running the same board.
I have multiple sd-cards, but I use git to version control the contents, to keep them all in sync. My process is quite simple... When I switch to a different card, I pull the changes from it's remote before adding new designs. After a successful print, I pop the card back into my PC, commit the changes and push the changes back to my remote, so it's up to date for the next time I need to switch cards. Not only does this mean I have a record of all of my prints, it also means I have a record of how all of my settings are changing, over time.
@Dylan Lasky : I read this and thought "I've never had that problem... what's he talking about!" Then I realised that I have only ever used the same SD card for my file transfers! 🥴 I don't think a lot of people are aware of this... thanks for the "heads up".
I had the problem that the I only inserted the SD card that came with my printer into my printer twice (enough time to run the benchy) before it died, and I lost everything on it. As I hadn't even considered this as a risk, I hadn't backed up the card before doing anything with it. This made me rather more paranoid about my printer SD cards than I might otherwise be. *8')
When you start to get into the M commands you should specify what Gcode dialect you are using. M302 will work with Marlin, but might mean something completely different on another firmware, or for a laser engraver, or a CNC mill.
So fun fact about the beeps. Its built into the firmware on the ender 3 that it just ignores the frequency. I compiled my own firmware from a community made one and it will totally change tones. I have it play the FFX fanfare at the end of prints.
Probably the best G-code overview I have ever seen. ( I used to use G-code quite a lot with CNC, but I haven't really had to mess with it for 3D printing that much. Thanks for a great video.
Glad Microcenter is still sponsoring you - makes me even more likely to just head to the nearby one in Long Island instead of buying elsewhere online. Also, this video was fun and now I will definitely mess with PID!
Note that g code is not universal, the specifics of the M codes in particular will differ between firmware projects, but I assume these are for Marlin which is the most popular. I think most of these but not all work with my old Sailfish-based printer (when piped through gpx, which is kind of like an early thing like klipper)
Thank you, love your vids. I am a Machinist (30 years) and use g-code on a daily bases. It is great to understand a few of the basic codes to fine tune your printer. I used it to fine tune my filament change process. Thanks again.
Another really useful gcode command is M0 (wait for user)... Waits for user to press confirm button on printer. It is very useful for scripts and after pre-heating. I also found it very useful for doing a levelling routing where the printer moves to directly over each adjustment wheel at 0.25mm (thickness of a metal ruler I have).
M0 doesn't work on some newer boards... Replace with M25.. The printer will pause and you need to press the encoder wheel and select "resume print". It took me a while to work this out after updating to a 32 bit board.....
Sadly, some firmwares don't support M0 or M25, and may even be different between different models in the same range. I bed levelling script for the Ender-3, using M25 commands, completely ignored them on my Ender-3 V2.
Haven't come across that. I tend to keep my printers well up to date in firmware, but I compile my own Marlin for all my printers (even the Fabricator Mini) so that may be a factor!
@@balls2bone It May be just the creality 32 bit board for the Ender 3 as my copymaster 300 still obeys M0. I compiled the copymsster code but the ender 3 is stock as supplied with the board. M25 is a workaround. I am certainly not suggesting M0 has stopped working for all printers.. Respect...
For sounds it depends on which buzzer is used. It can be active (making sound right after you connect power, no frequency control) or passive (you have to do some PWM to make it sound, therefore you can control frequency). Prusa uses passive one! So you can Google for some gcode melodies and put them in your end gcode. So printer can play an Imperial march if you want.
My fav command is M810 to M819. the Macro slots. they let you combine common groups of commands in to one line. i do a lot of manual editting of my gcode out of the slicer. I just recently added M808 to my firmware, which is looping. since i dont have a CR-30 treadmill style printer, i use some ending gcode to slap the part off the bed with the X gantry and then restart the gcode. between M808 and M810 for my "reset extruder axis" and M811 for my "go in to rel positioning, move the z axis up one layer, and go back in to abs pos" i can print "forever" on my ender 3 pro. in conjunction with filament sensors it could run forever with minimal interaction. my next project is definitely going to be a filament splicer, so i can just load rolls of filament and print parts literally forever lol.
I found this G-code online but its really helpful for auto bed leveling ( I was having an issue where the nozzle would ooze during the probing and cause the prints to not lay down a consistent first layer) M140 S80.0 ; Set Heat Bed temperature M190 S80.0 ; Wait for Heat Bed temperature M104 S160; start warming extruder to 160 G28 ; Home all axes G29 ; Auto bed-level (BL-Touch) G92 E0 ; Reset Extruder M104 S245.0 ; Set Extruder temperature G1 X0.1 Y20 Z0.3 F5000.0 ; Move to start position M109 S245.0 ; Wait for Extruder temperature I print using PETG so 160c is warm enough to not ooze but also doesn't take too long to heat up the rest of the way. As long as you set up the Z offset with a fully heated nozzle, the probing can start as soon as the bed is up to temp. It also heats up the rest of the way in the starting position so as soon as it get there, it lays down the purge line (any oozing during the heat up wont cause any issues) Made my ender 3 into a start it and forget it type of machine!
To heat both extruder and bed at the same time, but not proceed until both are up to temperature, use all four temperature commands: M104 S200 ; start heating the extruder and continue M140 S60 ; start heating the bed and continue M109 S200 ; wait for the extruder to reach temp M190 S60 ; wait for the bed to reach temp Much more efficient than waiting for one to heat and then the other.
You could maybe calculate the time taken to heat each element, then do the following: M190 S55; calculated intermediate bed value M104 S200; start heading extruder and continue M190 S60; finish heating bed M140 S200; finish heating extruder
As long as your power supply has enough juice to do it and not trigger thermal runaway protection (which might trip if progress isn't being made fast enough), and if it won't trip a fuse or over current protection in your printer I have noticed that there are definitely better and worse patterns for heating up my old Replicator 2x: I think it heats one thing up part way, heats the other most of the way, then does "heat both the rest of the way"
@@WindyLion That's pretty much what I do, and it's easy to see whether you need to tweak the intermediate set point by looking at the temperature graphs (one of the reasons I love my Octoprint).
@@WindyLion I have my start GCode in Klipper and I'm calculating 90 % of the bed temp for 60 °C and 99.6 % for 100 °C (and linearly between those temperatures - it is good enough). Just after I reach this temp, I start heating nozzle and the rest of the bed temp. This way both heaters are finished almost at the same time.
G code is something I look at everyday at work with my Mazak's, Chiron's, Okuma's, SNK's, etc. But, when I started 3D printing, some of these codes threw me off a little. It's been a great love hate relationship, but the same reason I love my job is the same reason I love printing. Keeps my brain busy and learning something new everyday. Thank you for your channel, and everything you offer the community.
Good introduction! In terms of Marlin development I always try to emphasize the philosophy of keeping the firmware "dumb" so it will be obedient to our commands and not try to do anything too creative. The real smarts are behind the scenes and deal with the things we don't want to worry about: decidng how best to carry out movement commands efficiently, following the contours of the mesh, keeping temperatures stabilized, and so on. Let the slicers and other G-code generators do the truly creative stuff.
If you've got a printer that's pimped out with LED attached to the control board the G-Code for turning on/off or adjusting the color of the lights if they support it can be fun to play with. Flashing the lights a couple times after a print is done can draw attention if you don't want to use the beeper for that.
You forgot one super useful command to know about: M0 - Unconditional stop It will pause execution of any further commands until input (encoder wheel or touchscreen) is pressed. it also has text display part like M117 so you can use it (especially with M300 beeper) to pause print when you need to insert some nuts or magnets that are meant to be fully encased
If you ever get a move out of range error when using Klipper it's normally because of absolute/realtive mode is wrong for X/Y/Z (G90 vs G91) or the extruder (M82 vs M83). It's a very common error people run into when writing macros for Klipper. To confuse matters even more some slicers let you set if gcode is generated in relative or absolute mode as well. Best way is to check what the current mode is, for example the variable printer.gcode_move.absolute_coordinates will be true if in absolute mode for X/Y/Z moves.
I've been using repetier host since 2013 and its amazing how well the program has worked even with all the innovations in the 3D printing space. Usually I use it for troubleshooting any sort of kinematic issues or bed level issues.
I think you have missed the pause/unpause commands M600/M601. Useful for inserting stuf in 3D prints or for manually changing filament. One problem with this command (at least on smooothie) is that it turns off heating, which is especially bad for bed heating mid print.
I've got two custom gcodes loaded into start G-code in prusa for my Ender 3 S1 (just below G28). G28 ; home all axis M420 S1 ; ensures the 16 point mesh from the probe is actually used for the print M413 S0 ; prevent writing to the sd card after each layer which can potentially make blobs on your print
About a month ago I started training on a new machine at work. It is a 30 ton CNC press and we fabricate high precision Sheet Metal, assemblies and products and I was pleasantly surprised when I saw the computer programming and it was the same exact thing I run my hundred dollar 3-D printer with.
M300 and M117 could be used for diagnostics, in conjunction with the registers (i.e. Out of Work Area error could list what position it is trying to reach using an M117 code and then use an M300 code a couple times) One set of absent codes is the G2 and G3 commands, which does Circular Interpolated movements. G2 is Clockwise, G3 is Counterclockwise.
G2/G3 reduce the size of the G-code and the stutters incredibly. Arc Welder for Cura is highly recommended in my opinion to make use of this, sadly not all printers support it. I find it quite dumb honestly, very few cases are so starving of storage that you should disable it. Another one that takes some effort to use effectively but is pretty incredible is M486 - cancel objects. With the appropriate post-processing script on Marlin, you can separate a multiple object print into individual parts entirely, and cancel each one individually if you see need. The only time it doesn't work is with supports. If the support starts to fail on one part, you'll have to live with it and cancel everything or let it be, as Cura adds the Z change line right at the start of a support structure code if it has that.
M300 & M117 are super handy for debugging, and having the machine communicate what is up. I have several machines in the next room over from my work area. Each has different tune it plays at the end of a print to let me know which machine just finished. M600 for manual color changes is super handy for basic color swaps on just a couple layers. Sadly and frustratingly Bambu machines have no serial interface and no support for M300, M117, or M600.
M and G code is were I started in programing For FANUC CNC controllers 25 years ago, the thing that has got better is the GUI or interface software on computers to build the gcode file, Computer power and graphics cards have grown alot. Thanks for the video !
The only G-code command that caught my attention over the years is M600, filament change, for simple but very effective multi-filament/colour prints. I discovered that PETG & TPU can stick together in these multi-filament prints, but still haven't yet figured out any designs which could benefit from being part TPU & part PETG.
@@timothymack7435 Yes that's a good one, like feet for a printer you could have the first layers in PETG with holes for screw mounts, with the rest in TPU for the actual feet part for dampening.
Also G2 is important, that's an arc move. This can help reduce stuttering especially for 8-bit motherboards, since it doesn't have to do many tiny G1 moves. The Arc Welder extension for Cura will do this automatically if you install it through the software marketplace and enable it in Special Modes. It'll also make smoother curves in your prints and reduce gcode file size.
Thank you for this video. In the begining of 3D printing, it was almost required to know at least the basics of G Code. Brings back the memory... Or when the EEPROM wasn't implemented, and you had to tune your axises, and then reflash your board.
4:15 You definitely want to prevent the USB from powering the printer. A tiny piece of electrical tape over the 5V line on the USB connector can block the power. Or you can cut a USB cable open and reconnect all of the wires except the 5V. If you have steady hands, another option is to desolder the 5V connection of the port on the printer's mainboard. It's a design flaw in some printer brands' USB implementation, which should be data only. There are multiple reasons why it's a bad idea -- you're basically giving 2 independent 5V power sources (which may even be at different grounds) to the printer's mainboard. Usually it'll be fine, but it could easily kill the printer mainboard (less likely, but it could even bite your PC's USB port or motherboard).
:) All great info - think I'll start sharing this video with people as a great lead in to what else your 3dprinter can be programed to possibly do without much efforts! Keep up the awesome content!
Angus... a little "Whoopsy" I think. At 7:25 your mouth said "X 100" but your hand said "Z 100". I think your hand got it right. 😉 Another great video, thanks. Thinking back to the 1980's (That's something I can do that you can't.) I used to get a real kick out of successfully making my BBC Micro perform something that I had coded directly in machine language, rather than BBC Basic. I have found that making something happen as I predicted, using G-Code, can give me similar "warm fuzzies". Keep them coming. 👍
Good info. I started with Repetier when I had my PrintrBot Simple 1405 print 7 years ago. FYI Simplify3D (even the 3yr old version 4.1.2), UltaMaker Cura, PronterFace, Prusa (I believe via Octoprint), Slic3r all support a serial connection and limited control (speed and E-flow). I have Prusa recommend not to print via serial with the chance an errant command being sent. I have printed via my Mac using serial (Simplify3D 4.1.2) almost exclusively for 7 years and had no issues (99.98% serial, 0.02% SD card).
Seeing microcenter sponsorships always reminds me how damn lucky I am to have two of them pretty close to me (I’m in nyc) I always recommend the inland filament both the PLA and PETG+ (the only ones I’ve used so far) have given me 0 issues and print amazingly
P stands for proportional, I for integrating and d for differential. In short the p part has a linear feedback with an amplification factor which can be 0 to very big numbers. The Integrating part provides a feedback equivalent to the surface between the signal and the x axis of the difference between the setpoint and actual value. The D part outputs a signal equivalent to the rate of change of its input. These three are put in series and if you tune them just right and provide them with the right feedback, they will regulate whatever you want.
I'm a machinist and have been using g code for my entire life. Since getting into 3d printing, I've been wondering why printers don't utilize G2 and G3 arc commands. You could make a circle with one line of code instead of hundreds. My longest programs machining is about 200k of code. A simple 3d print of a toy was a few million. All because it only programs in linear commands. (A, J and, I command would be needed though). There are so many parameters that aren't being used. Anna what about, macros? Would a printer read it? Or the ability to pull up separate programs and run them within other programs. We should get together and blow the lid off printing. Right now it's so so basic.
Thanks. This will be really helpful as I work on making filament changes more automatic. If there is no filament in the printer, there is no reason to wait for the hot end to heat up before loading filament.
I'd recommend turning the power on while connecting to your printer. My Ender 3 has custom firmware installed, so my problems might not happen on your 3d Ender 3, but when I give it USB power and later turn on the Printer, all axies move at twice the configured speed and violently jam into the frame/buildplate (I actually lost a nozzle to this) I just learned to always turn on the power before connecting my PC or Raspberry Pi
A cool thing to do is: put some electrical tape on the 5V on a usb cable (those to make your cable longer, dont know how they are called in english), then the mother board only gets on when the power supply is switched on o:
The joke at the beginning about ChatGPT is funny, but honestly it's not far from the realm of possibility. You can represent a 3d object as a sequence of geometric arguments (point clouds, or curves, etc). And GPT models (General Purpose Transformers) are really good at working with long sequences of values or tokens. So it's entirely possible for someone to train a vanilla GPT model on mesh data, and the corresponding slicer G Code. And what you'd end up with is something that could take an arbitrary mesh, and render a (hopefully) optimized sequence of G Code steps for any machine to use. In fact, I'd be _very_ surprised if the major printer manufacturers are thinking about this as they iterate on their slicer designs and optimizations.
G Code to pause prints, maybe move to somewhere convenience, turn off nozzle heat to allow you to extract filament, then when your ready come back to temperature, extrude until new filament loaded (suitable amount purged), then stop, go back to where it left off even if you nudged it a bit while you were messing about and resume printing. Was going to try and sort out some G-Code to include to do all this on my Qidi X-Plus that I would insert at a particular layer height but, it all seemed a bit much so I have never tried it.
I recently compiled marlin for my ender 3 V2 with a bltouch and I discovered the "G35 tramming assistant" it helps you to level the bed probing on each corner
Pretty sure you can actually drain the battery if your laptop while connected to a printer via usb cable. I was helping my friend set up his Ender 3 Pro, (context: his laptop battery size/capacity is at or just about at the legal limit for here in the USA, and it’s in pretty good health), and in just about two hours it nearly completely drained his battery from about 90% to about 10%. We had Cura open & connected to the printer and his laptop was plugged into the Ender 3 Pro for most of the time, plus the ender was plugged into the wall (the laptop was running off battery power).
As a CNC programmer with 22 years of experience i can tell you its easy to get used to it. When i look at the G code i dont even see the code anymore.All I see is blonde, brunette, red-head. Hey, you uh… want a drink?
Another great and informative video. About Micro Center, unfortunately the closest to me is 85 miles away or 136.7 kilometers. Might go there someday. Again thanks for the video!
I did my Biqu B1 play the Super Mario tone when it finished a print with M300 very fun, while is useful because I can hear from the other room that my model is done.
Cool video 😊 At my makerspace, the printers (Enders) are set via Gcode to play their namesakes after print completion, things like Goldeneye and Mr. Bluesky... it's really wacky.
I seen to remember another RU-vidr directly blaming the IFlight blitz that was in a Nazgul pre build. Voltage issues. As far as I remember he got into a bit of a spat as it was a review unit. He also lost his GoPro because the voltage crapped out. For the life of me I can't remember who it was now.
Most excellent video!! You have a great talent for clearly and succinctly covering a topic. Is there a printable list link you can share that shows each g-code and its function? Great topic universally useful! Thanks!!!
I believe there is a command to power off machine. Useful at the end of a program with a long wait code for cooldown and then shut down if you won't be around when a print finishes
I was just starting to look into the M300 command for a custom 'Print is done' tone, so I'm by no means an expert, but could it be the S parameter requires higher values to be able to be heard (and maybe internally it defaults to some value if the value supplied is lower than the frequency us humans can hear)? So instead of M300 S200 you would use M300 S2000 or something? (Haven't tried it myself yet)
The number after S is the frequency in Hertz. 440Hz is middle C. Human hearing is roughly in the range 20Hz to 20000Hz. The stock (modified Marlin) firmware on (some) Ender printers apparently overrides the frequency so all M300 sequences play at the same frequency. If you install the full-featured Marlin (eg compile your own) your Ender can play different frequencies.
I used to run my Prusa for few weeks during pandemic when LCD broke, I was able to print using the PC to manually control the machine etc. Then the bed heater broke :D but the printer was still going strong but only with PLA , those were the times when I sued that link a lot, I did lost few prints because windows updates restarting PC when I was not there..
I like using M104 and M140 at the start of gcode so that it can home while heating, and then using M109 and M190 with the same setpoints before the first use of the extruder (purge and swipe) in case it wasn't done yet. Currently, homing is all that happens between start heat and wait-for-heat, so there's usually still a wait, but it's at least less than only using wait-for-heat instructions.
I think i'll add the M300 and M117 to some maintenance / test scripts like changing filament / purging, basically to notify when finished, or when needing any manual intervention. Will search marlin doc if there is some command for "wait button press" instead of calling STEP_1_...gcode, STEP_2...gcode scripts. update: seen another comment, apparently there is an M0 command for that :)
My understanding of disconnecting power to the printer while plugged into the board through the usb is for safety. Saftey being to prevent the printer from doing anything unexpected like turning on the bed or hot end.
Very valuable video here. I had the benefit of learning CNC prior to getting into 3D printing, so I had a foundational understanding of these concepts but the average person usually gets into this craft as a complete novice. I definitely learned a few things here and I still have loads to learn. Do you have any books that you might recommend to take a more in depth dive into the topic?
Yup, no interest digging into that when we have slicers and visual tools for this. Great if your modding you old printer to do something it wasn't built for. But mucking with this manually just isn't necessary.