Les logiciels Windows de Tiercelin
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.