طراحی دستگاه مورس با ماژول وایرلس nrf24 و برد Arduino

ماژول nrf24 از شرکت Nordic Semiconductor یک ماژول کم مصرف، ارزان قیمت و کوچک است که در باند فرکانسی 2.4 گیگاهرتز عمل میکند. از این ماژول در انواع پروژه‌های ارسال داده به صورت wifi میتوان استفاده نمود. در این پروژه می‌خواهم به بررسی روش pair کردن دو ماژول nrf24 با استفاده از دو برد Arduino بپردازم.

تجهیزات مورد نیاز:

–    2 عدد ماژول nRF24
–    بردهای Arduino ProMini و Mega2560
–    2 عدد کلید فشاری
–    2 عدد Buzzer
–    منبع تغذیه مناسب برای ProMini

ماژول nrf24 دارای 8 پایه به شرح VCC ، CE، CSN، SCK، MOSI، MISO، IRQ می‌باشد که در این پروژه ما از تمام آنها به غیر از IRQ استفاده خواهیم کرد.

برای شناسایی پایه‌ها به تصاویر زیر دقت کنید:
nrf24 wifi module

NRF24L01 wifi pinout

حال تمام قطعات را به صورت زیر به بردها متصل می‌نماییم:

nrf24_mega nrf24_Promini

با توجه به pinout ماژول nrf24، روشن است که طریقه اتصال آن به Mega2560 با Uno و ProMini تفاوت دارد.  در بردهای Uno و ProMini پایه‌های SCK و MOSI و MISO به ترتیب دارای شماره‌های 13 و 11 و 12 هستند ولی این پین‌ها در Mega2560 به صورت 52  و 51 و 50 خواهند بود.

برای تشخیص نوع برد Arduino در زمان کامپایل برنامه و ارسال آن به برد می‌توان از Compiler Directive ها استفاده کرد. بنده در کد برنامه با بررسی نوع برد، pinout و ترتیب پایه‌ها را به شکل مناسب تغییر داده‌ام.

کد برنامه به صورت زیر است:

/*
*************************
* http://blog.mshams.ir * 
*************************
*
* nRF to Arduino pinmap
*
* Pins on UNO, ProMini:
* 1 GND, 2 VCC
* 3 CE -> 8
* 4 CSN -> 7
* 5 SCK -> 13
* 6 MOSI -> 11
* 7 MISO -> 12
*
* Pins on Mega2560:
* 1 GND, 2 VCC
* 3 CE -> 8
* 4 CSN -> 7
* 5 SCK -> 52
* 6 MOSI -> 51
* 7 MISO -> 50
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

char receive_Adrress[5] = "node1";
char send_Adrress[5] = "node2";
char packet = 0;
boolean masterNode;
boolean toneOn = false;
int toneFreq = 800;
int morseVal = 0;

#if defined(__AVR_ATmega2560__)
int ledPin = 13;
int morsePin = 24;
int tonePin = 5; //pwm
int switchPin = 26;
#else
int ledPin = 3;
int morsePin = 4;
int tonePin = 5; //pwm
int switchPin = 6;
#endif

void setup()
{  
  Serial.begin(9600); 

  pinMode(switchPin, INPUT_PULLUP);
  pinMode(morsePin, INPUT_PULLUP);  
  pinMode(ledPin, OUTPUT);

  //check master/slave
  masterNode = digitalRead(switchPin) == LOW ;
  Serial.println("Master:" + masterNode);

  //setup Mirf  
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *) (masterNode ? receive_Adrress : send_Adrress));
  Mirf.setTADDR((byte *) (masterNode ? send_Adrress : receive_Adrress));
  Mirf.payload = sizeof(unsigned long);
  Mirf.config();
  byte rf_setup = 0;
  Mirf.readRegister( RF_SETUP, &rf_setup, sizeof(rf_setup) );

  if (rf_setup != 0)   
    Serial.println("Beginning ... "); 
  else
  {
    Serial.println( "Wireless did not initialize!" );
    while (rf_setup==0);
  }
  delay(100);
}

void loop()
{
  if (!Mirf.isSending())
    check_MirfBuffer();

  //check morse switch on/off
  if (digitalRead(morsePin) == LOW
    ){
    morseVal = 1;
    sendPacket("1");
    Serial.println("SEND>1");
  }
  else{
    if (morseVal == 1){
      morseVal = 0;
      sendPacket("0");
      Serial.println("SEND>0");
    }
  }
} 

//This function checks mirf data availability.
void check_MirfBuffer()
{
  if (Mirf.dataReady())
  { 
    byte buffer[1];
    Mirf.getData(buffer);
    packet = char(buffer[0]);
  }
  else if (packet != 0 )   
    buffer_ready();   
}

//This function sends a packet
void sendPacket(char packet[1])
{   
  Mirf.send((byte *)packet);
  while(Mirf.isSending());
}

//This function parses received commands from another nrfs.
void buffer_ready()
{                                                                  
  if (packet == '1')
  {
    tone(tonePin, toneFreq);
    digitalWrite(ledPin, HIGH);
  }   
  else if (packet == '0')
  {
    noTone(tonePin);
    digitalWrite(ledPin, LOW);    
  }
  Serial.println("RECV>" + packet);
  packet = 0;
}

About محمد شمس

برنامه‌نویس، طراح انیمیشن و علاقمند به هوش مصنوعی

2 Comments

  1. مهندس جان شماتیک ها را با چی طراحی کردید، خیلی خوب درامده؟

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


3 × = 15