التعاون
فنون
الجمال والعناية
حِرَف
الثقافة والتاريخ
ترفيه
البيئة
الطعام والمشروبات
الهندسة العكسية
العلوم
رياضة
التقنية
الأجهزة القابلة للارتداء
Pocket Morse Code Learning Board - v.3
Admiral OOM

أنشأه

Admiral OOM

10. نوفمبر 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.

المواد لهذه الخطوة:

ثنائي باعث للضوء شريحيثنائي باعث للضوء شريحي27 قطع
غراء لحظي (سيانو أكريلات)غراء لحظي (سيانو أكريلات)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بطارية قرصية CR20321 قطعة
خيط PLAخيط PLA1 قطعة

الأدوات المطلوبة:

طابعة ثلاثية الأبعاد بالخيط (FDM)طابعة ثلاثية الأبعاد بالخيط (FDM)
طقم مفكّات دقيقةطقم مفكّات دقيقة
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)

تسجيل الدخول للمشاركة في النقاش

جارٍ تحميل التعليقات...