Mục lục:

Giao tiếp nối tiếp PIC MCU và Python: 5 bước
Giao tiếp nối tiếp PIC MCU và Python: 5 bước

Video: Giao tiếp nối tiếp PIC MCU và Python: 5 bước

Video: Giao tiếp nối tiếp PIC MCU và Python: 5 bước
Video: [Python] Giao tiếp Python với Arduino blink led cơ bản 2024, Tháng mười một
Anonim
PIC MCU và Python Serial Communication
PIC MCU và Python Serial Communication
PIC MCU và Python Serial Communication
PIC MCU và Python Serial Communication

Xin chào các bạn! Trong dự án này, tôi sẽ cố gắng giải thích các thử nghiệm của tôi về PIC MCU và giao tiếp nối tiếp Python. Trên internet, có rất nhiều hướng dẫn và video về cách giao tiếp với PIC MCU qua thiết bị đầu cuối ảo rất hữu ích. Tuy nhiên, trong dự án chính của tôi, một trong những yêu cầu là thiết lập giao tiếp nối tiếp giữa PIC MCU và Python mà tôi không thể tìm thấy hướng dẫn tốt. Vậy hãy bắt đầu:)

Bước 1: Chúng ta cần gì?

Chúng ta cần gì?
Chúng ta cần gì?
Chúng ta cần gì?
Chúng ta cần gì?

Vì vậy, trước hết chúng ta hãy xem những gì chúng ta cần. Về phần cứng:

  • Chắc chắn, PIC MCU trong trường hợp của tôi là PIC16f877a (Bạn không cần bảng đó. Điều này là để đơn giản hóa một số kết nối bẩn)
  • Bộ chuyển đổi USB sang TTL để giao tiếp với PIC MCU qua cổng USB bằng cách sử dụng chân TX và RX.
  • Lập trình viên MCU trong trường hợp của tôi là lập trình viên K150, nhưng bạn có thể sử dụng PicKit 2, 3 hoặc bất kỳ thứ gì khác.
  • Và cuối cùng là một chiếc máy tính:)

Về phần mềm:

  • Một IDE để viết mã python, trong trường hợp của tôi là Pycharm, nhưng bạn cũng có thể sử dụng Python IDE thông thường.
  • Môi trường để lập trình MCU trong trường hợp của tôi là MPLAB X IDE với trình biên dịch CCS C.

Bước 2: Kết nối phần cứng

Kết nối phần cứng
Kết nối phần cứng

Trong hình, các kết nối phần cứng đính kèm được đưa ra giữa PIC MCU và bộ chuyển đổi USB TTL như bên dưới:

RC7 (RX) ------------- TXD

RC6 (TX) ------------- RXD

GND -------------- GND

Bạn không cần kết nối chân VCC của bộ chuyển đổi USB TTL (Tuy nhiên, nếu bạn muốn, bạn có thể làm). 3 kết nối này là khá đủ.

Bước 3: Phần mềm Python

Hãy bắt đầu viết phần mềm cho bên Python sẽ là bộ truyền trong trường hợp của chúng ta, vì nó sẽ gửi chuỗi đến MCU.

import serial #import serial librarydata = '24' #data mà chúng tôi sẽ gửi dữ liệu = a + '\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) # kết nối với cổng ser.write (a.encode ()) #send data

Trước hết, thư viện nối tiếp được nhập để sử dụng tương lai của nó. Chúng tôi muốn gửi dữ liệu chuỗi mẫu để xác nhận trong mã MCU rằng chúng tôi đã chấp nhận nó. Tôi muốn lưu ý một điều ở đây. Đây là lý do tại sao chúng tôi thêm '\ 0' vào chuỗi. Điều này là do, về phía MCU, không thể đọc toàn bộ chuỗi. Nó được đọc theo từng ký tự. Vì vậy, chúng tôi muốn biết kết thúc của chuỗi để dừng đọc. Vì vậy, chúng tôi thêm '\ 0' vào chuỗi cho biết kết thúc của chuỗi. Sau đó, chúng tôi kết nối với cổng được kết nối với MCU. Bạn có thể xác định cổng đó bằng cách tìm kiếm trong 'Trình quản lý thiết bị'. Vì vậy, hãy cẩn thận rằng bạn đang ở trên cùng một cổng. Sau cùng, chúng tôi gửi dữ liệu đến MCU. ".encode ()" phải được thêm vào dữ liệu chuỗi để có thể gửi nó đến người nhận.

Bước 4: Phần mềm vi điều khiển

Vì vậy, hãy xem mã của chúng tôi cho MCU. Trước hết, tôi muốn cho bạn thấy tệp "config.h" bên trong không bắt buộc, nhưng tôi đã làm điều đó vì đơn giản. Ở đây chỉ cần thay đổi tần số MCU của bạn.

#ifndef CONFIG_H # xác định CONFIG_H

#bao gồm

#device ADC = 16

#FUSES NOWDT // Không có Đồng hồ hẹn giờ cho chó theo dõi

#FUSES NOBROWNOUT // Không đặt lại brownout #FUSES NOLVP // Không prgming điện áp thấp, B3 (PIC16) hoặc B5 (PIC18) được sử dụng cho I / O

# sử dụng độ trễ (pha lê = 6000000)

Bây giờ chúng ta hãy xem mã chính:

#bao gồm

#bao gồm

#use rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, parity = N, stop = 1)

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; đệm char [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); không dấu int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (TOÀN CẦU); while (1) {enable_interrupts (int_rda); if (strcmp (đệm, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

Lúc đầu, chúng tôi bao gồm thư viện chuỗi mà chúng tôi sẽ hữu ích trong các hoạt động chuỗi mà trong trường hợp của chúng tôi là hoạt động so sánh chuỗi (strcmp). Vì vậy, mục đích của chúng ta trong đoạn mã này là bật led được kết nối với chân D0 nếu giá trị được truyền giống với giá trị đã cho của chúng ta là "cmp_" bằng "24".

Trước hết chúng ta kích hoạt ngắt "rda" sẽ gây ra ngắt khi dữ liệu được truyền đi.

Thứ hai, hãy xem bên trong ISR (quy trình dịch vụ ngắt) được gọi là "serial_communication_interrupt". Bên trong, trước hết chúng ta vô hiệu hóa cờ ngắt để đọc giá trị nhận được và gây ra gián đoạn thêm. Sau đó, chúng tôi đọc từng ký tự trong chuỗi cho đến khi đạt đến '\ 0'. Trong khi đọc chuỗi bên trong, chúng tôi cũng ghi từng ký tự vào bộ đệm để nhận chuỗi đã nhận.

Cuối cùng, chúng tôi một lần nữa vào bên trong trong khi. Ở đây, chúng tôi so sánh chuỗi đệm của chúng tôi là chuỗi đã nhận và chuỗi cmp_ để xem liệu chúng tôi có lấy chuỗi đúng hay không. Nếu chúng bằng nhau thì tôi bật đèn led, nếu không thì tắt. *

* Trong mã, tôi đã đảo ngược vì bảng của tôi đảo ngược các giá trị chân cổng D. Trong mã của bạn, hãy thay đổi nó thành:

if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); else output_low (LED_RED);

Cuối cùng, biên dịch nó và tải lên MCU của bạn và sau đó chạy mã bằng Python. Bạn sẽ thấy đèn led bật sáng.

Bước 5: Kết luận

Chúng tôi đã hoàn thành một nhiệm vụ thành công. Tôi hy vọng rằng nó sẽ hữu ích cho bạn. Nếu bạn có bất kỳ câu hỏi nào, xin vui lòng hỏi:) Cho đến khi dự án tiếp theo.

Đề xuất: