Le matériel utilisé pour ce premier test en liaison Modbus IP est le suivant :
1 carte Arduino UNO
1 carte Arduino Ethernet Shield 2 pour relier l’UNO à votre réseau.
1 capteur de température LM35 (parce qu’il faut bien mesurer quelque chose !). Il sera alimenté en 5 volts et sa sortie sera connectée à A0 (entrée analogique).
1 LED et sa résistance de 330 Ω dans notre cas (parce qu’allumer ou éteindre une LED à distance ça en jette non ?). Elle sera connectée à la broche d’entrée/sortie numérique 2.
Cela donne donc le schéma suivant (réalisé avec fritzing) :

L’ensemble sur une breadboard, un câble RJ45 pour relier le montage à votre réseau, une alimentation externe pour la carte UNO et voila le résultat !

Coté code à téléverser vers la carte, il s’agit d’un mix de deux exemples accompagnant la bibliothèque modbus utilisée dans ce test : modbus-arduino réalisée par André Sarmento Barbosa et disponible à : http://github.com/andresarmento/modbus-arduino .
Si j’utilise cette bibliothèque c’est qu’elle me parait être la mieux documentée des nombreux projet censés faire communiquer votre arduino en modbus ! Deuxième avantage, c’est la seule que j’ai réussi à faire tourner correctement (mais je débute !).
Une chose importante avant de voir le code ! Si comme moi vous utilisez une carte ethernet shield version 2 il faudra importer la bonne librairie ethernet (dispo à https://github.com/adafruit/Ethernet2 ) . Pensez également à modifier le fichier ModbusIP.h en remplaçant le #include <Ethernet.h> par un #include <Ethernet2.h>.
/*
TempSensor et LED en Modbus IP
basé sur un code Copyright by André Sarmento Barbosa
http://github.com/andresarmento/modbus-arduino
Modifié par BLB 04/2017
*/
#include <SPI.h>
#include <Ethernet2.h>
#include <Modbus.h>
#include <ModbusIP.h>
//Modbus Registers Offsets (0-9999)
const int SENSOR_IREG = 100; // 100 et 101
const int LAMP_COIL1 = 102;
//Used Pins
const int sensorPin = A0;
const int ledPin1 = 2;
//ModbusIP object
ModbusIP mb;
void setup() {
// The media access control (ethernet hardware) address for the shield
byte mac[] = { 0x90, 0xA2, 0xDA, 0x11, 0x0C, 0x2E };
// The IP address for the shield
byte ip[] = { 10, 0, 0, 15 };
//Config Modbus IP
mb.config(mac, ip);
// Set ledPin mode
pinMode(ledPin1, OUTPUT);
// Add SENSOR_IREG register - Use addIreg() for analog Inputs
mb.addIreg(SENSOR_IREG);
// Add LAMP_COIL register - Use addCoil() for digital outputs
mb.addCoil(LAMP_COIL1);
}
void loop() {
//Call once inside loop() - all magic here
mb.task();
//Setting raw value (0-1024)
mb.Ireg(SENSOR_IREG, analogRead(sensorPin));
// Attach ledPin to LAMP_COIL register
digitalWrite(ledPin1, mb.Coil(LAMP_COIL1));
}
Quelques infos :
Dans le code, pensez à modifier la ligne contenant l’adresse MAC (l’identifiant unique de votre shield ethernet). Cette adresse est disponible sur l’étiquette collée au dos de la carte (pensez à relever le contenu avant de mettre la carte en place…). Exemple, si l’étiquette indique 90-A2-DA-11-OC-1B la ligne de code est :
byte mac[] = { 0x90, 0xA2, 0xDA, 0x11, 0x0C, 0x1B };
L’adresse IP contenu dans la ligne byte ip[] = { 10, 0, 0, 15 }; reste à votre convenance. Elle sera réutilisée dans ScadaBR pour communiquer avec votre carte et nous verrons cela dans le prochain article.

Une réflexion au sujet de « 1er Test en modbus IP : du coté Arduino »