[glow=red,2,300]پروژه: طراحی سیستم کلاینت سرور (Client-Server) جهت شبکه کردن 255 میکروکنترلر .[/glow]
سلام خدمت دوستان عزیزم
مطالب تنظیم شده جهت ارائه به دوستان عزیزم حدود 3 ساعت از وقت اینجانب رو گرفت
امید است مورد استفاده ی دوستان عزیز قرار گیرد و پرداخت قسمتی از زکات علم ناچیزم باشد
مطالب قرار داده شده در این تاپیک نسخه ی دمو از نسخه ی اصلی این سیستم است.
بنابراین میتوانید به هر صورتی که بخواهین از این سیستم استفاده کنید.
یه نمونه از کاربرد دستگاه میتونه اندازه گیری مجموعه ای از دماهای اطراف باشه که در مسافت های طولانی قرار دارن و ما میتونیم با استفاده از این سیستم این مجموعه دما رو در یک جا مانیتورینگ کنیم.
در نسخه ی اصلی این پروژه امکان ضبط تمامی اطلاعات دریافتی از اسلیوها بر روی حافظه های (MMC_SD card) و همچنین پردازش اطلاعات اضافه شده است.
همچنین تمامی اطلاعات توسط نرم افزار لب ویو (labVIEW) پردازش و مانیتورینگ میشود.
توجه: این سیستم جهت شبکه کردن میکرو کنترلرها به صورت وایرلس (wireless)طراحی گریده است ،
در صورت نیاز به شبکه کردن به صورت سیمی (cord) کافی است قمست وایرلس برداشته و سیم جایگزین شود.
باشبکه کردن به صورت بی سیم برد این سیستم (فاصله ی هر slave از master) به حدود 200 متر هم میرسد.
طراحی برنامه به گونه ای است که هر تعداد میکرو تنها با اختصاص یک آدرس منحصر به فرد به آن وارد شبکه شده و برای مستر(master) شناخته شده است .
پروتکل مورد استفاده در این پروژه به صورت سریال (uzart) میباشد که در صورت نیاز ، به سادگی قابل تبدیل به پروتکل RS485 میباشد.
امنیت شبکه برا اساس طراحی شبکه های سیمی CAN میباشد.
سیستم از خطا یابی بالایی برخوردار میباشد به گونه ای که امکان وجود خطا در بسته های ارسالی به صفر میرسد.
بسته های ارسالی بنا به سلیقه ی کاربر قابل تغییر از 1 تا 255 بسته در هر بار ارسال داده میباشد.
در صورتی که هر یک از nod ها از شبکه خارج و یا در دسترس نباشد master از آن گاهی پیدا میکند.
[glow=red,2,300]برنام ها :[/glow]
برنامه ی master:
این برنامه در ای سی میکروکنتر مرکزی(master) باید ریخته شود . مستر وظیفه ی کنترل کل پروسه تبادل داده با تمامی اسلیو ها رو بر عهده داره.در صورتی که هر یک از اسلیو ها به مستر پاسخگو نباشند ، مستر اسلیو مورد مورد نظر را شناسایی کرده وآلارم مخصوص را به صدا در خواهد آورد.در این برنامه اطلاعات اسلیو 1 به صورت میزان دما و اطلاعات اسلیو 2 تغییرات عدد دیجیتال از 0 تا 255 است.این اطلاعات بر روی lcd به نمایش در خواهد آمد.
برنامه ی slave 1:
برنامه ی اسلیو 1 تشکیل شده از خواندن دمای محیط با استفاده از سنسور lm35 و ارسال این دما به طرف مستر.
برنامه ی slave 2:
برنامه ی اسلیو 2 تشکیل شده از خواندن مقدار ADC میکرو که توسط یک ولوم مقدار تبدیل شده از 0 تا 255 قابل تغییر است.
[glow=red,2,300]تصاویر پروژه:[/glow]




تصویر مانیتورینگ در نرم افزار لب ویو :

به دلیل کثرت توضیحات لازم برای قسمت برنامه از این کار صرف نظر کردم اما در صورت درخواست دوستان عزیزم در مورد هر قسمت از برنامه توضیح خواهم داد.
امیدوارم مورد استفاده دوستان عزیز قرار گیرد.
سلام خدمت دوستان عزیزم
مطالب تنظیم شده جهت ارائه به دوستان عزیزم حدود 3 ساعت از وقت اینجانب رو گرفت
امید است مورد استفاده ی دوستان عزیز قرار گیرد و پرداخت قسمتی از زکات علم ناچیزم باشد
مطالب قرار داده شده در این تاپیک نسخه ی دمو از نسخه ی اصلی این سیستم است.
بنابراین میتوانید به هر صورتی که بخواهین از این سیستم استفاده کنید.
یه نمونه از کاربرد دستگاه میتونه اندازه گیری مجموعه ای از دماهای اطراف باشه که در مسافت های طولانی قرار دارن و ما میتونیم با استفاده از این سیستم این مجموعه دما رو در یک جا مانیتورینگ کنیم.
در نسخه ی اصلی این پروژه امکان ضبط تمامی اطلاعات دریافتی از اسلیوها بر روی حافظه های (MMC_SD card) و همچنین پردازش اطلاعات اضافه شده است.
همچنین تمامی اطلاعات توسط نرم افزار لب ویو (labVIEW) پردازش و مانیتورینگ میشود.
توجه: این سیستم جهت شبکه کردن میکرو کنترلرها به صورت وایرلس (wireless)طراحی گریده است ،
در صورت نیاز به شبکه کردن به صورت سیمی (cord) کافی است قمست وایرلس برداشته و سیم جایگزین شود.
باشبکه کردن به صورت بی سیم برد این سیستم (فاصله ی هر slave از master) به حدود 200 متر هم میرسد.
طراحی برنامه به گونه ای است که هر تعداد میکرو تنها با اختصاص یک آدرس منحصر به فرد به آن وارد شبکه شده و برای مستر(master) شناخته شده است .
پروتکل مورد استفاده در این پروژه به صورت سریال (uzart) میباشد که در صورت نیاز ، به سادگی قابل تبدیل به پروتکل RS485 میباشد.
امنیت شبکه برا اساس طراحی شبکه های سیمی CAN میباشد.
سیستم از خطا یابی بالایی برخوردار میباشد به گونه ای که امکان وجود خطا در بسته های ارسالی به صفر میرسد.
بسته های ارسالی بنا به سلیقه ی کاربر قابل تغییر از 1 تا 255 بسته در هر بار ارسال داده میباشد.
در صورتی که هر یک از nod ها از شبکه خارج و یا در دسترس نباشد master از آن گاهی پیدا میکند.
[glow=red,2,300]برنام ها :[/glow]
برنامه ی master:
این برنامه در ای سی میکروکنتر مرکزی(master) باید ریخته شود . مستر وظیفه ی کنترل کل پروسه تبادل داده با تمامی اسلیو ها رو بر عهده داره.در صورتی که هر یک از اسلیو ها به مستر پاسخگو نباشند ، مستر اسلیو مورد مورد نظر را شناسایی کرده وآلارم مخصوص را به صدا در خواهد آورد.در این برنامه اطلاعات اسلیو 1 به صورت میزان دما و اطلاعات اسلیو 2 تغییرات عدد دیجیتال از 0 تا 255 است.این اطلاعات بر روی lcd به نمایش در خواهد آمد.
کد:
#include <mega8.h> #include <delay.h> #include <alcd.h> #include <stdio.h> //#define RXB8 1 //#define TXB8 0 //#define UPE 2 //#define DOR 3 //#define FE 4 //#define UDRE 5 //#define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) #define poniter_output_1 PINB.0 #define poniter_output_2 PINB.1 #define poniter PORTB #define sound PORTD.7 #define repeat_data 0x61 //a #define data_receive 0x6A //j #define not_exist 1 #define error 2 #define exact 3 #define HIGHT 1 #define LOW 0 unsigned char given=0x00; unsigned char slave_address[]={0x47,0x57}; // G , W unsigned char answer=0; bit NUM_node=1; unsigned char code_command=0xAA; unsigned char buffer_data[]={0,0}; unsigned char disbuf[17]; void beep() { unsigned char n=0; while(n<200) { sound = !sound; delay_us(150); n++; } sound=0; } unsigned char master_transmitter(unsigned char code,unsigned char address) { unsigned char loop=HIGHT; unsigned char i=0; unsigned char status; while(!(UCSRA & (1<<UDRE))); UCSRB |=(1<<TXB8); UDR=address; delay_ms(20); while(!(UCSRA & (1<<UDRE))); UCSRB &= ~(1<<TXB8); UDR=code; while (((UCSRA & (1<<RXC))==0)&&(loop==HIGHT)) { delay_ms(1); if(i++==50)loop=LOW; } if(loop==LOW) { return not_exist; } else { status=UCSRA; given=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)return exact; else return error; } } void main(void) { DDRB=0x03; DDRD.7=1; //sound // USART initialization // Communication Parameters: 9 Data, 1 Stop, Even Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; //MPCM=0; UCSRB=0x1C; UCSRC=0xA6; UBRRH=0x00; UBRRL=0x33; ACSR=0x80; // Alphanumeric LCD initialization // RS - PORTC Bit 5 // RD - PORTB Bit 5 // EN - PORTC Bit 4 // D4 - PORTC Bit 3 // D5 - PORTC Bit 2 // D6 - PORTC Bit 1 // D7 - PORTC Bit 0 // Characters/line: 16 lcd_init(16); while (1) { answer=master_transmitter(code_command,slave_address[NUM_node]); if (answer==not_exist) { if(NUM_node==0)poniter|=0x01; else poniter|=0x02; NUM_node=~NUM_node; code_command=data_receive; beep(); } else if(answer==error) { code_command=repeat_data; } else if(answer==exact) { if(NUM_node==0)poniter&=0xFE; else poniter&=0xFD; buffer_data[NUM_node]=given; NUM_node=~NUM_node; code_command=data_receive; } lcd_clear(); lcd_gotoxy(0,0); if(poniter_output_1==HIGHT)sprintf(disbuf,"NOD1=lack"); else sprintf(disbuf,"NOD1=%u%cC",buffer_data[0],0xdf); lcd_puts(disbuf); lcd_gotoxy(11,0); lcd_puts("H=60"); lcd_gotoxy(0,1); if(poniter_output_2==HIGHT)sprintf(disbuf,"NOD2=lack"); else sprintf(disbuf,"NOD2=%u",buffer_data[1]); lcd_puts(disbuf); lcd_gotoxy(11,1); lcd_puts("L=50"); delay_ms(25); } }
برنامه ی slave 1:
برنامه ی اسلیو 1 تشکیل شده از خواندن دمای محیط با استفاده از سنسور lm35 و ارسال این دما به طرف مستر.
کد:
#include <mega8.h> #include <delay.h> //#define RXB8 1 //#define TXB8 0 //#define UPE 2 //#define DOR 3 //#define FE 4 //#define UDRE 5 //#define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) #define output_relay PORTB.0 //#define okay 0x77 #define slave_address 0x47 //G #define data_transmit 0x6A //j #define repeat_data 0x61 //a #define hight_switch 60 #define low_switch 50 //#define Relay_connect 0x72 //r //#define Relay_disconnect 0x79 //y #define HIGHT 1 #define LOW 0 int buffer_1=0x00; char buffer_0=0x00; #define ADC_VREF_TYPE 0xE0 // Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); delay_us(10); ADCSRA|=0x40; while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } void putchar(unsigned char c) { while ((UCSRA & DATA_REGISTER_EMPTY)==0); //UCSRB |=(1<<TXB8); UDR=c; UCSRA|=0X01; } interrupt [USART_RXC] void usart_rx_isr(void) { unsigned char status,data,i=0; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { if(UCSRA&0x01) { if(data==slave_address) { UCSRA&=0xFE; } } else { if(data==repeat_data) { putchar(buffer_0); } else if(data==data_transmit) { i=0; for(i=0;i<50;i++) { buffer_1+=read_adc(5); } buffer_1/=50; buffer_0=buffer_1; putchar(buffer_0); if(buffer_0>hight_switch)output_relay=LOW; else if(buffer_0<low_switch)output_relay=HIGHT; } else UCSRA|=0X01; } } else UCSRA|=0X01; } void main(void) { DDRB=0x01; //relay // Communication Parameters: 9 Data, 1 Stop, Even Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x01; UCSRB=0x9C; UCSRC=0xA6; UBRRH=0x00; UBRRL=0x33; ACSR=0x80; // ADC Clock frequency: 125.000 kHz // ADC Voltage Reference: Int., cap. on AREF // Only the 8 most significant bits of // the AD conversion result are used ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x86; #asm("sei") while (1) { /*buffer=read_adc(5); if(buffer>hight_switch)output_relay=LOW; else if(buffer<low_switch)output_relay=HIGHT; delay_ms(80);*/ } }
برنامه ی slave 2:
برنامه ی اسلیو 2 تشکیل شده از خواندن مقدار ADC میکرو که توسط یک ولوم مقدار تبدیل شده از 0 تا 255 قابل تغییر است.
کد:
#include <mega8.h> #include <delay.h> //#define RXB8 1 //#define TXB8 0 //#define UPE 2 //#define DOR 3 //#define FE 4 //#define UDRE 5 //#define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) #define output_relay PORTB.0 //#define okay 0x77 #define slave_address 0x57 //G #define data_transmit 0x6A //j #define repeat_data 0x61 //a #define hight_switch 240 #define low_switch 230 //#define Relay_connect 0x72 //r //#define Relay_disconnect 0x79 //y #define HIGHT 1 #define LOW 0 unsigned char buffer=0x00; #define ADC_VREF_TYPE 0x60 // Read the 8 most significant bits unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); delay_us(10); ADCSRA|=0x40; while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } void putchar(unsigned char c) { while ((UCSRA & DATA_REGISTER_EMPTY)==0); //UCSRB |=(1<<TXB8); UDR=c; UCSRA|=0X01; } interrupt [USART_RXC] void usart_rx_isr(void) { unsigned char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { if(UCSRA&0x01) { if(data==slave_address) { UCSRA&=0xFE; } } else { if(data==repeat_data) { putchar(buffer); } else if(data==data_transmit) { buffer=read_adc(5); putchar(buffer); if(buffer>hight_switch)output_relay=LOW; else if(buffer<low_switch)output_relay=HIGHT; } else UCSRA|=0X01; } } else UCSRA|=0X01; } void main(void) { DDRB=0x01; //relay PORTC.5=1; //ADC PIN // Communication Parameters: 9 Data, 1 Stop, Even Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x01; UCSRB=0x9C; UCSRC=0xA6; UBRRH=0x00; UBRRL=0x33; ACSR=0x80; // ADC Clock frequency: 125.000 kHz // ADC Voltage Reference: AVCC pin // Only the 8 most significant bits of ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x86; #asm("sei") while (1) { buffer=read_adc(5); if(buffer>hight_switch)output_relay=LOW; else if(buffer<low_switch)output_relay=HIGHT; delay_ms(80); } }
[glow=red,2,300]تصاویر پروژه:[/glow]





تصویر مانیتورینگ در نرم افزار لب ویو :

به دلیل کثرت توضیحات لازم برای قسمت برنامه از این کار صرف نظر کردم اما در صورت درخواست دوستان عزیزم در مورد هر قسمت از برنامه توضیح خواهم داد.
امیدوارم مورد استفاده دوستان عزیز قرار گیرد.
دیدگاه