Tuesday, December 25, 2012

Drawers

I have too much stuff in my office. Or, perhaps my office is too small and serves too many functions. The solution to either seems to be better storage and drawers are just an excellent use of space. I built my large wrap around desk/table almost 10 years ago but it relies on shelves above it for storage and I was tired of boxes of unorganized stuff under it. It was time to build some drawers. Then there was the impending trip to Chicago for a week to pack up my father for a long distance move which provided the perfect excuse to ignore upcoming responsibilities and embark on a large wood working project.

I did look for pre-made or pre-fab solutions, but they were all either very expensive or very awful. The way the supports for my desk work means that the drawer either has to be shallow to avoid some middle supports or it has to be short to avoid the same. So my drawers would have to have a lower part that was deep and then an upper part to sit on top of that which was shallower to clear the supports. It would consist of 2 cases, a large one with 3' wide by 2' deep drawers that would come up to within 6" or so of the desk surface where it would have otherwise hit the middle supports under the desk. And then a smaller cabinet that is the same width, but only 14" deep to clear that same support.

Given the impending time crunch I originally started out thinking I would half-ass it quickly. This led me to build the cabinets from half in plywood, which was OK, but also led me to decide to skip any fancy jointery on the corners which I regretted later. Since the top of the cabinets will never be visible I opted for butt joints with the sides coming up flush to the top since they would be visible. The plywood edge of the sides would never be visible on the top or bottom so it wouldn't matter. Except that now after I made something nice I will always know it's there.


The smaller cabinet would have 2 smaller drawers. This is just sanded plywood after a coat of mahogany gel stain. I decided to do a fancy face for it with some Lyptus wood that I had bought a long time ago and have been just letting slowly warp in the garage. A little plaining brought it back to spec
for this. I was really surprised how beautiful the lyptus was with a coat of nothing more than linseed oil!

Something I forgot was that you can't build a drawer that is almost the same height as your case. You have to be able to tip the drawer in in order to get the wheels of the drawer slide in. So if you're using that type of drawer slide you need to make them short enough to get in. I fixed this in the larger case drawers by building shorter drawers but there are also more expensive drawer slides that dont require you to do this, but I was using what I already had. These drawers are now in permanently and cannot be removed...


If I had known the Lyptus was that pretty I'd probably have used it for something before now ;) It matches the stained cabinet very well. The rest of the face frame was fairly straight forward and I attached it to the cabinet with biscuits.

I pre-stained everything before putting it on since the cabinets were getting a totally different finish than the face frame. Lyptus is a hard wood, but works very nice. It sands up and finishes beautifully but the grain will raise like crazy if you get it wet. Since I had pre-finished it I just cleaned up any glue squeeze out with dry towels since I wasn't concerned about the glue keeping the oil from soaking in.

The larger cabinet was more work, but again I didn't do any fancy jointery on the corners. I did route some dados into the sides to hold supports between each drawer front and back which make it very steady and strong. Originally I had wanted to do a full piece in each spot, but that would have required a 3rd sheet of plywood and it would have weighed a ton. It's heavy enough the way it is so I just ran 4 inch strips front and back to attach the face frame to and for strength.


here's the left side of the face frame being clamped into position. The biscuits did a good job of keeping it from being pulled out of alignment but I probably still should have put every other clamp on the outside of the cabinet rather than all pulling from the same side. Though it worked fine the potential was there to glue it on crooked. You can see the biscuits for the horizontal pieces there already cut into the crossmembers.



The horizontal ones I just clamped with blue painters tape and it worked very well.  I've already put the drawer fronts on the smaller cabinet here. I left a generous quarter inch difference in the left/right/top/bottom dimensions for those to make it easier to align. I probably could have done it with less of a gap if I had started out being more careful for the size of the cabinets.


And mounted the drawers! Some adjustment and they all worked fine with enough clearance to get them in and out. Again half inch sanded plywood boxes with a quarter inch luan plywood bottom. Nothing fancy and no fancy jointery here either. I did screw the joints though and use an 1/8th roundover bit on the top of them all the way around.


Here just test fitting the pieces for the drawer fronts to get the size exactly right before giving them a coat of linseed oil.  I almost wished it didn't need any hardware at all it's so pretty. Mounting the drawer faces I also didn't do anything fancy. I drilled holes into the front of the drawers that were much larger than the screw I would use to attach the drawer front. And then drilled a smaller hole into the same place on the back of the drawer front taking into account the extra 8th of an inch overhang on each side. A little thinking here and I got it almost exactly right. The larger hole in the drawer and a washer on the screw made adjusting them if not easy, at least possible.


And then finally as finished. Haven't put the backs on in this picture yet, but I absolutely love how it turned out. A weeks projects working just a couple of hours a day and now I have it sitting next to me in the office making me happy and allowing me to have a little actual surface space to work on again! Every so often a woodworking project is necessary to keep the brain alive no matter how much other work is being expected of you ;)

If I ever make another one I would do a couple of things differently. Some rabbit joints on the cabinets would make it stronger and just make me happier. They wouldn't have added but an hour to the overall project time either. I somehow did the face frame different on the top small cabinet vs the bottom. On the top one I did the horizontal pieces coming all the way across and the bottom one it's the verticals that run straight through. They should both be done the same way. I really wanted to get every inch of space out of the thing so I designed it without any kind of foot or bottom. I should have given up 2" and put some feet on it just to raise the bottom drawer up out of the carpet. None of these things detracts from how happy I am with it but live and learn for the next project!

Monday, November 5, 2012

batch moving iCal events from one calendar to another with AppleScript

What with all the iOS devices and the cloud and all I thought I would finally sort out the mess which is our iCal calendars around here and put them all on the cloud so that everyone could have read/write access and everything would be shiny and new and wonderful. That took a little more work than it should have, iCal is currently my least favorite of all Apple's software. Searching on the internet though I see I'm not the only one who has had these problems so I document my solution for anyone who might benefit from it.

I had the calendars hosed on just a webDav directory on my own server but this did not allow read/write access for all family members subscribed. I wanted to move them to my iCloud account and then resubscribe everyone (well, technically my wife is the only other member of everyone ;) my first thought was to just export them through iCal to my disk as .ics files and then re-import them into new calendars created on iCloud.

This did not work. I got the following modal error message which had to be dismissed for EVERY SINGLE event in the file before I could get back to normal.


Access to "some event" in "the new calendar name" in account "name of my account" is not permitted. The server responded: "403" to operation CalDAVWriteEntityQueuableOperation.

This is not particularly helpful and the buttons are not really very apple like or helpful either. After signing out and back in again and recreating my iCloud account I was able to get ONE calendar to import without errors, and then they returned.  Thats an old event, so I thought perhaps it was just complaining that events too far in the past weren't allowed to be imported. So I created manually a small ICS file to test with that only had future events in it, but that failed too.

I resorted to applescript. The dictionary has both a duplicate and a move command one or the other should be able to copy or move the events in the calendars I wanted to change. I can change the events from one to the other one at a time by just changing the "calendar" in the popup for the event. That worked fine, so it was allowing me to add things to the calendar, it just didn't like importing it. Or, as it turned out the duplicate or move command. Both of those tries resulted in the same error and total failure. Finally I resorted to the make new event command which requires a bit more work because I had to create the record of all the old properties one bit at a time. And since it will happily return "no value" or "undefined" for properties that aren't set for that event, but it will not accept those as properties for a new event you have to check to make sure each property exists before adding it to the new record. I did not attempt to preserver attendees or other event properties not in the list below so I dont know how to do that. But with this script you can move all the events from one calendar to another without errors from iCal even where an import fails. I suspect it may have something to do with including the unique ID in the export file. Possibly you cannot specify the UID of a new event, or possibly it really means unique, and not just unique within each individual calendar and that is what is causing the error. I left the UID out of the script below but I did not test with trying to include it.

It is not fast, it takes some time for each event to be created, so be patient.


tell application "Calendar"
--Script to move events from one iCal calendar to another
--James Sentman james@sentman.com 11/4/2012
--
--  I found myself unable to import ical calendars that I had exported from another
--  server. I would get an error from the iCal server for each and every event.
--  I have no idea why, it may be just duplicate UID's or something.
--  The "duplicate" command and the "move" command both of which I tried
--  failed with the same error, but I was able to create a new one with the 
--  info gotten from the old calendar. But that wasn't so easy either as not
--  all events have all information and it would not except "no value" answers
--  so I had to add the if exists portion to build the record for the new event.
--  I did not attempt to move things like attendees or other elements of the event
--  just the data you see below.
--
--  INSTRUCTIONS: change the name of these next 2 variables. MyOldCal is
--  the calendar you want to move events FROM and MyNewCal is the name of the
--  calendar that they will be newly created in.
set MyOldCal to calendar "SCDS"
set MyNewCal to calendar "SCDS iCloud"
-- find out how many events we have to create
-- for some reason I would get an error when it reached "count"
-- which generally means that while the count tells you how many records
-- referencing them by index begins at 0 instead of 1, so start at 0
-- and subtract one.
set EventCount to (count of events in MyOldCal) - 1
repeat with i from 0 to EventCount
--get a reference to the old event in the old calendar
set WorkEvent to event i of MyOldCal
--since the work record with the info is appended instead
--of created fresh each time in one step it is necessary to clear 
--it out each time through the loop.
set WorkRecord to {}
--checking if the various properties exist or not 
--stops an error later if one property was undefined
--it will happily return no value for one of them without
--an error, but it will not then accept that in the make
--statement below. So we only add them to the record
--if they are actually there.
if exists description of WorkEvent then
set TheDescription to description of WorkEvent
set WorkRecord to WorkRecord & {description:TheDescription}
end if
if exists start date of WorkEvent then
set TheStartDate to start date of WorkEvent
set WorkRecord to WorkRecord & {start date:TheStartDate}
end if
if exists end date of WorkEvent then
set TheEndDate to end date of WorkEvent
set WorkRecord to WorkRecord & {end date:TheEndDate}
end if
if exists allday event of WorkEvent then
set TheAllDay to allday event of WorkEvent
set WorkRecord to WorkRecord & {allday event:TheAllDay}
end if
if exists recurrence of WorkEvent then
set TheRecurrence to recurrence of WorkEvent
set WorkRecord to WorkRecord & {recurrence:TheRecurrence}
end if
if exists sequence of WorkEvent then
set TheSequence to sequence of WorkEvent
set WorkRecord to WorkRecord & {sequence:TheSequence}
end if
if exists stamp date of WorkEvent then
set TheStampDate to stamp date of WorkEvent
set WorkRecord to WorkRecord & {stamp date:TheStampDate}
end if
if exists excluded dates of WorkEvent then
set TheExcludedDates to excluded dates of WorkEvent
set WorkRecord to WorkRecord & {excluded dates:TheExcludedDates}
end if
if exists status of WorkEvent then
set TheStatus to status of WorkEvent
set WorkRecord to WorkRecord & {status:TheStatus}
end if
if exists summary of WorkEvent then
set TheSummary to summary of WorkEvent
set WorkRecord to WorkRecord & {summary:TheSummary}
end if
if exists location of WorkEvent then
set TheLocation to location of WorkEvent
set WorkRecord to WorkRecord & {location:TheLocation}
end if
--you can try copying the UID also
--but it occurred to me that this may be the whole problem
--as a UID should be unique, and it would not be so
--if you had tried to create an event and specifying it at the time
--so I commented this out and iCal will happily make a new UID for the 
--new event as it should.
--if exists uid of WorkEvent then
-- set TheUID to uid of WorkEvent
-- copy {uid:TheUID} to the end of WorkRecord
--end if
if exists url of WorkEvent then
set TheURL to url of WorkEvent
set WorkRecord to WorkRecord & {url:TheURL}
end if
--and lastly actually make the new event with the old data.
make new event at MyNewCal with properties WorkRecord
end repeat
return EventCount & " events moved"
end tell

Or you can download the script as a script editor file: icalmover.zip

Let me know if thats of any help to anyone, thanks.

Sunday, September 23, 2012

Makerbot Acceleration Settings

The other day Makerbot announced the Replicator 2, obsoleting my wonderful replicator model. My initial buyers remorse at no longer owning the most current model quickly faded as I realized that it had a better case but was not much different otherwise. They do advertise getting a .1mm slice resolution with it though and others have posted getting that with the original replicator. I'd never tried going that fine but I think I have a better understanding of some of the internal settings now that I have sorted it out.

I've been rather frustrated with it lately, my prints have had too many gaps and globs and been quite messy. It turns out this was a function of the "acceleration" in the 5.5 firmware update. Acceleration doesn't mean actually going faster, it means that over the course of a fraction of a second the steppers were accelerated up to or down to the new speed rather than slamming from 0 to full speed and back again in a single step. The problem is that the extruder steppers are controlled this way too. Here's an example printed of the "MakerBolt" thing that comes with the new slicing software as an example. I sliced it in replicatorG rather than the new "makerware" as I couldn't get that to work properly yet. The settings for slicing were the non-accelerated speed with 0 shells and 100% infill. The one on the left was printed with the onboard preferences of acceleration turned on and set to their shipping defaults.


You can clearly see the print quality is lousy. Lots of drop outs. The one on the right was printed with the onboard acceleration turned totally off and it's a ting of beauty. The quality of my prints really did take a hit with the 5.5 firmware update that added acceleration! The 2 bolts above were printed from the exact same GCode, the only change was turning off the onboard acceleration in the replicator.

The problem is that you cannot print fast without the acceleration turned on, the steppers can't change speed that quickly and will skip steps and ruin the prints. I have read elsewhere that changing all the acceleration settings to 1000 mm/s/s in the left hand column fixed others problems, it did not fix this for me. It was better but still had dropouts. The defaults have 3000 mm/s/s as the acceleration for the "a" and "b" channels which I believe are the 2 extruders, this was much higher than the default acceleration for the movement steppers. It makes sense for the extruders to stop later and start faster than the movement ones to get the plastic flowing, but these numbers caused gaps at startup and blobs at stop (or possibly vice verse it's hard to tell) the numbers I finally settled on were this:


1000 mm/s/s for the axis steppers and 1250 mm/s/s for the extruder motors. This resulted in a print that was 95% as good when printed at the default slow speed as the completely unaccelerated model, and probably 85% as good when printed at full "accelerated" speed. The accuracy of the print at high speed isn't as good, but there were no dropouts or globs of plastic left behind. The bolt doesn't move as freely at high speed as low, so for technical pieces I'll be printing with the slicer speed turned down, but for less critically sized pieces I can now print accelerated with acceleration on and get very nice prints, even at .1mm resolution. Have a look again at that right hand bolt in the picture above, it's a thing of beauty!

(watch out for semantic confusion between the onboard Acceleration which just controls how quickly the steppers come up to the new speed and the slicing accelerated defaults which control how quickly they move overall as they print the model. It's quite possible to have one turned on but not the other)


Monday, September 3, 2012

crank powered airplane to crank powered flashlight

Ben has been throughly enjoying his "Kid Galaxy Dyna Flyer Air Streak" airplane. It runs an amazingly long time on just a few moments of cranking up the launcher thing.

Unfortunately being made of foam it's lifetime was limited and we finally busted the little wires that run through the middle of the prop. Rather than just toss it we had to take it apart to scavange for reusable parts. I knew it had to be a super capacitor in there and indeed it was. 2.7 volt 7 farad. The motor we salavaged for some future project, but the charger and capacitor we kept together and added a multi-chip warm white power LED that I got off ebay a long time ago. I was using these for outdoor lighting long time ago but they didn't really last in that application, or I was overpowering them, so I had a bunch in the toolbox. There is a tiny board in there that shuts off the motor till it leaves the launcher, but we didn't use that, just soldered directly to the capacitor. The voltage is close enough that I didn't bother with a resistor or anything.





The charger is really quite powerful, about 7 seconds of cranking will run the LED at decent flashlight level for about a minute and a half with many more minutes at diminishing candle and then "find me" levels.


And of course you can shoot it across the room too as it's still on the sled that used to launch the airplane.



I haven't played with any of this new generation of super capacitors before, but they are certainly going to be useful! You couldn't use a battery in this kind of thing, it wouldn't work at all. I see now that there are a bunch of different versions of this toy, they aren't expensive and it was definitely fun. I'm not sure how we managed not to lose it into a pond or up on a roof or tree while we had it, and when it does inevitably crash and burn like all toy airplanes must, you can salvage the really cool super cap out of the inside!

Saturday, July 28, 2012

the double secret to making a bootable Mountain Lion install disk

FINALLY figured this out by reading the excellent tidbits article. Theoretically all you have to do is restore the disk image that comes in the download from apple to a disk partition big enough to hold it. This has worked in the past, but something about the mountain lion 10.8 image breaks this. You get low level unfixable disk errors.

But if you mount the image to the finder first and then restore the mounted image rather than the .dmg file it works! Given the number of machines around here and the fact that should a disk fail I'd really like to be able to restore from a bootable disk this is quite useful.

Tuesday, July 3, 2012

Our First Week with Makerbot


We’ve completed our first week with a Makerbot replicator in the house! It’s mostly been a big hit, the kids are designing their own models and we’re actually getting good prints of things. I have learned a bunch of stuff though that might be useful to know if you’re thinking of getting one of these things.

1) It doesn’t stink nearly as bad as I had feared. I was ready to have to build a hood and a fume extractor for the thing but while you can tell there is hot plastic in the room it’s temperature controlled enough that the plastics do not outgas or burn. The vapor pressure of the molten plastic at these temps is much higher than the air pressure, and the temp is well below where they start to decompose into nasty things so I dont think these require ventilation unless you’re doing something frightening like switching between ABS and polycarbonate and not properly clearing out the extruder first.

2) The MK8 extruder has what I think is a flaw. It will work great for a while and then eventually, and regularly it will just stop extruding. The shaft of the stepper motor that drives the feed wheel has a flat section along it that the setscrew in the feed wheel can be tightened against. The problem is the setscrew is so close to the body of the stepper motor that it does not actually engage this notch. The flat section of the axel doesn’t go close enough to the motor to catch it. So it’s just tightened against the round part of the shaft at the base. This works, but the thermal stresses of the wheel will eventually cause it to come loose and just spin. So you can either regularly take it apart and tighten the wheel (the design is excellent here, it’s very easy to get apart and service to this point) or you can use a dremel and a cutting wheel to extend the flat section of the shaft another mm which is all thats necessary. There are all kinds of problems with doing this potentially, so unless you’re comfortable with your demel you might not want to attempt it. I would also cover the body of the motor and especially the root of the shaft in blue tape to keep little metal bits from getting inside. Once you do this fix though your extruder will work perfectly.

3) you cannot completely level the build platform when it’s cool. Even the newly designed one will still move a bit when it’s hot leading to problems with printing. After running the platform leveling script you will have adjust it again when it’s hot. watch the first layer of one of the calibration prints print and adjust as it’s printing. This is potentially dangerous with your hands inside the thing and it will be hot, but it’s necessary to get good prints.

4) when your stepstruder is skipping DO NOT PUSH down on the filament! You will crash the heads into the platform and ruin one or both of your nozzles and score a line into the build surface. I am awaiting the MK8 .4mm nozzle to come back into stock so I can replace the left one which I ruined. If your plastic extrudes during the load process and looks app uneven or shoots to one side you’ve either got a clogged nozzle or you’ve fmirkled the end of it against the build platform. Be gentle with the end of these, they look like brass and can be easily messed up.

5) You can’t get large prints to stick to the platform. Everything pulls away for me, regardless of build platform temperature, raft, no raft or whatever. The way to solve this problem people have discovered is to pour some acetone into a jar and put in a bunch of your ABS scraps. Then when it has dissolved spread it with a qtip on the kapton tape of the build platform. This works wonders really, dont waste too much time thinking you dont need this before you try it, it makes everything work better to have the thing you’re printing properly stuck to the build platform. It doesn’t take much, just make the tape look all messy but not gloppy.

This is a huge print, and lifted a huge amount off the platform while printing. This can cause the model to just be off a bit which may not be a big deal depending on what you’re printing, or it may cause the print heads to bump into the model and knock it completely loose. 


6) PLA is beautiful, you will want to print with this. Print test cubes with it and find the lowest temperature where it properly extrudes and print at that temp. You can change this temp in the gcode manually, there are instructions on the makerbot site for lowering this temp, it’s not hard. Each roll of PLA I’ve gotten (though I’ve purchased some from other sources like amazon and ebay) has a different ideal build temp. Otherwise it will sag, but if you get the temp right you’ll be able to print anything you can print in ABS with it perfectly.


This red PLA printed at ABS temp you can see that it makes little bridges as it’s so liquid it keeps flowing it also sagged horribly over the top of the cube. Printed at 175 this PLA prints very good.

This orange PLA printed at 190 and it’s perfect, no bridging or extra flowing and it easily spanned the top of this empty box with no internal support without any noticeable sagging at all. This was before I discovered the secret of the ABS glue for the build platform though and had it heated up to 110C to make the cubes stick. You can see that this caused the bases to bulge out a little. With the plastic dissolved in acetone and placed on the platform you can use a much lower build platform temp and keep that from happening too.



7) make sure during the load process you get all the ABS out. Bits can come  out as you start your print, and if you’re printing at a lower temp than the ABS is fully liquid at (I’ve got a roll of red PLA that is mostly amorphous and not crystalin and it can be printed as low as 170 to get it to stop sagging, my makerbot rolls of pla print good at 180 and I’ve got a roll of orange that is so crystaline that it can print without sagging at 220 same as ABS, experiment) then the abs will clog the extruder. It may be necessary to start a calibration print at ABS temp to get all the ABS out before you can switch back and forth without difficulty.

9) keep an eye on your spools. The filament can get wrapped around the spindle and hang up, or it can even have been put onto the spool tangled in the first place. The roll of black my makerbot came was so helplessly tangled that i had to unroll half of it and roll it back up.

10) the first layer will look nasty, dont stop it each time the first layer has a glop or doesn’t look even. It will get itself sorted out and a few layers later it will look great.

11) tinkercad to start with! If you’ve not done 3D design, or you want your kids to get started quickly use this. It’s not for complex things, but for starting out and doing some simple things this is absolutely fantastic. I’ve even used it for some duelstrusion builds.

12) Really this thing is awesome, and I’m starting to be able to design and print actual useful things that I bought it for (you know, other than just making sure the kids had a heads up into the new age of design for things, my children will be employable or self employable ;)



Ben designed that pumpkin ALMOST all by himself on the tinkercad site and he’s just 7.

Tuesday, June 12, 2012

RFID for XTension

It’s remarkably easy to setup an RFID access control system with XTension even though the parts dont always come with a fancy plastic case and a DB9 plug.


.code { background:#f5f8fa; background-repeat:no-repeat; border: solid #5C7B90; border-width: 1px 1px 1px 20px; color: #000000; font: 13px 'Courier New', Courier, monospace; line-height: 16px; margin: 10px 0 10px 10px; max-height: 200px; min-height: 16px; overflow: auto; padding: 28px 10px 10px; width: 90%; } .code:hover { background-repeat:no-repeat; }