Оглавление:

Последовательная связь PIC MCU и Python: 5 шагов
Последовательная связь PIC MCU и Python: 5 шагов

Видео: Последовательная связь PIC MCU и Python: 5 шагов

Видео: Последовательная связь PIC MCU и Python: 5 шагов
Видео: Применение pySerial для получения данных с Arduino 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, но вы также можете использовать обычную IDE Python.
  • Среда для программирования MCU, в моем случае это MPLAB X IDE с компилятором CCS C.

Шаг 2: Подключение оборудования

Аппаратные соединения
Аппаратные соединения

На рисунке показаны прилагаемые аппаратные соединения между PIC MCU и USB TTL преобразователем, как показано ниже:

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

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

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

Вам не нужно подключать вывод VCC преобразователя USB TTL (однако, если вы хотите, вы можете это сделать). Этих трех подключений вполне достаточно.

Шаг 3. Программное обеспечение Python

Давайте начнем писать программное обеспечение для стороны Python, которая в нашем случае будет передатчиком, потому что она отправит строку в MCU.

import serial #import serial librarydata = '24' # данные, которые мы будем отправлять data = a + '\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) # подключиться к порту ser.write (a.encode ()) # отправляем данные

В первую очередь импортируется последовательная библиотека, чтобы использовать ее фьючерсы. Мы хотим отправить пример строковых данных, чтобы подтвердить в коде MCU, что мы его приняли. Хочу здесь отметить одну вещь. Вот почему мы добавили в строку '\ 0'. Это связано с тем, что на стороне MCU невозможно полностью прочитать строку. Он читается посимвольно. Итак, мы хотим узнать конец строки, чтобы прекратить чтение. Итак, мы добавляем '\ 0' к строке, которая указывает конец строки. Затем мы подключаемся к порту, к которому подключен MCU. Вы можете определить этот порт, выполнив поиск в «Диспетчере устройств». Итак, будьте осторожны, вы находитесь на одном и том же порту. Ведь мы отправляем данные в MCU. «.encode ()» следует добавить к строковым данным, чтобы можно было отправить их получателю.

Шаг 4: Программное обеспечение микроконтроллера

Итак, давайте посмотрим наш код для MCU. Прежде всего, я хочу показать вам файл config.h внутри, который не требуется, но я сделал это для простоты. Здесь просто измените частоту вашего MCU.

#ifndef CONFIG_H # определить CONFIG_H

#включают

#device ADC = 16

#FUSES NOWDT // Нет таймера Watch Dog

# ПРЕДОХРАНИТЕЛИ NOBROWNOUT // Нет сброса при пониженном напряжении # ПРЕДОХРАНИТЕЛИ NOLVP // Нет программирования низкого напряжения, B3 (PIC16) или B5 (PIC18) используются для ввода / вывода

# использовать задержку (кристалл = 6000000)

Теперь посмотрим на основной код:

#включают

#включают

# использовать rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, parity = N, stop = 1)

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; char buffer [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); беззнаковый int я = 0; inp = getc (); putc (inp); в то время как (inp! = '\ 0') {буфер [я] = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (ГЛОБАЛЬНЫЙ); в то время как (1) {enable_interrupts (int_rda); если (strcmp (buffer, cmp_) == 0) output_low (LED_RED); иначе output_high (LED_RED); }}

Вначале мы включаем строковую библиотеку, которая нам будет полезна в строковых операциях, которые в нашем случае являются операцией сравнения строк (strcmp). Итак, наша цель в этом коде - включить светодиод, подключенный к выводу D0, если переданное значение совпадает с нашим заданным значением, которое «cmp_» равно «24».

Прежде всего мы разрешаем прерывание «rda», которое вызовет прерывание при передаче данных.

Во-вторых, давайте заглянем внутрь ISR (процедура обслуживания прерывания), которая называется «serial_communication_interrupt». Внутри мы сначала отключаем флаг прерывания, чтобы прочитать полученное значение и вызвать прерывание дальше. После этого мы читаем строку посимвольно, пока не дойдем до '\ 0'. При чтении внутри строки мы также записываем каждый символ в буфер, чтобы получить полученную строку.

В конце мы снова заходим внутрь. Здесь мы сравниваем нашу строку буфера, которая получена, и строку cmp_, чтобы увидеть, правильно ли мы получили строку. Если они равны, я включаю светодиод, в противном случае выключаю. *

* В коде я сделал обратное, потому что моя плата инвертирует значения выводов порта D. В вашем коде измените его на:

if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); иначе output_low (LED_RED);

Наконец, скомпилируйте его и загрузите в свой MCU, а затем запустите код на Python. Вы должны увидеть, как загорится светодиод.

Шаг 5: Заключение

Мы успешно выполнили одну задачу. Надеюсь, он будет вам полезен. Если у вас есть вопросы, не стесняйтесь спрашивать:) До следующего проекта.

Рекомендуемые: