Rispondi 
Costruzione pilota automatico per barca a vela
Autore Messaggio
pepilene Offline
Senior utente

Messaggi: 2.564
Registrato: Jun 2012 Online
Messaggio: #1
Costruzione pilota automatico per barca a vela
Questo contenuto non e' visualizzabile da te Ospite. Se vuoi vederlo, REGISTRATI QUI .Questo contenuto non e' visualizzabile da te Ospite. Se vuoi vederlo, REGISTRATI QUI .Questo contenuto non e' visualizzabile da te Ospite. Se vuoi vederlo, REGISTRATI QUI .Questo contenuto non e' visualizzabile da te Ospite. Se vuoi vederlo, REGISTRATI QUI .Questo contenuto non e' visualizzabile da te Ospite. Se vuoi vederlo, REGISTRATI QUI .
Le foto sono messe a casaccio.
Evitate sviolinate, si tratta di un progetto da portare al termine in collaborazione con Marco.

Il destino mescola le carte, ma siamo noi a giocarle.


14-02-2016 14:22
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
pepilene Offline
Senior utente

Messaggi: 2.564
Registrato: Jun 2012 Online
Messaggio: #2
RE: Costruzione pilota automatico per barca a vela
Questa la dedico a voi AMICI DELLA VELA
Questo contenuto non e' visualizzabile da te Ospite. Se vuoi vederlo, REGISTRATI QUI .

Il destino mescola le carte, ma siamo noi a giocarle.


14-02-2016 14:27
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
graz Offline
Amico del forum

Messaggi: 544
Registrato: Feb 2007 Online
Messaggio: #3
RE: Costruzione pilota automatico per barca a vela
Ti sto seguendo
consulta anche questo: Questo contenuto non e' visualizzabile da te Ospite. Se vuoi vederlo, REGISTRATI QUI .
14-02-2016 21:58
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
danielef Offline
Senior utente

Messaggi: 1.235
Registrato: Nov 2009 Online
Messaggio: #4
RE: Costruzione pilota automatico per barca a vela
Giusto un consiglio. Pensate fin da ora di inserire un feedback che dia al processore l'informazione sulla posizione del timone in modo di controllare non solo il verso dell'azione sulla barra ma anche l'ampiezza dello spostamento della stessa dalla posizione centrale.
Se non lo fate, all'atto pratico, sarà difficile rendere stabile il funzionamento dell'autopilota.

Daniele
15-02-2016 12:16
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Edolo Offline
Vecio AdV

Messaggi: 17.520
Registrato: Mar 2009 Online
Messaggio: #5
RE: Costruzione pilota automatico per barca a vela
Basterebbe un potenziometro.

Pepi... condividi lo sketch se ne hai voglia...
grazie. Ciao

Birbante di un Frap!!!
15-02-2016 13:07
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
danielef Offline
Senior utente

Messaggi: 1.235
Registrato: Nov 2009 Online
Messaggio: #6
RE: Costruzione pilota automatico per barca a vela
Infatti! Nella maggior parte dei casi si tratta proprio di un potenziometro lineare molto preciso. Il problema che dovrete risolvere è come utilizzare il suo segnale; testi che trattano l'argomento ne trovate tanti.

Daniele
15-02-2016 13:25
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Edolo Offline
Vecio AdV

Messaggi: 17.520
Registrato: Mar 2009 Online
Messaggio: #7
RE: Costruzione pilota automatico per barca a vela
Infatti il problema non è tanto costruire un autopilota, ma farlo funzionare bene in condizioni diverse.
Per fargli tenere una prua impostata in fondo bastano 4 righe di codice del tipo
if (prua impostata < di prua letta da bussola)
attuatore++
if (prua impostata > di prua letta da bussola)
attuatore--
Poi beh... si potrebbe affinare la cosa aumentando la velocità dell'attuatore tanto più la differenza è maggiore o rallentarla tanto più è minore, altre 3 righe di codice.
Però da lì all'avere un pilota efficiente ce ne passa.
Che sia fattibile però, non ci piove.

Ciao

Birbante di un Frap!!!
15-02-2016 13:38
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
pepilene Offline
Senior utente

Messaggi: 2.564
Registrato: Jun 2012 Online
Messaggio: #8
RE: Costruzione pilota automatico per barca a vela
Sempre gentili e disponibili qui nel forum "AMICI DELLA VELA grazie x l'aiuto morale.
Posterò le stringhe della compilazione magari qualcuno abbia le idee chiare, e dare il proprio contributo.

Il destino mescola le carte, ma siamo noi a giocarle.


15-02-2016 14:59
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
pepilene Offline
Senior utente

Messaggi: 2.564
Registrato: Jun 2012 Online
Messaggio: #9
RE: Costruzione pilota automatico per barca a vela
Il potenziometro del disegno serve da resistenza al display, attualmente il funzionamento è dato da un apposito tasto che una volta premuto salva la rotta in una memori e la interfaccia con l'angolo bussola, e da li si attivano gli appositi relay dx sx quando necessario.

Il destino mescola le carte, ma siamo noi a giocarle.


15-02-2016 16:32
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
pepilene Offline
Senior utente

Messaggi: 2.564
Registrato: Jun 2012 Online
Messaggio: #10
RE: Costruzione pilota automatico per barca a vela
Ecco lo Sketch, per chi conosce questo linguaggio è abbastanza semplice.
Partiamo dal presupposto che con il pilot.. non debbo attraversare l'Atlantico quindi una cosa molto semplice, tra l'altro parliamo di una scheda Arduino uno da 15 euro. Attualmente il problema maggiore è durante la navigazione con angolo di rotta intorno a 0 gradi.



#include <LiquidCrystal.h>
#include <Wire.h> //i2c library for the Digital Compass

LiquidCrystal lcd( 12, 11, 7, 8, 9, 10 );
const int hmc5883Address = 0x1E; //0011110b, I2C 7bit address for compass
const byte hmc5883ModeRegister = 0x02;
const byte hmcContinuousMode = 0x00;
const byte hmcDataOutputXMSBAddress = 0x03;
int rotta=0;

void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.clear(); //make sure screen is clear.
lcd.print("pepilene is Go");
delay(4000);
Wire.begin(); // Start the i2c communication
Wire.beginTransmission(hmc5883Address); //Begin communication with compass
Wire.write(hmc5883ModeRegister); //select the mode register
Wire.write(hmcContinuousMode); //continuous measurement mode
Wire.endTransmission();

pinMode(2, OUTPUT);//LED FUTURO RELAIS MOTORE A SINISTRA
pinMode(3, OUTPUT);//LED IN FUTURO RELAIS MOTORE A DRITTA
pinMode(4, OUTPUT);//LED PILOTA ON /OFF
pinMode(1, INPUT);//INTERRUTTORE ON OFF PILOTA
pinMode(5, INPUT);//PULSANTE MEMORIZZA ROTTA NUOVA DALL'ANGOLO ATTUALE
pinMode(13, INPUT);//PULSANTE + DIECI GRADI A DRITTA
pinMode(6, INPUT);//PULSANTE - DIECI GRADI A SINISTRA

}
void loop()
{
int x,y,z;
Wire.beginTransmission(hmc5883Address);
Wire.write(hmcDataOutputXMSBAddress); //Select register 3, X MSB register
Wire.endTransmission();
Wire.requestFrom(hmc5883Address,6);
if(6<=Wire.available())
{
x = Wire.read()<<8; //X msb
x |= Wire.read(); //X lsb
z = Wire.read()<<8; //Z msb
z |= Wire.read(); //Z lsb
y = Wire.read()<<8; //Y msb
y |= Wire.read(); //Y lsb
}

int angle = atan2(-y,x)/M_PI*180; // setta angolo SEMPRE POSITIVO
if (angle < 0) // 360 gradi

{
angle = angle +360; // 360 gradi
}

//IL DISPLAY VISUALIZZA STATO ON OPPURE OFF E POI ROTTA E ANGOLO , NON PIù X,Y,Z CHE MI PARE SERVANO A POCO

lcd.clear(); //make sure screen is clear again.
lcd.setCursor(0,0);
if (digitalRead(1) == HIGH) {lcd.print("ON:");} else {lcd.print("OFF:");}
lcd.setCursor(4,0);
lcd.print("rotta:");
lcd.setCursor(0,1);
lcd.print("gradi:");
lcd.setCursor(11,0);
lcd.print(rotta);
lcd.setCursor(11,1);
lcd.print(angle);
delay(500);

//PRIMA VA IMPOSTATA LA ROTA PREMENDO IL BOTTONE 5
if (digitalRead(5) == HIGH) {rotta = angle;}

//POI VA AVVIATO IL PILOTA CON L'INTERRUTTORE 1
if (digitalRead(1) == HIGH) {digitalWrite(4, HIGH);

//PILOTA ADESSO AVVIATO FUNZIONANO I TASTI PER CAMBIARE ROTTA
:smiley30:if (digitalRead(6) == HIGH) {rotta = rotta + 10;}Smiley30
:smiley30:if (digitalRead(13) == HIGH) {rotta = rotta - 10;}Smiley30


if (rotta < angle){digitalWrite(3, HIGH); delay(100);digitalWrite(3, LOW); delay(100);}
else {digitalWrite(2, HIGH);delay(100);digitalWrite(2, LOW);delay(100);}
}
else
{digitalWrite(3, LOW);}
}

Il destino mescola le carte, ma siamo noi a giocarle.


15-02-2016 19:06
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
danielef Offline
Senior utente

Messaggi: 1.235
Registrato: Nov 2009 Online
Messaggio: #11
RE: Costruzione pilota automatico per barca a vela
Visto.
Il problema attorno a zero l'avrai sempre se non cambi qualcosa.
Penso che il modo migliore di confrontare la rotta impostata (rotta) e la bussola (angle) sia di calcolare la differenza rotta-angle, senza neppure bisogno di fare la trasformazione iniziale in modo che angle > 0.
Dopo la sottrazione, il risultato va portato a un numero compreso tra -180 e +180 sommando o sottraendo 360 a seconda dei casi e, a quel punto, lo puoi utilizzare per controllare i relè. Se è maggiore di zero ne accende uno, se è minore di zero l'altro, se è zero non accende nulla. Se è esattamente -180 o +180 non c'è problema, basta che accenda uno dei relè qualsiasi ma NON entrambi :-).
Tra l'altro il valore assoluto di questo numero ti dice quanto sei fuori rotta e di quando devi spostare la barra; vedi quello che ho accennato in un precedente post.

Daniele
15-02-2016 19:47
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
pepilene Offline
Senior utente

Messaggi: 2.564
Registrato: Jun 2012 Online
Messaggio: #12
RE: Costruzione pilota automatico per barca a vela
Risolto il problema della rotta.
Adesso l'angolo deve flottare a 5 gradi della rotta "senza nessuna azione dell'attuatore " scostamenti ".



#include <LiquidCrystal.h>
              #include <Wire.h>  //i2c library for the Digital Compass
   
          
               
               LiquidCrystal lcd( 12, 11, 7, 8, 9, 10 );
               const int hmc5883Address = 0x1E; //0011110b, I2C 7bit address for compass
               const byte hmc5883ModeRegister = 0x02;
               const byte hmcContinuousMode = 0x00;
               const byte hmcDataOutputXMSBAddress = 0x03;
               
int rotta=0;         
int tressessanta=360;
int zero=0;   
      void setup()
      {
                // set up the LCD's number of columns and rows:
                lcd.begin(16, 2);
                lcd.clear();  //make sure screen is clear.
                lcd.print("pepilene ");
                delay(4000);
                Wire.begin(); // Start the i2c communication
                Wire.beginTransmission(hmc5883Address);  //Begin communication with compass
                Wire.write(hmc5883ModeRegister);  //select the mode register
                Wire.write(hmcContinuousMode); //continuous measurement mode
                Wire.endTransmission();


  
pinMode(2, OUTPUT);//LED FUTURO RELAIS MOTORE A SINISTRA
pinMode(3, OUTPUT);//LED IN FUTURO RELAIS MOTORE A DRITTA
pinMode(4, OUTPUT);//LED PILOTA ON /OFF


pinMode(1, INPUT);//INTERRUTTORE ON OFF PILOTA
pinMode(5, INPUT);//PULSANTE MEMORIZZA ROTTA NUOVA DALL'ANGOLO ATTUALE
pinMode(13, INPUT);//PULSANTE + DIECI GRADI A DRITTA
pinMode(6, INPUT);//PULSANTE - DIECI GRADI A SINISTRA


  
       }





void loop()
            {
 
                int x,y,z; 
                Wire.beginTransmission(hmc5883Address);
                Wire.write(hmcDataOutputXMSBAddress);  //Select register 3, X MSB register
                Wire.endTransmission();
                Wire.requestFrom(hmc5883Address,6);
                if(6<=Wire.available())
                {
                  x = Wire.read()<<8; //X msb
                  x |= Wire.read();   //X lsb
                  z = Wire.read()<<8; //Z msb
                  z |= Wire.read();   //Z lsb
                  y = Wire.read()<<8; //Y msb
                  y |= Wire.read();   //Y lsb   
                }
                         
              int angle = atan2(-y,x)/M_PI*180; // setta angolo SEMPRE POSITIVO
              if (angle < 0) // 360 gradi
      
              {
                angle = angle +360;  // 360 gradi
              }


//IL DISPLAY VISUALIZZA STATO ON OPPURE OFF E POI ROTTA E ANGOLO , NON PIù X,Y,Z CHE MI PARE SERVANO A POCO
 
                lcd.clear();  //make sure screen is clear again.
lcd.setCursor(0,0); 
if (digitalRead(1) == HIGH) {lcd.print("ON:");} else {lcd.print("OFF:");}
                lcd.setCursor(4,0); 
                lcd.print("rotta:");
                lcd.setCursor(0,1); 
                lcd.print("gradi:");              
                lcd.setCursor(11,0);
                lcd.print(rotta);                
                lcd.setCursor(11,1);
                lcd.print(angle);              
                delay(500);
                
//PRIMA VA IMPOSTATA LA ROTA PREMENDO IL BOTTONE 5 
if (digitalRead(5) == HIGH) {rotta = angle;}


//POI VA AVVIATO IL PILOTA CON L'INTERRUTTORE 1         
if (digitalRead(1) == HIGH) {digitalWrite(4, HIGH);
  
//PILOTA ADESSO AVVIATO FUNZIONANO I TASTI PER CAMBIARE ROTTA


            // AUMENTA L'ANGOLO DI ROTTAThumbsupsmileyanim
if (digitalRead(6) == HIGH) 
             {
              rotta = rotta + 10;


             // ORA RIPORTA I VALORI DENTRO I 360 GRADIThumbsupsmileyanim
             if (rotta > tressessanta) { rotta = rotta - tressessanta;}
             delay(30);
            }
            
              // DIMINUISCI L'ANGLO DI ROTTA
if (digitalRead(13) == HIGH) 
             {
              rotta = rotta - 10;


              // ORA RIPORTA I VALORI DENTRO I 360 GRADIThumbsupsmileyanim
              if (rotta < zero) {rotta = rotta + tressessanta;}
              delay (30);
             }  
   // PILOTA AUTOMATICAMENTE AUTONOMO      Smiley30    
if (rotta < angle){digitalWrite(3, HIGH); delay(100);digitalWrite(3, LOW); delay(100);}
else {digitalWrite(2, HIGH);delay(100);digitalWrite(2, LOW);delay(100);}
    }
else
  {digitalWrite(3, LOW);}
}

Il destino mescola le carte, ma siamo noi a giocarle.


(Questo messaggio è stato modificato l'ultima volta il: 16-02-2016 07:36 da pepilene.)
16-02-2016 07:26
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
danielef Offline
Senior utente

Messaggi: 1.235
Registrato: Nov 2009 Online
Messaggio: #13
RE: Costruzione pilota automatico per barca a vela
Guarda che se fai così, nel senso che riporti a valori compresi tra 0 e 360 PRIMA di fare la sottrazione, avrai sempre qualche problema attorno allo zero.
Basta che pensi a cosa succede se la rotta impostata è 10 e l'angolo bussola è 355. Invece di prendere la via più corta, cioè di andare verso 360 e superarlo, i comandi al timone faranno fare alla barca un giro di 345 gradi.

Non puoi comandare i relè semplicemente con l'istruzione
if (rotta < angle).
Devi anche controllare che la differenza tra i due valori non sia maggiore di 180 in valore assoluto e, nel caso, invertire i comandi di manovra.

Comunque, non siamo in sito di programmazione o di analisi numerica quindi interrompo qui.

Daniele
16-02-2016 10:22
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
pepilene Offline
Senior utente

Messaggi: 2.564
Registrato: Jun 2012 Online
Messaggio: #14
RE: Costruzione pilota automatico per barca a vela
Questa segmento serve a evitare che quando aumento la rotta di - 10 o +10 la rotta vada a oltre 361e - 01, valori non contemplati rispetto a angle. Spero di essere stato chiaro.

            // AUMENTA L'ANGOLO DI ROTTA
if (digitalRead(6) == HIGH) 
             {
              rotta = rotta + 10;


             // ORA RIPORTA I VALORI DENTRO I 360 GRADI
             if (rotta > tressessanta) { rotta = rotta - tressessanta;}
             delay(30);
            }
            
              // DIMINUISCI L'ANGLO DI ROTTA
if (digitalRead(13) == HIGH) 
             {
              rotta = rotta - 10

Il destino mescola le carte, ma siamo noi a giocarle.


16-02-2016 12:09
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
danielef Offline
Senior utente

Messaggi: 1.235
Registrato: Nov 2009 Online
Messaggio: #15
RE: Costruzione pilota automatico per barca a vela
No ma non importa, se funziona meglio per te. Io credo che se non consideri il vero e proprio valore della differenza tra rotta impostata e angolo bussola ma solo quale dei due è maggiore, non vai molto lontano ma... potrei anche sbagliare!

Daniele
16-02-2016 12:31
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
danielef Offline
Senior utente

Messaggi: 1.235
Registrato: Nov 2009 Online
Messaggio: #16
RE: Costruzione pilota automatico per barca a vela
Mi correggo. Ovviamente la tua ultima aggiunta era necessaria altrimenti imposti una rotta maggiore di 360 gradi: anche se matematicamente è ineccepibile, non sta bene!
Quello di cui parlavo io, invece, è un problema che riguarda il vero e proprio inseguimento della rotta impostata. Utilizzare un controllo che sfrutta solamente una relazione maggior/minore non funziona bene perché potrebbe farti fare un'accostata di più di 180 gradi. Devi utilizzare il valore, con il segno, della differenza tra l'angolo di bussola e l'angolo di rotta impostato ma devi sempre scalare questa differenza (modulo 360) in modo che sia compresa tra -180 e +180.

E qui chiudo veramente. Se vuoi altro aiuto scrivimi per mp.

Daniele
17-02-2016 10:29
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
marcofailla Offline
Vecio AdV

Messaggi: 6.333
Registrato: Aug 2015 Online
Messaggio: #17
Costruzione pilota automatico per barca a vela
Pepilene
Per me il problema si risolve facile facendo lavorare la routine pilota a numeri alti
Fai conto intorno a 3600 gradi
Da li per incappare nello zero devo fare più di dieci giri completi tutti verso sinistra col pilota, mi pare un evento trascurabile senzaccontare che 3600 può diventare anche 360000...
Basta impostare una nuova variabile per la routine pilota uguale ad angolo e a rotta più 3600 per esempio
Chiaramente bisogna lasciare che l'angolo della bussola possa diventare negativo però quindi va tolta quel if angolo minore di 0 = angolo + 360.

chi si è bagnato con l'acqua di mare non si asciuga più (cit. vecchi marinai :-)
17-02-2016 13:15
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
pepilene Offline
Senior utente

Messaggi: 2.564
Registrato: Jun 2012 Online
Messaggio: #18
RE: Costruzione pilota automatico per barca a vela
Credo anche io proverò.

Il destino mescola le carte, ma siamo noi a giocarle.


17-02-2016 13:33
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
marcofailla Offline
Vecio AdV

Messaggi: 6.333
Registrato: Aug 2015 Online
Messaggio: #19
Costruzione pilota automatico per barca a vela
Pepilene, quella cosa che dicevo io più sopra funziona ma Danielef ha proposto qualcosa di molto più elegante
Prova lo sketch che hai nella posta se funziona

chi si è bagnato con l'acqua di mare non si asciuga più (cit. vecchi marinai :-)
17-02-2016 14:38
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
danielef Offline
Senior utente

Messaggi: 1.235
Registrato: Nov 2009 Online
Messaggio: #20
RE: Costruzione pilota automatico per barca a vela
(17-02-2016 13:15)marcofailla Ha scritto:  Pepilene
Per me il problema si risolve facile facendo lavorare la routine pilota a numeri alti
Fai conto intorno a 3600 gradi
Da li per incappare nello zero devo fare più di dieci giri completi tutti verso sinistra col pilota, mi pare un evento trascurabile senzaccontare che 3600 può diventare anche 360000...
Basta impostare una nuova variabile per la routine pilota uguale ad angolo e a rotta più 3600 per esempio
Chiaramente bisogna lasciare che l'angolo della bussola possa diventare negativo però quindi va tolta quel if angolo minore di 0 = angolo + 360.
Mi spiace ma quello che scrivi ha poco senso e non risolve il problema di base. Il problema di base è un altro: tenere conto della periodicità dell'angolo che significa, per esempio, che l'angolo di 36000 gradi è uguale all'angolo 36360 ma anche a 35640, etc etc etc. Aggiungere un numero arbitrario per mettersi lontano dallo zero non cambia nulla: il concetto che lo zero per qualche ragione sia più sfigato degli altri numeri, come ho detto, mi spiace ma non ha senso! 89

Daniele
17-02-2016 14:51
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Discussioni simili
Discussione: Autore Risposte: Letto: Ultimo messaggio
  Strumento di controllo del pilota mod Raymarine ST6001 - compatibilità? crocchidù 1 330 27-11-2023 07:38
Ultimo messaggio: pepe1395
  Pilota st4000 impazzito Francescobissotwo 4 377 15-10-2023 20:53
Ultimo messaggio: Francescobissotwo
  Pilota ST6000...'NO LINK' ???? Madinina II 32 7.148 14-09-2023 16:22
Ultimo messaggio: Poliorcete
  Problemi pilota st 4000 CUCUDRIL 0 297 12-09-2023 11:14
Ultimo messaggio: CUCUDRIL
  Pilota automatico a ruota che resta agganciato torcido 14 729 29-07-2023 12:34
Ultimo messaggio: torcido
  Consiglio pilota automatico giorgio8596 15 1.040 13-07-2023 17:09
Ultimo messaggio: giorgio8596
  St70 - Pilota automatico vaimo 4 586 05-07-2023 16:39
Ultimo messaggio: vaimo
  Pilota automatico blocca la ruota Masmau 30 2.630 24-04-2023 08:41
Ultimo messaggio: Masmau
  Comandare il pilota automatico con apple watch (o simile) sema23 1 405 21-04-2023 21:19
Ultimo messaggio: Antaniiii
  Rumore pilota automatico Raymarine Ev 100 Francodepoi 6 1.212 14-11-2022 01:12
Ultimo messaggio: Francodepoi

Vai al forum:


Utente(i) che stanno guardando questa discussione: 1 Ospite(i)