آموزش راه اندازی ماژول وایرلسRF433mhzبا+شبیه ساز(ارسال پیام)

در اين بخش مي‌توانيد آموزش و مثال‌های مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

آموزش راه اندازی ماژول وایرلسRF433mhzبا+شبیه ساز(ارسال پیام)

پست توسط sinaset » دو شنبه 23 آذر 1394, 7:40 pm

بنام خدا
با سلام
تصویر
در این تاپیک سعی داریم،مثال و راه کارهای راه اندازی ماژول های ارزان قیمت و اماده وایرلس RF با فرکانس 433 و 315 مگاهرتز را به مروز اموزش بدهیم .

نکات قابلیت ذکر در رابطه با این ماژول ها

*لازم به ذکر است ماژول فرستنده. 433 مگاهرتز حدود 2.900 تومان قیمت دارد و ماژول گیرنده ان هم حدود 2.900 تومان قیمت دارد.(و از لحاظ ملاک قیمتی، بسیار ارزان قیمت می باشد)
*برای انتن این ماژول ها می توانید از 15 تا 25 سانت سیم خشک معمولی استفاده کرد!
*برد این ماژول ها حدود 100 متر (در فضایی باز می باشد) و در فضایی بسته هم به نصف و کمتر کاهش پیدا می کند.
*برنامه نویسی ویژه تقریبا ندارد،و اگر شما با رابط USART کار کرده باشید. این ماژول همان کار رو فقط به صورت بی سیم بین دو میکرو انجام میدهد.(یعنی اگر شما بین دو میکروکنترولر با usart ارتباط برقرار کرده باشید. حال با خروجی و ورودی ها دو میکروکنترولر را به ماژول میدهید تا به صورت TTL (سریالی) ارتباط برقرار کنند.


از نکات جالب دیگر اموزش،فایل پرتئوس و مدل ماژول های RF می باشد. که کار ما را بسیار ساده کرده است .

امیدوارم که به یاری خدا تاپیک خوب بشود.


فهرست موضوعات تاپیک:

مقدمه و مشخصات و خصوصیات ماژول های RF433mhz
وصل کردن انتن به ماژول ها
پروژه روشن کردن سه LED به کمک گیرنده و فرستنده RF 433mhz
پروژه ارسال پیام با کمک یک فرستنده و یک گیرنده

...
...
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

Re: آموزش راه اندازی ماژول ها وایرلس RF 433mhz باAVR+شبیه سا

پست توسط sinaset » جمعه 4 دی 1394, 10:36 am

بنام خدا
با سلام


ادامه بحث ..
مقدمه و مشخصات و خصوصیات ماژول های RF433mhz

ماژول RF با فرکاسن RF از 315 تا 915 مگاهرتز می باشد.شاید در نگاه اول،هرچقدر فرکانس بیشتر باشد بهتر باشد..این حرف درست می باشد.(به دلیل عبور بهتر فرکانس بالا از دور و اجسام و ...) اما این همه ماجرا نیست و مسائل دیگر هم وجود دارد..که البته موضوع بحث ما نیست ..

اما بنظر شخصه استفاده از همین ماژول ها با فرکانس 433mhz بهتر می باشد و نیاز ما را براورده می کند.

این ماژول ها می تواند تا حدود 200 متر را در فضایی باز پوشش دهد و در فضایی بسته مثل خانه.. تقریبا خانه را کامل تحت پوشش قرار میدهد (* این مورد رو در خانه خودمان تا دم در خانه مان ازمایش کردم و سیگنال نسبتا خوب دریافت شد!)


سرعت و مشخصات

*من نتونستم سرعت دقیق ماژول مد نظرمان را پیدا کنم،اما به نقل از یک سایت روسی (که احتمالا باید درست باشه).
 تصویر  گیرنده:   کاری:5    مصرفی: 4 میلی   : 433.92    حساسیت دریافت: -105   فرستنده:   فرستنده: 20 تا 200    کاری:3.5 تا 12    ارسال: 4000 بیت (4kb) در    مصرفی:10 میلی    کاری: 433  
تصویری از فرستنده
تصویر
تصویر از مدار فرستنده مدل "FS1000A XD-FST"
تصویر
----------
تصویری از گیرنده
تصویر
تصویری از مدار گیرنده مدله"XY-MK-5V"
تصویر
====
همچنین پایه گیرنده و فرستنده به شرح زیر می باشد .
(گرچه نیازی به حفظ کردن ان نیست،چون معمولا به روی پایه قید می شود)
تصویر
 قابلیت های فرستنده و گیرنده ..  ارزان بودن!   از قابلیت ها مهم این ماژول ها ارزان بودن می باشد ،ضمن اینکه بردها انها هم نسبت به قیمت و قابلیت هایش، بسیار خوب می باشد و می تواند نیازهای ما را برای انجام پروژها براورده کند .. 

معایت این ماژول ..

این ماژول ها هیچ دکودر و انکودر به ان وصل نیست.. پس اطلاعات بدون رمز و بصورت خام ارسال میشود. یعنی همه می توانند ان را بخوانند! که البته باز این مشکل بخصوصی نیست!(برای پروژهای ساده) مشکل بزرگ،اشکال زیر می باشد..

تصویر
خروجی پایه DATA گیرنده ،در صورت نبودن سیگنال از فرستنده، به صورت رندوم اطلاعات نامفهومی را ارسال می کند!(که احتمالا به دلیل دریافت سیگنال مختلف محیط می باشد)
که البته اولین راه کاری که میشه این مشکل رو برطرف کرد استفاده از ایسی ها انکودر و دکودر می باشد که در چند خط قبل توضیح دادیم
اما از طریق نرم افزار هم میشه این مشکل رو برطرف کرد،که انشالله در اینده به این موضوع خواهیم پرداخت
 ادامه دارد..  .  *****************  1394.10.28  ویرایش جدید پست:  "نقشه هایی قدیمی فرستنده و گیرنده اصلاح شدن و نقشه ها دقیق تر و بهتر جایگزین شدند."   هایی قدیمی فرستند رو می تونید از [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]و گیرنده رو از [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]ببینید( لازم به ذکر این نقشه مثل ماژول نمی باشند و تفاوتی هایی دارند،نقشه که در پست قرار داده شده بهتر می باشند)  ***************** 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

Re: آموزش راه اندازی ماژول ها وایرلس RF 433mhz باAVR+شبیه سا

پست توسط sinaset » جمعه 4 دی 1394, 11:06 am

ادامه ..
وصل کردن انتن به ماژول ها

برای وصل کردن انتن به ماژول ها، یک سیم خشک 20 تا 25 سانتی مسی خوب می باشد .(البته سعی کنید،پوسته داشته باشد تا بعدا باعث زنگ زدن انتن نشود)

محل نصب انتن گیرنده و فرستنده مشخص می باشد ..می توانید به مانند ماژول های این جانب.سیم انتن را وصل کنید :

تصویر
تصویر
*(محل نصب انتن برروی گیرنده،تا حدود مشخص نیست،با کمی دقت،می توانید،ان را در گوشه پایین ماژول ببینید.(معمولا به پایه اول سیم پیچ باید وصلش کرد))
 . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 2
تاریخ عضویت: یک شنبه 20 دی 1394, 10:30 am
سپاس‌های ارسالی: 2 بار

Re: آموزش راه اندازی ماژول ها وایرلس RF 433mhz باAVR+شبیه سا

پست توسط z.f.k » یک شنبه 20 دی 1394, 10:41 am

دوست عزیز من بنا به دلایلی نمیتونم از ماژول آماده این کار استفاده کنم و طبق همین مدار قبلا یه پی سی بی زدم و قطعات رو هم خریدم و مونتاژ کردم ولی درست جواب نمیده.مقادیر سلف ها که با مقدار 2.5T و 4.5 T مشخص کرده یعنی چی.من از یه سیم معمولی روکش دار روی همین ماژول به جای سیم پیچ خودش گاشتم ..اوکی بود و کار میکرد.ولی توی برد خودم کار نمیکنه.به نظرتون باید چیکار کنم؟چی رو در زدن برد در نظر بگیرم؟

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

Re: آموزش راه اندازی ماژول ها وایرلس RF 433mhz باAVR+شبیه سا

پست توسط sinaset » یک شنبه 20 دی 1394, 2:16 pm

z.f.k نوشته شده:دوست عزیز من بنا به دلایلی نمیتونم از ماژول آماده این کار استفاده کنم و طبق همین مدار قبلا یه پی سی بی زدم و قطعات رو هم خریدم و مونتاژ کردم ولی درست جواب نمیده.مقادیر سلف ها که با مقدار 2.5T و 4.5 T مشخص کرده یعنی چی.من از یه سیم معمولی روکش دار روی همین ماژول به جای سیم پیچ خودش گاشتم ..اوکی بود و کار میکرد.ولی توی برد خودم کار نمیکنه.به نظرتون باید چیکار کنم؟چی رو در زدن برد در نظر بگیرم؟

سلام بر شما.

قبل از هر چیز،مدار فرستنده و گیرنده که در پست قبل گذاشتم،چندان جالب نیست.! مدار دقیق XY-MK-5V و FS1000A XD-FST (فرستنده و گیرنده مشابه هم ) رو پیدا کردم که انشالله در پست آموزشی بعدی قرارشون میدم.

اون 2.5 , 4.5 تعداد دورهای سیم پیچ می باشد( 2.5 دور و 4.5 دور).در رابطه به سوال دومتون،درست متوجه نشدم.این ماژول ها معمولا سیم برای انتن ندارن! منظور شما دقیق چه چیزی بود؟ برد خود شما چه مخشصات داشت ؟ و اون مداری که باهش تست کردید جواب داد،چه مشخصات داشت ؟!

در طرحی مدار ،قسمت های خالی مدار را به گرند وصل کنید،تا نویز ها رو خارج کنند. [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] مقاله رو مطالعه کنید.
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 2
تاریخ عضویت: یک شنبه 20 دی 1394, 10:30 am
سپاس‌های ارسالی: 2 بار

Re: آموزش راه اندازی ماژول ها وایرلس RF 433mhz باAVR+شبیه سا

پست توسط z.f.k » یک شنبه 20 دی 1394, 3:07 pm

اگر که مدار جالبی نیست پس چرا ماژول آمادش به خوبی کار میکنه؟؟؟
من طبق همین نقشه یه برد کوچیک به اندازه ماژول آماده زدم و قطعات هم عینا قطعات ماژول رو خریداری کردم و مونتاژش کردم.اما یه خط در میون جواب میده.همین نقشه رو وقتی روی برد اصلیم که به همراه مدار انکدر هستش مونتاژ میکنم جواب نمیده.واقعا کلافه شدم.حتی نمیدونم ایراد از چیه که یه راهی براش پیداکنم. :? :? :? :?

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

Re: آموزش راه اندازی ماژول ها وایرلس RF 433mhz باAVR+شبیه سا

پست توسط sinaset » دو شنبه 21 دی 1394, 8:03 am

سلام بر شما

منظور اینجانب در پست قبلی این بود که،نقشه های که گذاشتم،دقیق نبودن(یعنی بیشتر شبیه نقشه های اون ماژول ها بودن) و نقشه های دقیق ترشون رو پیدا کردم که در اینده قرارشون میدم.
-
به هر حال الکترونیک اینجور سخت ها هم دارد. باید تلاش کنید ببینید اشکال دقیقا کجاست(می توانید از کتاب های طراحی مدار و.. هم کمک بگیرید)
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

روشن کردن سه LED به کمک گیرنده و فرستنده RF 433mhz

پست توسط sinaset » دو شنبه 28 دی 1394, 2:37 pm

بنام خداوند بخشنده و مهربان
با سلام


اول طرح راه اندازی با ماژول RF
روشن کردن سه LED به کمک گیرنده و فرستنده RF 433mhz
تصویر
در این پروژه ساده،ما به دو میکروکنترولر Atmega8 و سه LED و سه کلید و دو عدد ترانزیستور bc547 (یا هر ترانزیستور NPN دیگری) و 5 مقاومت 4.7 کیلو اهم و یک ماژول فرستند RF433 و گیرنده RF433 مگاهرتز مداری راه اندازی میشود که می توانیم به صورت وایرلس سه LED را از فاصله دور روشن کنیم.(بیش از 100 متر!)

ابتدا مدار را مطابق شماتیک زیر بر روی برد برد پیاده سازی کنید:
تصویر
چند نکته:
* سیم انتن، گیرنده و فرستنده را حدود 25 سانت انتخاب کنید،سعی کنید کمی سمی قطرش زیاد باشد(البته نه خیلی!)
*سیم انتن،کثیف یا زنگ زده نباشد . .. (سعی کنید از نوع استفاده کنید که خودش پوسته پلاستیکی دارد)
*یک خازن 470 میکروفاراد،قبل از رگولاتور و یک خازن 104 (100نانوفاراد) بعد از رگولاتور قرار دهید
*به پایه تغذیه میکروکنترولر و پایه تغذیه گیرنده و فرستند، یک خازن 104 برای از بین بردن نویز احتمالی وصل کنید.
*ولتاژی که به رگولاتور میدهید،بالا 8 تا 9 ولت باشد،(باطری کتابی یا ..) تا در انالیز سیگنال مشکلی پیش نیاید.
*سعی کنید به کلیدها،مقاومت پول اپ 10 کیلواهمی وصل کنید.

موارد مهم تر:

*برای افزایش دقت، هردو میکروکنترولر باید از کریستال خارجی با فرکانس 11.0592 مگاهرتز کار کند.که در این پروژه همین کار کرده ایم.پس شما هم باید این کریستال را تهیه کنید و به پایه 9 و 10 میکروکنترولر وصل کنید.
*بعد از وصل کردن کریستال 11.0592 به پایه 9 و 10 (به دو میکروکنترولر)،باید فیوز بیت ها رو خروجی تعریف کنید،به مانند تصویر زیر:

تصویر
 توضیحات در کوتاه در رابطه با uart   برای راه اندازی ماژول باید با واحد uart یا usart میکروکنترولر کار کنیم . همانجور که مستحضر هستید،میکروکنترولر دو پایه از پایه ها خودش که با نام RX و TX نام گذاری کرده(پایه 2 و 3 میکروکنترولر میگا8) برای این کار اختصاص داده است ،که RX به معنی گیرنده و TX به معنی فرستنده است .   ما به کمک پایه RX (پایه دو میکرو) می توانیم اطلاعات که توسط دیگر میکروکنترولر از طریق واحد uart فرستاده شده را دریافت کنیم. و به کمک پایه TX (پایه شماره سه) می توانیم اطلاعات را برای فرستنده ارسال کنیم .   ما به کمک یک میکروکنترولر از طریق واحد uart می توانیم هم زمان هم اطلاعات ارسال کنیم و هم دریافت کنیم .   اما در این پروژه ساده، یکی از میکروها،اطلاعات را دریافت می کند ،یعنی ما باید خروجی ترانزیستور که به رسیور(یا دریافت کننده rf433) وصل می باشد را به پایه RX میکرو وصل کنیم.   در قسمت دیگر،پایه TX میکروکنترولر ، که فرستنده می باشد را به پایه فرستنده (که در مدار ما با مقاومت 4.7 به بیس ترانزیستور وصل شده) وصل کنیم.   دیگر مراحل سخت طی شده و نوبت به کد می رسد ..  کدها  به کمک کدهایی زیر،می توانید فرستنده را تنظیم کنید .. (توضیحات مربوط درون کدها داده شده) 

کد: انتخاب همه

/*******************************************************
Project :sinaset
Version :v1
Date : 1394.10.28
site: centralclubs.com
Chip type : ATmega8a
AVR Core Clock frequency: 11.059200 MHz
*******************************************************/
// روشن کردن سه ال اي دي به کمک ماژول هاي فرستنده و گيرنده آر اف 433 مگاهرتز
#include <mega8.h>
#include <stdio.h>
#include <delay.h> //کتابخانه تاخير
#define xtal 11059200UL //مشخص کردن فرکانس کاري ميکروکنترولر
void main(void)
{
//راه اندازي واحد يو آرت و تنظيم سرعت ان برروي 9600 بيت در ثانيه
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x47;

PORTC.0=1; //بالا بردن امپدانس پايه مربوط براي جلوگيري از نويز و عملکرد بهتر
PORTC.1=1;
PORTC.2=1;

while (1)
{
while(PINC.0==0) //درصورتي که پايه 0 فعال شد
{
UDR='a'; //حرف اي فرستاده شود
while(PINC.0==0); //
delay_ms(300);
}
while(PINC.1==0) //درصورتي که پايه 1 فعال شد
{
UDR='b'; //حرف بي فرستاده شود
while(PINC.1==0);
delay_ms(300);
}
while(PINC.2==0) //در صورتي که پايه 2 فعال شد
{
UDR='c'; //حرف سي فرستاده شود
while(PINC.2==0);
delay_ms(300);
}
};
}

کدهایی مربوط به گیرنده(توضیحات لازم،درون کدها داده شده ..)

کد: انتخاب همه

/*******************************************************
Project :sinaset
Version :v1
Date : 1394.10.28
site: centralclubs.com
Chip type : ATmega8a
AVR Core Clock frequency: 11.059200 MHz
*******************************************************/
// روشن کردن سه ال اي دي به کمک ماژول هاي فرستنده و گيرنده آر اف 433 مگاهرتز
#include <mega8.h>
#include <stdio.h>
#include <delay.h> //کتابخانه تاخير
#define xtal 11059200UL //مشخص کردن فرکانس کاري ميکروکنترولر
void main(void)
{
//راه اندازي واحد يو آرت و تنظيم سرعت ان برروي 9600 بيت در ثانيه
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x47;

PORTC.0=1; //بالا بردن امپدانس پايه مربوط براي جلوگيري از نويز و عملکرد بهتر
PORTC.1=1;
PORTC.2=1;

while (1)
{
while(PINC.0==0) //درصورتي که پايه 0 فعال شد
{
UDR='a'; //حرف اي فرستاده شود
while(PINC.0==0); //
delay_ms(300);
}
while(PINC.1==0) //درصورتي که پايه 1 فعال شد
{
UDR='b'; //حرف بي فرستاده شود
while(PINC.1==0);
delay_ms(300);
}
while(PINC.2==0) //در صورتي که پايه 2 فعال شد
{
UDR='c'; //حرف سي فرستاده شود
while(PINC.2==0);
delay_ms(300);
}
};
}

سورس و شبیه ساز رو همی می تونید از [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]دانلود کنید
ویدئو ازمایش مدار در [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید].


اخطار:هرگونه فروش و سوء استفاده از کدها (بطور کلی مسائل مربوط به این تاپیک و دیگر تاپیک ها) حرام می باشد.این تاپیک و دیگر تاپیک صرفا برای اموزش و اشنایی با مسائل الکترونیک می باشد.(ساخت و مونتاژ و .. مشکلی ندارد،اما فروش کدها و ..!! شرعا و عقلا و.. مشکل دارد)
برای کپی برداری از مطالب ازاد هستید.(با ذکر منبع یا بدون ذکر منبع)
باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 4
تاریخ عضویت: دو شنبه 10 اردیبهشت 1386, 8:32 pm
سپاس‌های ارسالی: 881 بار
سپاس‌های دریافتی: 6 بار

Re: آموزش راه اندازی ماژول ها وایرلس RF 433mhz باAVR+شبیه سا

پست توسط m.kia » دو شنبه 28 دی 1394, 3:42 pm

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

امیدوارم که در همه کارهاتون پیروز و سربلند باشید...

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

ارسال پیام با کمک یک فرستنده و یک گیرنده

پست توسط sinaset » یک شنبه 4 بهمن 1394, 3:05 pm

بنام خدواند بخشنده و مهربان
باسلام


ارسال پیام با کمک یک فرستنده و یک گیرنده

در ادامه پروژه قبلی، در این پروژه به کمک یک عدد ماژول فرستنده و گیرنده RF433 مگاهرتز پیامی را ارسال می کنیم سپس از طرف گیرنده پیام دریافت میشود.
تصویر
قطعات مورد نیاز(بدون در نظر گرفتن منبع تغذیه):

2 عدد میکروکنترولر Atmega8
2 عدد LCD 16X2 کارکتری
1 عدد فرستنده RF433 مگاهرتز
1 عدد گیرنده RF433 مگاهرتز
3 عدد کلیدفشاری
2 عدد ترانزیستور BC547
2 عدد پتانسیو 10 کیلواهم
9 عدد مقاومت 4.7کیلواهم
1 عدد LED
2 عدد خازن 104 (100 نانوفاراد)
2 عدد سلف 100 میکروهانری

توضیحات کوتاه:

در این پروژه،که این جانب تدوینش کردم.(البته قسمت تعویض کارکتر و پیام را شخص دیگری انجام داده وباقی کارها رو اینجانب انجام دادم)به کمک سه کلید ، یک حرف یا کلمه نوشته میشود و سپس ارسال می شود و در سمت گیرنده بعد از دریافت کلمه یا حرف،ان را بر روی LCD خود نمایش میدهد.

تصویر
همانجور که در تصویر بالا می ببینید به کمک دو کلید (تعویض کارکتر و رفتن به ستون بعد)پیام ابتدا نوشته میشود،سپس به کمک کلید ارسال،پیام ارسال میشود
سپس گیرنده ان را دریافت می کند ان را نمایش میدهد .
 کد های فرستنده و توضیحات: 

در پروژه قبلی برای ارسال دستورات از دستور UDR استفاده کردیم،اما در این پروژه از دستور puts استفاده کردیم،که از طریق کتابخانه stdio.h قابل شناسایی برای کدویژن میشود.کتابخانه stdio.h در واقع برای UART میکروکنترولر نوشته شده است و دستوراتش برای واحد uart می باشد.

ما اگر بخوایم پیامی را از طریق uart برای ماژول ارسال کنیم،کافیست متن خود را در puts قرار دهیم به عنوان مثال اگر بخواهیم hello را بنویسیم باید اینطور بنویسیم ("puts("hello به همین سادگی کلمه hello از طریق واحد uart برای ماژول فرستاده میشود.

اما ما در این پروژه نمی خواهیم یک متن از پیش ساخته شده را بفرستیم،بلکه می خواهیم متنی را به کمک دو کلید بنویسیم سپس ان را ارسال کنیم. که همین مسئله باعث میشود کمی کد نویسی پیچیده تر شود


ابتدا ما پایه های که کلید به ان وصل می باشد،برای راحتی کار خودمان با نام،نام گذاری می کنیم

کد: انتخاب همه

#define CHAR_UP PINC.0 //معرفي پايه که کليد چرخش حروف به ان وصل ميشود
#define ENTER PINC.1 //معرفي پايه که کليد دريافت حروف انجام ميشود و سپس ستون بعدي انتخاب ميشود
#define SEND PINC.02 //معرفي پايه ي که به کمک ان اطلاعات ارسال ميشود

به کمک متغییرهای و ارایه ها زیر،حروف اسکی و متغیرهای لازم برای حرکت و تعویض حروف تعریف می شوند

کد: انتخاب همه

char characters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char count_char=-1; //به کمک اين متغيير حروف رو انتخاب مي کنيم
char lcd_buffer[16], data_buffer[17]; //تعريف دو ارايه براي نمايش ال سي دي و ارسال اطلاعات
char buffer_pointer=0; //

به کمک مجموعه کدهایی زیر که در تابع اصلی و حلقه while قرار می گیرن،ما متن خود را تعریف و سپس ارسال می کنیم

کد: انتخاب همه

if(CHAR_UP==0){ // به کمک اين تعريف،حروف ها انتخاب ميشود
count_char++;
if(count_char == CHAR_COUNT)count_char = 0;
add_char(characters[count_char]);
lcd_clear();
_lcd_write_data(0x0f);
lcd_puts(lcd_buffer);
delay_ms(600); //تاخير براي انتخاب حروف
}
if(ENTER==0){ //به کمک اين تعريف،حروف انتخاب شده،گرفته ميشود و ال سي دي به ستون بعدي مي رود
count_char = -1;
buffer_pointer++;
lcd_clear();
_lcd_write_data(0x0f);
lcd_puts(data_buffer);
while(ENTER==0);
delay_ms(300);
}

if(SEND==0){ //تابع ارسال متن نوشته شده
for(i=0;i<5;i++) //حلقه 5 بار کد اسکي نقطه را ارسال مي کند و گيرنده را تا حدودي اماده مي کند
{
puts(".");
}
sprintf(data_buffer, "Sms:%s", lcd_buffer); //ارايه که نوشته شده اکنون به ارايه ديتا بافر ريخته ميشود
for(i=0;i<2;i++) //سپس به کمک حلقه فور، دو بار فرستاده ميشود
{ //دليل دوبار فرستادن،سالم فرستاده شدن ديتا مي باشد،چون بدليل خام بودن گيرنده اطلاعات در
puts(data_buffer); //بار اول گاهي وقت ها به درستي دريافت نمي شود
}
for(i=0;i<4;i++)puts("."); //فرستادن کد نقطه براي ارسال بهتر دستورات
while(SEND==0); //حلقه ي براي جلوگيري از تکرار دستورات سند
delay_ms(500); //تاخير بيشتر براي عدم تکرار دستور

sprintf(data_buffer, "Sent:%s", lcd_buffer); //گرفتن ارايه ال سي دي
for(i=0;i<7;i++) //افکتي با حلقه براي نمايش ارسال متن براي ال سي دي
{
lcd_gotoxy(0,1);
lcd_puts(" ");
delay_ms(250);
lcd_gotoxy(0,1);
lcd_puts(data_buffer);
delay_ms(250);
}
for(i=0;i<17;i++) //استفاده از حلقه براي پاکس سازي دو ارايه بافر و ال سي دي
{
data_buffer[i]=0;
lcd_buffer[i]=0;
}
buffer_pointer=0; //صفر کردن ستون
count_char=-1; //شمارش گر حروف را منفي 1 مي کنيم
lcd_gotoxy(0,0); //انتخاب سطر اول
lcd_puts(" "); //پاک کردن سطر اول
} [/i][/i]


کل کدهایی فرستنده:

کد: انتخاب همه

[i][i]/*******************************************************
Project : Send Sms
Version :v1
Date : 1394.11.4
edit & project :sinaset
site : centralclubs.com

Chip type : ATmega8A
AVR Core Clock frequency: 11.059200 MHz
*******************************************************/
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <alcd.h>

#define CHAR_UP PINC.0 //معرفي پايه که کليد چرخش حروف به ان وصل ميشود
#define ENTER PINC.1 //معرفي پايه که کليد دريافت حروف انجام ميشود و سپس ستون بعدي انتخاب ميشود
#define SEND PINC.02 //معرفي پايه ي که به کمک ان اطلاعات ارسال ميشود
#define CHAR_COUNT 26 // معرفي متغيير 26تايي براي نشان دادن تعداد حروف يا کارکتر

char characters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char count_char=-1; //به کمک اين متغيير حروف رو انتخاب مي کنيم
char lcd_buffer[16], data_buffer[17]; //تعريف دو ارايه براي نمايش ال سي دي و ارسال اطلاعات
char buffer_pointer=0; //

void add_char(char c){ //تابعي براي رفتن به ستون بعد در ال سي دي و انتخاب حروف مد نظر
lcd_buffer[buffer_pointer]=c;
if(buffer_pointer == 16)buffer_pointer = 0;
}

void main(void) //تابع اصلي برنامه
{
char i;

// فعال سازي فرستنده يو آرت
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
//تايين سرعت 4800 بيت براي انتقال اطلاعات در يو آرت
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x8F;

delay_ms(200);

PORTC.0=1;
PORTC.1=1;
PORTC.2=1;

lcd_init(16);
#asm("sei")
lcd_clear(); //پاک سازي ال سي دي
lcd_gotoxy(0,0); //انتخاب سطر اول ال سي دي
lcd_putsf("THE NAME OF GOD"); //نمايش به نام خدا
delay_ms(1000); // يک ثانيه تاخير
lcd_gotoxy(0,1); //انتخاب سطر دوم ال سي دي
lcd_putsf("Transmitter"); //نمايش متن نوع مدار
delay_ms(1000); //تاخيري 1 ثانيه ي
lcd_clear(); //پاک سازي ال سي دي
_lcd_write_data(0x0f); //افکت چشمک زدن در ال سي دي فعال شود

while (1)
{
if(CHAR_UP==0){ // به کمک اين تعريف،حروف ها انتخاب ميشود
count_char++;
if(count_char == CHAR_COUNT)count_char = 0;
add_char(characters[count_char]);
lcd_clear();
_lcd_write_data(0x0f);
lcd_puts(lcd_buffer);
delay_ms(600); //تاخير براي انتخاب حروف
}
if(ENTER==0){ //به کمک اين تعريف،حروف انتخاب شده،گرفته ميشود و ال سي دي به ستون بعدي مي رود
count_char = -1;
buffer_pointer++;
lcd_clear();
_lcd_write_data(0x0f);
lcd_puts(data_buffer);
while(ENTER==0);
delay_ms(300);
}

if(SEND==0){ //تابع ارسال متن نوشته شده
for(i=0;i<5;i++) //حلقه 5 بار کد اسکي نقطه را ارسال مي کند و گيرنده را تا حدودي اماده مي کند
{
puts(".");
}
sprintf(data_buffer, "Sms:%s", lcd_buffer); //ارايه که نوشته شده اکنون به ارايه ديتا بافر ريخته ميشود
for(i=0;i<2;i++) //سپس به کمک حلقه فور، دو بار فرستاده ميشود
{ //دليل دوبار فرستادن،سالم فرستاده شدن ديتا مي باشد،چون بدليل خام بودن گيرنده اطلاعات در
puts(data_buffer); //بار اول گاهي وقت ها به درستي دريافت نمي شود
}
for(i=0;i<4;i++)puts("."); //فرستادن کد نقطه براي ارسال بهتر دستورات
while(SEND==0); //حلقه ي براي جلوگيري از تکرار دستورات سند
delay_ms(500); //تاخير بيشتر براي عدم تکرار دستور

sprintf(data_buffer, "Sent:%s", lcd_buffer); //گرفتن ارايه ال سي دي
for(i=0;i<7;i++) //افکتي با حلقه براي نمايش ارسال متن براي ال سي دي
{
lcd_gotoxy(0,1);
lcd_puts(" ");
delay_ms(250);
lcd_gotoxy(0,1);
lcd_puts(data_buffer);
delay_ms(250);
}
for(i=0;i<17;i++) //استفاده از حلقه براي پاکس سازي دو ارايه بافر و ال سي دي
{
data_buffer[i]=0;
lcd_buffer[i]=0;
}
buffer_pointer=0; //صفر کردن ستون
count_char=-1; //شمارش گر حروف را منفي 1 مي کنيم
lcd_gotoxy(0,0); //انتخاب سطر اول
lcd_puts(" "); //پاک کردن سطر اول
}

}
}[/i][/i][/i][/i]


کدهای گیرنده و توضیحات:

ما در قسمت گیرنده، ابتدا به کمک کد دستور scanf اطلاعات رو دریافت می کنیم (scanf از همان کتابخانه stdio.h می باشد ) این دستور، وظیفه دارد که اطلاعات دریافت شده از واحد uart را بگیرید و در یک ارایه بریزد (این دستور تا زمانی که اطلاعات بهش نرسه اجازه اجراء باقی دستورات را نمی دهد و از این جهت خوب می باشد،)

پس ما در پروژه خود برای دریافت از دستور زیر استفاده می کنیم

کد: انتخاب همه

[i][i][i][i]scanf("%s",str); //دستور اسکن براي دريافت اطلاعات ارسالي از فرستنده[/i][/i][/i][/i]


اما نکته مهم» ماژول RF433 گیرنده،همانجور که قبلا هم گفتیم دائم کدهای تصادفی را برای uart ارسال می کند،برای همین نمی شود فقط از دستور scanf استفاده کرد و بعد ارایه را با lcd نمایش داد،چون ال سیدی در عرض 1 ثانیه! حروف پر حرف و حروف بی معنا خواهد شد!
برای همین ما در قسمت کدهای فرستنده،کدی به بنام :Sms ارسال کرده ایم، حال در سمت گیرنده،هروقت کد مربوط دریافت شد،اطلاعات بر روی LCD نمایش داده می شود

شرط نمایش ال سی دی:

کد: انتخاب همه

[i][i][i][i]if(str[0]=='S' && str[1]=='m' && str[2]=='s' && str[3]==':')[/i][/i][/i][/i]

و بعد هم باقی دستورات نمایش

کد: انتخاب همه

[i][i][i][i]{
lcd_clear(); //پاک سازي ال سي دي
lcd_puts(str); //ال سي دي ارايه را نمايش دهد
delay_ms(1500); //تاخير براي نمايش

PORTD.7=1; //روشن کردن ال اي دي
delay_ms(500); //تاخير
PORTD.7=0; //خاموش کردن ال اي دي
} [/i][/i][/i][/i]


کل کدها گیرنده:

کد: انتخاب همه

[i][i][i][i]/*******************************************************
Chip type : ATmega8
AVR Core Clock frequency: 11.059200 MHz

project by:sinaset
site:centralclubs.com
*******************************************************/
/*
به کمک مجموعه کدهايي زير اطلاعات ارسال شده توسط فرستنده دريافت ميشود
براي اينکه گيرنده ماژول 433 مگاهرتز دائم در حال ارسال اطلاعات تصادفي است
فقط در صورتي که کدخاصي از فرستنده ارسال بشه،ال سي دي متن خود را نمايش ميدهد
که ما کد
Sms:
را انتخاب کرده ايم و در صورتي که اين کد فرستاده بشود،اطلاعات بر روي نمايشگر نمايش داده ميشود
*/
#include <mega8.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

#define DATA_REGISTER_EMPTY (1<<UDRE) //مجموعه کدهايي براي دريافت اطلاعات
#define RX_COMPLETE (1<<RXC)
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index=0,rx_rd_index=0;
#else
unsigned int rx_wr_index=0,rx_rd_index=0;
#endif
#if RX_BUFFER_SIZE < 256
unsigned char rx_counter=0;
#else
unsigned int rx_counter=0;
#endif
bit rx_buffer_overflow; // This flag is set on USART Receiver buffer overflow
interrupt [USART_RXC] void usart_rx_isr(void) // USART Receiver interrupt service routine
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256 // special case for receiver buffer size=256
if (++rx_counter == 0) rx_buffer_overflow=1;
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
}
#endif
}
}
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif //پايان مجموعه کدهاي دريافت اطلاعات

char str[17]; //ارايه براي دريافت اطلاعات
void main(void)
{
//فعال سازي واحد يو ارت
//فعال سازي گيرنده واحد يو ارت
//تايين 4800 بيت سرعت،براي انتقال اطلاعات در واحد يو ارت
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x8F;

delay_ms(200);

DDRD.7=1; //خروجي تعريف کردن پورت 7 براي روشن کردن ال اي دي
PORTD.7=0; //روشن کردن پول اپ پايه 7

PORTC.0=1;
PORTC.1=1;
PORTC.2=1;

lcd_init(16);
#asm("sei")
lcd_clear(); //پاک سازي ال سي دي
lcd_gotoxy(0,0); //انتخاب سطر اول ال سي دي
lcd_putsf("THE NAME OF GOD"); //نمايش به نام خدا
delay_ms(1000); // يک ثانيه تاخير
lcd_gotoxy(0,1); //انتخاب سطر دوم ال سي دي
lcd_putsf("Receiver"); //نمايش متن نوع مدار که گيرنده مي باشد
delay_ms(1000); //تاخيري 1 ثانيه ي
lcd_clear(); //پاک سازي ال سي دي

while (1)
{
scanf("%s",str); //دستور اسکن براي دريافت اطلاعات ارسالي از فرستنده

//در صورتي که کد دريافتي ابتدايش چهار حرف را داشت،شرط اجرا شود
if(str[0]=='S' && str[1]=='m' && str[2]=='s' && str[3]==':')
{
lcd_clear(); //پاک سازي ال سي دي
lcd_puts(str); //ال سي دي ارايه را نمايش دهد
delay_ms(1500); //تاخير براي نمايش

PORTD.7=1; //روشن کردن ال اي دي
delay_ms(500); //تاخير
PORTD.7=0; //خاموش کردن ال اي دي
}
}
} [/i][/i][/i][/i]


این پروژه در ازمایش ،خوب بود و در خانه به راحتی پیام انتقال داده میشد(حتا در حیاط خانه هم امتحان کردم و پیام به گیرنده(در خانه و درون اتاق) رسید!)
بطوری کلی فکر میکنم برد این مدار در فضای ازاد حدود 100 تا 200 متری می باشد!


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] سورس و شبیه ساز

متاسفانه فرصت نشد ویدئو از مدار ساخته و ازمایش بگیرم و برای شما قرار دهم،اما در پروژه بعدی که اماده شده است ویدئو قرار میدهم (در آن پروژه به کمک 2 جفت ماژول فرستنده و گیرنده، می توانم هم پیام ارسال کرد و هم پیام رای دریافت کرد)

اخطار:هرگونه فروش و سوء استفاده از کدها (بطور کلی مسائل مربوط به این تاپیک و دیگر تاپیک ها) حرام می باشد.این تاپیک و دیگر تاپیک صرفا برای اموزش و اشنایی با مسائل الکترونیک می باشد.(ساخت و مونتاژ و .. مشکلی ندارد،اما فروش کدها و ..!! شرعا و عقلا و.. مشکل دارد)
برای کپی برداری از مطالب ازاد هستید.(با ذکر منبع یا بدون ذکر منبع)

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

Re: آموزش راه اندازی ماژول وایرلسRF433mhzبا+شبیه ساز(ارسال پ

پست توسط sinaset » چهار شنبه 21 بهمن 1394, 11:04 am

بنام خدا
با سلام

(متاسفانه پرشین گیگ ف ی .. شده ، امیدوارم که رفع بشه این مشکل تا عکس های این تاپیک دیده شوند)


قسمت اول:
ارسال و دریافت اطاعات با ماژول RF433 مگاهرتز

در ادامه پروژه قبل،در این پروژه قصد داریم، به کمک 2 جفت ماژول گیرنده و فرستنده (جمعا 2 گیرنده و 2 فرستنده) پیامی را ارسال و دریافت کنیم .

این پروژ کمی سخت تر از کارهای قبلی می باشد.بنابراین به چند پست تقسیمش می کنیم .

ما در این پروژه قصد داریم، وقتی پیامی به کمک میکروکنترولر اول به سمت ماژول گیرنده میکروکنترولر دوم فرستاده شد، میکروکنترولر دوم به محض دریافت پیام (از ماژول گیرنده)، یک پیام Deliver (دریافت) از طریق فرستنده خود برای میکروکنترولر اول بفرستد (به معنی دریافت پیام، چیزی شبیه تلفن همراه که وقتی پیام به درستی ارسال میشود،تلفن همراه گیرنده پیام،یک پیام دلیور برای فرستنده می فرستد .)

حال ما مطالب بالا را برای درک بهتر، بر روی شبیه ساز امتحان می کنیم:

 تصویر  [HIGHLIGHT=#0070c0]همانجور که در تصویر متحرک بالا می ببینید،بعد از دریافت پیام،یک پیام دلیور فرستاده میشود .   موارد اضافه شده به پروژه به صورت نکته ای :  * اضافه شدن یک جفت ماژول RF433 (برای فرستنده و گیرنده یک میکرو به صورت جداگانه)  *اضافه قابلیت دلیور (پیام دریافت شد)  *اضافه کردن اعداد 0تا9 و فضایی خالی (یا Space)( که در همان دکمه تعویض کاراکتر گنجانده شده)  *نگه داشتن کلید و تعویض کاراکتر (در ورژن با هر بار کلیک کردن،یک حروف تعویض میشد،در این ورژن می توان با نگه داشتن دست،حروف رو تعویض کنید)  *تابع پر دردسر Scan بطور کامل حذف شده و بجایی برنامه جدید نوشته شده .(تابع Scan بدلیل اینکه پروسس رو تا زمان دریافت کارکتر به خود اختصاص میداید،در این پروژه بخاطره دریافت و ارسال حذف شد)  *ارسال و دریافت یک میکروکنترولر به صورت جداگانه   *امکان ارسال حدود 20 خورده ای کاراکتر (الان بصورت دقیق بخاطر ندارم) برای نمایش بر روی LCD مقصد.  ..    برد و آزمایشات:  بطور کلی و بعد ازمایش های متعدد، برد این ماژول حدود 50 تا 70 خورده ای بود.(البته هنوز دلیل پایین بودن برد رو پیدا نکردم)   من درون یک اتاق یک مدار رو قرار دادم و مدار دیگر رو بیرون از خانه و در حیاط و نزدیک دم در ازمایش کردم،که تقریبا تا انجام پیام ها انتقال پیدا می کرد.  سپس در خانه دو طبقه هم ازمایش کردم، و در طبقه دوم هم سیگنال و پیام رسید . در بالای پشتبان هم ،در بعضی مکانهایش پیام میرسید!  انشالله در پست بعدی،سورس و شبیه ساز و یک فیلم ساده ازمایش مدار رو قرار خواهم داد   . 
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 6971
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9178 بار
سپاس‌های دریافتی: 20969 بار
تماس:

Re: آموزش راه اندازی ماژول وایرلسRF433mhzبا+شبیه ساز(ارسال پ

پست توسط sinaset » شنبه 8 اسفند 1394, 11:39 am

بنام خدا
با سلام

خوب خدا شکر اینگار مشکل پرشین گیگ حل شد.

اما کدها ..
کدها در برای این مدار به دو قسمت تقسیم شده انده: کد مدار فرستنده و گیرند اول و کد مدار فرستنده و گیرنده دوم .

و این دو کد در 99 درصد، تفاوتی بخصوصی باهم دیگر ندارند و دلیل اینکه ما ان را به دو قسمت تقسیم: کد شناسی متفاوت این دو ماژول می باشد .!(بخصوص برای دلیور کردن)

کد مدار اول

کد: انتخاب همه

/*******************************************************
PROJECT: V3
by:sinaset
Site:centralclubs.com
Chip type         : ATmega8
Program type        : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model        : Small
External RAM size     : 0
Data Stack size       : 256
*******************************************************/
#include <mega8.h>
#include <alcd.h>
#include <stdio.h>
#include <string.h>
#include <delay.h>

#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)

#define RX_BUFFER_SIZE 32
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index=0,rx_rd_index=0;
#else
unsigned int rx_wr_index=0,rx_rd_index=0;
#endif
#if RX_BUFFER_SIZE < 256
unsigned char rx_counter=0;
#else
unsigned int rx_counter=0;
#endif
bit rx_buffer_overflow;      

bit on=0;   //بيت براي روشن  پيام دريافتي
bit ok=0;
char str[32],str2[32],str3[32];
char i=0;
char f=2;
char null='';  //متغيير خالي

void clean(void)    //پاک سازي  داده ها
{
   char rest;
    for(rest=0;rest<32;rest++)
    {
   str[rest]=0;
   str2[rest]=0;
    }
}
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
char x;
status=UCSRA;   
data=UDR;

  if(data=='$' || data=='&')clean();    //کد خاتمه و پاک سازي
  str[I]=data;
  i++;
  if(i==32)i=0; 
 
  if(data=='&')i=0,clean();        //کد اماده سازي 

         if(str[0]=='s' && str[1]=='m' && str[2]=='s')
         {   
          sprintf(str2,"%s",str);          
          if( str2[f]=='*')
          {
          str2[f]=null;

          for(x=0;x<32;x++)str3[x]=0;
            
          sprintf(str3,"%s",str2);   
          on=1;    //بيت دريافت پيام روشن شود
          f=1;   
          }
          f++;
         }
         if(str[0]=='O' && str[1]=='K' && str[2]=='!'&& str[3]=='2')ok=1;   // در صورتي که کد دريافت پيام،دريافت شد
                           
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256  // special case for receiver buffer size=256 
   if (++rx_counter == 0) rx_buffer_overflow=1;
#else
   if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    rx_buffer_overflow=1;
    }   
#endif
   }      
}   
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

#define CHAR_UP PINC.2
#define ENTER PINC.1
#define SEND PINC.0
#define CHAR_COUNT 37

char characters[] =
{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'
,'q','r','s','t','u','v','w','x','y','z',' ','0','1','2','3','4','5','6','7','8','9'};

char count_char=-1, count_num=-1, count_pun=-1;
char lcd_buffer[32], data_buffer[32];
char buffer_pointer=0;

void add_char(char c){
lcd_buffer[buffer_pointer]=c;       
if(buffer_pointer == 32)buffer_pointer = 0;    // اينتر باعث افزايش بافر پوينتر مي شود
}

void sent(void)      //تابع نوشتن متن براي ارسال
{
char i;
lcd_clear();
lcd_gotoxy(0,1);
lcd_putsf("load..");
delay_ms(800);
lcd_clear();
_lcd_write_data(0x0f);      
      while(1)
      {
      
        if(CHAR_UP==0){
        count_char++;
        if(count_char == CHAR_COUNT)count_char = 0;             
        add_char(characters[count_char]);
        lcd_clear(); 
        _lcd_write_data(0x0f);
        lcd_puts(lcd_buffer);
        delay_ms(300);
       }
            
       if(ENTER==0){
        count_char = -1;
        count_num = -1;
        count_pun = -1;
        buffer_pointer++; 
        lcd_clear();
        _lcd_write_data(0x0f);      
        lcd_puts(data_buffer); 
        while(ENTER==0); 
        delay_ms(200);
       }
               
       if(SEND==0){
         lcd_clear();
         
          sprintf(data_buffer, "&sms:%s*$", lcd_buffer);
          puts(data_buffer);
          delay_us(10);
          puts(data_buffer);
          delay_us(10);
            
          while(SEND==0);
        delay_ms(150);   
        for(i=0;i<32;i++)data_buffer[I]='';         
        sprintf(data_buffer, "Sent:%s", lcd_buffer);      
        for(i=0;i<2;i++)
        {
        lcd_gotoxy(0,0);
        lcd_clear();
        delay_ms(250);   
        lcd_gotoxy(0,0);
        lcd_puts(data_buffer);
        delay_ms(250);            
       } 
         lcd_clear();
         lcd_gotoxy(0,0);
         lcd_puts(data_buffer);      
         for(i=0;i<32;i++)
         {
          data_buffer[I]=0;
          lcd_buffer[I]=0;      
         }
         for(i=0;i<32;i++)str3[I]=0; 
         on=0;
         buffer_pointer=0;
        count_char = -1;
         break;         
      }
      
       }    
}


void main(void)
{
char i;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 4800
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x8F;
delay_ms(200);
DDRD.7=1;
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTD.0=1;
PORTD.1=1;
PORTD.1=0;
lcd_init(16);
#asm("sei")

lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("TEST");
delay_ms(400);
lcd_clear();

while (1)
     {
       if(PINC.0==0) sent();   //در صورتي دکمه نوشتن متن کليک شد،تابع سنت اجرا شود   
      
          if (on==1)      //درصورتي که پيام دريافت شد
         {
          lcd_clear();
          lcd_gotoxy(0,0);
          lcd_puts(str3);
          delay_ms(3000);
            
          puts("&OK!1$");   //ارسال کد دريافت پيام براي ميکرو کنترولر دوم
          puts("&OK!1$");   //سه بار تکرار ميشود،چون امکان خطا وجود دارد
          puts("&OK!1$"); 
          on=0;
          }
          if (ok==1)    //در صورتي که پيام تحويل داده شد ال اي دي چشمک بزند
          {
          for(i=0;i<12;i++)PORTD.7=!PORTD.7,delay_ms(250);
          ok=0;
          }
    }      
}         


کد مدار دوم

کد: انتخاب همه

/*******************************************************
PROJECT: V3
by:sinaset
Site:centralclubs.com
Chip type         : ATmega8
Program type        : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model        : Small
External RAM size     : 0
Data Stack size       : 256
*******************************************************/
#include <mega8.h>
#include <alcd.h>
#include <stdio.h>
#include <string.h>
#include <delay.h>

#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)

#define RX_BUFFER_SIZE 32
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index=0,rx_rd_index=0;
#else
unsigned int rx_wr_index=0,rx_rd_index=0;
#endif
#if RX_BUFFER_SIZE < 256
unsigned char rx_counter=0;
#else
unsigned int rx_counter=0;
#endif
bit rx_buffer_overflow;      

bit on=0;   //بيت براي روشن  پيام دريافتي
bit ok=0;
char str[32],str2[32],str3[32];
char i=0;
char f=2;
char null='';  //متغيير خالي

void clean(void)
{
   char rest;
    for(rest=0;rest<32;rest++)
    {
   str[rest]=0;
   str2[rest]=0;
    }
}
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
char x;
status=UCSRA;   
data=UDR;

  if(data=='$' || data=='&')clean();    //کد خاتمه و پاک سازي
  str[I]=data;
  i++;
  if(i==32)i=0;   
  if(data=='&')i=0,clean();        //کد اماده سازي 

         if(str[0]=='s' && str[1]=='m' && str[2]=='s')
         {   
          sprintf(str2,"%s",str);          
          if( str2[f]=='*')
          {
          str2[f]=null;

          for(x=0;x<32;x++)str3[x]=0;
            
          sprintf(str3,"%s",str2);   
          on=1;    //بيت دريافت پيام روشن شود
          f=1;   
          }
          f++;
         }
         if(str[0]=='O' && str[1]=='K' && str[2]=='!'&& str[3]=='1')ok=1;   //درصوري که کد دليور دريافت شد
                           
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256  // special case for receiver buffer size=256 
   if (++rx_counter == 0) rx_buffer_overflow=1;
#else
   if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    rx_buffer_overflow=1;
    }   
#endif
   }      
}   
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

#define CHAR_UP PINC.2
#define ENTER PINC.1
#define SEND PINC.0
#define CHAR_COUNT 37

char characters[] =
{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'
,'q','r','s','t','u','v','w','x','y','z',' ','0','1','2','3','4','5','6','7','8','9'};

char count_char=-1;
char lcd_buffer[32], data_buffer[32];
char buffer_pointer=0;

void add_char(char c){
lcd_buffer[buffer_pointer]=c;       
if(buffer_pointer == 32)buffer_pointer = 0;    // اينتر باعث افزايش بافر پوينتر مي شود
}

void sent(void)   //تابع نوشتن متن براي ارسال
{
char i;
lcd_clear();
lcd_gotoxy(0,1);
lcd_putsf("load..");
delay_ms(800);
lcd_clear();
_lcd_write_data(0x0f);      
      while(1)
      {
      
        if(CHAR_UP==0){
        count_char++;
        if(count_char == CHAR_COUNT)count_char = 0;             
        add_char(characters[count_char]);
        lcd_clear(); 
        _lcd_write_data(0x0f);
        lcd_puts(lcd_buffer);
        delay_ms(300);
       }
            
       if(ENTER==0){
        count_char = -1;
        buffer_pointer++; 
        lcd_clear();
        _lcd_write_data(0x0f);      
        lcd_puts(data_buffer); 
        while(ENTER==0); 
        delay_ms(200);
       }
               
       if(SEND==0){
         lcd_clear();
         
          sprintf(data_buffer, "&sms:%s*$", lcd_buffer);
          puts(data_buffer);
          delay_us(10);
          puts(data_buffer);
          delay_us(10);
            
          while(SEND==0);
        delay_ms(150);   
        for(i=0;i<32;i++)data_buffer[I]='';         
        sprintf(data_buffer, "Sent:%s", lcd_buffer);      
        for(i=0;i<2;i++)
        {
        lcd_gotoxy(0,0);
        lcd_clear();
        delay_ms(250);   
        lcd_gotoxy(0,0);
        lcd_puts(data_buffer);
        delay_ms(250);            
       } 
         lcd_clear();
         lcd_gotoxy(0,0);
         lcd_puts(data_buffer);      
         for(i=0;i<32;i++)
         {
          data_buffer[I]=0;
          lcd_buffer[I]=0;      
         }
         for(i=0;i<32;i++)str3[I]=0; 
         on=0;
         count_char = -1;
         buffer_pointer=0; 
         break;         
      }
      
       }    
}


void main(void)
{
char i;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 4800
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x8F;
delay_ms(200);
DDRD.7=1;
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTD.0=1;
PORTD.1=1;
PORTD.1=0;
lcd_init(16);
#asm("sei")

lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("TEST");
delay_ms(400);
lcd_clear();

while (1)
     {
       if(PINC.0==0) sent();   //در صورتي که کليک شد،تابع نوشتن اجرا شود
      
          if (on==1)   //درصورتي که پيامي دريافت شد
         {
          lcd_clear();
          lcd_gotoxy(0,0);
          lcd_puts(str3);
          delay_ms(3000);
            
          puts("&OK!2$");    //کد ارسال پيام دريافت پيام
          puts("&OK!2$");
          puts("&OK!2$"); 
          on=0;
          }
          if (ok==1)   //در صورتي که پيام دريافت شد،ال اي دي روشن و خاموش شود
          {
          for(i=0;i<12;i++)PORTD.7=!PORTD.7,delay_ms(250);
          ok=0;
          }
    }      
}         


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]شبیه ساز و سورس
[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]از ازمایش مدار

*فروش کدها .. ممنوع و حرام می باشد.

-------------
انشالله در ورژن بعدی سعی میکنم کدها رو بهینه تر کنم،ضمن اینکه قابلیت ذخیر سازی پیام را بهش اضافه کنم
اگر سوال یا نکته ی دارید،ممنون خواهم شد ان را بیان بفرمایید.
باتشکر.[/I][/I][/I][/I][/I][/I][/I][/I][/I][/I]
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

ارسال پست

بازگشت به “آموزش و مثال‌ها AVR”