Ciao a tutti,
Vorrei creare un pilota automatico per la mia barca a vela.
In pratica il progetto prevede Arduino con sensore magnetico a tre assi ed un atuattore tipo motore lineare a 12 v da collegare al timone a barra della barca.
Il progetto consiste nel mantenere la prua della barca in una data direzione ( tipo quella che rileva nel momento dell' accensione) e modificare in termini di gradi la direzione con due pulsanti +/-.
Sembra semplice se non ci fosse il problema delle continue correzioni di cui si dovrà occupare, date dal moto ondoso e dal vento.
Pensate sia fattibile?
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.
A quanto detto da pert aggiungo ...
... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (... e, per evitare future possibili discussioni/incomprensioni, prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.
Grazie,
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. ![]()
... ma NON lo è ... e, se provi a fare qualche ricerca qui sul forum Italiano, vedrai che si è già in passato parlato di cose simili ... magari trovi qualche dritta o qualche spunto ![]()
Guglielmo
P.S.: se cerchi "pilota automatico" nella sezione Italiana vengono fuori alcune discussioni, anche vecchie, proprio sul tuo argomento.
Buongiorno,
Ok ora faccio una ricerca.
Grazie
Saluti
Ciao, questo sembra un problema più di fisica (e matematica) che di programmazione. A che livello sei con le competenze di fisica e matematica? (sapresti risolvere un problema con tale difficoltà?)
Prima di tutto si devono scrivere le formule e successivamente adattarle su Arduino. Il sensore magnetico che dati restituisce? Hai già uno sketch per testarlo (anche fuori dall'acqua)?
Scusa per tutte queste domande ma mi devo fare una idea del problema ![]()
Jamoncerrano
Ce ne sono tante, ma QUESTA è interessante perché pone lo stesso problema ...
... e questa risposta di Astrobeed (utente che non è più su questo forum, ma che aveva moltissima esperienza iin materia) è importante:
... ed anche questa:
... che rende bene l'idea ![]()
Guglielmo
io e Fabio ci siamo sempre domandati se due GPS, uno in testa (prua?) e uno in coda (poppa?) possano bastare oppure la precisione sia inadeguate
PS ovviamente: possa bastare fare la differenza tra le posizioni e da li' calcolare la direzione
... credo che questa sia la risposta buona, salvo non usare GPS RTK ... ma in mezzo al mare non so come si potrebbe avere la stazione base ![]()
Guglielmo
Avendo un problema simile (anche se non per una barca), mi ero messo a fare qualche esperimento, basandomi su dei vecchi application notes e su un'articolo che trattava di bussole compensate (purtroppo non li trovo piu in rete, erano molto vecchi), e ne avevo tirato fuori una robaccia del genere per leggere i sensori:
// leggo dati da MPU6050
Wire.beginTransmission(0x68);
Wire.write(0x3B); // inizio registri valori accelerometro e giroscopio
Wire.endTransmission(false);
Wire.requestFrom(0x68, 14, true); // leggo 14 registri consecutivi
accelX = Wire.read() << 8 | Wire.read(); // asse X accelerometro
accelY = Wire.read() << 8 | Wire.read(); // asse Y accelerometro
accelZ = Wire.read() << 8 | Wire.read(); // asse Z accelerometro
giroscX = Wire.read() << 8 | Wire.read(); // asse X giroscopio
giroscY = Wire.read() << 8 | Wire.read(); // asse Y giroscopio
giroscZ = Wire.read() << 8 | Wire.read(); // asse Z giroscopio
// leggo dati da HMC5883L
Wire.beginTransmission(0x1E);
Wire.write(0x03); // inizio da registro 0x03 (MSB asse x)
Wire.endTransmission(false);
Wire.requestFrom(0x1E, 6, true); // leggo 6 registri
magnetX = Wire.read() << 8 | Wire.read(); // asse X magnetometro
magnetZ = Wire.read() << 8 | Wire.read(); // asse Z magnetometro
magnetY = Wire.read() << 8 | Wire.read(); // asse Y magnetometro
NON uso librerie, perche' anche se hanno un sacco di funzioni mi mangiano quasi tutta la memoria disponibile, ed alla fine ho scoperto che molti sensori possono essere letti con dei semplici comandi "wire" ... tanto per dare un'idea, un programma che avevo trovato e che faceva la stessa cosa usando le librerie di Adafruit, mi occupava l'89% della memoria del 328, mentre convertito a comandi "wire" diretti la memoria occupata e' scesa al 20% per l'intero programma, che dovrebbe (in teoria) leggere i dati, calcolare la direzione compensando inclinazioni varie e spedire i dati via RS232 (poi magari sbagliavo io a settare qualcosa, ma la differenza di memoria occupata e' con gli stessi settaggi dell'IDE per entrambe le versioni).
Purtroppo il programma non l'ho mai completato, per mancanza di tempo e di sensori (lo ammetto, colpa mia che ho bruciato sia il magnetometro che il giroscopio a causa di due fili lasciati volanti), ma appena ho un po di tempo lo ritiro fuori e mi procuro altri due sensori per farci dei test e finire la stramaledetta bussola ![]()
Comunque la parte che avrebbe dovuto (in teoria) calcolare e compensare (copiata dal vecchio application note) era questa, magari ti puo servire a qualcosa (tenendo presente i nomi delle variabili riferite alla parte precedente)
// calcoli vari, spudoratamente copiati da un vecchio appnote sperando che fossero corretti
becch = atan2(accelY, sqrt(accelX * accelX + accelZ * accelZ)) * 180 / PI;
rollio = atan2(-accelX, sqrt(accelY * accelY + accelZ * accelZ)) * 180 / PI;
float magnetX_comp = magnetX * cos(becch) + magnetY * sin(rollio) * sin(becch) + magnetZ * cos(rollio) * sin(becch);
float magnetY_comp = magnetY * cos(rollio) - magnetZ * sin(rollio);
imbard = atan2(-magnetY_comp, magnetX_comp) * 180 / PI;
mentre le variabili dichiarate erano queste
// indirizzo MPU6050 0x68
// indirizzo HMC5883L 0x1E
int16_t accelX, accelY, accelZ;
int16_t giroscX, giroscY, giroscZ;
int16_t magnetX, magnetY, magnetZ;
float becch, rollio, imbard, direzione;
float declinaz = 0.12; // declinazione media nord italia
Piu il solito millis per gli intervalli di lettura.
Per quelli che se ne intendono piu di me (quindi tutti), se ci vedete ca...volate, sparate pure senza pieta' (tanto indosso l'armatura antinucleare
)
E' un problema molto presente negli autopilota degli aerei.
Il problema NON E' limitarsi alla correzione del timone (presente anche negli aerei), ma è da sommare allo scarrocciamento che è la componente laterale dovuta al vento (negli aerei) e ANCHE al moto ondoso nelle barche (quindi un poco più complicato) .
Praticamente se c'è vento al traverso, la barca continuerebbe a dirigere il timone in senso contrario (come è giusto che sia) per puntare al punto definito, ma in questo modo percorrerebbe la cosidetta "curva del cane", mentre invece dovrebbe correggere molto di più per contrastare il vento e mantenere la rotta più corta.
E' un errore classico perché "ottico" (cioè miri semplicemente verso un punto), come quello che è successo alla mia amica in volo al mio fianco in aereo: In fase di atterraggio con forte vento al traverso si mise a urlare dicendo "oddio!!! andiamo contro gli hangars!!!! Aiutooo!!! ".
In effetti lei vedeva gli hangars, il muso era girato verso gli hangars e lei stava guardando effettivamente di fronte a sé, ma io stavo mantenendo perfettamente la linea di avvicinamento alla pista, solo che l'aereo era di traverso e io guardavo a sinistra..... (P.S. l'atterraggio fu perfetto anche perché il vento era forte ma teso, senza raffiche )
Per correggere questo errore, quindi, c'è bisogno di un accelerometro e, meglio, di un sensore giroscopico.
E tanta, tanta matematica
![]()
Nel caso di un'aereo, credo ci sia piu che altro bisogno dell'esperienza del pilota ... in fondo, contrariamente a quanto succede per auto o barche, non e' altrettanto semplice fermarsi a mezz'aria per rifare il punto ![]()
Quella del pezzetto di codice che ho copiato dall'appnote, per me' e' anche troppa (e non e' che sia proprio riuscito a capirla del tutto, ad essere sinceri
)
