WB8NBS

NBS
This Blog will document projects I have
in progress or completed. You can search for my
handle on Flickr, Facebook, YouTube, or Picasa
for photos. I will link some of those here.

Frame and Panel Construction – Part 1: The Panel

These WordPress pages document my method of constructing a frame and raised panel door. I need to make a pair of these about 30″ x 18″ each to replace an ugly entrance to the crawl space in my home. Each door will be a single solid Pine panel, the frame will be about 2 inches wide with molding on the inside edge.

One episode of “The Woodwright’s Shop” contributed to my panel raising techniques. “Raising Panel-Zona” describes several methods, though my tools don’t match Roy’s.

I have a small panel raising plane. It is unusual in that it has an adjustable fence, there is no nicker and no flat area near the fence, the cut is beveled all the way to the edge of the work. It may have had some other use in the past but it works for panel raising. I have since added brass strips at the main wear points.

 

Making a cabinet door usually proceeds by constructing the outside frame to fit the target opening, then creating a panel to fit the frame. I have a number of frames made as practice exercises for a real job closing off the crawl space in my house. These were all based on square blanks cut from a length of 1×8 select pine from Home Depot. I used up all the spare lumber so for this weblog post I glued up some scraps and trimmed to 7 1/4 square.

Panel blank glued up and trimmed to size

Panel blank glued up and trimmed to size

 

The panel will have a quarter inch tenon all around the edges that seats inside a groove plowed around the inside edges of the frame. The first step is to define this tenon edge by measuring the frame face to groove distance so the panel  will be flush with the frame. Subsequent operations will remove wood down to these lines. I darken the marked lines with pencil.

Mark the tenon edges on the panel blank

Mark the tenon edges on the panel blank

 

The panel raising plane fence has been set to an “about here looks right” distance from the cutter tip. I’m measuring this horizontal distance carefully, maintaining the angle of the bevel.

Measuring horizontal length of the bevel cut

Measuring horizontal length of the bevel cut

 

I will be defining the inside line of the raised area using a cutting gauge. This is necessary, especially on the cross grain sides because the plane does not have a nicker. Here I transfer the measurement from the previous step to the gauge.

Transfer bevel dimension to cutting gauge

Transfer bevel dimension to cutting gauge

 

Cut the gauge lines deeply into all four sides of the panel blank.

Cutting bevel extent lines

Cutting bevel extent lines

 

Here I have darkened the lines with pencil.

Bevel lines darkened

Bevel lines darkened

 

One hand tool principle I have learned well is to remove as much material as you can with the blade that is easiest to sharpen. I block plane off wood down to about 1/16 inch from my two lines.

Removing waste wood

Removing waste wood

 

 

Now the panel raising plane does it’s work, starting with the cross grain edges. This plane works well across the grain because it has a steeply skewed blade. Which also means it is hard to sharpen.

Using the panel raising plane

Using the panel raising plane

 

Raising the center creates a shadow line which makes the panel look a bit smaller and lighter.

Panel showing shadow line

Panel showing shadow line

 

The final step is rabbiting the back of the panel to the line. This M-F 85 has the fence set to cut a quarter inch wide relief and the depth stop set to stop at my line. Since the raised portion of the panel is angled, the edge tenon is tapered so I will make this a little less than a quarter inch thick to make it easier to fit the frame groove.

Rabbiting the back side

Rabbiting the back side

 

The finished panel came out fairly well though I had trouble with the panel raising plane. I believe the blade is not bedding flat inside the body which causes the blade to flex slightly and chatter. The wedge also loosens too easily which causes the blade to fall out. I’m working on it.

Finished panel

Finished panel

 

And it does fit the frame. See how all those shadow lines make the panel look like something other than a flat board.

Finished panel fitted in frame

Finished panel fitted in frame

 

Frame and Panel Construction – Part 2: The Frame

These two WordPress pages document my method of constructing a frame and raised panel door. I need to make a pair of these about 30″ x 18″ to replace an ugly entrance to the crawl space in my home. Each door will be a single solid Pine panel, the frame will be about 2 inches wide with an Ovolo molding on the inside edge. An Ovolo is a quarter round with a small step. It creates a shadow line around the inside of the frame which softens the edge visually.

Completed practice panel

Completed practice panel

 

Another goal is to, as much as possible, use only hand tools in the project. A few years ago I acquired a small panel raising plane at an estate sale and it’s time to put it to work. This photo shows some of the tools used in creating a frame.

Hand tools used

Hand tools used in frame construction

 

Three episodes of “The Woodwright’s Shop” contributed to my techniques.
Raising Panel-Zona” describes several methods of making a raised panel.
Painless Panel Doors” where Roy constructs a mortise and tenon frame.
Simple Sash Restoration” shows how to join a frame with molding around the inside.

To understand and practice the procedure I’ve made several small framed raised panels. These will find their way into a box or maybe a lamp sometime in the future. This procedure builds a frame to house a pre-constructed panel though usually the frame will be built first, made to fit an existing opening, then a panel constructed to fit.


This, the second page of my frame and panel series describes the frame construction.  It turns out that making the frame, with a molded inside edge, is harder than building the raised panel.

My practice raised panels were cut from 1×8 pine, resulting in a 7 1/4″ square panel. The frame begins with two 10 3/4″ rails and two 11″ stiles cut from a pine 1×4 ripped down the middle.The stiles are longer than needed to make them more likely to survive the mortise chisel.

The raised panels have a centerline mark so the first step is to mark a centerline as an alignment reference on the frame pieces.

Center line used as reference

Center line used as reference

 

The stiles and rails are inspected. the best sides marked as face, and a position in the frame picked and marked.

Two stiles, two rails with face sides marked

Two stiles, two rails with face sides marked

 

The panel with grain vertical, and both rails are turned bottom up and aligned with the center marks. Four tenon shoulders must be located on the rails. These are aligned with the inside edge of the panel back rabbit but an allowance should be made for the panel expanding across the grain in humid conditions. I use a thick steel ruler as a spacer which results in about 1/32 inch extra. The 12 inch ruler is flexible and bent down so it butts up tight against the rabbit. Both left and right side tenon shoulders are marked on the rails. They are knifed later.

Marking for rail shoulders

Marking for rail shoulders

 

On the face side, the tenon shoulder is a quarter inch farther out to allow for coping the molded edge. Here the back side line has been extended up the rails side and I used a 1/4″ brass spacer to locate the face side shoulder.

Quarter inch spacer defining face shoulder

Quarter inch spacer defining face shoulder

 

This shows the offset shoulder laid out. The face and rear shoulder lines will be knifed to help with accurate sawing, the short side lines are not knifed.

Rail tenon offset to allow coping

Rail tenon offset to allow coping

 

My practice raised panels varied a bit in depth so here I am checking the distance between panel top surface and the bottom of the rear rabbit. Ideally the distance between the top surface of the panel and the bottom of the rear rabbit groove will be 9/16″ which will allow 1/4″ panel raise, 1/4″ panel edge thickness, and 1/16″ for the Ovolo molding.

Measure for tenon depth

Measure for tenon depth

 

Set the mortise gauge outside pin to exactly the depth measured above.  The separation between the two pins is set to exactly the width of my quarter inch mortise chisel.

Set bottom pin of tenon gauge

Set bottom pin of tenon gauge

 

Tenons are marked with the mortise gauge then penciled in lightly. Note here the face side line is scratched shorter that the rear side because of the offset shoulder.

Tenons outlined with pencil

Tenons outlined with pencil

 

Now to cut the tenon cheeks. As Roy shows, part from one side, part from the other, then clamp the rail vertical and saw down to the shoulder line.

Sawing tenon shoulders

Sawing tenon shoulders

 

Before the tenon shoulders are cut free, a groove to receive the panel is cut with a plow plane. The depth stop is set for 5/16″ a little deeper than the panel rabbit, we don’t want it to bottom out. he plane fence is carefully adjusted so the groove runs right down the center of the tenon.

Plowing the rail groove

Plowing the rail groove

 

Once the groove is done it’s checked for depth with vernier calipers. A dry fit of the raised panel confirms the groove.

Panel dry fit in freshly cut groove

Panel dry fit in freshly cut groove

 

Next the tenon shoulders are cut off. A bench hook supports the rail while sawing.

Removing tenon shoulders

Removing tenon shoulders

 

The frame groove defines the inside extent of the tenon but the outside is marked 3/8″ in from the edge. The cut will not go all the way to the offset tenon shoulder, it stops about 1/8 inch from the shoulder to create a haunch. The haunch fills excess space in the stile groove and it will be trimmed later to fit exactly.

Gauge outside tenon edge

Gauge outside tenon edge

 

I’m using a fine tooth dovetail saw to cut the outside of the tenon. It is important that the inside and outside edges be parallel but precise width is not critical. Saw in at the haunch then cut vertically on the line.

Sawing outside tenon edge

Sawing outside tenon edge

 

With the outside wood removed, these start to look like real tenons.  In this photo you can see the offset top shoulder and the short haunch left.

Sawn tenons with haunch stub

Sawn tenons with haunch stub

 

Nobody’s perfect and my tenon sawing technique needs a lot more practice. In the meantime I made a jig so I could true up the sawn surfaces with a router plane. I cleaned each face until the tenons measured exactly 1/4″ with my calipers. This also ensures that all four tenons are the same depth from the rail faces. The jig is just two pieces of 3/4″ MDF clamped to the table top with a machine screw. They support the router plane while it’s doing it’s thing.

Tuning tenons

Tuning tenons

 

Now the completed tenon outlines have to be transferred to the rails to define the matching mortises. I dry fit the grooved rails to the panel and lay that assembly on the rails. Everything is rear side up in this photo and the rails are aligned with the panel using the center line marks.

Dry fit to locate mortises

Dry fit to locate mortises

 

The tenons lay flat on the blank rails making it easy to mark where the mortise edges will go.

Transferring tenon edges to rail

Transferring tenon edges to rail

 

Here you can see both tenon edges are traced on to the rails.

Tenon edges traced onto rails

Tenon edges traced onto rails

 

I use an engineering square to bring the marked mortise edge lines around to the sides of the stiles. Then the mortise gauge defines the sides.

Gaugeing mortise sides

Gaugeing mortise sides

Pencil in the gauge lines and the stiles are ready for the mortise chisel.

Marked mortise locations

Marked mortise locations

 

My mortise chopping technique is straight from Roy’s video. Chop from the far end to near going deeper with each eighth inch increment, reverse the chisel and chop back near end to far. Straighten the edges and in this soft pine you will be half way through. Turn the stile over and repeat, chopping all the way through.

Chopping one side of a mortise

Chopping one side of a mortise

I

I use an engineers square to check for true inside edges. Trim with the mortise chisel if not.

Checking straightness of mortise edges

Checking straightness of mortise edges

Once the mortises are cut and dry fit successfully, I plow a groove in the stile. If all measurements were good, the groove will go through the center of both mortises.

Plowing a groove in a stile

Plowing a groove in a stile

 

This is a face side dry fit of all four joints. It’s looking like a real frame now. If the tenon shoulders were carefully cut, it will be square.

Dry fit to check squareness

Dry fit to check squareness

 

Molding the inside edges starts with cutting a thin rabbit on the inside edge. I use a Miller Falls 85 for this with the fence set to a quarter inch width and the depth stop is set to 1/16″. This should leave a quarter inch square shoulder on the inside which will be rounded over.

Planing board set up to rebate

Planing board set up to rebate

 

It took about a dozen strokes with the rabbit plane to make the 1/16 inch step.

Rabbit plane defining Ovolo

Rabbit plane defining Ovolo

 

In this photo you can see the shadow line created by the small rabbit.

Small rebate defines Ovolo

Small rebate defines Ovolo

 

To begin the Ovolo round over, I chamfer the edge with a block plane. This makes it easier for the molding plane as much of the wood is already removed. It’s a woodworking principle to always use the tool with an easily sharpened blade first.

Roughing in the Ovolo shape

Roughing in the Ovolo shape

 

I have this small hollow plane, it has a 5/16 cutter. The round edge is smaller so it takes some fussing and finally a few swipes with sandpaper to get the curve correct.

Hollow plane smoothing Ovolo molding

Hollow plane smoothing Ovolo molding

 

When all four pieces are molded, the frame is dry fitted and the edge of the rails Ovolo step carefully transferred to the stile.  I also transfer the outside edge of the rail to the stile but since the end (horn) of the stile will ultimately be cut off, that’s not really necessary. The molded edge between the two marks is removed.

Marking stile molding for removal

Marking stile molding for removal

 

I carefully chisel out the molding of the stile between the marks. The rail’s longer tenon shoulder will fit into this recess.

Removing stile molding

Removing stile molding

 

The next step is to cope the rounded molding on the rail. It will fit over the stile molding and give the illusion of a 45 degree miter. This procedure is right out of “Simple Sash Restoration” and begins by using a template to precisely miter the corner of the rail molding.

Trimming rail molding with miter template

Trimming rail molding with miter template

 

A close up of the mitered rail molding.

Mitered rail mouding

Mitered rail molding

 

Now the mitered bit is coped. a small scribing gouge is used to remove the wood visible when you look straight down at the miter. This gouge is a little too big for this job but it’s all I have.

Coping the rail molding

Coping the rail molding

 

This photo shows the coped corner.

Close up of coped Ovolo

Close up of coped Ovolo

 

The coped joint is dry fit and trimmed to fit closely. Trimming might require fine tuning the cope, planing one of the tenon shoulders, and trimming the haunch. Sometimes it helps to undercut the shoulders a bit. If the shoulders were planed, check the assembly for square afterwards.

Dry fit coped Ovolo

Dry fit coped Ovolo

 

Success is a dry fit of all four joints with no gaps.

Dry fit all four pieces

Dry fit all four pieces

 

With the panel inserted you can see what the final product will look like. Since the whole reason for separate frame and panel construction is to allow the panel to move a bit, the panel must be finished before the assembly is glued up. Finishing the glued up frame would be easier but would risk an unfinished line appearing at the panel’s long grain edges in dry weather.

Panel inserted - front

Panel inserted – front

 

The back side doesn’t show anyway but the rear of the assembled frame and panel should be flat if everything was done correctly. The protruding horns on the stiles and tenon stubs will be sawn off and planed smooth after the final glue up.

Panel inserted - rear

Panel inserted – rear

 

 

 

 

 

 

Frame and Panel Construction – Part 3: The Real Thing

Parts one and two of this series showed construction of a small frame and panel assembly. I made a half dozen of those as learning exercises for the final project, rebuilding the entrance to the crawl space in my tri-level home. This may be way over engineered but the old doors are truly ugly, made from thin paneling covered with contact paper, and besides, I wanted to learn how to make raised panels with hand tools.

Most of the techniques I used came from the Woodwright’s Shop episodes mentioned in part 2, this part 3 will document differences needed to complete the larger scale crawl space entrance.

I built a new outer frame from 2 inch pine to fit the existing opening.  I have to admit not using hand tools for that as I recently acquired a Kreg K2 jig and wanted to try it out. Also the rails on a butt jointed frame would be four inches shorter than a mitered corner frame which worked out much better with the 72″ stock I had.

Pencil study for cut list

Pencil study for cut list

 

The outside dimension of the doors is determined by the inside edges of the outer frame so I propped up the outer frame and centered the stile pieces leaving about 1/16″ gap at the sides.

Outer frame with door stiles

Outer frame with door stiles

 

Each pair of stiles was checked for parallel with pinch rods. Everything came out OK with very little tweaking. Stiles were marked top and bottom where they touched the outer frame.  Then I centered the rail blanks on the stiles and marked where they touched the rails left and right. Those four lines define the dimensions of the doors.

Checking stiles for parallel

Checking stiles for parallel

 

Here you can see tenons laid out on the four rails. These were sawn, tuned, and outlines transfered to the stiles as in part 2. Mortising the stiles, then grooving and molding the inside of each piece proceeded as in part 2.

All four rails with tenons laid out

All four rails with tenons laid out

 

I glued up two panels a couple months ago but had to square them for fitting in the frames. Could not hold the panel steady against the miter gauge so I built a miter gauge helper from a piece of heavy aluminum angle and a toggle clamp, should have done that years ago. The panel surfaces were planed with a Stanley 4 1/2.

Straighten and square the panels

Straighten and square the panels

 

Each completed door frame was laid over the square glued up stock. I aligned left and bottom panel edges with the inside of the frame, marked the top and right edges of the inside opening on the panel stock, then ruled a line one half inch farther out on the top and right. This allows room for a 1/4″ tenon all around the finished panel. I then trimmed the panel top to my ruled line on the table saw using the miter gauge as in the previous photo.

Next, the panels had to be trimmed to width. They are too tall to use the miter gauge, so I got out my standard homemade saw fence, a four inch oak timber. I used the line on the cut off top piece to adjust the fence to the proper width.

Setting fence to rip long side of panel

Setting fence to rip long side of panel

 

A deep breath moment.  I had been putting off cutting these panels to exact size because I was afraid of screwing up the measurements. In the end, they fit well.

Panel ripped to final width

Panel ripped to final width

 

As in part 1, I struck a line with a cutting gauge to define the panel step, then removed wood with a block plane to 1/16″ of the line.  Raising the panel actually means lowering the edge. It depends on your point of view. In this photo, the cross grain ends have been lowered and I’m ready to work the long grain edges.

Roughed in panel bevel

Roughed in panel bevel

 

The panel raising plane lowered the bevel to the edge line and created the top step as in part 1. This took a while as the panel raising plane was acting up and I took time to tune it. I believe the bed under the blade is not flat so the blade doesn’t fit properly.

Completed raising of both panels

Completed raising of both panels

 

There were a LOT more shavings than in part 1. Working the two panels took most of an afternoon.

Shavings from panel raising

Shavings from panel raising

 

The last operation on the panels is creating a rabbit all the way around the rear side. Always cut the cross grain ends first then the long sides. Knifing the cut line with the gauge is mandatory on the ends, the spur on this MF 85 sticks out way too far. I also used a sharp knife to relieve the wood at the left end of the rabbit before planing to reduce tearout there. There was a small amount of fuzz which I cleaned up with the wooden shoulder plane.

I had more trouble with the sides than the ends, the grain was not with me. Home Depot pine does not have a strong grain pattern and it’s hard to see how it’s running. Waxing the plane about every fifth stroke helped.

Rabbit the back side of panels

Rabbit the back side of panels

 

Checking the tongue for fit in one of the rail piece grooves. I want a good fit to keep the panel from rattling around if it shrinks. I found a web site that calculates wood movement, these 14 inch wide panels could move with humidity variations as much as an eighth of an inch.

Test fit of panel with one of the rails

Test fit of panel with one of the rails

 

Finally, the completed panels fit with very little tuning. I sawed off the frame horns and am happy with the results. This photo shows the back side of the assembled doors.

Rear view of panels assembled into frames

Rear view of panels assembled into frames

 

And this is the raised panel side.

Front side of assembled doors

Front side of assembled doors

 

The sawn off horns were rough so I converted my workbench and planing fixture into a shooting board.

Shooting a top edge

Shooting a top edge

 

Checking the frame and panel doors for fit in the frame is awkward as I don’t have an area in the garage that I trust to be flat. I had to trim 1/16″ from the left bottom, the rest fit well. There will be a final tweaking after the hinges are installed, and a final-final tweak after the glue up, and a final-final-final after it’s nailed onto the crawl space.

Checking the doors for fit

Checking the doors for fit

 

Hinge position is somewhat arbitrary. I used the bottom of the panel field as a reference. A steel ruler is held against the raised line and the outer frame marked. This sets the outer edge of the hinge gain.

Marking hinge position on outer frame

Marking hinge position on outer frame

 

Laying the hinge on the marked frame defines the inside of the hinge pocket. Both marks were squared across the inside with a knife and deepened with a chisel. I chiseled every quarter inch along the area to be removed then used a Stanley 71 to remove wood. Clamping boards to the sides gives the router plane has something to sit on.  A Stanley 71 1/2 that doesn’t have the wide gap at the front would work better for this.

The hinge plate measured .060″, I cut the pockets to about .080″deep to narrow the gap between door and outer frame.

Routing a pocket for the hinge

Routing a pocket for the hinge

 

I use a small Vix bit to establish the hinge screw position then pilot each hole with a 1/16″ drill so the screw doesn’t wander in this soft pine grain.

All four hinge gains were cut in the outer frame, hinges screwed in, then the doors were re-inserted and marked where the hinges touched. Those marks were knifed square across the outer stiles and incised with a chisel.

Preparing to seat a door hinge

Preparing to seat a door hinge

 

I was able to clamp my router support fixture on the doors. It forms a reference surface for the router plane and also furnishes a square outer edge to locate the hinge.

Router support fixture

Router support fixture

 

Here the hinges are seated and the doors dry fitted back in the outer frame.  The doors closed OK with a small amount of planing on the inside vertical edge. There will be a final fitting after the door frames are finished and glued up.

Completed frame with doors dry fitted

Completed frame with doors dry fitted

 

Tenon cheek cutoffs are perfect for trying out different finishes and I have 16 of them. I made several samples using Minwax Jacobean, Dark Walnut, and English Chestnut stains plus a few samples with various mixtures. I also experimented with Minwax Pre-Stain Conditioner which produced much more even results. Most of the wood in the house near the crawl space entrance is very dark and I thought the Jacobean would be the best match, but the wife overruled and picked the English Chestnut sample which is much warmer.

The doors were removed and completely disassembled for staining. A raised panel can not be finished in place because if it shrinks, an unfinished area would appear at the edge. So at least the stain has to go on with the panels outside the frames.  I did separately the door frames, then the panels, then the outer frame as I did not want to let the stain set too long without wiping off. The Chestnut stain did not color evenly though the conditioner did help. This photo shows the two door frames, one of the panels and the outer frame.

Stained doors

Stained doors

 

With every frame piece stained and both panels stained all the way to their edges, it was finally time to glue up the doors. I dry fitted the everything together again, reattaching the doors to the outer frame with the four hinges for a final fitting.  I noticed the hinge screws were loosening up after being removed three or four times so following a tip in a recent magazine, I drizzled super glue into the screw holes. It seems to help quite a bit.

I propped one door open, removed the center stile, pulled out one rail at a time, applied liquid hide glue to the hinge side tenon and plugged the rail back into the hinged stile. Because I did one rail at a time, the panel could remain in place. Both rails then got the inside tenon buttered with LHG, and the inside stile installed.

Since the doors were still hinged to the outer frame I could check for racking before the glue set up. I clamped the doors in the outer frame, using thin wedge shims inserted under the hinges to even the pressure.  After 2 hours for the glue setting, I did the second door the same way.

Clamping the glued up mortise and tenon joints

Clamping the glued up mortise and tenon joints

 

The next day, I removed the doors yet again and took the outer frame to the crawl space for a fitting around the opening. A little dry wall trimming was all that was necessary. Minwax semi-gloss poly was next, two coats applied to each door and to the outer frame.

Panel with Poly applied

Panel with Poly applied

 

Check out the shadow lines in this photo.

Detail showing frame molding

Detail showing frame molding

 

There were a bunch of cutoffs from ripping original stock down to two inches. I planed, stained, and varnished some of them.  These will form a lip around the inside of the crawl space opening. One of the original specifications was that the doors be insect proof.

Cutoffs to be used as seals

Cutoffs to be used as seals

 

Finally it was time to install the frame and assemble the doors.  There are only four 8d finishing nails, one at each hinge, holding the frame on in this photo. I may put more nails in the top and bottom rails after the wood acclimates but for now the doors close without rubbing anywhere. One of the finished strips was screwed to the inside edge of the left door with a quarter inch protrusion, so the right door holds the left door closed and theres no visible gap. The old doors had two magnetic catches, I reused one at the bottom of the right door.

Installed!

Installed!

 

This is what it used to look like.

Crawl space entrance Before

Crawl space entrance Before

 

This has been a four month long project with much of the time spent learning how to use hand tools to create the raised panels. I couldn’t have begun without inspiration and education from Roy Underhill. Three episodes of “The Woodwright’s Shop” contributed to the project.
Raising Panel-Zona” describes several methods of making a raised panel.
Painless Panel Doors” where Roy constructs a mortise and tenon frame.
Simple Sash Restoration” shows how to join a frame with molding around the inside.

 

How To Sharpen A Router Plane Blade

If you don’t know what a router plane is, you probably don’t need one.

I have a couple of Stanley 71 router planes. The cutters are difficult to sharpen because the bevel is blocked by the shaft that connects the foot with the plane. Last weekend, at a Midwest Tool Collectors show, I acquired a Stanley 271 which is similar to the 71 but only about a third of the size.

Stanley 71, Stanley 271 Family photo

Stanley 71, Stanley 271 Family photo

 

The small cutter in the 271 is even more difficult to sharpen that a 71 blade and this one had significant rust pitting to grind out.

271 cutter, 71 cutter

271 cutter, 71 cutter

 

The foot (business end) bottom side of these cutters is flat and ground at an angle to the plane base to provide a relief area behind the cutting edge. Flat surfaces can be ground and polished on stones in the conventional manner, I have a coarse diamond plate and with sufficient elbow grease was able to flatten and remove all rust pitting on the bottom of the 271 cutter. That little guy is hard steel!

But the bevel did not yield as easily. An internet search showed people holding the cutters upside down with the bevel on the edge of a stone. I could not hold the small cutter at a consistent angle and I was rounding over the bevel, a no-no on a plane blade. So I did what any red blooded woodworker would do. I took a nap. When I woke up I had an idea. I have a saw sharpening jig that combines a saw vise with a flat reference plate which stabilizes the triangular file. If I could create a similar reference plate parallel to the router plane blade bevel, I could use that to guide a diamond file. And this method would work just as well on a Stanley 71 cutter.

In the junk pile I found a bit of aluminum bent at a 90 degree angle. It probably was a rack spacer in a previous life. This would do as a reference.

Aluminum angle to be used as reference plate

Aluminum angle to be used as reference plate

 

Sandwiching the cutter between the machinists vise jaw and the reference surface was easy. I propped up the back end of the reference plate with wood blocks.

Cutter clamped in vise against the reference surface

Cutter clamped in vise against the reference surface

 

Now to align the surface of the bevel to the reference surface. The bevel angle on the cutter is thirty degrees. To that must be added the six degrees of the flat bottom relief angle. So the bevel is thirty six degrees from the shaft axis. I marked a 36 degree line on a plastic template and eyeballed the shaft angle.

Aligning the cutter shaft at 36 degrees

Aligning the cutter shaft at 36 degrees

 

Next, the height of the bevel above the reference surface has to be set. I am using a ruler to support the far end of the diamond file so the bevel surface must be exactly one ruler thickness above the reference.

Positioning the bevel in the jig

Positioning the bevel in the jig

 

After fussing back and forth checking the shaft angle and the bevel face altitude several times, I was ready to grind. A drop of oil went on the reference plate so the ruler would slide easily. Then hold the ruler with two fingers and press the diamond paddle tight to the ruler with another finger then slide the whole thing down the surface and back. It was easier than it sounds. I actually started with a much coarser diamond file just to get the bevel initially flat and rust free.

Filing the bevel with a diamond paddle

Filing the bevel with a diamond paddle

 

This photo shows how raising the cutter bevel to the proper height makes the paddle parallel to the reference surface.

The diamond paddle is parallel to the reference surface

The diamond paddle is parallel to the reference surface

 

Did not take long at all to get through the four diamond grits I have available and now a nice even shine on the cutter bevel. No more dubbed over.

Shiny flat bevel

Shiny flat bevel

 

I touched up the flat bottom of the cutter to polish and remove any burr.

Touching up the flat side

Touching up the flat side

 

And it works! Many times I could have used one of these little routers and now I own one. Thanks MWTCA.

It Works

It Works

 

 

Arduino Iambic Keyer 2016 – Part 1: Hardware

Third Generation:

Arduino Iambic Keyer - Top

Arduino Iambic Keyer – Top

 

Arduino Iambic Keyer - Left Side

Arduino Iambic Keyer – Left Side

 

Arduino Iambic Keyer - Right side

Arduino Iambic Keyer – Right side

 

In a Chicago winter it’s way too cold in the garage for woodworking, so I turn to coding to pass the time. In 2014 I built an ATTINY85 Morse Code keyer in an Altoids Small box and in 2015 I expanded that with an Arduino Pro Mini based keyer in a regular Altoids tin. It was a lot of fun and consumed pretty much the whole winter. I’ve written down a few ideas for enhancements and in this year’s model some of those are implemented. The hardware wish list (so far):

  1. Battery power, enabling stand alone operation > 24 hours
  2. LCD display 16×2 minimum
  3. Real Time Clock, Local and GMT
  4. More memories (7 or 8 buttons)

Batteries and LCD won’t fit in an Altoids tin. I found a metal Crayola box at Tuesday Morning. It was made by the Tin Box Company, who produce many designs that would make interesting project enclosures. It is 3″ x 5″ x 1.5″, about three times the volume of an Altoids box, the metal is slightly sturdier than Altoids but still flimsy enough to be difficult to work without distortion. I found the inside surface was coated with a thin layer of something which repelled solder unless sanded a bit first. I don’t see this particular box available any more but there is a slightly larger version. My experience indicates that the time to complete a project is inversely proportional to the size of the enclosure (maybe to the fourth power).

Unmodified Crayola Box

Unmodified Crayola Box

 

These days “Arduinos” come in many shapes and varieties. The latest official 1.6.7 IDE is almost 100 megabytes, expanded to accommodate different versions.  I wanted to try processors other than the standard ATMEGA328, so last summer bought a Teensy2.0 (32u4) and a TeensyLC (ARM Cortex M0) made by PJRC. Both promise built in USB client support. The PJ in PJRC is Paul Stoffregan, who has contributed a great deal to the Arduino community. There’s an IDE add-on “Teensyduino” that must be downloaded from the PJRC site to use Teensy boards. Teensyduino installation is dead simple and includes Teensy versions of most familiar Arduino libraries plus a few useful additions from Paul.

Last summer I worked with the Teensy2.0 a bit, wanted to see if the DDS sine wave generation function I used in the 2015 design would work. The port was successful, the 32u4 required only a few minor tweaks, and I even got Fast PWM working as described in Atmel’s documentation. PJRC has a forum where you can brag about your accomplishments so I wrote something on the 32u4 DDS sketch thinking it might be useful to others. Paul Stoffregan replied suggesting I consider a Teensy3.2 as it has an integrated Digital-Analog Converter which would produce a cleaner waveform. I fired up the similar TeensyLC and used Paul’s suggested method. DDS on the TeensyLC was also successful so I built a breadboard version of last years keyer using the LC.  Everything worked with PJRC’s libraries including DDS side tone, the PS2 keyboard, and lcd.prints added for the display.

The small module at the upper left of the breadboard is an Adafruit PAM8302 audio amplifier. Last year I struggled with a 1 transistor class A amp for the speaker, gave up on that and built an LM386 design. The PAM8302 amp at only four bucks is clearly a winning choice. The only problem I had was later on I discovered the Output side did not like being grounded and I had to insulate the external speaker jack.

First Breadboard - TeensyLC

First Breadboard – TeensyLC

 

TeensyLC has one serious limitation for my application. Because the ARM chip handles flash differently than the MEGA328, TeensyLC has only 128 bytes of emulated EEPROM. That meant limiting stored button memory to four messages only 30 characters each. At that time I was thinking about adding a Real Time Clock so looked at getting Adafruit’s FRAM breakout and their DS1307 RTC. But for less money than these two modules plus a TeensyLC I could get a Teensy3.2 module with a Cortex-M4, lots of memory, built in RTC, and 5 volt tolerant inputs. I sent off an order to Adafruit (10% off if you watch “Ask An Engineer”).

Teensys have lots of I/O pins, same spacing as the LCD modules, so I elected to mount the Teensy board directly on the LCD.  One 3 pin header and one four pin header is needed. In the next photo you can see the headers with two short gray spacers to separate the PC boards. I had to flatten one of the LCD bezel mounting tabs for clearance but the mount is very compact and rigid. Note to self: make sure you don’t need any more connections to the bottom of the board before soldering down the headers.

I had the idea to use a software driven flashing LCD back light to indicate a flat battery. ARM I/O pins are limited to 9 milliamps each, not enough for an LCD back light so a 2n2222 transistor was glued in to act as back light current switch. The trim pot on the right is for adjusting LCD contrast. It is across the back light LED pads, did not work out well, as later in development I am PWMing the 2n2222 to get adjustable back lighting. So the trim pot has been moved up on the LCD board, epoxied in place, and hard wired to ground and +3.3 volts.

Teensy3.2 Grafted on to LCD

Teensy3.2 Grafted on to LCD

 

The two wires leading off the right end of the Teensy go to a CR2032 backup battery for the Real Time Clock, and you can just see the Adafruit 32KHz crystal added on the bottom of the Teensy. With this minimal configuration I was able to test and experiment with the built in RTC using the example program furnished with the PJRC Time library, modified with LCD prints.  Initially setting the clock was a problem, you need to send a “T” followed by Unix time (seconds since 1970) into the serial port. I worked out this Linux incantation to get the proper format for Central Standard Time:
echo T$[`date +%s` – 6 * 3600]
T1453151560

Then copy “T1453151560” and paste into the Arduino serial window.  Once the clock has been set it takes care of itself though I’m not sure how. I believe it reads and sets time from code uploaded from the compiler. The Time library is more than a little obscure.

Clock Testing Processor/LCD Sandwich

Clock Testing Processor/LCD Sandwich

 

Of course many wires have to be added to interface Teensy with the rest of the keyer. It’s not so neat looking now, I’m using nearly every I/O pin plus power from the built in 3.3 volt regulator. I use mostly 24 gauge wire, solid if connecting to other points on the lid, stranded if routing to points below. I have an old Ungar fine tipped soldering iron plugged into a Variac set to about 70 percent.

Processor/LCD With Necessary Wiring

Processor/LCD With Necessary Wiring

 

There are three auxiliary perf boards in the design, One mounts seven memory switches, another holds volume control, transmit LED, and the Function button, the third has clock battery and an optoisolator for transmitter keying. These boards were carefully laid out on paper, then cut out and marked up so mounting holes could be located. Working with a hinged lid box you have to be careful to leave extra clearance for the lid to close. I did have to file a bit off the button board and the speaker.

The box needs a couple dozen holes to mount parts. Blue tape was applied to all surfaces, a layout drawn on the tape, then all holes center punched.  I start with my smallest drill bit in a drill press then enlarge 1/64 at a time to final size.  A few holes required fine tuning with a tapered reamer.  I made a rectangular cutout for the LCD bezel by using a wooden template screwed to the lid, then cutting with a 3/16 carbide router bit surrounded by a 1/4″ collar. Mounting hardware is mostly 2-56 with a few 4-40 spacers.

Crayola Lid Drilled

Crayola Lid Drilled

 

I had a pair of paralleled 18650 cells taken from a cell phone charging pack. These are fastened in the box by a strip of tin can metal soldered in, and restrained by an angle bracket soldered at one end. The small speaker was taken from a defunct IPod dock. In the next photo, most of the lid components are mounted. The small audio amp board goes on the two screws at right center of the lid, mounted mezzanine style.

Box Lid Components Mounted

Box Lid Components Mounted

 

Next is a close up of the batteries with 2 amp fuses soldered in both plus and ground leads. Also see three stereo jacks at the right side for Key/Audio Out, External Speaker, and Paddles In. You can see in the bottom three long #2 screws for mounting the third perf board and Adafruit boost/charger. Most board mounting screws have three nuts; one to secure the screw, one to support the bottom of the board at the proper height, and a third to secure the board against the second. Thank heaven I still have a Heathkit nut starter.

Mounted 18650 Cells with Fuses in Both Leads

Mounted 18650 Cells with Fuses in Both Leads

 

At the right side of the box there is a power switch, PS2 jack, and a micro USB jack breakout. The power switch does not actually switch power, it grounds the Enable pin on the charger board which turns off the boost converter.  That allows charging to continue while the rest of the unit is off.  Later in debugging the hardware, I added bypass capacitors to that switch and a separate wire to the Enable pin on the audio amplifier which suppresses a weird sequence of sounds from the speaker on powering off. The PS2 jack leads wouldn’t reach the processor board so they route to the third perf board and get jumpered there to stranded wire headed for the Teensy.  It’s getting hard to find a real PS2 keyboard but the software works fine with a USB keyboard plugged into a USB/PS2 adaptor.

Power Switch, PS2, and USB Connectors

Power Switch, PS2, and USB Connectors

 

This is a good place to register a complaint. I bought the Adafruit PowerBoost 500 board to manage the battery. It charges from 5 volt USB in and boosts from the 3 volt battery, seamlessly switching sources when you pull the USB connection. It does NOT however pass through or even break out the two USB data pins from the micro USB input jack. The only way to actually use USB while charging the battery is to wire out the D+ and D- leads outside the board. Adafruit support suggested doing this by cutting up a USB cable. I was able to route the micro USB breakout data leads (Green in the next photo) to the processor and the incoming positive and negative supply leads to the PowerBoost using a plug from an Adafruit micro USB connector (red and black in the photo). An extra $2.50 in parts that wouldn’t have been needed if Adafruit had only provided pads on the PowerBoost for D+ and D- or better, added two traces to route the data signals from the input connector to the output connector.

Detail of the Hacked USB Connection

Detail of the Hacked USB Connection

 

One more issue with the PowerBoost. It has a nice pair of status LEDs (where it says CHRG) yellow when charging and green when fully charged. These operate from a single pin on the charger chip but that pin is not broken out and you can’t of course, see the LEDs when the box is closed. I added a wire (gray, leading off to the right in the photo) to the common side of the LED dropping resistors so I could have the Teensy display charging status on the LCD.  Not difficult but would have been nice to have official access to that chip pin.

The keyer has four monitoring leads between the PowerBoost and the processor. Besides the status signal mentioned above, I wired up the LowBattery pin and USB (power).  USB activates the Status signal which is only valid when USB is plugged in and receiving power from the host.  LB goes low when the battery is REALLY flat (3.25 volts I think). I also wired the BAT pin to the Teensy A10 analog input through a 10k calibration pot so software can read and display the battery voltage. You can see the calibration pot at the bottom of the board in this photo.

TX board, PowerBoost with Voltage Cal Pot

TX board, PowerBoost with Voltage Cal Pot

 

The next photo shows how I insulated the External Speaker jack by opening up the mounting hole and screwing a small piece of Lexan to the box. The plastic had to be counterbored so the jack mounting nuts would fit.

Output Jack Insulation

Output Jack Insulation

 

Here is a close up of the box lid interior. You can see the LCD contrast pot which is glued to the LCD, perfboard for the LED, volume control, and Function button. Two screws and a couple of spacers mount the PAM8302 audio amp on top of the LED board.

LCD Contrast, Audio Amp

LCD Contrast, Audio Amp On Top of LED Board

Here is the completed keyer opened up. Clockwise from top left, I/O stereo jacks, 18650 batteries, memory button board, Teensy3.2 processor on top of 16×2 LCD display, LED board, speaker, on/off switch, PS2 keyboard jack, USB input jack, PowerBoost charger/boost converter, and the transmit interface board.

Keyer Internals

Keyer Internals

 

An Eagle schematic diagram of this project can be downloaded from:
https://dl.dropboxusercontent.com/u/40929640/ArduinoMorseCode/keyer2016/KeyerDrawings.zip

Keyer 2016 Schematic Version 1

Keyer 2016 Schematic Version 1

 

Revision History

February 25, 2016       MemoryKeyerTeensy3.2_V1.0    Initial sketch
March 9, 2016             MemoryKeyerTeensy3.2_V1.1.0  Rework battery alarm logic, bug fixes.
March 16, 2016           MemoryKeyerTeensy3.2 V1.1.1   Workaround fix LCD does not have backslash in its font.

Arduino Iambic Keyer 2016 – Part 2: Software

Requirements

The 2016 version keyer hardware has four additions that require software support; more memory buttons, stand alone battery operation, Real Time Clock, and the biggest change a 16 character 2 line Liquid Crystal Display.

Additional memory buttons need:

  • Expansion of button scanning while in operation
  • Expansion of button programming
  • Addition to default messages
  • Consideration of potential uses while not in operation

Battery and associated (PowerBoost 500c) charger/converter need:

  • Charge status monitoring
  • Discharge status monitoring and alarm
  • Work out how to turn the unit off while charging

The Teensy3.2 built in Real Time Clock will need:

  • Ability to read hardware clock and convert to display friendly form
  • Ability to set hardware clock when in stand alone mode
  • Display GMT and Local time and date
  • Desirable: sync hardware clock over serial from PC

Stand alone operation requires all information displayed on the LCD as well as the serial port.
This will require:

  • Battery charge/discharge status
  • Keyer parameters, speed and side tone frequency
  • Time and date
  • Desirable: manage the LCD backlight

A link to my sketch is at the end of this article.

Following is a description of some things I learned writing this code.

Event Loops

When I first looked at KC4IFB’s Iambic code I couldn’t see how it worked. But after a fair amount of study and experimentation (see my instrumented version) I now understand and use event loops often, avoiding delay() whenever possible.  In an Arduino sketch loop() is an event loop. It just spins forever waiting for something to do. Code entered within loop() is repeatedly executed, like scanning an input pin for a button press which sends in a ground.

Why avoid delay()? Because it stops all sketch processing until it times out. Better to use the timer to trigger an event asynchronously at the current time plus a delay interval. Let loop() continue to spin, watching over the rest of your code. An example might be:

unsigned long trigger1k;
unsigned long trigger5k;
unsigned long currentTime;
void setup() {}
void loop() {
currentTime = millis();
if (currentTime > trigger1k) {
   < do stuff every second >
   trigger1k =trigger1k + 1000;
   }
if (currentTime > trigger5k ) {
   < do stuff every five seconds >
   trigger5k = trigger5k + 5000;
   }
 }

This would not work well with delay(1000) and delay(5000) in place of the time triggers.

You can roll your own event loops. I’m doing this often in the keyer sketch. Just set up your own infinite spinner:

while (true) {
  < code executed until a break; is seen >
}

The C statement break: exits the while loop. You can make event loops inside of event loops but more than two levels gets very difficult to debug.

 

Stupid Switch Tricks

I used the “C” switch statement a lot in this years update and thought I would document some of the ideas.

Leading Zeros

This is a function to print 2-4 digit numbers with leading zeros. It can also be used to right justify a number by changing “0” to ” “. Note there are no break statements in the switch, it is entered at a point determined by “digits” then falls through all succeeding statements.

 /********************************************************
 Just to get leading zeros on up to four digit integer
 arg k is variable to print
 arg digits is # places to use
 ********************************************************/
 void lcdPz(int k, int digits) {
 switch (digits) {
   case 4:
     if (k < 1000 ) lcd.print("0");
   case 3:
     if (k < 100  ) lcd.print("0");
   case 2:
     if (k < 10   ) lcd.print("0");
   default:
     lcd.print(k);
   }
 }

 

Building a Menu with Switch

I gave a lot of thought and time to how I could do stand alone update menu system.  The menu loop is entered if the “FUNCTON” button is down when the processor boots up. Teensy3.2 does not provide easy access to the reset pin so my workaround is just switching power off and on.

In this bit of pseudocode, the switch statement just displays menu options. Pressing the “ENTER” button while a specific item is on the LCD selects that menu item for updating. I use a separate function to actually implement specific item updates but that could be done in line.

while (true) {             // Event loop
  Mtime = millis();
  if (MTime > nextMenuTime) {
  nextMenuTime = MTime + 1500; // New menu item trigger  whichMenu = (whichMenu + 1) % 8; // Counts 0 to 7
  switch (whichMenu) {
    case 0:
      < display first menu item >
    break;
    case 1:
      < display second menu item >
    break;
etc. etc.
    case 7:
      < display seventh menu >
    break;
  }        // End of switch statement
if ( < SELECT button is pressed > ) {
 < menu item# whichMenu is selected,
    do something about it  >
  }
}           // End of while() loop

 

Selecting Columns to Update

One particular problem was how to update the clock time and date. Time is displayed on the LCD as HH:MM:SS so how to click through that and change individual digits? I decided to only increment or decrement the ones digits so the second “H”, the second “M”, and second “S” digits are the only targets. I can skip everything else. Two buttons were designated as “up” and “down” and I wrote a function that returns 1 if “up” is pressed, -1 if “down” is pressed, zero if neither.

Using switch() to select the appropriate digits on the LCD easily allows skipping over columns.

case 3:                            // Set GMT time

 Ltime = now();                    // System time snapshot
 // Convert snapshot into simpler variables for display
 Lhour = hour(Ltime);              // Need the date as well
 Lmin = minute(Ltime);
 Lsec = second(Ltime);
 cursorPos = 0;                    // Start at first position
 lcd.cursor();                     // So you can see where you are
 lcd.setCursor(0, 1);
// Walk the cursor down the displayed time
 while (true) {                    // Start event loop

   Action = upDown();              // Up or Down pressed?
   if (Action != 0) {
     delay(150);                   // limit speed of change
     Changed = true;               // Flag something was changed
   }
switch (cursorPos) {
   case 0:                       // Hours tens digit
     cursorPos += 1;
   break;
   case 1:                       // Hours ones digit
     Lhour = (Lhour + Action) % 24;
   break;
   case 2:                       // Ignore the colon
     cursorPos += 1;
   break;
   case 3:                       // Skip Minutes tens digit
     cursorPos += 1;
   break;
   case 4:                       // Minutes ones digit
     Lmin = (Lmin + Action) % 60;
   break;
   case 5:                       // Ignore the colon
     cursorPos += 1;
   break;
   case 6:                       // Skip Seconds tens digit
     cursorPos += 1;
   break;
   case 7:                       // Seconds ones digit
     Lsec = (Lsec + Action) % 60;
   break;
 }                               // End of switch
if ( < ENTER button pressed > ) { 
   cursorPos = (cursorPos + 1) % 7;//  Move to next digit
  }
if ( < EXIT button pressed> ) {
  < Write changed time to the system clock >
  break;                         // Jump out
  }
  <  redisplay the time on LCD >
}
 break;                        // Exit the while()
 }

Revision History

February 25, 2016      MemoryKeyerTeensy3.2_V1.0  Initial software
March 9, 2016            MemoryKeyerTeensy3.2_v1.1.0 Rework battery alarm logic, bug fixes
March 16, 2016           MemoryKeyerTeensy3.2 V1.1.1   Workaround fix LCD does not have backslash in its font.

Arduino Iambic Keyer 2016 – Part 3: Operation

Memory Keyer 2016

Arduino Iambic Keyer - Keyboard and Paddles

Arduino Iambic Keyer – Keyboard and Paddles

 

This describes the operation of an Arduino sketch and appropriate hardware that serves as an iambic morse code keyer. This version runs on a PJRC Teensy3.2 board and libraries. It will not compile to an Atmel (traditional Arduino) processor without major changes. I chose the Cortex M4 based Teensy because it has built in Real Time Clock, a real DAC, built in USB, and lots of memory. I added a 16×2 liquid crystal display and batteries for stand alone operation.

Features

  1. Characters to be sent are buffered in an asynchronous circular queue so memory buttons or keyboard characters can be “typed ahead”.
  2. PS2 and serial terminal keyboards supported.
  3. Paddle generated morse is interpreted and printed as ASCII text.
  4. Seven 50 character memories. Each is programmable from keyboards or from paddles.
  5. Random code practice modes, letters only, letters and numbers, letters numbers and punctuation.
  6. Sending speed settable 10 to 45 WPM. Limits can be changed by recompiling.
  7. Sidetone frequency settable 100 to 1200 Hz. Limits can be changed by recompiling.
  8. Synthesized sine wave sidetone with leading and trailing edge envelope shaping.
  9. Memories and operating parameters stored in EEPROM, are easily reset to defaults.
  10. Stand alone operation from batteries. Based on tests, a 4400 MAH battery will last at least 36 hours.
  11. A Liquid Crystal Display.

Outside the Box

This keyer has five I/O connectors:

  1. A 3 conductor jack for the paddle or straight key.
  2. A 3 conductor jack for transmitter keying with an optocoupler open collector output on the tip. Line level sidetone audio is connected to the ring.
  3. An external speaker jack connected to a 2.5 watt audio amplifier.
  4. A mini DIN connector for PS2 keyboard. USB keyboards will work with an adapter.
  5. A micro USB port for programming and serial terminal connection. This also powers the unit and charges the battery.

There are eight push button switches, a volume control, and an LED:

  1. A Function button.
  2. Seven push buttons to activate individual memories.
  3. The volume control feeds a Class D amplifier for the speaker. It does not affect the level on the line output connection.
  4. The LED follows the transmit keying signal.

There is an on/off switch that also serves to reboot the processor into setup mode.

Liquid Crystal Displays have a limited space for messages so information has to be presented sequentially. Switching on power displays clock status then “Keyer Ready” is displayed on the LCD and on the serial port. The unit is then ready for normal operation.

Straight Key Operation

On power up, if the unit senses a two conductor plug in the paddle jack, it will go into Straight Key mode and just pass keying through to the transmit circuit, with side tone. Memories and other features are not available as the morse engine is never started.

Normal Iambic Operation

The dual paddle jack is wired dit paddle on tip, dah paddle on ring of the mini stereo connector. The external speaker jack will work with stereo headphones or a speaker. On the transmit jack, there is an open collector optocoupler connected to tip and line level side tone on the ring.

Software will attempt to translate paddle sent morse into ASCII which will display on the LCD and is also sent to the serial port. Decode success depends on how good your fist is. The keyer cannot decode morse received over the air.

Keyboard Operation

The keyer will accept and send characters entered from a PS2 keyboard or from a terminal emulator program such as PuTTY, or even the Arduino IDE serial window. It’s better to use an emulator that supports line at a time transmission as that gives you an opportunity to fix typing mistakes. Opening a terminal window on a USB connected PC also lets you view and log status messages sent from the keyer. PS2 support also works with a USB keyboard and appropriate USB to PS2 adapter.

All characters in the Wikipedia morse code table are supported except the underscore and the dollar sign. From either serial or PS2 keyboards, enter normal text in lower case. Entering text in upper case will suppress the next intercharacter gap, thus running two characters together. This can be used to send prosigns. For example, As (wait) or Sk (end of contact). Message text entered from the paddles will always be treated as all lower case.

Serial or PS2 keyboards use a one at a time command mode, activated by typing a back slash followed by a single character. Keyboard commands are:

  1. \+ or \= increase sending speed one Word Per Minute
  2. \- decrease sending speed one Word Per Minute
  3. \u increase sidetone frequency by 5%
  4. \d decrease sidetone frequency by 5%
  5. \w save current sidetone frequency and WPM to EEPROM memory
  6. \1, \2 … \7 send stored text as though a memory button was pressed.

Memories

Seven programmable 50 character memories are available by pressing buttons. The sketch uses a 64 byte circular buffer to queue sendable text from either keyboard or from EEPROM memory, the buffer is asynchronous so memory messages can be stacked with interspersed keyboard text. Memory messages are read as needed from EEPROM so each consumes only a single byte of circular buffer space. Memories can also be queued from the keyboards by entering commands \1 … \7.

Message memory can be programmed from compiled defaults, from either keyboard, or directly from the paddles if your sending is good which is useful in stand alone operation. To program a message into memory, press and hold the Function button, then press and release the desired memory button, then release Function. Enter your text from paddles or keyboard, then exit programing mode by clicking Function again.

Normal Operation Display

Operating parameters can be viewed on the LCD by holding the Function button. Parameters also print to the serial port. The rotating menu display will show:

  • Time and date both GMT and local
  • Sending speed and side tone frequency
  • Battery status
  • The first 16 characters of each programmable message.

Each item will be on the LCD for one second. Releasing Function stops menu rotation but does not erase the LCD which allows more time to read a particular display.

Changing Words Per Minute

Since speed may need to be adjusted according to conditions, there is a provision to change WPM on the fly. Just hold the Function button down and close a paddle. Dits increase speed, dahs decrease. On releasing Function, the changed speed writes to EEPROM.

You can also change speed from the keyboards by entering \+ to increase or \- to decrease. Entering \= will also increase WPM if you forgot to shift. If adjusting by keyboard, you must enter \w to write the new setting to EEPROM.

Changing Side Tone Frequency

This can be done from the keyboards by sending \u to raise frequency or \d to lower frequency. As with WPM, enter the command \w to save the change. Tone frequency can be set in stand alone operation from the Startup Menu described below.

Battery Status

Software constantly monitors battery voltage and the PowerBoost charger status signals. These can be seen in the operating display. Voltage is shown in hundredths with no decimal point. A fully charged battery will show about 4.20 volts, if the battery drops below 3.40 volts “LOW BATT” will show on the battery status and the LCD back light will flash. If voltage drops below the boost regulator LB threshold, about 3.25 volts the status display will show “DEAD BATT”.

Startup Mode

Arduino sketches have a separate startup() section for initializing things. It is executed once when the processor resets, just before entering the main event loop(). This keyer takes advantage of separate startup to recall and optionally change important system parameters. A normal power on sequence copies the following items from EEPROM to RAM:

  • Words Per Minute
  • Side Tone frequency
  • LCD Back light brightness
  • GMT – Local time offset

Memory messages are also stored in EEPROM but are not read into RAM. Startup then reads the Real Time Clock into the system clock.

Startup then checks to see if Code Practice mode (see below) is requested, if so, Code Practice begins as soon as the memory button is released.

Startup Menu

If Startup sees the Function button held down, it enters Startup Menu mode. Eight parameters rotate on the LCD, seven of these can be entered and changed.

  1. Sending speed Words Per Minute
  2. Side Tone frequency
  3. LCD Back light brightness
  4. System clock time (GMT)
  5. System date (also GMT)
  6. GMT – Local offset in hours
  7. Reset all stored parameters to defaults
  8. Display battery voltage and charge status

For Startup Menu purposes, three of the memory buttons are redefined. M5 is Enter, M6 is Up, M7 is Down. Click the Enter (M5) button while a menu item is on the display to activate change mode for that item. For the first three menu items and for GMT offset, Up (M6) and Down (M7) act directly on the displayed number.

Once entered, Time and Date can be set by repeatedly pressing the Enter button until the cursor is beneath the digit needing change. Once there Up and Down operate as expected. The RTC will be updated when the Time or Date menu is exited.

After a change, exit the menu item by pressing and holding Enter (M5) for longer than 2 seconds. Menu rotation will continue where it left off.

Entering menu 7 will reset all EEPROM stored parameters including the seven memory messages to defaults specified in the file “canned.h”. You can change these defaults by editing that file with the Arduino IDE and recompiling. Canned.h appears as one of the tabs at the top of the Arduino editor window.

The last Startup Menu display shows the current battery voltage and charge status. This information is also sent to the serial connection, at the menu rate of rotation, about five times per minute. A terminal emulator program like PuTTY or Minicom on the PC, can log these battery messages in a text file, you can later load the text into a spread sheet and with some amount of fussing create a charge or discharge curve for the battery. To get a discharge curve though you have to disable charging through the USB connection by cutting the red wire in the USB cable.

Startup Menu mode is exited by clicking the Function button again. Changed parameters will write to EEPROM and normal operation starts.

Synchronize the Real Time Clock

Internal system time is maintained by software in the PJRC libraries. System time is initialized at bootup from the crystal controlled, battery backed Real Time Clock inside the processor chip. You can hack set the RTC from the Startup Menu, but there is a way to synchronize the RTC with a PC clock over a USB serial connection. If the PC is itself synchronized with an Internet NTP server, the result will be within 1 or 2 seconds of WWV.

Accurate clock synchronization requires the Arduino sketch be ready to accept and process a time update at the exact moment the PC sends it. Connect the keyer to the PC with a USB cable, power up the keyer while holding the Function button down, then while the LCD displays “Enter Setup Mode”, paste the following Linux command into a shell;

date +T%s\n > /dev/ttyACM0

Release the Function button and the RTC synchronizes. There is a processing sketch included with the PJRC Time library that can be used to synchronize the clock from a Windows computer.

Code Practice Mode

Holding one of the first three memory buttons down on boot up puts the keyer in Code Practice Mode. Characters generated are based on tables in the Wikipedia article on Morse Code.

  • M1 Send letters only
  • M2 Send letters and numbers
  • M3 Send letters, numbers, and punctuation

Characters are sent in groups of five. If a serial terminal window is open it will display the sequential group number as well as the ASCII characters themselves.

Practice Mode Commands

In practice mode, the first four memory buttons adjust the delay between characters in increments of two element (dot width) times. M1 adjusts by zero, M2 by two, M3 by four, M4 by six elements giving a listener additional time to decode the sounds. Each step slows the average WPM by about 10 percent.

Pressing the M5 button pauses practice and the display back light will begin blinking. Pressing M5 again resumes but will likely have mutilated any character that was in progress. M6 increases sending speed and M7 lowers sending speed, one WPM per click. The changed speed is only effective until the keyer is reset, it is NOT written to EEPROM.

Display Mode

Normal Operating Displays are also available in Code Practice mode by pressing Function. The display will not start until the current five letter code group is completed.

Battery Status

If the battery voltage drops below 3.40 volts, the display back light will begin flashing.

Credits

Many thanks to Richard Chapman KC4IFB whose September 2009 QEX article provided the inspiration and base code for this sketch. His iambic keyer code feels exactly like my original WB4VVF Accukeyer. Also see Rarons Blog for a discussion of the tree method for decoding and encoding morse characters. It was very helpful in building efficient translation tables. The circular queue was implemented with help from examples at embeddedjournal.com. Paul Stoffregen encouraged me to try the Teensy3.2 on the PJRC forum.

 

Revision History

February 25, 2016       MemoryKeyerTeensy3.2_V1.0    Initial sketch
March 9, 2016             MemoryKeyerTeensy3.2_V1.1.0  Rework battery alarm logic, bug fixes.
March 16, 2016           MemoryKeyerTeensy3.2 V1.1.1   Workaround fix LCD does not have backslash in its font.