Thursday, April 2, 2026

Setup KA9Q-Radio radiosonde_auto_rx airspy mini


 Setup KA9Q-Radio + radiosonde_auto_rx (Airspy mini + Raspberry Pi + Docker)

1. Objektif Setup

Manual ini bertujuan untuk menggunakan KA9Q-Radio sebagai SDR server, memantau band radiosonde (400–406 MHz) secara serentak, dan integrasi dengan radiosonde_auto_rx menggunakan Docker.

Kelebihan:
- Lebih efisien CPU
- Decode banyak sonde serentak
- Sesuai untuk Airspy

2. Keperluan Sistem


Hardware:

- Raspberry Pi 4 / 5
- Airspy R2 / Airspy Mini
- Antena UHF

OS:
- Raspberry Pi OS atau Ubuntu 22.04

3. Install Dependencies

sudo apt update
sudo apt install -y avahi-utils build-essential make gcc libairspy-dev libairspyhf-dev libavahi-client-dev libbsd-dev libfftw3-dev libhackrf-dev libiniparser-dev libncurses5-dev libopus-dev librtlsdr-dev libusb-1.0-0-dev libusb-dev portaudio19-dev libasound2-dev libogg-dev uuid-dev rsync time git libsamplerate-dev

4. Install KA9Q-Radio

git clone https://github.com/ka9q/ka9q-radio.git
cd ka9q-radio
git checkout e1224dcd1991637ba8e1caa68cd802e1b22933de
make
sudo make install

5. Tambah User ke Group radio

sudo usermod -aG radio $(whoami)
reboot

6. Generate FFTW Wisdom

langkah penting untuk optimakan prestasi FFT dalam KA9Q-Radio. proses ini boleh ambil masa berjam-jam, jadi memang sesuai dibuat waktu malam

cd /etc/fftw/
time sudo fftwf-wisdom -v -T 1 -o nwisdom rof300000 cob2400 cob1250 cob1202 cob1200
sudo cp -i nwisdom wisdomf

7. Konfigurasi KA9Q (Airspy)

untuk Airspy R2 / HydraSDR, frekuensi tengah perlu diletakkan sekurang-kurangnya 600 kHz di atas frekuensi tertinggi yang anda mahu pantau. Contoh, kalau mahu liputan 400–406 MHz, set frequency = 407m0. Airspy R2 / HydraSDR boleh beri kira-kira 8 MHz usable bandwidth pada mod real 20 MHz

sudo nano /etc/radio/radiod@airspymini-autorx.conf

[global]
hardware = airspy
mode = fm
status = sonde.local
iface = lo
ttl = 0
data = sonde-pcm.local

[airspy]
device = airspy
description = "auto_rx"
frequency = 405m6
gainstep = 17

[telemetry]
freq = "401m50"

[manual-400]
freq = 0
ttl = 0

Airspy Mini secara default beri kira-kira 5 MHz usable bandwidth pada 12 MHz real sample rate. Jadi kalau mahu cover 400–405 MHz, boleh set 405m6. kalau kawasan anda lebih banyak sonde di bahagian atas band, boleh pilih 406m6 untuk liputan 401–406 MHz. 

Airspy Mini juga boleh dipaksa jalan pada 20 MHz dengan buka komen samprate = 20000000, tetapi akan ada lebih banyak spurs pada kadar itu

8. Start Service

sudo systemctl enable radiod@airspymini-autorx
sudo systemctl start radiod@airspymini-autorx

9. Test KA9Q

control sonde.local

10. Setup Docker radiosonde_auto_rx

sdr_port sebenarnya tidak digunakan oleh KA9Q-Radio, tetapi tetap ada dalam contoh config. Ia juga beri amaran bahawa min_freq dan max_freq mesti berada dalam julat sebenar yang diliputi oleh SDR. Contohnya, Airspy R2 boleh set 400.05 hingga 406.0, tetapi Airspy Mini pada 12 MHz mungkin perlu dikecilkan, misalnya 400.05 hingga 405.0

curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
sudo usermod -aG docker $(whoami)
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf sudo modprobe -r dvb_usb_rtl28xxu
mkdir -p ~/radiosonde_auto_rx/log curl -o ~/radiosonde_auto_rx/station.cfg https://raw.githubusercontent.com/projecthorus/radiosonde_auto_rx/master/auto_rx/station.cfg.example

kemudian edit file station.cfg,

nano ~/radiosonde_auto_rx/station.cfg

didalam file station.cfg - sila masukkan  perkara penting dalam section berikut.

   [habitat] -> uploader_callsign - Your station callsign!
   [location] -> station_lat, station_lon, station_alt - Your station location! 
   [search_params] -> min_freq, max_freq - Set these suitable for your location!
 [sdr_type] = KA9Q
 [sdr_quantity] = 10

 [search_params]
  min_freq = 400.05
  max_freq = 405.8

 perkara-perkara lain tu optional, terpulang kepada anda untuk aktifkan atau tidak. 
 kemudian save dan exit.

kemudian, mari kita run container ini.
docker run \
  -d \
  --name radiosonde_auto_rx \
  --restart="always" \
  --device=/dev/bus/usb \
  --network=host \
  -v ~/radiosonde_auto_rx/station.cfg:/opt/auto_rx/station.cfg:ro \
  -v ~/radiosonde_auto_rx/log/:/opt/auto_rx/log/ \
  -v /var/run/dbus:/var/run/dbus \
  -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket \
  ghcr.io/projecthorus/radiosonde_auto_rx:latest
jika keluar 

docker: unknown server OS:


buka terminal baru dan:

sudo chmod 666 /var/run/docker.sock

kemudian ulang semula : 

docker run \
  -d \
  --name radiosonde_auto_rx \
  --restart="always" \
  --device=/dev/bus/usb \
  --network=host \
  -v ~/radiosonde_auto_rx/station.cfg:/opt/auto_rx/station.cfg:ro \
  -v ~/radiosonde_auto_rx/log/:/opt/auto_rx/log/ \
  -v /var/run/dbus:/var/run/dbus \
  -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket \
  ghcr.io/projecthorus/radiosonde_auto_rx:latest

Docker ini tidak berfungsi baik di Debian 12 kerana sambungan ke ka9q-server boleh timeout. Ia disahkan berfungsi di Ubuntu 22.04 dan Raspberry Pi OS Bookworm. Jika anda guna Debian 12 dan kerap timeout, sila cuba pemasangan auto_rx secara native

11. Semak Output

docker logs -f radiosonde_auto_rx
http://IP_PI:5000

12. Troubleshooting Ringkas

- dft_detect timeout: kecilkan frequency range atau optimize FFTW
- Tak detect sonde: semak gain dan SDR
- Docker tak connect: pastikan mount DBus & Avahi

13. Ringkasan atau checklist setup

  • Pasang dependency.
  • Clone ka9q-radio.
  • Checkout commit e1224dcd1991637ba8e1caa68cd802e1b22933de.
  • make && sudo make install
  • Tambah user ke group radio.
  • Generate FFTW wisdom ikut jenis SDR.
  • Buat fail config dalam /etc/radio/.
  • Start servis radiod@...
  • Ubah station.cfg kepada sdr_type = KA9Q.
  • Jalankan radiosonde_auto_rx dan pastikan julat frekuensi tidak melebihi bandwidth SDR anda.

  • Friday, February 21, 2025

    Install M5Stick-Launcher for Lilygo T-Deck


     Step 1 :

    Pergi ke github ini,  https://github.com/bmorcelli/M5Stick-Launcher/

    kemudian klik pada release yang terkini, ada sebelah kanan sekali.


    klik dan ianya akan dibawa ke paparan ini.

    scrol bawah dan cari Launcher untuk lilygo-t-deck dan download


    download dan simpan di lokasi rahsia anda sendiri. kemudian masa utk flash, untuk flash sila ke website ini. https://web.esphome.io/


    klik connect dan pilih com port anda. 


    kemudian klik install, 


    dan choose file, 


    dan pilih file yang mula-mula kita save tadi. Lokasi rahsia tadi kena ingat lah dimana.


    kemudian klik install


    dan tunggu


    apabila siap, paparan ini akan muncul.


    cabut usb kabel, dan off dan semula tdeck anda dan paparan ini akan muncul sebaik sahaja on.


    dan selepas itu, paparan seperti ini pula akan muncul, dan ini bermakna launcher anda berjaya di flash. Kemudian, sediakan sd kad dan masuk lah apa-apa apps kegemaran anda. semoga bermanfaat. 73

    Lilygo T-Deck Launcher


    Saturday, February 1, 2025

    Power Transistor MJ11016G short

     

    MJ11016G
    ini adalah bacaan MJ11016G yang diambil dari multimeter.

    B-E: 0.482V (forward) dan E-B: 0.939V (reversed)

    B-C: 0.459V (forward) dan C-B: OL (open)

    E-C: 0.388V dan C-E: OL

    Untuk transistor NPN yang normal, sepatutnya:

    Simpang B-E: sekitar 0.6-0.7V semasa forward, dan beberapa MΩ atau OL semasa reversed

    Simpang B-C: sekitar 0.6-0.7V semasa forward, dan beberapa MΩ atau OL semasa reversed

    E-C dan C-E: kedua-duanya sepatutnya menunjukkan nilai rintangan tinggi atau OL

    Dari bacaan yang diukur, terdapat beberapa tanda tidak normal:

    Voltan hadapan B-E terlalu rendah (0.482V)

    Bacaan E-B sepatutnya OL, bukan 0.939V

    E-C menunjukkan 0.388V yang menandakan ada litar pintas atau kebocoran


    Kesimpulannya, transistor ini berkemungkinan besar sudah rosak dan perlu diganti. Semoga bermanfaat. 73 Zaki

    Thursday, January 23, 2025

    TL494 PWM Controller : bahagian pertama

     

    TL494

    ini adalah bacaan yang diperoleh daripada PWM TL494, 

    pin1=2.474v     pin16=000.8mv

    pin2=2.474v     pin15=0.384v 

    pin3=3.6v         pin14=4.98v

    pin4=0.3v        pin13=4.98v

    pin5=1.477v     pin12=14.52v

    pin6=3.58v       pin11=14.52v

    pin7=0v            pin9=000.9mv

    pin8=14.52v      pin9=000.9mv


    Berdasarkan bacaan voltan pada pin TL494, mari kita analisis keadaan litar 
    dan kenalpasti punca masalah LED overload menyala tanpa load


    Analisis Bacaan Pin TL494

    1. Pin 1 (Error Amplifier Input 1): 2.474V  -  Bacaan ini adalah normal.
    2. Pin 2 (Error Amplifier Input 2): 2.474V - Bacaan ini sepadan dengan Pin 1. tiada masalah
    3. Pin 3 (Feedback): 3.6V : Bacaan ini kelihatan tinggi. Pin 3 biasanya bekerja pada 2.5V, kena check resistor dan capacitor dalam tracknya.

            

    Pin 4 (Dead Time Control): 0.3V - kelihatan rendah. kena check transistor dlm linenya
    Pin 5 (Control Voltage): 1.477V - tiada masalah sbb berada dlm rangenya.
    Pin 6 (Error Amplifier Output): 3.58V - Bacaan ini menunjukkan TL494 cuba menghantar  active control, tetapi jika output tidak stabil (Pin 15 dan Pin 16 rendah), protection problem                  Pin 7 (Ground): 0V - normal                                                                                                                Pin 8 (VCC): 14.52V - normal sbb ada 14.52v                                                                                    Pin 9 dan Pin 10 (Output PWM): 0.9mV - sangat rendah, menunjukkan tiada signal dari PWM  yg boleh/mungkin jadi punca. MUNGKIN berpunca drp transistor atau resistor di-linenya                    Pin 11 (VREF): 14.52V - salah ni, biasanya 5V, mungkin TL494 ini rosak?                                       Pin 12 (Power Supply for Reference): 14.52V                                                                                        

         12. Pin 13 dan Pin 14 (Input for Oscillator Timing): 4.98V - normal                                                  13. Pin 15 dan Pin 16 (Output PWM): 0.384V dan 0.8mV - Output PWM sangat rendah            Mungkin TL494 ni rosak? ataupun proteksen dia aktif?

    ---------------------------------------------------------------------------------------------------------------------
         Plan saya ialah check komponen sekitar TL494 dahulu sebab pin 3 bacaan dia tinggi,              samada perintang atau capacitor problem pada linenya. Check transistor pada line pin 15 dan 16 sbb output low, mungkin ada yang short. Jika semuanya ok, MUNGKIN TL494 rosak sbb Vref 14.52volt,  sepatutnya dlm keadaan standby ianya 5volt saja.

         Ok sambung bahagian 2, ngantuk dah ni... apa-apa saya roger. 73 de 9m2zak

    Saturday, January 18, 2025

    GPS Monitoring : ESP32-DA Module

     


    Percubaan untuk menghasilkan sebuah GPS monitoring berjaya. Projek ini saya gunakan : 

    1.  ESP32 Wroom
    2. GPS module GPS6MV2
    3. 2.4 oled lcd module SPI
    4. Expansion board

     setelah beberapa minit, rasanya tak sampai 5 minit, GPS saya trus lock dan hasilnya seperti di bawah.


    di bawah ini saya sertkan skrip yang sudah banyak kali debug dan akhirnya sukses. have fun!!!

    ---------------------------------------------------------------------------------------------------------------

    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #include <TinyGPS++.h>

    // Tetapan OLED
    #define OLED_MOSI   21    
    #define OLED_CLK    22    
    #define OLED_DC     15    
    #define OLED_CS     13    
    #define OLED_RESET  14    
    #define SCREEN_WIDTH 128
    #define SCREEN_HEIGHT 64

    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

    // Tetapan GPS
    #define RXPin 16  // Sambungkan ke pin TX GPS
    #define TXPin 17  // Sambungkan ke pin RX GPS
    #define GPSBaud 9600
    TinyGPSPlus gps;

    void setup() {
      // Memulakan Serial Monitor
      Serial.begin(115200);
      Serial.println("GPS Monitor Starting...");

      // Memulakan sambungan GPS menggunakan UART bawaan
      Serial2.begin(GPSBaud, SERIAL_8N1, RXPin, TXPin);
     
      // Memulakan OLED SPI
      if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_RESET)) {
        Serial.println(F("SSD1306 allocation failed"));
        for (;;); // Berhenti jika OLED gagal
      }
      display.clearDisplay();
      display.setTextSize(1); // Saiz teks
      display.setTextColor(SSD1306_WHITE); // Warna teks
      display.setCursor(0, 0);
      display.println(F("GPS Monitor"));
      display.display();
      delay(2000);
    }

    void loop() {
      // Membaca data GPS dari Serial2
      while (Serial2.available() > 0) {
        char c = Serial2.read();
        if (gps.encode(c)) {
          displayGPSInfo(); // Paparkan maklumat GPS pada OLED
        }
      }
     
      // Debug di Serial Monitor
      if (millis() > 5000 && gps.charsProcessed() < 10) {
        Serial.println(F("Tiada isyarat GPS diterima."));
      }
    }

    void displayGPSInfo() {
      display.clearDisplay();
      display.setCursor(0, 0);
     
      if (gps.location.isValid()) {
        display.print(F("Lat: "));
        display.println(gps.location.lat(), 6);
        display.print(F("Lon: "));
        display.println(gps.location.lng(), 6);
        display.print(F("Alt: "));
        display.println(gps.altitude.meters());
        display.print(F("Sat: "));
        display.println(gps.satellites.value());
      } else {
        display.println(F("Mencari satelit..."));
      }
     
      display.display();
    }


    ESP32-WROOM : Jam azan


     Dibawah ini adalah scriptnya, semoga bermanfaat.

    --------------------------------------------------------------------------------------------------------------------

    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #include <WiFi.h>
    #include <NTPClient.h>
    #include <WiFiUdp.h>

    // Tetapan OLED
    #define OLED_MOSI   21    
    #define OLED_CLK    22    
    #define OLED_DC     15    
    #define OLED_CS     13    
    #define OLED_RESET  14    
    #define SCREEN_WIDTH 128
    #define SCREEN_HEIGHT 64

    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

    // Tetapan WiFi
    const char* ssid = "XXXX";    // Ganti dengan SSID WiFi anda
    const char* password = "XXXX"; // Ganti dengan kata laluan WiFi anda

    // Tetapan NTP (Masa Internet)
    WiFiUDP ntpUDP;
    NTPClient timeClient(ntpUDP, "sg.pool.ntp.org", 8 * 3600, 60000); // GMT+8

    // Jadual waktu azan (untuk lokasi tertentu, ubah ikut lokasi anda)
    struct PrayerTime {
      String name;
      int hour;
      int minute;
    };

    PrayerTime prayerTimes[] = {
      {"Subuh", 5, 45},
      {"Zohor", 13, 10},
      {"Asar", 16, 30},
      {"Maghrib", 19, 5},
      {"Isyak", 20, 15}
    };
    const int numPrayers = sizeof(prayerTimes) / sizeof(prayerTimes[0]);

    void setup() {
      Serial.begin(115200);

      // Sambungkan WiFi
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("\nWiFi Connected");

      // Mulakan NTP
      timeClient.begin();

      // Mulakan OLED
      if (!display.begin(SSD1306_SWITCHCAPVCC)) {
        Serial.println(F("OLED initialization failed"));
        while (1);
      }
     
      display.clearDisplay();
      display.setTextColor(SSD1306_WHITE);
      display.setTextSize(1);  // Saiz font kecil
      display.setCursor(0, 0);
      display.println("Jam Azan");
      display.println("Memuatkan...");
      display.display();
      delay(2000);
    }

    void loop() {
      // Kemas kini masa
      timeClient.update();

      // Dapatkan masa semasa
      int currentHour = timeClient.getHours();
      int currentMinute = timeClient.getMinutes();
      int currentSecond = timeClient.getSeconds();

      // Periksa waktu azan
      checkPrayerTime(currentHour, currentMinute);

      // Paparkan masa dan waktu solat
      displayTime(currentHour, currentMinute, currentSecond);
      delay(1000);
    }

    void checkPrayerTime(int hour, int minute) {
      for (int i = 0; i < numPrayers; i++) {
        if (hour == prayerTimes[i].hour && minute == prayerTimes[i].minute) {
          // Notifikasi azan (anda boleh sambung ke buzzer/speaker di sini)
          Serial.println("Waktu Azan: " + prayerTimes[i].name);
          playAzan();
        }
      }
    }

    void playAzan() {
      // Gantikan dengan kod untuk memainkan azan (buzzer atau audio file)
      Serial.println("Memainkan Azan...");
    }

    void displayTime(int hour, int minute, int second) {
      display.clearDisplay();
      display.setTextSize(1);  // Saiz font kecil
     
      display.setCursor(0, 0);

      // Paparkan masa semasa
      if (hour < 10) display.print("0");
      display.print(hour);
      display.print(":");
      if (minute < 10) display.print("0");
      display.print(minute);
      display.print(":");
      if (second < 10) display.print("0");
      display.print(second);

      // Tambahkan "9m2zak" pada hujung jam
      display.print(" 9m2zak");

      // Paparkan waktu solat
      display.setTextSize(1);  // Saiz font kecil
      display.setCursor(0, 20);  // Ubah kedudukan ke atas sedikit
      for (int i = 0; i < numPrayers; i++) {
        display.print(prayerTimes[i].name);
        display.print(": ");
        if (prayerTimes[i].hour < 10) display.print("0");
        display.print(prayerTimes[i].hour);
        display.print(":");
        if (prayerTimes[i].minute < 10) display.print("0");
        display.print(prayerTimes[i].minute);
        display.println();
      }

      display.display();
    }

    Setup KA9Q-Radio radiosonde_auto_rx airspy mini

      Setup KA9Q-Radio + radiosonde_auto_rx  (Airspy mini + Raspberry Pi + Docker) 1. Objektif Setup Manual ini bertujuan untuk menggunakan KA9Q...