Мазмуну:

PIC MCU жана Python сериялык байланыш: 5 кадам
PIC MCU жана Python сериялык байланыш: 5 кадам

Video: PIC MCU жана Python сериялык байланыш: 5 кадам

Video: PIC MCU жана Python сериялык байланыш: 5 кадам
Video: BTT - Manta E3EZ - CB1 with EMMc install 2024, Декабрь
Anonim
PIC MCU жана Python Serial Communication
PIC MCU жана Python Serial Communication
PIC MCU жана Python Serial Communication
PIC MCU жана Python Serial Communication

Салам балдар! Бул долбоордо мен PIC MCU жана Python сериялык байланыш боюнча эксперименттеримди түшүндүрүүгө аракет кылам. Интернетте PIC MCU менен виртуалдык терминал аркылуу кантип байланышуу боюнча көптөгөн окуу куралдары жана видеолор бар, бул абдан пайдалуу. Бирок, менин негизги долбоорумда талаптардын бири - PIC MCU менен Python ортосунда сериялык байланыш түзүү, бирок мен аны жакшы үйрөткүч таба алган жокмун. Ошентип, баштайлы:)

1 -кадам: Бизге эмне керек?

Бизге эмне керек?
Бизге эмне керек?
Бизге эмне керек?
Бизге эмне керек?

Ошентип, биринчи кезекте бизге эмне керек экенин көрөлү. Аппараттык жактан:

  • Албетте, менин учурда PIC16f877a болгон PIC MCU (Сизге бул тактанын кереги жок. Бул кээ бир кир байланыштарды жөнөкөйлөтүү үчүн)
  • TX жана RX казыктарын колдонуу менен USB порту аркылуу PIC MCU менен байланышуу үчүн USB TTL конвертерине.
  • Менин учурда K150 программисти болгон MCU программисти, бирок сиз PicKit 2, 3 же башка нерсени колдоно аласыз.
  • Акыры компьютер:)

Программалык камсыздоо жагынан:

  • Pycharm менин абалымдагы Python кодун жазуу үчүн IDE, бирок кадимки Python IDEди дагы колдоно аласыз.
  • CCU C компилятору менен MPLAB X IDE болгон MCU программалоо чөйрөсү.

2 -кадам: Аппараттык туташуулар

Аппараттык туташуулар
Аппараттык туташуулар

Сүрөттө тиркелген аппараттык туташуулар PIC MCU менен USB TTL алмаштыргычтарынын ортосунда көрсөтүлгөн:

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

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

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

Сиз USB TTL конвертеринин VCC пинин туташтыруунун кажети жок (Бирок, эгер кааласаңыз, жасай аласыз). Бул 3 байланыш абдан жетиштүү.

3 -кадам: Python программасы

Келгиле, Python тарапка программаны жаза баштайлы, ал биздин учурда өткөргүч болот, анткени ал сапты MCUга жөнөтөт.

Import serial serial #import serial librarydata = '24' #data, we will send 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

#кошуу

#түзмөк ADC = 16

#FUSES NOWDT // Watch Dog Timer жок

#FUSES NOBROWNOUT // Brownout жок #FUSES NOLVP // Төмөн чыңалуудагы пргминг жок, В3 (PIC16) же B5 (PIC18) I/O үчүн колдонулат

#колдонуу кечигүүсү (кристалл = 6000000)

Эми негизги кодду карап көрөлү:

#кошуу

#кошуу

#rs232 колдонуу (baud = 9600, xmit = pin_C6, rcv = pin_C7, parity = N, stop = 1)

#Dedine LED_RED PIN_D0

char inp; char cmp _ = "24"; char буфер [3];

#int_rda

жараксыз serial_communication_interrupt () {disable_interrupts (int_rda); unsigned int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}

void main (жараксыз) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (ГЛОБАЛДЫК); while (1) {enable_interrupts (int_rda); if (strcmp (buffer, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

Башында биз саптык китепкананы камтыйбыз, ал сап операцияларында жардам берет, бул биздин учурда сапты салыштыруу операциясы (strcmp). Ошентип, бул коддогу биздин максатыбыз, эгер D0 пинине туташкан ледти иштетүү, эгерде берилген мааниси "cmp_" "24" ге барабар болгон маанибиз менен бирдей болсо.

Биринчиден, биз "rda" үзгүлтүккө учуроону иштетебиз, бул маалымат берилип жатканда үзгүлтүккө алып келет.

Экинчиден, "serial_communication_interrupt" деп аталган ISRдин (үзгүлтүккө учуроо кызматы) ичин карап көрөлү. Ичинде биз биринчи кезекте алынган маанини окуу жана андан ары үзгүлтүккө учуроо үчүн үзгүлтүк желегин өчүрөбүз. Андан кийин биз '\ 0' жеткенге чейин сапты тамга менен окуйбуз. Саптын ичинде окуп жатканда, биз кабыл алынган сапты алуу үчүн буферге ар бир charти жазабыз.

Акыр -аягы, биз кайра эле кирип келе жатабыз. Бул жерде биз сапты туура алганыбызды билиш үчүн, string жана cmp_ string алынган буфердик сапты салыштырабыз. Эгерде алар бирдей болсо, анда мен LEDны күйгүзөм, болбосо өчүрөм.*

*Коддо мен тескерисинче кылдым, анткени менин тактам D портунун пин маанилерин тескери бурат. Сиздин кодуңузда аны өзгөртүңүз:

if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); башка output_low (LED_RED);

Акыр -аягы, аны түзүп, MCUга жүктөңүз, андан кийин Pythonдо кодду иштетиңиз. Сиз LED күйгүзүүнү көрүшүңүз керек.

5 -кадам: Жыйынтык

Биз бир тапшырманы ийгиликтүү аяктадык. Сиз үчүн пайдалуу болот деп ишенем. Суроолоруңуз болсо, тартынбастан сураңыз:) Кийинки долбоорго чейин.

Сунушталууда: