İçindekiler:

PIC MCU ve Python Seri Haberleşme: 5 Adım
PIC MCU ve Python Seri Haberleşme: 5 Adım

Video: PIC MCU ve Python Seri Haberleşme: 5 Adım

Video: PIC MCU ve Python Seri Haberleşme: 5 Adım
Video: STM32 Programlama - Seri Haberleşme - 1 - Giriş 2024, Kasım
Anonim
PIC MCU ve Python Seri Haberleşme
PIC MCU ve Python Seri Haberleşme
PIC MCU ve Python Seri Haberleşme
PIC MCU ve Python Seri Haberleşme

Selam beyler! Bu projemde PIC MCU ve Python seri haberleşme üzerine deneylerimi açıklamaya çalışacağım. İnternette, sanal terminal üzerinden PIC MCU ile nasıl iletişim kurulacağına dair çok faydalı olan birçok eğitim ve video var. Ancak ana projemde gereksinimlerden biri de PIC MCU ile Python arasında iyi bir öğretici bulamadığım seri iletişim kurmak. O halde başlayalım:)

Adım 1: Neye İhtiyacımız Var?

Neye ihtiyacımız var?
Neye ihtiyacımız var?
Neye ihtiyacımız var?
Neye ihtiyacımız var?

O halde, öncelikle neye ihtiyacımız olduğunu görelim. Donanım açısından:

  • Elbette, benim durumumda olan PIC MCU PIC16f877a (Bu karta ihtiyacınız yok. Bu bazı kirli bağlantıları basitleştirmek için)
  • TX ve RX pinlerini kullanarak USB portu üzerinden PIC MCU ile iletişim kurmak için USB'den TTL'ye dönüştürücü.
  • Benim durumumda K150 programcısı olan MCU programcısı, ancak PicKit 2, 3 veya başka bir şey kullanabilirsiniz.
  • Ve sonunda bir bilgisayar:)

Yazılım açısından:

  • Benim durumumda Pycharm olan python kodunu yazmak için bir IDE, ancak normal Python IDE'yi de kullanabilirsiniz.
  • CCS C derleyicisi ile benim durumumda MPLAB X IDE olan MCU'yu programlamak için bir ortam.

2. Adım: Donanım Bağlantıları

Donanım Bağlantıları
Donanım Bağlantıları

Resimde PIC MCU ve USB TTL dönüştürücü arasındaki donanım bağlantıları aşağıdaki gibi verilmiştir:

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

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

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

USB TTL dönüştürücünün VCC pinini bağlamanıza gerek yoktur (Ancak dilerseniz yapabilirsiniz). Bu 3 bağlantı oldukça yeterli.

3. Adım: Python Yazılımı

Bizim durumumuzda verici olacak Python tarafı için bir yazılım yazmaya başlayalım çünkü stringi MCU'ya gönderecektir.

import serial #import serial librarydata = '24' #veri göndereceğimiz #data = a+'\0' ser = serial. Serial('COM17', baudrate=9600, timeout=1) #porta bağlan ser.write(a.encode()) #verileri gönder

Her şeyden önce, geleceklerini kullanmak için seri kütüphane ithal edilir. MCU kodunda kabul ettiğimizi doğrulamak için örnek bir dize verisi göndermek istiyoruz. Burada bir şeyi not etmek istiyorum. Bu yüzden dizgeye '\0' ekledik. Bunun nedeni, MCU tarafında dizeyi tamamen okumanın imkansız olmasıdır. Karakter karakter okunur. Bu nedenle, okumayı durdurmak için dizenin sonunu bilmek istiyoruz. Böylece, dizgenin sonunu gösteren dizgeye '\0' ekliyoruz. Ardından MCU'ya bağlı olan porta bağlanıyoruz. 'Aygıt Yöneticisi'nde arama yaparak bu bağlantı noktasını belirleyebilirsiniz. Bu nedenle, aynı limanda olduğunuza dikkat edin. Sonuçta, verileri MCU'ya gönderiyoruz. Alıcıya gönderebilmek için string verisine ".encode()" eklenmelidir.

Adım 4: Mikrodenetleyici Yazılımı

Şimdi MCU kodumuzu görelim. Öncelikle size gerekli olmayan "config.h" dosyasını göstermek istiyorum ama bunu basit olsun diye yaptım. Burada sadece MCU'nuzun frekansını değiştirin.

#ifndef CONFIG_H#CONFIG_H tanımla

#Dahil etmek

#cihaz ADC=16

#FUSES NOWDT // Watch Dog Timer Yok

#FUSES NOBROWNOUT //Karartma sıfırlaması yok #FUSES NOLVP //Düşük voltajlı çalıştırma yok, G/Ç için B3(PIC16) veya B5(PIC18) kullanılır

#gecikmeyi kullan(kristal=6000000)

Şimdi ana kodu görelim:

#Dahil etmek

#Dahil etmek

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

#define LED_RED PIN_D0

karakter girişi; char cmp_="24"; karakter arabelleği[3];

#int_rda

void serial_communication_interrupt() { disable_interrupts(int_rda); imzasız int i = 0; inp = getc(); putc(inp); while(inp != '\0') { arabellek = inp; inp = getc(); putc(inp); ben++; } }

void main(void) {

set_tris_d(0x00); çıktı_d(0xFF); enable_interrupts(GLOBAL); while(1) { enable_interrupts(int_rda); if(strcmp(tampon, cmp_) == 0) output_low(LED_RED); yoksa output_high(LED_RED); } }

Başlangıçta, bizim durumumuzda dize karşılaştırma işlemi (strcmp) olan dize işlemlerinde yardımcı olacağımız dize kitaplığını ekledik. Yani bu koddaki amacımız, iletilen değer verdiğimiz değerle aynı ise D0 pinine bağlı led'i açmaktır ki bu "cmp_" eşittir "24" olur.

Öncelikle, veri iletildiğinde kesintiye neden olacak "rda" kesmesini etkinleştiriyoruz.

İkinci olarak, "serial_communication_interrupt" olarak adlandırılan ISR'nin (interrupt service rutin) içine bakalım. İçeride, alınan değeri okumak ve daha fazla kesintiye neden olmak için önce kesme bayrağını devre dışı bırakıyoruz. Bundan sonra karakter dizisini '\0'a ulaşana kadar okuruz. Dize içini okurken, alınan dizeyi almak için her bir karakteri arabelleğe yazarız.

Sonunda, tekrar içeri girerken. Burada string'i doğru alıp almadığımızı görmek için alınan string ve cmp_ string'i karşılaştırıyoruz. Eşit ise led açarım yoksa kapatırım.*

*Kodda, kartım D bağlantı noktası pin değerlerini tersine çevirdiği için ters yaptım. Kodunuzda bunu şu şekilde değiştirin:

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

Son olarak, onu derleyin ve MCU'nuza yükleyin ve ardından Python'da kodu çalıştırın. Led'in açık olduğunu görmelisiniz.

Adım 5: Sonuç

Bir görevi başarıyla tamamladık. Umarım sizin için faydalı olur. Herhangi bir sorunuz varsa, lütfen sormaktan çekinmeyin:) Bir sonraki projeye kadar.

Önerilen: