コラボレーション
アート
美容とウェルネス
工芸
文化と歴史
エンターテインメント
環境
食品と飲料
リバースエンジニアリング
科学
スポーツ
テクノロジー
ウェアラブル
Pocket Morse Code Learning Board - v.3
Admiral OOM

作成者

Admiral OOM

10. 11月 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.
上級者
About 1 day, plus printing

手順

1

LED current and keying speed

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.
デザインファイルSTLCC0 - 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.
デザインファイルSTLCC0 - 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.

このステップの材料:

チップLEDチップLED27 個
瞬間接着剤(シアノアクリレート)瞬間接着剤(シアノアクリレート)1 個

必要な工具:

先の尖ったピンセット先の尖ったピンセット
虫眼鏡虫眼鏡
マルチメーターマルチメーター
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.

このステップの材料:

マイコンボードマイコンボード1 個
電気抵抗電気抵抗6 個
押しボタン押しボタン1 個
電池ホルダー電池ホルダー1 個
エナメル被覆銅線エナメル被覆銅線1 個
はんだ線はんだ線1 個

必要な工具:

はんだごてはんだごて
先の尖ったピンセット先の尖ったピンセット
フラックスフラックス
虫眼鏡虫眼鏡
マルチメーターマルチメーター
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.

必要な工具:

USBシリアル変換アダプターUSBシリアル変換アダプター
Arduino IDE を入れたパソコン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.

このステップの材料:

瞬間接着剤(シアノアクリレート)瞬間接着剤(シアノアクリレート)1 個
両面テープ両面テープ1 個
タッピンねじタッピンねじ4 個
CR2032 コイン電池CR2032 コイン電池1 個
PLA フィラメントPLA フィラメント1 個

必要な工具:

FDM 3D プリンターFDM 3D プリンター
精密ドライバーセット精密ドライバーセット
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.
デザインファイルBLENDCC0 - 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.

材料

12

必要な工具

9

設計ファイル

3

CC0 パブリックドメイン

このブループリントはCC0で公開されています。許可を求めずに、自由にコピー、修正、配布、あらゆる目的で使用できます。

メイカーを応援するには、ブループリント経由で製品を購入してください。メイカーには メイカーコミッション がベンダーにより設定されています。または、このブループリントの新しいイテレーションを作成し、自分のブループリントにコネクションとして含めて収益を共有できます。

ディスカッション

(0)

ログイン してディスカッションに参加

コメントを読み込み中...