Πίνακας περιεχομένων:

Σειριακή επικοινωνία Arduino: 5 βήματα
Σειριακή επικοινωνία Arduino: 5 βήματα

Βίντεο: Σειριακή επικοινωνία Arduino: 5 βήματα

Βίντεο: Σειριακή επικοινωνία Arduino: 5 βήματα
Βίντεο: ΟΠΤΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ - μαθήματα Arduino. 03 – breadboad, pushbutton, σειριακή οθόνη , εντολή if 2024, Νοέμβριος
Anonim
Σειριακή επικοινωνία Arduino
Σειριακή επικοινωνία Arduino

Πολλά έργα Arduino βασίζονται στη μετάδοση δεδομένων μεταξύ αρκετών Arduinos.

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

Χωρίς κανένα είδος περιβάλλοντος μέσα στο ρεύμα των byte, είναι σχεδόν αδύνατο να ερμηνευτούν τα δεδομένα. Χωρίς να μπορείτε να ερμηνεύσετε τα δεδομένα, το Arduinos σας δεν θα μπορεί να επικοινωνεί αξιόπιστα. Το κλειδί είναι να προσθέσετε αυτά τα δεδομένα περιβάλλοντος στη ροή byte χρησιμοποιώντας ένα τυπικό σχέδιο σειριακών πακέτων.

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

Εν ολίγοις: αυτό το Instructable θα εξετάσει πώς μπορείτε να εφαρμόσετε εύρωστα σειριακά δεδομένα εύκολα σε οποιοδήποτε έργο χρησιμοποιώντας τη βιβλιοθήκη SerialTransfer.h. Αν θέλετε να μάθετε περισσότερα σχετικά με τη θεωρία χαμηλού επιπέδου για την ισχυρή σειριακή επικοινωνία, δείτε αυτό το σεμινάριο.

Προμήθειες

  • 2 Arduinos

    Ενθαρρύνεται ιδιαίτερα η χρήση Arduinos που διαθέτουν πολλαπλά UARTs υλικού (δηλαδή Arduino Mega)

  • Σύρμα σύνδεσης
  • Εγκαταστήστε το SerialTransfer.h

    Διατίθεται μέσω του Διαχειριστή Βιβλιοθηκών του Arduino IDE

Βήμα 1: Φυσικές συνδέσεις

Φυσικές συνδέσεις
Φυσικές συνδέσεις

Όταν χρησιμοποιείτε σειριακή επικοινωνία, πρέπει να λάβετε υπόψη μερικά σημεία καλωδίωσης:

  • Βεβαιωθείτε ότι όλες οι βάσεις είναι συνδεδεμένες!
  • Η καρφίτσα Arduino TX (Transmit) πρέπει να συνδεθεί με την άλλη καρφίτσα RX (Receive) του Arduino

Βήμα 2: Πώς να χρησιμοποιήσετε τη βιβλιοθήκη

Πώς να χρησιμοποιήσετε τη βιβλιοθήκη
Πώς να χρησιμοποιήσετε τη βιβλιοθήκη

Το SerialTransfer.h σάς επιτρέπει να στέλνετε εύκολα μεγάλες ποσότητες δεδομένων χρησιμοποιώντας ένα προσαρμοσμένο πρωτόκολλο πακέτων. Παρακάτω είναι μια περιγραφή όλων των δυνατοτήτων της βιβλιοθήκης - πολλές από τις οποίες θα χρησιμοποιήσουμε αργότερα σε αυτό το σεμινάριο:

SerialTransfer.txBuff

Πρόκειται για έναν πίνακα byte όπου όλα τα δεδομένα ωφέλιμου φορτίου που θα αποσταλούν μέσω σειριακής μνήμης αποθηκεύονται πριν από τη μετάδοση. Μπορείτε να γεμίσετε αυτό το buffer με byte δεδομένων για αποστολή σε άλλο Arduino.

SerialTransfer.rxBuff

Αυτός είναι ένας πίνακας byte όπου όλα τα δεδομένα ωφέλιμου φορτίου που λαμβάνονται από το άλλο Arduino είναι προσωρινά αποθηκευμένα.

SerialTransfer.bytesRead

Ο αριθμός των byte ωφέλιμου φορτίου που έλαβε το άλλο Arduino και αποθηκεύτηκε στο SerialTransfer.rxBuff

SerialTransfer.begin (Ροή & _port)

Αρχικοποιεί ένα παράδειγμα της τάξης της βιβλιοθήκης. Μπορείτε να περάσετε οποιοδήποτε αντικείμενο κλάσης "Serial" ως παράμετρο - ακόμη και αντικείμενα κλάσης "SoftwareSerial"!

SerialTransfer.sendData (const uint16_t & messageLen)

Αυτό κάνει το Arduino να στέλνει αριθμό "by messageLen" byte στο buffer μετάδοσης στο άλλο Arduino. Για παράδειγμα, εάν το "messageLen" είναι 4, τα πρώτα 4 byte του SerialTransfer.txBuff θα σταλούν μέσω σειριακού στο άλλο Arduino.

SerialTransfer.available ()

Αυτό κάνει το Arduino σας να αναλύσει τυχόν ληφθέντα σειριακά δεδομένα από το άλλο Arduino. Εάν αυτή η συνάρτηση επιστρέψει το boolean "true", σημαίνει ότι ένα νέο πακέτο έχει αναλυθεί επιτυχώς και τα δεδομένα του πακέτου που έχουν ληφθεί πρόσφατα αποθηκεύονται/διατίθενται στο SerialTransfer.rxBuff.

SerialTransfer.txObj (const T & val, const uint16_t & len, const uint16_t & index = 0)

Συμπληρώνει "len" αριθμό byte ενός αυθαίρετου αντικειμένου (byte, int, float, double, struct, κ.λπ.) στο buffer μετάδοσης ξεκινώντας από το ευρετήριο όπως καθορίζεται από το επιχείρημα "index".

SerialTransfer.rxObj (const T & val, const uint16_t & len, const uint16_t & index = 0)

Διαβάζει "len" αριθμό byte από το buffer λήψης (rxBuff) ξεκινώντας από το ευρετήριο όπως καθορίζεται από το όρισμα "index" σε ένα αυθαίρετο αντικείμενο (byte, int, float, double, struct, κλπ …).

ΣΗΜΕΙΩΣΗ:

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

Βήμα 3: Διαβίβαση βασικών δεδομένων

Το παρακάτω σκίτσο μεταδίδει τόσο την τιμή ADC του analogRead (0) όσο και την τιμή του analogRead (0) που μετατράπηκε σε τάση στο Arduino #2.

Ανεβάστε το ακόλουθο σκίτσο στο Arduino #1:

#include "SerialTransfer.h"

SerialTransfer myTransfer? struct STRUCT {uint16_t adcVal; τάση πλωτήρα? } δεδομένα; void setup () {Serial.begin (115200); Serial1.begin (115200); myTransfer.begin (Serial1); } void loop () {data.adcVal = analogRead (0); data.voltage = (data.adcVal * 5.0) / 1023.0; myTransfer.txObj (δεδομένα, μέγεθος (δεδομένα)); myTransfer.sendData (μέγεθος (δεδομένα)); καθυστέρηση (100)? }

Βήμα 4: Λήψη βασικών δεδομένων

Ο παρακάτω κώδικας εκτυπώνει τις τιμές ADC και τάσης που λαμβάνονται από το Arduino #1.

Ανεβάστε τον ακόλουθο κώδικα στο Arduino #2:

#include "SerialTransfer.h"

SerialTransfer myTransfer? struct STRUCT {uint16_t adcVal; τάση πλωτήρα? } δεδομένα; void setup () {Serial.begin (115200); Serial1.begin (115200); myTransfer.begin (Serial1); } void loop () {if (myTransfer.available ()) {myTransfer.rxObj (data, sizeof (data)); Serial.print (data.adcVal); Serial.print (''); Serial.println (data.voltage); Serial.println (); } else if (myTransfer.status <0) {Serial.print ("ERROR:"); if (myTransfer.status == -1) Serial.println (F ("CRC_ERROR")); else if (myTransfer.status == -2) Serial.println (F ("PAYLOAD_ERROR")); else if (myTransfer.status == -3) Serial.println (F ("STOP_BYTE_ERROR")); }}

Βήμα 5: Δοκιμή

Αφού μεταφορτωθούν και τα δύο σκίτσα στο αντίστοιχο Arduinos, μπορείτε να χρησιμοποιήσετε το Serial Monitor στο Arduino #2 για να επαληθεύσετε ότι λαμβάνετε δεδομένα από το Arduino #1!

Συνιστάται: