Πίνακας περιεχομένων:
- Βήμα 1: Τι χρειαζόμαστε;
- Βήμα 2: Συνδέσεις υλικού
- Βήμα 3: Λογισμικό Python
- Βήμα 4: Λογισμικό μικροελεγκτών
- Βήμα 5: Συμπέρασμα
Βίντεο: PIC MCU και σειριακή επικοινωνία Python: 5 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:35
Γεια σας παιδιά! Σε αυτό το έργο θα προσπαθήσω να εξηγήσω τα πειράματά μου σε σειριακή επικοινωνία PIC MCU και Python. Στο διαδίκτυο, υπάρχουν πολλά σεμινάρια και βίντεο σχετικά με τον τρόπο επικοινωνίας με το PIC MCU μέσω εικονικού τερματικού, το οποίο είναι πολύ χρήσιμο. Ωστόσο, στο κύριο έργο μου μία από τις απαιτήσεις είναι η δημιουργία σειριακής επικοινωνίας μεταξύ του PIC MCU και της Python, την οποία δεν μπόρεσα να βρω καλό σεμινάριο. Ας ξεκινήσουμε λοιπόν:)
Βήμα 1: Τι χρειαζόμαστε;
Λοιπόν, πρώτα απ 'όλα ας δούμε τι χρειαζόμαστε. Όσον αφορά το υλικό:
- Σίγουρα, PIC MCU που είναι στην περίπτωσή μου PIC16f877a (Δεν χρειάζεστε αυτόν τον πίνακα. Αυτό γίνεται για να απλοποιηθούν κάποιες βρώμικες συνδέσεις)
- Μετατροπέας USB σε TTL για επικοινωνία με PIC MCU μέσω θύρας USB χρησιμοποιώντας ακίδες TX και RX.
- Προγραμματιστής MCU που είναι στην περίπτωσή μου προγραμματιστής K150, αλλά μπορείτε να χρησιμοποιήσετε το PicKit 2, 3 ή οτιδήποτε άλλο.
- Και τέλος ένας υπολογιστής:)
Όσον αφορά το λογισμικό:
- Ένα IDE για να γράψετε κώδικα python που είναι στην περίπτωσή μου Pycharm, αλλά μπορείτε επίσης να χρησιμοποιήσετε κανονικό Python IDE.
- Ένα περιβάλλον για τον προγραμματισμό του MCU που είναι στην περίπτωσή μου MPLAB X IDE με μεταγλωττιστή CCS C.
Βήμα 2: Συνδέσεις υλικού
Στην εικόνα δίνονται συνημμένες συνδέσεις υλικού οι οποίες είναι μεταξύ μετατροπέα PIC MCU και USB TTL όπως παρακάτω:
RC7 (RX) ------------- TXD
RC6 (TX) ------------- RXD
GND -------------- GND
Δεν χρειάζεται να συνδέσετε τον ακροδέκτη VCC του μετατροπέα USB TTL (Ωστόσο, αν θέλετε, μπορείτε να το κάνετε). Αυτές οι 3 συνδέσεις είναι αρκετά.
Βήμα 3: Λογισμικό Python
Ας αρχίσουμε να γράφουμε λογισμικό για την Python πλευρά που θα είναι πομπός στην περίπτωσή μας, γιατί θα στείλει τη συμβολοσειρά στο MCU.
import serial #import serial librarydata = '24' #data που θα στείλουμε δεδομένα = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #στείλτε τα δεδομένα
Πρώτα απ 'όλα, η σειριακή βιβλιοθήκη εισάγεται προκειμένου να χρησιμοποιηθεί το μέλλον της. Θέλουμε να στείλουμε ένα παράδειγμα δεδομένων συμβολοσειράς για να επιβεβαιώσουμε στον κώδικα MCU ότι τα αποδεχτήκαμε. Εδώ θέλω να σημειώσω ένα πράγμα. Αυτός είναι ο λόγος για τον οποίο προσθέσαμε '\ 0' στη συμβολοσειρά. Αυτό συμβαίνει επειδή, από την πλευρά του MCU είναι αδύνατο να διαβάσετε πλήρως τη συμβολοσειρά. Διαβάζεται χαρακτήρα ανά χαρακτήρα. Έτσι, θέλουμε να γνωρίζουμε το τέλος της συμβολοσειράς για να σταματήσουμε να διαβάζουμε. Έτσι, προσθέτουμε '\ 0' στη συμβολοσειρά που υποδεικνύει το τέλος της συμβολοσειράς. Στη συνέχεια συνδέουμε τη θύρα που είναι συνδεδεμένη στο MCU. Μπορείτε να καθορίσετε αυτήν τη θύρα κάνοντας αναζήτηση στο 'Device Manager'. Έτσι, προσέξτε να βρίσκεστε στο ίδιο λιμάνι. Μετά από όλα, στέλνουμε τα δεδομένα στο MCU. ".encode ()" θα πρέπει να προστεθεί στα δεδομένα συμβολοσειράς για να μπορέσει να τα στείλει στον δέκτη.
Βήμα 4: Λογισμικό μικροελεγκτών
Ας δούμε λοιπόν τον κωδικό μας για MCU. Πρώτα απ 'όλα θέλω να σας δείξω το αρχείο "config.h" που δεν είναι απαραίτητο, αλλά το έκανα για απλότητα. Εδώ απλά αλλάξτε τη συχνότητα του MCU σας.
#ifndef CONFIG_H#ορίστε CONFIG_H
#περιλαμβάνω
#συσκευή ADC = 16
#FUSES NOWDT // Χωρίς χρονόμετρο σκυλιών
#FUSES NOBROWNOUT // Χωρίς επαναφορά brownout #FUSES NOLVP // Χωρίς prgming χαμηλής τάσης, B3 (PIC16) ή B5 (PIC18) που χρησιμοποιούνται για I/O
#καθυστέρηση χρήσης (κρύσταλλο = 6000000)
Τώρα ας δούμε τον κύριο κωδικό:
#περιλαμβάνω
#περιλαμβάνω
#use rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, parity = N, stop = 1)
#define LED_RED PIN_D0
char inp? char cmp _ = "24"; buff buff [3];
#int_rda
void serial_communication_interrupt () {disable_interrupts (int_rda); ανυπόγραφο int i = 0; inp = getc (); putc (inp)? while (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp)? i ++? }}
κενό κενό (κενό) {
set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL)? ενώ (1) {enable_interrupts (int_rda); if (strcmp (buffer, cmp_) == 0) output_low (LED_RED)? else output_high (LED_RED)? }}
Στην αρχή συμπεριλαμβάνουμε βιβλιοθήκη συμβολοσειρών, η οποία θα είναι χρήσιμη σε πράξεις συμβολοσειράς, η οποία στην περίπτωσή μας είναι λειτουργία σύγκρισης συμβολοσειρών (strcmp). Έτσι, σκοπός μας σε αυτόν τον κώδικα είναι να ενεργοποιήσουμε το led που είναι συνδεδεμένο στον πείρο D0 εάν η μεταδιδόμενη τιμή είναι η ίδια με τη δεδομένη τιμή μας που είναι "cmp_" ισούται με "24".
Πρώτα απ 'όλα ενεργοποιούμε τη διακοπή "rda" η οποία θα προκαλέσει διακοπή όταν μεταδίδονται δεδομένα.
Δεύτερον, ας δούμε το ISR (διακοπή ρουτίνας υπηρεσίας) που ονομάζεται "serial_communication_interrupt". Στο εσωτερικό απενεργοποιούμε πρώτα τη σημαία διακοπής για να διαβάσουμε τη ληφθείσα τιμή και να προκαλέσουμε περαιτέρω διακοπή. Στη συνέχεια διαβάζουμε τη συμβολοσειρά χαρακτήρα ανά χαρακτήρα μέχρι να φτάσουμε στο '\ 0'. Κατά την ανάγνωση της συμβολοσειράς γράφουμε επίσης κάθε χαρακτήρα στο buffer για να λάβουμε τη συμβολοσειρά.
Στο τέλος, μπαίνουμε ξανά μέσα. Εδώ συγκρίνουμε τη συμβολοσειρά buffer που λαμβάνεται συμβολοσειρά και τη συμβολοσειρά cmp_ για να δούμε αν έχουμε τη σωστή συμβολοσειρά. Εάν είναι ίσες, ενεργοποιώ το led, αλλιώς σβήνω.*
*Στον κώδικα έκανα αντίστροφη διότι ο πίνακας μου αντιστρέφει τις τιμές των ακίδων της θύρας D. Στον κωδικό σας αλλάξτε το σε:
if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); αλλιώς output_low (LED_RED)?
Τέλος, μεταγλωττίστε το και ανεβάστε το στο MCU και στη συνέχεια εκτελέστε κώδικα σε Python. Θα πρέπει να δείτε να ανάβει το led.
Βήμα 5: Συμπέρασμα
Ολοκληρώσαμε με επιτυχία μια εργασία. Ελπίζω ότι θα είναι χρήσιμο για εσάς. Εάν έχετε οποιαδήποτε ερώτηση, μη διστάσετε να τη ρωτήσετε:) Μέχρι το επόμενο έργο.
Συνιστάται:
Σειριακή επικοινωνία Arduino: 5 βήματα
Σειριακή επικοινωνία Arduino: Πολλά έργα Arduino βασίζονται στη μετάδοση δεδομένων μεταξύ αρκετών Arduinos. Είτε είστε χομπίστες που κατασκευάζουν αυτοκίνητο RC, αεροπλάνο RC είτε σχεδιάζουν μετεωρολογικό σταθμό με απομακρυσμένη οθόνη, θα πρέπει να γνωρίζετε πώς να κάνετε αξιόπιστα μεταφορά σειρών
Σειριακή επικοινωνία Arduino και Python - Οθόνη πληκτρολογίου: 4 βήματα
Σειριακή επικοινωνία Arduino και Python - Ένδειξη πληκτρολογίου: Αυτό το έργο έχει σχεδιαστεί για χρήστες mac αλλά μπορεί να εφαρμοστεί και για Linux και Windows, το μόνο βήμα που θα πρέπει να είναι διαφορετικό είναι η εγκατάσταση
Ασύρματη επικοινωνία χρησιμοποιώντας φθηνές μονάδες RF 433MHz και μικροελεγκτές Pic. Μέρος 2: 4 βήματα (με εικόνες)
Ασύρματη επικοινωνία χρησιμοποιώντας φθηνές μονάδες RF 433MHz και μικροελεγκτές Pic. Μέρος 2: Στο πρώτο μέρος αυτού του οδηγού, έδειξα πώς να προγραμματίσετε ένα PIC12F1822 χρησιμοποιώντας μεταγλωττιστή MPLAB IDE και XC8, για να στείλετε μια απλή συμβολοσειρά ασύρματα χρησιμοποιώντας φθηνές μονάδες TX/RX 433MHz. Η μονάδα δέκτη συνδέθηκε μέσω USB σε UART TTL καλωδιακή διαφήμιση
Ασύρματη σειριακή επικοινωνία χρησιμοποιώντας το Bluefruit: 4 βήματα
Ασύρματη σειριακή επικοινωνία χρησιμοποιώντας το Bluefruit: Ακολουθεί ένας απλός οδηγός βήμα προς βήμα για να αντικαταστήσετε τα καλώδιά σας με σύνδεση χαμηλής κατανάλωσης bluetooth: Μου πήρε λίγο χρόνο για να το καταλάβω, επειδή δεν υπάρχει σχεδόν καμία τεκμηρίωση για να το κάνουμε αυτό με τη σύγχρονη τεχνολογία bluetooth χαμηλής ενέργειας, όπως ως Bluefrui
Σειριακή επικοινωνία με χρήση ARM Cortex-M4: 4 βήματα
Σειριακή επικοινωνία με χρήση ARM Cortex-M4: Πρόκειται για ένα έργο που βασίζεται σε πλάκα που χρησιμοποιεί ARM Cortex-M4 (Texas Instruments EK-TM4C123GXL) για σειριακή επικοινωνία χρησιμοποιώντας εικονικό τερματικό. Η έξοδος μπορεί να ληφθεί σε οθόνη LCD 16x2 και η είσοδος για σειριακή επικοινωνία μπορεί να δοθεί σε Serial Mo