| "Descrizione" by Al222 (24891 pt) | 2026-May-24 21:47 |
Al momento sono solo appunti in via di test
Nella Parte 1 abbiamo costruito un sistema con un servo per l'azimut non a 360°, ma economico, per far pratica sui comandi principali
Nella Parte 2 abbiamo costruito un sistema ad azimut a 360°
In questa Parte 3 il progetto sarà completo con servo azimut a 360° e servo elevazione entrambi comandati per tracciare tutti i satelliti.presenti nel programma Gpredict.
Montiamo sul servo azimut Waveshare ST3215-HS il servo per l'elevazione in modo chela parte dove andrà posizionata l'antenna sia rivolta a Sud 180°. Questo servo ha bisogno di un alimentatore 5v 1A.

A sistema spento:
Alimentazione 12 V Waveshare → OFF USB Arduino Mega → scollegata Alimentatore 5 V servo elevazione → OFF
Collegare il servo elevazione così:
Rosso servo elevazione → +5 V alimentatore esterno Nero servo elevazione → - alimentatore esterno Nero / GND alimentatore 5 V → GND Arduino Mega Bianco servo elevazione → D10 Arduino Mega
Carichiamo il codice per pilotare il servo Azimut ST3215-HS con il servo Elevazione EL D10.
Accendere in questo ordine:
1. USB Arduino Mega → PC 2. Alimentatore 12 V → scheda Waveshare 3. Alimentatore 5 V → servo elevazioneDopo l’accensione controllare
L'accrocchio si presenta così e il foglio di carta simula l'antenna parabolica. Il braccio del servo elevazione si è spostato dopo l'accensione.ST3215-HS fermo Servo elevazione fermo Nessun componente scalda Nessun servo forza meccanicamente
Controlliamo che servo elevazione vada in posizione centrale e resti fermo.
Lasciare collegato:
Arduino Mega USB → PC Waveshare 12 V → ONAlimentatore 5 V servo elevazione → ON
Carichiamo il test manuale AZ + EL
Nel programma Arduino IDE,
questo codice per comandare AZ + EL da Serial Monitor.
Nel programma Arduino IDE:
#include #include SMS_STS st; Servo servoEl; const byte SERVO_ID = 1; const int EL_PIN = 10; float azDeg = 180.0; float elDeg = 0.0; int azToPos(float az) { az = constrain(az, 0.0, 360.0); return (int)((az / 360.0) * 4095.0); } int elToUs(float el) { el = constrain(el, 0.0, 180.0); return map((int)(el * 10), 0, 1800, 800, 2200); } bool parseValue(String line, const char *key, float &value) { int idx = line.indexOf(key); if (idx < 0) return false; int i = idx + strlen(key); while (i < line.length() && line[i] == ' ') i++; value = line.substring(i).toFloat(); return true; } void moveRotator() { st.WritePosEx(SERVO_ID, azToPos(azDeg), 1000, 50); servoEl.writeMicroseconds(elToUs(elDeg)); } void setup() { Serial.begin(9600); Serial.setTimeout(50); Serial1.begin(1000000); st.pSerial = &Serial1; servoEl.attach(EL_PIN); delay(1000); moveRotator(); Serial.println("Rotore AZ/EL pronto"); Serial.println("Esempio comando: AZ 180 EL 30"); } void loop() { if (Serial.available()) { String line = Serial.readStringUntil('\n'); line.trim(); line.toUpperCase(); float newAz, newEl; bool gotAz = parseValue(line, "AZ", newAz); bool gotEl = parseValue(line, "EL", newEl); if (gotAz) azDeg = newAz; if (gotEl) elDeg = newEl; if (gotAz || gotEl) { moveRotator(); Serial.print("AZ "); Serial.print(azDeg, 1); Serial.print(" EL "); Serial.println(elDeg, 1); } } }
Poi sempre nel programma Arduino IDE
Sketch → Verify / Compile
Premere il pulsante con il segno di spunta ✓.
Se non dà errori:
Sketch → Upload
Premere il pulsante con la freccia verso destra →.
Dopo il caricamento aprire:
Tools → Serial Monitor
Premere l’icona lente in alto a destra.
Impostare:
Baud: 9600 Line ending: Newline
Poi provare:
AZ 180 EL 0
L'elevazione resta a Sud immobile.
Premere Send / Invia.
Poi:
AZ 180 EL 30
Premi Send / Invia.
L'elevazione sale di 30°.
Ora proviamo questi comandi nel Serial Monitor:
AZ 180 EL 0
Premi Send / Invia: l'elevazione ritorna a Sud
AZ 180 EL 60
Premi Send / Invia.
AZ 180 EL 90
Premi Send / Invia: l'elevazione è parallela al cielo
Quindi se sale progressivamente, possiamo passare al codice per Hamlib / Gpredict.
Caricare il codice per Hamlib / Gpredict.
Nel programma Arduino IDE, cancellare tutto e incollare questo:
#include #include SMS_STS st; Servo servoEl; const byte SERVO_ID = 1; const int EL_PIN = 10; const int EL_MIN_US = 800; const int EL_MAX_US = 2200; const float AZ_OFFSET_DEG = 0.0; // correzione futura di pochi gradi float azDeg = 180.0; float elDeg = 0.0; int azToPos(float az) { az = az + AZ_OFFSET_DEG; while (az < 0.0) az += 360.0; while (az > 360.0) az -= 360.0; return (int)((az / 360.0) * 4095.0); } int elToUs(float el) { el = constrain(el, 0.0, 180.0); return map((int)(el * 10), 0, 1800, EL_MIN_US, EL_MAX_US); } bool parseValue(String line, const char *key, float &value) { int idx = line.indexOf(key); if (idx < 0) return false; int i = idx + strlen(key); while (i < line.length() && line[i] == ' ') i++; if (i >= line.length()) return false; char c = line[i]; if (!(c == '-' || c == '+' || c == '.' || (c >= '0' && c <= '9'))) return false; value = line.substring(i).toFloat(); return true; } void moveRotator() { st.WritePosEx(SERVO_ID, azToPos(azDeg), 1000, 50); servoEl.writeMicroseconds(elToUs(elDeg)); } void setup() { Serial.begin(9600); // USB Arduino Mega → Hamlib / Gpredict Serial.setTimeout(50); Serial1.begin(1000000); // Mega TX1/RX1 → Waveshare ST3215-HS st.pSerial = &Serial1; servoEl.attach(EL_PIN); delay(1000); moveRotator(); } void loop() { if (Serial.available()) { String line = Serial.readStringUntil('\n'); line.trim(); line.toUpperCase(); if (line == "AZ") { Serial.print("AZ"); Serial.println(azDeg, 1); return; } if (line == "EL") { Serial.print("EL"); Serial.println(elDeg, 1); return; } if (line == "AZ EL") { Serial.print("AZ"); Serial.print(azDeg, 1); Serial.print(" EL"); Serial.println(elDeg, 1); return; } float newAz, newEl; bool gotAz = parseValue(line, "AZ", newAz); bool gotEl = parseValue(line, "EL", newEl); if (gotAz) azDeg = newAz; if (gotEl) elDeg = newEl; if (gotAz || gotEl) { moveRotator(); } } }
Poi, nel programma Arduino IDE:
Sketch → Verify / Compile
Premere il pulsante ✓.
Se non ci sono errori:
Sketch → Upload
Premere il pulsante →.
4 movimenti sono l’assestamento del servo elevazione quando riceve il comando iniziale.
Test con rotctl.
Chiudere Arduino IDE Serial Monitor: nel programma Arduino IDE Serial Monitor se aperto, premere X per chiuderlo.
Poi aprire il Prompt dei comandi di Windows e scrivere:
cd "C:\Program Files\hamlib-w64-4.7.1\bin" premereInvio escrivere:
rotctl.exe -m 202 -r COM4 -s 9600
premere:Invio
Se la porta dell’Arduino Mega non è COM4, sostituire COM4 con quella corretta.
Nel prompt:
Rotator command:
P 180 30
Premere:
Invio
L’elevazione deve salire a circa 30°.
Poi provare:
P 180 0
Premere:
Invio
Deve tornare a 0°.
Poi provare l’azimut:
P 90 0
Premere:
Invio
Deve puntare a Est.
Poi:
P 180 0
Premere:
Invio
Deve tornare a Sud.
A questo punto il sistema funziona e il rotore è pronto per Gpredict. (per l'installazione: https://sourceforge.net/projects/gpredict/files/Gpredict/2.3.37/)
1. Scaricare gpredict-win32-2.3.37.zip
2. Estrarre lo ZIP in una cartella, per esempio C:\Gpredict
3. Aprire la cartella estratta
4. Fare doppio clic su gpredict.exe
Per la parte hardware abbiamo:
Arduino Mega → Hamlib EasyCommII
Azimut → ST3215-HS tramite Waveshare
Elevazione → servo 25 kg su D10
COM4 → 9600 baud
in cmd
rotctld.exe -m 202 -r COM4 -s 9600 -T 127.0.0.1 -t 4533
Collegare Gpredict a rotctld
Chiudere tutte le finestre di prompt (cmd)
Aprire un solo Prompt e scrivere
cd "C:\Program Files\hamlib-w64-4.7.1\bin"
Poi:
rotctld.exe -m 202 -r COM3 -s 9600 -t 4533 -ve premere Invio
In Gpredict:
Edit → Preferences
cercare nella finestra delle preferenze una sezione chiamata:
Interfaces
e poi
Rotators
Dentro devi trovare la configurazione dei rotators.
Cliccare Add / Add New. Gpredict usa questo percorso: Edit → Preferences → Interfaces → Rotators → Add New.
Compilare così:

Prima di usare il tracking occorre impostare la propria Ground Station, altrimenti Gpredict calcolerà i satelliti da Copenhagen, Denmark
Quindi:Edit → Preferences → General
Ground Stations
completare i campi
Confermare con OK, chiudere e riaprire Gpredict.
Aggiornare i TLE (Two-Line Element) sono i dati orbitali aggiornati dei satelliti.
Edit → Update TLE data from network
Poi:
Edit → Update transponder dataDopo l’aggiornamento, Gpredict userà i dati satellitari aggiornati dalla posizione salvata.
Avviare rotctld per Gpredict
Chiudere il Serial Monitor del programma Arduino IDE, se aperto.
Aprire un solo Prompt dei comandi Windows e scrivere:
cd "C:\Program Files\hamlib-w64-4.7.1\bin"
Premere Invio.
Poi scrivere:
rotctld.exe -m 202 -r COM4 -s 9600 -t 4533 -v
Premere Invio.
La finestra deve restare aperta con il cursore lampeggiante.
Poi aprire Gpredict e collegare il rotore a:
Host: 127.0.0.1 Port: 4533
Non chiudere il Prompt, perché rotctld deve restare in esecuzione.
cd "C:\Program Files\hamlib-w64-4.7.1\bin"
Premere Invio.
rotctld.exe -m 202 -r COM4 -s 9600 -t 4533 -v
Premere Invio.
Engage
Track
A questo punto Gpredict dovrebbe comandare direttamente il rotore.
In Gpredict → Antenna Control, la casella Monitor serve per leggere continuamente la posizione reale del rotore.
Monitor attivo = Gpredict interroga il rotore e aggiorna AZ / EL grandi
Monitor non attivo = Gpredict può comandare il rotore, ma non aggiorna continuamente la posizione letta
Spuntare Monitor
Poi controllare:
Engage attivo Track attivo Cycle 1000 Tolerance 0.1 / 0.5
Se Monitor è spento, può succedere che AT si muova, ma i numeri grandi AZ / EL restino fermi o si aggiornino poco.
Fine, testato e collaudato.
| Evaluate |