پروژه ارتباط رادیویی با ماژول های ASK DX-RF
در این پروژه از ارتباط رادیویی جهت ارسال و دریافت دیتا بین میکرو کنترلرهای avr استفاده شده که در آن ماژول های ASK DX-RF بکار رفته است.
قطعات بکار رفته در پروژه :
فرکانس کاری : 433 MHz ولتاژ کاری :3.5 تا 5 ولت جریان مصرفی : 10 الی 15 میلی آمپر مدولاسیون: ASK خروجی دیتا: TTL
ASK DX-RF
یک ماژول رادیویی می باشد. کاربرد این ماژول در ریموت کنترلرها می باشد. این ماژول در فرکانس کاری 433 ساخته می شوند و نسبت به فرکانس ریموت خود باید فرکانس فرستنده نیز انتخاب شوند. ولتاژ مورد نیاز این ماژول ها بین 3.5 تا 5.5 ولت میباشد.
میکرو کنترلر مورد استفاده در این پروژه ATMega8a از خانواده AVR میباشد. جهت اتصال و رد و بدل کردن داده ها بین میکرو کنترلرها از همین ارتباط uart استفاده شده است. نحوه برقراری ارتباط به این صورت است که در مدار فرستنده پایه txd میکرو کنترلر را به پایه data ماژول فرستنده وصل میکنیم. و در قسمت گیرنده پایه Rxd میکروکنترلر را به ماژول گیرنده وصل میکنیم.
جهت تامین کلاک میکرو کنترلر از یک عدد کریستال 3.6864 MHz استفاده شده که کمترین خطا برای تنظیم نرخ داده ارتباط سریال را دارد . در این جا برای ارتباط سریال نرخ داده بر روی 1200 bps استفاده شده سرعت بیشتر از این موجب خطا در داده های اریالی توسط ماژولهای Rf میگردد.
فقط باید دقت کرد که ماژول داده ها هنگاهی به بیت 1 میرسند از سمت ماژول فرستنده ارسال میشود و از انجایی که همگامی که هیچ دیتایی ارسال نمیکنیم پایه Txd میکروکنترلر همواره مقداره 1 منطقی (5ولت) می باشد. پس باید اطلاعات را معکوس کرد و فرستاد. و در نتیجه در سمت گیرنده نیز باید ابتدا اطلاعات دریافتی ماژول را معکوس کرد و آنها را خواند و برسی و دیکد کرد.
یک طبقه معکوس کننده ساده ماننده شکل زیر است:
همانطور که می بینید از یک طبقع ترانزیستور npn به شماره مدل bc547 بصورت امیتر مشترک استفاده شده. هنگامی که پایه tx مقدار 5 ولت باشد آنگاه ترانزیستور روشن و به ناحیه اشباع رفته در نتیجه پایه خروجی که از کلکتور گرفته شده مقدار صفر ولت (زمین ) میشود. و هنگامی که مثدار txd صفر ولت باشد مقدار ترانزیستور خاموش درنتیجه مقدار خروجی به vcc که مثدار 5 ولت را دارد وصل می شود.
شماتیک مدار
مدار فرستنده :
مدار گیرنده :
عملکرد این مدار به این صورت است که هنگامی که در قسمت فرستنده کلید 1 فشرده می شود از طریق ماژول Rf عبارت “$r1” ارسال می شود و هنگامی که در قسمت گیرنده این عبارت دریافت شود پورت c.5 میکروکنترلر روشن و در نتیجه ترانزیستور 2n3904 رو شن و باعث راه اندازی رله می شود.
در اینجا هم باید دقت نمود از ترانزیستور 2n3904 در ناحیه کلید زنی استفاده شده که تغذیه و جریان مناسب جهت روشن شدن رله 12 ولتی را تامین میکند . همچنین از یک دیود 1n4007 برای تخلیه انرژی ذخیره شده در کنداکتور رله استفاده شده که به عنوان دیود هرز گرد از آن یاد میکنند.
سورس پروژه :
کد مدار فرستنده :
/*
* txCode.c
*
* Created: 04/14/2018 11:53:02 ب.ظ
* Author: Reza.ZX
*/
#include <io.h>
#include <delay.h>
#define KEYA PINC.5
#define KEYB PINC.4
#define LEDA PORTB.2
#define LEDB PORTB.1
int i=0;
void USART_init()
{
UCSRA=0x00;
UCSRB=(1 << TXEN);//enable Transmit
UCSRC |=(1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); //set data bits to 8 and 1sopt bit and no parity
UBRRH=0x00;
UBRRL=191; //set Baud rate to 1200 in fosc 3.6864MHz}
}
void USART_send_char(unsigned char data)
{
while ((UCSRA & (1 << UDRE)) == 0) {};
UDR = data;
}
void USART_send_string(char* str)
{
for(i=0;str[i];i++)
{
USART_send_char(str[i]);
}
USART_send_char('\n');
}
void main(void)
{
DDRC.5=0;//input keys
DDRC.4=0;
DDRB.1=1;
DDRB.2=1;
PORTB=0x00;
USART_init();
delay_ms(1000);
while (1)
{
// Please write your application code here
if(KEYA==0)
{
USART_send_string("$r1");
LEDA=1;
while(KEYA==0);
delay_ms(500);
LEDA=0;
}
else if(KEYB==0)
{
USART_send_string("$r2");
LEDB=1;
while(KEYB==0);
delay_ms(500);
LEDB=0;
}
}
}
کد مدار گیرنده :
/*
* rxCode.c
*
* Created: 04/14/2018 11:53:02 ب.ظ
* Author: Reza.ZX
*/
#include <io.h>
#include <delay.h>
#include <string.h>
#define RELA PORTC.5
#define RELB PORTC.4
#define RX_BUFF_SIZE 24
int index=0,i=0;
unsigned char Rx_buffer[RX_BUFF_SIZE];
void USART_init()
{
UCSRA=0x00;
UCSRB= (1 << RXEN) | (1<<RXCIE);//enable Reciever and interrupt
UCSRC |=(1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); //set data bits to 8 and 1sopt bit and no parity
UBRRH=0x00;
UBRRL=191; //set Baud rate to 1200 in fosc 3.6864MHz
}
interrupt [USART_RXC] void usart_rx_interrupt(void)
{
char data;
data=UDR;
Rx_buffer[index]=data;
if(++index >= RX_BUFF_SIZE) {index=0;}
}
void clean()
{
for(i=0;Rx_buffer[i];i++)
Rx_buffer[i]='';
index=0;
}
void main(void)
{
DDRC.5=1;
DDRC.4=1;
PORTC=0x00;
USART_init();
delay_ms(1000);
#asm("sei");
while (1)
{
// Please write your application code here
if(strstr(Rx_buffer,"$r1"))
{
RELA=1;
delay_ms(2000);
clean();
}
else if(strstr(Rx_buffer,"$r2"))
{
RELB=1;
delay_ms(2000);
clean();
}
RELA=0;RELB=0;//reset relay
delay_ms(200);
}
}
دیدگاهتان را بنویسید