Arduino bloque la communication I2C

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à toutes et à tous,

J'ai récemment acheté 2 modules bluetooth HC-05 pour faire communiquer deux arduino entre elles. J'ai configurer les deux modules grâce à ce tuto. Tout marche très bien, j'envoie et reçois des informations avec succès. Mais depuis cela, quand je veux initialiser une communication I2C (ici avec une nunchuck), la arduino se bloque.

J'utilise ce code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <Wire.h>

#define ZEROX 530
#define ZEROY 530
#define ZEROZ 530

#define WII_NUNCHUCK_I2C_ADRESS 0x52

void setup()
{
  Serial.begin(9600);
  transmit_begin();
  pinMode(13, OUTPUT);
  Serial.println("init ok");
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
}

void loop()
{
  Serial.println("loop ok");
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

void transmit_begin()
{
  Wire.begin();
  Wire.beginTransmission(WII_NUNCHUCK_I2C_ADRESS);
  Wire.write(0xF0),
  Wire.write(0x55);
  Wire.endTransmission();
  
  Wire.beginTransmission(WII_NUNCHUCK_I2C_ADRESS);
  Wire.write(0xFB);
  Wire.write(0x00);
  Wire.endTransmission();
}

Quand je le transfert, rien ne se passe (la led ne s'allume pas, et la carte n'envoie rien). Mais que je met en commentaire la ligne 12 qui initialise la communication, le code marche… Mais le code marche quand je débranche la nunchuck ! La nunchuck est neuve, et tout marchait bien avant…

Ce problème vient-il de mes tests avec les modules bluetooth ? Et comment puis-je les réparer ?

Merci d'avance :)

Édité par Roumil

Pourquoi faore simple quand on peut faire compliquer ? ;)

+0 -0
Auteur du sujet

Chose fort intéressante, quand j'utilise ce code pour voir où bloque le programme :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <Wire.h>
int ledPin = 13;

void setup()
{
    Serial.begin(19200);
    nunchuckinit(); // send the initilization handshake
    pinMode(ledPin, OUTPUT);
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    Serial.print("Wii ready\n");
}

void loop()
{
}

void nunchuckinit()
{
  Serial.println("nunchuck init has begun");
  Wire.begin();
  Wire.beginTransmission(0x52);
  Serial.println("Join bus ok");
  Wire.write((uint8_t)0x40);
  Wire.write((uint8_t)0x00);
  Serial.println("Send memory adress and zero ok");
  Wire.endTransmission();
  Serial.println("Initialisation ok");
}

voici ce que le terminal affiche :

1
2
3
nunchuck init has begun
Join bus ok
Send memory adress and zero ok

En modifiant un peu la librairie Wire.h, je sais que le code bloque à la ligne 140 dans la fonction endTransmission :

1
int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop);

Après des recherches plus approfondies, ja'i regardé dans la fonction twi_writeTo de twi.c, et ça bloque dans la boucle à la ligne 241 :

1
2
3
4
  // wait for write operation to complete
  while(wait && (TWI_MTX == twi_state)){
    continue;
  }

Et si j'enlève le endTransmission, le code bloque dans le requestFrom du Wire.cpp, et pls précisément dans une boucle semblable à la précédente (fichier twi.c, fonction twi_readFrom, ligne 173:

1
2
3
4
  // wait for read operation to complete
  while(TWI_MRX == twi_state){
    continue;
  }

Attend-t-il des ACK de la part de la nunchuck ?

Édité par Roumil

Pourquoi faore simple quand on peut faire compliquer ? ;)

+0 -0
Auteur du sujet

Non pourquoi ? J'en ai vu dans les cours sur la I2C, mais jamais sur l'utilisation nunchuck/arduino (je suppose qu'elles sont intégrées dedans), et le circuit à déjà fonctionner sans résistances pull-up. Et pour les lignes de code, je ne comprend pas ce que signifient les variables TWI_MRX, TWI_MTX (j'ai bien reconnu Tx et Rx) et twi_state…

Pourquoi faore simple quand on peut faire compliquer ? ;)

+0 -0
Auteur du sujet

Bon, avec ma nouvelle RPi, j'ai activé les ports I²C et fais un scan avec ma nunchuck branchée.... Et rien.

Je pense donc qe ça vient de mes nunchucks, mais je ne comprend vraiment pas pourquoi avant ça marchait et plus maintenant. Je vais donc essayer d'en récupèrer une, ou d'en acheter une.

Pourquoi faore simple quand on peut faire compliquer ? ;)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte