NMEA2000 et ESP32

Bonjour,

Sur notre voilier, nous avons OpenCPN depuis plus d'un an (Raspy4 4Gb,écran 15",wifi local pour retransmission vers d'autre application, et réception d'un récepteur AIS en Wifi).
Nos capteurs Loch et écho (tacktik) commencent à vieillir. On voudrais les remplacer par de nouveau capteur de préférence NMEA2000 (AIRMAR DST810).
J'ai trouver un module SH-ESP32 de HatLab qui permet de communiquer en NMEA2000.
D'après ce que j'ai lu, il semblerait que ce module puisse communiquer avec le serveur SignalK installé sur le raspberry via USB ou Wifi....
Donc je suppose (j’attends les capteurs DST810) que lorsque le capteur sera branché sur le module SH-ESP32, ce dernier enverra les message NMEA2000 vers le serveur SignalK.
Cependant et j'arrive à mon problème, je voudrait branché des capteur analogique (conversion A-D via ADS1XXXX et SH -ESP32 puis transfert via le NMEA2000 au SignalK.
Mais je ne trouve pas le moyen de prendre une valeur numérique, et de l'intégrer dan un message NMEA2000 puis de l'envoyer vers le SignalK......
Quelqu'un aurait-il fait cette manip, ou aurait un autre solution pour avoir un réseau NMEA2000 sur le bateau (on peut aussi acheter un convertisseur ana-> NMEA200, mais ce n'est pas drôle, et c'est très cher, plusieurs centaine d'€)

Merci

Michel

L'équipage
14h

Bonjour,
C'est facilement faisable avec la bibliothèque SensESP (github.com[...]SensESP ) au détail près que l'esp32 lit l'ads1xxx et transmet les données directement au serveur Signalk (on peut les formater à souhait). Le serveur signalk peut ensuite les convertir en nmea2000 si nécessaire...


Je n’ai pas de SH-ESP32 mais utilise mes modules ESP32 avec SensESP (signalk.org[...]ensESP/ ) pour mes projets (DS18B20, ADS1XXXX, BME680, IMU, relais, interrupteurs, . . . ). SensESP est développé par Matti Airas, le concepteur/fabriquant du SH-ESP32.
Mes modules communiquent avec Signal K sur un RPi 4 via Wi-Fi et Signal K passe les informations à mon réseau N2K à travers un module N2K1083 (www.vela-navega.com[...]n2k0183 ).


13h

Hello,
J'ai fait pas mal de montages avec divers capteurs pour alimenter le réseau nmea2000.
La bibliothèque la plus pratique que j'ai utilisé était celles bien connues de Timo Lappalainen:
github.com[...]MEA2000
github.com[...]alainen
Amicalement.
FX


Bonjour,

Merci pour vos réponses.
J'étati arrivé sur le site de Timo Lappalainen, mais je me perd un peu dans touts ce qu'il inclure..Deplus , je programme d'habitude avec Visual Code, et si le projet de hat lab SH-ESP32-nmea2000-gateway-main qui permet de recevoir du NMEA200 et le transmettre vers SignalK fonctionne (même si je n'ai pas encore de capteur NMEA2000) je n'arrive pas à prendre la mesure de tempe ou une mesure analogique (ça , cela marche), mais comment la metter sur le réseau NMEA2000 ? C'est la que je ne comprend pas.
DOnc,
Lecture température (DHT20 i2C) OK
Lecture valeur Analogiqu (ADS1115 I2C), OK
Connection SH-ESP32 via USB sur SignalK ok mais pas de capteur.
Donc reste :
Convertire les mesure en phrase NMEA2000 et envoyer vers SIgnalK

Il semble qu'il faille inclure des librairies, mais c'est la que je bloque......

Merci


fxvt:Hello,
Malgré ces précisions, je n'arrive pas à comprendre le projet. Que récupères-tu comme données ? comment ? où veux tu les envoyer ? Par quel moyen ?, un schéma actuel ? Un schéma à vernir ?...
Amicalement. FX·le 03 nov. 11:11
CapCool:Moi non plus, je ne comprends pas bien ton montage.·le 03 nov. 11:43
11h11h

Juste pour information, il y a une autre approche possible. Avec un simple ESP32 monté sur ton réseau NMEA 2000, tu peux tout faire : recevoir des trames, traduire des trames, émettre des trames, afficher tout ce que tu veux (wifi + interface HTML). Ca demande un peu de code, mais c'est beaucoup plus puissant et tu peux te libérer des librairies plus ou moins vérolées. A coût minime, tu peux créer tes propres capteurs (baromètre, GPS, gyro 9 axes...), envoyer des trames à ton pilote, scanner ton réseau...


je termine mon micropython et je retourne à mon C++ / ESP32 / NMEA2000 :-)


Bonjour capCool,

Oui, je vois bien le principe, mais ma question est comment faire cela?
Quel librairie utiliser?
Quel code programmer ? (Un exemple ?)
Comment mette en oeuvre?,
......?

Je dois dire que j'ai un peu de mal avec github, cela manque d'explications.....

Merci

Michel


CapCool:C'est pas très compliqué, mais cela nécessite un minimum de travail. Il faut d'abord parvenir à faire communiquer un ESP32 avec un réseau CAN. Emetteur-récepteur Texas Instrument SN65HVD230 - le contrôleur CAN est déjà intégré à l'ESP32.·le 03 nov. 12:14
11h10h

Hello,
Voici un exemple qui est sur le github de Timo Lappalainen.
C'est l'exemple le plus simple que je connaisse.
github.com[...]tor.ino
Les lignes "fondamentales" sont :
-82 à 84 : récup de l'angle du vent
-87 à 89 : récup de la vitesse du vent
-97 fabrication du message NMEA2000
-98 envoi sur le réseau du message

Les processus de récup te seront propres et dépendent d'où tu obiens les données qui à ce stade sont numériques et plus analogiques , d'où mes questions.

Et voici le sketch commenté:
/**********************************************************************//*
\file WindMonitor.ino
\brief NMEA2000 library example. Send main wind data to the bus.
\ingroup group_examples

This simple example sends hardcoded wind angle and speed information
to the NMEA2000 bus. To make it working device you need add functionality, which
reads real values.

Example does not fullfill all NMEA2000 requirements.
*/

include // Inclut la bibliothèque de base Arduino pour les fonctions core

//#define N2kSPICSPIN 53 // Si vous utilisez mcpcan et que la broche CS n'est pas 53, décommentez et modifiez
//#define N2kCANINTPIN 21 // Si vous utilisez mcpcan et que la broche d'interruption n'est pas 21, décommentez et modifiez
//#define USEMCPCANCLOCKSET 8 // Si vous utilisez mcpcan avec un cristal 8MHz, décommentez
//#define ESP32
CANTXPIN GPIONUM16 // Pour ESP32 si TX n'est pas sur GPIO 16, décommentez et modifiez
//#define ESP32CANRXPIN GPIONUM17 // Pour ESP32 si RX n'est pas sur GPIO 4, décommentez et modifiez
//#define NMEA2000
ARDUINODUECANBUS tNMEA2000due::CANDevice1 // Pour Arduino DUE utilisant le bus CAN 1 au lieu de 0
//#define NMEA2000TEENSYCAN_BUS 1 // Pour Teensy 3.5/3.6 utilisant le deuxième bus CAN

include // Inclut la bibliothèque NMEA2000 CAN qui sélectionne automatiquement la bonne librairie CAN

include // Inclut les définitions des messages NMEA2000

// Liste des messages PGN que cet appareil va transmettre sur le bus NMEA2000
const unsigned long TransmitMessages[] PROGMEM={130306L,0}; // PGN 130306 = Wind Data, 0 = fin de liste

// Définit un planificateur pour les messages wind. Initialement désactivé, sera activé lors de l'ouverture CAN
// Utilise un planificateur séparé pour chaque message pour avoir des offsets et périodes différents
tN2kSyncScheduler WindScheduler(false,100,500); // désactivé, offset=100ms, période=500ms

// *****************************************************************************
// Fonction callback appelée quand la communication CAN démarre
void OnN2kOpen() {
// Démarre les planificateurs maintenant que le bus est ouvert
WindScheduler.UpdateNextTime(); // Met à jour le temps pour le premier envoi
}

void setup() {
// Définit les informations sur le produit pour l'identification NMEA2000
NMEA2000.SetProductInformation("00000002", // Code série du modèle du fabricant
100, // Code produit du fabricant
"Simple wind monitor", // ID du modèle du fabricant
"1.2.0.24 (2022-10-01)", // Version logicielle du fabricant
"1.2.0.0 (2022-10-01)" // Version du modèle du fabricant
);
// Définit les informations de l'appareil pour l'adressage NMEA2000
NMEA2000.SetDeviceInformation(1, // Numéro unique (ex: numéro de série)
130, // Fonction de l'appareil = Atmospheric
85, // Classe de l'appareil = External Environment
2046 // Code fabricant choisi librement dans la liste NMEA
);
// Décommentez les 2 lignes ci-dessous pour déboguer et voir ce qui est envoyé sur le bus
//Serial.begin(115200); // Initialise la communication série pour le monitoring
//NMEA2000.SetForwardStream(&Serial); // Redirige le trafic NMEA2000 vers le port série
// Si vous voulez utiliser un moniteur ASCII simple comme le Serial Monitor Arduino, décommentez
//NMEA2000.SetForwardType(tNMEA2000::fwdt_Text); // Format texte clair au lieu du format Actisense par défaut

// Configure le mode de fonctionnement : N2kmNodeOnly = nœud seul, 23 = priorité
// Utilisez N2km
ListenAndNode pour voir aussi tout le trafic du bus
NMEA2000.SetMode(tNMEA2000::N2kmNodeOnly,23);
// NMEA2000.SetDebugMode(tNMEA2000::dm
Actisense); // Décommentez pour tester sans chips CAN bus sur Arduino Mega
NMEA2000.EnableForward(false); // Désactive le forwarding des messages (debug)
// Déclare à la librairie quels PGNs cet appareil transmet
NMEA2000.ExtendTransmitMessages(TransmitMessages);
// Définit la fonction callback à appeler quand le CAN s'ouvre
NMEA2000.SetOnOpen(OnN2kOpen);
NMEA2000.Open(); // Ouvre la communication CAN et démarre le processus de claim d'adresse
}

// *****************************************************************************
void loop() {
SendN2kWind(); // Appelle la fonction d'envoi des données wind
NMEA2000.ParseMessages(); // Traite les messages entrants du bus NMEA2000
}

// *****************************************************************************
// Fonction simulée pour lire l'angle du vent - à remplacer par du code de lecture réel
double ReadWindAngle() {
return DegToRad(50); // Retourne un angle simulé de 50 degrés converti en radians
}

// *****************************************************************************
// Fonction simulée pour lire la vitesse du vent - à remplacer par du code de lecture réel
double ReadWindSpeed() {
return 10.3; // Retourne une vitesse simulée de 10.3 nœuds
}

// *****************************************************************************
// Fonction principale pour envoyer les données wind sur le bus NMEA2000
void SendN2kWind() {
tN2kMsg N2kMsg; // Crée un objet message NMEA2000

// Vérifie si le planificateur indique qu'il est temps d'envoyer le message
if ( WindScheduler.IsTime() ) {
WindScheduler.UpdateNextTime(); // Met à jour le prochain temps d'envoi
// Construit le message NMEA2000 avec les données wind
SetN2kWindSpeed(N2kMsg, 1, ReadWindSpeed(), ReadWindAngle(), N2kWind_Apprent);
NMEA2000.SendMsg(N2kMsg); // Envoie le message sur le bus CAN
}
}

Si ton appli fabrique et envoie sur le réseau tes propres PGN tu auras besoin de paramétre correctement au moins les lignes 53 et 54, pour cela voir le PDF joint.
Amicalement.
FX



Merci.

Je rgarde cela.
J'avais déja essayé d'autre exemple, mais je me perdais dans les includes.....

Je m'y prenais mal sans doute.

J'essaye.

Michel


BonjourFXVT,

Bon voila, j'ai télécharger tous les fichiers du le dossier "github.com[...]ter/src ,
J'ai télécharger le fichier WindMonitor.ino
Copier tous les *.h dans le dossier ../projet/Esp32/include.
tous les fichiers *.cpp dans le dossier ../projet/Esp32/src,
Mais à la compilation

```

42 | #include "NMEA2000.h"
| ^~~~~~~~~~~~
compilation terminated.
Compiling .pio/build/esp32dev/src/N2kGroupFunction.cpp.o
*** [.pio/build/esp32dev/lib322/NMEA2000esp32/NMEA2000esp32.cpp.o] Error 1
=============================================================================== [FAILED] Took 5.31 seconds ===============================================================================

  • The terminal process "platformio 'run'" terminated with exit code: 1.
  • Terminal will be reused by tasks, press any key to close it. code text here ```

Je fais une gaffe, mais ou ?

Car le fichier NMEA200.h, ainsi que le fichier ?MEA200.cpp sont bien présents
Je lance la compilation avec Visual code studio.


fxvt:Hello,
J'utilise l'ancienne IDE Arduino, pas PlateformeIO ni VS donc ma réponse peut être un peu à coté de la plaque. Dans mon environnement, le répertoire ..\libraries\NMEA2000\src\ contient tous les .h et .cpp, c'est à dire tout le SRC du Github.
Pour débugguer, tu peux te faire aussi aider par Anthropic / Claude Sonnet 4.5 . De toutes les AI que j'ai essayé c'est encore celle qui code le mieux. Pas d'erreur de syntaxe ni de logique, bonne logique et suit les consignes. Soumets lui ton code et les messages d'erreur de compil. Comme à chaque fois attention au prompt, bien lui donner le contexte (ESP32, C++, NMEA2000, PlarformIO, ...)Amicalement.
FX·le 03 nov. 16:51
Plymouth

Phare du monde

  • 4.5 (151)

Plymouth

2022