MORSE TRAINER: MEDIA PEMBELAJARAN KODE MORSE DIGITAL BERBASIS MIKROKONTROLER

MORSE TRAINER: MEDIA PEMBELAJARAN KODE MORSE DIGITAL BERBASIS MIKROKONTROLER

Adidan Ari Sena Putra1, Faris Abdurrahman Hilmi Kusuma2, Muhammad Jihar Mumtaz Attaya3, Rafa Rizky Wijaya4

 

Jurusan Teknik Elektro, Prodi Teknologi Rekayasa Elektronika, Politeknik Negeri Semarang

Jl. Prof. Soedarto, Tembalang, Kec, Tembalang, Kota Semarang, Jawa Tengah, 50275

 1adidan.43423001@mhs.polines.ac.id

2faris.43423007@mhs.polines.ac.id

3jihar.43423013@mhs.polines.ac.id

4rafa.43423019@mhs.polines.ac.id

INTISARI - Penelitian ini bertujuan mengembangkan prototipe modul pembelajaran kode Morse interaktif berbasis mikrokontroler Waveshare Zero RP2040 menggunakan model pengembangan ADDIE untuk menggantikan metode konvensional di tingkat SMP/SMA. Sistem bekerja dengan menerima input digital dari push button DIT dan DAH, lalu memprosesnya melalui algoritma Iambic keying dan penstabil sinyal berbasis WPM. Hasil penerjemahan kode Morse secara otomatis dikirimkan sebagai karakter teks langsung ke komputer melalui fungsi USB HID dengan disertai indikator suara dari buzzer pasif.

Kata Kunci: Kode Morse, Media Pembelajaran, Pramuka, Waveshare Zero RP2040, USB HID.

 

I. PENDAHULUAN

A. Latar Belakang

Kode Morse merupakan salah satu materi komunikasi dasar dalam kegiatan kepramukaan tingkat SMP dan SMA yang menggunakan kombinasi simbol dit (.) dan dah (-) untuk merepresentasikan huruf, angka, dan pesan tertentu. Namun, pembelajaran kode Morse masih sering dilakukan secara konvensional seperti menggunakan peluit, senter, atau penulisan manual sehingga kurang memberikan pengalaman interaktif bagi peserta didik.

Oleh karena itu, dibuat prototipe modul pembelajaran kode Morse berbasis mikrokontroler sebagai media praktik interaktif. Modul ini memungkinkan pengguna memasukkan kode Morse melalui tombol dit dan dah, kemudian sistem menerjemahkannya menjadi karakter seperti penggunaan keyboard. Dengan adanya modul ini, pembelajaran kode Morse diharapkan menjadi lebih menarik serta membantu memahami penerapan teknologi elektronika dalam kegiatan kepramukaan.

II. METODOLOGI PENELITIAN

Metodologi penelitian ini mengadopsi model pengembangan ADDIE (Analysis, Design, Development, Implementation, Evaluation) karena tahapannya yang terstruktur dan berfokus pada pengembangan media pembelajaran berbasis produk.

1. Tahap Analisis (Analysis)

Tahap awal untuk mengidentifikasi kebutuhan dasar sebelum merancang alat.

  • Analisis Masalah: Mengidentifikasi kendala pembelajaran kode Morse konvensional (peluit/senter) di tingkat SMP/SMA yang kurang interaktif.

  • Analisis Kebutuhan Alat: Menentukan komponen utama yang dibutuhkan, seperti Raspberry Pi Pico Zero sebagai otak sistem, tombol mekanik untuk dit dan dah, layar OLED/LCD untuk menampilkan hasil terjemahan karakter, serta buzzer sebagai indikator suara.

2. Tahap Perancangan (Design)

Tahap membuat cetak biru (blueprint) perangkat keras (hardware) dan perangkat lunak (software).

  • Perancangan Blok Diagram Sistem: Merancang aliran data dari input (tombol dit dan dah) ➔ diproses oleh mikrokontroler Raspberry Pi Pico Zero ➔ output (tampilan karakter di layar dan suara buzzer).

  • Perancangan Skematik Elektronika: Membuat jalur pengkabelan antar komponen agar tidak terjadi korsleting.

  • Perancangan Algoritma Pemrograman: Menyusun flowchart atau logika pemrograman (misalnya menggunakan MicroPython atau C++) untuk menentukan jeda waktu (timing) pembeda antara ketukan dit (pendek) dan dah (panjang), serta jeda antar huruf/kata.

3. Tahap Pengembangan (Development)

Tahap realisasi dan perakitan dari rancangan yang telah dibuat.

  • Perakitan Hardware: Memasang mikrokontroler, tombol, screen, dan buzzer pada papan sirkuit (breadboard/PCB) serta pembuatan casing modul agar ergonomis bagi siswa.

  • Coding & Debugging: Menulis kode program untuk menerjemahkan kombinasi kode Morse menjadi karakter teks (fungsi seperti keyboard) dan melakukan perbaikan jika terdapat galat (bug) pada pembacaan ketukan.

  • Validasi Ahli: Melakukan uji kelayakan awal ke ahli media/elektronika untuk memastikan alat aman dan berfungsi sesuai prinsip kode Morse yang benar sebelum dibawa ke lapangan.

4. Tahap Implementasi (Implementation)

Tahap pengujian modul langsung kepada target pengguna (peserta didik).

  • Subjek Uji Coba: Anggota Pramuka tingkat SMP atau SMA.

  • Skenario Praktik:

    1. Peserta didik diberikan pengenalan singkat mengenai modul.

    2. Peserta didik mempraktikkan penginputan kode Morse melalui tombol dit dan dah.

    3. Sistem secara otomatis menerjemahkan input tersebut menjadi teks di layar secara real-time.

5. Tahap Evaluasi (Evaluation)

Tahap mengukur keberhasilan alat berdasarkan tujuan yang ingin dicapai.

  • Uji Fungsionalitas Alat: Memastikan tingkat akurasi mikrokontroler dalam menerjemahkan input kode Morse (menghitung persentase keberhasilan pembacaan alat).

  • Uji Efektivitas Pembelajaran: Menyebarkan kuesioner/angket sederhana atau melakukan wawancara kepada peserta didik setelah praktik untuk mengukur peningkatan pemahaman mereka terhadap kode Morse serta ketertarikan mereka terhadap integrasi teknologi elektronika ini.

III. HASIL DAN PEMBAHASAN
A. Cara Kerja Sistem
  1. Inisialisasi Sistem: Mengonfigurasi pin tombol dit dan dah, mengatur nada buzzer (1900 Hz), serta mengaktifkan pustaka USB HID agar modul terbaca sebagai keyboard komputer.
  2. Kalkulasi Waktu (WPM): Menghitung durasi ketukan dit, dah, serta jeda ideal antarhuruf dan antarkata secara otomatis berdasarkan standar kecepatan 25 WPM.
  3. Penyaringan Sinyal (Debounce): Memeriksa status tombol secara terus-menerus dan menyaring getaran mekanis (noise) agar ketukan tombol terbaca stabil dan akurat.
  4. Perekaman Ketukan: Menyimpan urutan titik dan garis ke dalam memori sementara (morse_buffer) setiap kali pengguna menekan tombol dit atau dah.
  5. Logika Iambic (Alternasi): Mengatur antrean ketukan secara otomatis ketika kedua tombol ditekan bersamaan, menghasilkan pola titik dan garis bergantian yang presisi.
  6. Penerjemahan Karakter: Mengonversi kumpulan sandi di morse_buffer menjadi huruf, angka, atau fungsi backspace setelah mendeteksi jeda waktu antarhuruf selesai.
  7. Output Keyboard: Mengirimkan karakter hasil terjemahan langsung ke komputer melalui USB HID, seolah-olah diketik menggunakan keyboard fisik.
  8. Spasi Otomatis: Mengetik karakter spasi (" ") secara otomatis pada layar jika sistem mendeteksi pengguna tidak menekan tombol selama jeda waktu antarkata.
  9. Indikator Kesalahan: Membunyikan buzzer dengan nada pendek sebanyak 3 kali sebagai peringatan jika kombinasi kode Morse yang dimasukkan tidak terdaftar di kamus.

B. Diagram Blok Sistem

  • Masukan: Penekanan push button (tombol DIT atau DAH) sebagai sinyal kode Morse.
  • Proses: Mikrokontroler Waveshare Zero RP2040 memproses ketukan tombol dan menerjemahkannya menjadi teks.
  • Keluaran: Karakter teks dikirimkan ke perangkat (laptop/HP) disertai bunyi side tone dari buzzer pasif.
C. Diagram Alir
D. Kode Program Utama

import time
import board
import digitalio
import pwmio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS

# ==========================================
# --- 1. KONFIGURASI PIN HARDWARE ---
# ==========================================
# Tuas Dit (Kiri)
pin_dit = digitalio.DigitalInOut(board.GP0)
pin_dit.direction = digitalio.Direction.INPUT
pin_dit.pull = digitalio.Pull.UP

# Tuas Dah (Kanan)
pin_dah = digitalio.DigitalInOut(board.GP1)
pin_dah.direction = digitalio.Direction.INPUT
pin_dah.pull = digitalio.Pull.UP

# Buzzer untuk Side Tone
buzzer = pwmio.PWMOut(board.GP11, variable_frequency=True)
buzzer.duty_cycle = 0

# Setup Keyboard USB
kbd = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(kbd)

# ==========================================
# --- 2. PENGATURAN KECEPATAN (WPM) ---
# ==========================================
wpm = 25
farnsworth_wpm = 25
wordsworth_wpm = 18
pitch_hz = 1900

# Kalkulasi Waktu Jeda Morse (dalam milidetik)
t_dit_ms = 1200.0 / wpm
t_dit = int(round(t_dit_ms))
t_dah = int(round(3.0 * t_dit_ms))
t_ele_space = t_dit

t_ta = (60000.0 / farnsworth_wpm - 31.0 * t_dit_ms) / 19.0
t_tw = (60000.0 / wordsworth_wpm - 31.0 * t_dit_ms) / 19.0

if t_ta < t_dit_ms: t_ta = t_dit_ms
if t_tw < t_dit_ms: t_tw = t_dit_ms

t_char_space = int(round(3.0 * t_ta))  # Jeda antar huruf
t_word_space = int(round(7.0 * t_tw))  # Jeda antar kata (Spasi)

# ==========================================
# --- 3. KAMUS MORSE SEDERHANA ---
# ==========================================
morse_dict = {
    # Huruf
    ".-": "a", "-...": "b", "-.-.": "c", "-..": "d", ".": "e",
    "..-.": "f", "--.": "g", "....": "h", "..": "i", ".---": "j",
    "-.-": "k", ".-..": "l", "--": "m", "-.": "n", "---": "o",
    ".--.": "p", "--.-": "q", ".-.": "r", "...": "s", "-": "t",
    "..-": "u", "...-": "v", ".--": "w", "-..-": "x", "-.--": "y",
    "--..": "z",
    
    # Angka
    ".----": "1", "..---": "2", "...--": "3", "....-": "4", ".....": "5",
    "-....": "6", "--...": "7", "---..": "8", "----.": "9", "-----": "0",
    
    # Tombol Backspace
    "..--": "<BACKSPACE>"
}

# ==========================================
# --- 4. VARIABEL SISTEM & ANTI-BOUNCE ---
# ==========================================
morse_buffer = ""
last_action_time = 0
is_word_space_sent = True
last_sent_element = 0

mem_dit = False
mem_dah = False
prev_dit_raw = True
prev_dah_raw = True
stable_dit_state = True
stable_dah_state = True
last_dit_deb_time = 0
last_dah_deb_time = 0
debounce_delay = 15

# ==========================================
# --- 5. FUNGSI-FUNGSI UTAMA ---
# ==========================================
def millis():
    return int(time.monotonic() * 1000)

def scan_paddles():
    global prev_dit_raw, prev_dah_raw, stable_dit_state, stable_dah_state
    global mem_dit, mem_dah, last_dit_deb_time, last_dah_deb_time

    current_dit = pin_dit.value
    current_dah = pin_dah.value
    now = millis()

    if current_dit != prev_dit_raw: last_dit_deb_time = now
    if current_dah != prev_dah_raw: last_dah_deb_time = now

    if (now - last_dit_deb_time) > debounce_delay:
        if current_dit != stable_dit_state:
            stable_dit_state = current_dit
            if not stable_dit_state: mem_dit = True

    if (now - last_dah_deb_time) > debounce_delay:
        if current_dah != stable_dah_state:
            stable_dah_state = current_dah
            if not stable_dah_state: mem_dah = True

    prev_dit_raw = current_dit
    prev_dah_raw = current_dah

def smart_delay(wait_time):
    start = millis()
    while (millis() - start) < wait_time:
        scan_paddles()

def play_element(is_dit):
    global last_action_time, is_word_space_sent, last_sent_element
    
    buzzer.frequency = pitch_hz
    buzzer.duty_cycle = 32768 # 50% Volume
    
    smart_delay(t_dit if is_dit else t_dah)
    
    buzzer.duty_cycle = 0 # Matikan suara
    
    last_action_time = millis()
    smart_delay(t_ele_space)
    
    is_word_space_sent = False
    last_sent_element = 1 if is_dit else 2

def decode_morse():
    global morse_buffer, is_word_space_sent, last_action_time
    
    if morse_buffer in morse_dict:
        val = morse_dict[morse_buffer]
        if val == "<BACKSPACE>":
            kbd.send(Keycode.BACKSPACE)
        else:
            layout.write(val) # Langsung cetak huruf ke layar
    else:
        # Jika sandi tidak dikenal (Typo), bunyikan error
        for _ in range(3):
            buzzer.frequency = 1000
            buzzer.duty_cycle = 32768
            time.sleep(0.05)
            buzzer.duty_cycle = 0
            time.sleep(0.05)
            
    morse_buffer = ""
    is_word_space_sent = True # Reset status spasi
    last_action_time = millis()

# ==========================================
# --- 6. LOOP UTAMA PROGRAM ---
# ==========================================
while True:
    scan_paddles()
    current_time = millis()
    time_since_last_action = current_time - last_action_time

    trigger_dit = (not stable_dit_state) or mem_dit
    trigger_dah = (not stable_dah_state) or mem_dah

    # Logika Iambic Keying (Prioritas Memori)
    if trigger_dit and trigger_dah:
        if last_sent_element == 1:
            mem_dah = False
            morse_buffer += "-"
            play_element(False)
        else:
            mem_dit = False
            morse_buffer += "."
            play_element(True)
    elif trigger_dit:
        mem_dit = False
        morse_buffer += "."
        play_element(True)
    elif trigger_dah:
        mem_dah = False
        morse_buffer += "-"
        play_element(False)
    else:
        last_sent_element = 0
        
        # 1. Cetak huruf jika jeda antar-huruf terpenuhi
        if len(morse_buffer) > 0 and time_since_last_action > t_char_space:
            decode_morse()
            
        # 2. Cetak spasi otomatis jika jeda antar-kata terpenuhi
        elif len(morse_buffer) == 0 and not is_word_space_sent and time_since_last_action > t_word_space:
            layout.write(" ")
            is_word_space_sent = True



 

Komentar

Postingan populer dari blog ini

SISTEM KONVEYOR OTOMATIS DENGAN SENSOR INFRARED DAN KONTROL MANUAL

Pompa Air Otomatis Berbasis ATMega8535

SISTEM PEMANTAUAN SUHU DAN KELEMBABAN PADA SUATU RUANGAN MENGGUNAKAN SENSOR DHT22 BERBASIS MIKROKONTROLLER ARDUINO UNO ATMEGA328P