Mundarija:

PIC MCU va Python ketma -ket aloqasi: 5 qadam
PIC MCU va Python ketma -ket aloqasi: 5 qadam

Video: PIC MCU va Python ketma -ket aloqasi: 5 qadam

Video: PIC MCU va Python ketma -ket aloqasi: 5 qadam
Video: Black Panther || TAKI TAKI 2024, Noyabr
Anonim
PIC MCU va Python ketma -ket aloqasi
PIC MCU va Python ketma -ket aloqasi
PIC MCU va Python ketma -ket aloqasi
PIC MCU va Python ketma -ket aloqasi

Salom bolalar! Ushbu loyihada men PIC MCU va Python ketma -ket aloqasi bo'yicha tajribalarimni tushuntirishga harakat qilaman. Internetda PIC MCU bilan virtual terminal orqali qanday bog'lanish bo'yicha ko'plab darsliklar va videolar mavjud, bu juda foydali. Ammo, mening asosiy loyihamda talablardan biri - PIC MCU va Python o'rtasida ketma -ket aloqa o'rnatish, lekin men yaxshi darslik topa olmadim. Shunday qilib, boshlaylik:)

1 -qadam: Bizga nima kerak?

Bizga nima kerak?
Bizga nima kerak?
Bizga nima kerak?
Bizga nima kerak?

Shunday qilib, birinchi navbatda, bizga nima kerakligini ko'rib chiqaylik. Uskuna jihatidan:

  • Albatta, mening holatimda PIC16f877a bo'lgan PIC MCU (Sizga bu karta kerak emas. Bu ba'zi iflos ulanishlarni soddalashtirish uchun).
  • TX va RX pinlari yordamida USB port orqali PIC MCU bilan bog'lanish uchun USB - TTL konvertori.
  • Mening holatimda K150 dasturchisi bo'lgan MCU dasturchisi, lekin siz PicKit 2, 3 yoki boshqa narsalarni ishlatishingiz mumkin.
  • Va nihoyat kompyuter:)

Dasturiy ta'minot nuqtai nazaridan:

  • Pycharm misolida python kodini yozish uchun IDE, lekin siz oddiy Python IDE -dan ham foydalanishingiz mumkin.
  • MCSni CCS C kompilyatori bilan MPLAB X IDE dasturlash uchun muhit.

2 -qadam: Uskuna ulanishlari

Uskuna ulanishlari
Uskuna ulanishlari

Rasmda PIC MCU va USB TTL konvertorlari orasidagi apparat ulanishlari ko'rsatilgan:

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

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

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

USB TTL konvertorining VCC pinini ulash shart emas (Agar xohlasangiz, buni qilishingiz mumkin). Bu 3 ta ulanish etarli.

3 -qadam: Python dasturi

Python tomoni uchun dasturni yozishni boshlaylik, u bizning holatimizda uzatuvchi bo'ladi, chunki u mag'lubiyatni MCUga yuboradi.

import serial #import serial librarydata = '24' #data, biz ma'lumotlarni yuboramiz = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #portga ulanish ser.write (a.encode ()) #ma'lumotlarni yuborish

Birinchidan, kelajagidan foydalanish uchun ketma -ket kutubxona import qilinadi. Biz MCU kodida uni qabul qilganimizni tasdiqlash uchun misolli ma'lumotlarni yuborishni xohlaymiz. Men bu erda bir narsani ta'kidlamoqchiman. Shuning uchun biz qatorga '\ 0' qo'shdik. Buning sababi, MCU tomonida satrni to'liq o'qish mumkin emas. Bu belgi bo'yicha o'qiladi. Shunday qilib, biz o'qishni to'xtatish uchun satrning oxirini bilishni xohlaymiz. Shunday qilib, biz satrning oxirini bildiruvchi '\ 0' ni qo'shamiz. Keyin biz MCUga ulangan portga ulanamiz. Siz ushbu portni "Qurilma menejeri" bo'limida topishingiz mumkin. Shunday qilib, siz bitta portda ekanligingizga ehtiyot bo'ling. Axir biz ma'lumotlarni MCUga yuboramiz. Qabul qiluvchiga yuborish uchun ".encode ()" satr ma'lumotlariga qo'shilishi kerak.

4 -qadam: Mikrokontroller dasturi

Shunday qilib, keling MCU kodimizni ko'rib chiqaylik. Birinchidan, men sizga "config.h" faylini ko'rsatishni xohlayman, lekin u oddiy emas. Bu erda MCU chastotasini o'zgartiring.

#ifndef CONFIG_H#CONFIG_H ni aniqlang

#qo'shing

#qurilma ADC = 16

#FUSES NOWDT // Watch Dog Timer yo'q

#FUSES NOBROWNOUT // Brownout reset yo'q #FUSES NOLVP // Past kuchlanishli prgming, B3 (PIC16) yoki B5 (PIC18) kirish/chiqish uchun ishlatilmadi

#foydalanish kechikishi (billur = 6000000)

Endi asosiy kodni ko'rib chiqaylik:

#qo'shing

#qo'shing

#rs232 dan foydalaning (baud = 9600, xmit = pin_C6, rcv = pin_C7, parite = N, stop = 1)

#LED_RED PIN_D0 ni aniqlang

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

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); imzosiz int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {bufer = inp; inp = getc (); putc (inp); i ++; }}

void asosiy (void) {

set_tris_d (0x00); chiqish_d (0xFF); enable_interrupts (GLOBAL); while (1) {enable_interrupts (int_rda); if (strcmp (bufer, cmp_) == 0) output_low (LED_RED); boshqa output_high (LED_RED); }}

Boshida biz magistrallar kutubxonasini o'z ichiga olamiz, bu bizni mag'lubiyatli operatsiyalarda yordam beradi, bu bizning holatimizda string solishtirish (strcmp). Shunday qilib, bizning ushbu koddagi maqsadimiz - uzatilgan qiymat "cmp_" "24" ga teng bo'lgan qiymat bilan bir xil bo'lsa, D0 piniga ulangan svetodiodni yoqish.

Birinchidan, biz uzatish "rda" ni ishga tushiramiz, bu ma'lumotlar uzatilganda uzilishga olib keladi.

Ikkinchidan, keling, "serial_communication_interrupt" deb nomlangan ISR (uzilish xizmat ko'rsatish tartibi) ni ko'rib chiqaylik. Qabul qilingan qiymatni o'qish va keyingi uzilishni keltirib chiqarish uchun biz birinchi navbatda uzilish bayrog'ini o'chirib qo'yamiz. Shundan so'ng, biz "\ 0" ga yetguncha satrni belgi bo'yicha o'qiymiz. Ichki satrni o'qiyotganda, biz qabul qilingan satrni olish uchun har bir charni buferga yozamiz.

Oxir -oqibat, biz yana ichkariga kiramiz. Bu erda biz mag'lubiyatni to'g'ri qabul qilganimizni bilish uchun string va cmp_ stringni olgan tampon satrimizni solishtiramiz. Agar ular teng bo'lsa, men chiroqni yoqaman, aks holda o'chirib qo'yaman.

*Kodda men teskari qildim, chunki mening taxtam D port pin qiymatlarini o'zgartiradi. Kodingizda uni o'zgartiring:

if (strcmp (bufer, cmp_) == 0) output_high (LED_RED); boshqa output_low (LED_RED);

Nihoyat, uni kompilyatsiya qiling va MCU -ga yuklang, keyin Python -da kodni ishga tushiring. Ledning yoqilishini ko'rishingiz kerak.

5 -qadam: Xulosa

Biz bitta vazifani muvaffaqiyatli yakunladik. Umid qilamanki, bu siz uchun foydali bo'ladi. Agar sizda biron bir savol bo'lsa, ikkilanmasdan so'rang:) Keyingi loyihaga qadar.

Tavsiya: