در سال های اخیر برای انتقال بیسیم اطلاعات از پروتکل های بسیاری استفاده شده است. یکی از آیسی هایی که امروزه بسیار بین دوستداران الکترونیک باب شده NRF24L01 می باشد که بنابر تعریف خود کمپانی سازنده Nodric این آیسی یک آیسی ارزان قیمت با توان مصرفی پایین و برد بالا و مناسب برای انتقال اطلاعت با حجم کم و سرعت پایین (حداکثر 2 مگابیت بر ثانیه) می باشد. این آیسی ها انواع مختلفی دارند و با توجه به امکانات و برد شان قیمت های متفاوتی دارند.
از مهمترین مزیت هایی که این آیسی های Transceiver (فرستنده/گیرنده) دارند این است که کاربر نیازی نیست درگیر مدارهای مخابراتی و پیچیدگی های مربوط به آن شود.در این آموزش ما قصد داریم که به معرفی و راه اندازی آیسی Ci24R1 بپردازیم که یک آیسی چینی مشابه NRF24L01 هست و بسیاری از قابلیت های آنرا دارد ولی قیمتی بسیار پایین تری دارد. و برای کار های تیراژ مناسب است.
معرفی آیسی Ci24R1
تراشه Ci24R1 یک تراشه چینی مشابه NRF24L01 می باشد که بلوک دیاگرام آن مطابق شکل زیر می باشد.
همانطور که در شکل بالا مشاهده می شود ارتباط با این تراشه مانند NRF از طریق پروتکل SPI انجام میشود بنابراین برای پیکربندی و راه اندازی Ci24R1 نیاز به یک میکرو کنترلر هست. محدوده فرکانس کاری این تراشه 2400 تا 2525 مگاهرتز با 126 کانال و پهنای باند 1 مگاهرتز می باشد. Ci24R1 از فناوری مدولاسیون و دمدولاسیون دیجیتال GFSK/FSK استفاده می کند. سرعت انتقال داده و توان خروجی PA را می توان تنظیم کرد و از سه نرخ داده 2Mbps، 1Mbps و 250Kbps پشتیبانی می کند.
همانطور که در تصویر بالا مشاهده می شود این در پکیج SOP-8 موجود است و دارای 3 پایه CSN ، SCK و DATA میباشد که پایه های SPI می باشند. پایه های XC1 و XC2 پایه های مربوط به اتصال کریستال (ترجیحا 16MHz) می باشند. پایه ANT برای اتصال آنتن 2.4 گیگاهرتزی و پایه های VDD و VSS تغذیه 3.3V این آیسی را شامل می شوند.
در ادامه تصویری از ماژول این تراشه که در این مطلب از آن استفاده میکنیم را مشاهده میکنید:
راه اندازی ماژول فرستنده گیرنده رادیویی Ci24R1 با آردوینو
برای راه اندازی و تست Ci24R1 به دو ماژول Ci24R1 ، دو Arduino Uno و تعدادی سیم برد بردی نیاز داریم در ادامه نحوه اتصال ماژول به آردوینو را میتوانید بررسی کنید. این مدار برای فرستنده و گیرنده یکسان است
کتابخانه و برنامه های مربوط به این آیسی در این لینک موجود می باشد. در پوشه Ci24r1-Arduino دو پوشه به نام های Ci24R1-Recieve و Ci24R1-transmit وجود دارد. با توجه به کد ci24r1.hpp پایه های SCK ، CSN و DATA باید مطابق برنامه زیر متصل شوند.
1 2 3 | #define CI24R1_CSN 8 #define CI24R1_MOSI 12 #define CI24R1_SCK 13 |
توجه شود که MOSI همان DATA می باشد.
بررسی کد Transmit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include "ci24r1.hpp" #include <Arduino.h> // 0:TX, 1:RX #define CI24R1_MODE 0 uint8_t TX_ADDRESS[5]={0x34,0x43,0x10,0x10,0x01}; uint8_t RX_ADDRESS[5]={0x01,0x43,0x10,0x10,0x34}; uint8_t tmp[] = { 0x1F, 0x80, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x21, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x28, 0x31, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x38, 0x41, 0x12, 0x13, 0x14, 0x15, 0x16, 0x37, 0x48}; extern uint8_t *xbuf_data; void setup() { Serial.begin(9600); pinMode(CI24R1_SCK, OUTPUT); pinMode(CI24R1_CSN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); uint8_t i, j, status; while (CI24R1_SPI_Test() == 1) { Serial.println(" - check failed\r\n"); } Serial.println(" - check passed\r\n"); delay(2000); CI24R1_Init(); } void loop() { // digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) // delay(1000); // wait for a second // digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW // delay(1000); if (CI24R1_MODE == 0) { // TX CI24R1_SetChannel(60); CI24R1_SetTxMode(); CI24R1_SetTxAddress(TX_ADDRESS); CI24R1_SetRxAddress(RX_ADDRESS); Serial.println("CI24R1 TX Initialized\r\n"); CI24R1_PrintStatus(); CI24R1_Tx(tmp, CI24R1_PLOAD_WIDTH); delay(500); } } |
خط 28 تابعی به اسم CI24R1_SPI_Test را صدا می زند. وظیفه این تابع این است که بررسی کند آیا ماژول Ci24R1 به پین های SPI مربوطه در آردوینو به درستی متصل شده است یا نه. چنانچه اتصال به درستی انجام شده بود پیام check passed را به نمایش می گذارد. تابع CI24R1_Init وظیفه پیکربندی آیسی را برعهده دارد. در خط 48 تابع CI24R1_SetChannel کانال (فرکانس) مورد نظر برای ارسال را تعیین می کند که حتما باید در برنامه دریافت یکی باشد.
تابع CI24R1_SetTxMode تراشه را در مد کاری ارسال قرار می دهد. دو تابع CI24R1_SetTxAddress و CI24R1_SetRxAddress آدرس مختص به گیرنده و فرستنده را مشخص می کند و برای زمانهایی که چندین گیرنده و فرستنده هستند کاربردی می باشد توجه شود که حتما این آدرس ها در هر دو طرف فرستنده و گیرنده یکسان باید باشند. تابع CI24R1_PrintStatus تمامی وضعیت تمامی پیکربندی های انجام شده اعم از آدرس فرسنتده و گیرنده ای که تعیین کردیم ، کانال ارسالی ، توان خروجی حداکثر تعداد بافر تعیین شده و … را نشان می دهد که میتواند حذف شود.
در نهایت تابع CI24R1_Tx بافر tmp تعریف شده را برای گیرنده ارسال میکند.
بررسی برنامه Recieve
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include "ci24r1.hpp" #include <Arduino.h> #define CI24R1_MODE 1 uint8_t TX_ADDRESS[5]={0x34,0x43,0x10,0x10,0x01}; uint8_t RX_ADDRESS[5]={0x01,0x43,0x10,0x10,0x34}; char temp1[100]; uint8_t tmp[] = { 0x1F, 0x80, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x21, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x28, 0x31, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x38, 0x41, 0x12, 0x13, 0x14, 0x15, 0x16, 0x37, 0x48}; extern uint8_t *xbuf_data; extern uint8_t xbuf[CI24R1_PLOAD_MAX_WIDTH + 1]; void setup() { Serial.begin(9600); pinMode(CI24R1_SCK, OUTPUT); pinMode(CI24R1_CSN, OUTPUT); uint8_t i, j, status; while (CI24R1_SPI_Test() == 1) { Serial.println(" - check failed\r\n"); } Serial.println(" - check passed\r\n"); delay(2000); CI24R1_Init(); CI24R1_SetChannel(60); CI24R1_SetRxMode(); CI24R1_SetTxAddress(RX_ADDRESS); CI24R1_SetRxAddress(TX_ADDRESS); Serial.println("CI24R1 RX Initialized\r\n"); } void loop() { //CI24R1_PrintStatus(); CI24R1_Rx(); sprintf(temp1,"recieved-buff[0] = %d",xbuf[0]); Serial.println("\r\n"); Serial.println(temp1); delay(100); } |
در این برنامه با استفاده از تابع CI24R1_SetRxMode ماژول دوم را در حالت دریافت قرار میدهیم. تابع CI24R1_Rx بایت های ارسالی از برنامه Transmit دریافت میکند و در بافر xbuf میریزد که همانطور که در شکل می بینید عدد 31 معادل 0x1F در داخل خانه شماره صفر بافر xbuf ریخته شده است. سایر اعداد نیز در شکل زیر نشان داده شده است.
همچنین میتوان با استفاده تغییر عدد CI24R1_PLOAD_WIDTH در فایل ci24r1.hpp تعداد بافر دریافتی را تنظیم کرد. توجه شود که مقدار این ثابت در هردو برنامه فرستنده و گیرنده باید یکسان باشد.
برد ارسال و دریافت حداکثر چند متر هست؟
سلام. کمی کمتر از ماژول های NRF
برد چقدر هست تقریبا
سپاس
سلام. قیمت ماژول در حال حاضر 30 هزار ت و قیمت خود تراشه 15 هزار ت هست. از لینک انتهای مطلب میتونید خرید کنید