Je tente un IST²C Configuration dans laquelle un maître Arduino contrôle deux esclaves.
p>
J'utilise deux 2000 Ohm Pullup Les résistances pour le i -²c et toutes les planches sont Arduino Duemilanoves . La configuration I²C et la fonction de configuration de la commande correctement lorsqu'elles sont déconnectées les unes des autres, mais lorsqu'ils sont connectés, les arduinos ne répondent pas dès que le premier J'ai essayé d'ajouter de courts délais après chaque fil.write code> fonction et avez utilisé une variété de résistances de pullup dans une tentative de résolution du problème, mais rien ne semble fonctionner. Comment puis-je résoudre ce problème? P> code maître: strong> p> // Tous le code dans la boucle jusqu'à ce point Le système activé et éteint à la touche appuyez sur.
// Le code suivant correspond à I²C basé sur les lectures de potentiomètre. P> esclave 1 code: pre> p> Wire.Write code> est appelé. Je cesse de recevoir des messages série, les Arduinos esclaves cessent de recevoir des messages du maître et je perds la possibilité d'allumer et de désactiver le système à l'aide du bouton. P> #include <Servo.h>
#include <Wire.h>
Servo myservo3;
Servo myservo4;
void setup()
{
Serial.begin(9600); // Setup serial
myservo3.attach(2);
myservo4.attach(3);
Wire.begin(10);
Wire.onReceive(receiveEvent);
}
void loop()
{
}
void receiveEvent(int howMany)
{
while(Wire.available())
{
char v = Wire.read();
if(v == 'C')
{
myservo3.write(0);
myservo4.write(180);
Serial.println("Arduino 2 in motor 3 direction");
}
else if(v == 'D')
{
myservo3.write(180);
myservo4.write(0);
Serial.println("Arduino 2 in motor 4 direction");
}
else
{
myservo3.write(90);
myservo4.write(90);
Serial.println("Arduino 2 still");
}
}
}
4 Réponses :
Cela pourrait vous aider à sortir un peu: p>
D'accord, cela va donc être un mur de texte et j'ai déjà fermé l'onglet une fois sur accident avant de poster afin que je puisse sembler en colère, car cette "caractéristique" de l'Arduino est vraiment mauvaise et cela vous coûtera $ si Vous branchez un périphérique 3.3V. Vous utilisez la bibliothèque de fil qui permet de vraiment bad 20k pullups internes sur les broches SDA et SCL. P>
sur chaque Arduino. Vous avez une situation où la résistance totale de pullup est maintenant bouchée (vissée). Vous devez faire des recherches sur la manière de désactiver les pullulations internes. Je recommande de modifier la bibliothèque. Pour des raisons holistiques, ce type de contrôle ne devrait jamais être fait dans des logiciels. Vérifiez sa mathématique sur la pullup externe requise. La capacité de chaque code PIN SCL / SDA sur l'Arduino devrait être de 10pf. P>
Voici la formule directe de la fiche de l'ATMEGA P>
http://i.imgur.com/zabyf.png P>
Voici la feuille de données ATMEGA, voir la section 21 pour la section I2C P>
Je ne suis pas d'accord avec ça. Il n'existe aucune preuve factuelle pour appuyer des allégations.
L'événement "réception" est à l'intérieur d'une ISR qui ne quitte pas tant que la fonction d'événement renvoie p>
OH Au fait, le matériel AVR contient le bus I2C dans un état congelé jusqu'à ce que cet événement sort, également appelé horloge étirement p>
Oh devinez quoi, Wire n'a pas déclaré les variables FIFO comme volatiles, alors même s'il a omis (câblé), qui devient une boucle infinie car disponible () ne changera jamais, car tout cela se produira dans Une interruption et une rxbufferindex et RxBufferlength ne sont pas déclarées comme volatiles p>
http://www.nongnu.org/avr- libc / utilisateur-manuel / faq.html # faq_volatile p>
Ceci est une cause possible p>
Insérez le rant en colère contre Arduino et ses terribles bibliothèques ici p>
solution? Utilisez une autre bibliothèque, les utilitaires TWI que "Wire.H" peuvent être utilisés directement si vous savez comment, et c'est génial, je l'utilise tout le temps. P>
Au lieu d'essayer avec plusieurs esclaves, initiez d'abord avec une seule configuration maître et une seule esclave. Et essayez de garder le programme aussi simple que possible. Vous créez une fonction comme Recevoir et envoyez à Master / Slave P>
Vous ne pouvez pas écrire à l'intérieur de ReveerEvent P>
ReceecreEvent définit la commande Ensuite, le maître doit appeler Demandefrom et demander de la valeur et des poignées esclaves (requéres) et d'utiliser écrire ici. P>
I.e. 1- Master Wire.Write (Nom de la commande) P>
2- Slave: poignées (réveillé) et obtenir l'ID de commande p>
3- Master envoie la requêteEfrom p>
4- Poignées esclaves (requéres) et basé sur l'ID de commande envoie la réponse à Master. P>
Avez-vous accès à un oscilloscope pour déterminer l'intégrité du signal E et exclure des problèmes matériels?
Je n'ai pas vérifié ma configuration avec un oscilloscope, mais j'ai testé la configuration I2C sans les composants supplémentaires (potentiomètres, voyants, boutons, etc.) et les composants supplémentaires sans I2C et que les deux systèmes travaillent individuellement.
Pouvez-vous dire où sont définis les adresses d'esclaves I2C? Sont-ils installés dans du matériel? J'essaierais de supprimer l'un des esclaves d'Arduino et j'essaie d'en obtenir un seul pour répondre.
J'ai supprimé l'un des esclaves et a rencontré une version du code maître qui peut être trouvé ici: code maître avec un esclave J'ai utilisé le même code esclave que situé au-dessus du problème du système était identique, il était fonctionnel lorsque Wire.Write fonctionne ont été supprimés et non fonctionnels quand ils ont été inclus. Le problème pourrait-il être la longueur du fil que j'utilise ou la force de mes résistances?