Σελίδα 1 από 2 1 2 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 1 έως 10 από 18

Θέμα: arduino wire

  1. #1
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Question arduino wire

    Θέλω την βοήθεια σας. Στο παρακάτω κλασικό παράδειγμα τι αλλαγές θα πρέπει να κάνω ώστε να στείλω έναν αριθμό float ή long;
    Επίσης πως μπορώ να στείλω τον ίδιο αριθμό σε δυο διαφορετικά slave ταυτόχρονα;

    master
    Κώδικας:
    #include <Wire.h>
    
    void setup()
    {
      Wire.begin(); // join i2c bus (address optional for master)
    }
    
    byte x = 0;
    
    void loop()
    {
      Wire.beginTransmission(4); // transmit to device #4
      Wire.write("x is ");        // sends five bytes
      Wire.write(x);              // sends one byte  
      Wire.endTransmission();    // stop transmitting
    
      x++;
      delay(500);
    }

    slave:
    Κώδικας:
    #include <Wire.h>
    
    void setup()
    {
      Wire.begin(4);                // join i2c bus with address #4
      Wire.onReceive(receiveEvent); // register event
      Serial.begin(9600);           // start serial for output
    }
    
    void loop()
    {
      delay(100);
    }
    
    // function that executes whenever data is received from master
    // this function is registered as an event, see setup()
    void receiveEvent(int howMany)
    {
      while(1 < Wire.available()) // loop through all but the last
      {
        char c = Wire.read(); // receive byte as a character
        Serial.print(c);         // print the character
      }
      int x = Wire.read();    // receive byte as an integer
      Serial.println(x);         // print the integer
    }

    0 Not allowed! Not allowed!

  2. #2
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Δες λίγο αυτό τον κώδικα που βρίσκεται στο συνημμένο και νομίζω θα καταλάβεις.
    Συνημμένα Αρχεία Συνημμένα Αρχεία

    0 Not allowed! Not allowed!

  3. Ένα μέλος ευχαρίστησε τον manolena για αυτό το χρήσιμο μήνυμα:

    her (30-05-15)

  4. #3
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Προεπιλογή

    Θα μπορούσες να μου το εξηγήσεις λίγο, γιατί δεν το κατάλαβα;

    0 Not allowed! Not allowed!

  5. #4
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Μετατρέπεις τη float που θέλεις να διαχειριστείς σε string και αυτό μετά το στέλνεις απο την ασύρματη σειριακή. Πρώτα για την εκπομπή:
    Κώδικας:
    char dataBuffer[20];//ορίζεις έναν buffer που θα διαχειριστεί την πληροφορία. 
    const int DATA_LENGTH = 20;//ορίζεις μια σταθερά για το μήκος του.
    float testValue;//έστω οτι αυτή είναι η float που θες να στείλεις.
    
    //μπλα... μπλα... μπλα..., υποτίθεται έχεις ορίσει και αρχικοποιήσει το RF
    
    //φτιάξε τη ρουτίνα μετατροπής:
    
    void transformFloatToString()
    {
      memset(dataBuffer, ' ', DATA_LENGTH);//"καθάρισε" τον buffer σε όλο το μήκος του.             
      snprintf(dataBuffer, xxx, "%f");//όπου xxx θα βάλεις το μήκος της float σε ακέραια και δεκαδικά μετά την υποδιαστολή, π.χ αν θες να στείλεις την τιμή 0.43 θα κάνεις: snprintf(dataBuffer, 4, "%1.2f")
    
    //τώρα ο dataBuffer έχει την τιμή της float σε string.
    
    }
    
    //Όποτε χρειάζεται τώρα κάλεσε τη ρουτίνα αποστολής
    void RFsend (char *message)
    {
      digitalWrite(RFTXPin,HIGH);
      vw_send((uint8_t *)message, DATA_LENGTH); 
      vw_wait_tx();
      delay(50);
      digitalWrite(RFTXPin,LOW);
    }
    
    //...δηλαδή έτσι:
    RFsend(dataBuffer);
    
    //... και έφυγε.
    Για το slave τώρα. Ομοίως χρησιμοποιείς έναν dataBuffer όπως πρίν:
    Κώδικας:
    char dataBuffer[20];//ορίζεις έναν buffer που θα διαχειριστεί την πληροφορία. 
    const int DATA_LENGTH = 20;//ορίζεις μια σταθερά για το μήκος του.
    
    //...και μια ρουτίνα για τη λήψη:
    void RFreceive ()
    {
      if (vw_get_message(dataBuffer, &DATA_LENGTH))
      {
        for (int i = 0; i < DATA_LENGTH; i++)
        { 
          Serial.print(dataBuffer[i]); 
        }
     }
    }

    0 Not allowed! Not allowed!

  6. #5
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Προεπιλογή

    Μάνο θα τα μελετήσω τώρα
    Η σύνδεση γίνετε ενσύρματα όχι ασύρματα αλλά φαντάζομαι δεν διαφέρει σε κάτι.
    Σε ευχαριστώ πάρα πολύ.

    0 Not allowed! Not allowed!

  7. #6
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Ναι εννοειται πως αφου για να εργαστει σε ασυρματη μεταδοση χρειαζεται τη Wire, ειναι ακριβως το ιδιο. Εδω ειμαστε για αποριες.

    0 Not allowed! Not allowed!

  8. #7
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από manolena Εμφάνιση μηνυμάτων
    Ναι εννοειται πως αφου για να εργαστει σε ασυρματη μεταδοση χρειαζεται τη Wire, ειναι ακριβως το ιδιο. Εδω ειμαστε για αποριες.
    Έχω δυσκολευτεί πολύ με την Wire. Ξεκινώ λίγο ποιο απλά μπας και καταλάβω τίποτα αλλά ούτε τα απλά μου δουλεύουν. Πως θα μπορούσα στο παράδειγμα να στείλω έναν ακόμα αριθμό π.χ inputA = 12;

    slave

    Κώδικας:
    #include <Wire.h>
     
    
    const byte SlaveDeviceId = 1;
     
    
     
    void setup()
    {
      // Start I²C bus as a slave
      Wire.begin(SlaveDeviceId);
      // Set the callback to call when data is requested.
      Wire.onRequest(requestCallback);
    }
     
    void loop()
    {
    }
     
    void requestCallback()
    {
      // Contrived example - transmit a value from an analogue pin.
      int input = 1245;
     
      // To send multiple bytes from the slave,
      // you have to fill your own buffer and send it all at once.
      uint8_t buffer[2];
      buffer[0] = input >> 8;
      buffer[1] = input & 0xff;
      Wire.write(buffer, 2);
    }
    master
    Κώδικας:
    #include <Wire.h>
    const byte SlaveDeviceId = 1;
    
    void setup()
    {
      // Start I²C bus as master
      Serial.begin(9600);
      Wire.begin();
    }
    void loop()
    {
      // Request data from slave.
      Wire.beginTransmission(SlaveDeviceId);
      int available = Wire.requestFrom(SlaveDeviceId, (uint8_t)2);
     
      if(available == 2)
      {
        int receivedValue = Wire.read() << 8 | Wire.read();
        Serial.println(receivedValue);
      }
     
      Wire.endTransmission();
     
      delay(1000);
    }

    0 Not allowed! Not allowed!

  9. #8
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Προεπιλογή

    Κάτι τελευταίο. Πως μπορούν να επικοινωνήσουν οι slave συσκευές μαζί; Π.χ έχω ένα master και 2 slave. Πως μπορών να επικοινωνήσουν αυτά τα δυο slave;

    0 Not allowed! Not allowed!

  10. #9
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Προεπιλογή

    Μάνο δεν μπόρεσα να προσαρμόσω τον κώδικα σου στο στον δικό μου.
    Βρήκα στο internet αυτών τον κώδικα για μεταφορά ενός μεγάλου αριθμού. Πως θα μπορούσα όμως να πω ότι τιμή έχει το Χ βάλτην στον πινάκα του array ; Δεν θέλω να πω array[1] = {485} γιατί ο αριθμός αυτός αλλάζει διαρκώς.


    master
    Κώδικας:
    #include <Wire.h>
    #define N_FLOATS 4
    
    volatile byte* arrayPointer;
    
    byte SLAVE_ADDRESS = 1;
    byte lastMasterCommand = 99;
    float array[N_FLOATS] = {12.3456, 11.111111, 333.33333, 1};
    float x=0;
    
    void setup() {
       Wire.begin(SLAVE_ADDRESS);
       Wire.onReceive(receiveCommand);
       Wire.onRequest(requestEvent);
    }
    
    void loop() {
      x = 485;
      array[1] =  x;
    
    }
    
    void receiveCommand(int howMany){
        lastMasterCommand = Wire.read();
    }
    
    void requestEvent(){
      switch(lastMasterCommand) {
        case 1:
          writeI2C();
          break;
      }
    }
    
    void writeI2C() {
     byte buffer[4*N_FLOATS];
     arrayPointer = (byte*) &array;
     for(byte i = 0; i < 4*N_FLOATS; i++)
         buffer[i] = arrayPointer[i];
    
     Wire.write(buffer,4*N_FLOATS);
    }
    slave
    Κώδικας:
    #include <Wire.h>
    byte SLAVE_ADDRESS = 1;
    const byte dataCount = 4;
    
    union {
     float floatData[dataCount];
     byte rawData[dataCount*sizeof(float)];
    }myData;
    
    void setup() {
       Wire.begin();
       Serial.begin(115200);
    
    }
    
    void loop() {
       readI2C();
      for (int i = 0; i < dataCount; i++)  {
           Serial.print ("Float n. ");
           Serial.print (i);
           Serial.print (" Value: ");
           Serial.println (myData.floatData[i],6);  
           }
    }
    
    
    void readI2C(){
     
      Wire.beginTransmission(SLAVE_ADDRESS);
      Wire.write((byte)1);
      if (Wire.requestFrom (SLAVE_ADDRESS, sizeof myData) == sizeof myData){
        for(byte i = 0; i < 4*dataCount; i++)
           myData.rawData[i] = Wire.read();
       }
      
      Wire.endTransmission();
      }

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη her : 16-07-15 στις 19:20

  11. #10
    Μέλος Το avatar του χρήστη thanasis 1
    Όνομα
    Θανάσης
    Εγγραφή
    Jul 2010
    Περιοχή
    ΑΘΗΝΑ
    Μηνύματα
    1.387

    Προεπιλογή

    Μολις μονταρα την πλακετα μου με το επιταχυνσιομετρο(ωραια δοκιμασια να κολλας 3mm chip)και ετσι εφτιαξα και το προγραμμα και παω για δοκιμες.
    Στο datasheet λεει για το pin 5 που ειναι το cs:

    SPI enable
    I2C/SPI mode selection (1: I2C mode; 0: SPI enabled)

    αρα για ενεργοποιησω την επικοινωνια i2c θα πρεπει να συνδεσω το pin 5(cs) με τα 3.3v??
    Αν ναι να το συνδεσω το pin κατευθειαν με τα 3.3v ή να το συνδεσω με μια αντισταση 10κ σε σειρα οπως ειναι εδω??

    0 Not allowed! Not allowed!

Σελίδα 1 από 2 1 2 ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. Wire Bonding
    By Jimakos_Sn in forum Ηλεκτρονικά
    Απαντήσεις: 13
    Τελευταίο Μήνυμα: 15-05-17, 18:53
  2. die wire bonding
    By mtzag in forum Όργανα & Εξοπλισμός
    Απαντήσεις: 7
    Τελευταίο Μήνυμα: 12-01-15, 08:38
  3. 22g wire
    By Killo_Watt in forum Εξαρτήματα & Datasheets
    Απαντήσεις: 1
    Τελευταίο Μήνυμα: 04-04-11, 17:17

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας