Η σειριακή επικοινωνία επιτρέπει στο Arduino να μιλάει με άλλες συσκευές. Ανακαλύψτε πώς να τα συνδέσετε και να τα κωδικοποιήσετε χρησιμοποιώντας οποιοδήποτε από τα τέσσερα πρωτόκολλα.

Όταν εργάζεστε σε μεγάλα έργα Arduino, είναι πολύ συνηθισμένο να τελειώνουν οι διαθέσιμες καρφίτσες για τη σύνδεση εξαρτημάτων. Ας υποθέσουμε ότι θέλετε να συνδέσετε πολλούς αισθητήρες/ενεργοποιητές με την επείγουσα ανάγκη διατήρησης επιπλέον ακίδων για την τροφοδοσία μιας μονάδας οθόνης που είναι πεινασμένη για καρφίτσες.

Αν δεν κάνετε κάτι μαγικό, μερικές φορές είναι δύσκολο να χειριστείτε όλες αυτές τις συνδέσεις σε μία μόνο πλακέτα Arduino—ειδικά όταν αποφασίζετε να χρησιμοποιήσετε μικρότερες πλακέτες επειδή πιέζεστε για χώρο. Τότε είναι που μπαίνει στο παιχνίδι η σειριακή επικοινωνία.

Ας εξερευνήσουμε τι είναι η σειριακή επικοινωνία και τους τρόπους με τους οποίους μπορείτε να τη ρυθμίσετε με το Arduino για εργασίες όπως η κατανεμημένη επεξεργασία και η γενική ενσωμάτωση.

Τι είναι η σειριακή επικοινωνία;

instagram viewer

Η σειριακή επικοινωνία είναι μια μέθοδος αποστολής και λήψης δεδομένων μεταξύ δύο ή περισσότερων ηλεκτρονικών συσκευών, ένα bit τη φορά μέσω μιας γραμμής επικοινωνίας. Όπως υποδηλώνει το όνομα, τα δεδομένα αποστέλλονται σε "σειρά".

Ακόμη και το να μπορείτε απλώς να ανεβάσετε σκίτσα στην αγαπημένη σας πλακέτα Arduino χρησιμοποιεί σειριακή επικοινωνία μέσω USB.

Σειριακά πρωτόκολλα επικοινωνίας στο Arduino

Οι πλακέτες Arduino είναι απίστευτα ευέλικτες και μπορούν να επικοινωνούν με ένα ευρύ φάσμα συσκευών. Υποστηρίζουν τέσσερα πρωτόκολλα σειριακής επικοινωνίας: Soft Serial, SPI (Serial Peripheral Interface), Standard UART (Universal Asynchronous Receiver-Transmitter) και I2C (Inter-Integrated Circuit). Για περισσότερες λεπτομέρειες, ανατρέξτε στον αναλυτικό οδηγό μας για πώς λειτουργούν οι σειριακές επικοινωνίες UART, SPI και I2C.

Αυτό το σεμινάριο χρησιμοποιεί βασικά σκίτσα για να δείξει πώς μπορείτε να ρυθμίσετε μια σειριακή σύνδεση μεταξύ δύο πλακών Arduino Uno χρησιμοποιώντας διάφορα πρωτόκολλα. Προσαρμόστε τον κωδικό ώστε να ανταποκρίνεται στις συγκεκριμένες απαιτήσεις σας.

SPI (σειριακή περιφερειακή διεπαφή)

Το SPI είναι ένα πρωτόκολλο σύγχρονης σειριακής επικοινωνίας που επιτρέπει την επικοινωνία υψηλής ταχύτητας μεταξύ μικροελεγκτών και περιφερειακών συσκευών. Αυτό το πρωτόκολλο απαιτεί τέσσερα καλώδια για επικοινωνία: SCK (σειριακό ρολόι), MOSI (Master Out Slave In), MISO (Master In Slave Out), και SS (Slave Select).

ο SPI.h Η βιβλιοθήκη είναι πολύ βολική για αυτόν τον τύπο επικοινωνίας και πρέπει να περιλαμβάνεται στην κορυφή του σκίτσου σας.

#περιλαμβάνω

Ακολουθούν οι ακίδες SPI στην πλακέτα Arduino Uno:

Λειτουργία

Αριθμός pin (Ψηφιακός)

Αριθμός pin (Κεφαλίδα ICSP)

MOS

11

4

MISO

12

1

SCK

13

3

SS

10 (Προεπιλογή)

1 (Εναλλακτική)

Μετά την προετοιμασία της σειριακής επικοινωνίας, θα χρειαστεί να διαμορφώσετε τις ακίδες επικοινωνίας.

κενόςεγκατάσταση(){
SPI.αρχίζουν(115200);
// Ορίστε τις λειτουργίες pin για SS, MOSI, MISO και SCK
pinMode(SS, ΠΑΡΑΓΩΓΗ);
pinMode(MOSI, ΠΑΡΑΓΩΓΗ);
pinMode(MISO, ΕΙΣΑΓΩΓΗ);
pinMode(SCK, ΠΑΡΑΓΩΓΗ);

// Ρυθμίστε την ακίδα επιλογής slave (SS) ψηλά για να απενεργοποιήσετε τη βοηθητική συσκευή
digitalWrite(SS, ΥΨΗΛΟΣ);
}

Το σήμα SS χρησιμοποιείται για να ενημερώσει τη εξαρτημένη συσκευή πότε μεταφέρονται δεδομένα.

// Επιλέξτε το slave
digitalWrite(SS, ΧΑΜΗΛΟΣ);

// Αποστολή δεδομένων στη εξαρτημένη συσκευή
SPI.ΜΕΤΑΦΟΡΑ(δεδομένα);

// Καταργήστε την επιλογή της εξαρτημένης συσκευής
digitalWrite(SS, ΥΨΗΛΟΣ);

Δείτε πώς να συνδέσετε δύο πλακέτες Arduino χρησιμοποιώντας το SPI.

Κωδικός για την κύρια πλακέτα:

#περιλαμβάνω
συνθενθ slaveSelectPin = 10;
κενόςεγκατάσταση(){
SPI.αρχίζουν(115200);
pinMode(SlaveSelectPin, ΠΑΡΑΓΩΓΗ);
}

κενόςβρόχος(){
digitalWrite(SlaveSelectPin, ΧΑΜΗΛΟΣ);
SPI.ΜΕΤΑΦΟΡΑ('Η');
digitalWrite(SlaveSelectPin, ΥΨΗΛΟΣ);
καθυστέρηση(1000);
}

Κωδικός για τον πίνακα σκλάβων:

#περιλαμβάνω
συνθενθ slaveSelectPin = 10;
κενόςεγκατάσταση(){
SPI.αρχίζουν(115200);
pinMode(SlaveSelectPin, ΠΑΡΑΓΩΓΗ);
}

κενόςβρόχος(){
αν (digitalRead(SlaveSelectPin) == ΧΑΜΗΛΟΣ) {
απανθρακώνω ληφθένταΔεδομένα = SPI.ΜΕΤΑΦΟΡΑ('ΜΕΓΑΛΟ');
Κατα συρροη.println(λαμβανόμενα δεδομένα)·
}
}

Βεβαιωθείτε ότι οι συσκευές σας έχουν κοινό έδαφος για σωστή διαμόρφωση.

UART (Universal Asynchronous Receiver-Transmitter)

Το UART είναι ένα ασύγχρονο πρωτόκολλο σειριακής επικοινωνίας που επιτρέπει την επικοινωνία μεταξύ συσκευών που χρησιμοποιούν μόνο δύο καλώδια: TX (Transmit) και RX (Receive). Το UART χρησιμοποιείται συνήθως για επικοινωνία με συσκευές όπως μονάδες GPS, μονάδες Bluetooth και άλλους μικροελεγκτές. Κάθε πλακέτα Arduino είναι εξοπλισμένη με τουλάχιστον μία θύρα για UART.

Οι ακίδες UART σε δημοφιλείς πλακέτες Arduino περιλαμβάνουν:

Σανίδα

Σειριακές καρφίτσες

Serial1 Pins

Serial2 Pins

Serial3 Pins

Uno, Nano, Mini

0 (RX), 1 (TX)

N/A

N/A

N/A

Mega

0 (RX), 1 (TX)

19 (RX), 18 (TX)

17 (RX), 16 (TX)

15 (RX), 14 (TX)

Μπορείτε να λάβετε τον πλήρη πίνακα από Η ηλεκτρονική τεκμηρίωση του Arduino σχετικά με τη σειριακή επικοινωνία.

Πρώτα, συνδέστε τις σανίδες σας ως εξής:

Στη συνέχεια, χρησιμοποιήστε αυτόν τον κωδικό για τον πίνακα αποστολέα:

κενόςεγκατάσταση(){
Κατα συρροη.αρχίζουν(9600);
}

κενόςβρόχος(){
// Στείλτε ένα μήνυμα σε σειρά κάθε δευτερόλεπτο
Κατα συρροη.println("Γεια από τον πίνακα αποστολέα!");
καθυστέρηση(1000);
}

Κωδικός για την πλακέτα δέκτη:

κενόςεγκατάσταση(){
Κατα συρροη.αρχίζουν(9600);
}

κενόςβρόχος(){
// Ελέγξτε εάν υπάρχουν εισερχόμενα δεδομένα
αν (Κατα συρροη.διαθέσιμος() > 0) {
// Διαβάστε τα εισερχόμενα δεδομένα και εκτυπώστε τα στη σειριακή οθόνη
Σειρά εισερχόμενα δεδομένα = Κατα συρροη.readString();
Κατα συρροη.println(εισερχόμενα δεδομένα)·
}
}

Το Arduino Uno λειτουργεί σε λογικό επίπεδο 5V ενώ η θύρα RS232 ενός υπολογιστή χρησιμοποιεί λογικό επίπεδο +/-12V.

Η απευθείας σύνδεση ενός Arduino Uno σε μια θύρα RS232 μπορεί και θα καταστρέψει την πλακέτα σας.

I2C (Inter-Integrated Circuit)

Το I2C είναι ένα πρωτόκολλο σύγχρονης σειριακής επικοινωνίας που επιτρέπει την επικοινωνία μεταξύ πολλαπλών συσκευών χρησιμοποιώντας μόνο δύο καλώδια: SDA (Σειριακά δεδομένα) και SCL (Σειριακό ρολόι). Το I2C χρησιμοποιείται συνήθως για επικοινωνία με αισθητήρες, EEPROM και άλλες συσκευές που χρειάζονται μεταφορά δεδομένων σε μικρές αποστάσεις.

Οι ακίδες I2C στο Arduino Uno είναι SDA (A4) και SCL (A5).

Θα δημιουργήσουμε ένα απλό πρόγραμμα για να δημιουργήσουμε μια σύνδεση μεταξύ δύο πλακών Arduino χρησιμοποιώντας επικοινωνία I2C. Αλλά πρώτα, συνδέστε τις σανίδες σας ως εξής:

Κωδικός για την κύρια πλακέτα:

#περιλαμβάνω
κενόςεγκατάσταση(){
Σύρμα.αρχίζουν(); // εγγραφείτε στο δίαυλο I2C ως κύριος
Κατα συρροη.αρχίζουν(9600);
}

κενόςβρόχος(){
Σύρμα.έναρξηΜετάδοσης(9); // μετάδοση σε εξαρτημένη συσκευή με διεύθυνση 9
Σύρμα.γράφω('ένα'); // στέλνει "a" byte στη εξαρτημένη συσκευή
Σύρμα.τέλοςΜετάδοση(); // σταμάτημα μετάδοσης

καθυστέρηση(500);
}

Κωδικός για τον πίνακα σκλάβων:

#περιλαμβάνω
κενόςεγκατάσταση(){
Σύρμα.αρχίζουν(9); // συνδεθείτε στο δίαυλο I2C ως slave με διεύθυνση 9
Σύρμα.onΛήψη(receiveEvent);
Κατα συρροη.αρχίζουν(9600);
}

κενόςβρόχος(){
καθυστέρηση(100);
}

κενόςλαμβάνωΕκδήλωση(ενθ byte){
ενώ(Σύρμα.διαθέσιμος()) { // βρόχος σε όλα τα ληφθέντα byte
απανθρακώνω λήφθηκεByte = Σύρμα.ανάγνωση(); // ανάγνωση κάθε byte που λαμβάνεται
Κατα συρροη.println(receivedByte); // Εκτύπωση ληφθέντος byte σε σειριακή οθόνη
}
}

Τι είναι το SoftwareSerial;

Η βιβλιοθήκη Arduino SoftwareSerial αναπτύχθηκε για να μιμηθεί την επικοινωνία UART, επιτρέποντας τη σειριακή επικοινωνία μέσω οποιωνδήποτε δύο ψηφιακών ακίδων σε πλακέτες Arduino. Είναι χρήσιμο όταν το υλικό UART χρησιμοποιείται ήδη από άλλες συσκευές.

Για να ρυθμίσετε το SoftwareSerial, συμπεριλάβετε πρώτα τη βιβλιοθήκη SoftwareSerial στο σκίτσο.

#περιλαμβάνω

Στη συνέχεια, δημιουργήστε μια παρουσία του αντικειμένου SoftwareSerial καθορίζοντας το RX και TX καρφίτσες που θα χρησιμοποιηθούν για επικοινωνία.

SoftwareSerialmySerial(2, 3); // Καρφίτσες RX, TX

Ακολουθεί ένα παράδειγμα κώδικα για το Arduino που δείχνει τη χρήση του SoftwareSerial:

#περιλαμβάνω
SoftwareSerialmySerial(2, 3); // Καρφίτσες RX, TX
κενόςεγκατάσταση(){
Κατα συρροη.αρχίζουν(9600); // εκκίνηση της σειράς υλικού
mySerial.αρχίζουν(9600); // έναρξη soft serial
}

κενόςβρόχος(){
αν (mySerial.διαθέσιμος()) {
Κατα συρροη.γράφω(mySerial.ανάγνωση()); // αποστολή λαμβανόμενων δεδομένων σε σειριακό υλικό
}
αν (Κατα συρροη.διαθέσιμος()) {
mySerial.γράφω(Κατα συρροη.ανάγνωση()); // αποστολή δεδομένων από σειριακή σειρά υλικού σε soft serial
}
}

Η Σειριακή Βιβλιοθήκη

Η σειριακή βιβλιοθήκη είναι ένα ισχυρό εργαλείο στο Arduino που επιτρέπει την επικοινωνία μεταξύ του μικροελεγκτή και ενός υπολογιστή ή άλλων συσκευών μέσω σειριακής σύνδεσης. Μερικές κοινές λειτουργίες περιλαμβάνουν:

Λειτουργία

Περιγραφή

Serial.begin (ταχύτητα)

Αρχικοποιεί τη σειριακή επικοινωνία με καθορισμένο ρυθμό δεδομένων.

Serial.print (δεδομένα)

Στέλνει δεδομένα στη σειριακή θύρα για μετάδοση ως κείμενο ASCII.

Serial.write (δεδομένα)

Στέλνει ακατέργαστα δυαδικά δεδομένα μέσω της σειριακής θύρας.

Serial.available()

Επιστρέφει τον αριθμό των byte που είναι διαθέσιμα για ανάγνωση από το σειριακό buffer.

Serial.flush()

Περιμένει να ολοκληρωθεί η μετάδοση των εξερχόμενων σειριακών δεδομένων πριν συνεχίσει.

Serial.read()

Διαβάζει το πρώτο byte των εισερχόμενων σειριακών δεδομένων και το επιστρέφει ως ακέραιο.

Ρυθμός Baud και Μορφή σειριακών δεδομένων

Ο ρυθμός Baud αναφέρεται στην ταχύτητα με την οποία μεταφέρονται τα δεδομένα μέσω της σειριακής σύνδεσης. Αντιπροσωπεύει τον αριθμό των bit που μεταδίδονται ανά δευτερόλεπτο. Ο ρυθμός baud πρέπει να ρυθμιστεί ο ίδιος και στις συσκευές αποστολέα και δέκτη, διαφορετικά η επικοινωνία μπορεί να αλλοιωθεί ή να μην λειτουργεί καθόλου. Οι συνήθεις ρυθμοί baud για το Arduino περιλαμβάνουν 9600, 19200, 38400 και 115200.

Η μορφή σειριακών δεδομένων αναφέρεται στη δομή των δεδομένων που αποστέλλονται μέσω της σειριακής σύνδεσης. Υπάρχουν τρία κύρια στοιχεία στη μορφή σειριακών δεδομένων: bit έναρξης, bit δεδομένων και bit τερματισμού.

  • Bits δεδομένων: Ο αριθμός των bit που χρησιμοποιούνται για την αναπαράσταση ενός μόνο byte δεδομένων.
  • Ισοτιμία: Ένα προαιρετικό bit που χρησιμοποιείται για τον έλεγχο σφαλμάτων. Μπορεί να οριστεί σε καμία, ζυγή ή περιττή ισοτιμία, ανάλογα με τις απαιτήσεις του καναλιού επικοινωνίας.
  • Stop Bits: Ο αριθμός των bit που χρησιμοποιούνται για να σηματοδοτήσουν το τέλος ενός byte δεδομένων.

Η μορφή δεδομένων πρέπει να είναι η ίδια τόσο στις συσκευές μετάδοσης όσο και στις συσκευές λήψης για να διασφαλιστεί η σωστή επικοινωνία. Ακολουθεί ένα παράδειγμα για το πώς μπορείτε να ορίσετε συγκεκριμένες μορφές δεδομένων:

κενόςεγκατάσταση(){
// Ρύθμιση σειριακής επικοινωνίας με ρυθμό baud 9600, 8 bit δεδομένων, χωρίς ισοτιμία και 1 bit διακοπής
Κατα συρροη.αρχίζουν(9600, SERIAL_8N1);
}

Εδώ, SERIAL_8N1 αντιπροσωπεύει τη μορφή δεδομένων με 8 bits δεδομένων, χωρίς ισοτιμία και 1 σταμάτα λίγο. Άλλες επιλογές όπως π.χ SERIAL_7E1, SERIAL_8O2κ.λπ., μπορούν να χρησιμοποιηθούν ανάλογα με τις συγκεκριμένες απαιτήσεις του έργου.

Σειριακή Ομιλία

Οι πλακέτες Arduino παρέχουν διάφορες επιλογές σειριακής επικοινωνίας που επιτρέπουν την αποτελεσματική και αξιόπιστη ανταλλαγή δεδομένων μεταξύ συσκευών. Κατανοώντας πώς να ρυθμίσετε σειριακά πρωτόκολλα επικοινωνίας στο Arduino IDE, μπορείτε να αξιοποιήσετε τη δύναμη της κατανεμημένης επεξεργασίας ή να μειώσετε σημαντικά τον αριθμό των καλωδίων που χρησιμοποιούνται στα έργα σας.