Daftar Isi:

Binary Tree Morse Decoder: 7 Langkah (dengan Gambar)
Binary Tree Morse Decoder: 7 Langkah (dengan Gambar)

Video: Binary Tree Morse Decoder: 7 Langkah (dengan Gambar)

Video: Binary Tree Morse Decoder: 7 Langkah (dengan Gambar)
Video: Morse Code Encoder using a Binary Tree in Python | 101Computing.net 2024, November
Anonim
Image
Image
Diagram Sirkuit
Diagram Sirkuit

Instruksi ini menjelaskan cara memecahkan kode Morse Code menggunakan Arduino Uno R3.

Dekoder yang secara otomatis menyesuaikan kecepatan kirim ini mampu mendekode morse hingga minimal 80 kata per menit.

Kode yang masuk ditampilkan sebagai teks pada Arduino Serial Monitor Anda (atau layar TFT jika dipasang)

Osilator nada telah disertakan jika Anda ingin berlatih mengirim morse.

Fitur dekoder:

  • modul tampilan TFT 320 x 240 [1]
  • filter bandpass digital Goertzel untuk memisahkan sinyal yang tidak diinginkan.
  • sebuah "Pohon Morse Biner" untuk memecahkan kode sinyal
  • pelacakan kecepatan otomatis
  • output yang terdengar saat berlatih morse
  • baik teks masuk dan keluar ditampilkan.

Karakter dan simbol berikut dikenali:

  • [A.. Z]
  • [0..9]
  • [., ? ' ! / () &:; = + - _ " @]

Perkiraan biaya pelindung dekoder morse, dikurangi layar TFT, adalah $25. [1]

Gambar-gambar

  • Foto sampul menunjukkan unit yang dirakit sepenuhnya
  • Video menunjukkan decoder bekerja

Catatan

[1]

  • Modul tampilan TFT bersifat opsional karena semua teks dikirim ke "Serial Monitor" Arduino Anda.
  • Modul TFT dijelaskan dalam instruksi saya

Langkah 1: Daftar Bagian

Bagian berikut diperoleh dari

1 hanya pelindung prototipe untuk Arduino UNO R3, Pitch 2.54mm

Bagian-bagian berikut diperoleh secara lokal:

  • 1 hanya LM358 ganda opamp
  • 1 hanya LED hijau
  • 1 hanya klip LED
  • 1 hanya kapsul mikrofon electret
  • 1 hanya tombol tekan yang biasanya terbuka
  • 1 hanya soket DIP 8-pin
  • 2 hanya resistor 330 ohm
  • 2 hanya 2K2 resistor
  • 5 hanya resistor 10K ohm
  • 2 hanya 56K ohm resistor
  • 2 hanya 1uF kapasitor
  • 1 hanya 10uF kapasitor

Bagian berikut adalah opsional:

  • 1 hanya 2.2 Inch TFT SPI LCD Display Modul 240*320 ILI9341 dengan Slot Kartu SD untuk Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
  • Tombol morse / tombol tekan
  • 1 hanya transistor BC548 NPN
  • 1 hanya 1 inci speaker
  • 1 hanya resistor 33K ohm
  • 1 hanya 3.5mm mono plug (untuk kunci morse)
  • 1 hanya soket mono 3.5mm (untuk kunci morse)
  • 3 hanya 9mm M3 tapped nilon spacer
  • 1 hanya 130 x 68 x 44mm kotak plastik ABS
  • 5 hanya 2-pin konektor sudut kanan

Perkiraan biaya pelindung dekoder morse, dikurangi tampilan TFT opsional, adalah $25. [1]

Catatan

[1]

Daftar bagian untuk modul tampilan TFT 320 x 240 opsional tercantum dalam instruksi saya

[2]

Kunci morse atau tombol tekan yang kokoh diperlukan jika Anda ingin menggunakan pengirim.

Langkah 2: Diagram Sirkuit

Diagram Sirkuit
Diagram Sirkuit
Diagram Sirkuit
Diagram Sirkuit
Diagram Sirkuit
Diagram Sirkuit

Gambar-gambar

Foto 1 menunjukkan diagram sirkuit untuk dekoder morse. Resistor 330 ohm secara seri dengan kunci morse membatasi arus keluaran D4 jika terjadi korsleting yang tidak disengaja ke ground … meningkatkan nilainya akan menurunkan output audio dari speaker. Untuk alasan ini saya tidak menambahkannya ke pelindung tetapi memasangnya langsung ke jack morse-key untuk kemudahan penyesuaian

Foto 2 menunjukkan perisai yang cocok. Perisai berasal dari instruksi saya https://www.instructables.com/id/Arduino-TFT-Grap… yang telah saya tambahkan penguat mikrofon dan osilator nada. [1]

Foto 3 menunjukkan perisai lengkap yang terpasang pada Arduino. Tidak ada komponen lain yang diperlukan jika teks ingin dilihat di "Serial Monitor" Arduino Anda

Foto 4 menunjukkan decoder sebagian kotak. Sebuah lubang telah dipotong di tutupnya untuk melihat tampilan. Speaker dan mikrofon telah direkatkan ke kasing. Bor beberapa lubang speaker di tutupnya sebelum memasang speaker. Soket tengah pada tutupnya adalah untuk mikrofon ekstensi … tanpa ini decoder harus ditempatkan dekat dengan speaker yang tidak selalu memungkinkan

Foto 5 menunjukkan layar TFT. Pita listrik hitam telah dipasang di tepi layar … pita ini mencegah kebocoran cahaya dan menutupi ketidaksejajaran antara layar dan bukaan di tutupnya

Penting

[1]

Arduino dengan konektor USB besar memerlukan lapisan pita listrik antara konektor USB dan pelindung Arduino. Celana pendek yang tidak disengaja dimungkinkan tanpa selotip karena jarak bebasnya kecil. Rekaman itu tidak diperlukan untuk Arduino yang memiliki konektor kecil

Langkah 3: Teori

Teori
Teori
Teori
Teori
Teori
Teori

Setiap huruf kode morse terdiri dari rangkaian nada pendek dan panjang yang disebut “titik” dan “garis”.

  • titik (.) panjangnya 1 satuan
  • tanda hubung (_) panjangnya 3 satuan
  • jarak antar elemen huruf adalah 1 satuan
  • jarak antar huruf adalah 3 satuan
  • jarak antar kata adalah 7 satuan

Kita dapat menentukan apakah nada yang masuk berupa titik atau garis dengan membandingkan durasinya dengan nada referensi yang panjangnya 2 satuan.

  • titik kurang dari 2 satuan
  • tanda hubung lebih besar dari 2 unit

Ada dua metode yang sangat berbeda untuk memecahkan kode pola titik dan garis yang masuk:

  • pencarian linier
  • pohon biner (juga dikenal sebagai pencarian dikotomis)

Pencarian Linier

Salah satu metode umum adalah membuat larik karakter dan pola morse yang cocok. Misalnya masing-masing karakter berikut akan disimpan sebagai:

  • A. _
  • B _…
  • C _. _.
  • 0 _ _ _ _ _
  • 1. _ _ _ _
  • 2.. _ _ _

Setiap huruf membutuhkan 6 sel … 1 untuk huruf itu sendiri dan 5 untuk (.) dan (_). Untuk melakukan ini, kita membutuhkan array karakter letter[36][6] dengan total 216 sel. Sel yang tidak digunakan biasanya diisi dengan nol atau kosong.

Untuk memecahkan kode titik dan garis yang masuk, kita harus membandingkan pola titik/garis putus-putus dari setiap huruf yang masuk dengan pola karakter referensi kita.

Sementara metode ini bekerja, sangat lambat.

Katakanlah kita memiliki 26 huruf ('A',..' Z') dan digit ('0', … '9') yang disimpan dalam sebuah array, maka kita harus melakukan 36 pencarian, masing-masing dengan hingga 5 sub-pencarian, yang merupakan total 36*5=180 pencarian untuk memecahkan kode angka '9'.

Pohon Biner

Pencarian biner jauh lebih cepat karena tidak diperlukan pencarian.

Berbeda dengan pencarian linier, yang membutuhkan karakter dan pola morse untuk disimpan, pohon biner hanya menyimpan karakter yang berarti ukuran array lebih kecil.

Saya telah membagi pohon biner saya (foto1) menjadi dua bagian (foto 2 dan 3) agar lebih mudah dibaca.

Untuk menemukan karakter kita memindahkan pointer ke kiri setiap kali kita mendengar sebuah titik dan memindahkan pointer ke kanan setiap kali kita mendengar tanda hubung. Setelah setiap gerakan, kami membagi dua jarak penunjuk untuk langkah berikutnya … maka nama pohon biner.

Untuk memecahkan kode huruf '9' (tanda hubung, tanda hubung, tanda hubung, tanda hubung, titik) membutuhkan 5 gerakan … 4 ke kanan, dan 1 ke kiri yang meninggalkan penunjuk langsung di atas '9'.

Lima gerakan secara signifikan lebih cepat dari 180 pencarian !!!!!

Array karakter biner juga lebih kecil … 26 huruf dan 10 angka hanya membutuhkan array baris 64 x 1. Saya telah memilih untuk membuat larik 128 karakter sehingga saya dapat memecahkan kode tanda baca.

Langkah 4: Catatan Desain

Catatan Desain
Catatan Desain
Catatan Desain
Catatan Desain
Catatan Desain
Catatan Desain
Catatan Desain
Catatan Desain

Morse sulit untuk memecahkan kode dengan adanya sinyal yang mengganggu. Sinyal yang tidak diinginkan harus ditolak … ini membutuhkan semacam filter.

Ada banyak kemungkinan:

  1. Loop terkunci fase
  2. Filter induktor-kapasitor
  3. Filter aktif resistor-kapasitor
  4. Pemrosesan sinyal digital seperti Fast Fourier Transform, atau filter Goertzel.

Metode 1, 2, 3 membutuhkan komponen eksternal yang besar.

Metode 4 tidak memerlukan komponen eksternal … frekuensi dideteksi menggunakan algoritma matematika.

Transformasi Fourier Cepat (FFT)

Salah satu metode untuk mendeteksi keberadaan nada dalam bentuk gelombang yang kompleks adalah dengan menggunakan Transformasi Fourier Cepat

Foto 1 menunjukkan bagaimana FFT (Fast Fourier Transform) membagi spektrum audio menjadi “bins”.

Foto 2 menunjukkan bagaimana "tempat sampah" FFT merespons sinyal … dalam hal ini 800Hz. Jika sinyal kedua katakanlah 1500Hz hadir, kita akan melihat dua respons … satu pada 800Hz dan lainnya pada 1500Hz.

Secara teori, dekoder kode morse dapat dibuat dengan memantau tingkat output dari bin frekuensi FFT tertentu … sejumlah besar mewakili keberadaan titik atau garis … sejumlah kecil mewakili tidak ada sinyal.

Dekoder kode morse semacam itu dapat dibuat dengan memantau "bin 6" di foto 2 tetapi ada beberapa hal yang salah dengan pendekatan ini:

  • kami hanya ingin satu frekuensi bin … sisanya adalah perhitungan yang sia-sia
  • nampan frekuensi mungkin tidak muncul tepat pada frekuensi yang diinginkan
  • itu relatif lambat (20mS per loop Arduino ()

Metode lain adalah dengan menggunakan filter Goertzel.

Filter Goertzel

Filter Goertzel mirip dengan FFT tetapi hanya memiliki nampan frekuensi tunggal.

Foto3 menunjukkan respons frekuensi filter Goertzel untuk langkah audio terpisah.

Foto 4 adalah sapuan filter yang sama pada rentang frekuensi yang sama.

Saya memutuskan untuk "pergi" dengan algoritma Goertzel sebagai:

  • Waktu loop() Arduino menggunakan algoritma Goertzel adalah 14mS (milidetik) versus 20mS (milidetik) untuk solusi FFT menggunakan perpustakaan “fix_FFT” Arduino.
  • Sangat mudah untuk mengatur frekuensi tengah filter bandpass Goertzel.
  • Bandwidth sekitar 190Hz.

Foto 5 menunjukkan output numerik dari filter Goertzel 900Hz saat nada terdeteksi. Saya telah menetapkan ambang nada saya ke nilai 4000 … nilai di atas 4000 menunjukkan nada.

Secara teori, Anda hanya perlu menyetel filter ke frekuensi mendengarkan yang nyaman. Sayangnya output audio dari speaker monitor 1 inci saya turun dengan cepat di bawah 900Hz. Untuk menghindari masalah, saya menggunakan frekuensi filter 950Hz. Rumus yang diperlukan untuk menghitung frekuensi filter alternatif ditemukan di header kode saya.

Penguraian kode

Decoding titik dan garis tidak semudah yang terlihat pertama kali.

Morse sempurna didefinisikan sebagai:

  • titik = 1 satuan
  • spasi di dalam huruf = 1 satuan
  • tanda hubung = 3 satuan
  • spasi antar huruf = 3 satuan
  • spasi antar kata = 7 satuan

Untuk memecahkan kode morse sempurna kita hanya membutuhkan durasi nada referensi 2 unit

  • titik < 2 unit
  • ruang elemen < 2 unit
  • tanda hubung > 2 unit
  • huruf _spasi > 2 satuan
  • word_space > 6 unit (yaitu 3 x unit referensi)

Ini berfungsi untuk mesin morse tetapi di "dunia nyata":

  • kecepatan pengiriman bervariasi
  • durasi setiap titik bervariasi
  • durasi setiap tanda hubung bervariasi
  • huruf E, I, S, H, 5 hanya berisi titik-titik yang rata-rata dengan durasi titik
  • huruf T, M, O, 0 hanya berisi tanda hubung yang rata-rata dengan durasi tanda hubung
  • kesenjangan kata mungkin tidak datang
  • fading menciptakan kesalahan dari mana decoder harus pulih.
  • sinyal rusak karena interferensi

Huruf yang hanya berisi titik dan tanda hubung sebagian diselesaikan jika:

kami memperkirakan durasi referensi hingga kami menerima titik dan tanda hubung yang valid. Saya menggunakan 200 milidetik yang valid jika kecepatan kirim antara 6 WPM (kata per menit) dan 17 WPM. Anda mungkin perlu meningkatkan nilai ini jika Anda belajar morse. Tabel kecepatan disertakan dalam perangkat lunak

Variasi kecepatan diselesaikan jika:

  • kami melakukan rata-rata bergulir pada setiap titik dan setiap tanda hubung dan
  • hitung ulang durasi referensi setelah setiap simbol diterima

Kesenjangan kata dan kesenjangan kata yang tidak sampai diselesaikan jika kita:

  • ingat waktu transisi trailing-edge (nada ke tanpa nada) terakhir,
  • restart algoritma setelah setiap huruf,
  • hitung waktu yang telah berlalu sambil menunggu transisi terdepan (tanpa nada ke nada) berikutnya dan
  • masukkan spasi jika 6 unit waktu telah terlampaui.

Osilator Morse

Saya awalnya mencoba beberapa buzzer Piezo tetapi menemukan:

  • frekuensinya tetap
  • frekuensi output terlalu tinggi untuk mendengarkan dalam waktu lama
  • piezo cenderung melayang keluar dari passband Goertzel

Saya kemudian mencoba mengendarai transduser akustik dengan gelombang persegi 750Hz tetapi ternyata memiliki resonansi yang menyaring harmonik ke-1 dan ke-3. Foto 6 menunjukkan output penguat mikrofon ke gelombang persegi 750Hz … kita melihat harmonik ke-5 !!!

Saya kemudian menggunakan speaker kecil. Foto 7 menunjukkan output mikrofon ke gelombang persegi 750Hz yang dikirim ke speaker kecil … kali ini kita melihat fundamentalnya … bukan harmonik ke-5. Filter Goertzel mengabaikan harmonik apa pun.

Catatan

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

www.embedded.com/the-goertzel-algorithm/

Langkah 5: Perangkat Lunak

Perangkat lunak
Perangkat lunak
Perangkat lunak
Perangkat lunak
Perangkat lunak
Perangkat lunak

Instalasi

  • Unduh file terlampir MorseCodeDecoder.ino [1]
  • Salin isi file ini ke sketsa Arduino baru
  • Simpan sketsa sebagai "MorseCodeDecoder" (tanpa tanda kutip)
  • Kompilasi dan unggah sketsa ke Arduino Anda

Pembaruan Perangkat Lunak 23 Juli 2020

Fitur berikut telah ditambahkan ke file terlampir "MorseCodeDecoder6.ino"

  • jendela "Exact Blackman" [2]
  • sebuah "Noise_blanker"

Pengaturan:

  • tingkatkan level audio receiver Anda hingga LED mulai berkedip lalu matikan
  • sekarang setel penerima Anda sampai LED berkedip sesuai dengan morse yang masuk
  • Noise_blanker telah diatur untuk mengabaikan ledakan kebisingan hingga 8mS (satu kali putaran)
  • ambang Kebisingan dapat disesuaikan dengan mengatur Debug=true dan menonton Serial Plotter Anda

Catatan

[1]

Atur Arduino Serial Monitor Anda ke 115200 bauds jika Anda juga ingin melihat teksnya.

[2]

  • Foto 1 … Jendela Blackman yang tepat
  • Foto 2 … Filter Goertzel tanpa jendela Exact Blackman
  • Foto 3,,, Filter Goertzel dengan jendela Exact Blackman diterapkan

Langkah 6: Operasi

Dekoder

Tempatkan unit di sebelah speaker Anda saat mendengarkan morse.

  • Kapsul mikrofon electret mengambil sinyal morse dari speaker Anda.
  • Keluaran dari mikrofon electret tersebut kemudian dikuatkan sebanyak 647 kali (56dB) sebelum diteruskan ke Arduino untuk diproses.
  • Filter bandpass digital Goertzel mengekstrak sinyal morse dari noise.
  • Decoding dilakukan dengan menggunakan pohon biner.
  • Keluaran dekoder ditampilkan sebagai teks pada layar TFT 320 x 240 piksel. Itu juga dikirim ke "Serial Monitor" Arduino Anda jika Anda tidak ingin menggunakan tampilan.

Pengirim Morse

Seorang pengirim morse juga telah disertakan. Ini memungkinkan Anda untuk berlatih mengirim morse dan bekerja sebagai berikut:

  • Nada suara konstan dihasilkan pada pin Arduino 4.
  • Kami mendengar nada ini melalui pengeras suara dekoder setiap kali kami menekan tombol morse.
  • Nada disetel ke frekuensi yang sama dengan filter Goertzel yang membodohi dekoder dengan menganggapnya mendengarkan morse nyata … apa pun yang Anda kirim akan muncul sebagai teks tercetak di layar.

Pengiriman Anda akan meningkat saat dekoder mengambil kesalahan umum seperti:

  • terlalu banyak ruang antara simbol. (contoh: Q disematkan sebagai MA)
  • terlalu banyak spasi di antara huruf (contoh: SEKARANG dicetak sebagai NO W)
  • Kode salah

Langkah 7: Ringkasan

Dekoder

Instruksi ini menjelaskan cara membuat dekoder morse yang mengubah kode morse menjadi teks tercetak.

  • Dekoder ini mampu mendekode morse hingga paling sedikit 80 WPM (words per minute)
  • Dekoder secara otomatis melacak variasi dalam kecepatan kirim yang diterima.
  • Teks ditampilkan pada Serial Monitor Anda (atau pada modul layar TFT 320 x 240 jika dipasang) [1]

Pengirim

Seorang pengirim morse juga telah disertakan

  • Pengirim membantu Anda meningkatkan kualitas pengiriman morse Anda.
  • Dekoder mengonfirmasi bahwa apa yang Anda kirim sudah benar

Biaya suku cadang

Perkiraan biaya pelindung dekoder morse, dikurangi tampilan TFT opsional, adalah $25.

Klik di sini untuk melihat instruksi saya yang lain.

Tantangan Audio 2020
Tantangan Audio 2020
Tantangan Audio 2020
Tantangan Audio 2020

Hadiah Kedua dalam Tantangan Audio 2020

Direkomendasikan: