2012-11-01 9 views
9

के बाद फ्रीज करता है मैं I²C सेटअप का प्रयास कर रहा हूं जिसमें एक मास्टर Arduino दो दासों को नियंत्रित करता है।Arduino I²C स्टार्टअप

Enter image description here

मैं I²C के लिए दो 2000 ओम pullup प्रतिरोधों उपयोग कर रहा हूँ और सभी बोर्डों Arduino Duemilanoves हैं। I²C सेटअप और नियंत्रण सेटअप दोनों एक दूसरे से डिस्कनेक्ट होने पर ठीक से काम करते हैं, लेकिन जब पहले wire.write फ़ंक्शन को कॉल किया जाता है तो Arduinos कनेक्ट होने पर अप्रतिबंधित हो जाता है। मैं धारावाहिक संदेश प्राप्त करना बंद कर देता हूं, दास Arduinos मास्टर से संदेश प्राप्त करना बंद कर देता है, और मैं बटन का उपयोग कर सिस्टम चालू और बंद करने की क्षमता खो देता है।

मैंने प्रत्येक wire.write फ़ंक्शन के बाद छोटी देरी जोड़ने का प्रयास किया है और समस्या को ठीक करने के प्रयास में विभिन्न प्रकार के पुलअप प्रतिरोधकों का उपयोग किया है, लेकिन कुछ भी काम नहीं करता है। मैं इसे कैसे ठीक करूं?

मास्टर कोड:

#include <Wire.h> 

int potPin1 = 0; // Select the input pin for the potentiometer 
int potPin2 = 1; 
int potVal1;  // Variable to store the value coming from the sensor 
int potVal2; 
int times=0; // All the below variables are used to control an on-off button 
int state=0; 
int lastState=0; 
boolean pot=false; 

void setup() 
{ 
    pinMode(13, OUTPUT); //LED that turns on when system is activated 
    pinMode(3, INPUT); //Button that turns on system 
    Serial.begin(9600); 
    Wire.begin(); 
} 

void loop(){ 
    state=digitalRead(3); 
    if(state != lastState){ 
     if(state==HIGH){ 
      times++; 
      Serial.println(times); 
     } 
     else{ 
      Serial.println("off"); 
     } 
    } 

    lastState=state; 

    if(times%2 ==1) 
    { 
     turnPotOn(); 
    } 
    else 
    { 
     turnPotOff(); 
    } 

// इस मुद्दे पर पाश ऊपर के सभी कोड और बंद बटन प्रेस प्रणाली बदल जाता है। // निम्नलिखित कोड I²C से potentiometer रीडिंग के आधार पर मेल खाता है।

if(pot==true) 
    { 
     potVal1 = analogRead(potPin1); // Read the value from the sensor 
     potVal2 = analogRead(potPin2); 

     if((potVal1>700) && (300<potVal2) && (potVal2<700)) 
     { 
      arduino1_motor1(); 
     } 
     else if ((potVal1<330) && (336<potVal2) && (potVal2<683)) 
     { 
      arduino1_motor2(); 
     } 
     else if ((potVal2>683) && (330<potVal1) && (potVal1<640)) 
     { 
      arduino2_motor3(); 
     } 
     else if ((potVal2<336) && (330<potVal1) && (potVal1<640)) 
     { 
      arduino2_motor4(); 
     } 
     else if ((potVal2<336) && (potVal1<330)) 
     { 
      arduino12_motor24(); 
     } 
     else if ((potVal2>683) && (potVal1>640)) 
     { 
      arduino12_motor23(); 
     } 
     else if ((potVal2>683) && (potVal1<640)) 
     { 
      arduino11_motor23(); 
     } 
     else if ((potVal2<336) && (potVal1>330)) 
     { 
      arduino11_motor24(); 
     } 
     else 
     { 
      arduino12_still(); 
     } 
    } 
    else 
    { 
     // arduino1_still(); 
     // arduino2_still(); 
     Serial.println("OFF"); 
    } 
} 

void turnPotOff() 
{ 
    digitalWrite(13, LOW); 
    pot=false; 
} 

void turnPotOn() 
{ 
    digitalWrite(13, HIGH); 
    pot=true; 
} 

void arduino1_motor1() 
{ 
    Wire.beginTransmission(5); 
    Wire.write('A'); 
    Wire.endTransmission(); 
    arduino2_still(); 
    Serial.println("A1 in M1 d"); 
} 

void arduino1_motor2() 
{ 
    Wire.beginTransmission(5); 
    Wire.write('B'); 
    Wire.endTransmission(); 
    arduino2_still(); 
    Serial.println("A1 in m2 d"); 
} 

void arduino12_still() 
{ 
    arduino1_still(); 
    arduino2_still(); 
    Serial.println("A1 & A2 stl"); 
} 

void arduino2_motor3() 
{ 
    arduino1_still(); 
    Wire.beginTransmission(10); 
    Wire.write('M3'); 
    Wire.endTransmission(); 
    Serial.println("A2 in M3 d"); 
} 

void arduino2_motor4() 
{ 
    arduino1_still(); 
    Wire.beginTransmission(10); 
    Wire.write('D'); 
    Wire.endTransmission(); 
    Serial.println("A2 in M4 d"); 
} 

void arduino12_motor24() 
{ 
    Wire.beginTransmission(5); 
    Wire.write('B'); 
    Wire.endTransmission(); 
    Wire.beginTransmission(10); 
    Wire.write('D'); 
    Wire.endTransmission(); 
    Serial.println("A1 & A2 in M2 and M4 d"); 
} 

void arduino12_motor23() 
{ 
    Wire.beginTransmission(5); 
    Wire.write('B'); 
    Wire.endTransmission(); 
    Wire.beginTransmission(10); 
    Wire.write('C'); 
    Wire.endTransmission(); 
    Serial.println("A1 & A2 in M2 and M3 d"); 
} 

void arduino11_motor24() 
{ 
    Wire.beginTransmission(5); 
    Wire.write('A'); 
    Wire.endTransmission(); 
    Wire.beginTransmission(10); 
    Wire.write('D'); 
    Wire.endTransmission(); 
    Serial.println("A1 & A2 in M1 and M4 d"); 
} 

void arduino11_motor23() 
{ 
    Wire.beginTransmission(5); 
    Wire.write('A'); 
    Wire.endTransmission(); 
    Wire.beginTransmission(5); 
    Wire.write('C'); 
    Wire.endTransmission(); 
    Serial.println("A1 & A2 in M1 and M3 d"); 
} 

void arduino1_still() 
{ 
    Wire.beginTransmission(5); 
    Wire.write('S'); 
    Wire.endTransmission(); 
} 

void arduino2_still() 
{ 
    Wire.beginTransmission(10); 
    Wire.write('S'); 
    Wire.endTransmission(); 
} 

दास 1 कोड:

#include <Servo.h> 
#include <Wire.h> 

Servo myservo1; 
Servo myservo2; 

void setup() 
{ 
    Serial.begin(9600);   // setup serial 
    myservo1.attach(2); 
    myservo2.attach(3); 
    Wire.begin(5); 
    Wire.onReceive(receiveEvent); 


} 

void loop() 
{ 
} 

void receiveEvent(int howMany) 
{ 
    while(Wire.available()) 
    { 
    char v = Wire.read(); 

    if(v == 'A') 
    { 
     myservo1.write(0); 
     myservo2.write(180); 
     Serial.println("Arduino 1 in motor 1 direction"); 
    } 
    else if(v == 'B') 
    { 
     myservo1.write(180); 
     myservo2.write(0); 
     Serial.println("Arduino 1 in motor 2 direction"); 
    } 
    else 
    { 
     myservo1.write(90); 
     myservo2.write(85); 
     Serial.println("Arduino 1 still"); 
    } 
    } 
} 

दास 2:

ठीक है तो यह जा रहा है:

#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"); 
     } 
    } 
} 
+0

क्या आपके पास ई सिग्नल अखंडता निर्धारित करने और हार्डवेयर समस्याओं को रद्द करने के लिए एक ऑसिलोस्कोप तक पहुंच है? – cowboydan

+0

मैंने एक ऑसिलोस्कोप के साथ अपना सेटअप चेक नहीं किया है, लेकिन मैंने i2c सेटअप को अतिरिक्त घटकों (potentiometers, एलईडी, बटन, आदि) और i2c के बिना अतिरिक्त घटकों के बिना परीक्षण किया है और दोनों प्रणालियों को अलग-अलग काम करने के लिए पाया है। – pongAssist

+0

क्या आप कह सकते हैं कि I2C गुलाम पते कहां सेट हैं? क्या वे हार्डवेयर में सेट हैं? मैं Arduino दासों में से एक को हटाने की कोशिश करता हूं और जवाब देने के लिए सिर्फ एक प्राप्त करने का प्रयास करता हूं। – cowboydan

उत्तर

2

इससे आपको यह पता एक सा मदद कर सकता है पाठ की दीवार बनें और मैं पहले से ही सी हूं पोस्ट करने से पहले एक बार दुर्घटनाग्रस्त होने पर टैब को खो दिया, इसलिए मुझे गुस्सा आ सकता है, क्योंकि Arduino की यह "विशेषता" वास्तव में खराब है और यदि आप इसमें 3.3V डिवाइस प्लग करते हैं तो इसका आपको $$ खर्च होगा। आप वायर लाइब्रेरी का उपयोग कर रहे हैं जो एसडीए और एससीएल पिन पर वास्तव में खराब 20k आंतरिक पुलअप को सक्षम बनाता है।

प्रत्येक ARDUINO पर। आपके पास एक ऐसी स्थिति है जहां कुल पुलअप प्रतिरोध अब बोर्क हो गया है (खराब हो गया है)। आपको आंतरिक पुलअप को अक्षम करने के तरीके पर शोध करने की आवश्यकता है। मैं पुस्तकालय को संशोधित करने की सलाह देते हैं। समग्र कारणों से इस तरह के नियंत्रण सॉफ्टवेयर में कभी नहीं किया जाना चाहिए। आवश्यक बाहरी पुलअप पर अपने गणित को दो बार जांचें। Arduino पर प्रत्येक एससीएल/एसडीए पिन की capacitance 10pF होना चाहिए।

यहाँ सूत्र ATmega डेटापत्रक

http://i.imgur.com/ZAByF.png

यहाँ से प्रत्यक्ष है ATmega डेटापत्रक, I2C अनुभाग

http://www.atmel.com/Images/doc8161.pdf

4

"घटना प्राप्त होता है" है के लिए खंड 21 देखें एक आईएसआर के अंदर, जो तब तक बाहर नहीं निकलता जब तक कि ईवेंट फ़ंक्शन

ओह, वैसे ही एवीआर हार्डवेयर एक जमे हुए राज्य में आई 2 सी बस रखता है जब तक यह घटना निकलती है, जिसे घड़ी

ओह अनुमान लगाता है कि वायर ने फीफो चर को अस्थिर घोषित नहीं किया था, भले ही वह जबकि (Wire.available()), कि एक अनंत लूप क्योंकि उपलब्ध() कभी नहीं बदलेगा हो जाता है, क्योंकि यह सब एक अवरोध में क्या हो रहा है और rxBufferIndex और rxBufferLength घोषित नहीं कर रहे हैं अस्थिर रूप

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_volatile

यह है है है एक संभावित कारण

Arduino के बारे में नाराज रान डालें यहां इसकी भयानक पुस्तकालयों

समाधान? एक और लाइब्रेरी का उपयोग करें, TWI उपयोगिताओं जो "वायर.h" borrows का उपयोग सीधे किया जा सकता है यदि आप जानते हैं कि कैसे, और यह बढ़िया है, तो मैं इसे हर समय उपयोग करता हूं।

0

एकाधिक दास के साथ प्रयास करने के बजाय, पहले एकल मास्टर और एकल गुलाम कॉन्फ़िगरेशन के साथ आरंभ करें। और प्रोग्राम को यथासंभव सरल रखने की कोशिश करें। आप समारोह बनाने की तरह प्राप्त करते हैं और मास्टर/दास को भेजने

0

आप receiveEvent

अंदर नहीं लिख सकते हैं

receiveEvent आदेश को परिभाषित करता है तो मास्टर requestFrom फोन और मूल्य और गुलाम हैंडल (requestEvent) के लिए पूछ सकते हैं और वहाँ लिखने का उपयोग करना चाहिए ।

यानी 1- मास्टर wire.Write (कमांड नाम)

2- गुलाम: हैंडल (receiveEvent) और आदेश आईडी

3 मास्टर प्राप्त भेजता requestFrom

4- गुलाम हैंडल (requestEvent) और कमांड आईडी के आधार पर मास्टर को जवाब भेजता है।