- Communication série RS-485
- Connexion RS-485 avec Arduino
- Module de conversion USB vers RS-485
- Logiciel Simply Modbus Master
- Outils nécessaires
- Schéma
- Programmation Arduino UNO pour esclave MODBUS RS-485
- Test de l'Arduino UNO en tant qu'esclave Modbus Rs485
Modbus est un protocole de communication série qui a été découvert par Modicon en 1979 et il est utilisé pour transmettre des données sur des lignes série entre les appareils électroniques industriels. RS-485 Modbus utilise RS-485 pour les lignes de transmission. Il est à noter que Modbus est un protocole logiciel et non un protocole matériel. Il est divisé en deux parties telles que le maître Modbus et l'esclave Modbus. Dans le réseau Modbus RS-485, il y a un maître et 127 esclaves chacun avec une adresse unique de 1 à 127. Dans ce projet MAX485 Arduino, nous utiliserons Arduino Uno comme esclave pour la communication série.
Modbus sont principalement utilisés dans les automates programmables (automates programmables). Et en dehors de cela, le Modbus est également utilisé dans les soins de santé, les transports, la domotique, etc. Modbus a 255 codes de fonction et il existe principalement trois versions populaires de Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Quelle est la différence entre Modbus ASCII et Modbus RTU?
Modbus RTU et Modbus ASCII utilisent le même protocole. La seule différence est que les octets transmis sur le fil sont présentés en binaire avec RTU et en ASCII lisible avec Modbus RTU. Modbus RTU sera utilisé dans ce didacticiel.
Ce tutoriel concerne l'utilisation de la communication Modbus RS-485 avec Arduino UNO en tant qu'esclave. Ici, nous installons le logiciel Simply Modbus Master dans le PC et contrôlons deux LED et un servomoteur en utilisant RS-485 comme ligne de transmission. Ces LED et servomoteurs sont connectés à Slave Arduino et contrôlés en envoyant des valeurs à l'aide du logiciel Master Modbus. Étant donné que ce tutoriel utilise RS-485, il est recommandé de passer d'abord par la communication série RS485 entre Arduino Uno et Arduino Nano. RS485 peut également être utilisé avec d'autres contrôleurs pour la communication série:
- Communication série RS-485 entre Raspberry Pi et Arduino UNO
- Communication série entre STM32F103C8 et Arduino UNO via RS-485
Commençons par explorer quelques informations générales sur le RS-485 et Modbus. En savoir plus sur les différents protocoles de communication série ici.
Communication série RS-485
RS-485 est un protocole de communication série asynchrone qui ne nécessite pas d'horloge. Il utilise une technique appelée signal différentiel pour transférer des données binaires d'un appareil à un autre.
Alors, quelle est cette méthode de transfert de signal différentiel ??
La méthode du signal différentiel fonctionne en créant une tension différentielle en utilisant un 5V positif et négatif. Il fournit une communication semi-duplex lors de l'utilisation de deux fils et le duplex intégral nécessite 4 quatre fils.
En utilisant cette méthode:
- RS-485 prend en charge un taux de transfert de données plus élevé de 30 Mbps maximum.
- Il fournit également une distance de transfert de données maximale par rapport au protocole RS-232. Il transfère des données jusqu'à 1200 mètres maximum.
- Le principal avantage de RS-485 par rapport à RS-232 est l'esclave multiple avec un seul maître tandis que RS-232 ne prend en charge qu'un seul esclave.
- Peut avoir un maximum de 32 appareils connectés au protocole RS-485.
- Un autre avantage du RS-485 est l'immunité au bruit car ils utilisent la méthode du signal différentiel pour le transfert.
- RS-485 est plus rapide que le protocole I2C.
Connexion RS-485 avec Arduino
Le module RS-485 peut être connecté à n'importe quel microcontrôleur ayant un port série. Pour utiliser le module RS-485 avec des microcontrôleurs, un module appelé 5V MAX485 TTL à RS485 qui est basé sur Maxim MAX485 IC est nécessaire car il permet une communication série sur une longue distance de 1200 mètres. Il est bidirectionnel et semi-duplex et a un taux de transfert de données de 2,5 Mbps. Ce module nécessite une tension de 5V.
Brochage du RS-485:
Nom de la broche |
Description des broches |
VCC |
5V |
UNE |
Entrée de récepteur non inverseuse Sortie pilote non inverseuse |
B |
Inverser l'entrée du récepteur Inverser la sortie du pilote |
GND |
GND (0 V) |
R0 |
Sortie récepteur (broche RX) |
RÉ |
Sortie récepteur (LOW-Enable) |
DE |
Sortie pilote (HIGH-Enable) |
DI |
Entrée du pilote (broche TX) |
Module de conversion USB vers RS-485
Il s'agit d'un module adaptateur convertisseur USB vers RS485 qui prend en charge WIN7, XP, Vista, Linux, Mac OS et fournit une interface RS485 facile à utiliser au moyen de l'utilisation du port COM de l'ordinateur . Ce module est un appareil plug-and-play . Il n'y a pas de structure de commande, tout ce qui est envoyé au port COM virtuel est automatiquement converti en RS485 et vice versa. Le module est entièrement auto-alimenté par le bus USB. Donc, pas besoin d'alimentation externe pour le fonctionnement.
Il apparaît comme un port série / COM et est accessible depuis les applications ou l'hyper-terminal. Ce convertisseur fournit une communication RS-485 semi-duplex. La plage de débit en bauds va de 75 bps à 115200 bps, maximum jusqu'à 6 Mbps.
Pour utiliser cet appareil, différents logiciels Modbus sont disponibles sur Internet. Dans ce tutoriel, un logiciel appelé Simply Modbus Software est utilisé.
Logiciel Simply Modbus Master
L'application du logiciel maître Modbus est nécessaire pour envoyer des données au périphérique Arduino Modbus RS-485 esclave via COM.
Simply Modbus Master est un logiciel de test de communication de données. Vous pouvez télécharger le Simply Modbus Master à partir du lien indiqué et en savoir plus à ce sujet en vous référant au manuel du logiciel.
Avant d'utiliser le logiciel, il est important de se familiariser avec les terminologies suivantes.
ID esclave:
Chaque esclave d'un réseau se voit attribuer une adresse d'unité unique de 1 à 127. Lorsque le maître demande des données, le premier octet qu'il envoie est l'adresse de l'esclave. De cette façon, chaque esclave sait après le premier octet s'il doit ignorer ou non le message.
Code de fonction:
Le deuxième octet envoyé par le maître est le code de fonction. Ce nombre indique à l'esclave à quelle table accéder et s'il doit lire ou écrire dans la table.
Codes de fonction de registre pris en charge:
Code de fonction |
action |
Nom de la table |
04 (04 hexadécimal) |
Lis |
Registres d'entrée analogique |
03 (03 hexadécimal) |
Lis |
Registres de maintien de sortie analogique |
06 (06 hexadécimal) |
Ecrire seul |
Registre de maintien de sortie analogique |
16 (10 hex) |
Ecrire plusieurs |
Registres de maintien de sortie analogique |
Codes de fonction de bobine pris en charge:
Code de fonction |
action |
Nom de la table |
02 (02 hexadécimal) |
Lis |
Contacts d'entrée discrets |
01 (01 hex) |
Lis |
Bobines de sortie discrètes |
05 (05 hexadécimal) |
Ecrire seul |
Bobine de sortie discrète |
15 (hexadécimal 0F) |
Ecrire plusieurs |
Bobines de sortie discrètes |
CRC:
CRC signifie contrôle de redondance cyclique. Il s'agit de deux octets ajoutés à la fin de chaque message Modbus pour la détection d'erreur.
Outils nécessaires
Matériel
- Arduino UNO
- Module de conversion MAX-485 TTL vers RS-485
- Module de conversion USB vers RS-485
- À LED (2)
- Résistance 1k (2)
- Écran LCD 16x2
- Potentiomètre 10k
- Servomoteur SG-90
Logiciel
- Maître simplement Modbus
Schéma
Connexion de circuit entre le module convertisseur MAX-485 TTL vers RS-485 et Arduino UNO:
Arduino UNO |
Module de conversion MAX-485 TTL vers RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Connexion du circuit entre le module MAX-485 TTL vers RS-485 et le convertisseur USB vers RS-485:
MAX-485 TTL à RS-485 Module convertisseur |
Module USB vers RS-485 Connecté avec un PC |
UNE |
UNE |
B |
B |
Connexions du circuit entre Arduino UNO et écran LCD 16x2:
Écran LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Pour contrôler la broche du potentiomètre pour le contrôle du contraste / de la luminosité de l'écran LCD 16x2 |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
dix |
D5 |
11 |
D6 |
12 |
D7 |
13 |
UNE |
+ 5V |
K |
GND |
Connexion du circuit entre 2 LED, servomoteur et Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servomoteur |
2 |
Anode à travers 1k résistance |
- |
- |
5 |
- |
Anode à travers 1k résistance |
- |
6 |
- |
- |
Broche PWM (orange) |
+ 5V |
- |
- |
+ 5V (ROUGE) |
GND |
Cathode GND |
Cathode GND |
GND (marron) |
Programmation Arduino UNO pour esclave MODBUS RS-485
L'Arduino UNO est configuré comme esclave Modbus. En outre, Arduino UNO est attaché avec deux LED et un servomoteur. Ainsi, l'Arduino esclave est contrôlé à partir du logiciel Master Modbus. La communication entre l'Arduino UNO et le logiciel maître Modbus est réalisée à l'aide du module RS-485. Pour le connecter au PC, le module de conversion USB vers RS-485 est utilisé. Et l'Arduino UNO avec le module de conversion MAX-485 TTL vers RS-485, l'ensemble de la configuration ressemblera au fichier suivant:
Pour utiliser Modbus dans Arduino UNO, une bibliothèque
Au départ, incluez la bibliothèque requise. La bibliothèque ModbusRTU sert à utiliser la communication Modbus RS-485, et la bibliothèque à cristaux liquides sert à utiliser LCD avec Arduino UNO, et la bibliothèque servo sert à utiliser un servomoteur avec Arduino UNO.
#comprendre
Désormais, les broches d'anode LED connectées aux broches Arduino 2 et 5 sont définies comme LED1 et LED2.
#define led1 2 #define led2 5
Ensuite, l'objet pour accéder à la classe Liquid Crystal est déclaré avec les broches LCD (RS, E, D4, D5, D6, D7) qui sont connectées à Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
Lorsque l'écran LCD est terminé, initialisez l'objet servo pour la classe Servo. Initialisez également l'objet bus pour la classe Modbus.
Servo servo; Bus Modbus;
Ensuite, pour stocker les valeurs pour la communication Modbus, un tableau est déclaré avec les trois valeurs initialisées à zéro.
uint16_t modbus_array = {0,0,0};
Dans la fonction de configuration , l'écran LCD est d'abord réglé en mode 16x2 et un message de bienvenue est affiché et effacé.
lcd.begin (16,2); // Lcd réglé en mode 16x2 lcd.print ("RS-485 Modbus"); // Message de bienvenue lcd.setCursor (0,1); lcd.print ("Arduino Slave"); retard (5000); lcd.clear ();
Après cela, les broches LED1 et LED2 sont définies comme broches de sortie.
pinMode (led1, SORTIE); pinMode (led2, SORTIE);
La broche d'impulsion servo connectée à la broche PWM 6 d'Arduino est attachée.
servo.attach (6);
Les paramètres suivants sont maintenant définis pour la communication Modbus. Le premier «1» représente l'ID de l'esclave, le deuxième «1» indique qu'il utilise RS-485 pour transférer des données et «4» représente la broche RS-485 DE&RE connectée à Arduino UNO.
bus = Modbus (1,1,4);
L'esclave Modbus est réglé sur 9600 bauds.
La boucle commence par la définition du bus poll et bus.poll () est utilisé pour écrire et recevoir la valeur du Modbus maître.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Cette méthode est utilisée pour vérifier si des données sont disponibles sur le port série.
Si des données sont disponibles sur le port série, la bibliothèque Modbus RTU vérifiera le message (vérifier l'adresse de l'appareil, la longueur des données et le CRC) et exécutera l'action requise.
Par exemple, pour écrire ou lire une valeur du maître, le ModbusRTU doit recevoir un tableau d'entiers 16 bits non signé et sa longueur du Modbus maître. Ce tableau transporte les données écrites à partir du maître.
Dans ce didacticiel, il y a trois tableaux pour LED1, LED2 et l'angle du servomoteur.
Tout d'abord pour allumer ou éteindre, la LED1 modbus_array est utilisée.
if (modbus_array == 0) // Dépend de la valeur dans modubus_array écrite par le maître Modbus { digitalWrite (led1, LOW); // LED éteinte si 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED allumée si valeur différente de 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
À côté de l' activation ou de la désactivation, la LED2 modbus_array est utilisée.
if (modbus_array == 0) // Dépend de la valeur dans modbus_array écrite par le maître Modbus { digitalWrite (led2, LOW); // LED éteinte si 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED allumée si valeur différente de 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Ensuite, pour définir l'angle du servomoteur, le modbus_array utilisé et la valeur sont imprimés sur l'écran LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Angle servo:"); lcd.print (pwm); retard (200); lcd.clear ();
Ceci termine la programmation d'Arduino UNO pour le faire fonctionner comme esclave MODBUS. La prochaine étape consistera à le tester en tant qu'esclave Modbus.
Test de l'Arduino UNO en tant qu'esclave Modbus Rs485
Une fois les connexions du circuit terminées et le code téléchargé sur l'Arduino UNO, il est temps de connecter le module USB vers RS-485 avec le PC sur lequel le logiciel Simple Modbus Master est installé.
Ouvrez le gestionnaire de périphériques et vérifiez le port COM en fonction de votre PC où le module USB vers RS-485 est connecté, puis ouvrez le logiciel Simply Modbus Master 8.1.1.
1. Une fois le logiciel Simply Modbus ouvert, ouvrez maintenant l'option Ecrire.
2. Après l' ouverture de Simply Modbus Master Write. Réglez les paramètres
Mode en RTU, port COM en fonction de votre PC (le mien était COM6), Baud à 9600, Bits de données 8, Bit d'arrêt 1, Parité Aucune et ID esclave comme 1.
3. Après cela, définissez le premier registre comme 40001 et les valeurs à écrire sont 3 et le code de fonction comme 16 (Write Holding Register).
Ensuite, écrivez 1 à 40001 (pour LED1 allumée) et 1 à 40002 (pour LED2 allumée) et 90 à 40003 (pour l'angle de servomoteur), puis cliquez sur le bouton ENVOYER.
Vous pouvez voir que l'état de la LED est allumé et l'angle d'asservissement à 90 degrés.
4. Ensuite, entrez 40001 comme 1 et 40002 comme 0 et 40003 comme 180 et cliquez sur le bouton ENVOYER.
5. Maintenant, écrivez 135 à 40003 et 40001 comme 0 et 40002 comme 1.
C'est ainsi que RS-485 Modbus peut être utilisé en communication série avec Arduino UNO en tant qu'esclave. Dans le prochain tutoriel, nous utiliserons l'Arduino Uno comme maître dans la communication MODBUS.
Trouvez le code complet et une vidéo de démonstration ci-dessous.