راه اندازی UART رزبری پای پیکو – Raspberry Pi Pico UART
UART رزبری پای پیکو یکی از پریفرالهای پرکاربرد این میکروکنترلر است. از آنجا که کامپیوترها هم ارتباط سریال را پشتیبانی میکنند این ارتباط کاربرد ویژهای در ارتباط سختافزار با کامپیوتر دارد. در این نوشته ابتدا توضیحاتی کلی در مورد ارتباط سریال UART ارائه دادهایم. سپس نحوه راه اندازی UART رزبری پای پیکو در میکرو پایتون آورده شده است.
UART چیست؟
UART یا همان (Universal Asynchronous Receiver Transmitter) یک ارتباط سریال آسنکرون با توانایی انتقال full duplex است که میتواند دادهها را به صورت سریال بین دو سخت افزار انتقال دهد. اگر در مورد نحوه کار درگاه UART نیازمند اطلاعات هستید میتوانید به مقاله UART چیست؟ مراجعه کنید.
UART رزبری پای پیکو
برد Raspberry Pi Pico و یا به عبارت درستتر آیسی RP2040 دارای دو واحد UART کاملا مجزا از یکدیگر است که به نامهای UART0 و UART1 شناخته میشوند. امکان تخصیص پینهای متنوعی از میکروکنترلر به این UART رزبری پای پیکو فراهم است که جدول آن در ادامه آورده شده است.

مهمترین مشخصههای واحد UART رزبری پای پیکو به شرح زیر است
- بافر دریافت با اندازه 32×8 bit
- بافر ارسال با اندازه 32×12 bit
- حداکثر Baud Rate برابر با UARTCLK/16 که به معنی 7.8Mbaud در فرکانس کاری 125MHz است.
- عدد data size میتواند 5, 6, 7 یا 8 بیت باشد.
- دارای پایههای کنترلی RTS و CTS
- امکان اتصال به DMA در فرستندگی و گیرندگی
- امکان تولید وقفه ارسال و دریافت
برای دریافت اطلاعات بیشتر در مورد واحد UART رزبری پای پیکو میتوانید دیتاشیت RP2040 را مطالعه کنید.
راه اندازی UART رزبری پای پیکو
برای راهاندازی و تست UART رزبری پای پیکو میخواهیم یک دیتا را روی پایه TX از UART0 ارسال کنیم و همان داده را از پایه RX همین UART دریافت کنیم. تنظیمات مورد نظر ما 96008n1 این خواهد بود. میتوانیم از هرکدام از پایههای تخصیص داده شده رزبری پای پیکو به UART0 استفاده کنیم. انتخاب ما پایههای GP0 و GP1 است. دقت داشته باشید برای آنکه دیتای ارسالی از پایه TX را در پایه RX دریافت کنید باید پایه GP0 را با یک تکه سیم به پایه GP1 متصل کنید.

برای انتقال داده از طریق UART رزبری پای پیکو، در اولین قدم کلاسهای UART و Pin را از ماژول machine ایمپورت میکنیم. اگر در مورد کلاس PIN یا ماژول machine به اطلاعات بیشتری نیاز دارید میتوانید به مقاله راه اندازی پایه های رزبری پای پیکو مراجعه کنید.
from machine import UART, Pin
در مرحله بعد یک نمونه (instance) از کلاس UART با نام uart0 میسازیم (این نام دلخواه است) و تنظیمات مورد نظر خود را به آن اعمال میکنیم.
uart0 = UART(0, baudrate=9600, bits=8, parity=None, stop=1, tx=Pin(0), rx=Pin(1));
پارامترهای استفاده شده به صورت زیر است
- id (پارامتر اول) : اگر 0 باشد به معنی استفاده از UART0 است و اگر 1 باشد مشخص کننده استفاده از UART1 است.
- baudrate: مشخص کننده نرخ ارسال است. این پارامتر اختیاری است و مقدار پیشفرض آن 9600 است.
- bits: مشخص کننده عدد data size است و میتواند 5, 6, 7 یا 8 باشد. این پارامتر اختیاری است و مقدار پیشفرض آن 8 است.
- pariry: اگر 0 باشد به معنی even، اگر 1 باشد به معنی odd و اگر None باشد به معنی no parity است. این پارامتر اختیاری است و مقدار پیشفرض آن None است.
- stop: تعداد stop bit را مشخص میکند و میتواند 1 یا 2 باشد. این پارامتر اختیاری است و مقدار پیشفرض آن 1 است.
- tx: مشخص کند کدام پایه به TX اختصاص داده شود و باید از جنس Pin باشد.
- rx: مشخص کند کدام پایه به RX اختصاص داده شود و باید از جنس Pin باشد.
حال میخواهیم کرکتر A را توسط UART ارسال کنیم. به این منظور از متد write استفاده میکنیم.
uart0.write('A')
این متد میتواند یک کرکتر، یک string و یا در حالت کلیتر یک بافر از جنس 8بیتی را به عنوان ورودی دریافت کند. در حالت بافر یا string میتوان تعداد بایتهای ارسالی را نیز مشخص کرد. همچنین این متد تعداد بایتهایی که ارسال شده است را به عنوان خروجی برمیگرداند. به عنوان نمونه کد زیر را در نظر بگیرید
n = uart0.write('Hello', 3)
در نتیجه ارسال این کد 3 بایت Hel ارسال خواهد شد و مقدار n برابر با 3 میشود.
به مثال خود برگردیم. میخواهیم کرکتر ارسالی A را در ورودی UART دریافت کنیم. اگر بلافاصله پس از ارسال در UART ورودی آن را بخوانیم چیزی دریافت نمیکنیم چون از نظر فیزیکی مدتی طول میکشد تا تمام بیتها در پایه TX قرار گیرند و همچنین در RX دریافت شوند.
برای حل این موضوع دو رویکرد وجود دارد. راه حل اول اینکه یک تاخیر کوچک ایجاد کنیم و سپس UART را بخوانیم. راه حل دوم (که پیشنهاد میشود) این است که دریافت داده در UART را مانیتور کنیم و هرگاه دادهای وجود داشت اقدام به خواندن آن کنیم. قطعه کد زیر را در نظر بگیرید
while not uart0.any():
pass
data = uart0.read()
متد any تعداد بایتهایی در UART که دریافت شدهاند و منتظر خوانده شدن توسط برنامه هستند را مشخص میکند. در کد نوشته شده تا وقتی این مقدار 0 است درون while منتظر میمانیم. هرگاه این عدد غیر 0 شود از while خارج شده و توسط متد read دادهها را میخوانیم و درون متغیر data میریزیم. این متد میتواند تعداد بایت را به عنوان ورودی دریافت کند. اگر عدد تعداد بایت به عنوان ورودی به آن ارسال شود همان تعداد بایت را میخواند و اگر خالی گذاشته شود تمام بایتهای دریافت شده را میخواند.
کد نهایی به صورت زیر است
from machine import UART, Pin
uart = UART(0, baudrate=9600, bits=8, parity=None, stop=1, tx=Pin(0), rx=Pin(1));
uart.write('A')
while not uart.any():
pass
data = uart.read()
print(data)
در پایان
در انتها از شما دعوت میکنیم نظرات، دانستهها و یا تجربیات خود در مورد UART رزبری پای پیکو را در بخش کامنتهای این مقاله با ما به اشتراک بگذارید و به مفیدتر بودن این نوشته کمک کنید.
پست های مرتبط
3 دی 1403
دیدگاهتان را بنویسید