Kerjasama
SENI
KECANTIKAN & KESEJAHTERAAN
KRAFTANGAN
BUDAYA & SEJARAH
HIBURAN
ALAM SEKITAR
MAKANAN & MINUMAN
KEJURUTERAAN TERBALIK
SAINS
SUKAN
TEKNOLOGI
BOLEH PAKAI
Pocket Morse Code Learning Board - v.3
Admiral OOM

Dicipta oleh

Admiral OOM

10. November 2026NO
1
0
0
0
0

Pocket Morse Code Learning Board - v.3

The pocket Morse decoder with no circuit board to order. A 3D-printed card the size of a bank card carries Dave Nathanson's decoding chart engraved in its face, with an SMD LED behind a window at every letter. Press the key short for a dot and long for a dash, and the letter you have reached lights. Everything inside is hand-wired with enamelled copper wire to an Arduino Pro Mini, running on one CR2032 coin cell. The design has not been built yet.
Lanjutan
About 1 day, plus printing

Arahan

1

LED current and keying speed

Memuatkan buku nota Jupyter…
2

The same decoder on a circuit board

That version needs a board made to order. This one is printed and wired by hand.
3

Read the chart

Dave Nathanson (KG6ZJO) drew his decoding chart in 2010: "Start with your finger at "Start Here". Then move your finger to track the Morse dots & dashes. You will arrive at the correct letter!" On this card the LEDs do the tracking: yellow-green at the dots, red at the dashes.
4

Print the card body

The card, 85.6 x 54 x 7.5 mm, with the chart engraved 0.5 mm deep, a window and LED pocket at each letter, the key hole, four screw bosses and the key-ring hole. Print it face down on a smooth bed: PLA, 0.12 mm layers, no supports.
Fail Reka BentukSTLCC0 - Free
5

Print the lid

The 1.2 mm back lid with four countersunk screw holes and the credit and instructions engraved. PLA, 0.12 mm layers, engraved side down.
Fail Reka BentukSTLCC0 - Free
6

Fit the LEDs

Press a 1206 LED into each pocket from the back, lens towards the window: yellow-green at the 14 dot rings and at Start, red at the 12 dash marks. Note each LED's cathode mark, then fix it with a tiny drop of glue at its edge, keeping the pads clean.

Bahan untuk langkah ini:

LED cipLED cip27 keping
Gam segera (sianoakrilat)Gam segera (sianoakrilat)1 keping

Alatan diperlukan:

Penyepit berhujung tirusPenyepit berhujung tirus
Kanta PembesarKanta Pembesar
MultimeterMultimeter
7

Wiring table

The 27 LEDs share six lines, D3 to D8, each LED between two of them. Wire each LED's + (anode) and - (cathode) pad to the lines below; the firmware expects exactly this. | LED | Code | Colour | + (anode) to | - (cathode) to | |---|---|---|---|---| | Start | (none) | yellow-green | D3 | D4 | | T | - | red | D4 | D3 | | E | . | yellow-green | D4 | D5 | | M | -- | red | D5 | D4 | | N | -. | yellow-green | D5 | D6 | | A | .- | red | D6 | D5 | | I | .. | yellow-green | D6 | D7 | | O | --- | red | D7 | D6 | | G | --. | yellow-green | D7 | D8 | | K | -.- | red | D8 | D7 | | D | -.. | yellow-green | D3 | D5 | | W | .-- | red | D4 | D6 | | R | .-. | yellow-green | D5 | D3 | | U | ..- | red | D5 | D7 | | S | ... | yellow-green | D6 | D4 | | Q | --.- | red | D6 | D8 | | Z | --.. | yellow-green | D7 | D5 | | Y | -.-- | red | D8 | D6 | | C | -.-. | yellow-green | D3 | D6 | | X | -..- | red | D4 | D7 | | B | -... | yellow-green | D5 | D8 | | J | .--- | red | D6 | D3 | | P | .--. | yellow-green | D7 | D4 | | L | .-.. | yellow-green | D8 | D5 | | F | ..-. | yellow-green | D3 | D7 | | V | ...- | red | D4 | D8 | | H | .... | yellow-green | D7 | D3 |
8

Wire the card

Remove the Pro Mini's power LED. Solder a 150 Ω resistor to each of D3-D8 and run a 0.2 mm solderable enamelled wire from each resistor round the cavity as that line's bus. Solder short wires from every LED pad to its bus, as the wiring table says; the iron strips the enamel. Wire the key between D2 and GND, and the cell holder's + to VCC and - to GND. Check every LED with the meter's diode test.

Bahan untuk langkah ini:

Papan mikropengawalPapan mikropengawal1 keping
RintanganRintangan6 keping
Butang tekanButang tekan1 keping
Pemegang bateriPemegang bateri1 keping
Dawai Kuprum Bersalut EnamelDawai Kuprum Bersalut Enamel1 keping
Dawai PateriDawai Pateri1 keping

Alatan diperlukan:

Alat pematerianAlat pematerian
Penyepit berhujung tirusPenyepit berhujung tirus
FluksFluks
Kanta PembesarKanta Pembesar
MultimeterMultimeter
9

The firmware

morse_card.ino: every timing is a named constant at the top. Board in the Arduino IDE: Arduino Pro or Pro Mini, ATmega328P (3.3V, 8 MHz).
morse_card.inoarduino
// Printed Morse decoder card: firmware for an Arduino Pro Mini 3.3 V / 8 MHz on a CR2032.
// Chart after Dave Nathanson's "Morse Code Receive Decoder Chart (a-z)" (KG6ZJO, copyleft 2010); codes per ITU-R M.1677-1.
// Press the key: short = dot, long = dash. The LED of the letter reached lights; a pause ends the letter.
// Generated by make_firmware.py together with wiring.md. Every timing below is ours: change it to suit you.
#include <avr/sleep.h>
#include <string.h>

const uint8_t KEY_PIN = 2;                      // INT0, key to GND, internal pull-up
const uint8_t NETS[6] = {3, 4, 5, 6, 7, 8};     // each through its own 150 ohm resistor
const unsigned long DEBOUNCE_MS = 15;
const unsigned long DASH_MS = 250;              // a press this long or longer is a dash
const unsigned long END_MS = 700;               // a pause this long ends the letter
const unsigned long BLINK_MS = 150;
const unsigned long IDLE_MS = 30000;            // then sleep until the key is pressed

struct Led { const char *code; const char *label; uint8_t a, k; };
const Led LEDS[] = {
  {"", "Start", 0, 1},
  {"-", "T", 1, 0},
  {".", "E", 1, 2},
  {"--", "M", 2, 1},
  {"-.", "N", 2, 3},
  {".-", "A", 3, 2},
  {"..", "I", 3, 4},
  {"---", "O", 4, 3},
  {"--.", "G", 4, 5},
  {"-.-", "K", 5, 4},
  {"-..", "D", 0, 2},
  {".--", "W", 1, 3},
  {".-.", "R", 2, 0},
  {"..-", "U", 2, 4},
  {"...", "S", 3, 1},
  {"--.-", "Q", 3, 5},
  {"--..", "Z", 4, 2},
  {"-.--", "Y", 5, 3},
  {"-.-.", "C", 0, 3},
  {"-..-", "X", 1, 4},
  {"-...", "B", 2, 5},
  {".---", "J", 3, 0},
  {".--.", "P", 4, 1},
  {".-..", "L", 5, 2},
  {"..-.", "F", 0, 4},
  {"...-", "V", 1, 5},
  {"....", "H", 4, 0},
};
const uint8_t COUNT = sizeof(LEDS) / sizeof(LEDS[0]);

char code[8] = "";
uint8_t len = 0;
bool down = false;
unsigned long changed = 0, lastActivity = 0;

void allOff() {
  for (uint8_t i = 0; i < 6; i++) { pinMode(NETS[i], INPUT); digitalWrite(NETS[i], LOW); }
}

void light(int8_t i) {
  allOff();
  if (i < 0) return;
  pinMode(NETS[LEDS[i].a], OUTPUT); digitalWrite(NETS[LEDS[i].a], HIGH);
  pinMode(NETS[LEDS[i].k], OUTPUT); digitalWrite(NETS[LEDS[i].k], LOW);
}

int8_t find(const char *c) {
  for (uint8_t i = 0; i < COUNT; i++) if (strcmp(LEDS[i].code, c) == 0) return i;
  return -1;
}

void blink(int8_t i, uint8_t times) {
  for (uint8_t n = 0; n < times; n++) { allOff(); delay(BLINK_MS); light(i); delay(BLINK_MS); }
}

void restart() { len = 0; code[0] = 0; light(find("")); }

void wake() {}

void sleepNow() {
  allOff();
  ADCSRA = 0;                                   // ADC off while asleep
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  noInterrupts();
  sleep_enable();
  attachInterrupt(digitalPinToInterrupt(KEY_PIN), wake, LOW);
  interrupts();
  sleep_cpu();                                  // wakes when the key pulls INT0 low
  sleep_disable();
  detachInterrupt(digitalPinToInterrupt(KEY_PIN));
  while (digitalRead(KEY_PIN) == LOW) {}        // the waking press does not count
  delay(DEBOUNCE_MS);
  restart();
  down = false;
  changed = lastActivity = millis();
}

void setup() {
  pinMode(KEY_PIN, INPUT_PULLUP);
  restart();
  changed = lastActivity = millis();
}

void loop() {
  unsigned long now = millis();
  bool pressed = digitalRead(KEY_PIN) == LOW;
  if (pressed != down && now - changed >= DEBOUNCE_MS) {
    if (!pressed) {                             // released: a dot or a dash
      code[len++] = (now - changed >= DASH_MS) ? '-' : '.';
      code[len] = 0;
      int8_t i = find(code);
      if (i < 0 || len >= sizeof(code) - 1) { blink(find(""), 3); restart(); }
      else light(i);
    }
    down = pressed;
    changed = lastActivity = now;
  }
  if (!down && len > 0 && now - changed >= END_MS) {   // the letter is finished
    blink(find(code), 3);
    restart();
    lastActivity = millis();
  }
  if (!down && millis() - lastActivity >= IDLE_MS) sleepNow();
}
10

Upload

Take the cell out. Connect a 3.3 V USB-to-serial adapter to the Pro Mini's programming pins, choose Arduino Pro or Pro Mini, ATmega328P (3.3V, 8 MHz), and upload. Start lights; key E (one short press) and E lights.

Alatan diperlukan:

Penyesuai USB ke bersiriPenyesuai USB ke bersiri
Komputer dengan Arduino IDEKomputer dengan Arduino IDE
11

Close the card

Glue the key into its hole, plunger through the face. Stick the Pro Mini and the cell holder to the lid's inside with double-sided tape, leaving the wires some slack, put a CR2032 in, and screw the lid on with four M2 x 6 self-tapping screws.

Bahan untuk langkah ini:

Gam segera (sianoakrilat)Gam segera (sianoakrilat)1 keping
Pita pelekat dua mukaPita pelekat dua muka1 keping
Skru tap sendiriSkru tap sendiri4 keping
Bateri syiling CR2032Bateri syiling CR20321 keping
Filamen PLAFilamen PLA1 keping

Alatan diperlukan:

Pencetak 3D filamen (FDM)Pencetak 3D filamen (FDM)
Set pemutar skru jituSet pemutar skru jitu
12

The build in 3D

FreeCAD model of the card: the body with its engraved chart and LED windows, the lid, and the space taken by the Pro Mini, cell holder, key and screws, checked for clashes.
Fail Reka BentukBLENDCC0 - Free
13

Troubleshooting

Printed Morse card troubleshooting.

Flow

Loading...
14

History and honest limits

The chart is **Dave Nathanson**'s (KG6ZJO), drawn in 2010 and shared as copyleft. The letter codes are ITU-R M.1677-1's. The card, its sizes, parts, wiring and timings are ours. The model was checked for clashes and the firmware compiles with all 26 codes checked against ITU, but the card has not been printed, wired or tested.

Bahan

12

Alatan Diperlukan

9

Fail reka bentuk

3

CC0 Domain Awam

Blueprint ini dikeluarkan di bawah CC0. Anda bebas menyalin, mengubah, mengedar, dan menggunakan karya ini untuk sebarang tujuan, tanpa meminta kebenaran.

Sokong Pembuat dengan membeli produk melalui Blueprint mereka di mana mereka memperoleh Komisen Pembuat ditetapkan oleh Penjual, atau cipta iterasi baru Blueprint ini dan sertakan ia sebagai sambungan dalam Blueprint anda sendiri untuk berkongsi hasil.

Perbincangan

(0)

Log masuk untuk menyertai perbincangan

Memuatkan komen...