XV5HP // HAI PHONG // VIET NAM

The Rich Dad

// A personal blog transmitting thoughts over imperfect radio waves. Expect noise, fading, and low bandwidth—but always authentic signals.

Dựng trạm để thu & xử lý tín hiệu bóng thám không

§ PART 2 OF 4 Radiosonde

Ăng-ten thu tín hiệu

Trong hệ thống thu tín hiệu radiosonde, thiết kế anten đóng vai trò quan trọng đối với chất lượng thu nhận dữ liệu. Do thiết bị thám không liên tục thay đổi vị trí, độ cao và góc phân cực trong quá trình bay nên việc lựa chọn cấu hình anten phù hợp giúp giảm hiện tượng mất tín hiệu và tăng độ ổn định cho cả trạm thu của bạn.

Loại ăng-ten phổ biến nhất là anten monopole λ/4 đặt theo phương thẳng đứng (vertical polarization). Tuy nhiên, loại anten này có một nhược điểm đáng kể là tồn tại điểm triệt bức xạ (radiation null) theo trục của anten. Khi bóng thám không bay gần như ngay phía trên trạm thu (góc ngẩng tiến tới 90°), cường độ tín hiệu suy giảm mạnh hoặc mất hoàn toàn trong thời gian ngắn. Hiện tượng này thường được gọi là zenith null, gây gián đoạn quá trình giải mã dữ liệu khi radiosonde đi qua đỉnh đầu.

Antenna monopole thẳng đứng (vertical), rớt tín hiệu (null) khi bóng bay qua đỉnh đầu
Antenna monopole thẳng đứng (vertical), rớt tín hiệu (null) khi bóng bay qua đỉnh đầu
Antenna monopole nghiêng khoảng 35°–45° so với phương thẳng đứng. Thu tín hiệu ổn định hơn
Antenna monopole nghiêng khoảng 35°–45° so với phương thẳng đứng. Thu tín hiệu ổn định hơn
Sử dụng cọc tre vì bền, nhẹ, không dẫn điện.  Giảm khả năng biến thành một phần tử bức xạ ngoài ý muốn
Sử dụng cọc tre vì bền, nhẹ, không dẫn điện. Giảm khả năng biến thành một phần tử bức xạ ngoài ý muốn

Để khắc phục nhược điểm trên, anten monopole thường được lắp nghiêng khoảng 35°–45° so với phương thẳng đứng. Việc nghiêng anten làm thay đổi đồ thị bức xạ (radiation pattern), giảm độ sâu của vùng null theo phương thẳng đứng và giúp tín hiệu được thu ổn định hơn trong toàn bộ quá trình radiosonde bay qua trạm.

Mình đi mua một cọc tre dài tầm 7-8m làm trụ đỡ anten thay vì cột kim loại. Tre nó có ưu điểm nhẹ, bền, giá rẻ và đặc biệt không dẫn điện, nên không làm ảnh hưởng đến trường điện từ xung quanh anten. Điều này sẽ giảm nguy cơ biến cọc đỡ vô tình trở thành một phần tử bức xạ hoặc phản xạ tín hiệu RF ngoài ý muốn. Nói chung là đỡ nhiễu.

Do cái dây nối từ ăng-ten xuống máy thu cũng thả thỏng xuống. Nhiều nguy cơ dây cáp cũng sẽ trở thành một phần từ của antena. Thế tốt nhất mình làm một cái Air-wound coax choke trong hệ anten để chặn dòng RF trên dây. Bạn cứ cuuốn nó lại khoảng 5-8 vòng, đường kính ~10cm.

Lắp đặt trạm thu

Để thu được tín hiệu vô tuyến, ngoài ăng-ten chúng ta cần tới một máy thu. Mình sẽ sử dụng RTL-SDR (RTL2832U Software Defined Radio), đây là thiết bị thu gía thành rẻ nhưng có khả năng thu tín hiệu trong dải tần rộng (từ 27MHz tới tận 1700 MHZ lận, băng tần bóng thám không nằm gọn trong dải tần này luôn).

Sơ đồ hệ thống trạm thu và xử lý tín hiệu bóng thám không được minh hoạ bởi AI - ChatGPT
Sơ đồ hệ thống trạm thu và xử lý tín hiệu bóng thám không được minh hoạ bởi AI - ChatGPT

Thiết bị này sẽ thực hiện số hoá tín hiệu RF Analog, truyền dữ liệu dạng IQ tới thiết bị Raspberry Pi 3 Model B+ thông qua cổng USB. Dùng Pi3B cho nhỏ gọn, rẻ, tiêu thụ không tốn mấy điện nên chạy 24/7/365 ngày được. Phần mềm Radiosonde Auto-RX sẽ tiếp nhận dữ liệu từ USB rồi tự động dò tìm tín hiệu của bóng thám không, giải điều chế tín hiệu GFSK (demodulation), giải mã (decode) và hiển thị theo thời gian thực lên giao diện cho chúng ta quan sát

Hình bên trái là tín hiệu bóng thám không (có spectrum) đang được giải mã theo thời gian thực. Hình bên phải là lịch sử tín hiệu của các bóng thám không mà trạm mặt đất thu được
Hình bên trái là tín hiệu bóng thám không (có spectrum) đang được giải mã theo thời gian thực. Hình bên phải là lịch sử tín hiệu của các bóng thám không mà trạm mặt đất thu được

Các thông tin như mã định danh (Serial Number), vị trí GPS, độ cao, tốc độ, hướng bay, nhiệt độ, độ ẩm, áp suất và trạng thái thiết bị được cập nhật liên tục trên giao diện. Đồng thời, Auto-RX tự động lưu toàn bộ dữ liệu của từng radiosonde vào file CSV để dễ xử lý sau này.

Cài đặt công cụ giải mã tín hiệu

Tất cả các hướng dẫn dưới đây đều copy lại từ hướng dẫn chi tiết trên WIKI của công cụ Radiosonde Auto-Rx. Đầu tiên, các bạn hãy cập nhật link tải các gói và cài đặt các thư viện cần thiết.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3 python3-venv sox git build-essential libtool cmake usbutils libusb-1.0-0-dev

Trong một số trường hợp, thiết bị RTL-SDR không được cấp quyền truy cập với tài khoản hiện tại. Hãy thực hiện lệnh dưới đây để thực hiện việc phân quyền sử dụng với thiết bị USB vừa cắm vào.

sudo wget -O /etc/udev/rules.d/20-rtlsdr.rules https://raw.githubusercontent.com/osmocom/rtl-sdr/master/rtl-sdr.rules

Sau khi cài đặt thư viện và phân quyền, gõ lệnh sudo reboot để khởi động lại con Pi của bạn. Tiếp đó, thử xem USB RTL-SDR đã hoạt động trên con Pi chưa bằng cách chạy lệnh rtl_test và quan sát có output như bên dưới không. Nếu có thì xin chúc mừng bạn đã cài đặt thành công, Ctrl+C để thoát ra còn làm các bước tiếp.

rtl_test
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000002

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
[R82XX] PLL not locked!
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...

Tiếp tục, cài đặt phần quan trọng nhất là phần mềm thu và giải mã tín hiệu tự động với radiosonde auto-rx. Khi bạn gõ lệnh ./build.sh nó sẽ mất tầm 15-20 phút để cài đặt tất cả các công cụ cần thiết nha.

git clone https://github.com/projecthorus/radiosonde_auto_rx.git
cd radiosonde_auto_rx/auto_rx
chmod +x ./build.sh
./build.sh
cp station.cfg.example station.cfg

Sử dụng bất kỳ một Text Editor nào mà bạn quen thuôc, để tìm và sửa lại một số thông tin sau như mình hướng dẫn bên dưới. Có thể sẽ có rất nhiều dòng khác nhau, bạn cứ tìm theo và sửa nhé.

station_lat = 20.x
station_lon = 106.x
station_alt = 11.0

uploader_callsign = XV5HP
sondehub_enabled = True
upload_listener_position = False


  • Thông tin kinh độ, vĩ độ và độ cao của trạm được đặt vào các tham số station_lat, station_lonstation_alt. Bạn có thể lấy theo vị trí GPS của Google Map. Toạ độ này sẽ dùng để hệ thống tính toán bóng đang ở cách bao xa so với trạm của bạn. Sau này muốn đi lượm thì cứ căn theo khoảng cách này mà lựa chọn có đi lượm hay không.
  • uploader_callsign là CallSign của bạn sẽ hiển thị trên hệ thống Sondehub. Của mình là XV5HP, bạn thích đặt gì cũng được.
  • Dữ liệu từ trạm thu của bạn có thể bắn lên trên này để sharing với mọi người. Bật tắt bằng cách thay đổi giá trị True/ False ở sondehub_enabled
  • Nếu bạn bật cái giá trị upload_listener_position, mặc định là True thì toạ độ trạm thu của bạn sẽ được hiển thị trên bản đồ của Sondehub. Sẽ có một đường line màu xanh lá kéo thẳng từ bóng thám không tới trạm thu ở nhà bạn.

Chưa xong đâu, chúng ta cần cài đăt thư viện các thư viện Python mà công cụ Radiosonde Auto-rx sử dụng.

cd ~/radiosonde_auto_rx/auto_rx/
python3 -m venv venv
source venv/bin/activate

(venv) $ pip install -r requirements.txt

Đợi quá trình cài đặt hoàn tất, chúng ta sẽ biến cái phần mềm này thành một service chạy ngầm. Nghĩa là, trong mọi hoàn cảnh khởi động lại của con Pi, trạm của bạn vẫn tự động chạy và thu mà không cần đụng tay vào. Sau đó, sửa lại file cấu hình của service chạy ngầm một chút, cho đúng với con Pi của bạn

sudo cp auto_rx.service /etc/systemd/system/
sudo vim /etc/systemd/system/auto_rx.service

Bạn kiềm tra cấu hình service chạy ngầm auto_rx xem đã đúng như bên dưới chưa.

[Unit]
Description=auto_rx
After=syslog.target

[Service]
# For running outside of a python virtual environment
# ExecStart=/usr/bin/python3 /home/pi/radiosonde_auto_rx/auto_rx/auto_rx.py -t 0 

# For running within a venv, located at /home/pi/radiosonde_auto_rx/auto_rx/venv/
ExecStart=/home/pi/radiosonde_auto_rx/auto_rx/venv/bin/python3 /home/pi/radiosonde_auto_rx/auto_rx/auto_rx.py -t 0
Restart=always
RestartSec=120
WorkingDirectory=/home/pi/radiosonde_auto_rx/auto_rx/
User=pi
SyslogIdentifier=auto_rx

[Install]
WantedBy=multi-user.target

Nếu chưa thì cần tìm và sửa lại một số chỗ cho đúng theo hướng dẫn của mình:

  • WorkingDirectory là thư mục cài đặt radiosonde_auto_rx của bạn, nếu bạn cài sang chỗ khác thì phải sửa lại cái này
  • ExecStart đường dẫn tới file chương trình chính /home/pi/radiosonde_auto_rx/auto_rx/auto_rx.py xem đã đúng chưa. Đồng thời kiểm tra xem đúng binary của python3 có nằm ở /home/pi/radiosonde_auto_rx/auto_rx/venv/bin/python3 không. Nếu chưa thì sửa lại cho đúng.

Cuối cùng bật service auto_rx và truy cập giao diện web của công cụ ở http://IP-con-Pi:5000

sudo systemctl enable auto_rx.service
sudo systemctl start auto_rx.service

Kiểm tra trạng thái của service auto_rx dùng lệnh này, nếu nó báo Running/ Active như dưới đây là ok rồi đó bạn hiền ơi.!

$ sudo systemctl status auto_rx.service
● auto_rx.service - auto_rx
     Loaded: loaded (/etc/systemd/system/auto_rx.service; enabled; preset: enabled)
     Active: active (running) since Fri 2023-10-27 04:15:02 BST; 2min 28s ago
   Main PID: 1188 (python3)
      Tasks: 26 (limit: 1585)
        CPU: 25.236s
     CGroup: /system.slice/auto_rx.service
             ├─1188 /home/pi/radiosonde_auto_rx/auto_rx/venv/bin/python3 /home/pi/radiosonde_auto_rx/auto_rx/auto_rx.py -t 0