Support Marlin Development
Since October 2014 I've had an obsession with Marlin Firmware , the open source code that runs most of the world's personal 3D printers . At that time the project seemed to be languishing without much activity, the code had become a bit messy and hard to maintain, and it was fragmenting into many distinct forks without much contribution back to the project, in part because it was hard to get anything through. As a huge fan of 3D printers and Marlin this really bugged me. So I started making regular contributions in my spare time.
I began with small cosmetic tweaks (such as a progress bar for character LCDs) but soon I was drawn deeper into the issue queue. And very quickly I became a very active developer on the project, doing several commits every week and spearheading a major cleanup of the code. Naturally the increased pace of change roused the community, and Marlin has become far more active and vibrant in the ensuing months. As a result of this new flurry of activity, the next release of Marlin is going to be truly awesome!
(SD sorting is experimental only.)
Unfortunately, as I have been spending my days working on Marlin, I've been neglecting other paying work that I might pursue (and, to be honest, I am quite burned-out on web development). So, at the height of Summer my resources are running out, and I may have to divert my attention to other work after all. But I would rather continue to get up and work on Marlin each day and keep the momentum going, at least until the 1.1.0 release, and hopefully beyond.
That's where you come in, RepRap Community! I'm trying to raise enough money to cover my modest living expenses, rent, and food so that I can continue to contribute my programming expertise and focus my efforts on this technology that I love so much.
I'm offering a few reward levels so you can have a token of my gratitude and some of my time to help with Marlin or other printing issues. Because everyone should build an i3 , I'm giving out Prusa i3 plastic parts (in natural and white PLA) to the first 6 Platinum donors. You'll thank me later!
Finally, as a tribute to all of my donors, I will be writing and performing a song to recount your support of Marlin and the replicating robots that changed the world, which I will post at a later date.
## A Special Thank You
Until recently I only had one humble printer to work with: Millie, my trusty self-sourced Prusa i3. But a few months ago, when I was struggling with delta code I received the donation of an inexpensive "Micromake" deltabot from a very nice guy in Japan, who also threw in a portable oscilloscope and a pair of extra RAMPS boards for good measure. They have all turned out to be very useful in moving Marlin forward.
So, to you, Katsumi, I say "Dōmo arigatōgozaimashita!"
## Your Mission, Should You Decide to Accept It…
Whenever we get a question, a feature request, or a bug report I try to make sure I fully understand the realm under discussion before I answer or take action. And yet, I always feel at some disadvantage, because once you go beyond the software logic there's a whole forest of micro-controller, electronics, engineering, and physics knowledge still just tantalizingly beyond my grasp.
So it was with some trepidation that I agreed to help build a printer that would use a second RAMPS board to manage a 4-stepper Z axis, controlling it remotely with some kind of serial connection. I knew almost nothing about building such a setup, but I was sure that I could figure it out, given enough time. Fortunately for me, Marlin had recently acquired a feature called EXPERIMENTAL_I2CBUS. So I decided to make use of it and see if it could do what we needed.
As it turned out, it was almost trivial. Once I was able to get the two boards talking to one another it was just a matter of coming up with a nice light protocol to send commands to the "slave" and request a status byte. In the process I found that the existing feature needed a lot of debugging, but once that was done it … just … worked!
Sure, okay, there was a lot of crashing at first. But I love when things ultimately go so well.
With this first flush of success, I'm excited to try using this method to do other tricks, like offloading all the movement handling and sensor management to a second board, so the main board can just deal with the high-level stuff including the LCD controller.
As soon as I find the time, I will post an article to the Marlin website ( http://marlinfw.org/) on this very interesting and useful topic.
## That Release I Keep Promising…
At the moment I'm just about to unleash 1.1.0-RC8 onto the world. I know, I know. It's hard to believe! There are just a couple of relatively minor bugs to work out, but –seriously– it will be out this week. And this is going to be the very last release candidate too. I'll make a formal announcement as soon as it's done and I will post to all the usual places.
## Documentation Time!
The next order of business, while we're getting your feedback on the release, is to fill out the documentation. The Marlin website is up and running at http://marlinfw.org/ but it's still very sparse. No one, it seems, likes to write documentation. And frankly, I don't blame them, especially when I'm the editor-in-chief. I'm a real stickler for concise and clear language.
They say a picture is worth a thousand words, and when it comes to technical documentation about 3D printing, we know it's true. It will really help a lot if we have good images and examples. And it will be even better if we can supplement the site with good videos on subjects like configuration, bed leveling, and calibration. I would personally love to see more of this kind of content. It makes our job a lot easier if we can refer users to good documentation when they need help.
## What's Next? Spoiler: 32 Bit!
Once Marlin 1.1 is out there, and while the documentation is taking shape, the next big task ahead of us is to get Marlin formally supported on 32-bit boards with ARM processors. There are a whole slew of 32-bit boards coming out, and we're currently in the process of acquiring some so we can start evaluating them.
There are already a couple of forks of Marlin that support Due and Duo boards. The best of the bunch will serve as our guideposts while we figure out the best way to structure the code and the Hardware Abstraction Layer (HAL). There's some talk of using a Real-Time Operating System (RTOS) too. I'll keep you posted as that takes shape!
## Personal Status
For the last 4 months I've been in Austin, Texas working with MakerArm to get their machine up and running with Marlin. If you haven't seen their Kickstarter, take a look! ( https://www.kickstarter.com/projects/1849283018/makerarm-the-first-robotic-arm-that-makes-anything) They're building a robust SCARA robot arm with changeable toolhead to perform a wide variety of functions — not only 3D printing, but laser engraving, CNC milling, foam cutting, and pick-and-place. It's an ambitious project, but well on track to deliver, and I'm really learning a lot. Much of the recent refinement of Marlin has been in reponse to their needs.
They're a nice group of smart people, and while as a Kickstarter they can't afford to pay me a king's ransom they have been great hosts, making sure I don't freeze or starve while I code my days and nights away. I was pretty despondent before I came here, but time and busy-ness have started to bring me back around. I feel more able to start steering my life again.
The MakerArm project is pretty much my whole life (apart from Marlin itself, of course), and it's going to require a lot more time. So I'm headed back to Portland, Oregon in a couple of weeks to collect my 3D printers and settle my affairs, then I'm relocating to Austin for a while, at least until the project is complete. After that, who knows? I keep dreaming of places closer to the sea, and I understand that Santa Cruz has a burgeoning robotics scene.
## As Always, Thanks for Participating
I'd like to give an extra-special thanks to all my patrons this month. Without you this project really would not be possible. As a result of this campaign I've met a lot of awesome makers, electronics gurus, 3D-printing enthusiasts, and people who are just excited and inspired by the potential of this emerging technology. I've said it before, and I'll say it again: It is you, the community, that keeps me coming back to the keyboard day after day to make Marlin better.
Keep doing what you do, and I'll see you in the virtual!
This pre-release is the result of 3 months concerted effort by our talented core developers and many generous contributors. RC7 fixes many issues, adds support for even more boards and peripherals, and continues to improve and refine existing features.
We're in the final stretch to 1.1.0 and planning to hold a "remote testing lab" over the next few weeks. Please join in the effort and help us track down any remaining issues. This is the best release of Marlin yet, and we want to make sure it's ready for the world!
Here's the full Change Log (hold onto your hats!)…
New / Updated Features
- Add M108 command to cancel M109, M190, and M303
- Add Print Job Timer and statistics (PRINTCOUNTER)
- Add temperature watch for the heated bed (WATCH_BED_TEMP_PERIOD)
- New Filament Change feature (FILAMENT_CHANGE_FEATURE)
- New advance extrusion algorithm (LIN_ADVANCE)
- Use a positive flag for Host Keepalive (HOST_KEEPALIVE)
- Add M999 S1 to restart without flushing the buffer
- Add CoreYZ support, fix CoreXY, CoreXZ (COREYZ)
- SINGLENOZZLE basic multi-extruder support
- Support for inches, Fahrenheit, Kelvin (INCH_MODE_SUPPORT, TEMPERATURE_UNITS_SUPPORT)
- Add error-checking of E parameter in M303
- Add S parameter to stay in place on tool-change. Example: T1 S1
- Add support for the Cartesio UI (BOARD_CNCONTROLS_12)
- Support for RigidBot V2 and its digipot (BOARD_RIGIDBOARD_V2)
- Support for Vellemann K8400 (BOARD_K8400)
- Add NOZZLE_CLEAN_FEATURE
- Add MIXING_EXTRUDER and SWITCHING_EXTRUDER
- Add P parameter to M302 (more like RepRapFirmware)
- Add EMERGENCY_PARSER to allow override commands
- Add a serial transfer buffer option (TX_BUFFER_SIZE)
- Dyze High Temperature Thermistor support (up to 500°C)
- Add X_DUAL_STEPPER_DRIVERS option
- Add NOZZLE_PARK_FEATURE
- Drop-in custom boot screens
- Add support for BLTouch sensor (BLTOUCH)
- Add DUAL_NOZZLE_DUPLICATION_MODE
- Add support for REPRAPWORLD_GRAPHICAL_LCD
Performance & Stability
- Fix an issue with sudden acceleration
- Suppress host keepalive during M109 / M190
- Prevent stuck M109 / M190 if a target temperature is changed
- Fix handling of UTF-8 characters in SD card filenames
- Fix long G2/G3 arcs blocking machine idle
- Don't allow setting auto fan pins in M42
- Improved performance in Delta movement
- Improvements for Dual X Carriage
- Less blocking in G2, G3, and G5
- Fix endstops default enabled state
- Fix position adjustment when switching extruders
- Fix issues with MAX31855 thermocouples
- Fix initialization of some arrays
- Reduce positional error, clear command queue on "Stop print"
- Fix M428 for compatibility with Delta and SCARA
- Beeps and tones no longer stall execution
- Prevent bad watchdog timeouts
- Add reporting of SD read errors
- Fix issues with Filament Runout Sensor
- Bring RUMBA pins file up to current methods
- Add a checksum to the EEPROM to detect errors
- Fix wait-for-cooling in M109 / M190
- Adjust software endstops, if needed, on tool-change
- Adjust wait-for-cooling timeout
- Broader support for filament runout sensor
- Optimizations for single-hotend setups
- Fix and improve print job timer and counter
- Fix write-to-file serial output
- Support for prints over 18h 12m 15s in the print counter
- Fix issues with G28 when T0 isn't the active tool
- Tweak planner acceleration constraint
- Add DELTA forward kinematics (to get XYZ from ABC)
- Optimize planner code with less float division
- Fix bugs related to the shifted coordinate space
- Add versioning to the configuration files
- Simplified language setting in Configuration.h
- Simplified probe configuration
- Simplified pins files
- Automatic assignment of X2, Y2, Z2 stepper connectors
- Clean up Delta configuration examples
- Remove support for XY servo endstops
- Generalize options that specify PLA and ABS
- Update BQ Hephestos 2 configuration
- Replace ENDSTOPS_ONLY_FOR_HOMING with ENDSTOPS_ALWAYS_ON_DEFAULT
- Change endstop-inverting options from const bool to define
- Sanity checking of safe homing, temp sensors
- Remove all #include from Configuration.h / Configuration_adv.h
Homing and Bed Leveling
- Fix curved movements in G29 for Delta
- Report current position to host after G29
- Require homing of Z before G29 bed leveling
- Allow using probe indices (I and J) with M421 Set Probe Point
- Fix servo probe raise in G28 and other non-leveling contexts
- Allow the use of probes without Auto Bed Leveling
- Fix curved movements in Allen Key deploy & stow
- Clean up Allen Key code, allow use on Cartesian machines
- Fix MIN_Z_HEIGHT_FOR_HOMING cumulative raising
- Major cleanup of homing and leveling
- Improved logging of homing and leveling
Mesh (Manual) Bed Leveling
- Improved Mesh (Manual) Bed Leveling
- Add MBL resting position after homing (MESH_G28_REST_ORIGIN)
- Keep Mesh Bed Leveling active when homing X, Y, or Z alone
- Allow Mesh Bed Leveling to work when homing to max Z
- Use Z_RAISE_BETWEEN_PROBINGS for Mesh (Manual) Bed Leveling
- Fix position adjustment for MBL when switching tools
- Improved axis movement from the LCD controller
- Use directional buttons on controllers that have them
- Option to reverse the encoder wheel (REVERSE_ENCODER_DIRECTION)
- Add individual axis homing to the LCD menu
- Don't display heated bed on Graphical LCD if no heated bed
- Fix LCD contrast adjustment range for different panels
- Support for SAV_3DGLCD OLED LCD controller
- Fix manual LCD movement with multiple extruders
- Show millimeters (not steps) moved in LCD babystepping
- Support VIKI2 display with RAMPS and MKS 1.3 / 1.4
- Add Printer Info and Printer Statistics to the LCD menu
- Improve static/scrolling LCD screens
- Show full kill screen (not just message line)
- All new beeper / speaker / buzzer code and tone queue
- Remove delay for small manual encoder axis moves
- Improvements for the RepRapWorld Keypad
- Updated Japanese language
- Updated Czech language
- Updated Portuguese language
- Updated Galician language
- Updated Polish language
- Updated Danish language
- Add Greek language (el, el-gr)
- Updated Italian language
- Add Croatian language
- Updated Spanish language
- Updated German language
- Fix Makefile for Melzi and Arduino 1.6.x
- Stepper, Planner, Endstops, Temperature as singletons
- Clean up the buildroot folder
- Optimize singletons with static data & methods
- Add a non-blocking delay function
- Add macros for moving servos
- Allow the use of a custom image to display at startup
- Cleanup of probing / leveling functions
- Add helper scripts to make working with Marlin and Git easier
- Additional patterns added to .gitignore
- Add generalized macros to initialize variable-size arrays
- Simplify thermistortables.h
- Fix M100 issues (M100_FREE_MEMORY_WATCHER)
- Make it easier to do formatted debug output
- Specify units (mm_s or mm_m) in feedrate variable names
- Rename ultralcd implementation files
- Cleanup to EEPROM read/write code
- Cleanup to stepper indirection code
- …and more code cleanup
Bug reports for Marlin 1.1.0-RCBugFix have been slowing to a trickle. This doesn't necessarily mean the firmware is free of issues, but it's a strong indicator that the most glaring bugs have been fixed. If the positive reports continue, version 1.1.0 could be ready within a week or two! (I'm confident it will be ready before July 1.) We have just a few minor behavioral bugs to patch, and then we'll tag a release 1.1.0-RC7 for public review.
Testers! Testers! Testers!
As always, we're looking for users to test and report their experiences. We need testing on a wide variety of robots, and for various updated features:
- Delta, SCARA, CoreXY, CoreXZ … and, yes, CoreYZ too!
- Updated Probe and Endstop configuration options
- Automatic Bed Leveling with a variety of probes
- Homing with a variety of probe and endstop setups
- Mesh (Manual) Bed Leveling
- M600 Filament Change
The more testing we can get on these features, the better! We've reworked several configuration options for this release, so we want to make sure that they're not too confusing (especially as we've been trying really hard to make them easier).
What We're Working On…
Roxanne is working on Unified Bed Leveling. This feature is a little too raw and untested to include in 1.1.0, but we're very excited to get it ready for 1.1.1. UBL will bring a convergence to all the leveling functions, so not only can we have Automated Mesh Leveling (which you can find today in Josef Prusa's Marlin for Prusa i3 MK2 code), but Manual Grid Leveling and Manual 3-Point Leveling as well!
Tool Change is another area where Marlin has long needed some fixing-up. With a recent patch the carriage now moves so the newly-selected tool is aligned to the current position. We're adding a new flag to the `Tn` command to leave the tool where it is. To select T1 without moving the carriage, just use the command "T1 S1". In other news, Tool Change will now properly correct the Z position when Mesh Bed Leveling is in use.
Andreas (aka Doctor Marlin) has been working hard on graphical display optimizations, one of his specialty areas. We should see some noticeable improvements in this release, which should be especially helpful for DELTA robots, which are especially demanding on the CPU.
The father-son team of Petr and Petr Zahradnik have been rewriting M600 Filament Change to bring some much-needed improvements to this procedure. The feature is completed for LCD displays with 4 or more lines. But it needs additional work to support smaller displays. I'm confident we can fix it up in time to include in 1.1.0.
Github user Sebastianv650 has been working on a new Advance Algorithm we're calling LIN_ADVANCE to replace our current "broken" ADVANCE feature. If you don't know what this does, a brief explanation. Basically, it decouples the extruder from the XY movement, so that extrusion can occur based on pressure and volume. The end-result is that you end up with less ooze at points of direction and speed change, such as sharp corners. This also means less ooze when stopping for layer changes, eliminating the "Z seam" that you often see in perimeters at points of layer change.
Lately my pet projects have centered on supporting the new generation of Multi-Extruders (SINGLENOZZLE), Single Stepper Dual Extruders (SWITCHING_EXTRUDER), and Mixing Extruders (MIXING_EXTRUDER). I'm especially excited about the Switching Extruder, which uses a single stepper motor, but switches which side of the stepper is being used to push filament. So the stepper just switches direction for the other extruder. Pretty cool.
Aside from that I'm spending most of my time fixing reported bugs, cleaning up the code, and helping to integrate patches. There's plenty to do, so I'm putting in about 5-8 hours each day to keep up with reports and make sure that pending patches don't fall too far behind as other patches get merged. It's almost like a real job….
That's all for this update. See you next time!
May 20, 2016
Hey Marlin fans… You might be wondering what I've been up to since the last update, since I've been pretty quiet on the social networks. So much new stuff… Let's get started!
New Release Imminent
Marlin has been getting a lot of testing since 1.1.0-RC6 was released a few weeks ago, and this has been a really good thing to help us catch the more subtle issues. Among the things we've been tracking and fixing:
- Z lowering improperly during M600 filament change
- Anomalous behavior in G29
- MAX31855 thermocouple read errors
- Mesh Bed Leveling issues with G28 and M421
All these issues are being addressed, and it looks like we should soon have them completely worked out in the "RCBugFix" branch. Some bed probing issues have been fixed by adding new probe types to the configurations, including a MECHANICAL_PROBE for probes (like those on TAZ machines) that use the nozzle itself as a probe. Mesh Bed Leveling also got a new option — to rest the extruder after G28 when MBL is enabled. The broken M421 (mea culpa!) has also been fixed.
We could use more testers for the MAX31855, as the proposed solution changes the SPI speed, something that affects all the devices on your SPI bus. It would be good to know if the solution is universal, or if some SD Card readers or other SPI devices can affect this.
SINGLENOZZLE and E3D Cyclops
One of the more common requests that we get is for the so-called "SINGLENOZZLE" feature, as found in the popular "MarlinKimbra" fork of Marlin. This allows you to use a multi-extruder —like the E3D Cyclops— which doesn't do proportional mixing, but does have 2 or more filament drives that you can switch between using T0, T1, T2, and T3 commands.
This feature has never been in the main Marlin code, so users of these extruders have been forced to use other forks (usually the respectable MarlinKimbra). I myself had resisted adding this feature, because it "felt" like a hack to me. Not being one to blindly trust my intuition, today I set out to implement this feature. Ten minutes later, it was done. Apparently not such a hack after all!
So, E3D Cyclops users rejoice! Marlin now supports your awesome newfangled extruder.
Yes, Mixing Extruder support is still in the hopper, and ready for integration. The feature appears to be in a robust condition, with no bugs yet reported, and I fully expect it to be included in Marlin 1.1.1 and Marlin 1.2.0.
What about CoreYZ?
After I added CoreXY and CoreXZ support I thought that was the end of it. But those H-Bot / Core Kinematic fanatics are unrelenting! Recently I've seen a few postings about CoreYZ, but I have yet to see any of these machines in the wild. Apparently RepRapFirmware-dc42 integrated CoreYZ support over a year ago.
Once again, I anticipated a whole raft of difficulties to get this integrated. And once again it turned out to be a piece of cake. It was a good thing to go through this code again, as I was able to fix a couple of minor issues with CoreXY and CoreXZ in the process. I'm really pleased to finally have this whole suite completed and ready to include in 1.1.0.
The current tentative date for the Marlin 1.1.0-GA (General Availability) release is June 1. All new bug-fix issues are being marked with the "1.1.0 Milestone" to remind us of their importance, with a hard cutoff date of May 31. That gives us not much time to get the code tested and bring it up to full confidence.
Public Testing "Sprint"
Now is the time for all brave Marlin users to grab a copy of Marlin 1.1.0-RCBugFix, test it out, and give us your feedback! You can find the latest code at https://github.com/MarlinFirmware/Marlin/tree/RCBugFix — and remember this is beta code. Use with caution and read the warnings in the README before jumping in.
Marlin Enterprise Consulting
Since 2012 I've been getting into electronics, 3D printing, and the maker scene as a way to expand my skill-set, beginning from a purely software development-oriented base. Desktop, phone, web, and tablet apps are all well and good, but they tend to stay on the desk or in your hands, relying on the flat screen and its UI paradigm. As a programmer, I needed to step away from the desktop and start programming robots! I had a whole 2 to 3-year plan that I won't get into. It's taken a little bit of a detour, but continues to develop.
So I've been discussing this idea with Roxy of 3D Print Board, for programmers like me, who know Marlin intimately, to begin offering freelance consulting services worldwide for enterprises and individuals that want to integrate Marlin Firmware into their products and projects. I think this would be a great way for contributors to the project, maintainers of Marlin forks, etc., to contribute more to the ecosystem, and to receive compensation and recognition for their efforts.
What do you think? I've been in talks with a couple of startups, and it's clear that they really need this kind of expertise. Since Marlin is licensed under the GPL, both Marlin and the broad user community would directly benefit from this kind of integration work, as new and custom features will necessarily filter back to the main project. So I'm pretty excited about this prospect.
Few people would describe be as "entirely realistic" or "totally grounded" — or "altogether conventional" for that matter. I've been a bit of a Pollyanna in my West Coast adventure, to say the least, and when I moved to Portland, Oregon a year ago I was quite certain that I would find a well-paying job in no time, and probably it would fall into my lap! But several interviews, online applications, and headhunters later, I'm still looking for steady work as a coder and a conducive living space.
So the "monkey wrench" is that I have to move out of my current place before June 1, but I'm not sure where my 20-year-old cat and I will be going next. I'm trying to stay positive, but as the end of the month approaches my outlook gets a little dimmer.
While I'm working this out, I hope to still keep focusing on Marlin. But I will surely need to spend a lot of time in the "real world" shuffling my belongings around, just at the moment when I most want to focus on the Marlin release. With luck, my situation will be sorted out quickly and I will be able to get back on track.
So, until next time, wish me luck!
## Patrons, Friends, and Funders
Thank you all once again for your generous support of this endeavor! This past month I received more contributions than ever before, at a time when they are truly needed the most. Among the best donations I received was a very useful piece of kit. To wit, I happened to mention that I lacked an oscilloscope to do testing, and lo, one of our most prolific contributors suddenly gifted me a portable open-source oscilloscope from Amazon. Not only is this an essential device for any electronics hacker, but it keeps to the full spirit of open source in the process. Kudos!