آموزش ارتباط رادیویی آردوینو و رزبری پای با nRF24L01

محتویات
مهندسین برای برقراری ارتباط بین دو مجموعه از روش های مختلفی بنا بر نیاز استفاده میکنند. مثلا ارتباطات سیمی و سریالی برای مواردی که محدودیتی در زمینه اتصال وجود ندارد، بلوتوث برای فواصل نزدیک، ارتباط وایفای برای مسافت کمی بیشتر و ارتباط رادیویی برای مسافت بیشتر استفاده میشود. در این میان ارتباط رادیویی از گذشته تا به امروز بسیار محبوب است. ما در این پروژه از ماژول رادیویی nRF24L01 استفاده میکنیم که با استفاده از فرکانس 2.4 مگاهرتز و با سرعت 250 کیلوبایت تا 2 مگابایت بر ثانیه کار میکند. در صورت استفاده از آنتن مناسب میتوانید سیگنال ها را تا فاصله 100 متری رد و بدل کنید. ما در این پروژه از رزبری پای اطلاعات را به سمت آردوینو میفرستیم.
فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.
آموزش به دو بخش تقسیم می شود. بخش اول شامل ارتباط nRF24L01 با Arduino برای عمل کردن به عنوان گیرنده خواهد بود و بخش دوم شامل اربتاط nRF24L01 با Raspberry Pi است تا به عنوان فرستنده عمل کند. کد کامل و فیلم عملکرد در انتهای صفحه قرار داده شده است.
همچنین ما قبلا روش های دیگری را برای ارتباط رزبری پای با آردوینو قرار داده ایم :
- آموزش ارتباط همتا به همتا رزبری پای و آردوینو با LoRa
- ارتباط سریال بین آردوینو و رزبری پای با Rs-485
- آموزش برقراری ارتباط سریال بین آردوینو و رزبری پای
ماژول رادیویی nRF24L01 چیست؟

BLE از باند ISM 2.4 گیگاهرتز با نرخ baud از 250Kbps تا 2Mbps استفاده می کند که در بسیاری از کشورها مجاز است و می تواند در کاربردهای صنعتی و پزشکی کاربرد داشته باشد. باند از 2400 مگاهرتز تا 2483.5 مگاهرتز شروع می شود و به 40 کانال تقسیم می شود. سه مورد از این کانال ها به عنوان “Advertising” شناخته شده اند و توسط دستگاه ها برای ارسال آیتم های تبلیغاتی به سایر دستگاه های BLE باستفاده میشوند.
ماژول های nRF24L01 ماژول های فرستنده گیرنده هستند ، به این معنی که هر ماژول می تواند داده را ارسال و دریافت کند. یعنی می توانند داده ها را بطور همزمان ارسال یا دریافت کنند. این ماژول با استفاده از پروتکل SPI ارتباط برقرار می کند و از این رو می توان به راحتی با هر میکروکنترلر آن را ارتباط داد.

ماژول nRF24L01 دارای ولتاژ کاری از 1.9 ولت تا 3.6 ولت است (به طور معمول 3.3 ولت) و در جریان کار عادی آن تنها 12 میلی آمپر است و از این رو می تواند با باتری های سکه ای نیز کار کند. گرچه ولتاژ کار 3.3 ولت است اما بیشتر پین ها 5 ولت تحمل دارند و از این رو می توانند به طور مستقیم با میکروکنترلرهای 5 ولت مانند آردوینو در ارتباط باشند. مزیت دیگر استفاده از این ماژول این است که ، هر ماژول دارای 6 کانال است. یعنی هر ماژول می تواند با 6 ماژول دیگر برای ارسال یا دریافت داده ارتباط برقرار کند.
مدار اتصال Raspberry pi و Arduino با ماژول رادیویی
مدار این پروژه را به دو قسمت تقسیم میکنیم. یک قسمت برای آردوینو و یک قسمت برای رزبری پای.
اتصال nRF24L01 به آردوینو
شماتیک مدار برای اتصال nRF24L01 به آردوینو آسان است و اجزای زیادی ندارد. nRF24l01 توسط رابط SPI متصل خواهد شد و ال سی دی 16×2 با پروتکل I2C که فقط از دو سیم استفاده می کند متصل میشود. تصویر زیر مدار را پس از اتصال نمایش میدهد.
اتصال nRF24L01 به رزبری پای
شماتیک مدار برای اتصال nRF24L01 به Raspberry Pi نیز بسیار ساده است و فقط از رابط SPI برای اتصال Raspberry Pi و nRF24l01 استفاده می شود. تصویر زیر مدار را پس از اتصال قطعات نشان میدهد.
برنامه نویسی رزبری پای برای ارسال پیام رادیویی
برنامه نویسی Raspberry Pi با استفاده از Python3 انجام می شود. همچنین می توانید از C / C ++ استفاده کنید. در حال حاضر یک کتابخانه برای nRF24l01 در python موجود است که میتوانید آن را در فایل دانلودی انتهای صفحه پیدا کنید. توجه داشته باشید که برنامه پایتون و کتابخانه باید در یک پوشه قرار داشته باشند. پس از بارگیری كتابخانه ، فقط پوشه را استخراج كنید و پوشه ای تهیه كنید كه تمام برنامه ها و فایلهای كتابخانه ای در آن ذخیره شوند. هنگامی که نصب کتابخانه انجام شد ، نوشتن برنامه را شروع کنید. این برنامه با گنجاندن كتابخانه هایی مانند كتابخانه GPIO برای دسترسی به Raspberry Pi GPIO و time برای دسترسی به توابع مربوط به زمان استفاده می شود ، آغاز می شود. اگر در زمینه رزبری پای تازه وارد هستید، آموزش های رزبری پای را بخوانید.
import RPi.GPIO as GPIO import time import spidev from lib_nrf24 import NRF24
ما می توانیم پین های GPIO رزبری پای یا شماره پین آن یا شماره GPIO آن ها وارد کنیم. به طور مثال پین 37 روی برد Raspberry pi، همان پین GPIO 26 است. بنابراین ما میتوانیم آن را با 26 کنیم.
GPIO.setmode(GPIO.BCM)
سپس آدرس را تنظیم می کنیم. این آدرس برای برقراری ارتباط با گیرنده آردوینو از اهمیت بسیاری برخوردار است. آدرس در کد هگز قرار خواهد گرفت.
pipes = [[0xE0, 0xE0, 0xF1, 0xF1, 0xE0], [0xF1, 0xF1, 0xF0, 0xF0, 0xE0]]
کار رادیو را با استفاده از GPIO08 به عنوان CE و GPIO25 به عنوان پین CSN شروع میکنیم.
radio.begin(0, 25)
اندازه بار را 32 بیت ، آدرس کانال را 76 ، سرعت داده 1 مگابایت و میزان توان را به عنوان حداقل تنظیم میکنیم.
radio.setPayloadSize(32) radio.setChannel(0x76) radio.setDataRate(NRF24.BR_1MBPS) radio.setPALevel(NRF24.PA_MIN)
سپس به نوشتن داده ها و چاپ جزئیات اصلی nRF24l01 میرسیم.
radio.openWritingPipe(pipes[0]) radio.printDetails()
یک پیام را به شکل رشته آماده میکنیم. این پیام به Arduino UNO ارسال می شود.
sendMessage = list("Hi..Arduino UNO") while len(sendMessage) < 32: sendMessage.append(0)
شروع به نوشتن به رادیو میکنیم و نوشتن رشته ها را ادامه میدهیم تا رادیو در دسترس باشد.
while True: start = time.time() radio.write(sendMessage) print("Sent the message: {}".format(sendMessage)) send radio.startListening()
اگر رشته تمام شود و پیپ بسته شود، پیام اشکال زدایی چاپ میشود.
while not radio.available(0): time.sleep(1/100) if time.time() - start > 2: print("Timed out.") break
ارتباط را میبندیم و بعد از 3 ثانیه ارتباط را مجدداً راه اندازی میکنیم تا پیام دیگری ارسال شود.
radio.stopListening() # بستن رادیو time.sleep(3) # تاخیر 3 ثانیه ای
اجرای برنامه پایتون در Raspberry Pi
اجرای برنامه پس از طی کردن مراحل زیر بسیار آسان است :
- فایل های برنامه Python و Library را در یک پوشه ذخیره کنید.
- نام پرونده برنامه من برای Sender nrfsend.py است.
- به ترمینال دستورات رزبری پای بروید. و با استفاده از دستور “cd” فایل برنامه Python را پیدا کنید.
- سپس پوشه را باز کرده و دستور “sudo python3 your_program.py” را بنویسید و Enter را بزنید. شما قادر خواهید بود جزئیات اصلی nRf24 را ببینید و رادیو پس از هر 3 ثانیه ارسال پیام ها را آغاز می کند.
برنامه نویسی آردوینو برای ارسال پیام رادیویی
برنامه نویسی Arduino UNO شبیه به برنامه نویسی Raspberry Pi است. ما روش های مشابه اما با زبان برنامه نویسی و مراحل مختلف را دنبال خواهیم کرد. کتابخانه nRF24l01 برای Arduino در انتهای صفحه در فایل دانلودی قرار داده شده است. کد کامل در انتهای صفحه در فایل دانلودی قرار داده شده است در اینجا بعضی از قسمت های کد را بررسی میکنیم.
برای ارتباط SPI با ماژول رادیویی کتابخانه SPI.h را فراخوانی میکنیم و برای ارتباط I2C با ال سی دی از کتابخانه Wire.h استفاده میکنیم. شما میتوانید از ارتباط معمولی برای ارسال اطلاعات از آردوینو به ال سی دی استفاده کنید.
#include <SPI.h> #include <Wire.h>
برای دسترسی به توابع RF24 و LCD از کتابخانه RF24 و LCD استفاده میکنیم.
#include<RF24.h> #include <LiquidCrystal_I2C.h>
آدرس LCD برای I2C عدد 27 استو بنابراین آن را مینویسیم.
LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 با پین های استاندارد SPI به CE در پین 9 و CSN در پین 10 وصل شده است.
RF24 radio(9, 10) ;
کار رادیو را شروع کنید ، سطح قدرت را تنظیم کرده و کانال را روی 76 تنظیم کنید. همچنین آدرس پیپ را همانند رزبری پای تنظیم کنید و لوله را برای خواندن باز کنید.
radio.begin(); radio.setPALevel(RF24_PA_MAX) ; radio.setChannel(0x76) ; const uint64_t pipe = 0xE0E0F1F1E0LL ; radio.openReadingPipe(1, pipe) ;
ارتباط I2C را شروع کرده و صفحه LCD را پیکربندی کنید.
Wire.begin(); lcd.begin(); lcd.home(); lcd.print("Ready to Receive");
شروع به گوش دادن به رادیو برای پیام های دریافتی کنید و طول پیام را 32 بایت تنظیم کنید.
radio.startListening() ; char receivedMessage[32] = {0}
اگر رادیو متصل است ، خواندن پیام را شروع کرده و آن را ذخیره کنید. پیام را در مانیتور سریال چاپ کنید و همچنین تا رسیدن پیام بعدی رادیو را متوقف کنید تا بعد از مدتی گوش دادن و دوباره امتحان کنید.
if (radio.available()) { radio.read(receivedMessage, sizeof(receivedMessage)); Serial.println(receivedMessage) ; Serial.println("Turning off the radio.") ; radio.stopListening() ; String stringMessage(receivedMessage) ; lcd.clear(); delay(1000); lcd.print(stringMessage); }
کد کامل داده شده در انتها را در آردوینو Uno بارگذاری کنید و منتظر دریافت پیام باشید.
به این ترتیب میتوانیم پیام ها و اطلاعات را از رزبری پای به آردوینو از طریق ارتباط رادیویی با ماژول nRF24L01 منتقل کنیم.
موارد موجود در فایل : سورس کامل ، شماتیک ، کتابخانه های مورد نیاز
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
سلام.وقت شما بخیر.
من هر چی تست می کنم همچنان ارتباط بین دو دستگاه برقرار نمی شه. حتی جریان رو ساده تر کردم و نبدیل به روشن و خاموش کردن ال ای دی کردم تا از بابت کد خیالم راحت بشه. در قسمت رزبری ترمینال نشون می ده که (send) اتفاق افتاده اما در آردینو هیچ اتفاقی نمافته و شناخت دستگاه صورت نمی گیره.
ممنون می شم راهنمایی بفرمایید.
سپاس