Hello, Guest!
 
 

 
 
  Objects Tiiips Categories
Parte 3
"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 elevazione

Dopo l’accensione controllare

ST3215-HS fermo
Servo elevazione fermo
Nessun componente scalda
Nessun servo forza meccanicamente
L'accrocchio si presenta così e il foglio di carta simula l'antenna parabolica. Il braccio del servo elevazione si è spostato dopo l'accensione.


Controlliamo che servo elevazione vada in posizione centrale e resti fermo.

Lasciare collegato:

Arduino Mega USB → PC
Waveshare 12 V → ON
Alimentatore 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 per chiuderlo.

Poi aprire il Prompt dei comandi di Windows e scrivere:

cd "C:\Program Files\hamlib-w64-4.7.1\bin" premere Invio e scrivere:
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 .

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 -v
e 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 data
Dopo 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.

  1. Lasciare il Prompt aperto.
  2. Aprire Gpredict.
  3. Aprire Antenna Control.
  4. Premere:
Engage
  1. Selezionare un satellite e premere:
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