[RESOLU] Modbus RS485 sur Arduino

Partie du forum pour tout ce qui concerne la partie électronique. Forum, conseil, astuce et entraide sur le dépannage de carte électronique ou divers conseils .
Avatar de l’utilisateur
steph31
Forcené des structures
Forcené des structures
Messages : 177
Inscription : 20 oct. 2015, 19:17
Localisation : Toulouse

[RESOLU] Modbus RS485 sur Arduino

Message par steph31 »

Bonsoir

C'est mon 1er projet sur arduino. Habituellement je programme mes microcontrôleur en assembleur. je me lance dan le langage C.
J'ai fait un projet d'un coupleur de batteries pour camping car avec un LCD déporté en I2C.
Un double relais a seuil avec affichage des tension et de l'etat des 2 sorties relais.

Maintenant j'ai introduit une communication Modbus slave sur mon arduino afin de récupéré les 2 tensions et l'etat de mes relais.

la communication fonctionne (je scanne avec Tabdia32) mes mon problème , j'obtient ZERO pour mes 2 valeurs analogique ???? alors que je les lit sur le LCD.

Pour faire mon code , je me suis inspiré de tutos trouver sur le net.

Code : Tout sélectionner

#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>

modbusDevice regBank;
modbusSlave slave;

#define RS485TxEnablePin 2
#define RS485Baud 9600
#define RS485Format SERIAL_8E1

#define LED1 11
#define LED2 12

// Entrées Analogiques physiques
const int Ain0 = A0;     // Broche entrée 0-5V Voie 0
const int Ain1 = A1;     // Broche entrée 0-5V Voie 1
const int Ain2 = A2;     // Broche entrée 0-5V Voie 2
const int Ain3 = A3;     // Broche entrée 0-5V Voie 3
// Sorties TOR physiques
const int Couplage = 3;  // Sortie relai couplage pin 3
const int Batt_Low = 4;  // Sortie batterie faible pin 4

// Variable de stokage de la valeur
int Voie0 = 0;
int Voie1 = 0;
int Voie2 = 0;
int Voie3 = 0;

word batt_V = 0;      // Tension Batterie Vehicule en Mv
word batt_A = 0;      // Tension Batterie Auxilliaire en Mv
float U_batt_V = 0;   // Tension Batterie Vehicule
float U_batt_A = 0;   // Tension Batterie Auxilliaire

// LCD I2C
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>


#define I2C_ADDR    0x27 // <<----- Add your address here.  Find it from I2C Scanner
#define BACKLIGHT_PIN 3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

//LiquidCrystal_I2C  lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address


void setup()
{
  pinMode(Couplage, OUTPUT);    // Pin en mode Sortie
  pinMode(Batt_Low, OUTPUT);    // Pin en mode Sortie
  lcd.begin (16,2); //  <<----- My LCD was 16x2
 lcd.home (); // go home
 
 //Assign the modbus device ID.  
  regBank.setId(1);

//Add Analog Input registers to the register bank
  regBank.add(30001);  
  regBank.add(30002);  
 

//Add Analog Output registers to the register bank
  regBank.add(40001);  
  regBank.add(40002);


  slave._device = &regBank;  

  slave.setBaud(&Serial,RS485Baud,RS485Format,RS485TxEnablePin);   
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);   
}
void loop()
{
  {
  digitalWrite(LED1, regBank.get(40001));
  digitalWrite(LED2, regBank.get(40002));
  Voie0 = analogRead(Ain0);
  batt_V = (Voie0 * 1500) / 1024;
  regBank.set(30001, (word) batt_V);
  //regBank.set(30001, (word) analogRead(A0)); //from 0 - 1023
  
  Voie1 = analogRead(Ain1);
  batt_A = (Voie1 * 1500) / 1024;
  regBank.set(30002, (word) batt_A);
  //regBank.set(30002, (word) analogRead(A1)); //from 0 - 1023
  
  slave.run();  
  }
  
 // Tension Batterie Véhicule
 {
 U_batt_V = (Voie0 * 15.0) / 1024.0;

        if(U_batt_V > 13.5)
        {
        digitalWrite(Couplage, HIGH);
        lcd.setCursor(13, 0);
        lcd.print("ON ");
        }
        else if(U_batt_V < 12.5)
             {
             digitalWrite(Couplage, LOW);
             lcd.setCursor(13, 0);
             lcd.print("OFF");
             }
             else
 delay(500);
 }
 // Tension Batterie Auxilliaire      
 {
 U_batt_A = (Voie1 * 15.0) / 1024.0;
   
        if(U_batt_A > 12.5)
        {
        digitalWrite(Batt_Low, HIGH);
        lcd.setCursor(13, 1);
        lcd.print("ON ");
        }
        else if(U_batt_A < 10.5)
             {
             digitalWrite(Batt_Low, LOW);
             lcd.setCursor(13, 1);
             lcd.print("OFF");
             }
             else
        delay(500);
 }   
        // Affiche Sur Le LCD
        {
        lcd.setCursor(0, 0);
        lcd.print("BATT V=");
        lcd.setCursor(7, 0);
        lcd.print(U_batt_V);
        lcd.setCursor(0, 1);
        lcd.print("BATT A=");
        lcd.setCursor(7, 1);
        lcd.print(U_batt_A);
        }       
}
@+
Steph
MiGaNuTs
Dieu du process
Dieu du process
Messages : 979
Inscription : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: Modbus RS485 sur Arduino

Message par MiGaNuTs »

Bonjour,

tu utilise quoi comme Arduino ? un uno, un mega ? c'est quoi le microcontrôleur sur ta carte ? t'as combien de ports série "physique" dessus ?
Parce que faire du modbus sur les modèles avec un seul port série c'est un peu compliqué pour le débug, vu que tu utilise les mêmes broches que le port usb (du coup pas de serial.print pour tester)

tu as essayé en RS 232 "simple", sans l'adaptateur RS485 pour valider le fonctionnement de ton soft ?

Tu as essayé ta librairie modbus "toute seule", pour voir si tu n'a pas d'incompatibilités avec les autres libs que tu utilise ?

Tu sait quels types de trames envoie ton soft de dialogue, et si elles sont supportée par ta lib ?
Avatar de l’utilisateur
steph31
Forcené des structures
Forcené des structures
Messages : 177
Inscription : 20 oct. 2015, 19:17
Localisation : Toulouse

Re: Modbus RS485 sur Arduino

Message par steph31 »

J'utilise un Arduino UNO. J'ai trouvé ce lien comme exemple.
http://program-plc.blogspot.fr/2015/11/ ... slave.html

Pour scanné les variable , j'utilise le soft Tabdial32 de Leroy automation. J' interroge les 2 1er mots.
Je n'ai pas d’erreur de trame, mais juste la valeurs des 2 mots a "0"

Je 'n'ai pas essayer la lib toute seule, mais je peux le faire.
Avatar de l’utilisateur
Bernardo59
Dieu du process
Dieu du process
Messages : 957
Inscription : 20 oct. 2015, 05:48
Localisation : Nimes

Re: Modbus RS485 sur Arduino

Message par Bernardo59 »

Bonjour,

Tu as quoi dans analogRead(Ain1) ?

Tu as une valeur ?
Avatar de l’utilisateur
steph31
Forcené des structures
Forcené des structures
Messages : 177
Inscription : 20 oct. 2015, 19:17
Localisation : Toulouse

Re: Modbus RS485 sur Arduino

Message par steph31 »

RESOLU

J'ai scanné avec ModScan32 et j'avait des valeus "bidon" voir en Négatif.
J'ai rectifié mon code et ca fonctionne.
Avatar de l’utilisateur
maxpeigne
Créateur de langage
Créateur de langage
Messages : 712
Inscription : 11 oct. 2015, 17:31
Localisation : Nord pas de calais

Re: Modbus RS485 sur Arduino

Message par maxpeigne »

Bonjour,

Je viens de regardé ton code car je vois de plus en plus de personne parlant de MODBUSsur arduino. Mais je me posais la question de l'interet de cela? Est ce pour raccorder l'arduino à un automate? (je ne connais pas grand chose en MODBUS :oops: )
http://automacile.fr - Site et tutoriels sur l'arduino.
MiGaNuTs
Dieu du process
Dieu du process
Messages : 979
Inscription : 12 nov. 2015, 21:02
Localisation : 45 - Loiret
Contact :

Re: [RESOLU] Modbus RS485 sur Arduino

Message par MiGaNuTs »

le modbus c'est un des protocoles de com' les plus simples, mais aussi le plus universel dans l'industrie.
Tous les automates savent causer en modbus (enfin chez schneider c'est un peu plus compliqué, pourtant c'est eux qui l'ont inventé ...), toutes les supervisions savent causer en modbus, tout un tas d'appareils en tout genre savent communiquer en modbus. Bref ca ouvre la porte a des tas de possibilités.
Avatar de l’utilisateur
JC87
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1901
Inscription : 20 oct. 2015, 13:00
Localisation : Nouvelle Aquitaine

Re: [RESOLU] Modbus RS485 sur Arduino

Message par JC87 »

MiGaNuTs a écrit :le modbus c'est un des protocoles de com' les plus simples, mais aussi le plus universel dans l'industrie.
Tous les automates savent causer en modbus (enfin chez schneider c'est un peu plus compliqué, pourtant c'est eux qui l'ont inventé ...), toutes les supervisions savent causer en modbus, tout un tas d'appareils en tout genre savent communiquer en modbus. Bref ca ouvre la porte a des tas de possibilités.
Pas tout a fait, en fait c'est Modicon l'inventeur du Modbus, et de l'automate programmable par ailleurs mais c'est il est tout a fait exact que c'est un protocole universel et encore très largement répandu.

JC
"On veut faire du zéro défaut mais on a zéro bonhomme et zéro budget, et bien à la fin on a zéro résultat..."
Avatar de l’utilisateur
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7035
Inscription : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: [RESOLU] Modbus RS485 sur Arduino

Message par itasoft »

slts,
disons que Telemecanique à inventé Unitelway qui est une copie du ModBus, lol
Automaticien privé (de tout)
itasoft@free.fr
Avatar de l’utilisateur
JC87
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 1901
Inscription : 20 oct. 2015, 13:00
Localisation : Nouvelle Aquitaine

Re: [RESOLU] Modbus RS485 sur Arduino

Message par JC87 »

Bonjour,

Comme tout les protocoles maitre/esclaves, Unitelway ressemble à Modbus, mais ceux qui l'on vraiment copié c'est April avec Jbus qui est quasiment une copie conforme a deux ou trois détails près. Bon c'est vrai que toutes ces marques appartiennent a Schneider maintenant.

JC
"On veut faire du zéro défaut mais on a zéro bonhomme et zéro budget, et bien à la fin on a zéro résultat..."
Répondre