Échanges I2C entre Rpi et Nano en C(Rpi)

Bonsoir, je pédale depuis quelques temps sur la l’affichage de data échangées entre un Nano et un Rpi via le bus I2C. Le Rpi et est master et le Nano slave. Je fais des tests pour un projet de balise météo pour un club de parapente. Pour faire court, le Rpi envoi un chiffre à l’arduino et l’arduno répond en fonction de ce chiffre mais pour l’heure le Rpi di qu’il reçoit 0 alors que le Nano envoi eutre chos. Je suppose donc que le Rpi ne parvient pas à lire ou convertir ce qui vient du Nano. du code pour le Nano :
"
#define DEBUG
#define Serial_DEBUG
#include <Wire.h>

#define SLAVE_ADDRESS 0x08
uint16_t dataReceived = 0;
int envoi = 0;
uint16_t i = 0;
void setup() {
Wire.begin(SLAVE_ADDRESS); // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600); // start serial for output
// Wire.onRequest(sendData);
}

void loop() {
delay(1000);
#ifdef BEBUG
a++; Serial.print("----------- step :"); Serial.println(a);
#endif
}

void receiveEvent(int howMany) {
while(Wire.available()> 0) {
i = Wire.read();

  switch(i){
  case 4 :
      Serial.print(" recu : ");Serial.println(i, DEC);
      envoi = 5;
      break;
  case 10 :
      Serial.print(" recu : ");Serial.println(i, DEC);
      envoi = 8;
      break;      
  default :
      Serial.print(" recu : ");Serial.println(i, DEC);
      envoi = 9; 

}
// Wire.write(envoi);
Serial.print(" send : ");Serial.println(envoi, DEC);

}
}
void sendData(){
Wire.write(envoi);
envoi = 0;
}
"

et pour le Rpi :
"
#include <stdio.h>
#include <stdint.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <time.h>

#define dataIn(a,b) ((a<<8)|b) // convertion 2 bytes to Int

int h = 14;
unsigned int i = 0;
//~ unsigned short int dataArray[2];

int main (void)
{
int fd;
fd = wiringPiI2CSetup(0x08);

while (1) 
{   
    //dataArray[0] = (x >> 8) & 0xFF;
    //dataArray[1] = x & 0xFF;
    printf("value send : %d\n",h);
    wiringPiI2CWrite(fd, h);  
    delay(1000);
    i = wiringPiI2CRead(fd);
    printf("Voici la valeur de i : %d\n", i);
    i = 0;        
}   

// return 0;
}

"

Qu’en pensez vous, pouvez -vous m’aider s’il vous plait ?
Merci d’avance.
Cordialement,
FX

Je suis un peu désolé, mais vous devriez debugguer methodiquement:

  • est ce que votre esclave I2C est detecté (i2cdetect est un standard GNUlinux)
  • quel est le code retour des transactions I2C sur le RPi?
    là, je vais faire appel à la doc http://wiringpi.com/reference/i2c-library/

" This initialises the I2C system with your given device identifier. The ID is the I2C number of the device and you can use the i2cdetect program to find this out.
wiringPiI2CSetup() will work out which revision Raspberry Pi you have and open the appropriate device in /dev

The return value is the standard Linux filehandle, or -1 if any error – in which case, you can consult errno as usual.
"

Elle me confirme l’usage de i2cdetect : vous devriez aussi imprimer le code erreur
fd = wiringPiI2CSetup(0x08);
printf(« Fd : %d », fd);// non tested

Bonsoir et merci pour votre aide. Alors concernant

le Rpi voit bien la Nano, pas de souci de ce coté.
Concernant la librairie, j’ai bien lu le site (du moins il me semblait jusque lors), et pour les messages d’erreurs, je n’en ai pas (même la partie DEBUG nr fonctionne pas), d’où mon problème de compréhension.
Quand le Rpi envoi le chiffre 14, la Nano m’annonce bien qu’il a reçu 14 et il m’informe toujours dans la console, qu’il renvoi 9. Ceci est bien lisible dans la console coté Nano. De l’autre coté, le Rpi annonce qu’il reçoit le chiffre zéro, et c’est la tout mon problème je devrais lire 9 et non zéro.
Pour finir :

j’ai fait le test, le Rpi affiche 3, j’ai contre testé avec 10 au départ du Rpi, j’ai toujours d’un coté et 3 de l’autre comme réponse. Je sèche complet mais n’aspire qu’a évoluer.

Bonjour et bonne année.
Tout d’abord, merci pour avoir signalé dans un autre de vos posts que la liaison I2C était ce qui se faisait de plus fiable -en tous cas plus fiable qu’une liaison série, soumise à des aléas d’enumeration…- entre un Arduino et un RPi (c’est une des rares choses que j’ai apprises sur ce forum, et mérité d’être signalé)
Ensuite, il y a un petit point que vous sembles n’avoir pas compris (et je vous ai peut être induit en erreur l’an dernier):
fd selon la doc de wiringPi, est un descripteur de fichier
The return value is the standard Linux filehandle, or -1 if any error – in which case, you can consult errno as usual.

Normalement, pour tester une erreur à l’ouverture, il faut donc tester que fd est different de -1 (0 , selon https://fr.wikipedia.org/wiki/Descripteur_de_fichier, est l’entrée standard, 1 la sortie std, 2 est stderr… une valeur de 3 est parfaitement compatible avec wikipedia) , et afficher le code erreur uniquement dans le cas où -1 == fd (mon test était trop simple).

Ensuite; vous définissez une macro qui ne sert pas (mais qui me semble bien écrite) et, côté RPi, vous incluez sans l’utiliser stdint (la bibliothèque wiringPi ne fait pas appel à stdint )… Ceci complique la lecture de votre code

Côté arduino :

  • utilisez les uint8_t … (stdint est inclus par défaut dans l’environnement Arduino)
  • utilisez
    constant uint8_t SLAVE_ADRESS = 8 ;
    au lieu du #projets define (un puriste peut vous ennuyer)
  • Wire.read ne reçoit pas d’entier 16 bits, mais un char (ou un int8_t) https://www.arduino.cc/en/Reference/WireRead

Pour éviter d’attendre trop longtemps une réponse, je vais vous proposer la stratégie suivante (pour faire un service dédié à des parapentes, ce qui est votre projet, il faut attendre … la fin de l’hiver et des confinements… mais rester un mois sans réponse est troublant):

  • tester une configuration Arduino maître I2C + Arduino esclave I2C (votre RPi est remplacé par un second Arduino: gammon a fait un excellent tutorial http://www.gammon.com.au/i2c sur cette config, et j’ai pu utiliser ses codes de démo avec joie et succès).
    *Si vous recontrez des problèmes, le forum officiel de Arduino et arduinostackexchange ne mettent pas … un an à répondre (le forum officiel a une section française: si vous spécifiez que vous n’êtes pas un étudiant, ils peuvent vous aider; https://arduino.stackexchange.com a un moteur de recherche qui permet souvent de vous dépanner avant d’avoir eu à demander de l’aide)
    Cette étape, qui vous coûtera peut être un arduino en rab, est utile car elle permet de fractionner les difficultés et d’éviter que les contributeurs 'un forum ne « jouent au ping pong » -sauf moi : c’est ce que je fais en ce moment-

  • Une fois que ça marchera, yaurakafaudra porter le maître sur RPi

Déjà, je vous ai signalé une piste pour nettoyer le code (retirer les macros inutilisées, signaler que stdint n’est pas utilisée par wiringPi pour ne pas distraire les gens qui essayeront de vous aider)

le forum anglais officiel de RPi (la section français est beaucoup plus limitée: si j’avais besoin d’aide, je posterais en anglais) a des tas de contributeurs compétents (certains ont des arduini et des RPi) … et google translation traduit du français vers l’anglais (et le kurde) fort bien…

stackoverflow https://stackoverflow.com/ a toujours répondu à mes questions avant que je ne les pose et m’a appris énormément: comme ce sont des puristes, il vous faudra, me semble-t-il, poster un code propre (je vous ai signalé ci dessus que cela ne vous posait pas de problème majeur, si votre code continue de ressembler à ce que vous avez posté) pour avoir une réponse rapide…

Bonjour et tous mes bons veux pour cette nouvelle année, qu’elle vous soit douce et agréable. Pardon si je n’ai pas donné signe de vie, j’avoue avoir relâché la pression partout, bureau asso etc… j’en avais besoin.
Pour l’heure, je suis au bureau mais je vais prendre le temps de vous relire d’ici ce soir et vous réponds très vite.
Merci pour toute l’attention que vous portez à mon projet.
FX