Piccolo progetto sviluppato durante il periodo di lockdown di questo maledettissimo 2020.
Di cosa si tratta: avevo un vecchio pilota automatico a barra (autohelm 800) per la mia piccola barchetta a vela che ormai non funzionava più e le uniche parti recuperabili erano l'involucro, la pulsantiera e il motorino con attuatore lineare, mi sono detto " e se rimpiazzo tutta la logica con una scheda arduino compatibile?", da questa semplice domanda ho fatto la lista della spesa cercando di riciclare quello che avevo già in casa ( cioè una schedina nodemcu con wifi e il modulo di controllo L298N per motori in cc), quindi ricapitolando :
Per un risultato ottimale quello che serve è un algoritmo basato sul controllo Proporzionale-Integrale-Derivativo, tale algoritmo consente un pilotaggio privo di oscillazioni e permette di effettuare le giuste correzioni di rotta.
I parametri fondamentali da settare sono Kp ( azione proporzionale), Kd ( azione derivativa) e Ki (azione integrale).
Dopo diverse prove i valori che più hanno soddisfatto le mie attese sono stati questi :
float DT = 500;
float KP = 1.2;
float KI = KP/DT * 0.8;
float KD = KP*DT * 100;
dove DT è l'intervallo di tempo (millisecondi) tra una azione compensativa e l'altra.
Quello che segue è l'implementazione del pseudocodice appena visto adattato allo specifico utilizzo sull'autopilota a barra:
void calculateTargetMotorPosition()
{
float headingDiff = targetHeading - Heading;
if ( headingDiff > 180 ) headingDiff -= 360;
if ( headingDiff < -180 ) headingDiff += 360;
Error = Error + (headingDiff * DT);
if ( Error > MaxError) Error = MaxError;
if ( Error < MinError) Error = MinError;
//Compute error derivative
ErrorDer = (headingDiff - prevError)/DT;
prevError = headingDiff;
//Compute correction
Correction = KP * headingDiff;
Correction += KD * ErrorDer;
Correction += KI * Error ;
if ( abs(Correction) > MaxCorrection) Correction = MaxCorrection;
if ( abs(Correction) > MinCorrection ) moveMotor(abs(Correction), Correction > 0);
}
Il codice completo è disponibile a questo indirizzo: https://www.dropbox.com/s/5554l3br1wuzzof/AutopilotaPID.ino?dl=0
E' importante ricordarsi di configurare correttamente la connessione all hotspot Wifi della barca o del plotter nell'apposita sezione ( linee 12 e 13 del codice):
//WiFi Config
#define WIFI_SSID "wifiSSIDName"
#define WIFI_PASS "WifiPassword"
e configurare il plotter in modo tale che i dati relativi alla rotta da seguire e alla posizionje (gps) siano correttamente trasmessi all'autopilota sulla porta 10112 ( modificabile) su protocollo UDP :
unsigned int UDPPort = 10112;
In questo post potete trovare le informazioni per configurare OpenCPN in modo tale da inviare le informazioni necessarie all'autopilota per poter funzionare. In particolare i messaggi NMEA che servono al pilota per funzionare sono ECAPB per l'ottenimento della rotta da seguire e ECRMC per acquisire quella che è la direzione attuale della barca (COG) .
Per chi non lo sapesse OpenCPN è un software open source disponibile per diversi sistemi operativi. Questo software è in grado di trasformare un computer ( PC o mini computer come Raspberry) in un sistema cartografico.
Ma come funziona una volta programmato e montato ?
Molto semplice: appena acceso l'autopilota può essere mosso attraverso i tasti +10 +1 -10 -1 della pulsantiera che muovono il braccio in maniera proporzionale al numero premuto.
In questa modalità la barra rimarrà ferma e il pilotaggio sarà totalmente manuale.
Per attivare il pilota automatico bisognerà premere il tasto AUTO ( rosso ), solo a questo punto il pilota automatico proverà a connettersi alla rete wifi, precedentemente configurata, e, se tutto funziona a dovere, comincerà a ricevere i dati di navigazione dal plotter, l'intermittenza del led confermerà che questo stia accadendo.
Il progetto è notevolmente migliorabile e sicuramente può essere arricchito di tante funzionalità ...
Aspetto i vostri feedback.
Nessun commento:
Posta un commento