الأربعاء، 25 فبراير، 2015

نقل البيانات عن طريق الليزر باستخدام الاردوينو

Data transfer Using Laser





تعتبر احدى طرق تراسل البيانات اللاسلكيه بين قطعتي اردوينو, حيث يتم ارسال البينات عن طريق اشعة الليزر باستخدام laser module  واستقبالها عن طريق مستقبل ضوئي LDR Sensor. وهو موضوع شيق وممتع .....


المبدأ العام لتناقل البيانات هو ضبط المرسل والمستقبل على نمط معين لفهم البيانات المتبادله. مثلا في الserial  يتم ارسال واستقبال البيانات byte-by-byte ويتم الارسال والاستقبال على هذا الأساس... الفكره هنا ان نضبط المرسل والمستقبل على نمط معين للتواصل نحن نحدده, وفي هذا المضوع سوف نعتمد على الزمن . 




في موضوعنا سوف نقوم بارسال الأرقام  0  -  to 9 من بطاقة اردوينو عن طريق laser module واستقبالها على بطاقة اردوينو أخرى عن طريق LDR. ثم طباعتها على LCD .

لنقوم بذلك أولا سنتحدث عن ال laser module : يرسل اشعة ليزر بخط مستقيم عند إعطائه HIGH على ال signal pin
والاشعة التي يرسلها كافيه لتغيير مقومة LDR بشكل كبير.


يتم ارسال HIGH&LOW لزمن معين من بطاقة الاردوينو المُرسله عبر الليزر واستقبال الاشاره على حساس الضوء وقرائتها عن طريق بطاقة الاردوينو الثانيه. حيث تقوم بقياس زمن التحول من HIGH الى LOW أو العكس وذلك باستخدام الامر PulseIn() ويقوم هذا الامر بقياس نبضه pulse على pin معين(سواء كانت HIGH او LOW ) حيث يبدأ التوقيت عند بداية النبضه وينهي التوقيت عند نهايتها ويعطي قيمة التوقيت .


ولعمل ذلك يتم تحديد زمن معين لكل رمز سيتم ارساله . مثلا لارسال الرمز4 سيتم ارسال إشارة HIGH لمدة 500ms على جزء الارسال ثم يقيس الزمن على جزء الاستقبال فيتم تحديد الرمز المرسل . ثم نقوم بطباعته على الشاشه LCD screen.


الان ننتقل الى الجزء العملي . 




لعمل التجربه تحتاج للتالي : 

1)بطاقتي اردوينو uno (انا استعملت uno & mega)
2)Laser module
3)LDR sensor
4)100ohm&5kohm resistors
5) الشاشة الكريستاليه Lcd1602
6)اسلاك توصيل . 
7) Breadboard

التوصيله : 








البرمجة:

تنقسم البرمجه الى جزئين:
1) جزء الارسال .
2)جزء الاستقبال . 

في جزء الارسال سنقوم باستقبال الرقم المراد ارساله عن طريق ال serial monitor ثم ارساله عن طريق الlaser بزمن محدد .

كود الارسال :

الجزء الثاني : نقوم باستقبال الرقم المرسل من الليزر عن طريق الldr . ويتم هذا عن طريق فحص حالة الpin وتغيرها من low الى high وقياس الزمن عن طريق امر pulsein()
ثم حسب الزمن المحدد يتم تحديد الرقم لطباعته على lcd.


** ملاحظه : عند استقبال الرقم من laser يكون هناك بعض الزياده بالزمن بال ms وللحصول على قيمه يجب التخلص من القيمه الزائده ويتم هذا عن طريق العمليه الحسابيه modulo % (باقي القسمه) كالتالي : time – time%100 . فاذا اعتبرنا مثلا انا ارسلنا رقم 2 أي ان القيمه المفترض استلامها هي 300 ولكن فعليا القيمه المستلمه قد تكون 340 ولكن القيمه المطلوبه هي 300. للقيام بذلك نطرح قيمة الزياده من القيمه الكامله : فبقاي قسمة 340 على 100 هي 40 . وبطرح 40 من 340 نحصل على الرقم 300 . وهكذا لاي قيمه . ويجب الانتباه ان الامر يعطي الزمن بال مايكرو لذلك يجب القسمه على 1000 لتحويله الى ملي.


البرنامج : 
1) جزء الأرسال 
/*
Visible Laser data transfer 
Sender Code 
using Any Arduino with Laser Module
connected to pin D3 
Open serial and send Numbers from 
0 - 9 . 
Code Written By : Motaz Bany amer - Jordan 
http://www.genotronex.com/

*/

char s_num;
void setup() {
  Serial.begin(9600);
  pinMode(3,OUTPUT);
}

void loop() {
if(Serial.available()>0)
{s_num =Serial.read();}//receive num from serial to resend
if(s_num=='0'){
  digitalWrite(3,HIGH);
  delay(100);  //the specified time for 0
  digitalWrite(3,LOW);
  delay(100);}
  if(s_num=='1'){
  digitalWrite(3,HIGH);
  delay(200);  
  digitalWrite(3,LOW);
  delay(200);}
  if(s_num=='2'){
  digitalWrite(3,HIGH);
  delay(300);  
  digitalWrite(3,LOW);
  delay(300);}
  if(s_num=='3'){
  digitalWrite(3,HIGH);
  delay(400);  
  digitalWrite(3,LOW);
  delay(400);}
  if(s_num=='4'){
  digitalWrite(3,HIGH);
  delay(500);  
  digitalWrite(3,LOW);
  delay(500);}
  if(s_num=='5'){
  digitalWrite(3,HIGH);
  delay(600);  
  digitalWrite(3,LOW);
  delay(600);}
  if(s_num=='6'){
  digitalWrite(3,HIGH);
  delay(700);  
  digitalWrite(3,LOW);
  delay(700);}
  if(s_num=='7'){
  digitalWrite(3,HIGH);
  delay(800);  
  digitalWrite(3,LOW);
  delay(800);}
  if(s_num=='8'){
  digitalWrite(3,HIGH);
  delay(900);  
  digitalWrite(3,LOW);
  delay(900);}
  if(s_num=='9'){
  digitalWrite(3,HIGH);
  delay(1000);  
  digitalWrite(3,LOW);
  delay(1000);}
}


2) جزء الأستقبال 
/*
Visible Laser data transfer 
Receiver  Code 
using Any Arduino with LDR and show
the received Data into LCD
Code Written By : Motaz Bany amer - Jordan 
http://www.genotronex.com/

*/

#include<LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,6,7,8);
unsigned long c_t=0;
unsigned long s_t=0;
unsigned int t0;
unsigned int long t=0;
void setup() {
lcd.begin(16,2);
lcd.cursor();
pinMode(3,INPUT);
Serial.begin(9600);
}

void loop() {
 t=pulseIn(3,HIGH,2000000)/1000;
 t=t-t%100;
Serial.println(t);
Serial.println(t%100);
if(t==100){Serial.println("0");lcd.print("0");}
if(t==200){Serial.println("1");lcd.print("1");}
if(t==300){Serial.println("2");lcd.print("2");}
if(t==400){Serial.println("3");lcd.print("3");}
if(t==500){Serial.println("4");lcd.print("4");}
if(t==600){Serial.println("5");lcd.print("5");}
if(t==700){Serial.println("6");lcd.print("6");}
if(t==800){Serial.println("7");lcd.print("7");}
if(t==900){Serial.println("8");lcd.print("8");}
if(t==1000){Serial.println("9");lcd.print("9");}
}



صور من نتائج التجربة .




ارسال رقم 7 من خلال نافذة السيريال

وصول رقم 7 لدارة الأستقبال




كاتب المقال : معتز محمد الفياض بني عامر . 
الايميل : bada2wave3@gmail.com


2 التعليقات :

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.