Communication RS485 en Modbus RTU

Bonjour à tous,

Je rencontre un soucis. J'ai un compresseur d'air sur lequel je souhaite brancher un module RS485 pour qu'il communique avec mon Arduino.

Je suis avec un Arduino UNO et j'ai un Module RS485 Grove. De plus je n'ai pas le module Grove je souhaite le brancher directement sur l'Arduino avec RX / TX / VCC / GND. Pour le câblage coté compresseur simple j'ai les entrées A / B / GND.

Le fabricant de mon compresseur m'a fourni le plan de câblage (ALMiG - Belt 4-37 ACB-P V2013.pdf (101.1 KB)) ainsi que les adresses utilisables en Modbus RTU (ALMiG Modbus - Adresse RS485.pdf (952.8 KB)).

Comment puis-je faire pour aller récupérer par exemple la pression du compresseur qui est page 6 avec les infos suivantes :

  • Registre : 40033
  • Adresse : 0020h
  • Contenu : Pression du réseau (Netzdruck)
  • Données : unsigned [0.001 bar]

Merci de votre aide !!

Salut, j'ai utilisé avec succès lib. ModbusMaster.h (dans d'autres appareils..).

Salut,

Merci de ton retour.

Est-ce que tu avais le même modèle que moi branché en direct sur l'arduino ?

Quel est ton câblage ?

Peux tu me fournir ton code en modèle ?

Merci beaucoup !

Thibaut

Bonjour; salut,
J'ai utilisé un max485 comme interface.

Votre module a 3 ports pour la liaison RS485 (A, B, GND) à connecter avec votre compresseur sur les fils adéquats.

Il a aussi 4 ports pour communiquer avec votre Arduino:

Ce n'est pas grave si vous n'avez pas de câble adapté pour les modules Grove, vous pouvez utiliser des fils Dupont mâle-femelle et les enficher sur les picots dans le module Grove et dans le header femelle de votre arduino.

Avec votre arduino débranché:

Branchez Vcc sur 5V de votre Arduino Uno, le GND au GND

Pour Rx et Tx, si vous souhaitez pouvoir débuguer, il faudra passer par SoftwareSerial et créer un second port. Utilisez par exemple les pins 2 et 3 de votre Arduino pour cela.

SoftwareSerial moduleRS485(2,3); // 2 pour Tx et 3 pour Rx sur l'arduino

La doc que vous référencez pour votre module mentionne :

Remarque: le RX et le TX sont inversés dans la fiche technique du fabricant.

donc je ne sais pas trop ce que ça veut dire...

Par défaut je serai tenté de connecter la pin 2 (Rx) à la pin Tx du module Grove et la pin 3 (Tx) à la pin Rx du module. Mais peut-être c'est l'inverse...

Si vous prenez GitHub - 4-20ma/ModbusMaster: Enlighten your Arduino to be a Modbus master (semble assez vieille avec de nombreuses Issues ouvertes sans réponse) l'initialisation devrait se faire avec quelque chose comme cela:

#include <SoftwareSerial.h>
#include <ModbusMaster.h>
ModbusMaster node;
SoftwareSerial moduleRS485(2,3); // 2 pour Tx et 3 pour Rx sur l'arduino

void setup() {
  Serial.begin(115200);
  moduleRS485.begin(19200); // à définir. Souvent 9600 ou 19200 
  node.begin(2, moduleRS485); // 2 pour le slave ID, à vérifier
}

Ensuite il faut regarder la bibliothèque (que je ne connais pas) pour voir comment envoyer un requête et recevoir la réponse. Il y a des exemples.

.. désolé pour mon google translate français ....
il s'agit d'un exemple de code de base que vous pouvez utiliser pour lire les "Holding Registers" correspondant à la commande 0x03.
Les broches utilisées sont 4,5,6,7.
Le 7 et le 4 pour le software.serial, le 5 et le 6 pour les broches de validation.
En cas d'erreur, recherchez les codes dans le fichier ModbusMaster.h.

#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#define MAX485_DE      5
#define MAX485_RE_NEG  6

ModbusMaster node;

SoftwareSerial mySerial(7, 4); // RX, TX
unsigned int reg = 0;
int dati[2];
uint8_t result;

void setup() {

  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
  Serial.begin(9600);
  mySerial.begin(19200);
  node.begin(1, mySerial);
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  delay(2000);
  
}
bool state = true;
void loop() {
  
  result = node.readHoldingRegisters(reg, 1);
  
  delay(1000);


  if (result == node.ku8MBSuccess) {
    Serial.print("Address:");
    Serial.print(reg);
    Serial.print(' ');
    Serial.println("ok");
    dati[0] = node.getResponseBuffer(0);
    Serial.print("Value:");
    Serial.println(dati[0]);
    
  }
 
 else {
  Serial.print("Error code:");
  Serial.println(result);
  
  }

  reg = reg + 1;
}
void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

Bonjour @diegob81 et @J-M-L,

Tout d'abord, meilleurs voeux pour cette nouvelle année !!

Je suis désolé je n'avais pas vu vos réponses. Je vais les explorer et je vous tiendrai au courant de ce que ça donne.

Merci beaucoup !!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.