programme simple pour connecter un arduino à raspberry pi en modbus

bonjour les amis j'ai besoin de votre aides j'aimerais avoir un code simple pour que je puisse connecter un arduino avec un raspberry pi ,arduino en mode esclave et raspberry pi le maître pour que je puisse récupéré les donnés .

Merci pour votre aide je suis nouveau dans le domaine

Le plus simple (en contradiction avec le titre) est d'utiliser l'USB serie (en plus, c'est portable .... sur PC) avec , sur RPi, pyserial....
Une autre solution simple (plus compliquée pour moi, mais hackable magazine l'utilisait ) est d'utiliser, à la place de python+ pyserial, processing (une version pour arm sous gnulinux est disponible en telechargement: j'ai joué avec les demos, mais préfère python)

Ces deux solutions simples ne font pas appel à modbus -d'où ma remarque sur l'incompatibilité avec le titre: avez vous pour objectif de rapatrier des données -et à quelle cadence? - ou de jouer avec modbus, mais à un port serie virtuel.... A noter que ni l'arduino, ni le RPi ne sont maîtres -ni esclaves- dans cette configuration (la jonction serie n'a pas besoin qu'un maître impose une cadence à un groupe d'esclaves). Peut être que cette configuration simpliste suffit (si vous n'avez qu'un type de donnée et qu'un "esclave", ce n'est pas absurde)

j’essai d’apprendre a manipuler le modbus , ce que je veux faire j’ai une sonde de température et d’humidité connecté a l’arduino et je veux transférer les donnés que j’ai obtenu a une carte raspberry pi ,voila le code que j’ai utilisé

#include<Wire.h>
#include<SHTSensor.h>
const byte NS= 7;
SHTSensor sht;
void setup() 
{
  Wire.begin();
  Serial.begin(115200);
  delay(1000);

 if (sht.init())
 {
  Serial.print("init(): success\n");
 }  else {
  Serial.print("init(): failed\n");
  }
 }

void loop() {
  if (sht.readSample()) 
  {
      Serial.print("SHT:\n");
      Serial.print(sht.getHumidity(),2);
      Serial.print("\n");
      Serial.print("  T:  ");
      Serial.print(sht.getTemperature(),2);
      Serial.print("\n");
      
}
else{
  Serial.print("Error in readsample()\n");
}
delay(1100);
}

Sous la raspberry, ce que ta carte émet peut être récupéré en lisant le fichier spécial /dev/ttyUSB0 (ou autre).

Si cela t'intéresse je poste mon code qui le fait (shell bash) et qui permet donc de placer les lignes en provenance de la carte dans un fichier sur la raspberry pi (mais rien à voir avec modbus).

Si tu n'aimes pas le shell tu dois pouvoir facilement trouver l'équivalent dans le langage de ton choix.

"Si tu n'aimes pas le shell tu dois pouvoir facilement trouver l'équivalent dans le langage de ton choix."

*python (installé sur RPi) + pyserial Welcome to pySerial’s documentation — pySerial 3.0 documentation. Ce dernier m'a donné toute satisfaction)

-(au fait, avez vous demandé à google si python ne supporterait pas modbus -minimalmodbus-?
et si ... arduino n'a pas une bibliothèque dédiée à modbus? )

@dbrion06 +1

@mhelh, modbus, c'est un objectif ou un moyen ?

Si c'est un moyen il y a peut-être plus simple pour réaliser cela :

arduino en mode esclave et raspberry pi le maître pour que je puisse récupéré les donnés .

Si tu veux de l'aide plus précise il va falloir répondre aux questions qui te seront posées. Je commence :

Quels sont les "ordres" du maître et les "réponses" à ces ordres de l'esclave que tu souhaites ?

bon je souhaite que le maître reçoit les information(température -humidité ) qu'on a stoké à la carte arduino (esclave) et les affichées dans mon pc
le modbus c'est un protocole de communication .

raspberry pi

mhelh:
bon je souhaite que le maître reçoit les information(température -humidité ) qu'on a stoké à la carte arduino (esclave) et

les affichées dans mon pc

PC ou raspberry ?

le modbus c'est un protocole de communication .

Ok, comme il en existe des centaines.... Pourquoi celui là ?

Pour faire ce que tu décris, tu n'as besoin, AHMA, d'aucun protocole.

Peux tu te contenter d'une émission périodique (toute les seconde mettons) de l'arduino vers le raspberry ?

j’ai envie d’apprendre à travailler avec le modbus c’est pour cela j’ai posté dans le forum

supercc:
Peux tu te contenter d’une émission périodique (toute les seconde mettons) de l’arduino vers le raspberry ?

j’ai pas bien compris

j'ai envie d'apprendre à travailler avec le modbus c'est pour cela j'ai posté dans le forum

Donc si modbus est le but de la manoeuvre mes commentaires précédents ne sont pertinents. Oublie. Perso je ne pourrai pas t'aider, je ne connais pas modus.

j'ai pas bien compris

Je vois un moyen simple de résoudre le problème que tu décris :

bon je souhaite que le maître reçoit les information(température -humidité ) qu'on a stoké à la carte arduino (esclave) et les affichées dans mon pc.

Et il n'y a ni besoin de modbus, ni besoin a mon avis de maître et d'esclave. Il suffit que l'arduino affiche toutes les seconde la valeur de temp et hum sur son port série et que le programme sur (PC/Rasberry ?) affiche ce qui vient du port série. Cela résout le problème posé mais si l'apprentissage de modbub est ton objectif, ce n'est pas pertinent.

Un RPi peut fonctionner ... comme un PC (j'ai comparé un RPi neuf avec un PC de 10 ans d'âge pour un bureau+ arduino+petits traitements d'image -hors apprentissage -: le RPi n'a pas à rougir de la comparaison).
*Le trio python + pyserial+ matplotlib est tout à fait dapté pour acquerir/ visualiser des données issues de l'arduino (matplotlib permet aussi de stocker les courbes sous forme de fichier graphique)

  • je pense que processing (java avec une bibliothèque très proche d'arduino) a servi à inspirer le traceur de courbes fourni avec arduino (qui est très bien, activable quand on gère le terminal serie...)

Pour les problèmes de cadence:

normalement, le DHT n'est pas une bête de course -et ça tombe bien: la température dans une pièce pas trop près d'un volcan varie lentement- Une cadence de 1 seconde pour des températures, humidités me semble .... un peu rapide...
Je suis allé voir comment étaient les SHT de sensirion https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/0_Datasheets/Humidity/Sensirion_Humidity_Sensors_SHT3x_Datasheet_analog.pdf et, page 2 (la page 1 est alléchante), j'ai vu que le temps de réponse était de 2 secondes pour la température, 8 secondes pour l'humidité relative....
Normalement, python peut lire -et verifier dans une certaine mesure l'integrité- un format

 Serial.print("{Hu:\n");
      Serial.print(sht.getHumidity(),2);
      Serial.print("\t"); // tabulation, pour faire joli; sinon, la ligne ne sert à rien
      Serial.print("  T:  ");
      Serial.print(sht.getTemperature(),3);
      Serial.print("}\n");

très forcément inspiré de votre code (côté PC/RPi, seules les lignes commençant par "{" et finissant par "}" seront considérées comme valides et on découpe en champs contenant T: et Hu:, le reste des tests de validité est que l'humidité est un nombre entre 10 et 90....idem pour la température)

La seule difficulté pour avoir un système d'affichage/stockage sur PC/RPi est alors ... la prise en main de python+matplotlib+pyserial ou celle de processing....

L'avantage d'avoir un truc qui marche est que on peut consacrer du temps à prendre en main modbus.
C'est pour ça que je vous conseillerais plutôt python côté PC/RPi, car il a un maître modbus (selon google qui m'a parlé de https://minimalmodbus.readthedocs.io) et qu'ainsi le temps passé à avoir des rudiments -ou plus, a fortiori- de python sera fort bien utilisé .