
Isi kandungan:
2025 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2025-01-23 15:01


Apa khabar semua! Dalam projek ini saya akan cuba menerangkan eksperimen saya mengenai komunikasi bersiri PIC MCU dan Python. Melalui internet, terdapat banyak tutorial dan video mengenai cara berkomunikasi dengan PIC MCU melalui terminal maya yang sangat berguna. Walau bagaimanapun, dalam projek utama saya salah satu syaratnya ialah mewujudkan komunikasi bersiri antara PIC MCU dan Python yang saya tidak dapati tutorialnya yang baik. Oleh itu, mari kita mulakan:)
Langkah 1: Apa Yang Kita Perlu?


Jadi, pertama-tama mari kita lihat apa yang kita perlukan. Dari segi perkakasan:
- Tentunya, PIC MCU yang dalam kes saya PIC16f877a (Anda tidak memerlukan papan itu. Ini adalah untuk mempermudah beberapa sambungan kotor)
- Penukar USB ke TTL untuk berkomunikasi dengan PIC MCU melalui port USB dengan menggunakan pin TX dan RX.
- Pengaturcara MCU yang dalam program saya K150, tetapi anda boleh menggunakan PicKit 2, 3 atau apa sahaja.
- Dan akhirnya komputer:)
Dari segi perisian:
- IDE untuk menulis kod python yang dalam kes saya Pycharm, tetapi anda juga boleh menggunakan Python IDE biasa.
- Persekitaran untuk memprogram MCU yang dalam kes saya MPLAB X IDE dengan penyusun CCS C.
Langkah 2: Sambungan Perkakasan

Dalam gambar dilampirkan sambungan perkakasan yang terdapat di antara PIC MCU dan penukar USB TTL seperti di bawah:
RC7 (RX) ------------- TXD
RC6 (TX) ------------- RXD
GND -------------- GND
Anda tidak perlu menyambungkan pin VCC penukar USB TTL (Walau bagaimanapun, jika anda mahu, anda boleh melakukannya). 3 sambungan ini cukup mencukupi.
Langkah 3: Perisian Python
Mari mula menulis perisian untuk sisi Python yang akan menjadi pemancar dalam kes kita, kerana ia akan menghantar tali ke MCU.
import serial #import serial librarydata = '24' #data yang akan kami kirimkan data = a + '\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) # hantar data
Pertama-tama perpustakaan bersiri diimport untuk menggunakan niaga hadapannya. Kami ingin menghantar contoh data rentetan untuk mengesahkan dalam kod MCU bahawa kami menerimanya. Saya ingin melihat satu perkara di sini. Inilah sebabnya mengapa kami menambahkan '\ 0' pada rentetan. Ini kerana, di sisi MCU mustahil untuk membaca rentetan sepenuhnya. Ia dibaca watak demi watak. Oleh itu, kami ingin mengetahui akhir rentetan agar berhenti membaca. Oleh itu, kami menambah '\ 0' pada rentetan yang menunjukkan akhir rentetan. Kemudian kami menyambung ke port yang disambungkan ke MCU. Anda boleh menentukan port tersebut dengan mencari di 'Device Manager'. Oleh itu, berhati-hatilah bahawa anda berada di port yang sama. Lagipun, kami menghantar data ke MCU. ".encode ()" harus ditambahkan ke data rentetan agar dapat mengirimnya ke penerima.
Langkah 4: Perisian Mikrokontroler
Oleh itu, mari lihat kod kami untuk MCU. Pertama sekali saya ingin menunjukkan kepada anda fail "config.h" yang tidak diperlukan, tetapi saya melakukannya untuk kesederhanaan. Di sini ubah frekuensi MCU anda.
#ifndef CONFIG_H # tentukan CONFIG_H
#sertakan
# alat ADC = 16
#FUSES SEKARANG // Tanpa Watch Timer Dog
#FUSES NOBROWNOUT // Tiada tetapan semula brownout #FUSES NOLVP // Tiada prgming voltan rendah, B3 (PIC16) atau B5 (PIC18) digunakan untuk I / O
#terlambatan penggunaan (kristal = 6000000)
Sekarang mari kita lihat kod utama:
#sertakan
#sertakan
#use rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, parity = N, berhenti = 1)
#tentukan LED_RED PIN_D0
char inp; char cmp _ = "24"; penampan char [3];
#int_rda
batal serial_communication_interrupt () {disable_interrupts (int_rda); int tidak bertanda tangan = 0; inp = getc (); putc (inp); sementara (inp! = '\ 0') {penyangga = inp; inp = getc (); putc (inp); saya ++; }}
kekosongan utama (kekosongan) {
set_tris_d (0x00); output_d (0xFF); aktifkan_interrupts (GLOBAL); sementara (1) {allow_interrupts (int_rda); jika (strcmp (buffer, cmp_) == 0) output_low (LED_RED); output_high yang lain (LED_RED); }}
Pada awalnya kami memasukkan perpustakaan tali yang kami akan membantu dalam operasi rentetan yang dalam kes kami adalah operasi membandingkan rentetan (strcmp). Oleh itu, tujuan kita dalam kod ini adalah untuk menghidupkan led yang disambungkan ke pin D0 jika nilai yang dihantar sama dengan nilai yang diberikan kita iaitu "cmp_" sama dengan "24".
Pertama sekali kita mengaktifkan interrupt "rda" yang akan menyebabkan gangguan ketika data dihantar.
Kedua, mari kita lihat di dalam ISR (rutin perkhidmatan gangguan) yang disebut "serial_communication_interrupt". Di dalamnya kami terlebih dahulu mematikan bendera interrupt untuk membaca nilai yang diterima dan menyebabkan gangguan lebih jauh. Selepas itu kami membaca rentetan watak demi watak sehingga mencapai '\ 0'. Semasa membaca string dalam, kami juga menulis setiap char ke buffer untuk mendapatkan string yang diterima.
Pada akhirnya, kami kembali masuk sementara. Di sini kita membandingkan rentetan penyangga kita yang menerima rentetan dan rentetan cmp_ untuk melihat sama ada kita mendapat rentetan dengan betul. Sekiranya mereka sama maka saya hidupkan led, jika tidak, matikan. *
* Dalam kod saya terbalik kerana papan saya membalikkan nilai pin port D. Dalam kod anda, ubahnya menjadi:
jika (strcmp (buffer, cmp_) == 0) output_high (LED_RED); lain output_low (LED_RED);
Akhirnya, susun dan muat naik ke MCU anda dan kemudian jalankan kod di Python. Anda mesti melihat lampu menyala.
Langkah 5: Kesimpulannya
Kami telah menyelesaikan satu tugas dengan jayanya. Saya harap ia berguna untuk anda. Sekiranya anda mempunyai sebarang pertanyaan, jangan ragu untuk bertanya:) Sehingga projek seterusnya.
Disyorkan:
Raspberry PI 3 - Aktifkan Komunikasi Bersiri ke TtyAMA0 hingga BCM GPIO 14 dan GPIO 15: 9 Langkah

Raspberry PI 3 - Aktifkan Komunikasi Bersiri ke TtyAMA0 ke BCM GPIO 14 dan GPIO 15: Saya baru-baru ini berminat untuk mengaktifkan UART0 pada Raspberry Pi (3b) saya supaya saya dapat menghubungkannya terus ke peranti tahap isyarat RS-232 menggunakan standard 9 -pin d-sub penyambung tanpa perlu melalui penyesuai USB ke RS-232. Sebahagian daripada minat saya
Komunikasi Bersiri Arduino: 5 Langkah

Komunikasi Bersiri Arduino: Banyak projek Arduino bergantung pada penghantaran data antara beberapa Arduino. Sama ada anda peminat yang membina kereta RC, kapal terbang RC, atau merancang stesen cuaca dengan paparan jarak jauh, anda perlu tahu bagaimana boleh dipercayai pindahkan seria
Komunikasi Bersiri Arduino dan Python - Paparan Pad Kekunci: 4 Langkah

Arduino dan Python Serial Communication - Paparan Keypad: Projek ini dibuat untuk pengguna mac tetapi ia juga dapat dilaksanakan untuk Linux dan Windows, satu-satunya langkah yang harus berbeza adalah pemasangan
Komunikasi Bersiri Tanpa Wayar Menggunakan Buah Biru: 4 Langkah

Komunikasi Bersiri Tanpa Wayar Menggunakan Bluefruit: Berikut adalah panduan langkah demi langkah yang mudah untuk mengganti wayar anda dengan sambungan tenaga rendah bluetooth: Saya mengambil sedikit masa untuk mengetahui ini kerana hampir tidak ada dokumentasi untuk melakukan ini dengan teknologi tenaga rendah Bluetooth moden seperti sebagai Bluefrui
SmartMirror berasaskan Web Menggunakan Komunikasi Bersiri: 6 Langkah

SmartMirror Berasaskan Web Menggunakan Komunikasi Bersiri: Arahan ini disampaikan dengan semua kod yang siap digunakan. Pembangunannya sangat rumit tetapi setelah disiapkan, sangat mudah untuk disesuaikan. Lihat dan nikmati;)