My [1]st [C]ode [P]ractice [O]scillator.
Like 3CPO, only mintier.

Similar projects worth following
An Arduino, a speaker, three pushbuttons, a LiPo battery, a battery charger, a power connector, and a power switch, jammed into an Altoids Smalls tin, that lets you practice Morse Code. It will send random characters, random groups of characters, or random QSOs (the odds of repeating the same QSO are essentially 0). You can set the character speed in WPM, the overall speed in WPM, the pitch in Hz, and the difficulty (for characters or groups, from 1 to 7). Settings are stored in EEPROM.

Like many people, I've always known that used Altoids tins were destined for greater things. I initially though about putting this project in one of those huge regular tins. When I saw the Arduino Pro Mini, though, I thought maybe I could cram it all into a Smalls tin. Then I discovered the TinyLily Mini. Now there's plenty of room in that tin.

NOTE: The parts list (like everything else) is TENTATIVE. I'm still 'spear-a-minting. [See what I did there? Altoids? Spearmint? Get it?]

I uploaded the Eagle .brd and .sch files, but I don't have the final board back from OSH Park, so while I think it's good, build at your own risk until I verify it.


The schematic in Eagle .sch format. I have <b><i>NOT</b></i> tested this schematic. I am waiting on the board to come back from the fab.

sch - 156.47 kB - 06/10/2016 at 06:22



The PC Board in Eagle .brd format. I have <b><i>NOT</b></i> tested this board. I am waiting on it to come back from the fab.<p><p> Go to OSH Park ( and search the Shared Projects for 1CPO_03 if you want to live dangerously.

brd - 49.38 kB - 06/10/2016 at 06:22


quicktime - 24.55 MB - 04/26/2016 at 03:21


JPEG Image - 669.01 kB - 04/26/2016 at 03:19


JPEG Image - 434.88 kB - 04/26/2016 at 03:19


View all 10 components

  • ... and going, and going ...

    Rob Bailey04/28/2016 at 06:01 0 comments

    I plugged the final prototype into a 400 mAh LiPo battery Monday night at 2145L. It ran until late Wednesday afternoon (> 40 hours). That means that I can safely use the 110 mAh battery, instead, and still have >10 hours of run time.

  • The code is fully functional, but still a WIP

    Rob Bailey04/24/2016 at 10:19 0 comments

    I'm still tweaking the code, so feel free to download from GitHub, but be aware that there will be many minor changes for a while, which I will just merge into the master branch.

  • Do we still love PARIS?

    Rob Bailey04/23/2016 at 07:03 0 comments

    For the timing in the WM8S_Morse library, I used the ARRL's Morse code speed calculations published in April 1990's QST (A Standard for Morse Timing Using the Farnsworth Technique by Jon Bloom, KE3Z) to convert character speed in WPM (c in the ARRL's calculations) and overall speed in WPM (s in the ARRL's calculations) to determine the total Farnsworth delay (t(a)) that must be spread out over the inter-character space (t(c)) and inter-word space (t(w)), the dit mark / space time (i.e., one element time, or u in the ARRL calculations), and the dah mark time, all maintaining the standard 1:1:3:7 ratio:

    The ARRL uses the more-or-less standard word PARIS, with 31 units of element mark and element space time plus 19 units of inter-character and inter-word space, or 50 total elements, for its calculations.

    In order to see if PARIS and its 50 total elements still represented a decent "word" for words-per-minute calculations of a common amateur radio QSO, I took:

    • 1,000 of the most common English words
    • the words making up the names of the 100 largest cities in the world
    • the numbers 1 through 30
    • eight of what I considered common power levels (5W, 10W, 25W, 50W, 100W, 200W, 500W, and 1KW),
    • the most common Morse prosigns,
    • the 200 highest scoring callsigns from the 2014 IARU HF contest results,
    • what I think are the 25 most common Q-signals,
    • and 150 common Morse abbreviations (like PSE, UR, ES, etc.),

    and I came up with the following statistics:

    First, the mean number of elements per word is 49.489. So as it turns out, in that regard, at least, PARIS is still a pretty good word for our purposes.

    I'd also eventually like to support weight and ratio, however, and that will require determining the average number of dits, dahs, inter-element space, inter-character space, and inter-word space per word. And in that regard, PARIS doesn't stack up as well.

    If you care of about these sorts of things, µ number of dits per word = 7.307; µ number of dahs per word = 5.431; µ number of inter-element spaces per word = 8.162; µ number of inter-character spaces per word = 3.575; and number of inter-word spaces = 1.000 (by definition).

  • Getting started

    Rob Bailey04/22/2016 at 06:54 0 comments

    Yes, those are just parts in a box. The BHMorse library and 1CPO UI working great. I hope to replace the Nano in my prototype with a TinyLily Mini over the weekend. After that, I'll start drilling holes and mounting the hardware. Standby for pictures....

View all 4 project logs

Enjoy this project?



Rob Bailey wrote 06/03/2016 at 16:54 point

Great minds think alike. I initially thought about that, so I brought the extra  I/O pins out on the PC board. But finding room on that tiny little enclosure to more jacks was difficult. There is also already a great CW paddle Arduino project out there that I couldn't hope to improve on. You certainly can replace the 1CPO software to use the built-in buttons to send CW (e.g., one for a straight key, and two for paddles), and even add a jack to key a transmitter.

I'll be posting the Eagle .brd and .sch files when the boards arrive from OSH Park in a week or so.

  Are you sure? yes | no

Anool Mahidharia wrote 06/03/2016 at 15:59 point

Awesome. This is great to practise Morse "receive" training. If you got a spare input (and memory) left, consider adding a socket for a Morse Key (and Code) to allow Morse "transmit" training. 

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates