martedì 9 febbraio 2021

Dalla carta nautica cartacea a quella digitale.

Si, si può creare una carta nautica elettronica a partire dall'immagine o meglio da una sua scansione.


La prima cosa da fare è ottenere una scansione della mappa nautica cartacea attraverso uno scanner in modo da ottenere una immagine proporzionata su tutti i lati della mappa, o in alternativa è possibile scattare una foto e poi correggere le proporzioni con una delle diverse app presenti sui nostri telefonini ( Office Lens per citarne una... qui un post che ne spiega il funzionamento).
Inutile dire che migliore sarà la scansione e maggiore sarà la nitidezza della mappa digitale da utilizzare poi sul nostro plotter.

Adesso è necessario procurarsi il software che ci permetterà di effettuare tale migrazione, il nome del nostro programmino è imgcalkap ed è possibile ottenerlo gratuitamente da questa pagina https://github.com/dgiardini/imgcalkap/releases/tag/0.3 . 
Una volta scaricato lo Zip file non è necessario avviare nessuna installazione, ma bisogna scompattarlo in una qualsiasi cartella e il programma è così già pronto per il suo utilizzo.


Vediamo quali sono i passi per effettuare la nostra digitalizzazione:

Per prima cosa bisogna avviare l'eseguibile imgcalkap.exe , quello che vedremo è una finestra come nell'immagine che seguente.

Cliccando da una qualsiasi parte dell'immagine centrale si apre una nuova finestra che ci permette di importare la nostra immagine precedentemente scansionata della carta nautica.
Fatto questo vedremo la nostra immagine nella finestra del programma:

Noterete la presenza di una piccola finestra sulla sinistra che visualizza una sezione ingrandita della parte su cui si trova il puntatore del mouse, questo ci servirà per selezionare in modo preciso dei punti sulla mappa.
E infatti la prima cosa che dobbiamo fare è inserire i punti di calibrazione , questi serviranno poi per ottenere le informazioni necessarie per il corretto posizionamento della mappa sul nostro plotter.
Per aggiungere un punto di calibrazione bisogna puntare con il mouse un punto della mappa di cui si conoscono con precisione le coordinate ( latitudine e longitudine) e premere il tasti , a questo punto comparirà sulla mappa un marcatore rosso che indica che il punto è stato marcato.
Si può eliminare il punto appena selezionato puntando il nostro marcatore e successivamente premendo il tasto D.
Invece cliccando col tasto destro sul nostro marcatore rosso sarà possibile specificare qual è la sua posizione in termini di latitudine e longitudine.
Per l'ottenimento della nostra mappa digitale è necessario specificare almeno 2 di questi punti di calibrazione, ancora meglio se tali punti sono posizionati sugli angoli opposti della mappa. 

A questo punto possiamo specificare quelle che sono le informazioni generali della nostra mappa, per fare ciò possiamo cliccare con il destro del mouse su una qualsiasi parte della mappa, si aprirà una nuova finestra chiamata Chart info in cui bisogna specificare il tipo di proiezione, la scala ecc...
Solitamente i soli 3 campi da riempire sono i primi tre: nome, descrizione e scala.

A questo punto il programmino ha tutti i dati necessari per generare la nostra carta nautica digitale. 

L'ultimo passo da eseguire è premere il tasto S che aprirà una nuova finestra la quale ci permetterà di scegliere la cartella di salvataggio.
Verranno prodotti di fatto 2 file , uno con estensione .KAP e un altro con stesso nome ma con estensione .TXT. 
Entrambe i file sono adesso pronti per essere utilizzate dal vostro plotter.
Naturalmente quello che abbiamo ottenuto è una carta piatta ( una immagine) e non una carta vettoriale.
Ho provato l'utilizzo dei file generati come mappe su openCPN senza nessun problema.

Aspetto i vostri feedback!





Troppo complicato? Contatta la TAO Software  attraverso il modulo contatti, per pochi euro offre il servizio (bisogna fornire una foto o una scansione con la migliore risoluzione possibile della mappa cartacea). 


martedì 2 febbraio 2021

Pilota a barra per barca con nodemcu

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 :

- scheda di sviluppo open source ESP8266 NodeMCU
- ponte H L298N per pilotare il motore 
- motore cc già presente originale
- pulsantiera già presente originale

Mi sono orientato su questa funzionalità:
ricevere i dati nmea del navigatore attraverso il collegamento wifi su protocollo UDP della scheda nodemcu e utilizzare questi dati per pilotare il braccio dell'autopilota. Risultato PERFETTO! 

Ma vediamo i dettagli cominciando dall'hardware :
Come già detto del vecchio autohelm 800 ho riutilizzato il motore (in corrente continua), l'involucro plastico e la pulsantiera provvista di un led rosso molto comodo.

Mi sono studiato la pulsantiera e sono riuscito a mappare i collegamenti di ogni pulsante, attraverso l'uso di una breadboard ho testato il funzionamento mediante l'uso di una libreria per arduino scritta appositamente per tale scopo, trovate i dettagli a questo indirizzo Keypad library .

Qui di seguito lo schema elettrico della pulsantiera e di come è stata connessa alla scheda nodemcu:

Adesso passiamo al circuito per pilotare il motore in cc. Per tale scopo ho utilizzato un  ponte H ed esattamente il circuito L298N che oltre a fornire la componentistica per pilotare il motore ha anche una uscita da +5v ( pilotandolo con i 12v della batteria)  da utilizzare per alimentare la piccola scheda nodemcu.
I collegamenti sono molto semplici : il negativo della batteria è comune sia al L298N che alla scheda di controllo nodemcu, mentre l'alimentazione di quest'ultima viene prelevata dall'uscita da 5v del ponte H ( L298N).
A questi collegamenti vanno aggiunti quelli di controllo ( pin 1 e 2 ) che asseconda che essi sia in stato alto ( +5 v) o basso ( 0 v) determinano il senso di rotazione del motore secondo questo schema:

1 basso , 2 alto -> senso orario
1 alto , 2 basso -> senso antiorario
1 basso, 2 basso -> motore fermo 

A questo punto i collegamenti sono finiti e non resta che studiare bene come inscatolare il tutto.


Adesso passiamo al software:
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.
L'algoritmo PID meriterebbe un post apposito per la piena comprensione ( perchè no ...).

Ma vediamo sia lo pseudo codice che il codice effettivo poi sviluppato per il nostro autopilota:

previous_error = 0
 integral = 0 
 start:
   error = setpoint - measured_value
   integral = integral + error*dt
   derivative = (error - previous_error)/dt
   output = Kp*error + Ki*integral + Kd*derivative
   previous_error = error
   wait(dt)
   goto start

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.