Le projet de pilote automatique
Sommaire
L'objectif du projet
J'ai eu l'idée et l'envie de concevoir un pilote automatique pour mon bateau basé sur un Raspberry PI et un arduino.
A cette étape j'imagine que le Raspberry sera trop lent pour réagir suffisament vite sur la barre.
J'ai lu quelques articles dans lesquels les formules mathématiques m'ont un peu effrayé.
J'ai donc décidé une approche plus empirique;
Voici le principe général de réalisation du pilote :
L'arduino
Commande du cap
L'arduino aura la tâche d'assurer le cap demandé.
Le cap sera programmé par un clavier équipé de boutons poussoir.
+ 1° - 1° + 10° - 10° auto -> passage en mode pilote automatique stanby -> passage en pilotage manuel
Gyroscope, accéléromètre et magnétomètre
L'arduino sera relié à une carte comportant les fonctionnalité suivantes
- gyroscope
- accéléromètre
- magnétomètre
Le lien vers le site aliexpress : https://www.aliexpress.com/item/SPI-IIC-MPU9250-MPU-9250-MPU-9250-9-Axis-Attitude-Gyro-Accelerator-Magnetometer-Sensor-Module-MPU9250/32216818498.html?spm=a2g0s.9042311.0.0.27424c4dz3S4pD
La station météo BME280
Le BME280 est un composant qui fournit la température, la pression et l'hygrométrie.
Un témoin d'angle de barre
Le GPS
Le GPS est connecté sur les pin 10 et 11 de l'arduino. (10 = TX du GPS , 11 = RX du GPS)
Le code du programme pour gérer les trames NMEA du GPS
#include <SoftwareSerial.h>
//Création de la variable SoftSerial (connexion software au port serie) RX sur le pin D2 et TX sur le pin D3
#define rxPin 10
#define txPin 11
// set up a new serial port
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
//On crée un tableau de caractères qui contiendra notre trame GPS
unsigned char buffer[256];
//la variable count nous servira à ne pas dépasser les 200 caractères du tableau.
int count=0;
void setup() {
//On initialise le port série software
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
mySerial.begin(9600);
//On initialise le port série de l'arduino
Serial.begin(9600);
Serial.println("Lancement...");
}
void loop() {
//On récupère la trame GPS
getGPS();
}
void getGPS() {
static int trameEnCours = 0;
if (mySerial.available()>0)
{
char currentchar = mySerial.read();
if (trameEnCours == 1)
{
if ((currentchar != 0x0A) && (currentchar != 0x0D))
buffer[count++] = currentchar;
}
if (currentchar == '$')
{
trameEnCours = 1;
count=0;
buffer[count++] = '$';
}
if (currentchar == '*')
{
trameEnCours = 0;
// buffer[count++] = 0; // Fin de la chaine de caractères
Serial.write(buffer,count);
Serial.println("");
}
}
}
//Fonction permettant de vérifier si la trame commence par les caractères $GPGGA
int isGPSGPGGA(unsigned char* trameGPS) {
if(trameGPS[0] == '$' && trameGPS[1] == 'G' && trameGPS[2] == 'P' && trameGPS[3] == 'G' && trameGPS[4] == 'G' && trameGPS[5] == 'A')
return 1;
else
return 0;
}
//Methode permettant de remettre à 0 le tableau de caractères
void clearBufferArray()
{
for (int i=0; i<count;i++)
{ buffer[i]=NULL;}
}
Exemple de trames générées
Le checksum a été retiré.
$GPGGA,190250.00,4709.75082,N,00123.61649,W,1,04,4.30,21.0,M,47.9,M,,*
$GPGSA,A,3,23,06,09,07,,,,,,,,,8.93,4.30,7.83*
$GPGSV,3,1,12,02,35,306,,03,19,102,,05,05,288,,06,66,234,23*
$GPGSV,3,2,12,07,34,159,31,09,79,057,25,16,03,064,,17,01,209,*
$GPGSV,3,3,12,19,14,229,,23,47,059,21,26,04,037,,30,11,181,16*
$GPGLL,4709.75082,N,00123.61649,W,190250.00,A,A*
$GPRMC,190251.00,A,4709.75089,N,00123.61611,W,0.250,,200818,,,A*
$GPVTG,,T,,M,0.250,N,0.464,K,A*
$GPGGA,190251.00,4709.75089,N,00123.61611,W,1,04,4.30,21.0,M,47.9,M,,*
$GPGSA,A,3,23,06,09,07,,,,,,,,,8.93,4.30,7.83*
$GPGSV,3,1,12,02,35,306,,03,19,102,,05,05,288,,06,66,234,23*
$GPGSV,3,2,12,07,34,159,31,09,79,057,24,16,03,064,,17,01,209,*
$GPGSV,3,3,12,19,14,229,,23,47,059,21,26,04,037,,30,11,181,17*
$GPGLL,4709.75089,N,00123.61611,W,190251.00,A,A*
$GPRMC,190252.00,A,4709.75091,N,00123.61600,W,0.372,,200818,,,A*
$GPVTG,,T,,M,0.372,N,0.688,K,A*
$GPGGA,190252.00,4709.75091,N,00123.61600,W,1,04,4.29,21.0,M,47.9,M,,*
$GPGSA,A,3,23,06,09,07,,,,,,,,,8.93,4.29,7.83*
$GPGSV,3,1,12,02,35,306,,03,19,102,,05,05,288,,06,66,234,23*
$GPGSV,3,2,12,07,34,159,31,09,79,057,24,16,03,064,,17,01,209,*
$GPGSV,3,3,12,19,14,229,,23,47,059,21,26,04,037,,30,11,181,17*
$GPGLL,4709.75091,N,00123.61600,W,190252.00,A,A*
$GPRMC,190253.00,A,4709.75077,N,00123.61620,W,0.028,,200818,,,A*
$GPVTG,,T,,M,0.028,N,0.052,K,A*
$GPGGA,190253.00,4709.75077,N,00123.61620,W,1,04,4.29,21.1,M,47.9,M,,*
$GPGSA,A,3,23,06,09,07,,,,,,,,,8.93,4.29,7.83*
$GPGSV,3,1,12,02,35,306,,03,19,102,,05,05,288,,06,66,234,22*
$GPGSV,3,2,12,07,34,159,32,09,79,057,25,16,03,064,,17,01,209,*
$GPGSV,3,3,12,19,14,229,,23,47,059,21,26,04,037,,30,11,181,17*
$GPGLL,4709.75077,N,00123.61620,W,190253.00,A,A*
$GPRMC,190254.00,A,4709.75072,N,00123.61517,W,0.624,,200818,,,A*
$GPVTG,,T,,M,0.624,N,1.155,K,A*
$GPGGA,190254.00,4709.75072,N,00123.61517,W,1,04,4.29,21.2,M,47.9,M,,*
$GPGSA,A,3,23,06,09,07,,,,,,,,,8.93,4.29,7.83*
$GPGSV,3,1,12,02,35,306,,03,19,102,,05,05,288,,06,66,234,22*
$GPGSV,3,2,12,07,34,159,33,09,79,057,25,16,03,064,,17,01,209,*
$GPGSV,3,3,12,19,14,229,,23,47,059,20,26,04,037,,30,11,181,17*
$GPGLL,4709.75072,N,00123.61517,W,190254.00,A,A*
$GPRMC,190255.00,A,4709.75081,N,00123.61439,W,0.915,,200818,,,A*
$GPVTG,,T,,M,0.915,N,1.695,K,A*
$GPGGA,190255.00,4709.75081,N,00123.61439,W,1,04,4.29,21.2,M,47.9,M,,*
$GPGSA,A,3,23,06,09,07,,,,,,,,,8.93,4.29,7.83*
$GPGSV,3,1,12,02,35,306,,03,19,102,,05,05,288,,06,66,234,23*
$GPGSV,3,2,12,07,34,159,32,09,79,057,24,16,03,064,,17,01,209,*
$GPGSV,3,3,12,19,14,229,,23,47,059,21,26,04,037,,30,11,181,16*
$GPGLL,4709.75081,N,00123.61439,W,190255.00,A,A*
$GPRMC,190256.00,A,4709.75057,N,00123.61470,W,0.550,,200818,,,A*
$GPVTG,,T,,M,0.550,N,1.018,K,A*
$GPGGA,190256.00,4709.75057,N,00123.61470,W,1,04,4.29,21.4,M,47.9,M,,*
$GPGSA,A,3,23,06,09,07,,,,,,,,,8.93,4.29,7.83*
$GPGSV,3,1,12,02,35,306,,03,19,102,,05,05,288,,06,66,234,23*
$GPGSV,3,2,12,07,34,159,31,09,79,057,23,16,03,064,,17,01,209,*
$GPGSV,3,3,12,19,14,229,,23,47,059,20,26,04,037,,30,11,181,16*
$GPGLL,4709.75057,N,00123.61470,W,190256.00,A,A*
$GPRMC,190257.00,A,4709.75030,N,00123.61496,W,0.486,,200818,,,A*
$GPVTG,,T,,M,0.486,N,0.901,K,A*
$GPGGA,190257.00,4709.75030,N,00123.61496,W,1,04,4.29,21.6,M,47.9,M,,*
$GPGSA,A,3,23,06,09,07,,,,,,,,,8.93,4.29,7.83*
$GPGSV,3,1,12,02,35,306,,03,19,102,,05,05,288,,06,66,234,22*
$GPGSV,3,2,12,07,34,159,30,09,79,057,22,16,03,064,,17,01,209,*
Le Raspberry
Le Raspberry sera raccordé au GPS et recevra les relevés du gyroscope, de l'accéléromètre et du magnétomètre via le port RS232.
Finalement , après réflexion le GPS est raccordé à l'Arduino.