In order to create reproducable cuts / engravings the controller must be able to properly "zero" all axis' to a known state before starting a job.
If any steps are missed or if the board is reset without going back to a known zero position (ie in the case of an error) the controller no longer has an accurate knowledge of the position and will start from different origins.
To correct this a "zeroing" procedure must be used. The engraver has end switches installed for each axis (only min switches) that are used for this. An algorithm for the controller was written which slowly decrements each axis until the limit switch is triggered then "backs off" by a configured amount of steps. Since the controller is 100% async the code is somewhat more complicated but it works well after some tweaks.
Here's a demo:
The board is first reset so it loses all it's positional info, then a command is sent to start the home procedure. Each axis slowly moves back until the switch triggers and then backs off a configurable amount.
Up until now, it had to be manually "zeroed" out which was rather error prone. So now it can do it all automatically!
The engraver is working fairly well now. After figuring out some issues with memory usage it can cut without problems, here's a short video of a test cut for a small wooden sign.
The drivers currently being used don't have very much power, so it can't cut very deep ( also I don't think the engraver was meant to be cutting wood) but it works for cuts about 1/8" deep.
Hoping to get some better speed control added soon so it can cut faster.