Budując sprzętowy interfejs (ROIP) dla oprogramowania SvxLink na bazie Raspberry Pi modeli Zero, Zero 2W, 3, 3B, 4, najczęstszym problemem, z jakim mierzą się konstruktorzy, jest niekontrolowane kluczowanie nadajnika (PTT) podczas uruchamiania systemu oraz błędne odczytywanie stanu blokady szumów (SQL/COS). Poniższy opis nie dotyczy, kiedy stosujemy modyfikowane karty dźwiękowe C-Media CM1xx, np. CM108, CM119 itp., bo wtedy nie używamy GPIO z pinów GPIO Raspberry PI.
W systemie Debian 12 (Bookworm) zaszły zmiany w obsłudze portów – zrezygnowano ze starego systemu /sys/class/gpio na rzecz nowoczesnego standardu gpiod. Ten poradnik wyjaśnia, jak poprawnie zaprojektować i skonfigurować porty GPIO, aby Twój przemiennik lub węzeł simplexowy działał stabilnie i bezpiecznie od pierwszej sekundy po włączeniu zasilania.
1. Pułapka sprzętowa: Anatomia pinów GPIO (0-8 vs 9-27)
Procesor Raspberry Pi po resecie lub włączeniu zasilania konfiguruje wszystkie piny jako wejścia, ale narzuca im domyślne stany sprzętowe (Pull-Up / Pull-Down). Zignorowanie tego faktu to najprostsza droga do spalenia końcówki mocy w radiu lub zablokowania częstotliwości.
- Grupa GPIO 0 do GPIO 8 (Domyślny stan: WYSOKI / Pull-Up):
Na tych pinach po włączeniu zasilania pojawia się napięcie 3.3 V. Stan ten utrzymuje się przez kilkadziesiąt sekund – dopóki system operacyjny się nie zabootuje, a usługasvxlinknie przejmie nad nimi kontroli. Co jest niebezpieczne, jeśli np. svxlink nie uruchomi się z powodu błędnej konfiguracji lub z innych przyczyn, możesz mieć włączony cały czas nadajnik TRX. - Grupa GPIO 9 do GPIO 27 (Domyślny stan: NISKI / Pull-Down):
Na tych pinach po włączeniu zasilania panuje całkowita cisza – napięcie wynosi 0 V.
2. Projektowanie portu PTT (Nadawanie)
Załóżmy, że Twój klucz PTT (np. na tranzystorze NPN lub transoptorze) wymaga stanu wysokiego (3.3 V) z Maliny, aby otworzyć klucz i uruchomić nadajnik w radiu (Active High).
Co się stanie, jeśli wybierzesz pin z zakresu GPIO 0 – 8 (np. GPIO 4)?
W momencie włączenia Raspberry Pi, na pinie natychmiast pojawi się 3.3 V. Nadajnik zacznie nadawać i będzie siał w eterze pustą nośną przez około 30-50 sekund, dopóki SvxLink się nie uruchomi i nie wymusi stanu niskiego.
Jak to rozwiązać?
- Złota zasada projektowania: Dla sygnałów PTT sterowanych stanem wysokim zawsze wybieraj piny z zakresu GPIO 9 – 27 (np. GPIO 17). Po restarcie na pinie będzie 0 V i nadajnik pozostanie bezpiecznie wyłączony.
- Rozwiązanie w
config.txt(jeśli musisz użyć GPIO 4):
Możesz zmusić Raspberry Pi, aby natychmiast po wykryciu zasilania ściągnęło dany pin do 0V. W tym celu edytuj plik konfiguracyjny:nano /boot/firmware/config.txt - Dopisz na samym końcu wymuszenie stanu niskiego (
dl= Drive Low) i ustawienie jako wyjście (op= Output) następujący tekst:gpio=4=op,dl - Jeśli używasz płytki RF.Guru warto dla PTT zrobić wymuszenie stanu wysokiego (
dh = Drive High) użyć wpisu:gpio=16=op,dh - Po restarcie Malina wyłączy napięcie na GPIO 4 w ułamku sekundy, minimalizując niepożądane mignięcie nadajnika.
Ale używając do PTT GPIO z zakresu 0 – 8 możemy wpaść w drugą pułapkę. Kiedy wyłaczymy system w RPI via komendę poweroff lub shutdown now pomimo że system zostanie wyłaczony i sam RPI do procesora nie ma napiecia to szyna Raspberry PI nadala ma napięcie tzn wszystkie piny sa tak jak w stanie przed uruchmieniem systemu a więc mamy napięcia na PIN 1 i 2 oraz GPIO z zakresu 0 – 9 przywraca stan pierwotny czyli mają stan wysoki co spowoduje prze pewnych konstrukcjach układu PTT ze właczy sie nam nadajnik czyli zadziała PTT. Jest tak we wszystkich modelach RPI Zero, Zero 2W, 3B, 4, z wyjątkiem RPI 5, który ma na szynach GPIO wtedy 0 V. Załóżmy, że mam taki układ PTT jak na rysunku:

Musimy wtedy spróbować dołożyć zewnętrzny rezystor pull-down: 2k2 (lub 2.2-4.7kΩ), który w pełni samodzielnie rozwiąże oba problemy (boot i shutdown/crash), działając czysto sprzętowo. Rezystor należy dołożyć pomiędzy wejściem na GPIO 4 a masą.
Wpis config.txt możesz spokojnie zostawić jako dodatkową warstwę zabezpieczenia (nie koliduje z niczym — kiedy SvxLink faktycznie wystartuje i przejmie GPIO4 przez libgpiod, jego sterowanie i tak nadpisuje zarówno stan z rezystora, jak i z firmware) — ale nie jest już on konieczny, skoro masz rezystor. Jeśli wolisz uprościć konfigurację, możesz go usunąć bez żadnej straty bezpieczeństwa — cała ochrona teraz siedzi w samym obwodzie, niezależnie od software’u.
3. Projektowanie portu SQL / COS (Blokada szumów)
Układ blokady szumów przesyła sygnał do Maliny, informując SvxLink, czy na częstotliwości jest ruch. Ponieważ jest to port wejściowy, musimy dopasować konfigurację do logiki wyjściowej naszego radia.
W nowym SvxLink (korzystającym z gpiod) konfigurację polaryzacji wejść wykonujemy bezpośrednio w pliku /etc/svxlink/svxlink.conf za pomocą znaku wykrzyknika (!), który odwraca logikę (Active Low). Zapomnij o starych skryptach gpio.conf czy modyfikacjach w rc.local – są już nieaktywne.
Oto jak skonfigurować najpopularniejsze scenariusze w sekcji [Rx1] pliku svxlink.conf:
Scenariusz A: Radio daje 3.3 V (Stan Wysoki), gdy blokada jest OTWARTA (jest sygnał)
- Wybór pinu: Najlepiej użyć pinu z zakresu GPIO 9-27 (np. GPIO 22), ponieważ ich domyślny stan niskiego podciągania (Pull-Down) zapobiegnie „wiszeniu” portu w powietrzu i fałszywym otwarciom, gdy radio jest odłączone.
- Konfiguracja
svxlink.conf:[Rx1]SQL_DET=GPIODSQL_GPIOD_LINE=22 # Brak wykrzyknika = czysty stan wysoki (3.3V = SQL otwarty)
Scenariusz B: Radio daje 3.3 V (Stan Wysoki), gdy blokada jest ZAMKNIĘTA (cisza), a spada do 0 V, gdy pojawia się sygnał
- Wybór pinu: Tutaj idealnie sprawdzą się piny GPIO 0-8 (np. GPIO 5), ponieważ mają wbudowany Pull-Up, który naturalnie trzyma stan wysoki.
- Konfiguracja
svxlink.conf:
Musimy poinformować SvxLink, że otwarcie blokady następuje przy spadku napięcia do 0 V (Active Low). Robimy to za pomocą wykrzyknika:Rx1]SQL_DET=GPIODSQL_GPIOD_LINE=!5 # Wykrzyknik (!) odwraca logikę (0V = SQL otwarty)
Podsumowanie dla konstruktora – Ściągawka
| Funkcja | Oczekiwany stan fizyczny do aktywacji | Sugerowany zakres GPIO | Zapis w svxlink.conf | Wpis w config.txt (Opcjonalnie) |
|---|---|---|---|---|
| PTT | Stan Wysoki (3.3 V = Nadawanie) | GPIO 9 – 27 | PTT_GPIOD_LINE=17 | Niepotrzebny |
| PTT | Stan Wysoki (3.3 V = Nadawanie) | GPIO 0 – 8 | PTT_GPIOD_LINE=4 | gpio=4=op,dl (Wymagany!) |
| SQL | Stan Wysoki (3.3 V = Ktoś mówi) | GPIO 9 – 27 | SQL_GPIOD_LINE=22 | Niepotrzebny |
| SQL | Stan Niski (0 V = Ktoś mówi) | GPIO 0 – 8 | SQL_GPIOD_LINE=!5 | Niepotrzebny |
Złota zasada na koniec: Projektując interfejs od zera, najbezpieczniejszym podejściem dla PTT jest zawsze stosowanie logiki odwróconej (Active Low) na poziomie sprzętu (nadajnik włącza się zwarciem do masy). Wtedy, nawet w przypadku awarii zasilania, zawieszenia systemu operacyjnego lub odłączenia przewodu sterującego, Twój nadajnik pozostanie całkowicie bezpieczny i wyłączony.
Warto dodać zastrzeżenie, że reguła 0-8/9-27 jest pewna dla Pi modeli Zero, Zero 2W, 3, 3B, 4, ale na Pi 5 należy to zweryfikować fizycznie na konkretnej płytce przed podłączeniem PTT, np. poleceniem:
raspi-gpio get 0-27
⚠️ Ważna uwaga dla użytkowników czujników temperatury DS18B20 (1-Wire)
Wielu krótkofalarzy wyposaża swoje interfejsy w cyfrowe czujniki temperatury DS18B20 do monitorowania radiatora nadajnika. Domyślnie system Raspberry Pi OS (Raspbian) rezerwuje dla magistrali 1-Wire właśnie pin GPIO 4.
Jeśli Twój interfejs radiowy wykorzystuje już GPIO 4 do sterowania PTT, dojdzie do konfliktu sprzętowego, który może zablokować nadajnik lub uniemożliwić odczyt temperatury.
Jak przenieść czujnik DS18B20 na inny pin (np. GPIO 27)?
Musisz jawnie wskazać systemowi nowy pin dla magistrali 1-Wire. W tym celu:
- Otwórz plik konfiguracyjny:
sudo nano /boot/firmware/config.txt - Znajdź linię odpowiedzialną za 1-Wire i dopisz parametr
gpiopin=27dtoverlay=w1-gpio,gpiopin=27
- Zapisz plik i wykonaj restart maliny (
sudo reboot).
Czy domyślny stan niski na GPIO 27 ma znaczenie przy podłączeniu rezystora 4.7 kΩ?
Czujniki DS18B20 do poprawnej pracy wymagają zewnętrznego rezystora podciągającego (najczęściej 4.7 kΩ) wpiętego między linię danych (GPIO) a zasilanie 3.3 V.
Możesz się zastanawiać: Skoro GPIO 27 ma domyślnie sprzętowy stan niski (Pull-Down), to czy nie „pogryzie się” on z zewnętrznym rezystorem 4.7 kΩ (Pull-Up)?
Nie musisz się tym martwić. Wewnętrzny rezystor Pull-Down w procesorze Raspberry Pi ma bardzo dużą rezystancję (około 50 kΩ). Kiedy podłączysz zewnętrzny, znacznie silniejszy rezystor 4.7 kΩ do linii 3.3 V, bez problemu „przemoże” on wewnętrzne podciąganie procesora. W efekcie, po włączeniu zasilania (a jeszcze przed załadowaniem systemu), na linii GPIO 27 i tak ustali się bezpieczny stan wysoki (~3.3 V) wymagany przez czujnik temperatury. Nie zakłóci to startu maliny ani pracy samego czujnika.
Autor artykułu nie ponosi odpowiedzialności za wykorzystane rozwiązanie i wynikające z niego skutki.
