1er Test en modbus IP : du coté Arduino

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) :

modbus ip-temp&led_bb

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 !

modbus_ip_1

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 »

Laisser un commentaire