top of page

Montage pour transmetre l'état de la mer et la gite en NMEA

Montage Arduino pour le capteur trois axes.

Branchement de la carte Arduino UNO :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Remarques:

Certains capteurs n'ont pas de reférence ( fil blanc ) cela fonctionne quand même.

Il faut étalonner le capteur ( déterminer les mini et maxi de l'axe z ) ici : 270 et 405 le capteur étant à plat, puis retounéde 180°.

On peut utiliser ce petit programme  et en bougeant le capteur de haut en bas et de bas en haut rapidement

 

const int pin_x = A0;

const int pin_y = A1;

const int pin_z = A2;

const float aref = 3.3;

int minz;

int maxz;

void setup()

{

  Serial.begin(9600);

  minz=500;

  maxz=0;

}

 

void loop()

{

  int x;

  int y;

  int z;

 

  x = analogRead(0);

  y = analogRead(1);

  z=analogRead(2);

  if (z<minz) minz=z;

  if (z>maxz) maxz=z; 

  Serial.print("x=");

  Serial.println(x);

  Serial.print("y=");

  Serial.println(y);

  Serial.print("minz=");

  Serial.println(minz);

  Serial.print("maxz=");

  Serial.println(maxz);

  delay(1000);

}

 

 

Le Programme  etat de la mer et angle de gite :

 

String laphrasemer;

String merini;

String etatmer;

String laphrasegite;

String giteini;

String gite;

int check;

byte  etatdelamer = 0;

byte lagite=0;

const int xPin = 0;

const int yPin = 1;

const int zPin = 2;

//il faut ajuster ces quatre valeurs

int minVal = 270;

int maxVal = 405;

int minValac = 270;

int maxValac = 410;

double x;

double y;

double z;

byte xx;

byte nb=0;

double zz=0;

byte debut;

 

void setup()

{

  Serial.begin(9600);

  nb=0;

  zz=0;

}

 

 

 

void loop(){

  zz=0;

   int xRead = analogRead(xPin);

  int zRead = analogRead(zPin);

  int yRead = analogRead(yPin);

  //convertion en degrees -90 to 90 - pour atan2

  int xAng = map(xRead, minVal, maxVal, -90, 90);

  int yAng = map(yRead, minVal, maxVal, -90, 90);

  int zAng = map(zRead, minVal, maxVal, -90, 90);

  //faire dix mesures pour l'état de la mer avec l'accélération verticale

  nb=0;

  do

  { 

    delay(50);

    z=analogRead(zPin);

    if (z>zz)     zz=z;

    nb++;

  }

  while (nb<10);

  //calcule de l'angle de gite

  x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);

  if (x>180)  x=abs(x-360);

  xx=byte(x);

  lagite= xx;

  //fabriquer la trame nmea

  merini = "$ERRMT";

  etatmer = String(calculetatmer(zz));

  gite = String(lagite);

  laphrasegite = merini + ",,,,,,," + etatmer + ","+gite+",R" ; 

  check = getCheckSum(laphrasegite);

  laphrasegite = laphrasegite+"*";

  Serial.print(laphrasegite);

  Serial.println(check,HEX);

 }

 

byte calculetatmer(float zz){

  byte etat;

  float z;

  z=abs(414-zz);

  if (z<40) etat=0;

  if ((z>=40)&& (z<80)) etat=1;

  if ((z>=80)&& (z<120)) etat=2;

  if ((z>=120)&& (z<160)) etat=3;

  if ((z>=160) && (z<200)) etat=4;

  if ((z>=200) && (z<240)) etat=5;

  if (z>=240) etat=6;

  return etat;

}

 

int getCheckSum(String phrase) {

  int checksum = 0;

  int longueur = 0;

  longueur = phrase.length(); 

  for(int i = 1; i < longueur; i++)

  {

    checksum = checksum ^ int(phrase[i]);

  }

  return checksum;  

 

}

 

Avec Livre de Bord, l'enregistrement des polaires est alors automatique suivant l'état de la mer.

 

bottom of page