Aller au contenu


Photo
- - - - -

Communication I²C entre R-pi et Arduino


  • Veuillez vous connecter pour répondre
3 réponses à ce sujet

#1 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 20 juin 2019 - 10:14

Salut les makers, 
J'ai une petite question sur la communication I²C.. 
Je dispose d'un R-pi que j'ai connecté en I²C avec un arduino (UNO pour le moment, mais ce seront bientôt des NANOS qui y seront connectés). 
La connection fonctionne bien, malheureusement le bout de code fourni en exemple ne me permet d'envoyer qu'une instruction à la fois à l'arduino, celà ne me gênait pas trop lorsque je n'avais qu'un moteur par arduino à commander, mais ces arduinos devront aussi recevoir des instructions pour commander des servo-moteurs afin d'orienter la cam du R-pi. 
Du coup, je souhaiterais pouvoir envoyer plusieurs instructions vers les arduinos (la première instruction pour définir la vitesse de la roue, la seconde instruction pour indiquer l'angle du servomoteur...)

voici l'exemple sur lequel je me suis basé ( https://www.pihomese...ux-via-bus-i2c/ ) :  

code côté arduino : 

#include <Wire.h>

#define SLAVE_ADDRESS 0x12
int dataReceived = 0;

void setup() {
    Serial.begin(9600);
    Wire.begin(SLAVE_ADDRESS);
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);
}

void loop() {
    delay(100);
}

void receiveData(int byteCount){
    while(Wire.available()) {
        dataReceived = Wire.read();
        Serial.print("Donnee recue : ");
        Serial.println(dataReceived);
    }
}

void sendData(){
    int envoi = dataReceived + 1;
    Wire.write(envoi);
}

et voici le code côté R-pi (notez l'affreux "time.sleep" que j'aimerai voir disparaître car pour les 4 arduinos envisagés on arrive à 4 secondes de perdues ce qui fait beaucoup trop à mon goût ^^)

import smbus
import time

# Remplacer 0 par 1 si nouveau Raspberry
bus = smbus.SMBus(0)
address = 0x12

print "Envoi de la valeur 3"
bus.write_byte(address, 3)
# Pause de 1 seconde pour laisser le temps au traitement de se faire
time.sleep(1)
reponse = bus.read_byte(address)
print "La reponse de l'arduino : ", reponse

Merci d'avance pour vos réponses. 
 

 

 



#2 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 735 messages
  • Gender:Male
  • Interests:Glenn

Posté 20 juin 2019 - 10:22

Coucou, essaye de retomber sur mon post ou je fais fonctionner la pi avec une arduino mega (je serai incapable de retrouver le post), j'utilise la lib RS232 avec un convertisseur logique.

Sinon si tu regardes mes posts sur Glenn, j'envoie plusieurs infos d'un seul coup j'en parle mais le sujet n'est pas aussi précis que sur l'autre post.
Pour les servomoteurs j'utilise un driver qui va être directement placer sur la pi.

 

Sinon en utilisant un Structure envoyer par un Union de données ça pourrait peut être le faire, c'est la technique que Mike m'a conseillé et cela fonctionne très bien.

Bon je dis ça, mais je ne sais pas si cela peut fonctionner avec le mode I2C.

PS : maintenant j'ai changé, je suis toujours avec la pi mais j'ai remplacer la mega par un Esp32 (lolin D32 Pro).


signature_01.png -->

 

Mon Tipeee
 


#3 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 21 juin 2019 - 12:33

j'ai retrouvé une page dont tu me parle.. je met le lien ici pour le retrouver. ^^
https://www.robot-ma...age-2<br> merci

 



#4 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 735 messages
  • Gender:Male
  • Interests:Glenn

Posté 21 juin 2019 - 07:02

Si tu veux que je te fasse gagner du temps, je peux te filer le code que j'utilise avec la RS232, ou alors je te laisse te creuser la tête un p'tit peu pour l'apprentissage ;)

Dans mon post essaye de trouver là ou je parle de la lib RS232 déjà tu iras plus vite.


signature_01.png -->

 

Mon Tipeee
 





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users