Ble συσκευή με αισθητήρες mems; – εύκολο, με το πακέτο λογισμικού bluemicrosystem1. Μητρικές πλακέτες STM32 Nucleo

Πριν από ένα χρόνο περίπου το παρήγγειλα στο Ali μονάδα bluetooth HC-05. Εκείνη την εποχή δεν ήξερα γιατί μπορεί να το χρειαζόμουν, αλλά ασύρματες τεχνολογίεςμου έγνεψε με το μυστήριο τους.
Κατά τη στιγμή της παραγγελίας, μια ολόκληρη σειρά μονάδων bluetooth από HC-03 έως HC-09 παρουσιάστηκε στην αγορά, αλλά ορισμένες από αυτές μπορούν να λειτουργήσουν και σε οποιαδήποτε λειτουργία κύριος(HC-04-M), ή σε λειτουργία δούλος (HC-06-S), ΕΝΑ HC-05μπορεί να λειτουργήσει και στις δύο λειτουργίες, οπότε η επιλογή έπεσε πάνω του.

Ας ρίξουμε μια γρήγορη ματιά στα χαρακτηριστικά του:

  • Τσιπ Bluetooth – BC417143 που κατασκευάζεται από εταιρεία CSR.
  • πρωτόκολλο επικοινωνίας – Προδιαγραφή Bluetooth v2.0+EDR;
  • εύρος δράσης - έως 10 μέτρα, στο διαμέρισμά μου πιάνει μέσα από 2 τοίχους από σκυρόδεμα.
  • συμβατό με όλους τους προσαρμογείς Bluetooth που υποστηρίζουν SPP.
  • Χωρητικότητα μνήμης flash (για αποθήκευση υλικολογισμικού και ρυθμίσεων) – 8 Mbit.
  • συχνότητα ραδιοφωνικού σήματος – 2,40 .. 2,48 GHz;
  • διεπαφή κεντρικού υπολογιστή – USB 1.1/2.0 ή UART.
  • κατανάλωση ρεύματος – το ρεύμα κατά την επικοινωνία είναι 30–40 mA. Η μέση τιμή ρεύματος είναι περίπου 25 mA. Αφού δημιουργηθεί η επικοινωνία, η κατανάλωση ρεύματος είναι 8 mA. Δεν υπάρχει λειτουργία ύπνου.
Συνήθως, οι μονάδες DIY πωλούνται ως δύο συγκολλημένες σανίδες, η μικρότερη από τις οποίες είναι η ίδια μονάδα bluetooth, μεγάλο - ένας προσαρμογέας στον οποίο βρίσκεται ο σταθεροποιητής και η άλλη πλεξούδα, που σας επιτρέπει να χρησιμοποιήσετε τη μονάδα για DIY.

Σημείωση ενότητας DIY:

  • VCC – Τροφοδοτικό +5V
  • GND – γείωση
  • TXD, RXD – συμπεράσματα Διεπαφή UARTγια επικοινωνία με τον ΜΚ.
  • KEY – pin για είσοδο σε λειτουργία εντολής AT
  • LED – μπορείτε να συνδέσετε μια λυχνία LED με μια αντίσταση περιορισμού ρεύματος, εάν δημιουργηθεί σύνδεση μεταξύ των μονάδων, η λυχνία LED θα ανάψει.
Αμέσως μετά την άφιξη της ενότητας, προσπάθησα να την εκκινήσω, αλλά η προσπάθεια ήταν ανεπιτυχής. Ως εκ τούτου, αποφασίστηκε να αφαιρεθεί το θερμοσυστελλόμενο και να συγκολληθεί. Μετά τη συγκόλληση, η μονάδα άρχισε να λειτουργεί, αλλά μετά την τοποθέτηση της θερμικής συρρίκνωσης σταμάτησε να λειτουργεί ξανά. Νομίζω ότι οι αναγνώστες έχουν ήδη μαντέψει ότι ο λόγος για αυτό ήταν η συρρίκνωση της θερμότητας στην κεραία. Το πρόβλημα λύθηκε αφαιρώντας τη θερμική συρρίκνωση από την κεραία.

Για να ελέγξετε τη μονάδα που χρειάζεστε:

  • τάισέ τον
  • συνδέστε την έξοδο txμε έξοδο rxπροσαρμογέας usb-uart
  • κατεβάστε το πρόγραμμα Terminal v1.9b από την Bray
  • δημιουργήστε μια σύνδεση με τον προσαρμογέα usb-uartσε ταχύτητα 9600. Αυτή η ταχύτητα έχει οριστεί από προεπιλογή σε bluetoothμονάδα μέτρησης.

Εάν το πρόγραμμα δεν βλέπει τον προσαρμογέα, τότε πιθανότατα του έχει εκχωρηθεί ένας αριθμός θύρα com πάνω από 10, μπορείτε να το αλλάξετε στη διαχείριση συσκευών. Μετά από αυτούς τους χειρισμούς, μπορούμε να λάβουμε και να στείλουμε δεδομένα μέσω bluetoothαπό υπολογιστή.

Τώρα πρέπει να διαμορφώσετε μια δεύτερη συσκευή για ανταλλαγή δεδομένων, μια τέτοια συσκευή μπορεί να είναι τηλέφωνο, φορητός υπολογιστής ή tablet. Η επιλογή έπεσε σε ένα tablet με λειτουργικό σύστημα Android, στη συνέχεια θα περιγράψω πώς να το ρυθμίσετε ώστε να ανταλλάσσει δεδομένα μέσω bluetooth.
Για την εργασία μας κατεβάζουμε Με αγορά παιχνιδιού εφαρμογή τερματικό bluetoothαπό το Qwerty και εγκαταστήστε το. Ανάβω bluetoothκαι αναζητήστε τη μονάδα μας ανάμεσα στις συσκευές.




Προσπαθούμε να συνδεθούμε σε αυτό, όταν σας ζητηθεί κωδικός πρόσβασης, πληκτρολογήστε 1234. Αφού δημιουργήσουμε μια σύνδεση με τη μονάδα, οι χαρακτήρες που θα στείλουμε από το τερματικό του tablet θα εμφανιστούν στο τερματικό του υπολογιστή.

Αφού βεβαιωθείτε ότι η μονάδα λειτουργεί, συνδέστε την Atmega16και έγραψε ένα πρόγραμμα που, με τη λήψη ορισμένων χαρακτήρων, θα εκτελέσει ορισμένες ενέργειες, για παράδειγμα, θα ανάψει ένα LED.
#define F_CPU 8000000UL #include #περιλαμβάνω ISR(USART_RXC_vect) (διακόπτης(UDR) (περίπτωση "f": //εδώ μπορείτε να ανάψετε το διακόπτη LED; περίπτωση "r": //και μετά να το απενεργοποιήσετε; ) ) int main(void) ( DDRD &= ~(1<<0); //rx на вход DDRD |= (1<<1); //tx на выход //разрешаем прием, передачу, прерывание по приёму UCSRB = (1<Αφού άναψα το LED αρκετές φορές, συνειδητοποίησα ότι θα ήταν πολύ πιο βολικό να μην κάνετε κλικ στο πληκτρολόγιο στο τερματικό, αλλά να δημιουργήσετε μια πρωτόγονη διεπαφή στο tablet για την αποστολή εντολών. Δεν έχω σχεδόν καμία εμπειρία στον προγραμματισμό για Android, αλλά κατάφερα να δημιουργήσω μια διεπαφή. Μπορείτε να δείτε το αποτέλεσμα στο

Σήμερα θα δοκιμάσουμε τις ήδη ευρέως χρησιμοποιούμενες μονάδες Bluetooth HC-04. Νομίζω ότι δεν θα κάνω λάθος αν πω ότι έγιναν ευρέως διαδεδομένα χάρη στους Κινέζους φίλους μας, τη χαμηλή τιμή και τη δωρεάν παράδοση με το Dealextreme)))

Στην απλούστερη περίπτωση, η μονάδα είναι μια γέφυρα Bluetooth-RS232: όσα byte στάλθηκαν στην είσοδο μεταδίδονταν μέσω του ραδιοφωνικού καναλιού - στην πραγματικότητα, μια επέκταση θύρας ραδιοφώνου, όλα είναι πολύ απλά και ενσωματώνονται εύκολα σε υπάρχοντα συστήματα με RS232.

Γενικά, αυτές οι μονάδες έχουν πολλά ονόματα (τουλάχιστον μπορούν να βρεθούν στην πώληση με διαφορετικά ονόματα): HC-04, HC-05, BC04, BC05, BC06, RF-BT0417C, BT0417 και πολλά άλλα. Ωστόσο, ο πυρήνας παραμένει κοινός σε όλα, δηλαδή στον μικροελεγκτή BC417143B από το Cambridge Silicon Radio (CSR). Αυτή η λύση ονομάζεται BlueCore4 και όλα τα modules που βασίζονται σε αυτό μοιάζουν ακόμη και στην εμφάνιση, αφού προφανώς βασίζονται σε ένα σχέδιο αναφοράς. Εξέτασα πολλές φωτογραφίες μονάδων, οι διαφορές είναι ελάχιστες: μια ελαφρώς διαφορετική διάταξη χαλαζία και 1-2 παθητικά εξαρτήματα, ένα διαφορετικό τυπικό μέγεθος οποιουδήποτε στοιχείου - όχι περισσότερο.

Το ίδιο το BC417143B έχει ένα αρκετά πλούσιο σύνολο διεπαφών και δυνατοτήτων:

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

Η Dealextreme μου έστειλε μια ντουζίνα από αυτές τις μη επισημασμένες ενότητες:

Διαστάσεις - 27x13mm, το κομμάτι σιδήρου τροφοδοτείται από 3,3V, καταναλώνει έως και 30mA κατά την εγκατάσταση σύνδεσης και περίπου 8mA υπό σταθερές συνθήκες σύνδεσης. Υποστηρίζει Bluetooth 2.0. Μπορεί να λειτουργήσει σε δύο λειτουργίες: εντολές AT (για ρύθμιση παραμέτρων και έλεγχο) και μετάδοση δεδομένων (απλά μεταδίδει ανόητα όλα όσα λαμβάνει μέσω της σειριακής διεπαφής), η εναλλαγή μεταξύ των λειτουργιών είναι hardware (ανάλογα με την κατάσταση ενός συγκεκριμένου σκέλους της μονάδας. UART ταχύτητα a από το τυπικό εύρος 1200 – 115200, που έχει ρυθμιστεί χρησιμοποιώντας εντολές AT (προεπιλογή – 9600 8N1).

Ο σκοπός των ακίδων είναι ο εξής:

Ή υπάρχει αυτή η όμορφη εικόνα:

Στην απλούστερη περίπτωση, το μόνο που χρειάζεται να κάνετε είναι να συνδέσετε το τροφοδοτικό και τις ακίδες Rx-Tx - αυτό είναι, μπορείτε να επικοινωνήσετε με τη συσκευή.

Η μονάδα τίθεται σε λειτουργία εντολών AT τραβώντας την ακίδα PIO11 στην τροφοδοσία και στη συνέχεια επαναφέροντάς την στη λειτουργία μεταφοράς δεδομένων, αυτή η ακίδα είναι γειωμένη ή κρέμεται στον αέρα.

Στην πραγματικότητα, αυτή η ενότητα δεν μπορεί να κάνει σχεδόν τίποτα, οι εντολές περιορίζονται στο ελάχιστο σύνολο (όλες οι εντολές τελειώνουν με την αποστολή των χαρακτήρων 0x0D και 0x0A):

AT – απάντηση ΟΚ

AT+BAUDx, όπου (x = 1..8, που αντιστοιχεί στην ταχύτητα 1200..115200) – ρύθμιση της ταχύτητας διεπαφής, απάντηση – OKxxx, όπου xxx – ρύθμιση ταχύτητας

AT+NAMEΌνομα – ορίστε το όνομα της μονάδας, την απάντηση – OKname

AT+PINxxxx – ορίστε έναν κωδικό PIN για σύνδεση xxxxx, απόκριση – OKxxxxx

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

Επιλογές; Αναβοσβήνει, τι άλλο... Αλλά πρώτα θα φτιάξουμε πολλές σανίδες για ευκολία στην εργασία με τη μονάδα.

Επιλογή 1

Διάγραμμα πίνακα στην εικόνα:

Υπάρχει ένας γραμμικός σταθεροποιητής για την τροφοδοσία της μονάδας στα 3,3 V, όλες οι ακίδες είναι συνδεδεμένες σε ακροδέκτες, έχουν προστεθεί αρκετές λυχνίες LED κατάστασης (τη στιγμή της κατασκευής της πλακέτας, δεν ήξερα ακόμη πώς θα λειτουργούσε πραγματικά, γι 'αυτό προσπάθησα να ληφθούν υπόψη όλα τα χειριστήρια και οι ενδείξεις που είδα σε διάφορα σχήματα σύνδεσης μονάδων - εξ ου και η αφθονία στο διάγραμμα).

Όταν συναρμολογηθεί μοιάζει με αυτό:

Αφού (κοιτάζοντας μπροστά) η ενότητα αναβοσβήνει ξανά, έγινε μια πλακέτα σύμφωνα με τη δεύτερη επιλογή:

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

Στο πίσω μέρος της πλακέτας είναι τα κυκλώματα τροφοδοσίας και εξωτερικής επαναφοράς, όλα τα άλλα είναι από πάνω.

Η επιλογή Νο. 3 έγινε πρακτικά σύμφωνα με το ίδιο σχήμα:

Το όλο θέμα εδώ είναι ότι αυτή η πλακέτα έχει σχεδιαστεί για να αντικαταστήσει τις μονάδες MaxStream Xbee και XbeePro (αυτή είναι η ZigBee, τις χρησιμοποιώ επίσης μερικές φορές) και είναι συμβατή με αυτές όσον αφορά τις ακίδες:

Όπως αποδείχθηκε αργότερα, τέτοια φουλάρια ήδη παράγονται μαζικά...

Τώρα σχετικά με το φλας της μονάδας. Πολλοί αναγνώστες, είμαι σίγουρος, παρατήρησαν ότι σε όλες τις πλακέτες διατήρησα τη διεπαφή SPI της μονάδας: μέσω αυτής εγκαθίσταται το υλικολογισμικό. Χρειάζεστε έναν απλό προγραμματιστή για τη θύρα LPT του υπολογιστή σας, σχεδόν 5 καλώδια για το AVR:

Ουσιαστικά, πρόκειται απλώς για αντιστοίχιση επιπέδου μεταξύ μιας μονάδας 5V LPT και μιας μονάδας 3,3V.

Όταν συναρμολογηθεί μοιάζει με αυτό:

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

Όλοι οι χειρισμοί εκτελούνται υπό τον έλεγχο του Casira BlueSuite ή του Casira BlueLab. Από όσο καταλαβαίνω, πρόκειται για εξελίξεις απευθείας από την ΕΚΕ και προηγουμένως σας επέτρεπαν να εγγραφείτε στον ιστότοπό τους, μετά από την οποία μπορούσατε να κατεβάσετε αυτό το λογισμικό και κάθε είδους παραδείγματα, έτοιμο υλικολογισμικό κ.λπ. λύσεις για τα προϊόντα τους. Ωστόσο, αυτή τη στιγμή, προφανώς, αυτό έχει σταματήσει να λειτουργεί (τουλάχιστον για τη Ρωσία, αλλά αν κάποιος τα καταφέρει, ας με ενημερώσει). Ωστόσο, πολλά πράγματα παραμένουν στο Διαδίκτυο, οπότε με λίγη προσπάθεια μπορούν να βρεθούν τα πάντα. Μόλις πρόσφατα απέκτησα το BlueLab και δεν το έχω δοκιμάσει ακόμα, αλλά είναι ένα ολόκληρο περιβάλλον για την ανάπτυξη των δικών σας εφαρμογών, καθώς και τεκμηρίωση και παραδείγματα, οπότε υπάρχουν πολλά να εξερευνήσετε εκεί αν θέλετε. Αλλά μετά την εγκατάσταση του BlueSuite, εμφανίζονται πολλά από όλα τα είδη βοηθητικών προγραμμάτων στον υπολογιστή σας, σχεδιασμένα να λειτουργούν, συμπεριλαμβανομένου του ασθενούς μας. Επομένως, συνδέουμε τη μονάδα με τον προγραμματιστή, τον προγραμματιστή με τον υπολογιστή, τροφοδοτούμε τη μονάδα με ρεύμα, χωρίς να ξεχνάμε να διασφαλίσουμε προσεκτικά ότι τα εδάφη είναι συνδεδεμένα... Διαφορετικά, ποτέ δεν ξέρεις;)

Το Blue Flash προορίζεται απευθείας για υλικολογισμικό:

Μετά την εκκίνηση, επιλέξτε τη μέθοδο σύνδεσης με τη μονάδα (LPT1) και τοποθετήστε το δείκτη στο αρχείο υλικολογισμικού. Όπως έχει γίνει ήδη σαφές, θα αναβοσβήνουμε κάτι που ονομάζεται "HC-05".

Μετά από αυτό, κάντε κλικ στο "Διακοπή επεξεργαστή" (μην ανησυχείτε, πρόκειται για τη μονάδα και όχι για τον αγαπημένο σας υπολογιστή)), τα υπόλοιπα κουμπιά γίνονται ενεργά:

Θα συνιστούσα να αποθηκεύσετε το υπάρχον υλικολογισμικό μέσω του "Dump" για κάθε ενδεχόμενο, αν και αυτό δεν είναι απαραίτητο κατ' αρχήν... Λοιπόν, κάντε κλικ στο "Λήψη" και σε λίγα λεπτά θα έχουμε μια εντελώς διαφορετική συσκευή. Φυσικά, μπορείτε επίσης να κάνετε κλικ στο "Επαλήθευση" για να βεβαιωθείτε ότι όλα είναι καλά.

Τώρα ας ξεκινήσουμε το PSTool.

Πρώτα απ 'όλα, πρέπει να καθορίσετε τη μέθοδο σύνδεσης της μονάδας:

Ανοίγει το κύριο παράθυρο:

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

Θα πρέπει να αλλάξετε αμέσως τη διεύθυνση της συσκευής:

Αφού εγκατασταθεί το υλικολογισμικό, είναι το ίδιο για όλες τις συσκευές, επομένως εάν θέλετε να συνδεθείτε σε μια συγκεκριμένη μονάδα, μπορεί να προκύψει παρεξήγηση. Συνιστώ λοιπόν να το αλλάξετε σε κάτι περισσότερο ή λιγότερο σημαντικό (ακόμα και την ώρα και την ημερομηνία που αναβοσβήνει) σε δεκαεξαδική μορφή και να το γράψετε απευθείας στη μονάδα (κολλήστε μια ετικέτα ή κάτι άλλο) - θα είναι πιο βολικό.

Τώρα, μόνο για διασκέδαση, μπορείτε να εκτελέσετε το BlueTest3. Και πάλι, επιλέξτε τη μέθοδο σύνδεσης:

Και φτάνουμε στο κεντρικό παράθυρο:

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

Για ποιο λόγο ήταν όλα αυτά; Ως αποτέλεσμα, λάβαμε ένα πολύ διευρυμένο σύνολο εντολών AT. Τώρα μπορείτε να σαρώσετε τα ραδιοκύματα, να ορίσετε αξιόπιστες συσκευές, να αλλάξετε την κατηγορία της μονάδας και πολλά άλλα. Μία από τις πιο χρήσιμες ιδιότητες που αποκτήθηκαν είναι η δυνατότητα ρύθμισης παραμέτρων της μονάδας σε λειτουργία κύριας λειτουργίας. Εκείνοι. Τώρα, έχοντας δύο τέτοιες μονάδες, μπορείτε να δημιουργήσετε μια πλήρη ραδιογέφυρα χωρίς τη συμμετοχή τρίτου μέρους. Μπορείτε να βρείτε μια πλήρη περιγραφή των εντολών στο φύλλο δεδομένων για τη λειτουργική μονάδα, που είναι διαθέσιμο στο τέλος του άρθρου.

Μία επιφύλαξη. Αυτή τη στιγμή έχω αναβοσβήνει 4 μονάδες και αφού αναβοσβήνει η ταχύτητα της σειριακής διεπαφής για κάποιο λόγο πήρε μια τυχαία τιμή: για κάποιους ήταν 9600, για κάποιο άλλο - 115200. Οι λόγοι για το φαινόμενο δεν είναι ξεκάθαροι για μένα, αλλά μετά κατάλληλη ρύθμιση με εντολές AT όλα επιστρέφουν στο κανονικό κανάλι Ναι, στη λειτουργία εντολών η ταχύτητα διεπαφής είναι 38400.

Γενικά, συγκεντρώσαμε μερικές σανίδες, μάθαμε πώς να δημιουργήσουμε μια σύνδεση, στείλαμε τα κομμάτια πέρα ​​δώθε στον αέρα - όλα έμοιαζαν να λειτουργούν, σταθερά, η εμβέλεια στον αέρα είναι έως 20 μέτρα, διεισδύει σε τσιμεντένιο τοίχο, λειτουργεί εντός του διαμερίσματος. Τώρα θέλω να κάνω κάτι περισσότερο ή λιγότερο ουσιαστικό.

Για πολύ καιρό είχα την ιδέα να φτιάξω ένα είδος συστήματος συγχρονισμού χρόνου για πολλά ρολόγια σπιτιού σε διαφορετικά δωμάτια (το DS1307, φυσικά, είναι αρκετά ακριβές από μόνο του, και άλλα τσιπ RTC επίσης, αλλά χαλαζία και άλλα Οι συνιστώσες του ρολογιού εξακολουθούν να οδηγούν σε κάποια φυγή στο επίπεδο των 10-15 δευτερολέπτων/μήνα: όχι κρίσιμα, αλλά κάπως ατημέλητα). Αυτό είναι αρκετά εφικτό σε τέτοιες ενότητες, οπότε γιατί όχι; Επομένως, πρέπει να εγκαταστήσουμε μια μονάδα σε κάθε ρολόι στην οποία θέλουμε να αλλάξουμε την ώρα, καθώς και κάποιο είδος ακριβούς πομπού ώρας. Ως τέτοιος πομπός, είναι πολύ λογικό να χρησιμοποιείτε έναν υπολογιστή με συγχρονισμό χρόνου από το Δίκτυο (φυσικά, όχι ατομικό πρότυπο, καλά, τελικά, δεν προσπαθούμε για βιομηχανία ακριβείας σε αυτήν την περίπτωση). Κατ 'αρχήν, κάποιο είδος USB dongle θα ήταν αρκετά κατάλληλο ως πομπός, αλλά δεν είχα (και εκτός αυτού, ήθελα να ασχοληθώ με το STM32, που ήταν νέο για μένα, και να δοκιμάσω κάποιες άλλες λύσεις), οπότε αυτό γεννήθηκε το σχέδιο:

Η ουσία είναι η εξής: ο μικροελεγκτής STM32F100C4T6 κοιτάζει μέσα από ένα από τα UART του μέσω του μετατροπέα διασύνδεσης στο USB του υπολογιστή και το άλλο στη μονάδα Bluetooth. Επιπλέον, υπάρχουν μια δέσμη ενδεικτικών LED και πολλά κουμπιά (δεν χρησιμοποιούνται). Είναι επίσης δυνατή η αναγκαστική επαναφορά της μονάδας και η θέση της σε λειτουργία εντολών/δεδομένων - οι αντίστοιχες ακίδες συνδέονται στον μικροελεγκτή.

Το Atmega8 με εφαρμογή λογισμικού USB χρησιμοποιείται ως μετατροπέας USB-RS232. Για να είμαι ειλικρινής, δεν θυμάμαι από πού κατέβασα αυτήν τη λύση, αλλά όλες οι πηγές είναι διαθέσιμες στο τέλος του άρθρου (αυτό το κύκλωμα βρίσκεται στη βίδα εδώ και πολύ καιρό, ακόμα δεν έχω καταλήξει δοκιμάζοντας πώς λειτουργεί). Φυσικά, η λύση είναι περιττή, αλλά ήταν απλώς ενδιαφέρουσα. Δεν είναι απαραίτητο να χρησιμοποιήσετε μόνο έναν τέτοιο προσαρμογέα εξετάζονται. Οι ταχύτητες ανταλλαγής μεταξύ του υπολογιστή, του μικροελεγκτή και της μονάδας είναι ίσες και ανέρχονται σε 38400 kbit/s. Αυτό που μου αρέσει στα STM είναι η ευελιξία του συστήματος χρονισμού: εγκατέστησα τον χαλαζία στα 4,433619 MHz (αγόρασα 1000 τμχ φθηνά περιστασιακά, τώρα το χρησιμοποιώ)), η συχνότητα του ρολογιού πυρήνα είναι 26,601714 MHz, αλλά οποιαδήποτε τυπική ανταλλαγή τα ποσοστά μπορούν να ληφθούν πολύ εύκολα UART.

Το όλο πράγμα είναι συσκευασμένο σε πλαστική θήκη BOX-KC01:

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

Δεν εγκατέστησα υποδοχή USB: δεν έχω αρκετό miniUSB και υπάρχουν πολλές ουρές με αρσενικό USB-A στο τέλος και είναι δωρεάν – μόλις κόλλησα ένα καλώδιο μήκους περίπου ενός μέτρου στο σανίδα.

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

Αφού συνδέσετε τη συσκευή στον υπολογιστή, θα εντοπιστεί μια νέα συσκευή και θα πρέπει να εγκαταστήσετε το πρόγραμμα οδήγησης με τη μορφή αρχείου inf. Μετά από αυτό, μια νέα εικονική θύρα COM θα εμφανιστεί στο σύστημα, με την οποία μπορείτε να εργαστείτε χρησιμοποιώντας τυπικά εργαλεία. Για να είμαστε συγκεκριμένοι, θα ονομάσουμε το κουτί μας ελεγκτή.

Έτσι, ο ελεγκτής μπορεί επίσης να λειτουργεί σε δύο λειτουργίες - λειτουργία εντολής και λειτουργία μεταφοράς δεδομένων.

Ανεξάρτητα από τον τρόπο λειτουργίας, ό,τι εμφανίζεται στην έξοδο της μονάδας BT (εννοώ τη σειριακή της διεπαφή, φυσικά) μεταδίδεται στον υπολογιστή. Προφανώς, στη λειτουργία μεταφοράς δεδομένων του ελεγκτή, ό,τι μεταδίδεται από τον υπολογιστή στον ελεγκτή καταλήγει στην είσοδο της μονάδας BT και μετά στον αέρα. Η μετάβαση από τη λειτουργία δεδομένων στη λειτουργία εντολών πραγματοποιείται εάν ο ελεγκτής λάβει μια ακολουθία τριών χαρακτήρων «+» στη σειρά.

Οι ακόλουθες εντολές υποστηρίζονται σε αυτήν τη λειτουργία (όλες με λατινικούς χαρακτήρες):

"c0" - αλλάζει τον ελεγκτή σε λειτουργία δεδομένων, επιστρέφει το "Data Mode OK"

"c1" - επαναφέρετε τη μονάδα VT, επιστρέφει "VT Reset OK"

"c2" - αλλάζει τη μονάδα BT σε λειτουργία εντολών, επιστρέφει "BT Command Mode OK"

"c3" - αλλάζει τη μονάδα BT σε λειτουργία δεδομένων, επιστρέφει τη λειτουργία "BT Data Mode OK"

"c4" - επαναφέρετε τις ρυθμίσεις της μονάδας BT, επιστρέφει το "BT Reinit Completed"

"с5ххххххххххх" - ο ορισμός μιας νέας δευτερεύουσας διεύθυνσης (χχχχχχχχχχχ είναι η ίδια η διεύθυνση), επιστρέφει "Ολοκληρώθηκε η ρύθμιση της νέας διεύθυνσης σύνδεσης"

"c6" - κατάσταση σύνδεσης σύμφωνα με την κατάσταση της λυχνίας LED κατάστασης της μονάδας BT, επιστρέφει το "Connection Passed" ή "Connection Failed"

"c9" - επαναφορά ελεγκτή, επιστρέφει "MCU Reset..."

Ακολουθεί ένα στιγμιότυπο οθόνης της επικοινωνίας με τον ελεγκτή:

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

Μετά από αυτό, η μονάδα VT δημιουργεί μια σύνδεση με τη συσκευή με την οποία δούλεψε τελευταία πριν την απενεργοποίηση.

Οι λυχνίες LED εμφανίζουν τη ροή δεδομένων μέσω της σειριακής διεπαφής της μονάδας BT και τη σύνδεση με τον υπολογιστή (Rx και Tx), την κατάσταση της μονάδας BT (Stat, βλ. φύλλο δεδομένων), την κατάσταση σύνδεσης (Conn) και την κατάσταση του ελεγκτή ( Λειτουργία Contr.

Χρησιμοποιώντας τον ελεγκτή, μπορείτε να εργαστείτε με πλήρη διαφάνεια με τη μονάδα VT, να την ελέγχετε με εντολές AT και να διεξάγετε κάθε είδους πειράματα χρησιμοποιώντας οποιοδήποτε τερματικό πρόγραμμα.

Για να συγχρονίσετε απευθείας την ώρα στο ρολόι, ένα μικρό πρόγραμμα «γράφτηκε» στο HiAsm:

Όλα είναι εξαιρετικά απλά: επιλέξτε τη θύρα com στην οποία κρέμεται το χειριστήριο και, στη συνέχεια, συνδεθείτε στη συσκευή προορισμού (OrbitLED (έπρεπε να διορθώσω το υλικολογισμικό για να λειτουργήσει μέσω UART) ή GreenClock (ένα από τα ήδη αρκετά παλιά έργα μου, έχει γίνει ως ο χρόνος το επιτρέπει εδώ και αρκετά χρόνια, ελπίζω να το δημοσιεύσω σύντομα στο Radiokot)) και είτε κάντε κλικ στο "Sync Time" για συγχρονισμό ή στο "Set Time" για να ορίσετε οποιαδήποτε άλλη ώρα και ημερομηνία έχει ρυθμιστεί στο "Time and Date Setup" χωράφια.

Ο σκοπός των κουμπιών στο κάτω μέρος του παραθύρου είναι ξεκάθαρος από τα ονόματά τους. Μερικά από αυτά είναι απίθανο να χρειαστούν ποτέ και χρησιμοποιήθηκαν αποκλειστικά για δοκιμαστικούς σκοπούς. Σε γενικές γραμμές, φυσικά, αυτό το πρόγραμμα πρέπει να ανακατασκευαστεί έτσι ώστε ο συγχρονισμός να γίνεται σύμφωνα με ένα χρονοδιάγραμμα στην αυτόματη λειτουργία. Στη συνέχεια, τοποθετώντας το σε αυτόματη φόρτωση στον οικιακό διακομιστή σας 24/7, μπορείτε να λύσετε πλήρως το ζήτημα των ίδιων ενδείξεων ρολογιού σε όλο το διαμέρισμα. Αυτό ακριβώς σκοπεύω να κάνω στο άμεσο μέλλον.

Όλες οι ερωτήσεις στο .

Τι γνώμη έχετε για αυτό το άρθρο;

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

Θα σημειώσω αμέσως για όσους λένε ποδήλατο. Ναι, είναι ποδήλατο. Και με ενδιέφερε να το φτιάξω. Για διάφορους λόγους. Ένα από αυτά είναι η επιθυμία να το φτιάξετε μόνοι σας και να μην το αγοράσετε.

Ιστορικό

Μια μέρα, ήρθε στο μυαλό μου η ιδέα του απομακρυσμένου ελέγχου του υπολογιστή μου, δηλαδή, εκτός από απλές εντολές στη συσκευή αναπαραγωγής πολυμέσων, λαμβάνοντας επίσης σχόλια με τη μορφή της κατάστασης μιας συγκεκριμένης εφαρμογής και του συστήματος συνολικά. Το πλησιέστερο ανάλογο αυτής της συσκευής είναι το μοντέρνο πλέον ηλεκτρονικό ρολόι για smartphone. Και επειδή δεν υπήρχε κάτι παρόμοιο σε λειτουργικότητα κοντά, αποφάσισα, για λόγους αυτοεκπαίδευσης και όχι μόνο, να συναρμολογήσω αυτό το σύστημα μόνος μου.

Μια επιλογή χρησιμοποιούσε τη μέθοδο μετάδοσης δεδομένων που είναι γνωστή στα τηλεχειριστήρια για σύγχρονες οικιακές συσκευές - IR, επίσης γνωστή ως IR. Ωστόσο, λόγω του ότι αυτό δεν είναι πολύ βολικό, και υπάρχει πρόβλημα με τις μεγάλες αποστάσεις. Στην πραγματικότητα, όλα είναι πιο απλά από ό, τι μπορείτε να σκεφτείτε, η μονάδα που έβγαλα από ένα από τα "πτώματα" του PDA σχεδιάστηκε για να λειτουργεί ειδικά ως πομποδέκτης, δηλαδή, δεν υπήρχε καν μετατροπέας σήματος. Έτσι όταν το σύνδεσα απευθείας στον μετατροπέα USB<->UART στην κονσόλα εντοπισμού σφαλμάτων είδα μια συνεχή ροή τυχαίων χαρακτήρων.

Ως εκ τούτου, αποφάσισα να χρησιμοποιήσω τον πομποδέκτη BT που μου είχε γίνει οικείος. Επίσης στους κάδους βρίσκεται η μονάδα ESD-200 που έχει απομείνει από μια από τις δοκιμές (μην το πάρετε, είναι πραγματικά άβολο και λίγο βαρετό, και επίσης μια ακριβή μονάδα, καθώς και τα πακέτα αρχίζουν να εξαφανίζονται σε μεγάλες αποστάσεις). Για να μην βαρεθώ, πήρα μια οθόνη από τη Siemens M55. Υπάρχει επίσης ένα μπλοκ έξι κουμπιών στα οποία μπορείτε να εκχωρήσετε αυθαίρετες εντολές. Επέλεξα τον πίνακα εντοπισμού σφαλμάτων STM32F4DISCOVERY ως εγκέφαλο - υπάρχει ένα πρόγραμμα εντοπισμού σφαλμάτων στο σκάφος και δεν χρειάζεται να κολλήσετε τίποτα.

Γενικό σχήμα

Προσοχή: αυτό που περιγράφεται εδώ είναι κυρίως στη θεωρία. Στην πράξη, ορισμένα σημεία απλοποιούνται επειδή πρόκειται για μακέτα και απλώς επειδή ήταν πιο γρήγορο να γίνει με αυτόν τον τρόπο.
Στην πλευρά του υπολογιστή, στον οποίο, παρεμπιπτόντως, το Linux (για μένα είναι το Gentoo Linux, για εσάς θα μπορούσε να είναι οποιαδήποτε άλλη διανομή) εκτελεί ένα πρόγραμμα - έναν διακομιστή. Ζητάει τη λίστα των διαθέσιμων συσκευών και, αφού βρει αυτή που χρειάζεται, δημιουργεί μια σύνδεση με αυτήν.
Υπάρχει μια σκανδάλη στην πλευρά της συσκευής που ελέγχει την κατάσταση σύνδεσης. Όταν ανιχνεύεται μια σύνδεση, καλεί την κύρια μονάδα polling (ένα είδος ping). Το οποίο, μετά την επιτυχή ολοκλήρωση, θέτει τη συσκευή σε διαδραστική λειτουργία.
Αυτή η λειτουργία χαρακτηρίζεται από το γεγονός ότι η μεταφορά ξεκινά από οποιοδήποτε από τα δύο στοιχεία του συστήματος. Αυτή η αρχή λειτουργίας του συστήματος επιλέχθηκε για δύο λόγους - σύντομο χρόνο αντίδρασης σε οποιαδήποτε ενέργεια, την απουσία πρόσθετων χρονόμετρων (εκτός από το χρονόμετρο TIMEOUT στο πλάι του δαίμονα στον υπολογιστή) και φυσικά ένα σχετικά απλό πρωτόκολλο ανταλλαγής . Αν και θεωρητικά χρειάζεστε TIMEOUT από την πλευρά της συσκευής γιατί Μερικές φορές προκύπτουν προβλήματα κατά την εργασία με τη μονάδα BT.

Εκτέλεση

Ας δούμε τώρα τι πήραμε σύμφωνα με το παραπάνω διάγραμμα:
  • Ένας δαίμονας που τρέχει στην πλευρά του υπολογιστή. Αν και τι είδους δαίμονας υπάρχει, στην τρέχουσα υλοποίηση είναι ένα σενάριο από μερικές εκατοντάδες γραμμές με ελάχιστο χειρισμό σφαλμάτων. Ένα από τα πιο ενδιαφέροντα στοιχεία. Γραμμένο εξ ολοκλήρου σε Python. Ένα από τα χαρακτηριστικά αυτής της ενότητας είναι ότι χρησιμοποιεί το σύστημα μηνυμάτων DBUS για τον έλεγχο των προγραμμάτων των χρηστών. Παρεμπιπτόντως, η υλοποίηση αυτού του πρωτοκόλλου για τη γλώσσα Python είναι διαθέσιμη σε οποιαδήποτε σύγχρονη διανομή. Στη συνέχεια, θα περιγράψω λεπτομερώς πώς λειτουργεί αυτός ο κώδικας.
  • Ένα πρωτόκολλο για πλήρως ασύγχρονη ανταλλαγή μηνυμάτων πολλαπλών νημάτων, που υλοποιείται πάνω από μια σειριακή θύρα με εξομοίωση πολλαπλών συνδέσεων χρησιμοποιώντας ένα σύστημα διευθυνσιοδότησης μηνυμάτων. Εφευρέθηκε αφού διάβασα την περιγραφή των πρωτοκόλλων δικτύου και των προτύπων USB, και το έγραψα επίσης επειδή. Ήμουν τεμπέλης να καπνίσω MODBUS, ή μάλλον στεναχωριόμουν να κοιτάξω την εφαρμογή του.
  • Μια συσκευή με υλικολογισμικό που, χρησιμοποιώντας τη μονάδα Bluetooth, μεταδίδει εντολές μέσω σειριακής θύρας όταν ο χρήστης πατήσει τα κουμπιά της συσκευής. Είναι επίσης δυνατή η ανάδραση με τη μορφή πληροφοριών που εμφανίζονται στην οθόνη της συσκευής. Αλλά δυστυχώς αυτό γίνεται καθαρά ως παράδειγμα. Στέλνει σταθερές εντολές και τίποτα άλλο.

Δαίμονας

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

Το πρωτότυπο έχει σχεδιαστεί πολύ απλά:
#!/usr/bin/python2 # -*- κωδικοποίηση: utf-8 -*- εισαγωγή σειριακής εισαγωγής dbus εισαγωγή υποδιεργασία εισαγωγής χρόνος εισαγωγής os # Εδώ αφαίρεσα την περιττή αρχικοποίηση της μονάδας BT, όσοι ενδιαφέρονται μπορούν να την πάρουν από ο δικός μου πλήρης κώδικας αυτής της ενότητας, παρακάτω θα περιγράψω πού να λάβω τους πηγαίους κώδικες. Αφαίρεσα επίσης αυτόν τον κωδικό επειδή έγινε στραβά και δεν πρέπει να γίνεται με αυτόν τον τρόπο σε λειτουργική μονάδα. # Κανονική σύνδεση σε σειριακή θύρα ser = serial.Serial("/dev/rfcomm0", 115200, timeout=1) # Σύνδεση σε συνεδρία διαύλου DBUS, από όπου θα συνδεθούμε στο Amarok media player. bus = dbus.SessionBus() am = bus.get_object("org.kde.amarok", "/Player") # Ένα λεξικό του οποίου τα κλειδιά είναι οι εντολές που λαμβάνουμε από τη σειριακή θύρα και τελικά καλούμε τις αντίστοιχες μεθόδους του αντικείμενο παίκτη. εντολές = ("p": , ">": , "<": , "m": , "+": ], "-": ] } print "Connected" # бесконечный цикл в котором мы и будем работать. try: while 1: try: # принимаем первый байт нашего сообщения, при этом ждём его не более секунды, если ничего не пришло за этот промежуток значит нам ничего и не присылали. line = ser.read(1) # в этой части мы ловим специфичное исключение по которому судим что последовательный порт у нас отвалился except serial.serialutil.SerialException: # а так как нам надо работать, то мы закрываем этот порт, и ждём пол секунды пока завершится это действие. ser.close() time.sleep(0.5) while 1: try: # позже пытаемся установить соединение вновь ser = serial.Serial("/dev/rfcomm0", 115200, timeout=1) break # если же опять всё плохо, т.е. нам так и не удалось подключится к последовательному порту, то мы ожидаем 2 секунды и повторяем снова наш круг. except serial.serialutil.SerialException: time.sleep(2) # если мы действительно считали байт (а это может быть и не так, потому, что у нас стоит время ожидания этого байта) то, if len(line) == 1: # проверяем что это за байт, пока реализован только приём команд if line == "C": print "Command" # дочитываем оставшиеся 2 байта заголовка - адрес и размер сообщения line += ser.read(2) # не забываем проверить что мы считали именно 2 байта - т.е. размер заголовка должен быть равен 3 байтам. if len(line) == 3: print "0x%02x 0x%02x 0x%02x" % (ord(line), ord(line), ord(line)) # это захадкоженный ответ на ping, в реальном модуле он должен быть стандартным для любого адреса, т.к. этот ответ определяет готовность "ящика" к работе с ним. if ord(line) == 0x00 and ord(line) == 0x00: print "Device ping" ser.write("A") ser.write(chr(0x00)) ser.write(chr(0x02)) ser.write(chr(ord("O"))) ser.write(chr(ord("K"))) print "Ansver to device" # если мы обратились ко второму узлу, то это сообщения общего уровня. if ord(line) == 0x02: # получаем длину и считываем сообщение. mlen = ord(line) message = ser.read(mlen) # если сообщение есть в словаре команд то выполняем команду которая соответствует полученному сообщению if message in commands: current = commands current(*current) # при получении исключения - прерывание от клавиатуры выходим. except KeyboardInterrupt: ser.close() del am print "Exiting" # не забывая закрыть соединение с BT модулем. # cleaning cmd = "sudo rfcomm unbind all" runner(cmd)

Πρωτόκολλο

Το πρωτόκολλο είναι αρκετά απλό, αποτελείται από μια κεφαλίδα τριών byte και ένα μήνυμα με μέγιστο μήκος 255 byte, ή μπορεί να μην έχει μήνυμα - μόνο κεφαλίδα. Η κεφαλίδα υποδεικνύει τον τύπο μηνύματος, τη διεύθυνση του παραλήπτη και το μέγεθος του μηνύματος. Μια πιο λεπτομερής περιγραφή του πρωτοκόλλου περιγράφεται σε αυτό το έγγραφο. Φυσικά, δεν εφαρμόζονται όλα όσα περιγράφονται στην πράξη, αλλά τουλάχιστον λειτουργεί. Παρόλο που εξακολουθούν να υπάρχουν προβλήματα με τη λήψη μηνυμάτων και άλλα σφάλματα κατά την ανταλλαγή.

Συσκευή

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

Η συσκευή ελέγχεται από υλικολογισμικό γραμμένο σε C, η συναρμολόγηση χρησιμοποιεί τη δική της δομή έργου, την οποία μπορείτε να δείτε ακολουθώντας τον παρακάτω σύνδεσμο προς το έργο.
/* κύρια συνάρτηση εργασίας */ void work(void) ( ανυπόγραφο σύντομο i, j; ανυπόγραφο char mailbox_num = 0; πτητικό ProtoIOMBox * mbox; /* Καταργήθηκε από το παράδειγμα η προετοιμασία των περιφερειακών και του πρωτοκόλλου, καθώς και η οθόνη των εικόνων - το λογότυπο * // Έλεγχος της κατάστασης της θύρας πριν από την εκκίνηση. σημαίες και, στη συνέχεια, εμφανίζεται ένα μήνυμα στην οθόνη, εάν η απόκριση είναι επιτυχής από τον διακομιστή, αλλάζει στη λειτουργία αποστολής εντολών */ mbox->header = "C". ->εξερχόμενα->μέγεθος = 0x00; */ /* η σύνδεση σταθεροποιήθηκε * / ενώ (κατάσταση == 0 /* αποστολή μηνύματος ping */ proto_send_msg(mailbox_num) ενώ (mbox->outbox_s);<= PROTO_IO_MBOX_SEND); if (mbox->outbox_s == PROTO_IO_MBOX_COMPLETE) LCD_String("Con", 36, 6, 1, WHITE, GLASSY); else LCD_String("Un", 36, 6, 1, RED, GLASSY); /* λήψη μηνύματος ping */ /* FIXME wtf? αυτό δεν λειτουργεί ή λειτουργεί ισοτιμία */ //proto_get_msg(mailbox_num); /* περιμένετε να λάβετε μήνυμα */ ενώ (mbox->inbox_s<= PROTO_IO_MBOX_SEND); if (mbox->inbox_s == PROTO_IO_MBOX_COMPLETE) (LCD_String("OK", 36 + 3 * 7, 6, 1, GREEN, GLASSY); για (i = 0; i< mbox->inbox->μέγεθος; i++) LCD_Char(mbox->inbox->message[i], 70 + i * 6, 6, 1, WHITE, GLASSY); ) else LCD_String("ERR", 36 + 3 * 7, 6, 1, RED, GLASSY); // Ένας ατελείωτος βρόχος στον οποίο ψηφίζουμε τα κουμπιά και στέλνουμε εντολές εάν πατηθεί ένα από αυτά. Επιτρέπονται πολλαπλά πατήματα κουμπιών, σε αυτήν την περίπτωση θα αποσταλούν όλες εκείνες οι εντολές που αντιστοιχούν στα πατημένα κουμπιά. /* infinity loop */ while (1) ( if (button_state.state == B_CLICK) ( sender("+"); button_state.state = B_RELEASE; ) /* ο κώδικας είναι παρόμοιος για τα άλλα κουμπιά */ ) )

Θα ήθελα επίσης να αναφέρω ξεχωριστά τη μονάδα για την αποστολή και τη λήψη μηνυμάτων - στο έργο αυτή είναι η ενότητα proto.o - ο πηγαίος κώδικας είναι proto.c και το αρχείο κεφαλίδας proto.h. Δεν θα δώσω τον κωδικό γιατί είναι μεγάλος. Αλλά γενικά θα σας πω πώς λειτουργεί.
Η μονάδα έχει σχεδιαστεί εξ ολοκλήρου για να λειτουργεί σε διακοπές, αλλά η μεταφορά δεδομένων δεν υλοποιείται σωστά αυτή τη στιγμή και επομένως απαιτεί μια προκαταρκτική κλήση αρχικοποίησης. Η λήψη και η αποστολή των μηνυμάτων πραγματοποιείται με τη χρήση 2 μηχανών πεπερασμένης κατάστασης, οι οποίες αλλάζουν την κατάστασή τους καθώς αποστέλλονται byte. Εφαρμόστηκε έλεγχος μηνυμάτων για εγκυρότητα και διαχείριση σφαλμάτων.

Επισυνάπτω επίσης ένα βίντεο της λειτουργίας του συστήματος συνολικά:

Bluetooth- Αυτός είναι ίσως ο πιο συνηθισμένος τύπος επικοινωνίας για μικρές αποστάσεις, ο οποίος χρησιμοποιείται από τις περισσότερες σύγχρονες ηλεκτρονικές συσκευές. Ακουστικά τηλεφώνου, ακουστικά, πληκτρολόγια και ποντίκια, εκτυπωτές και ένας Θεός ξέρει τι άλλα gadget. Πριν από λίγο καιρό, το bluetooth έγινε δημοφιλές ως μέσο μεταφοράς αρχείων μεταξύ τηλεφώνων.

Τα κύρια πλεονεκτήματα του BT περιλαμβάνουν την καλή αντίσταση στις ευρυζωνικές παρεμβολές και την ευκολία εφαρμογής. Το πρώτο σημαίνει ότι μια δέσμη συσκευών που βρίσκονται σε ένα μέρος μπορούν ταυτόχρονα να επικοινωνούν μεταξύ τους χωρίς να παρεμβαίνουν μεταξύ τους. Το δεύτερο βοήθησε στην ευρεία υιοθέτηση του Bluetooth στο DIY περιβάλλον, και γενικά σε όλα τα περιβάλλοντα.

Προσωπικά, χρησιμοποιώ το BT για τον έλεγχο ρομπότ από το smartphone μου. Το Google Play διαθέτει ήδη αρκετές εφαρμογές με φιλική προς τον χρήστη διεπαφή ειδικά για αυτούς τους σκοπούς. Οι συμμετέχοντες στο hackspace του MakeItLab χρησιμοποιούν Bluetooth για τον απομακρυσμένο έλεγχο του φωτός και τη συλλογή τηλεμετρίας από τα τετρακόπτερα.

Οι πιο προσιτές μονάδες Bluetooth σήμερα μπορούν να ονομαστούν HC-05 και HC-06. Υπάρχουν σε αφθονία στα κινεζικά ηλεκτρονικά καταστήματα και στο ebay. Οι διαφορές μεταξύ τους είναι ότι το πρώτο μπορεί να λειτουργήσει και σε slave και master mode. Το δεύτερο είναι μια καθαρά σκλάβη συσκευή (αλλά αυτό μπορεί να διορθωθεί!). Με άλλα λόγια, το HC-06 δεν μπορεί να ανιχνεύσει μια συζευγμένη συσκευή και να δημιουργήσει επικοινωνία μαζί της, μπορεί μόνο να υπακούσει στον κύριο.

Και οι δύο συσκευές βασίζονται στο τσιπ CSR BC417, το οποίο υποστηρίζει Bluetooth έκδοση 2.0 σε ταχύτητες έως και 3 Mbit/s. Αυτές οι ενότητες είναι που θα συζητηθούν περαιτέρω.

1. Επιλογές εκτέλεσης

Συνήθως, οι μονάδες πωλούνται ως δύο σανίδες συγκολλημένες μεταξύ τους. Η μικρότερη είναι μια εργοστασιακή μονάδα, που χρησιμοποιείται ευρέως σε διάφορες ηλεκτρονικές συσκευές. Μεγάλο - ένα κασκόλ ιδιαίτερου σχεδιασμού για DIY. Έτσι μοιάζει η μικρότερη πλακέτα με το τσιπ BC417:

Και εδώ είναι οι μονάδες DIY HC-05 και HC-06:

Για τους πονηρούς μου σκοπούς, συνήθως παίρνω το HC-05, καθώς δεν διαφέρουν πολύ σε τιμή από το HC-06 και σας επιτρέπουν να συνδέσετε δύο συσκευές μεταξύ τους χωρίς καμία ταλαιπωρία. Για παράδειγμα, μπορείτε να φτιάξετε ένα ρομπότ και ένα τηλεχειριστήριο για αυτό. Συνήθως λαμβάνω ενότητες από την Κίνα, ακριβώς όπως αυτές στην αριστερή εικόνα, αλλά μερικές φορές χωρίς κουμπί.

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

Pinout

Λοιπόν, για τι είναι υπεύθυνα τα πόδια σε όλες τις επιλογές της ενότητας;

  • EL—ενεργοποίηση/απενεργοποίηση της μονάδας.
  • VCC - τροφοδοτικό +5V;
  • GND - γείωση;
  • TXD, RXD - Διασύνδεση UART για επικοινωνία με τον ελεγκτή.
  • STATE - ένδειξη κατάστασης.
  • KEY - το πόδι για την είσοδο σε λειτουργία εντολής AT.

Η μονάδα έχει ρυθμιστεί σε λειτουργία εντολής AT, η οποία ενεργοποιείται χρησιμοποιώντας το πόδι KEY. Ως εκ τούτου, πολλοί ευτυχισμένοι κάτοχοι της μονάδας μπορεί να έχουν μια ερώτηση: τι πρέπει να κάνω εάν συναντήσω μια μονάδα χωρίς ΚΛΕΙΔΙ;

Στην πραγματικότητα, φυσικά υπάρχει αυτό το πόδι στη μικρή σανίδα, απλά δεν δρομολογείται στη μεγάλη σανίδα. Ένας Θεός ξέρει γιατί το έκαναν αυτό οι Κινέζοι, αλλά το πρόβλημα λύνεται εύκολα. Το πόδι KEY μεγαλώνει από εδώ:

2. Σύνδεση στο Arduino Uno

Δεν υπάρχουν πολλά πόδια, οπότε δεν θα μπερδευτείτε. Συνδέουμε στο bluetooth στο Arduino Uno σύμφωνα με το ακόλουθο σχήμα:

Bluetooth GND VCC TXD RXD ΚΛΕΙΔΙ
Arduino Uno GND +5V 10 11

Συνδέουμε τα TX και RX στα σκέλη 10 και 11 του GPIO, καθώς το υλικό UART στα σκέλη 0 και 1 θα είναι απασχολημένο με την επικοινωνία με τον υπολογιστή.

Στον τρόπο λειτουργίας, το KEY δεν είναι συνδεδεμένο πουθενά, οπότε στον πίνακα δεν το σύνδεσα στο GPIO με πόδια Arduino.

3. Επίπεδα τάσης ζεύξης

Η μικρή πλακέτα μονάδας Bluetooth έχει λογική τάση 3,3 Volt. Αυτό σημαίνει ότι το Arduino Uno μπορεί είτε να κάψει τις θύρες του είτε απλώς να μεταδώσει εσφαλμένα σήματα. Ευτυχώς, στις περισσότερες περιπτώσεις, μια μεγάλη σανίδα έχει τα πάντα για να αποφευχθεί αυτό. Οι παραπάνω μονάδες μπορούν εύκολα να συνδεθούν στο Arduino, χωρίς περιττές ταλαιπωρίες. Ακόμη και παρά το γεγονός ότι οι ίδιοι οι κατασκευαστές έγραψαν μια προειδοποίηση στο κασκόλ σχετικά με το επίπεδο σήματος των 3,3 Volt.

Ωστόσο, σε ορισμένες περιπτώσεις μπορεί να χρειαστεί να εγκαταστήσετε έναν διαιρέτη τάσης στη γραμμή Arduino TX - BT RX για να χαμηλώσετε τα λογικά επίπεδα. Στην πραγματικότητα, ακόμα κι αν όλα λειτουργούν χωρίς διαχωριστικό, είναι καλύτερα να βάλετε ένα, για λόγους τάξης. Το κύκλωμα διαιρέτη είναι το παρακάτω:

4. Προετοιμασία Arduino

Για να ξεκινήσουμε τη ρύθμιση, πρέπει να ανεβάσουμε ένα βοηθητικό σκίτσο στο Arduino. Στην ουσία, πρόκειται για ένα πρόγραμμα επαναλήπτη που θα ανταλλάσσει δεδομένα μεταξύ του τερματικού στον υπολογιστή και της μονάδας Bluetooth. Το πρόγραμμα είναι εξαιρετικά απλό:

#περιλαμβάνω #περιλαμβάνω int gLedPin = 13; int gRxPin = 10; int gTxPin = 11; SoftwareSerial BTSerial(gRxPin, gTxPin); void setup() ( # 38400 - για τη μέθοδο No. 1, 9600 - για τη μέθοδο No. 2 BTSerial.begin(38400); Serial.begin(9600); delay(500); ) void loop() ( if (BTSerial. διαθέσιμο( )) ( Serial.write(BTSerial.read()); ) if (Serial.available()) ( BTSerial.write(Serial.read()); ) )

Ανεβάστε το σκίτσο στο Arduino και προχωρήστε στο επόμενο βήμα.

5. Προετοιμασία του τερματικού

Μπορείτε να χρησιμοποιήσετε την οθόνη θύρας που είναι ενσωματωμένη στο Arduino IDE ως τερματικό ή μπορείτε να χρησιμοποιήσετε οποιοδήποτε άλλο. Χρησιμοποίησα ένα τερματικό τρίτου μέρους, το TeraTerm. Πριν συνδεθείτε, πρέπει να κάνετε δύο σημαντικές ρυθμίσεις:

  • ρυθμός baud: 9600;
  • χαρακτήρας ροής γραμμής: CR+LF.

Δείτε πώς φαίνονται οι ρυθμίσεις στο TeraTerm:

Όταν όλα έχουν ρυθμιστεί σωστά, συνδεθείτε στη θύρα COM και ελέγξτε τη σύνδεση. Είναι λογικό να χωρίσουμε όλους τους περαιτέρω χειρισμούς σε δύο μέρη: για την υποτελή μονάδα HC-06 και για την κύρια μονάδα HC-05.

6. Ρύθμιση του HC-06

Έλεγχος της σύνδεσης

Μετά την παροχή ρεύματος στη μονάδα, το LED θα αρχίσει να αναβοσβήνει έντονα:

Τώρα μεταβείτε στο τερματικό και γράψτε την εντολή: ΣΤΟ

Σε απάντηση, η ενότητα θα πρέπει να μας πει: Εντάξει

Η επόμενη εντολή μας θα ζητήσει από το module για την έκδοσή του: AT+VERSION;

Παίρνουμε κάτι σαν αυτό: OKLinvor1.5

Συνέβη; Εάν όχι, τότε ελέγξτε:

  1. Η ταχύτητα σύνδεσης με τη μονάδα, η οποία έχει ρυθμιστεί στο πρόγραμμα μεταφραστή: για επικοινωνία με slave, η ταχύτητα πρέπει να είναι 9600.
  2. Ρυθμίσεις χαρακτήρων ροής γραμμής: μην ξεχνάτε το CR+LF!
  3. Πατάμε Enter μετά από κάθε εντολή; Ποτέ δεν ξέρεις...

Χρήσιμες εντολές

Η υποτελής μονάδα Bluetooth έχει μόνο τρεις παραμέτρους για διαμόρφωση:

  • εντολή για αλλαγή του κωδικού πρόσβασης στη συσκευή: AT+PIN<пароль>
  • αλλαγή ταχύτητας: AT+BAUD<скорость>
  • αλλαγή ονόματος συσκευής: AT+NAME<имя>

Για παράδειγμα, για να αλλάξουμε τον κωδικό πρόσβασης γράφουμε: AT+PIN4321

Γενικά είναι έτοιμο! Τώρα μπορείτε να συνδεθείτε στη μονάδα, για παράδειγμα, από ένα smartphone. Αυτό θα συζητηθεί στο δεύτερο μέρος της ιστορίας μου.

7. Ρύθμιση του HC-05

Μετάβαση σε λειτουργία εντολής AT

Για να αποκτήσετε πρόσβαση στις ρυθμίσεις της κύριας μονάδας, πρέπει να μεταβείτε στη λειτουργία εντολών AT. Υπάρχουν δύο μέθοδοι που μπορείτε να χρησιμοποιήσετε για να μπείτε σε αυτήν τη λειτουργία (εγώ χρησιμοποιώ πάντα την πρώτη).

Πρώτη μέθοδος:

  1. Αποσυνδέστε τη μονάδα από την παροχή ρεύματος.
  2. Εφαρμόζουμε σήμα KEY +3,3V στο πόδι.
  3. Ενεργοποιούμε τη μονάδα.

Σε αυτήν την επιλογή, η συναλλαγματική ισοτιμία με τη μονάδα έχει οριστεί σε 38400.

Δεύτερη μέθοδος

  1. Ενεργοποιούμε τη μονάδα.
  2. Εφαρμόζουμε σήμα +3,3V στο πόδι KEY.

Σε αυτήν την περίπτωση, η συναλλαγματική ισοτιμία με τη μονάδα θα είναι ίση με την τυπική που ορίζεται από τις ρυθμίσεις. Η προεπιλογή είναι 9600.

Μετά την επιτυχή είσοδο στη λειτουργία εντολών AT, το LED στη μονάδα θα αναβοσβήνει μία φορά κάθε δύο δευτερόλεπτα.

Έλεγχος της σύνδεσης HC

Ας ελέγξουμε τη λειτουργία εντολών του HC-05 με τον ίδιο τρόπο όπως στην περίπτωση μιας υποτελούς μονάδας:

>>: ΣΤΟ
<<: Εντάξει
>>: AT+VERSION;
<<: +ΕΚΔΟΣΗ:2.0-20100601

Ρύθμιση του HC-05 ως σκλάβου

Για να μετατρέψετε το module σε slave, θα χρειαστεί να εκτελέσετε πολλές εντολές:

Επαναφορά προηγούμενων ρυθμίσεων: AT+ORGL

Επαναφορά συζευγμένων συσκευών: AT+RMAAD

Ορισμός κωδικού πρόσβασης: AT+PSWD=1234

Ενεργοποίηση εξαρτημένης λειτουργίας: AT+ROLE=0

Επιπλέον, μπορείτε να μάθετε τη διεύθυνση της συσκευής (απαιτείται για τη διαμόρφωση της αντιστοιχισμένης μονάδας): AT+ADDR;

Σε απάντηση παίρνουμε την ίδια τη διεύθυνση: ADDR=12:6:143117

Μετά τη ρύθμιση, αποσυνδέστε το πόδι KEY από τα +3,3 V και επανεκκινήστε τη μονάδα. Ετοιμος!

Ρύθμιση του HC-05 ως κύριου

Το module προέρχεται από το εργοστάσιο ως slave και για να το κάνετε master θα χρειαστεί να εκτελέσετε τις ακόλουθες εντολές.

Επαναφορά προηγούμενων ρυθμίσεων: AT+ORGL

Επαναφορά συζευγμένων συσκευών: AT+RMAAD

Ενεργοποίηση κύριας λειτουργίας: AT+ROLE=1

Επανεκκίνηση μετά την αλλαγή ρόλου: AT+RESET

Αν θέλουμε να συνδέσουμε το slave και το master, γράφουμε τις παρακάτω εντολές:

Ρύθμιση του υποτελούς κωδικού πρόσβασης: AT+PSWD=1234

Καθορίστε τη συζευγμένη συσκευή: AT+PAIR=<адрес>,<таймаут> (παράδειγμα: AT+PAIR=12,6,143117,5)

Συνδέουμε με μια συγκεκριμένη διεύθυνση: AT+BIND=<адрес> (παράδειγμα: AT+BIND=12,6,143117)

Απαγορεύουμε τη σύνδεση με άλλες διευθύνσεις: AT+CMODE=0

Ετοιμος! Η λειτουργική μονάδα έχει πλέον συσχετιστεί με το slave και θα προσπαθεί να συνδέεται με αυτό κάθε φορά που ενεργοποιείται.