Collaborazione
ARTE
BELLEZZA E BENESSERE
MESTIERE
CULTURA E STORIA
DIVERTIMENTO
AMBIENTE
CIBO E BEVANDE
INGEGNERIA INVERSA
SCIENZE
SPORT
TECNOLOGIA
INDOSSABILI
Pocket Morse Code Learning Board - v.3
Admiral OOM

Creato da

Admiral OOM

10. novembre 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.
Avanzato
About 1 day, plus printing

Istruzioni

1

LED current and keying speed

Caricamento del notebook 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.
File di designSTLCC0 - 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.
File di designSTLCC0 - 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.

Materiali per questo passaggio:

LED chipLED chip27 pezzi
Colla istantanea (cianoacrilato)Colla istantanea (cianoacrilato)1 pezzo

Strumenti necessari:

Pinzetta a punte finiPinzetta a punte fini
Lente d'ingrandimentoLente d'ingrandimento
MultimetroMultimetro
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.

Materiali per questo passaggio:

Scheda a microcontrolloreScheda a microcontrollore1 pezzo
ResistenzaResistenza6 pezzi
PulsantePulsante1 pezzo
PortabatteriePortabatterie1 pezzo
Filo di rame smaltatoFilo di rame smaltato1 pezzo
Filo per saldaturaFilo per saldatura1 pezzo

Strumenti necessari:

Saldatore a stagnoSaldatore a stagno
Pinzetta a punte finiPinzetta a punte fini
FlussanteFlussante
Lente d'ingrandimentoLente d'ingrandimento
MultimetroMultimetro
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.

Strumenti necessari:

Adattatore USB-serialeAdattatore USB-seriale
Computer con l'IDE ArduinoComputer con l'IDE Arduino
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.

Materiali per questo passaggio:

Colla istantanea (cianoacrilato)Colla istantanea (cianoacrilato)1 pezzo
Nastro biadesivoNastro biadesivo1 pezzo
Vite autofilettanteVite autofilettante4 pezzi
Pila a bottone CR2032Pila a bottone CR20321 pezzo
Filamento PLAFilamento PLA1 pezzo

Strumenti necessari:

Stampante 3D a filamento (FDM)Stampante 3D a filamento (FDM)
Set di cacciaviti di precisioneSet di cacciaviti di precisione
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.
File di designBLENDCC0 - 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.

Materiali

12

Strumenti richiesti

9

File di progetto

3

CC0 Pubblico dominio

Questo progetto è rilasciato sotto CC0. Sei libero di copiare, modificare, distribuire e utilizzare quest'opera per qualsiasi scopo, senza chiedere permesso.

Supporta il Maker acquistando prodotti tramite il suo progetto dove guadagna una Commissione Maker stabilita dai venditori, oppure crea una nuova iterazione di questo progetto e includilo come collegamento nel tuo progetto per condividere i ricavi.

Commenti

(0)

Accedi per partecipare alla discussione

Caricamento commenti...