3.4.1. Xây dựng phần mềm nhúng điều khiển cho mạch Slave dùng
Atmega8
3.4.1.1. Sơ đồ hoạt động
Hình 39: Sơ đồ khối hoạt động của mạch Slave Cảm biến Master Slave UART uC Atmega8 EXT_INT0 Rx Hỏi Tx
Hình 40: Sơ đồ khối hoạt động của mạch Master Slave Rx Tx Master LCD Keyboard Tải uC Atmega128 Usart0 Usart1 Timer0 Timer1
3.4.2.2. Giải thích hoạt động
Trong chương trình Account và Password được đặt là “123”. Sau khi người sử dụng nhập password vào từ keyboard và login vào được hệ thống, hệ thống hoạt động. Atmega128 luôn gửi tín hiệu quét hỏi slave thông qua Usart0_Tx. Khi sensor nhận được tín hiệu trong khu vực quét có người nó gửi tín hiệu đến ngắt ngoài của slave, tiếp đó slave gửi tín hiệu tới master thông qua Usart0_Rx của Atmega128. Khi nhận dữ liệu xong lúc này DATA_flag có giá trị là True, Usart1 nhận tín hiệu vào Master. Khi Master đã nhận được dữ liệu nó điều chỉnh điện áp ra để đóng Rơle điện cho đèn sáng, đèn sáng trong vòng 30 giây, đồng thời dữ liệu trong Master được xóa và công việc quét hỏi lại tiếp tục.
3.5. Kết quả và khả năng ứng dụng của hệ thống 3.5.1. Tính khoa học 3.5.1. Tính khoa học
Thế kỷ 20 - 21 là thế kỷ của Thông Tin Điện tử - Viễn Thông, là nền tảng quan trọng trong việc điều khiển tự động hóa phù hợp với xu hướng phát triển khoa học kỹ thuật.
Đề tài thể hiện tính ứng dụng đa năng trong kỹ thuật vi điều khiển.
Ngoài ra đề tài còn sử dụng phần mềm hiện đại CodeVisionAVR để xây dựng phần mềm nhúng cho bo mạch.
3.5.2. Khả năng triển khai ứng dụng vào thực tiễn
Mục tiêu của đề tài này là nghiên cứu, thiết kế và chế tạo bo mạch điện tử ứng dụng trong tự động hóa và xây dựng phần mềm điều khiển cho bo mạch nêu trên để điều khiển bật/tắt đèn chiếu sáng và điều khiển đóng ngắt các thiết bị điện dân dụng khác một cách tự động nhằm tạo sự tiện dụng cho con người và tiết kiệm năng lượng.
Hệ thống có khả năng điều khiển được nhiều bóng đèn. Tuy nhiên, đề tài này chỉ làm trên mô hình cho nên tôi chỉ đưa ra điều khiển 1 bóng đèn mà thôi.
Hệ thống này tôi xây dựng để điều khiển bật/ tắt đèn chiếu sáng tự động, trên cơ sở này có thể phát triển mở rộng để điều khiển bật/ tắt các thiết bị điện khác.
Ngoài ra trong công tác giảng dạy, hệ thống trở thành một mô hình thực tế dùng để giảng dạy thể hiện sự ứng dụng của tự động hóa và đặc biệt khả năng ứng dụng đa dạng của Vi Điều Khiển.
những khu vực không cần chiếu sáng liên tục như cầu thang, hành lang, nhà vệ sinh và các khu vực khác mà không cần bật/ tắt đèn chiếu sáng. Điều này đem lại sự tiện dụng, thoải mái trong đời sống sinh hoạt của con người, đồng thời một lợi ích to lớn khác là tiết kiệm được năng lượng điện chiếu sáng góp phần vào công cuộc tiết kiệm tiêu thụ năng lượng điện toàn cầu.
Hơn nữa về tính khả thi trong tương lai, đề tài mang tính kích thích thúc đẩy sự phát triển của ngành Công nghệ Điện tử Việt Nam. Từ đó góp phần xây dựng đất nước ngày càng phồn vinh.
KẾT LUẬN
Hiện nay công nghệ tự động hóa đang được rất nhiều nhà khoa học quan tâm nghiên cứu cũng như nhu cầu sử dụng các sản phẩm được tích hợp công nghệ tự động hóa của người dân.
Luận văn đã trình bày được nhu cầu sử dụng các hệ thống điều khiển thông minh trong các tòa nhà, giới thiệu về một số phân hệ được sử dụng trong tòa nhà thông minh, những khái niệm về giao thức và chuẩn truyền thông sử dụng trong hệ thống điều khiển các phân hệ của tòa nhà thông minh. Đặc biệt luận văn đã trình bày việc thiết kế hệ thống điều khiển bật/ tắt đèn chiếu sáng trong tòa nhà cao tầng, cụ thể như:
Thiết kế các mạch điện tử sử dụng vi điều khiển Atmega8 và Atmega128 trong hệ thống.
Thiết lập giao tiếp theo chuẩn RS485 giữa các mạch điện tử.
Sử dụng phần mềm CodeVisionAVR để xây dựng phần mềm nhúng cho các mạch.
Sử dụng cảm biến JS-20 Largo Pir.
Qua đề tài này, học viên mong muốn nắm bắt được nền tảng kiến thức về lập trình cho vi điều khiển Atmega128, Atmega8 cũng như họ vi điều khiển AVR, đồng thời nắm bắt được kỹ thuật thiết kế mạch điện tử để ứng dụng vào điều khiển tự động hóa. Công nghệ mới luôn luôn phát triển không ngừng và có tính kế thừa, vì vậy việc nghiên cứu, cập nhật kiến thức để làm chủ thiết bị hiện đại là hết sức cần thiết.
[5] Trường Đại học kỹ thuật TP. HCM (2006), Giáo trình vi điều khiển.
[6]Trường Đại học Giao thông Vận tải (2001), Các loại cáp mạng.
[7]Trường ĐH Giao thông Vận tải (2001), Thiết kế môn học Mạng máy tính và số liệu.
[8] Nguyễn Thúy Vân (1997), Kỹ thuật số, KHKT Hà Nội.
Tiếng Anh
[9] Gilbert Held (2003), Ethernet Networks: Design, Implementation,
Operation, Management, John Wiley & Sons, Ltd.
[10] Robert C, Elsenpeter Toby J. Velte (2003), Build Your Own Smart Home
[11] F. H. Mitchell (1988), Introduction to Electronics Design, Printice Hall
[12] Kenvin Gilligan (2003), Honeywell Engineering Manual of Automatic Control for Commercial Buildings
[13] John, Wiley (2005), RFID HandBook
Website: [14] http://en.wikipedia.org/wiki/Building_Management_System [15] http://www.ameco.com.vn/dch-v/38-dch-v/122-bms-giai-phap-tiet- kiem-nang-luong-trong-toa-nha.html [16] http://www.pcworld.com.vn/articles/quan-ly/giai-phap-cong- cu/2009/06/1194171/phat-trien-rfid-tai-viet-nam/ [17]www.atmel.com
PHỤ LỤC
Hình 41: Hình ảnh của hệ thống
Phần mã nguồn các phần mềm nhúng điều khiển cho các mạch
1- Phần mã nguồn điều khiển cho mạch Master Chip type : ATmega128
Program type : Application Clock frequency : 16.000000 MHz Memory model : Small
External SRAM size : 0 Data Stack size : 1024
*****************************************************/ #include <mega128.h> #include <delay.h> #include "lcdcustom.c" #include "sw.h" #include "LcdCommand.h" #include "acc.h" #define TX_MODE 1 #define RX_MODE 0
#define RS485_N1_DIR PORTD.6 #define RS485_N0_DIR PORTD.7
#define MAX_SID 3 // Max slave IDs #define QUERY_TIMER 1 // N
#define TIMER QUERY_TIMER*10 // N x 16ms // Defines
#define FID_NO 1 #define A_LENGHT 13
unsigned char Dulieu_Floor[A_LENGHT]={'{','O','K',FID_NO,0,0,0,0,0,0,0,0,'}'}; unsigned int count=0;
unsigned char SID_NO; // IDs of Slave 0 -> 31
unsigned char FRAME_Length; // Length of receive frame
#define MAX_LENGTH 20 // Define max length of receive buffer unsigned char R_Buffer[MAX_LENGTH]; // Receive buffer for Slave IDs data union Long_Bytes
{
unsigned long DL_LONG;
unsigned char DL_BYTE[4]; } DULIEU;
bit DATA_Flag=FALSE; // Transmit to master when DATA ready #define UDRE0 UCSR0A.5
#define RXC0 UCSR0A.7 // Declare your global variables here
extern unsigned char STATE_MACHINE; extern flash byte coltech_0[8];
extern flash byte coltech_1[8]; extern flash byte coltech_2[8]; extern flash byte coltech_3[8]; extern flash byte coltech_4[8]; extern flash byte coltech_5[8]; void main(void)
{
// Declare your local variables here unsigned char temp,temp2;
while (1)
{
// Place your code here switch(STATE_MACHINE) {
case ACC_LOGIN_STATE: ACC_LOGIN_ACTION(); break;
case PASS_LOGIN_STATE: PASS_LOGIN_ACTION(); break;
case CHECK: CHECK_ACTION(); break;
case MONITER: MONITER_ACTION(); break;
} };
}
//======================================================= // Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB #endasm
#include <lcd.h> void Init_uC() {
#asm("cli") PORTA=0xFF; DDRA=0xFF;
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization PORTC=0xFF; DDRC=0xFF; // Port D initialization PORTD=0xFF; DDRD=0xFF; // Port E initialization PORTE=0xFF; DDRE=0xCF; // Port G initialization PORTG=0x1F; DDRG=0x1F; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15.625 kHz // Mode: Normal top=FFh // OC0 output: Disconnected ASSR=0x00;
TCCR0=0x07; TCNT0=0x82; // 5 OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 62.500 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // OC1C output: Discon.
OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; OCR1CH=0x00; OCR1CL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh
// OC2 output: Disconnected TCCR2=0x00;
TCNT2=0x00; OCR2=0x00;
// Timer/Counter 3 initialization // Clock source: System Clock
// Clock value: 15.625 kHz // Mode: Normal top=FFFFh // Noise Canceler: Off
// Input Capture on Falling Edge // OC3A output: Discon.
// OC3B output: Discon. // OC3C output: Discon.
// Timer 3 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off TCCR3A=0x00; TCCR3B=0x05; TCNT3H=0x00; TCNT3L=0x00; ICR3H=0x00; ICR3L=0x00; OCR3AH=0x00; OCR3AL=0x00; OCR3BH=0x00; OCR3BL=0x00; OCR3CH=0x00; OCR3CL=0x00;
// External Interrupt(s) initialization // INT0: Off
// INT1: Off // INT2: Off // INT3: Off // INT4: On
// INT4 Mode: Faling Edge // INT5: Off // INT6: Off // INT7: Off EICRA=0x00; EICRB=0x03; EIMSK=0x10; EIFR=0x10; // USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On
// USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud rate: 38400 UCSR0A=0x00;
UCSR1A=0x00;
UCSR1B=0xD8; UCSR1C=0x06;
UBRR1H=0x00;
UBRR1L=0x19;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x05;
ETIMSK=0x00;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
SFIOR=0x00;
// LCD module initialization lcd_init(20);
// Global enable interrupts #asm("sei")
}
//========================================================== // USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void) {
To_SLAVE(); }
// Interrupt to get slave data
// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void) {
static bit FRAME_flag = FALSE; static unsigned char byte_no = 0; unsigned char c; c=UDR0; if(c=='{') { byte_no=0; FRAME_flag=TRUE; } if(FRAME_flag) { R_Buffer[byte_no]=c; if(c=='}') { FRAME_flag=FALSE;
if((R_Buffer[1]=='O') & (R_Buffer[2]=='K')) { FRAME_Length=byte_no+1; //RS485_DATA_ToSend(R_Buffer[3]); DATA_Flag=TRUE; } } else { byte_no++; } } } //========================================================== #define CHECK_LENGTH 3
{ if(c!=CHECK_OK[byte_no]) byte_no=0; else { byte_no++; } } else { Command=c; byte_no=0; if(Command=='?') { if(DATA_Flag) To_MASTER(); } } } //======================================================= // Request slave data
#define Q_LENGHT 4
unsigned char QUESTION[Q_LENGHT]={'O','K',0xff,'?'}; void To_SLAVE()
{
if(byte_no<Q_LENGHT) { RS485_N0_DIR = TX_MODE; UDR0=QUESTION[byte_no]; byte_no++; } else { byte_no=0; RS485_N0_DIR = RX_MODE; } } //========================================================= void Query_Slaves() { QUESTION[2]=SID_NO; To_SLAVE();
// Inc Query Slave ID SID_NO++; if(SID_NO==MAX_SID) SID_NO=0; } //========================================================= void To_MASTER() {
static unsigned char byte_no = 0; if(byte_no<A_LENGHT) { RS485_N1_DIR = TX_MODE; UDR1=Dulieu_Floor[byte_no]; byte_no++; } else {
Dulieu_Floor[5]=0; Dulieu_Floor[4]=0; DATA_Flag=FALSE; } } //========================================================= // Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void) {
static unsigned int times = 0; // Place your code here
TCNT1H=0xFF; TCNT1L=0x9B; times++; if(times==TIMER) { times=0;
// Request slave data Query_Slaves(); }