⭐ WELCOME 2 MY WEBSITE ⭐ A $20 radio that teaches you CW ⭐ di-dah-di-dit ⭐ no soldering required ⭐ flashes from your web browser ⭐ 73! ⭐

Welcome, fellow radio nerd! 👋 This here is a school project all about turning a dirt-cheap Quansheng UV-K1 (a.k.a. UV-K5 V3) handheld radio into a dedicated Morse code trainer. You flash some custom firmware, the radio forgets it was ever a radio, and boots straight into a little CW classroom. Costs about $20!!

📱 What the heck is a Quansheng K1?

The Quansheng UV-K1 (sold in some places as the UV-K5 V3) is a tiny, wildly popular dual-band ham radio handheld. It became famous because it is cheap and its firmware can be completely rewritten by hobbyists. People have crammed spectrum analyzers, FM radios, and little games onto it.

This project takes that hackability and points it at one job: teaching you Morse code. The radio part (transmitting, receiving, antennas) is switched completely off. No license needed to practice — it just beeps at you and quizzes you, like a pocket flash-card machine that speaks in dits and dahs.

📝 The boring-but-important specs

RadioQuansheng UV-K1 / UV-K5 V3
Brain (MCU)PY32F071 (newer chip than the original UV-K5 V1)
Screen128 × 64 monochrome LCD (ST7565)
InputThe radio's own rubber keypad (numbers do the answers!)
PriceRoughly $15–$30 depending where you look
SoundBuilt-in speaker sidetone — adjustable tone & WPM
LicenseOpen source (Apache-2.0), built on the F4HWN & NR7Y firmware

🤓 Why learn CW on a $20 radio?

Morse code (CW) is still one of the most fun and efficient ways to make contacts on the ham bands. The trouble is, dedicated code-practice gadgets and fancy apps can get pricey, and computer trainers chain you to a desk. The whole pitch of this project:

  • It's the cheapest "accessory" in ham radio. A spare K1 costs less than a night out, and doubles as a learning tool you keep in your pocket.
  • No computer, no internet, no desk. Practice on the couch, on the bus, in line at the store. It's a self-contained little classroom.
  • No license required to start. Nothing transmits. It only makes beeps and asks you what you heard.
  • It's adaptive. The trainer watches which characters trip you up and drills those harder — just like a good teacher.
  • It's already in your shack. Tons of hams already own a K-series Quansheng. Flash a second one and you've got a trainer for free-ish.
💡 The big idea: instead of buying a one-trick code-practice oscillator, spend the same money on a whole radio that teaches you the code and can be flashed back to a normal radio whenever you want.

🎓 The Trainer Modes (the fun part)

School is in session two ways here. The copy modes all work the same friendly way: the radio plays a bit of Morse, shows you up to four answers, and you press the matching number key (1–4). It grades you instantly, keeps score, and quietly tracks your weak spots. Then the sending modes flip the desk around: you do the keying and the radio does the grading.

1. 📈 Koch — the classic ladder

Starts you with just a couple of characters at full speed, and automatically adds a new character once you're getting groups clean. It climbs from single letters → pairs → triples → whole words. This is the proven "Koch method" that real CW teachers swear by.

2. 🧐 Confuse — drills your mix-ups

Keeps a little "confusion matrix" of the characters you personally get mixed up (like U vs V or 5 vs H) and feeds you those look-alike pairs until you can tell them apart cold.

3. 💬 Phrase — real ham shorthand

Plays common words, abbreviations, and prosigns you'll actually hear on the air (73, CQ, QTH, BK…) so the code starts sounding like language instead of random letters.

4. ⚡ Rapid — on-air realism

Fires off callsigns, words, numbers, and US state abbreviations, multiple-choice style, to build the quick recognition you need for contesting and rag-chewing.

~*~ And now, sending class! ~*~
These use a real key: wire in a paddle with the optional 3.5 mm jack mod (see below) — or, in a pinch, the PTT button works as a straight key, no soldering at all.

5. 📣 Send — free practice

Just send! The radio decodes your keying live on the screen, so you can see what your fist actually said (as opposed to what you meant to say).

6. 📋 Send Test — graded copybook

It shows you a character or short group; you key it back. Your dits and dahs get compared element by element against the real thing, with a little caret pointing at exactly where you went off the rails.

7. 🏃 Runner — you hold the frequency

A pretend contest pileup! You call CQ and 1–3 stations answer — each with its own speed, pitch, and even fading (QSB). Copy their calls and work 'em on the paddle, just like running a frequency in a real contest.

8. 🚶 Walker — search & pounce

The other side of contesting: stations call CQ and you answer. Pick your flavor of exchange — Serial, CWT, SST, POTA, or Field Day — and go get 'em.

⌨️ The keypad cheat-sheet

1–4 pick answer A select / WPM + # WPM − B / C navigate D back * replay sound 0–9 digits

📷 Screenshots from the lil' screen

Here's what the trainer actually looks like on that 128×64 LCD. (Drawn to scale, pixel-faithful — the real backlight is this greeny color.)

(These are faithful mockups of the trainer's actual on-screen layout — swap in real device photos here once you've got the K1 in hand!)


💾 Download the firmware

Every release is built straight from the source code by a GitHub Actions robot the moment a version tag is pushed — no mystery binaries, you can literally watch it compile. Grab the freshest one right here:

Older versions & release notes: Releases page  ·  Source code: github.com/jsvana/sheng.school


🔌 How to flash it (right from your browser!)

The amazing part: you don't need to install anything. The K-series flashes over a web tool called UVTools2 using WebSerial, straight in Chrome, Chromium, or Edge. Here's the drill:

⚠️ READ THIS FIRST: messing with firmware can brick your radio. This firmware (and this site) has no warranty whatsoever — do it at your own risk. Only flash V3/K1 firmware to a K1 / UV-K5 V3. Never flash V1/V2 firmware to it.

💾 Step 0: Back up your calibration FIRST

Before anything, use UVTools2's Dump Calib mode to save a calibration.dat file. If anything goes sideways, this is your lifeline. Tip: rename the file with the radio's serial number so you don't mix units up.

🔥 Step-by-step flash

  1. Plug the radio into your computer with a Quansheng USB programming cable (the USB-C one, or the Baofeng/Kenwood double-jack cable).
  2. Put the radio into DFU / flash mode: hold the PTT button while turning it on. (On the trainer build, the bootloader still works this way, so you can always re-flash.)
  3. Open UVTools2 in Flash mode in Chrome / Edge.
  4. Choose the k1-cw-trainer.bin file you grabbed from the Download section above.
  5. Click Flash Firmware, then pick the serial port for your radio when asked.
  6. Watch the progress bar. When it's done, the radio restarts — straight into the CW trainer. 🎉
💡 Want a real paddle? The trainer works fine with the keypad alone, but there's an optional solder mod (the NR7Y "paddle rework") that wires a 3.5 mm jack to the tip/sleeve pins so you can send with a real iambic paddle. The rework doc lives in the NR7Y CW firmware project. Totally optional — skip it if you just want to copy code (and remember, the PTT button doubles as a straight key).

🏗️ Building it yourself (for the brave)

Don't trust binaries off the internet? Good instinct! The whole project — firmware and this very website — lives in one open-source repo: github.com/jsvana/sheng.school (Apache-2.0). The firmware sources are in the fw/ folder, and the CMake Trainer preset strips out all the RF features and leaves a lean, mean morse machine. Recipe:

  1. Install the ARM GNU toolchain (arm-none-eabi-gcc 13.x), plus CMake 3.21+ and Ninja.
  2. git clone https://github.com/jsvana/sheng.school.git && cd sheng.school/fw
  3. cmake --preset Trainer && cmake --build --preset Trainer
  4. Your fresh firmware pops out at fw/build/Trainer/firmware.bin — flash it exactly like the downloaded one.

Allergic to toolchains? There's a Docker helper too: ./compile-with-docker.sh Trainer. And if you want to see how the official downloads get made, peek at the release workflow — the exact same steps, run by the robot.


🛒 Where to buy a K1

You'll want a Quansheng UV-K1 or UV-K5 V3 (make sure it's the newer PY32-based version). Grab one here:

⚠️ Buy the RIGHT version! This firmware is only for the UV-K1 / UV-K5 V3 (PY32F071 chip). The older UV-K5 / K5(8) / K6 V1/V2 use a different chip and will not work with this build. When in doubt, ask the seller.

🎓 Graduated? Come join BKG!

Here's the deal: this trainer isn't the destination — it's school. Once you can actually copy code, the real fun is getting on the air with other CW ops. That's what BKG is for. Learn the code here first, then come hang out with the crew and put those dits and dahs to work. 📡

🎓 Class dismissed! Don't join to learn CW — learn CW here, then join to use it. See you on the bands. 72/73!