สารบัญ:

PIC MCU และการสื่อสารแบบอนุกรม Python: 5 ขั้นตอน
PIC MCU และการสื่อสารแบบอนุกรม Python: 5 ขั้นตอน

วีดีโอ: PIC MCU และการสื่อสารแบบอนุกรม Python: 5 ขั้นตอน

วีดีโอ: PIC MCU และการสื่อสารแบบอนุกรม Python: 5 ขั้นตอน
วีดีโอ: How to Serial Communication between Python and Arduino (สอนสั่งงานarduinoบอร์ดผ่านโปรแกรมpython) 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: เราต้องการอะไร

เราต้องการอะไร?
เราต้องการอะไร?
เราต้องการอะไร?
เราต้องการอะไร?

ก่อนอื่นเรามาดูกันว่าเราต้องการอะไร ในแง่ของฮาร์ดแวร์:

  • แน่นอน PIC MCU ซึ่งในกรณีของฉันคือ PIC16f877a (คุณไม่จำเป็นต้องใช้บอร์ดนั้นเพื่อทำให้การเชื่อมต่อสกปรกง่ายขึ้น)
  • ตัวแปลง USB เป็น TTL เพื่อสื่อสารกับ PIC MCU ผ่านพอร์ต USB โดยใช้พิน TX และ RX
  • โปรแกรมเมอร์ MCU ซึ่งในกรณีของฉัน โปรแกรมเมอร์ K150 แต่คุณสามารถใช้ PicKit 2, 3 หรืออย่างอื่นได้
  • และในที่สุดคอมพิวเตอร์:)

ในแง่ของซอฟต์แวร์:

  • IDE เพื่อเขียนโค้ด python ซึ่งในกรณีของฉันคือ Pycharm แต่คุณสามารถใช้ Python IDE ปกติได้เช่นกัน
  • สภาพแวดล้อมสำหรับการเขียนโปรแกรม MCU ซึ่งในกรณีของฉัน MPLAB X IDE พร้อมคอมไพเลอร์ CCS C

ขั้นตอนที่ 2: การเชื่อมต่อฮาร์ดแวร์

การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์

ในภาพที่แนบมาการเชื่อมต่อฮาร์ดแวร์จะได้รับซึ่งอยู่ระหว่างตัวแปลง PIC MCU และ USB TTL ดังต่อไปนี้:

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

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

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

คุณไม่จำเป็นต้องเชื่อมต่อพิน VCC ของตัวแปลง USB TTL (แต่ถ้าคุณต้องการ คุณสามารถทำได้) การเชื่อมต่อ 3 อย่างนี้ค่อนข้างเพียงพอ

ขั้นตอนที่ 3: ซอฟต์แวร์ Python

เรามาเริ่มเขียนซอฟต์แวร์สำหรับฝั่ง Python ซึ่งจะเป็นเครื่องส่งในกรณีของเรา เพราะมันจะส่งสตริงไปที่ MCU

import serial #import serial librarydata = '24' #data ที่เราจะส่งข้อมูล = a+'\0' ser = serial. Serial('COM17', baudrate=9600, timeout=1) #connect to the port 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 //ไม่มีตัวจับเวลาการดูสุนัข

#FUSES NOBROWNOUT //ไม่มีการรีเซ็ตไฟตก #FUSES NOLVP //ไม่มี prgming แรงดันไฟต่ำ, B3(PIC16) หรือ B5(PIC18) ที่ใช้สำหรับ I/O

#ใช้ดีเลย์(คริสตัล=6000000)

ตอนนี้เรามาดูรหัสหลัก:

#รวม

#รวม

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

#define LED_RED PIN_D0

ถ่าน inp; ถ่าน cmp_="24"; ถ่านบัฟเฟอร์[3];

#int_rda

เป็นโมฆะ serial_communication_interrupt () { disable_interrupts (int_rda); int ที่ไม่ได้ลงชื่อ i = 0; inp = getc(); พัต (inp); ในขณะที่ (inp != '\0') { บัฟเฟอร์ = inp; inp = getc(); พัต (inp); ผม++; } }

โมฆะหลัก (เป็นโมฆะ) {

set_tris_d(0x00); output_d(0xFF); enable_interrupts(GLOBAL); ในขณะที่ (1) { enable_interrupts (int_rda); if(strcmp(บัฟเฟอร์, cmp_) == 0) output_low(LED_RED); อื่น output_high (LED_RED); } }

ในตอนเริ่มต้น เราจะรวมไลบรารีสตริงซึ่งเราจะเป็นประโยชน์ในการดำเนินการสตริง ซึ่งในกรณีของเราคือการดำเนินการเปรียบเทียบสตริง (strcmp) ดังนั้น จุดประสงค์ของเราในรหัสนี้คือการเปิดไฟ LED ที่เชื่อมต่อกับพิน D0 หากค่าที่ส่งนั้นเหมือนกับค่าที่เราให้ไว้ซึ่งก็คือ "cmp_" เท่ากับ "24"

ก่อนอื่นเราเปิดใช้งาน "rda" ขัดจังหวะซึ่งจะทำให้เกิดการขัดจังหวะเมื่อมีการส่งข้อมูล

ประการที่สอง มาดูภายใน ISR (รูทีนบริการขัดจังหวะ) ซึ่งเรียกว่า "serial_communication_interrupt" ภายในก่อนอื่นเราปิดใช้งานการตั้งค่าสถานะขัดจังหวะเพื่ออ่านค่าที่ได้รับและทำให้เกิดการขัดจังหวะต่อไป หลังจากนั้นเราอ่านอักขระสตริงทีละอักขระจนถึง '\0' ในขณะที่อ่านภายในสตริง เรายังเขียนอักขระแต่ละตัวลงในบัฟเฟอร์เพื่อรับสตริงที่ได้รับ

ในตอนท้ายเราเข้ามาอีกครั้งในขณะที่ ที่นี่เราเปรียบเทียบสตริงบัฟเฟอร์ซึ่งได้รับสตริงและสตริง cmp_ เพื่อดูว่าเราได้รับสตริงอย่างถูกต้องหรือไม่ หากเท่ากันฉันจะเปิดไฟ LED ไม่เช่นนั้นให้ปิด*

*ในรหัสฉันย้อนกลับเพราะบอร์ดของฉันกลับค่าพินพอร์ต D ในรหัสของคุณเปลี่ยนเป็น:

if(strcmp(บัฟเฟอร์, cmp_) == 0) output_high(LED_RED);else output_low(LED_RED);

สุดท้าย คอมไพล์และอัปโหลดไปยัง MCU ของคุณ จากนั้นรันโค้ดใน Python คุณควรเห็นไฟ LED เปิดอยู่

ขั้นตอนที่ 5: บทสรุป

เราทำสำเร็จไปหนึ่งงานแล้ว ฉันหวังว่ามันจะเป็นประโยชน์สำหรับคุณ หากคุณมีคำถามใด ๆ โปรดอย่าลังเลที่จะถาม:) จนถึงโครงการต่อไป

แนะนำ: