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

PIC MCU και σειριακή επικοινωνία Python: 5 βήματα
PIC MCU και σειριακή επικοινωνία Python: 5 βήματα

Βίντεο: PIC MCU και σειριακή επικοινωνία Python: 5 βήματα

Βίντεο: PIC MCU και σειριακή επικοινωνία Python: 5 βήματα
Βίντεο: Makeblock Untimate Robot Kit Part 2 : Robtic Arm Explaine, Software, Code App and Having Fun demo 2024, Νοέμβριος
Anonim
PIC MCU και σειριακή επικοινωνία Python
PIC MCU και σειριακή επικοινωνία Python
PIC MCU και σειριακή επικοινωνία Python
PIC MCU και σειριακή επικοινωνία Python

Γεια σας παιδιά! Σε αυτό το έργο θα προσπαθήσω να εξηγήσω τα πειράματά μου σε σειριακή επικοινωνία 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: Συμπέρασμα

Ολοκληρώσαμε με επιτυχία μια εργασία. Ελπίζω ότι θα είναι χρήσιμο για εσάς. Εάν έχετε οποιαδήποτε ερώτηση, μη διστάσετε να τη ρωτήσετε:) Μέχρι το επόμενο έργο.

Συνιστάται: