Samodejno krmiljenje RemoteQTH 4SQ-8DIR

de S53X

Samodejno krmiljenje RemoteQTH 4SQ-8DIR
SDC – PstRotatorAz – ESP32 – ULN2803A – 4SQ-8DIR

Cilj: po vnosu callsign v SDC “NewQSO” okno se 4SQ sam postavi v pravo smer.
Veriga sistema: SDC – PstRotatorAz – ESP32 – ULN2803A – 4SQ-8DIR
***
SDC
Podaja položaj antene
↓
PstRotatorAz
Pridobi azimut
↓
TCP
Zanesljivejši prenos: TCP skrbi za dostavo in vrstni red podatkov
↓
ESP32-S3
Razbere azimut in izbere smer
↓
ULN2803A
Vklop ustrezne kombinacije
↓
BC327→ releji na 4SQ RF Boxu
Vklop posameznih relejev

***
Kazalo:
1. SDC nastavitve za povezavo s PstRotatorAz
2. PstRotatorAZ nastavitve za povezavo z ESP32-S3-Wi-Fi
3. sketch za ESP32-S3 (glej priponko 1)
4. test ESP32-S3 izhodov z LED
5. releji v RemoteQTH 4SQ-8DIR RF Boxu
6. ožičenje ESP32-S3 – ULN2803A

1. SDC nastavitve za povezavo s PstRotatorAz
Med SDC in PstRotator poteka UDP protokol.
– SDC- v Contest – Antennas nastavi:
– kljukica PST Rotator
– IP 192.168.88.11 ( IP PCja kjer teče SDC)- TX port pusti na 12000, RX na 12001
– v PstRotator v UDP Control Setup vpiši isti IP in port kot zgoraj

1. SDC nastavitve za povezavo s PstRotatorAz
Med SDC in PstRotator poteka UDP protokol.
– SDC- v Contest – Antennas nastavi:
– kljukica PST Rotator
– IP 192.168.88.11 ( IP PCja kjer teče SDC)- TX port pusti na 12000, RX na 12001
– v PstRotator v UDP Control Setup vpiši isti IP in port kot zgoraj

2. PstRotatorAZ nastavitve za povezavo z ESP32-S3-Wi-Fi
Nastavitve v PstRotatorAz:
V oknu Communication → TCP Client.
V oknu TCP Client- Connection nastavi Azimuth:
– IP: 192.168.88.40 ( = IP od ESP32)
– Port: 4001
– nato klikni Connect.
( v oknu Monitor od Arduino IDE programa lahko spremljaš kako prihajajo paketi s komandami)
– v Setup označi UDP Contro, da prejema UDP iz SDC.

3. Sketch za ESP32-S3 (glej priponko 1)
– install in/ali open Arduino IDE
– izberi pravi Board
– priklopi ESP32 na COM xx
– izberi pravi COM xx

4. Test ESP32-S3 izhodov z LED
Vseh šest izhodov ESP32-S3 lahko preveriš z LED-diodo, ne da bi priklopil ULN2803A. Tako preveriš ali se posamezni GPIO preklopi na HIGH, ko PstRotatorAz spremeni smer.
Potrebuješ:
– 1 LED-diodo
– 1 upor 330 Ω (lahko tudi 220 Ω)
– nekaj povezovalnih žic
Pozor: ESP32-S3 uporablja logiko 3,3 V. Ne priklapljaj LED neposredno med GPIO in GND brez upora. Ne uporabljaj 5 V na GPIO.

Priključi eno LED in upor, nato ju zaporedoma prestavljaj na te GPIO-je:

Rele – GPIO – Smer, v kateri mora LED svetiti

R1 – GPIO 4 – N, SE, W, NW
R2 – GPIO 5 – SE, S, W, NW
R3 – GPIO 6 – E, SE, S, NW
R4 – GPIO 7 – N, E, SE, NW
R5 – GPIO 15 – SE, SW
R6 – GPIO 16 – E, SE, S, SW, W
LED mora svetiti, ko je ustrezni izhod HIGH in ugasniti, ko je LOW.

5. releji v RemoteQTH 4SQ-8DIR RF Boxu
smer: pritegne rele:
S 2-3-6
SW 5-6
W 1-2-6
NW 1-2-3-4
N 1-4
NE /
E 3-4-6
SE 1-2-3-4-5-6

V FTP Cat5 kablu, ki pelje iz 4-SQ 8 Direction Antenna Switch boxa in ga priklopiš na RF box je razpored žic:
1 – be/or rele 1
2 – or rele 2
3 – be/ze rele 3
4 – be/pl rele 4
5 – ze rele 5
6 – be/rj rele 6
plava GND
rjava REF
oplet FTP Cat5 kabla GND

Poraba toka glede na smer pri 12,5V:
S 19 mA
SW 17 mA
W 19 mA
NW 20 mA
N 10 mA
NE 3 mA = poraba elekronike
E 19 mA
SE 34 mA = vsi releji ON

6. Ožičenje ESP32-S3 – ULN2803A

Pri ESP32 z logiko 3,3 V je kombinacija ESP32 + ULN2803A + BC327 + releji RT424912 zato, da ohraniš obstoječi program in preklapljaš pozitivnih +12 V na tuljave, katerih skupni priključki so na skupnem GND. ULN 2803A namreč preklaplja minus pol, releje v RF Boxu pa plus 12V napetost.


opis slike spodaj:
– levi pcb – 6x BC327 transistorji:
… vklapljajo releje v RF Boxu
– desni PCB:
… ESP32 S3 ploščica – Wi-Fi RX iz PstRotatorAz preko LAN omrežja
… viola je ULN2803A – odpira BC327 glede na signal iz ESP32
… zelena je MP-1584 – down converter iz 12V na 5V za napajanje ESP32

samodejni preklop smeri z ESP32

RemoteQTH 4SQ-8DIR RF Box

ročni preklop smeri z Antenna Switch

S53X 30. 10. 2026

*
**
***

*** priponka 1- sketch koda:
=========================================================================

#include <WiFi.h>
#include <WebServer.h>

// ================================

// Wi-Fi in omrezje

// ================================

const char* ssid = “tvoj_wifi”;
const char* password = “geslo_tvojega_wifi”;

IPAddress local_IP(192, 168, 88, 40);
IPAddress gateway(192, 168, 88, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(192, 168, 88, 1);

// ================================

// TCP in spletni streznik

// ================================

WebServer webServer(80);
WiFiServer tcpServer(4001);
WiFiClient tcpClient;

String ukaz = “”;
unsigned long zadnjiIzpisStanja = 0;

// ================================

// GPIO izhodi za releje

// ================================

const int R1 = 4;
const int R2 = 5;
const int R3 = 6;
const int R4 = 7;
const int R5 = 15;
const int R6 = 16;

// Varnost: ob zagonu so vsi izhodi izklopljeni.

// HIGH aktivira vhod ULN2803A.

void vsiRelejiIzklopljeni() {
digitalWrite(R1, LOW);
digitalWrite(R2, LOW);
digitalWrite(R3, LOW);
digitalWrite(R4, LOW);
digitalWrite(R5, LOW);
digitalWrite(R6, LOW);
}

// Nastavi kombinacijo relejev

void nastaviReleje(
bool r1, bool r2, bool r3,
bool r4, bool r5, bool r6
) {
digitalWrite(R1, r1 ? HIGH : LOW);
digitalWrite(R2, r2 ? HIGH : LOW);
digitalWrite(R3, r3 ? HIGH : LOW);

digitalWrite(R4, r4 ? HIGH : LOW);

digitalWrite(R5, r5 ? HIGH : LOW);

digitalWrite(R6, r6 ? HIGH : LOW);

}

// ================================

// Izbira smeri glede na azimut

// ================================

void nastaviSmer(int azimut) {

azimut = ((azimut % 360) + 360) % 360;

Serial.println();

Serial.println(“——————————“);

Serial.print(“Azimut: “);

Serial.print(azimut);

Serial.println(” stopinj”);

if (azimut >= 338 || azimut < 23) {

Serial.println(“SMER: N”);

nastaviReleje(1, 0, 0, 1, 0, 0);

}

else if (azimut < 68) {

Serial.println(“SMER: NE”);

nastaviReleje(0, 0, 0, 0, 0, 0);

}

else if (azimut < 113) {

Serial.println(“SMER: E”);

nastaviReleje(0, 0, 1, 1, 0, 1);

}

else if (azimut < 158) {

Serial.println(“SMER: SE”);

nastaviReleje(1, 1, 1, 1, 1, 1);

}

else if (azimut < 203) {

Serial.println(“SMER: S”);

nastaviReleje(0, 1, 1, 0, 0, 1);

}

else if (azimut < 248) {

Serial.println(“SMER: SW”);

nastaviReleje(0, 0, 0, 0, 1, 1);

}

else if (azimut < 293) {

Serial.println(“SMER: W”);

nastaviReleje(1, 1, 0, 0, 0, 1);

}

else {

Serial.println(“SMER: NW”);

nastaviReleje(1, 1, 1, 1, 0, 0);

}

Serial.println(“——————————“);

}

// ================================

// Obdelava TCP ukazov

// ================================

void obdelajUkaz(String s) {

s.trim();

// Odstrani zakljucni podpicje

if (s.endsWith(“;”)) {

s.remove(s.length() – 1);

}

// Zanima nas samo ukaz AP

if (!s.startsWith(“AP”)) {

return;

}

/*

Pri dosedanjih primerih:

AP1090; -> 090 -> 90 stopinj

AP1180; -> 180 -> 180 stopinj

Predpostavka protokola:

prvi znak za AP je oznaka, azimut pa so

naslednje tri stevke.

*/

if (s.length() != 6) {

Serial.print(“Nepricakovana oblika AP ukaza: “);

Serial.println(s);

return;

}

String azText = s.substring(3, 6);

for (unsigned int i = 0; i < azText.length(); i++) {

if (!isDigit(azText[i])) {

Serial.println(“Napaka: azimut ni stevilo.”);

return;

}

}

int azimut = azText.toInt();

if (azimut < 0 || azimut > 359) {

Serial.println(“Napaka: azimut je izven obsega.”);

return;

}

Serial.print(“Prejet AP ukaz: “);

Serial.println(s);

nastaviSmer(azimut);

}

// ================================

// Zagon

// ================================

void setup() {

Serial.begin(115200);

delay(1000);

// Najprej pripravi GPIO in izklopi izhode

pinMode(R1, OUTPUT);

pinMode(R2, OUTPUT);

pinMode(R3, OUTPUT);

pinMode(R4, OUTPUT);

pinMode(R5, OUTPUT);

pinMode(R6, OUTPUT);

vsiRelejiIzklopljeni();

Serial.println();

Serial.println(“=================================”);

Serial.println(“ESP32-S3 – PstRotatorAz”);

Serial.println(“TCP + 8 smeri + 6 izhodov”);

Serial.println(“=================================”);

if (!WiFi.config(local_IP, gateway, subnet, dns)) {

Serial.println(“OPOZORILO: Staticni IP ni nastavljen.”);

}

WiFi.mode(WIFI_STA);

WiFi.begin(ssid, password);

Serial.print(“Povezovanje na Wi-Fi”);

while (WiFi.status() != WL_CONNECTED) {

delay(500);

Serial.print(“.”);

}

Serial.println();

Serial.println(“Wi-Fi povezan!”);

Serial.print(“IP ESP32: “);

Serial.println(WiFi.localIP());

webServer.on(“/”, HTTP_GET, []() {

webServer.send(

200,

“text/plain; charset=utf-8”,

“ESP32-S3 deluje.\nTCP vrata: 4001\n”

);

});

webServer.begin();

Serial.println(“Spletni streznik: vrata 80.”);

tcpServer.begin();

tcpServer.setNoDelay(true);

Serial.println(“TCP streznik: vrata 4001.”);

Serial.println(“Cakam na PstRotatorAz…”);

}

// ================================

// Glavna zanka

// ================================

void loop() {

webServer.handleClient();

// Sprejem TCP povezave

if (!tcpClient || !tcpClient.connected()) {

if (tcpClient) {

tcpClient.stop();

ukaz = “”;

Serial.println(“TCP povezava prekinjena.”);

}

WiFiClient novaPovezava = tcpServer.available();

if (novaPovezava) {

tcpClient = novaPovezava;

tcpClient.setNoDelay(true);

ukaz = “”;

Serial.println(“TCP POVEZAVA VZPOSTAVLJENA!”);

Serial.print(“Oddaljeni IP: “);

Serial.println(tcpClient.remoteIP());

}

}

// TCP je tok podatkov; vsak ukaz zakljuci podpicje

while (tcpClient && tcpClient.connected() &&

tcpClient.available() > 0) {

char znak = (char)tcpClient.read();

if (znak == ‘;’) {

ukaz += ‘;’;

obdelajUkaz(ukaz);

ukaz = “”;

}

else if (znak >= 32 && znak <= 126) {

ukaz += znak;

if (ukaz.length() > 100) {

Serial.println(“Predolg ukaz – zavrzen.”);

ukaz = “”;

}

}

}

// Izpis stanja vsakih 5 sekund

if (millis() – zadnjiIzpisStanja >= 5000) {

zadnjiIzpisStanja = millis();

if (WiFi.status() != WL_CONNECTED) {

Serial.println(“OPOZORILO: Wi-Fi ni povezan.”);

}

else if (tcpClient && tcpClient.connected()) {

Serial.println(“Stanje TCP: povezava aktivna.”);

}

else {

Serial.println(“Stanje TCP: cakam na PstRotatorAz.”);

}

}

delay(2);

}

================================================================

Leave a Reply