Portal 2 Turret Gun




--- CARA MIA! - Master Turret Control is here!! ---

Check out the Master Turret Control. A way to control you Turret gun! Control multiple turrets with a single controller.


This Christmas, I decided to design and build a working Portal turret gun from the game

Portal 2. For me, this was an exercise of properly modelling the entire assembly in Fusion 360 first, before building anything. This design uses an Arduino Nano, an MP3 player chip, distance sensor, servos, LEDs and 3D printed parts.

The goal here was to make it move in 3 "axes", with spoken sound from the game and LED's to simulate firing.

- Open the "wings" if it senses someone in front. Use a crank mechanism with sliders, just because.

- If the person is still there after opening, fire until they drop. LED's and machine gun sound.

- If the person is no longer there, run a little scanning search routine.

- Close up and go to sleep until someone else comes along.

- Use Portal turret sounds and voices from the game.

I took some liberties in the design, trying to make it appreciably the same as the one seen in the game, but functional and printable. With some basic sketches found online, I started modelling and planning...

The sounds are stored on a microSD card, which is accessible from the back side so that sounds may be updated or changed later. It is inline with the black infill strip, making it essentially invisible once installed. 18 individual expressions and sounds used in this go-round.

The lidar sensor (time-of-flight) is on a chip with a rectangular profile. This sensor is nearly invisible from the front once assembled.

Step 1: Fusion 360 Modelling

The design started from sketches found online. Using these images as canvases, I started sketching the outlines of the 3 views. Then it was a matter of extruding them into 3D, then shelling the general shape and making cuts. All electronics were built in Fusion as components that were inserted and placed where I thought it would make sense. Driving parameters were:

  • Arduino Nano had to have connector accessible for updating once fully assembled
  • MicroSD card had to be accessible in the same manner, and ideally invisible once installed
  • Time-of-flight sensor should be invisible as well
  • A 2.1mm electrical connector for power at the back
  • Printed parts to be as large as possible (not a lot of little pieces)
  • Print with no supports

After components (Nano, other chips, servos) were added to the basic shape, they were moved around and positioned as required, and the supporting structures were built to support them inside the shell.

The wing opening mechanism was a crank and slide mechanism. Why? Because I wanted to use a crank mechanism, that's why! This added some complications, but it also had a benefit; once the geometry was determined, operational repeatability would be ensured and the min and max limits were pretty much guaranteed.

Once the entire model was built and I was confident that it would work, and could be built (printed) and assembled, I went ahead and printed out the parts and built a prototype. Once that worked out, I went back to the model and made some tweaks to improve appearance and assemblability (is that a word?). This model is what came of those changes.

This was pretty taxing, as there really aren't many boxy shapes in this thing, and it closes up pretty tightly, with no real access for tweaking once put together. I learned quite a bit on this project, such as using embedded components within other components. This made manipulating and keeping sub-assemblies linked for quick access. In the end, it was worth the effort!

As for videos guides on Fusion 360, I'd recommend Lars Christensen's YouTube channel.


I found Lars' channel along with other videos to be very helpful in coming up with new ideas and using features effectively in Fusion.

Step 2: 3D Printed Parts

Portal turret v4.zip is updated and should contain all printed parts needed to build the latest turret.

--- new "Rear test Leg". Not true to original, but it's at the back, and allows one to use a straight mini-USB connector straight up. ---

V4 parts (body and wings shown in RED) have been revised to reduce the bridge size in the body when printing and have virtually eliminated the "bump" on the front face, over the eye. This required modifying the wings to fit in the revised shell, and also required a revised pitch frame. I've also updated the infill strips to be consistently thin, and reduced the width by a hair. This makes putting it together much easier. I've also included a revised rear leg which is stretched a bit, allowing more room for the plug connector at the back.

These were printed on a Prusa Mk2, using PLA for all parts. The print orientation should be pretty evident. The body was printed in the vertical position, with no supports. There is the large gap in the sides that has to be bridged, but I really had no big issues with pretty standard settings, other than the bump. The bump on the front and rear can be virtually eliminated with good filament and some good print settings. I found that 0.2mm worked well in the slicer and produced a decent result. Any larger and openings started appearing in the body near the infill strip.

The design of channels and protrusions were done with 45 degree chamfers, so "hanging in space" elements will be minimal.

I had little cleanup to do to put the assembly together. The infill strips that slide into the channels are now pretty straightforward, with reduced width and consistent thickness. I think that one could use a thin, black material cut into strips instead of using these printed pieces (printed on edge).

The one area that does require finesse is the slider pins in the pitch frame. Straight pins (nails) in the bore holes that are chased with a 1/8" drill bit and some lube will go a long way.

Step 3: Components

V4 (Red turret) has smaller bridging, requiring v4 wings and Pitch frame.

Once the model was complete, and I was happy with my prototype, I printed rev 2 with the plastic components as shown. Everything here is PLA, with Black and design colour (Blue in this case), and a tiny bit of translucent PLA for the central "Lens" or laser eye.

This photo pretty well captures the components, with the exception of the wiring.

Step 4: Electronics

The build uses the following components:

  • Arduino Nano (1)
  • DFPlayer Mini MP3 player (or MP3-TF-16P) (1)
  • VL53L0X Time-of-Flight Ranging Sensor (1)
  • Generic SG90 micro servos (3)
  • 5mm red LEDs (5)
  • 220 Ohm resistors for LEDs (5)
  • 1kOhm resistor (1)
  • 4cm speaker, 4Ohm, 3 Watt (1)
  • 2.1mm power connector (1)
  • 3" long framing nails (4)
  • M2 x 6 screws (8)
  • M2.5 x 8 screws (2)
  • M3 x 8 screws (4)
  • M3 x 12 screws (4)
  • M3 x 16 screws (2)
  • shrink wrap
  • small tie wraps

All components are readily available from Amazon or Banggood and other sources.

The screws were sourced from an assortment kit. It's a pain in the butt to get them otherwise...

Step 5: Mechanical Assembly

Most of the mechanically assembly is reasonable. The printed parts are printed with the holes tapped where necessary, so a quick chase with a screw before final assembly will be helpful and made assembly of the screwed components pretty easy.

The Arduino and the MP3 chip snap into the cradle without hardware. The VL53LOX will slip into the front shell without fasteners. Trial fit first, then remove and install once wired up.

The slider assembly uses 4 framing nails as slider rails. They are about 1/8" in diameter, with the heads clipped. These were taken from a strip of DeWalt framing nails used with their electric framing nailer. Needless to say, smooth nails are a must.

The servos mount as shown. Orientation is important. The pitch and the pivot servos are "centred" when installing into their pieces. The crank is installed such that, when in the open position, it will close by rotating counter-clockwise direction, when viewing from the front. Open position is rods and crank straight in line, with another 10 degrees rotation till lock.

The leg assembly is the easiest part. 2-2.5mm screws, with the leg caps snapping over the elbows of each leg. Use fasteners than don't protrude above the top of the leg plate. That way, the pivoting body won't bind if you tweak the rotation range.

All servo connections to printed parts are made using the short white crank that comes with the servos. These cranks just press into the printed parts. I tried printing the splined bore in the parts that connected to each servo, but had limited, repeatable success. Much easier using the cranks that come with the servos.

The crank assembly uses the longer 2.5mm screws. The crank rods should not be squeezed between the crank halves. In fact, you could try using shorter screws without the Crank2 part. That should work as well (hopefully no appreciable torque here if the wings slide freely).

The speaker is captured by a servo mount (2 pieces) which capture the speaker. Speaker between these "legs", and held in position by securing them to the pitch servo. This servo then connected to the pitch (slider) assembly, followed by the crank assembly with rods. All of this is assembled before being installed in the LHS body with 4 small screws.

Once the main guts are installed, with the Arduino and MP3 player temporarily located, then the fun begins - wiring!

Step 6: Wiring

V5 - Radio option (Red turret photos). This includes an nRF24L01 radio chip. Completely changes the Arduino pin wiring to accommodate all the connections. Details to come...

The final packaging is tight, so spending some time here figuring out wire lengths is well worth it. Most interconnecting wires I ended up with were between 3" - 4".

The LEDs are wired with the 220 Ohm resistors directly, followed by some shrink wrap, and some wiring twisting, then put aside, after they have been tested. I used light gauge wiring here as I had some lying around (CAT5 type communication wiring) and didn't want the visible wiring to be obtrusive.

The mechanical bits are mock fit in the shell, then wire routing is figured out, then cutting and prepping the wires is next.

I built the servo connectors so that I could plug in and replace servos if I ever messed something up and stripped the gears. This was definitely helpful after messing up during my first prototype.

Once happy with the bulk of the wiring, the LEDs were soldered up at the end. Then it's time to carefully stuff the wired assembly into one half of the shell. The last step is to solder the power connector to the power wires once it is all inside.

-- Important note: Make sure the wiring stuffed behind the Nano are not pressing on the reset button!! This will obviously cause problems and prevent the unit from operating properly. --

At this point, all wiring is done, but before final assembly, it is important to upload the code to the Nano and power it up to make sure the LEDs, servos and MP3 player all worked as designed. After that, it's time to put the rest of the mechanical bits together.

Step 7: Arduino Code

Code for Radio turret now shown. Will still work without MTC, but has all the goodies baked in!

The attached file is what I came up with to drive the unit as shown in the videos. I will keep tweaking to change the Turret's character and the way it behaves. Lots of options here.

I structured the code using subroutines that I call as needed. It keeps the main body clean and was pretty helpful when I was playing around with different characteristics. It helped me manipulate the code for different behaviours.

I also used lots of variables up front which helped me tweak and adjust parking positions and min and max ranges, for example.

I used the DFMiniMP3 library in my code. I tried other libraries, like the DFRobot one, but had issues, so went back to this one. It meant that I had to keep the 'static void' pieces to keep it functional. These aren't necessary for the operation, but hey, I'm no master coder. I would love to hear of another library that is similarly as simple and neat as the VL53LOX library. Let me know if you find a better way to do this!

As for sounds, the implementation is done in a simple way, by having a folder named "mp3" on the SD card, with the files names 0001.mp3, 0002.mp3, etc. The first four digits must be in this format, but you can add any suffix after that to help identify the particular sounds. See https://www.dfrobot.com/blog-277.html for an example. I've included a pic of my file names as used on the folder. The numbers correspond to the call-outs in the code.

The sound files I pulled from the Wikipedia page on Portal Turret sounds. The code pics a random sound file (1 of 2, or 3 sounds) to keep things from getting stale.

Would love to hear or see cool implementations of other code. One idea I think I might try is to interconnect 2 or 3 of them wirelessly, such that triggering one turret will make them all wake up! Maybe adding a simple RF chip to the assembly? There's still some room in there... :)

Step 8: Final Body Assembly

This part is a bit tricky because of the black infill strips. The scale of the final assembly is small enough such that the strips and receiving grooves are tiny. This necessitated chasing the channel with a pointer or other small scraping implement to make sure the strips would fit with little resistance before trying to put the other side on.

Tying the wires together neatly and tie-wrapping as required will make this far easier.

I have put a couple of these together now and find it easier to put the two halves together first, then insert the infill strips. Insert one side into the half with the "shelf" that prevents the infill strip from falling in, then lightly pry open and gently press in. Not too bad now.

This was one of the trickier parts. Maybe one day, I'll rethink this assembly, but I do like the way it looks when done, and it is pretty robust.

Step 9: Wing Assemblies

Now that the body is together, with the wing LEDs sticking out, it is time to prep the wings and assemble.

It is imperative that the slider holes are chased with a 1/8" drill bit, then cleaned out. Clip the heads off the nails using bolt cutters, vise-grips, hacksaw or favorite nail-cutting tool. The slider pins (clipped nails) are installed into the wings by press fitting them into each wing piece. Straight, de-burred and smoothed nails are the key to making this work. The wing sliders and holes should be lubricated and tested before connecting the crank rods and running. Dry graphite, or other PLA suitable lubricant is recommended. I find that a small tube of personal lubricant works really well, and is cheap. It's really slick. It also requires for some 'splainin' when your partner or parent comes in and asks what exactly you need that for at the workbench!!

Start by figuring out which wing part goes where, and trial sliding that part first. Then fit the top and bottom halves together once the pins are installed, apply some lubricant (a q-tip works well for this) and make sure the wings slide well. This can be tricky, but without making sure the wings slide effortlessly, without binding, you'll be in for a frustrating time. Trust me...

Once the wings are good to go, it's just a matter of sliding them into place, locating the connecting rod over the hole in the wing and assembling with a single screw. Then, the LEDs are inserted into the gun holes, wires are tucked against the wing and you're ready to go! You can also use some hot glue to lock them into place once everything is tested.

Step 10: Scare and Shock Your Friends!!

The last little caveat on this design is that an angled plug is a great idea, since it doesn't interfere with the back leg when pivoting. The revised rear leg (v3) has been stretched to give a little more room.

Once built and plugged in (5V or suitable for Nano), it will sit quietly until someone is detected within the programmed distance, then spring to life and slay anyone who enters its domain!!

Let me know if you build one (or more) and if you come up with new features or concepts!

Toys Contest

Grand Prize in the
Toys Contest



    • Colors of the Rainbow Contest

      Colors of the Rainbow Contest
    • Fandom Contest

      Fandom Contest
    • Classroom Science Contest

      Classroom Science Contest

    44 Discussions


    9 days ago

    Very nice design. Would you mind making the f360 files available to download? I see that you posted a link to view the design in a comment below, but there doesn't seem to be a way to download the files. I'm specifically interested in the infill strips since it seems I need to thicken them a bit so my slicer stops flipping out.


    5 weeks ago

    Hey, Chris! Great job on doing this project! I just finished soldering all the parts together and were looking for the code without the radio control. Where can I find it? Thanks!

    2 replies

    Reply 4 weeks ago

    Hey there. Here is my best guess at the latest iteration without radio option. You will have to double check the IO pin mapping and change pin assignments to correspond to the old wiring diagram (attached).

    Portal turret wiring schematic.JPG

    Reply 23 days ago

    Hey, Chris! Got the little bastard running finally! I have checked to code to figure out why is there so much jerking of the servo motors between getting from one phase to the other?

    And another thing: I connected the central LED to the D9 to use PWM so that instead of turning it completely off in stand-by, it would be lit up only a little bit. I used analogWrite function and it works in another program to control the brightness but in this program it is not working at all. Do you have any idea why?

    Appreciate your help and support!


    5 weeks ago

    hi your job is amazing, i'm almost finishing it but i'm getting this error over and over:
    Arduino: 1.8.9 (Windows 10), Placa:"Arduino Nano, ATmega328P"
    In file included from D:\UEM\Impressora 3d\Portal+Turret+v4\Portal_Turret_Radio-RED_v1\Portal_Turret_Radio-RED_v1.ino:23:0:
    D:\UEM\5 Quinto Ano\Arudino\libraries\DFPlayer_Mini_Mp3_by_Makuna\src/DFMiniMp3.h: In instantiation of 'uint16_t DFMiniMp3<T_SERIAL_METHOD, T_NOTIFICATION_METHOD>::listenForReply(uint8_t) [with T_SERIAL_METHOD = SoftwareSerial; T_NOTIFICATION_METHOD = Mp3Notify; uint16_t = unsigned int; uint8_t = unsigned char]':
    D:\UEM\5 Quinto Ano\Arudino\libraries\DFPlayer_Mini_Mp3_by_Makuna\src/DFMiniMp3.h:97:27: required from 'void DFMiniMp3<T_SERIAL_METHOD, T_NOTIFICATION_METHOD>::loop() [with T_SERIAL_METHOD = SoftwareSerial; T_NOTIFICATION_METHOD = Mp3Notify]'
    D:\UEM\5 Quinto Ano\Arudino\libraries\DFPlayer_Mini_Mp3_by_Makuna\src/DFMiniMp3.h:329:17: required from 'void DFMiniMp3<T_SERIAL_METHOD, T_NOTIFICATION_METHOD>::sendPacket(uint8_t, uint16_t, uint16_t) [with T_SERIAL_METHOD = SoftwareSerial; T_NOTIFICATION_METHOD = Mp3Notify; uint8_t = unsigned char; uint16_t = unsigned int]'
    D:\UEM\5 Quinto Ano\Arudino\libraries\DFPlayer_Mini_Mp3_by_Makuna\src/DFMiniMp3.h:152:19: required from 'void DFMiniMp3<T_SERIAL_METHOD, T_NOTIFICATION_METHOD>::setVolume(uint8_t) [with T_SERIAL_METHOD = SoftwareSerial; T_NOTIFICATION_METHOD = Mp3Notify; uint8_t = unsigned char]'
    D:\UEM\Impressora 3d\Portal+Turret+v4\Portal_Turret_Radio-RED_v1\Portal_Turret_Radio-RED_v1.ino:191:20: required from here
    D:\UEM\5 Quinto Ano\Arudino\libraries\DFPlayer_Mini_Mp3_by_Makuna\src/DFMiniMp3.h:421:63: error: 'OnUsbOnline' is not a member of 'Mp3Notify'
    D:\UEM\5 Quinto Ano\Arudino\libraries\DFPlayer_Mini_Mp3_by_Makuna\src/DFMiniMp3.h:432:65: error: 'OnUsbInserted' is not a member of 'Mp3Notify'
    D:\UEM\5 Quinto Ano\Arudino\libraries\DFPlayer_Mini_Mp3_by_Makuna\src/DFMiniMp3.h:443:64: error: 'OnUsbRemoved' is not a member of 'Mp3Notify'
    exit status 1

    4 replies

    Reply 4 weeks ago

    I'm not too comfortable with the errors you are receiving with the MP3 libraries. I tried different MP3 libraries and had some other issues getting it to work (not what you're now encountering). I eventually settled on this library and got it to work for me. I don't fully understand the errors you are receiving here, since there are other factors at play.

    If you haven't figured it out, I'd recommend trying the Arduino forums. For about a week I had one issue on this project I couldn't resolve or find the answer to and someone on that forum pointed to the answer. I had other library issues that caused errors, when others had no problems with them. Sometimes deleting the entire library and downloading a fresh copy fixed it. Other times, it was rearranging code. I'm still trying to figure out code errors on other projects!


    Reply 4 weeks ago

    So I got it compiling with some warnings, which can be disregarded, I think. I haven't uploaded it yet but it compiles. So what I did: I am running Windows 10, installed Arduino 1.8.9 from the official website and installed the libraries to the "libraries" folder located inside the "C:\Program Files (x86)\Arduino". Before I had the Arduino app from the Windows 10 app store and had to install the libraries in the "Documents/Arduino/libraries/" folder. Hope this helps!

    Thanks, Chris, for the answer and the program!


    Reply 5 weeks ago

    Having the same problem:

    C:\Users\Xabi\Downloads\Portal_Turret_Radio-RED_v1\Portal_Turret_Radio-RED_v1.ino:170:1: warning: narrowing conversion of '298000l' from 'long int' to 'int' inside { } [-Wnarrowing]



    C:\Users\Xabi\Downloads\Portal_Turret_Radio-RED_v1\Portal_Turret_Radio-RED_v1.ino:170:1: warning: overflow in implicit constant conversion [-Woverflow]

    In file included from C:\Users\Xabi\Downloads\Portal_Turret_Radio-RED_v1\Portal_Turret_Radio-RED_v1.ino:23:0:

    C:\Users\Xabi\Documents\Arduino\libraries\DFMiniMp3-master\src/DFMiniMp3.h: In instantiation of 'uint16_t DFMiniMp3<T_SERIAL_METHOD, T_NOTIFICATION_METHOD>::listenForReply(uint8_t) [with T_SERIAL_METHOD = SoftwareSerial; T_NOTIFICATION_METHOD = Mp3Notify; uint16_t = unsigned int; uint8_t = unsigned char]':

    C:\Users\Xabi\Documents\Arduino\libraries\DFMiniMp3-master\src/DFMiniMp3.h:97:27: required from 'void DFMiniMp3<T_SERIAL_METHOD, T_NOTIFICATION_METHOD>::loop() [with T_SERIAL_METHOD = SoftwareSerial; T_NOTIFICATION_METHOD = Mp3Notify]'

    C:\Users\Xabi\Documents\Arduino\libraries\DFMiniMp3-master\src/DFMiniMp3.h:329:17: required from 'void DFMiniMp3<T_SERIAL_METHOD, T_NOTIFICATION_METHOD>::sendPacket(uint8_t, uint16_t, uint16_t) [with T_SERIAL_METHOD = SoftwareSerial; T_NOTIFICATION_METHOD = Mp3Notify; uint8_t = unsigned char; uint16_t = unsigned int]'

    C:\Users\Xabi\Documents\Arduino\libraries\DFMiniMp3-master\src/DFMiniMp3.h:152:19: required from 'void DFMiniMp3<T_SERIAL_METHOD, T_NOTIFICATION_METHOD>::setVolume(uint8_t) [with T_SERIAL_METHOD = SoftwareSerial; T_NOTIFICATION_METHOD = Mp3Notify; uint8_t = unsigned char]'

    C:\Users\Xabi\Downloads\Portal_Turret_Radio-RED_v1\Portal_Turret_Radio-RED_v1.ino:191:20: required from here

    C:\Users\Xabi\Documents\Arduino\libraries\DFMiniMp3-master\src/DFMiniMp3.h:421:63: error: 'OnUsbOnline' is not a member of 'Mp3Notify'



    C:\Users\Xabi\Documents\Arduino\libraries\DFMiniMp3-master\src/DFMiniMp3.h:432:65: error: 'OnUsbInserted' is not a member of 'Mp3Notify'



    C:\Users\Xabi\Documents\Arduino\libraries\DFMiniMp3-master\src/DFMiniMp3.h:443:64: error: 'OnUsbRemoved' is not a member of 'Mp3Notify'



    exit status 1
    Error compiling for board Arduino Nano.


    Reply 5 weeks ago

    I have the same problem ... if you solve, you can let me know, please


    Question 5 weeks ago

    Complimenti un bel progetto ;Puoi mandarmi il link della biblioteca del Mini MP3 Module di DFPlayer, per favore ; ho provato di scaricare da github e non funziona

    1 answer

    2 months ago

    This is epic!!! Thanks for the Instructable. Throwing this one on the projects bucket list for sure. Could you let me know the html behind those 'View in 3D' Fusion 360 parts you linked?

    2 replies

    Reply 2 months ago

    Hi Inventor22,
    The view in3d is taken care of by the Instructables site, so it beats me! If you really want to know, I’d recommend reaching out to the Instructables moderators. Tomatoskins, et al. They’re very helpful.
    PS. Cudos on the organizer! Damn that was good!


    Reply 2 months ago

    Ah great, i'll get in touch with Tomatoskins and see what ancient instructables wisdom they hold.
    Thanks for the cudos on the organizer!


    2 months ago

    When I compiling sketch for Portal Turret with Radio (nRF24L01 radio chip. )
    I'm getting this error:

    /Users/username/Documents/Arduino/Portal_Turret_Radio-RED_v1/Portal_Turret_Radio-RED_v1.ino:170:1: warning: narrowing conversion of '298000l' from 'long int' to 'int' inside { } [-Wnarrowing]

    if the value 298000 requires nineteen bits. so how I can change variable large enough to contain at least nineteen bits ??
    if a sixteen bit variable is too small for a nineteen bit value. It doesn't seem likely that an eight bit will be suitable. As well going larger like, thirty two bits. Did not hep!:(

    any help would be appreciated

    hello everyone
    I manage fix it error with smal changes in incompatibility between the RF24 RF24Network library. And change 'int NormalTimings [] = {' to 'unsigned long NormalTimings [] = {'
    All thanks to Ian

    Many Thanks


    Question 2 months ago

    Sorry, me again...
    I can't find the wee jobbie that the legs fix to in the STL files, I just started to assemble the bits I have already printed while I wait for the electronics to turn up but I appear to be missing that bit and the one next to the cut down nails on the Blue Turret image above.

    The new printer, although very slow is amazing, thank you for forcing me to buy it :-)

    2 answers

    Answer 2 months ago

    Hmm, the legs attach to the leg plate. That is included in the "Portal turret v4.zip" file. The small white part that inserts into the leg plate is included with the servos.
    I think you are referring to the "pitch frame" for the other part you're missing? There are two shown above. Otherwise, I'm not sure which other part you are referring to.


    Reply 2 months ago

    Sorry, my mistake, its perspective, it looked different on the image to the one I printed :-(
    And no idea where the leg plate went when I moved all the files to the printer folder, but yes, it is in the .zip folder.
    Thanks for the clarification though :)


    Question 2 months ago

    I don't suppose you have the STL files for the front legs hidden away somewhere do you? The files have two for the rear but no front.
    Also, doesn't print on a CTC Bizer, max print height is 150mm so you have forced me to buy one with a larger print bed. (have to blame someone ;-)

    1 answer

    Answer 2 months ago

    Sorry bout that Djandco, it turns out they were "hidden" away. They're there now. Too much shuffling of files through the various updates. Thanks for the heads up.
    I'm happy whenever I am blamed for "forcing" someone to buy a better tool! Happy printing!