Mục lục:

Bộ giải mã Morse cây nhị phân: 7 bước (có hình ảnh)
Bộ giải mã Morse cây nhị phân: 7 bước (có hình ảnh)

Video: Bộ giải mã Morse cây nhị phân: 7 bước (có hình ảnh)

Video: Bộ giải mã Morse cây nhị phân: 7 bước (có hình ảnh)
Video: Nếu làm được điều này, bạn có khả năng tập trung cực hiếm | Dr Vitamin #suckhoe #shorts #fyp 2024, Tháng mười một
Anonim
Image
Image
Sơ đồ mạch
Sơ đồ mạch

Tài liệu hướng dẫn này giải thích cách giải mã Mã Morse bằng Arduino Uno R3.

Bộ giải mã, tự động điều chỉnh theo tốc độ gửi, có khả năng giải mã morse lên đến ít nhất 80 từ mỗi phút.

Mã đến được hiển thị dưới dạng văn bản trên Màn hình nối tiếp Arduino của bạn (hoặc màn hình TFT nếu được trang bị)

Một bộ dao động âm sắc đã được bao gồm nếu bạn muốn thực hành gửi morse.

Bộ giải mã có các tính năng:

  • mô-đun màn hình TFT 320 x 240 [1]
  • một bộ lọc thông dải kỹ thuật số Goertzel để tách các tín hiệu không mong muốn.
  • một “Cây Morse nhị phân” để giải mã tín hiệu
  • theo dõi tốc độ tự động
  • một đầu ra âm thanh khi thực hành morse
  • cả văn bản đến và đi đều được hiển thị.

Các ký tự và ký hiệu sau được nhận dạng:

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

Chi phí ước tính của lá chắn bộ giải mã morse, trừ màn hình TFT, là 25 đô la. [1]

Hình ảnh

  • Ảnh bìa cho thấy một đơn vị được lắp ráp hoàn chỉnh
  • Video cho thấy bộ giải mã hoạt động

Ghi chú

[1]

  • Mô-đun hiển thị TFT là tùy chọn vì tất cả văn bản được gửi đến “Màn hình nối tiếp” Arduino của bạn.
  • Mô-đun TFT được mô tả trong https://www.instructables.com/id/Arduino-TFT-Grap… có thể hướng dẫn của tôi

Bước 1: Danh sách bộ phận

Các phần sau được lấy từ

1 lá chắn nguyên mẫu duy nhất cho Arduino UNO R3, Đường kính 2,54mm

Các bộ phận sau được lấy tại địa phương:

  • 1 opamp kép LM358 duy nhất
  • 1 đèn LED xanh duy nhất
  • 1 clip LED duy nhất
  • 1 viên nang micrô electret duy nhất
  • 1 nút ấn thường mở duy nhất
  • 1 ổ cắm DIP 8 chân duy nhất
  • 2 điện trở chỉ 330 ohm
  • 2 chỉ điện trở 2K2
  • 5 chỉ 10K ohm điện trở
  • 2 điện trở chỉ 56K ohm
  • 2 chỉ 1uF tụ điện
  • 1 tụ điện 10uF duy nhất

Các phần sau là tùy chọn:

  • 1 mô-đun hiển thị LCD TFT SPI chỉ 2,2 inch 240 * 320 ILI9341 với Khe cắm thẻ nhớ SD cho Arduino Raspberry Pi 51 / AVR / STM32 / ARM / PIC [1]
  • Phím Morse / nút nhấn
  • 1 bóng bán dẫn NPN BC548 duy nhất
  • 1 loa chỉ 1 inch
  • 1 điện trở 33K ohm duy nhất
  • 1 phích cắm mono 3.5mm duy nhất (cho phím morse)
  • 1 ổ cắm đơn 3.5mm duy nhất (cho phím morse)
  • 3 miếng đệm nylon chỉ 9mm M3 có vòi
  • 1 hộp nhựa ABS chỉ 130 x 68 x 44mm
  • 5 đầu nối góc vuông chỉ 2 chân

Chi phí ước tính của lá chắn bộ giải mã morse, trừ màn hình TFT tùy chọn, là 25 đô la. [1]

Ghi chú

[1]

Danh sách các bộ phận cho mô-đun màn hình TFT 320 x 240 tùy chọn được liệt kê trong https://www.instructables.com/id/Arduino-TFT-Grap… có thể hướng dẫn của tôi

[2]

Cần có phím morse hoặc nút nhấn chắc chắn nếu bạn muốn sử dụng người gửi.

Bước 2: Sơ đồ mạch

Sơ đồ mạch
Sơ đồ mạch
Sơ đồ mạch
Sơ đồ mạch
Sơ đồ mạch
Sơ đồ mạch

Hình ảnh

Ảnh 1 cho thấy sơ đồ mạch cho bộ giải mã morse. Điện trở 330 ohm mắc nối tiếp với phím morse giới hạn dòng điện đầu ra D4 trong trường hợp vô tình chạm đất … tăng giá trị của nó sẽ làm giảm đầu ra âm thanh từ loa. Vì lý do này, tôi không thêm nó vào tấm chắn mà gắn nó trực tiếp vào giắc cắm phím morse để dễ điều chỉnh

Ảnh 2 cho thấy một tấm chắn phù hợp. Tấm chắn là từ https://www.instructables.com/id/Arduino-TFT-Grap… có thể hướng dẫn của tôi mà tôi đã thêm bộ khuếch đại micrô và bộ dao động âm sắc. [1]

Ảnh 3 cho thấy chiếc khiên đã hoàn thành được gắn vào Arduino. Không cần thành phần nào khác nếu văn bản được xem trên “Màn hình nối tiếp” Arduino của bạn

Ảnh 4 cho thấy bộ giải mã được đóng hộp một phần. Một lỗ đã được khoét trên nắp để xem màn hình. Loa và micrô đã được dán nóng vào vỏ. Khoan một số lỗ loa trên nắp trước khi lắp loa. Ổ cắm trung tâm trên nắp dành cho micrô mở rộng… không có ổ cắm này, bộ giải mã phải được đặt gần loa, điều này không phải lúc nào cũng có thể thực hiện được

Ảnh 5 hiển thị màn hình TFT. Băng dính điện màu đen đã được gắn vào các cạnh màn hình… băng này ngăn chặn sự rò rỉ ánh sáng và che giấu mọi sự sai lệch giữa màn hình và lỗ mở trên nắp

Quan trọng

[1]

Arduinos có đầu nối USB lớn yêu cầu một lớp băng dính điện giữa đầu nối USB và tấm chắn Arduino. Quần soóc ngẫu nhiên có thể xảy ra mà không cần băng vì khoảng hở nhỏ. Băng không bắt buộc đối với Arduinos có đầu nối nhỏ

Bước 3: Lý thuyết

Học thuyết
Học thuyết
Học thuyết
Học thuyết
Học thuyết
Học thuyết

Mỗi ký tự mã morse bao gồm một loạt các âm thời lượng ngắn và dài được gọi là “dấu chấm” và “dấu gạch ngang”.

  • dấu chấm (.) dài 1 đơn vị
  • dấu gạch ngang (_) dài 3 đơn vị
  • khoảng cách giữa các phần tử chữ cái là 1 đơn vị
  • khoảng cách giữa các chữ cái là 3 đơn vị
  • khoảng cách giữa các từ là 7 đơn vị

Chúng ta có thể xác định xem âm đến là dấu chấm hay dấu gạch ngang bằng cách so sánh thời lượng của âm đó với âm tham chiếu có độ dài 2 đơn vị.

  • một dấu chấm nhỏ hơn 2 đơn vị
  • dấu gạch ngang lớn hơn 2 đơn vị

Có hai phương pháp rõ ràng khác nhau để giải mã mẫu dấu chấm và dấu gạch ngang:

  • tìm kiếm tuyến tính
  • cây nhị phân (còn được gọi là tìm kiếm lưỡng phân)

Tìm kiếm tuyến tính

Một phương pháp phổ biến là tạo một mảng các ký tự và các mẫu morse phù hợp của chúng. Ví dụ, mỗi ký tự sau sẽ được lưu dưới dạng:

  • MỘT. _
  • NS _…
  • NS _. _
  • 0 _ _ _ _ _
  • 1. _ _ _ _
  • 2.. _ _ _

Mỗi chữ cái yêu cầu 6 ô… 1 ô cho chính chữ cái đó và 5 ô cho dấu (.) Và (_). Để làm điều này, chúng ta cần một mảng ký tự [36] [6] với tổng số 216 ô. Các ô không sử dụng thường được điền bằng số 0 hoặc ô trống.

Để giải mã các dấu chấm và dấu gạch ngang đến, chúng ta phải so sánh mẫu dấu chấm / gạch ngang của mỗi chữ cái đến với các mẫu ký tự tham chiếu của chúng ta.

Mặc dù phương pháp này hoạt động nhưng nó cực kỳ chậm.

Giả sử chúng ta có 26 chữ cái ('A',.. 'Z') và các chữ số ('0',… '9') được lưu trữ trong một mảng, sau đó chúng ta phải thực hiện 36 tìm kiếm, mỗi tìm kiếm có tối đa 5 tìm kiếm phụ, là tổng số 36 * 5 = 180 tìm kiếm để giải mã chữ số '9'.

Cây nhị phân

Tìm kiếm nhị phân nhanh hơn nhiều vì không cần tìm kiếm.

Không giống như tìm kiếm tuyến tính, yêu cầu cả ký tự và các mẫu morse được lưu trữ, cây nhị phân chỉ lưu trữ các ký tự có nghĩa là kích thước mảng nhỏ hơn.

Tôi đã chia cây nhị phân của mình (ảnh1) thành hai nửa (ảnh 2 và 3) để làm cho nó dễ đọc hơn.

Để tìm một ký tự, chúng ta di chuyển con trỏ sang trái mỗi khi nghe thấy dấu chấm và di chuyển con trỏ sang phải mỗi khi nghe dấu gạch ngang. Sau mỗi lần di chuyển, chúng ta giảm một nửa khoảng cách con trỏ cho lần di chuyển tiếp theo… do đó có tên là cây nhị phân.

Để giải mã chữ cái ‘9’ (gạch ngang, gạch ngang, gạch ngang, gạch ngang, dấu chấm) cần 5 lần di chuyển… 4 lần sang phải và 1 lần sang trái để con trỏ trực tiếp qua ‘9’.

Năm bước di chuyển nhanh hơn đáng kể so với 180 lượt tìm kiếm !!!!!

Mảng ký tự nhị phân cũng nhỏ hơn… 26 chữ cái và 10 chữ số chỉ yêu cầu một mảng dòng 64 x 1. Tôi đã chọn tạo một mảng 128 ký tự để có thể giải mã dấu câu.

Bước 4: Ghi chú thiết kế

Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế
Ghi chú thiết kế

Morse rất khó giải mã khi có các tín hiệu gây nhiễu. Các tín hiệu không mong muốn phải bị từ chối… điều này yêu cầu một số loại bộ lọc.

Có nhiều khả năng:

  1. Các vòng bị khóa theo pha
  2. Bộ lọc tụ điện cuộn cảm
  3. Bộ lọc hoạt động của tụ điện trở
  4. Xử lý tín hiệu kỹ thuật số như Fast Fourier Transform hoặc bộ lọc Goertzel.

Phương pháp 1, 2, 3 yêu cầu các thành phần bên ngoài cồng kềnh.

Phương pháp 4 không yêu cầu các thành phần bên ngoài… các tần số được phát hiện bằng cách sử dụng các thuật toán toán học.

Biến đổi Fourier nhanh (FFT)

Một phương pháp phát hiện sự hiện diện của âm trong dạng sóng phức tạp là sử dụng Fast Fourier Transform

Ảnh 1 cho thấy cách FFT (Fast Fourier Transform) phân chia phổ âm thanh thành các “thùng”.

Ảnh 2 cho thấy cách các “thùng” FFT phản hồi tín hiệu… trong trường hợp này là 800Hz. Nếu một tín hiệu thứ hai như 1500Hz xuất hiện, chúng ta sẽ thấy hai phản hồi… một ở 800Hz và một ở 1500Hz.

Về lý thuyết, một bộ giải mã morse có thể được tạo ra bằng cách giám sát mức đầu ra của một ngăn tần số FFT cụ thể… một số lớn biểu thị sự hiện diện của dấu chấm hoặc dấu gạch ngang… số nhỏ biểu thị không có tín hiệu.

Một bộ giải mã mã morse như vậy có thể được tạo ra bằng cách theo dõi “thùng 6” trong ảnh 2 nhưng có một số điều sai với cách tiếp cận này:

  • chúng tôi chỉ muốn có một ngăn tần số… phần còn lại là các phép tính lãng phí
  • các ngăn tần số có thể không xuất hiện chính xác trên tần suất quan tâm
  • nó tương đối chậm (20mS mỗi vòng lặp Arduino ()

Một phương pháp khác là sử dụng bộ lọc Goertzel.

Bộ lọc Goertzel

Bộ lọc Goertzel tương tự như FFT nhưng chỉ có một ngăn tần số duy nhất.

Ảnh 3 hiển thị phản hồi tần số của bộ lọc Goertzel đối với các bước âm thanh rời rạc.

Ảnh 4 là quá trình quét của cùng một bộ lọc trên cùng một dải tần số.

Tôi quyết định "đi" với thuật toán Goertzel như:

  • Thời gian của vòng lặp Arduino () sử dụng thuật toán Goertzel là 14mS (mili giây) so với 20mS (mili giây) đối với giải pháp FFT sử dụng thư viện Arduino “fix_FFT”.
  • Dễ dàng cài đặt tần số trung tâm của bộ lọc thông dải Goertzel.
  • Băng thông xấp xỉ 190Hz.

Ảnh 5 hiển thị đầu ra số từ bộ lọc Goertzel 900Hz khi âm báo được phát hiện. Tôi đã đặt ngưỡng âm của mình thành giá trị 4000… giá trị trên 4000 cho biết âm sắc.

Về lý thuyết, bạn chỉ cần điều chỉnh bộ lọc của mình đến tần số nghe thoải mái. Thật không may, đầu ra âm thanh từ loa giám sát 1 inch của tôi giảm nhanh chóng xuống dưới 900Hz. Để tránh bất kỳ sự cố nào, tôi đang sử dụng bộ lọc tần số 950Hz. Các công thức cần thiết để tính toán tần số bộ lọc thay thế được tìm thấy trong tiêu đề mã của tôi.

Giải mã

Giải mã các dấu chấm và dấu gạch ngang không dễ dàng như lần đầu nhìn thấy.

Morse hoàn hảo được định nghĩa là:

  • dấu chấm = 1 đơn vị
  • khoảng trắng bên trong chữ cái = 1 đơn vị
  • gạch ngang = 3 đơn vị
  • khoảng cách giữa các chữ cái = 3 đơn vị
  • khoảng cách giữa các từ = 7 đơn vị

Để giải mã morse hoàn hảo, chúng ta chỉ cần một khoảng thời gian âm tham chiếu là 2 đơn vị

  • dấu chấm <2 đơn vị
  • không gian phần tử <2 đơn vị
  • gạch ngang> 2 đơn vị
  • ký tự _ khoảng trắng> 2 đơn vị
  • word_space> 6 đơn vị (tức là 3 x đơn vị tham chiếu)

Điều này hoạt động cho morse máy nhưng trong “thế giới thực”:

  • tốc độ gửi khác nhau
  • thời gian của mỗi dấu chấm khác nhau
  • thời lượng của mỗi dấu gạch ngang khác nhau
  • các chữ cái E, I, S, H, 5 chỉ chứa các dấu chấm trung bình đến thời lượng chấm
  • các chữ cái T, M, O, 0 chỉ chứa các dấu gạch ngang trung bình cho thời lượng dấu gạch ngang
  • khoảng trống từ có thể không đến
  • phai tạo ra các lỗi mà từ đó bộ giải mã phải khôi phục.
  • tín hiệu bị hỏng do nhiễu

Các chữ cái chỉ chứa dấu chấm và dấu gạch ngang được giải một phần nếu:

chúng tôi ước tính thời lượng tham chiếu cho đến khi chúng tôi nhận được dấu chấm hợp lệ và dấu gạch ngang hợp lệ. Tôi sử dụng 200 mili giây là hợp lệ nếu tốc độ gửi từ 6 WPM (từ mỗi phút) đến 17 WPM. Bạn có thể cần phải tăng giá trị này nếu bạn đang học morse. Một bảng tốc độ được bao gồm trong phần mềm

Các biến thể tốc độ được giải quyết nếu:

  • chúng tôi thực hiện mức trung bình luân phiên trên mỗi dấu chấm và mỗi dấu gạch ngang và
  • tính toán lại thời lượng tham chiếu sau khi nhận được mỗi ký hiệu

Khoảng trống từ và khoảng trống từ không đến được giải quyết nếu chúng ta:

  • nhớ thời gian của quá trình chuyển đổi cạnh cuối (âm sang không),
  • khởi động lại thuật toán sau mỗi chữ cái,
  • tính toán thời gian đã trôi qua trong khi chờ chuyển tiếp cạnh hàng đầu (không có âm báo) tiếp theo và
  • chèn khoảng trắng nếu đã vượt quá 6 đơn vị thời gian.

Bộ dao động Morse

Ban đầu tôi đã thử một số bộ rung Piezo nhưng nhận thấy:

  • tần số đã được cố định
  • tần số đầu ra quá cao để nghe kéo dài
  • các piezos có xu hướng trôi ra khỏi băng chuyền Goertzel

Sau đó, tôi đã thử lái một bộ chuyển đổi âm thanh với sóng vuông 750Hz nhưng nhận thấy nó có sự cộng hưởng lọc bỏ các sóng hài thứ 1 và thứ 3. Ảnh 6 cho thấy đầu ra bộ khuếch đại micrô thành sóng vuông 750Hz… chúng ta đang thấy sóng hài thứ 5 !!!

Sau đó, tôi sử dụng một chiếc loa nhỏ. Ảnh 7 cho thấy đầu ra của micrô với sóng vuông 750Hz được gửi đến một loa nhỏ… lần này chúng ta đang thấy điều cơ bản… không phải là sóng hài thứ 5. Bộ lọc Goertzel bỏ qua bất kỳ sóng hài nào.

Ghi chú

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

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

Bước 5: Phần mềm

Phần mềm
Phần mềm
Phần mềm
Phần mềm
Phần mềm
Phần mềm

Cài đặt

  • Tải xuống tệp đính kèm MorseCodeDecoder.ino [1]
  • Sao chép nội dung của tệp này vào một bản phác thảo Arduino mới
  • Lưu bản phác thảo dưới dạng "MorseCodeDecoder" (không có dấu ngoặc kép)
  • Biên dịch và tải bản phác thảo lên Arduino của bạn

Cập nhật phần mềm ngày 23 tháng 7 năm 2020

Các tính năng sau đã được thêm vào tệp đính kèm "MorseCodeDecoder6.ino"

  • cửa sổ "Người da đen chính xác" [2]
  • một "Noise_blanker"

Điều chỉnh:

  • tăng mức âm thanh bộ thu của bạn cho đến khi đèn LED bắt đầu nhấp nháy rồi tắt
  • bây giờ điều chỉnh bộ thu của bạn cho đến khi đèn LED nhấp nháy theo bước với morse đến
  • Noise_blanker đã được thiết lập để bỏ qua các vụ nổ tiếng ồn lên đến 8mS (một lần lặp lại)
  • ngưỡng tiếng ồn có thể được điều chỉnh bằng cách đặt Debug = true và xem Máy vẽ nối tiếp của bạn

Ghi chú

[1]

Đặt Arduino Serial Monitor của bạn thành 115200 bauds nếu bạn cũng muốn xem văn bản.

[2]

  • Ảnh 1… Cửa sổ Blackman chính xác
  • Ảnh 2… Bộ lọc Goertzel không có cửa sổ Exact Blackman
  • Ảnh 3,,, bộ lọc Goertzel với cửa sổ Exact Blackman được áp dụng

Bước 6: Hoạt động

Người giải mã

Đặt thiết bị bên cạnh loa của bạn khi nghe morse.

  • Viên nang micrô điện tử nhận tín hiệu morse từ loa của bạn.
  • Đầu ra của micrô electret sau đó được khuếch đại lên 647 lần (56dB) trước khi được chuyển đến Arduino để xử lý.
  • Một bộ lọc thông dải kỹ thuật số Goertzel tách tín hiệu morse khỏi tiếng ồn.
  • Việc giải mã được thực hiện bằng cách sử dụng cây nhị phân.
  • Đầu ra của bộ giải mã được hiển thị dưới dạng văn bản trên màn hình TFT 320 x 240 pixel. Nó cũng được gửi đến “Màn hình nối tiếp” Arduino của bạn nếu bạn không muốn sử dụng màn hình.

Người gửi Morse

Một người gửi morse cũng đã được bao gồm. Điều này cho phép bạn thực hành gửi morse và hoạt động như sau:

  • Một âm thanh liên tục được tạo ra trên chân 4 của Arduino.
  • Chúng tôi nghe thấy âm báo này qua loa lớn của bộ giải mã bất cứ khi nào chúng tôi nhấn phím morse.
  • Âm báo được đặt ở cùng tần số với bộ lọc Goertzel, bộ lọc này đánh lừa bộ giải mã nghĩ rằng nó đang nghe morse thực… bất cứ thứ gì bạn gửi sẽ xuất hiện dưới dạng văn bản in trên màn hình.

Quá trình gửi của bạn sẽ được cải thiện khi bộ giải mã phát hiện ra các lỗi phổ biến như:

  • quá nhiều khoảng cách giữa các ký hiệu. (ví dụ: Q pinted as MA)
  • quá nhiều khoảng cách giữa các chữ cái (ví dụ: NOW được in dưới dạng KHÔNG CÓ W)
  • mã không chính xác

Bước 7: Tóm tắt

Người giải mã

Tài liệu hướng dẫn này mô tả cách tạo bộ giải mã morse chuyển đổi mã morse thành văn bản in.

  • Bộ giải mã có khả năng giải mã morse lên đến tối thiểu 80 WPM (từ mỗi phút)
  • Bộ giải mã tự động theo dõi các biến thể về tốc độ gửi đã nhận.
  • Văn bản được hiển thị trên Màn hình nối tiếp của bạn (hoặc trên mô-đun màn hình TFT 320 x 240 nếu được trang bị) [1]

Người gửi

Một người gửi morse cũng đã được bao gồm

  • Người gửi giúp bạn cải thiện chất lượng gửi morse của mình.
  • Bộ giải mã xác nhận rằng những gì bạn đã gửi là chính xác

Chi phí của các bộ phận

Chi phí ước tính của tấm chắn bộ giải mã morse, trừ màn hình TFT tùy chọn, là 25 đô la.

Nhấn vào đây để xem các tài liệu hướng dẫn khác của tôi.

Thử thách âm thanh 2020
Thử thách âm thanh 2020
Thử thách âm thanh 2020
Thử thách âm thanh 2020

Giải nhì trong Thử thách âm thanh 2020

Đề xuất: