En raison de spams récurrents, les messages des nouveaux inscrits sont modérés a priori. Ne vous inquiétez pas si vous ne voyez pas apparaitre votre message immédiatement sur le forum. (November 04, 2021) x

Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

[Help] Récupérer données I2C en Python
#1

Bonjour, j'ai un projet Arduino qui fonctionne avec plusieurs µC que je voudrais remplacer par un PI, en Python.
Les modules communiquent entre-eux en I2C avec la libraire EasyTransferI2C.h qui permet d'envoyer et recevoir une Structure
Code :
struct ST_TFA { // Réception / Émission / i2c
  char Loc[10];
  int Canal ;
  float Temp;
  byte Hum;
};
Je ne veux garder qu'un seul module qui envoie ces informations 8 x par minute.
Je suis en train d'apprendre le Python et je ne suis qu'aux objets.
Deux questions :
  1. Comment détecter l'arrivée sur l'I2C
  2. Comment le lire, sachant qu'on connait le nombre d'octets transmis
Toutes les pistes claires et exemples sont bienvenue,
Merci !
Répondre
#2

Bonjour, en python vous devez utiliser la librairie par exemple "smbus" et bien sur le piege à eviter, ne pas oublier d'activer le bus I2C et de donner les droits d'accès au bus. Une fois installé sur votre Raspberry dans votre code python:

Code :
import smbus
from smbus import smbus
bus = smbus(1)


puis vous déclarez des variables avec les adresses à contacter, par exemple addr = 0x3

Pour l'envoi d'une info sur le bus, vous pouvez créer une fonction par exemple :
- def envoiI2C(hexa):
 
Code :
def envoiI2C(hexa):
    try :
        bus.write_block_data(addr, 0, hexa)
except IOError:
    print("erreur d'nvoi sur le bus I2C")
bus.close()
addr pour appeler la variable contenant l'adresse du composant à joindre,
0 , de memoire je ne me souvient plus,
hexa pour la variable à envoyée (dans mon cas reçus d'un if par exemple)

exemple d'une partie de code :

Code :
if lireEtat_Mode_automatique == "on":
    var2 = [0x6d, 0x6f, 0x64, 0x65]
    envoiI2c(var2)


Code :
def envoiI2C(hexa):
    try :
        bus.write_block_data(addr, 0, hexa)
except IOError:
    print("erreur d'envoi sur le bus I2C")
bus.close()
   
ne pas oublier que pour l'I2C il y a un maître et un/ou des esclaves. Pour l'instant je n'ai utilisé python que comme maître. Je n'ai pas regardé comment créer un événement si réception sur le bus.
Répondre
#3

(31-01-2022, 12:51:42)SG1Lord a écrit :  Bonjour, en python vous devez utiliser la librairie par exemple "smbus" et bien sur le piege à eviter, ne pas oublier d'activer le bus I2C et de donner les droits d'accès au bus. Une fois installé sur votre Raspberry dans votre code python:

Code :
import smbus
from smbus import smbus
bus = smbus(1)


puis vous déclarez des variables avec les adresses à contacter, par exemple addr = 0x3

Pour l'envoi d'une info sur le bus, vous pouvez créer une fonction par exemple :
- def envoiI2C(hexa):
 
Code :
def envoiI2C(hexa):
    try :
        bus.write_block_data(addr, 0, hexa)
except IOError:
    print("erreur d'nvoi sur le bus I2C")
bus.close()
addr pour appeler la variable contenant l'adresse du composant à joindre,
0 , de memoire je ne me souvient plus,
hexa pour la variable à envoyée (dans mon cas reçus d'un if par exemple)

exemple d'une partie de code :

Code :
if lireEtat_Mode_automatique == "on":
    var2 = [0x6d, 0x6f, 0x64, 0x65]
    envoiI2c(var2)


Code :
def envoiI2C(hexa):
    try :
        bus.write_block_data(addr, 0, hexa)
except IOError:
    print("erreur d'envoi sur le bus I2C")
bus.close()
   
ne pas oublier que pour l'I2C il y a un maître et un/ou des esclaves. Pour l'instant je n'ai utilisé python que comme maître. Je n'ai pas regardé comment créer un événement si réception sur le bus.

Merci, @SG1Lord, j'ai trouvé de la littérature a expérimenter.  Et le Raspberry sera esclave ...
Répondre
#4

(31-01-2022, 12:51:42)SG1Lord a écrit :  ne pas oublier que pour l'I2C il y a un maître et un/ou des esclaves. Pour l'instant je n'ai utilisé python que comme maître. Je n'ai pas regardé comment créer un événement si réception sur le bus.

Merci encore pour tes conseils.  Et oui, justement, je n'ai trouvé aucun article dans le sens Arduino -> Pi. Par contre je viens juste de trouver ceci : http://abyz.me.uk/rpi/pigpio/python.html#bsc_i2c
Mais je n'ai pas encore assez de connaissances en Python pour comprendre son code et son utilisation.

J'ai aussi vu un exemple en C++, dont je ne connais que les bases pour de l'Arduino un peu " avancé ". 
Soit, touche-à-tout je suis, mais je me rend compte que cela pose des problèmes, des limites quand je veux aller vers du plus pointu.
Je suis un peu découragé, fatigué.

Je me suis mis à penser à communiquer en sériel, mais je risque de buter sur d'autres problèmes. Je décante et j'écoute un peu Chopin avec du Gainsbourg
Répondre
#5

Bonjour,
Pour faire communiquer un arduino avec un Pi pourquoi ne pas utiliser un cable USB ?
Pour mon site meteo j'avais un Aduino dehors avec divers sondes relié à un pi par un cable usb de 25 m, cela à fonctionné pendant plusieurs années.
Répondre
#6

(03-02-2022, 07:56:23)mike913 a écrit :  Bonjour,
Pour faire communiquer un arduino avec un Pi pourquoi ne pas utiliser un cable USB ?
Pour mon site meteo j'avais un Aduino dehors avec divers sondes relié à un pi par un cable usb de 25 m, cela à fonctionné pendant plusieurs années.

Oui, j'ai vu ce type de communication.  Ce qui me chagrine, c'est que l'Arduino n'a qu'un seul port USB... Quoique.. il y a la possibilité de programmer l'Arduino à partir du Pi.  Je vais explorer
il y a déjà celui-là et en prime en français !
Je continue à chercher, je vous tiens au jus
Répondre
#7

(03-02-2022, 09:32:36)Pollux032 a écrit :  
(03-02-2022, 07:56:23)mike913 a écrit :  Bonjour,
Pour faire communiquer un arduino avec un Pi pourquoi ne pas utiliser un cable USB ?
Pour mon site meteo j'avais un Aduino dehors avec divers sondes relié à un pi par un cable usb de 25 m, cela à fonctionné pendant plusieurs années.

Oui, j'ai vu ce type de communication.  Ce qui me chagrine, c'est que l'Arduino n'a qu'un seul port USB... Quoique.. il y a la possibilité de programmer l'Arduino à partir du Pi.  Je vais explorer
il y a déjà celui-là et en prime en français !
Je continue à chercher, je vous tiens au jus

Attention concernant la communication entre un Raspberry Pi un une Arduino par USB. Il faut savoir que lorsque le Raspberry Pi envoie des données il est fort probable que cela effectue un RESET automatique de l'Arduino, et de ce fait les données ne sont pas prisent en compte. Pour résoudre le problème, sur l'Arduino, placer un condensateur entre les broches RESET et GND. Par contre à chaque fois qu'il seras nécessaire de téléverser le programme du Rasp vers l'Arduino il faut déconnecter le condensateur sous peine d'une erreur de communication.
Répondre
#8

(24-03-2022, 11:01:13)SG1Lord a écrit :  (...)
Attention concernant la communication entre un Raspberry Pi un une Arduino par USB. Il faut savoir que lorsque le Raspberry Pi envoie des données il est fort probable que cela effectue un RESET automatique de l'Arduino, et de ce fait les données ne sont pas prisent en compte. Pour résoudre le problème, sur l'Arduino, placer un condensateur entre les broches RESET et GND. Par contre à chaque fois qu'il seras nécessaire de téléverser le programme du Rasp vers l'Arduino il faut déconnecter le condensateur sous peine d'une erreur de communication.

Bonjour, je n'ai pas rencontré de problème particulier pour envoyer le programme vers l'Arduino (Nano).  Tout fonctionne correctement et c'est très stable.
Du côté Python, j'ai essayé le multi-threading, mais ce n'est pas fluide.  Du coup, je fais tourner 4 scripts en même temps.
Le seul problème que j'ai rencontré est le nom/numéro du port qui a changé sans crier gare.

  1. Un script pour la réception des données, leurs assemblages et l'envoi en FTP, MQTT (en local)
  2. un autre pour l'affichage des données sur une matrice 12 x 8x8 LED
  3. un 3ème pour l'affichage des éphémérides sur une autre matrice 12 x 8x8 LED
  4. et un 4ème pour l'interrogation d'un compteur Geiger, une donnée par seconde, pour générer un fichier de +/- 25 heures

Pour les données, je fais un fichier par heure et, toutes les 5 minutes, j'assemble les 25 derniers dans le dossier RAM le temps de l'envoi en FTP

Vous pouvez voir une partie du résultat là : https://cambier.eu/meteo/maison.php

Ubiquitous computing,  Maitrisons l'informatique plutôt que l'inverse !
Répondre
#9

(24-03-2022, 11:01:13)SG1Lord a écrit :  
(03-02-2022, 09:32:36)Pollux032 a écrit :  
(03-02-2022, 07:56:23)mike913 a écrit :  Bonjour,
Pour faire communiquer un arduino avec un Pi pourquoi ne pas utiliser un cable USB ?
Pour mon site meteo j'avais un Aduino dehors avec divers sondes relié à un pi par un cable usb de 25 m, cela à fonctionné pendant plusieurs années.

Oui, j'ai vu ce type de communication.  Ce qui me chagrine, c'est que l'Arduino n'a qu'un seul port USB... Quoique.. il y a la possibilité de programmer l'Arduino à partir du Pi.  Je vais explorer
il y a déjà celui-là et en prime en français !
Je continue à chercher, je vous tiens au jus

Attention concernant la communication entre un Raspberry Pi un une Arduino par USB. Il faut savoir que lorsque le Raspberry Pi envoie des données il est fort probable que cela effectue un RESET automatique de l'Arduino, et de ce fait les données ne sont pas prisent en compte. Pour résoudre le problème, sur l'Arduino, placer un condensateur entre les broches RESET et GND. Par contre à chaque fois qu'il seras nécessaire de téléverser le programme du Rasp vers l'Arduino il faut déconnecter le condensateur sous peine d'une erreur de communication.
C'est absoluement faux , mon site meteo fonctionne ainsi depuis plusieurs années;, je n' ai jamais eu de resset intempestif.
Répondre
#10

(24-03-2022, 12:43:05)mike913 a écrit :  
(24-03-2022, 11:01:13)SG1Lord a écrit :  
(03-02-2022, 09:32:36)Pollux032 a écrit :  
(03-02-2022, 07:56:23)mike913 a écrit :  Bonjour,
Pour faire communiquer un arduino avec un Pi pourquoi ne pas utiliser un cable USB ?
Pour mon site meteo j'avais un Aduino dehors avec divers sondes relié à un pi par un cable usb de 25 m, cela à fonctionné pendant plusieurs années.

Oui, j'ai vu ce type de communication.  Ce qui me chagrine, c'est que l'Arduino n'a qu'un seul port USB... Quoique.. il y a la possibilité de programmer l'Arduino à partir du Pi.  Je vais explorer
il y a déjà celui-là et en prime en français !
Je continue à chercher, je vous tiens au jus

Attention concernant la communication entre un Raspberry Pi un une Arduino par USB. Il faut savoir que lorsque le Raspberry Pi envoie des données il est fort probable que cela effectue un RESET automatique de l'Arduino, et de ce fait les données ne sont pas prisent en compte. Pour résoudre le problème, sur l'Arduino, placer un condensateur entre les broches RESET et GND. Par contre à chaque fois qu'il seras nécessaire de téléverser le programme du Rasp vers l'Arduino il faut déconnecter le condensateur sous peine d'une erreur de communication.
C'est absoluement faux , mon site meteo fonctionne ainsi depuis plusieurs années;, je n' ai jamais eu de resset intempestif.
Tout doux à tous Tongue

SG1Lord dit « lorsque le Raspberry Pi envoie des données », c'est l'inverse que je fais : je reçois les données de l'Arduino.  Pour la programmation de l'Arduino via le Pi, je n'ai eu aucun problème. Il n'y a bien entendu aucune raison de faire cela toutes les semaines !

Ubiquitous computing,  Maitrisons l'informatique plutôt que l'inverse !
Répondre
#11

Petit HS: Pollux032, parfois (c'est la 2ème fois que je le constate) tes posts contiennent une liste de langue et un lien pour faire des dons vers je ne sais quel système de traduction en ligne, peux-tu faire attention lorsque tu fais des copier/coller stp ?
Merci bien
Répondre
#12

(24-03-2022, 16:35:03)Pollux032 a écrit :  
(24-03-2022, 12:43:05)mike913 a écrit :  
(24-03-2022, 11:01:13)SG1Lord a écrit :  
(03-02-2022, 09:32:36)Pollux032 a écrit :  
(03-02-2022, 07:56:23)mike913 a écrit :  Bonjour,
Pour faire communiquer un arduino avec un Pi pourquoi ne pas utiliser un cable USB ?
Pour mon site meteo j'avais un Aduino dehors avec divers sondes relié à un pi par un cable usb de 25 m, cela à fonctionné pendant plusieurs années.

Oui, j'ai vu ce type de communication.  Ce qui me chagrine, c'est que l'Arduino n'a qu'un seul port USB... Quoique.. il y a la possibilité de programmer l'Arduino à partir du Pi.  Je vais explorer
il y a déjà celui-là et en prime en français !
Je continue à chercher, je vous tiens au jus

Attention concernant la communication entre un Raspberry Pi un une Arduino par USB. Il faut savoir que lorsque le Raspberry Pi envoie des données il est fort probable que cela effectue un RESET automatique de l'Arduino, et de ce fait les données ne sont pas prisent en compte. Pour résoudre le problème, sur l'Arduino, placer un condensateur entre les broches RESET et GND. Par contre à chaque fois qu'il seras nécessaire de téléverser le programme du Rasp vers l'Arduino il faut déconnecter le condensateur sous peine d'une erreur de communication.
C'est absoluement faux , mon site meteo fonctionne ainsi depuis plusieurs années;, je n' ai jamais eu de resset intempestif.
Tout doux à tous Tongue

SG1Lord dit « lorsque le Raspberry Pi envoie des données », c'est l'inverse que je fais : je reçois les données de l'Arduino.  Pour la programmation de l'Arduino via le Pi, je n'ai eu aucun problème. Il n'y a bien entendu aucune raison de faire cela toutes les semaines !

Je présente le problème que j'ai rencontré et la solution mise en place pour le résoudre. Pour être plus précis :
liaison Raspberry Pi 3 --> Arduino Mega par câble USB
une page web --> script java --> programme Python --> envoie vers l'Arduino
Code :
import sys
import os
import json
import serial
import time

ser = serial.Serial("/dev/ttyACM0", 9600)
ser.open

var2 = 'mode auto'
ser.write(var2.encode())
Lors de cette configuration 90% de mes tentatives d'envoies ont abouties par un resest de l'Arduino. Pour résoudre ce problème j'ai placé un condensateur entre la broche Reset de l'Arduino et le GND. Cette idée ne viens pas de moi mais trouvée à l'époque sur un forum. Je n'ai pas retrouvé celui-ci mais voici un autre qui cite ce problème :

Pour ce qui est de l'utilisation du Serial avec PHP, il y a la classe phpSerial qui fait ça très bien.
Mais attention, l'arduino est configuré pour avoir un reset à chaque fois que le Serial est ouvert.
Cela permet de pouvoir revenir au bootloader pour reprogrammer la carte.
En revanche, cela veut dire qu'à chaque page PHP qui va ouvrir le Serial, ton arduino va recevoir un reset.
Il te faudra donc désactiver cette fonction si tu ne veux pas de problèmes.
Répondre
#13

Je répète :

Mon cas est de l'Arduino VERS le Pi et pas l'inverse. Merci de ne pas polémiquer pour d'autres cas de figure.

Ubiquitous computing,  Maitrisons l'informatique plutôt que l'inverse !
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)