Friday, March 4, 2011

Image carving

JGCGen now includes rudimentary support for heightmap carving. You can see the first test carving below. (source)


 Currently only a simple scanning style toolpath generation strategy is implemented, but different methods can be added easily.
Current limitations are:
  • No interpolation. The minimum stepover is image width or height divided by target width or height. This results in the striated look visible in the above image. A workaround is to use a higher resolution image.
  • Single pass only. This limits the depth of the image to the maximum depth your bit can handle.
My current plan is to add a strategy for a roughing pass that can be run with a bigger bit before running the finishing pass.

Tuesday, March 1, 2011

A BF interpreter in g-code


The unfortunately (but aptly) named brainf*ck is my favorite esoteric programming language. The whole language has only 8 commands, yet is Turing equivalent, meaning it has the same computational power as a Turing machine. As amazing as it sounds, this means any computable function can be computed with a BF program! A simple way to prove that a language is Turing complete is to use it to implement another which already has been proven Turing complete. Due to its simplicitly, BF lends itself well to this task.

So, here is a simple BF interpreter written in EMC's RS274 dialect:

(print, PROGRAM START)
o100 while [##<_pc> ne 0]
#1 = ##<_pc>
o101 if [#1 eq 1] (memory increment)
        ##<_p> = [##<_p> + 1]
o101 endif
o102 if [#1 eq 2] (memory decrement)
        ##<_p> = [##<_p> - 1]
o102 endif
o103 if [#1 eq 3] (pointer increment)
        #<_p> = [#<_p> + 1]
o103 endif
o104 if [#1 eq 4] (pointer decrement)
        #<_p> = [#<_p> - 1]
o104 endif
o105 if [#1 eq 5] (loop start)
        ##<_sp> = #<_pc>
        #<_sp> = [#<_sp> + 1]
o105 endif
o106 if [#1 eq 6] (loop end conditional)
        #<_sp> = [#<_sp> - 1]
        o1060 if [##<_p> ne 0]
                #<_pc> = [##<_sp>-1]
        o1060 endif
o106 endif
o107 if [#1 eq 7] (print value)
        #3 = ##<_p>
        (print, ASCII: #3)
o107 endif
g0 x1
#<_pc> = [#<_pc> + 1]
o100 endwhile
(print, PROGRAM END) 

This interpreter doesn't support the input command (but that isn't needed for Turing completeness anyway) and just prints out the output in numeric format. This is pretty boring, so I added a set of functions for carving out letters. See the complete source code.

Sunday, February 27, 2011

CNC tests: aluminum


Last time I tried how my CNC3040 machine deals with wood and plastic. Now it's time for some metal.

I tested on a piece of scrap aluminum, so unfortunately I have no idea of the alloy. The tool used was a 3mm 4-flute carbide endmill. Cutting depth was 0.4mm. For coolant I used Biltema brand "Multi-Spray".

The lower cut as seen in the picture was made with a feed rate of 50 mm/min and the one above it at 100mm/min. The faster cut looks cleaner.

I still need to do some more testing, but this machine does appear to be capable of light metalwork.

Generating G-Codes


As I said in my previous post, there is a dearth of CAM programs available for Linux, so I mostly have to write my G-Code by hand or combine output from various code generators. To make this task a little easier, I wrote a preprocessor with some code generation features too: JGCGen.

JGCGen is written in Java and uses Apache Velocity as its templating engine. This allows you to easily combine input files, write macros, generate code with loops, etc. Check out JGCGen's readme for a more comprehensive introduction to what it can do.

The g-code for the little name plate on the image to the right is, of course, generated with JGCGen. Yeah, it's not all that pretty and finished, but the code is only 24 lines long!

Addendum to the last post: You can cut plastic with a 2 flute endmill. Just keep the feed rate high enough to keep the chips from melting and clogging up the blades.

Friday, February 18, 2011

CNC tests: Wood and plastic

Today I did some tests on my CNCDIY 3040 router/mill to see how different speeds and feed rates affect the cut on various materials.
The materials tested were wood (oak), acrylic and polycarbonate.

I used a simple test pattern (G-code available here) with motions in different directions to help detect backlash and inaccuracies.

Saturday, February 12, 2011

Hobby CNC

For quite some time now, I had been wishing for a CNC router. On almost every project I did, whether that be woodworking or electronics, there was usually some part that made me think "if I had a CNC router, this would be easy;" but I couldn't justify spending thousands of euros on something (no matter how cool) I'd only be using for hobby work.
Recently, I found a manufacturer, CNCDIY, that makes affordable desktop CNC routers. They have (at the time of this writing) two very cheap models, the 2520 and the 3040, both under $1000. I decided to buy the 3040 as it has a slightly larger working area and has ball screws instead of trapezoids. According to the manufacturer, the 3040 can mill soft materials like wood, plastic and even aluminum. I would guess milling aluminum is very slow work on a machine like this compared to a "real" milling machine, but this machine should be just perfect for my needs. (Wood, acrylic, PCBs, possibly thin aluminum parts)

Monday, January 3, 2011

OS rants

Annoyances encountered today:
When I started up my desktop computer today (running Gentoo Linux) I noticed that my keyboard layout had, yet again, reset back to "us". The last time this happened was when the developers decided that the X configuration file was no longer a cool place to store configuration options and moved them out to HAL policy files. Took a bit of googling back then but I managed to get my keyboard working properly again easily enough.
So today, the HAL configuration was naturally the first place I looked. I remember that I had installed an update to xorg before shutting down my computer, so maybe some configuration key had been renamed or something. No amount of tweaking could restore the proper keymap. The configuration appeared fine in lshal, but X always loaded the default map. Finally, I found this. So apparently hal is now deprecated and udev is the way to go and settings are back in xorg.conf. Sigh. Progress I suppose.

Another problem. I tried to connect my work Windows 7 laptop to my home wireless network. After entering the details of my network, I was rewarded with the singularly unhelpful message "verkkoasetukset eivät ole tämän verkon edellytysten mukaiset", or something along those lines. (I accidentally selected the Finnish version when first starting up and haven't yet found the option to change it to English.) After some googling (good thing that wasn't my only computer!), it turned out this error (in my case) meant I had just selected the wrong encryption method (WPA vs. WPA2.)
But really? Can you make a less helpful error message? From the wording, I assumed I had to check some box somewhere to acknowledge that I'm allowed to connect to this network or something.