جدول المحتويات:

PIC MCU و Python Serial Communication: 5 خطوات
PIC MCU و Python Serial Communication: 5 خطوات

فيديو: PIC MCU و Python Serial Communication: 5 خطوات

فيديو: PIC MCU و Python Serial Communication: 5 خطوات
فيديو: 002-Python reading Arduino - STM32 Serial data using Graphic User Interface GUI Tkinter & threading 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: برنامج Python

لنبدأ في كتابة برنامج لجانب Python والذي سيكون جهاز الإرسال في حالتنا ، لأنه سيرسل السلسلة إلى MCU.

import serial #import serial librarydata = '24' # البيانات التي سنرسلها = a + '\ 0' ser = serial. Serial ('COM17' ، معدل الباود = 9600 ، المهلة = 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

#يشمل

#device ADC = 16

#FUSES NOWDT // No Watch Dog Timer

#FUSES NOBROWNOUT // لا يوجد إعادة تعيين Brownout #FUSES NOLVP // لا يوجد جهد منخفض ، B3 (PIC16) أو B5 (PIC18) يستخدم للإدخال / الإخراج

# تأخير الاستخدام (كريستال = 6000000)

الآن دعنا نرى الكود الرئيسي:

#يشمل

#يشمل

#use rs232 (الباود = 9600 ، xmit = pin_C6 ، rcv = pin_C7 ، التكافؤ = N ، التوقف = 1)

#define LED_RED PIN_D0

شار انب شار cmp _ = "24" ؛ شار عازلة [3] ؛

#int_rda

باطل serial_comm Communication_interrupt () {disable_interrupts (int_rda) ؛ int i = 0 ؛ inp = getc () ؛ putc (inp) ؛ while (inp! = '\ 0') {عازلة = inp؛ inp = getc () ؛ putc (inp) ؛ أنا ++ ؛ }}

باطل رئيسي (باطل) {

set_tris_d (0x00) ؛ الإخراج_d (0xFF) ؛ enable_interrupts (عالمي) ؛ بينما (1) {enable_interrupts (int_rda) ؛ إذا (strcmp (المخزن المؤقت ، cmp_) == 0) output_low (LED_RED) ؛ آخر output_high (LED_RED) ؛ }}

في البداية نقوم بتضمين مكتبة السلاسل التي سنكون مفيدة في عمليات السلسلة والتي في حالتنا هي عملية مقارنة السلسلة (strcmp). لذلك ، هدفنا في هذا الكود هو تشغيل الصمام المتصل بالرقم D0 إذا كانت القيمة المرسلة هي نفس القيمة المعطاة لدينا وهي "cmp_" تساوي "24".

بادئ ذي بدء ، نقوم بتمكين مقاطعة "rda" التي ستؤدي إلى مقاطعة عند إرسال البيانات.

ثانيًا ، دعنا ننظر داخل ISR (روتين خدمة المقاطعة) والذي يسمى "serial_comm Communication_interrupt". في الداخل ، نقوم أولاً بتعطيل علامة المقاطعة من أجل قراءة القيمة المستلمة والتسبب في مزيد من المقاطعة. بعد ذلك قرأنا السلسلة حرفًا بحرف حتى وصلنا إلى "\ 0". أثناء القراءة داخل السلسلة ، نكتب أيضًا كل حرف إلى المخزن المؤقت من أجل الحصول على سلسلة مستلمة.

في النهاية ، دخلنا مرة أخرى أثناء. نحن هنا نقارن بين سلسلة المخزن التي تم استلامها من السلسلة و cmp_ من أجل معرفة ما إذا كنا نحصل على السلسلة بشكل صحيح. إذا كانت متساوية ، فأنا أقوم بتشغيل المصباح ، وإلا أطفئ.

* في الكود ، قمت بالعكس لأن لوحي يعكس قيم دبوس منفذ D. في التعليمات البرمجية الخاصة بك قم بتغييرها إلى:

إذا (strcmp (المخزن المؤقت ، cmp_) == 0) output_high (LED_RED) ؛ وإلا output_low (LED_RED) ؛

أخيرًا ، قم بتجميعه وتحميله إلى MCU الخاص بك ثم قم بتشغيل الكود في Python. يجب أن ترى تشغيل الصمام.

الخطوة 5: الخاتمة

لقد انتهينا من مهمة واحدة بنجاح. آمل أن يكون مفيدًا لك. إذا كان لديك أي سؤال ، من فضلك لا تتردد في طرح:) حتى المشروع التالي.

موصى به: