ارتباط مبتنی بر Li-Fi بین دو آردوینو

  • ۶۰ بازدید

Li-Fi (Light Fidelity) یک فناوری پیشرفته است که امکان انتقال داده ها را با استفاده از ارتباطات نوری مانند نور مرئی فراهم می کند. داده های Li-Fi می توانند از طریق نور عبور کنند و سپس با استفاده از هر دستگاه حساس به نور مانند LDR یا فوتودیود در سمت گیرنده تفسیر شوند. ارتباط Li-Fi می تواند 100 برابر سریعتر از Wi-Fi باشد.

آردوینو لای فای

در این پروژه، ما ارتباط Li-Fi را با استفاده از دو آردوینو نشان خواهیم داد . در اینجا داده های متنی با استفاده از LED و صفحه کلید 4×4 منتقل می شوند. و در سمت گیرنده با استفاده از LDR رمزگشایی می شود. قبلاً Li-Fi را با جزئیات توضیح دادیم.

اجزای مورد نیاز

  • آردوینو UNO
  • سنسور LDR (فتوسل)
  • صفحه کلید 4*4
  • ال سی دی 16*2 الفبایی
  • ماژول رابط I2C برای LCD
  • برد بورد
  • 5mmLED

معرفی مختصر Li-Fi

همانطور که در بالا توضیح داده شد، Li-Fi یک فناوری ارتباطی پیشرفته است که می تواند 100 برابر سریعتر از ارتباطات Wi-Fi باشد. با استفاده از این فناوری می توان داده ها را با استفاده از منابع نور مرئی منتقل کرد. تصور کنید، اگر فقط با استفاده از منبع نور خود می توانید به اینترنت پرسرعت دسترسی داشته باشید. به نظر خیلی جالب نیست؟

Li-Fi از نور مرئی به عنوان یک رسانه ارتباطی برای انتقال داده استفاده می کند. یک LED می تواند به عنوان منبع نور عمل کند و فتودیود به عنوان یک فرستنده و گیرنده عمل می کند که سیگنال های نور را دریافت کرده و آنها را به عقب منتقل می کند. با کنترل پالس نور در سمت فرستنده، می‌توانیم الگوهای داده منحصربه‌فردی را ارسال کنیم. این پدیده با سرعت بسیار بالایی رخ می دهد و از طریق چشم انسان قابل مشاهده نیست. سپس در سمت گیرنده، فتودیود یا مقاومت وابسته به نور (LDR) داده ها را به اطلاعات مفید تبدیل می کند.

بخش فرستنده Li-Fi با استفاده از آردوینو

همانطور که در شکل بالا نشان داده شده است، در قسمت فرستنده ارتباط Li-Fi، صفحه کلید به عنوان ورودی در اینجا استفاده می شود. این بدان معناست که ما متنی را که قرار است با استفاده از صفحه کلید منتقل شود انتخاب می کنیم. سپس اطلاعات توسط واحد کنترل پردازش می شود که در مورد ما چیزی جز آردوینو نیست. آردوینو اطلاعات را به پالس های باینری تبدیل می کند که می توانند به منبع LED برای انتقال داده شوند. سپس این داده ها به نور LED داده می شود که پالس های نور مرئی را به سمت گیرنده می فرستد.

نمودار مدار بخش فرستنده: 

راه اندازی سخت افزار برای سمت فرستنده: 

بخش فرستنده Li-Fi

بخش گیرنده Li-Fi با استفاده از آردوینو

بخش گیرنده Li-Fi با استفاده از آردوینو

در بخش گیرنده، سنسور LDR پالس های نور مرئی را از سمت فرستنده دریافت می کند و آن را به پالس های الکتریکی قابل تفسیر تبدیل می کند که به آردوینو (واحد کنترل) تغذیه می شود. آردوینو این پالس را دریافت می کند و آن را به داده های واقعی تبدیل می کند و آن را روی یک  نمایشگر LCD 16×2 نمایش می دهد .

نمودار مدار بخش گیرنده: 

نمودار مدار بخش گیرنده Li-Fi

راه اندازی سخت افزار برای سمت گیرنده:

بخش گیرنده Li-Fi

کد نویسی آردوینو برای Li-Fi

همانطور که در بالا نشان داده شد، ما دو بخش برای فرستنده و گیرنده Li-Fi داریم. کدهای کامل هر بخش در پایین آموزش و توضیح گام به گام کدها در زیر آورده شده است:

کد فرستنده آردوینو Li-Fi: 

در سمت فرستنده، آردوینو نانو با صفحه کلید 4×4 و LED استفاده می شود. ابتدا تمامی فایل های کتابخانه وابسته از طریق Arduino IDE در آردوینو دانلود و نصب می شوند. در اینجا از کتابخانه Keypad برای استفاده از صفحه کلید 4*4 استفاده می شود که از این لینک قابل دانلود است . در اینجا درباره رابط صفحه کلید 4×4 با آردوینو بیشتر بیاموزید .

#include <Keypad.h>

پس از نصب موفقیت آمیز فایل های کتابخانه، شماره را تعریف کنید. از مقادیر سطرها و ستون ها که برای هر دو 4 است، زیرا ما در اینجا از صفحه کلید 4*4 استفاده کرده ایم.

const byte ROW = 4;
const byte COL = 4;
char keyscode[ROW][COL] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

سپس پین های آردوینو که برای رابط با صفحه کلید 4*4 استفاده می شوند، تعریف می شوند. در مورد ما از A5، A4، A3 و A2 به ترتیب برای R1، R2، R3، R4 و A1، A0، 12، 11 برای C1، C2، C3 و C4 به ترتیب استفاده کرده ایم.

byte rowPin[ROW] = {A5, A4, A3, A2};
byte colPin[COL] = {A1, A0, 12, 11};
Keypad customKeypad = Keypad( makeKeymap(keyscode), rowPin, colPin, ROW, COL);

در داخل() setup پین خروجی تعریف شده است، جایی که منبع LED متصل است. همچنین هنگام روشن کردن دستگاه خاموش نگه داشته می شود.

void setup() 
{
  pinMode(8,OUTPUT);
  digitalWrite(8,LOW);
}

در داخل حلقه while ، مقادیر دریافت شده از صفحه کلید با استفاده از ()customKeypad.getKey خوانده می شود و در حلقه if-else مقایسه می شود  تا در هر فشار کلید، پالس های منحصر به فردی تولید شود. در کد مشاهده می شود که فواصل تایمر برای همه مقادیر کلید منحصر به فرد نگه داشته می شود.

char customKey = customKeypad.getKey();
  if (customKey) {
   if (customKey == '1')
  {
    digitalWrite(8,HIGH);
    delay(10);
    digitalWrite(8,LOW);
  }
ارتباط Li-Fi بین چندگانه آردوینو

کد گیرنده آردوینو Li-Fi: 

همانطور که در نمودار مدار نشان داده شده است، در سمت گیرنده Li-Fi، Arduino UNO با یک حسگر LDR ارتباط دارد. در اینجا سنسور LDR به صورت سری با یک مقاومت متصل می شود تا یک مدار تقسیم کننده ولتاژ تشکیل شود و ولتاژ خروجی آنالوگ از سنسور به عنوان سیگنال ورودی به آردوینو داده می شود. در اینجا ما از یک ماژول I2C با LCD برای کاهش تعداد استفاده می کنیم. از اتصالات با آردوینو زیرا این ماژول تنها به 2 پین داده SCL/SDA و 2 پایه پاور نیاز دارد.

کد را با گنجاندن تمام فایل های کتابخانه مورد نیاز در کد مانند Wire.h برای ارتباط I2C، LiquidCrystal_I2C.h برای LCD و غیره شروع کنید. این کتابخانه ها با آردوینو از قبل نصب شده اند، بنابراین نیازی به دانلود آنها نیست.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

برای استفاده از ماژول I2C برای LCD الفبایی عددی 16*2 ، آن را با استفاده از کلاس LiquidCrystal_I2C پیکربندی کنید . در اینجا باید آدرس، ردیف و شماره ستون را که در مورد ما به ترتیب 0x3f، 16 و 2 هستند، ارسال کنیم.

LiquidCrystal_I2C lcd(0x3f, 16, 2);

در () setup پین ورودی پالس را برای دریافت سیگنال اعلام کنید. سپس یک پیام خوشامدگویی را روی LCD چاپ کنید که در هنگام شروع پروژه نمایش داده می شود.

void setup()
{
  pinMode(8, INPUT);
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("       WELCOME TO              ");
  lcd.setCursor(0, 1);
  lcd.print("     CIRCUIT DIGEST              ");
  delay(2000);
  lcd.clear();
}

در داخل حلقه while ، مدت زمان ورودی پالس از LDR با استفاده از تابع pulseIn محاسبه می‌شود و نوع پالس تعریف می‌شود که در مورد ما LOW است. مقدار برای اهداف اشکال زدایی روی نمایشگر سریال چاپ می شود. پیشنهاد می شود مدت زمان را بررسی کنید، زیرا ممکن است برای تنظیمات مختلف متفاوت باشد.

 unsigned long duration = pulseIn(8, HIGH);
 Serial.println(duration);

پس از بررسی مدت زمان برای همه پالس‌های فرستنده، اکنون 16 محدوده مدت پالس داریم که برای مرجع ذکر شده است. اکنون آنها را با استفاده از یک حلقه IF-ELSE برای بدست آوردن اطلاعات دقیقی که ارسال شده است مقایسه کنید. یک حلقه نمونه برای کلید 1 در زیر آورده شده است:

if (duration > 10000 && duration < 17000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 1          ");
  }

فرستنده و گیرنده Li-Fi با استفاده از آردوینو

پس از آپلود کد کامل در هر دو آردوینو، هر دکمه روی صفحه کلید در سمت گیرنده را فشار دهید و همان رقم در LCD 2×16 در سمت گیرنده نمایش داده می شود.

فرستنده Li-Fi با استفاده از آردوینو
گیرنده Li-Fi با استفاده از آردوینو

به این ترتیب می توان از Li-Fi برای انتقال داده ها از طریق نور استفاده کرد. امیدوارم از مقاله لذت برده باشید و چیز جدیدی از آن یاد گرفته باشید، اگر شک دارید، می توانید از بخش نظرات استفاده کنید یا در انجمن ها بپرسید . کد

//Transmitter Side:
#include <Keypad.h>
const byte ROW = 4;
const byte COL = 4;
char keyscode[ROW][COL] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPin[ROW] = {A5, A4, A3, A2};
byte colPin[COL] = {A1, A0, 12, 11};
Keypad customKeypad = Keypad( makeKeymap(keyscode), rowPin, colPin, ROW, COL);
char keycount = 0;
char code[5];
void setup() 
{
  Serial.begin(9600);
  pinMode(8,OUTPUT);
  digitalWrite(8,LOW);
}
void loop()
{
  char customKey = customKeypad.getKey();
  if (customKey) {
    Serial.println(customKey);
   if (customKey == '1')
  {
    digitalWrite(8,HIGH);
    delay(10);
    digitalWrite(8,LOW);
  }
  else if (customKey == '2')
  {
    digitalWrite(8,HIGH);
    delay(20);
    digitalWrite(8,LOW);
  }
  else if (customKey == '3')
  {
    digitalWrite(8,HIGH);
    delay(30);
    digitalWrite(8,LOW);
  }
  else if (customKey == '4')
  {
    digitalWrite(8,HIGH);
    delay(40);
    digitalWrite(8,LOW);
  }
  else if (customKey == '5')
  {
    digitalWrite(8,HIGH);
    delay(50);
    digitalWrite(8,LOW);
  }
  else if (customKey == '6')
  {
    digitalWrite(8,HIGH);
    delay(60);
    digitalWrite(8,LOW);
  }
  else if (customKey == '7')
  {
    digitalWrite(8,HIGH);
    delay(70);
    digitalWrite(8,LOW);
  }
  else if (customKey == '8')
  {
    digitalWrite(8,HIGH);
    delay(80);
    digitalWrite(8,LOW);
  }
  else if (customKey == '9')
  {
    digitalWrite(8,HIGH);
    delay(90);
    digitalWrite(8,LOW);
  }
  else if (customKey == '*')
  {
    digitalWrite(8,HIGH);
    delay(100);
    digitalWrite(8,LOW);
  }
  else if (customKey == '0')
  {
    digitalWrite(8,HIGH);
    delay(110);
    digitalWrite(8,LOW);
  }
  else if (customKey == '#')
  {
    digitalWrite(8,HIGH);
    delay(120);
    digitalWrite(8,LOW);
  }
  else if (customKey == 'A')
  {
    digitalWrite(8,HIGH);
    delay(130);
    digitalWrite(8,LOW);
  }
  else if (customKey == 'B')
  {
    digitalWrite(8,HIGH);
    delay(140);
    digitalWrite(8,LOW);
  }
  else if (customKey == 'C')
  {
    digitalWrite(8,HIGH);
    delay(150);
    digitalWrite(8,LOW);
  }
  else if (customKey == 'D')
  {
    digitalWrite(8,HIGH);
    delay(160);
    digitalWrite(8,LOW);
  }
  else;
  } 
}


//Receiver Side:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <SoftwareSerial.h>
#include <Keypad.h>
void setup()
{
  pinMode(8, INPUT);
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  //lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("   WELCOME TO    ");
  lcd.setCursor(0, 1);
  lcd.print(" CIRCUIT DIGEST    ");
  delay(2000);
  lcd.clear();
}
void loop()
{
  unsigned long duration = pulseIn(8, HIGH);
  Serial.println(duration);
  if (duration > 10000 && duration < 17000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 1          ");
  }
  else if (duration > 20000 && duration < 27000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 2          ");
  }
  else if (duration > 30000 && duration < 37000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 3          ");
  }
  else if (duration > 40000 && duration < 47000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 4          ");
  }
  else if (duration > 50000 && duration < 57000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 5          ");
  }
  else if (duration > 60000 && duration < 67000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 6          ");
  }
  else if (duration > 70000 && duration < 77000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 7          ");
  }
  else if (duration > 80000 && duration < 87000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 8          ");
  }
  else if (duration > 90000 && duration < 97000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 9          ");
  }
  else if (duration > 100000 && duration < 107000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: *          ");
  }
  else if (duration > 110000 && duration < 117000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: 0          ");
  }
  else if (duration > 120000 && duration < 127000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: #          ");
  }
  else if (duration > 130000 && duration < 137000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: A          ");
  }
  else if (duration > 140000 && duration < 147000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: B          ");
  }
  else if (duration > 150000 && duration < 157000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: C          ");
  }
  else if (duration > 160000 && duration < 167000)
  {
    lcd.setCursor(0, 0);
    lcd.print("Received: D          ");
  }
}