Jouer avec le NMEA 0183 grâce au "RS422/RS485 Arduino Shield"

Bonjour,

Dans un coin de ma tête trotte maintenant le projet d'un DIY AIS MOB ALARM (parce qu'on m'a offert des balises AIS MOB sans ASN et que j'aimerais bien que ça réveille ma co-skippeuse quand je tomberais à l'eau dans la nuit noire).

Est-ce que quelqu'un a déjà utilisé le comme il est décrit , pour lire du NMEA 0183 sur Arduino ?

Est-ce le seul moyen (simple) de le faire ou y a-t-il d'autres méthodes ?
Je suis preneur de tout retour sur et autour de la question.
Merci,

L'équipage
20 nov. 2023
20 nov. 2023

Amha, donc à confirmer par d'autres, les entrées sorties série suffisent. Un adaptateur TTL / RS232 suffit amplement.


20 nov. 2023

La doc de mon récepteur AIS précise : "This product uses the NMEA 0183-RS422 protocol (differential signal)". Donc il me faut un truc comme ça : www.arduiner.com[...]to-ttl/
?


20 nov. 202320 nov. 2023

Bonjour, tu peux repartir de ces 2 fils que j'ai un peu initié et beaucoup laissé tomber ;-)

www.hisse-et-oh.com[...]boratif

https://www.hisse-et-oh.com/sailing/detection-mob-projet-collaboratif

www.hisse-et-oh.com[...]utonome


https://www.hisse-et-oh.com/sailing/bouton-mob-hardware-autonome

De mémoire, on trouve le code du décodeur de la trame NMEA MOB sur le net (ce qui est ton besoin), mais moins facile d'émettre ce message (je ne sais plus pourquoi... mais ce n'est pas ton sujet)

en cherchant nmea arduino decoder ou parser

je n'ai pas trouve de AIS MOB ALARM ARDUINO déjà fait,
mais il ya des AIS ALARM ARDUINO qui detectent un navire à proximité, c'est certainement une bonne base
community.element14.com[...]essages


tdm2023:Merci, je vais regarder ça tranquillement. Pour mon alarme, dans l'état actuel de mes réflexions, je me disais que je n'allais pas systématiquement décoder toutes les phrases NMEA, mais trier progressivement. 1) Est-ce que la phrase en un message AIS (commence par "!") ? Si oui, on continue, si non, on arrête. Est-ce que le payload commence par 14 (message d'urgence) ? si oui, j'émets un BIP puis je continue, si non j'arrête. Ensuite il s'agit de repérer uniquement les MMSI de mes balises et pour ça je ne décode pas systématiquement tous les payloads commençant par 14 (parce que ça m'obligerait à implémenter tout le décodage). Je fais l'inverse, c'est à dire que je calcule en dur sur papier à l'avance les payloads correspondant à mes MMSI (du moins seulement les premiers caractères, ceux du MMSI) et je traque ensuite ces payloads. Si ça correspond, déclenchement de l'alarme, si non on arrête.·le 20 nov. 16:08
tdm2023:J'ai trouvé la doc du protocole AIS ici : gpsd.gitlab.io[...]DM.html ·le 20 nov. 16:05
04 déc. 2023

Pour info, j'ai commandé et reçu aujourd'hui (pour 2 euros et quelques) un .

Je l'ai branché entre mon récepteur AIS (+GPS) et mon arduino, et en cherchant un peu j'arrive maintenant à lire les trames NMEA via le arduino UNO. Ça n'a pas été plug and play mais l'affaire d'une petite heure pour trouver la bonne configuration et le petit skecth arduino qui va bien.

J'ai l'impression que le plus dûr est fait. Quand j'aurais les vraies trames AIS (pour le moment l'antenne n'est pas branchée) je pourrai "sniffer" les trames qui m'intéressent (celles correspondantes aux MMSI de mes balises MOB) et déclencher l'alarme.

A suivre !


05 déc. 2023

as tu trouvé quelqu'un qui a déja fait tout ou partie du boulot? décodage des trames NMEA en général ou décodage des trames AIS?
C'est intéressant aussi de faire soi-même, mais des fois ça aide d'avoir des sources !


05 déc. 2023

@yannbis
Alors, j'ai bien trouvé des sources pour des parsers NMEA et AIS :
shah253kt.github.io[...]ser-v2/
github.com[...]sparser

Mais pour le moment je ne m'en suis pas servi. J'ai juste recopié le second exemple de ce tutoriel "", ajusté le BaudRate et le nombre de caractères par ligne. Puis de manière assez simple, les trames NMEA se sont montrées lisibles dans le moniteur série de l'IDE Arduino (voir image jointe). Je ne suis pas du tout spécialiste de ce qui se passe à ce bas niveau, mais j'imagine que c'est simplement du ASCII/serial.

Ensuite, pour mon application particulière, je n'aurai pas besion d'analyser une à une les phrases, mais simplement de trier progressivement :
1. Je ne garde que les phrases AIS
2. Je ne garde que celles qui relèvent d'une urgence
3. Je ne garde que celles qui correspondent aux MMSI de mes balises.

Je ne compte pas décoder les payloads AIS, mais faire le travail inverse et simplement rechercher les payloads dont les premiers caractères correspondent à mes balises, que j'aurais préalablement calculé sur papier et rentré en dûr dans le programme. Ça fera moins de calcul pour le arduino.

Voilà les choses telles que je les vois pour le moment. Mais je suis loin d'être spécialiste et je suis ouvert bien sûr à toute suggestion.

```
// copied from forum.arduino.cc[...]/382007
// connect QKA026 (NMEA OUT- , NMEA OUT+) to RS422 TO TTL (B,A)
// connect RS422 TO TTL (VCC, GND, RXD) to ARDUINO UNO (5V, GND, RX0)
// Example 2 - Receive with an end-marker

const byte numChars = 64; //original was 32, I have changed it to have longer sentences
char receivedChars[numChars]; // an array to store the received data

boolean newData = false;

void setup() {
Serial.begin(38400);
Serial.println("");
}

void loop() {
recvWithEndMarker();
showNewData();
}

void recvWithEndMarker() {
static byte ndx = 0;
char endMarker = '\n';
char rc;

while (Serial.available() > 0 && newData == false) {
rc = Serial.read();

if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
ndx = 0;
newData = true;
}
}
}

void showNewData() {
if (newData == true) {
Serial.print("This just in ... ");
Serial.println(receivedChars);
newData = false;
}
}
```


05 déc. 2023

Bonjour,

Il y a des modules moins chers et moins encombrants comme par exemple, celui-ci :

Aucun problème dans la durée...


Pour jouer avec le Nmea018, on ajoute entre autres...

include

NMEA nmeaDecoder(ALL);


Ensuite, il suffit de trouver le terme recherché avec nmeaDecoder.term(X) ; par exemple pour lire l'en-tête...(extrait d'un programme)

void pitchRoll(){

while (Serial1.available()) {

if (nmeaDecoder.decode(Serial1.read())) {

char* title = nmeaDecoder.term(0);

if (strcmp(title,"IIROT") == 0) {

Serial.println(nmeaDecoder.sentence());
Serial3.println(nmeaDecoder.sentence()); // sortie sur nmea4wifi
delay(100);

etc...


Tranoy, Norvège

Phare du monde

  • 4.5 (76)

Tranoy, Norvège

2022