Khi vi xử lý đã hồn tất quá trình tính tốn và nhận ra ngã nĩ sẽ ra lệnh cho modul Sim gửi tin nhắn. Sự kiện này cĩ thể xảy ra bất cứ lúc nào vị vậy trong chương trình chính luơn phải quét quá trình này.
Hàm reset sim:
printf("ATZ\n\r") ta gửi liên tiếp các lệnh ATZ tới Sim để reset. Và chờ đến khi nào mơ đun sim trả về chuỗi Ok là mơ đun đã sẵn sang làm việc.
while(i++) { A[i]=getchar(); if((A[0]=='\n')&&(A[1]=='O')&&(A[2]=='K')&&(A[3]=='\r')&&(A[4]=='\n'))brea ; } lcd_gotoxy(4,0);//lcd_putsf("Reset Sim"); Hàm gửi tin nhắn: void gui_tn()
{ printf("AT+CMGS=\""); Gửi lệnh cho mơ đun chuẩn bị viết tin nhắn printf("0979317151"); Số điện thoại cần gửi
printf("\"\r\n"); i=0;
while(i++) //Chờ xác nhận từ mơ đun Sim là chuỗi OK {
A[i]=getchar();
if((A[0]=='\n')&&(A[1]=='O')&&(A[2]=='K')&&(A[3]=='\r')&&(A[4]=='\n'))break; } printf(" Bi nga roi"); // Nội dung tin nhắn
putchar(0x1A); // Kỹ tự kết thúc
Hàm khởi động mơ đun Sim sẽ được khởi tạo ngay khi vào chương trình, hàm gửi tin nhắn sẽ được đưa vào vịng lặp cùng với chu kì quét gia tốc và phát hiện ngã. Khi nào cĩ điều kiện ngã thỏa mãn chỉ cần gọi hàm gửi tin nhắn tự động mơ đun Sim sẽ gửi tin nhắn đến thuê bao đã được chọn sẵn.
Sau khi thiết kế xong mơ hình trên các phần mềm đã tiến hành hồn thành trên mơ hình thực với các khối chức năng như mơ hình lý thuyết.
4.1.1 Khối modul Sim
Khối mơ đun Sim là khối được tích hợp sẵn hầu hết các chuẩn giao tiếp và cổng kết nối. Đây là mơ đun bán sẵn trên thị trường. Khi làm việc với mơ đun này ta chỉ cần gắn Sim vào khay sim, kết nối nguồn cho mơ đun và nối 2 đầu dây giao tiếp UART với vi điều khiển là cĩ thể thực hiện quá trình điều khiển truyền nhận dữ liệu và thu phát tin.
Hình 4.1 Khối modul Sim 458
Nhược điểm của khối này là:
- Tích hợp nhiều cổng kết nối khơng dung - Khối lượng và kích thước lớn
- Cơng suất tiêu hao năng lượng lớn - Kết cấu đĩng nên khả năng mở rộng khĩ
Hình 4.2 Khối điều khiển trung tâm
Đây là khối được thiết kế và làm bằng tay. Trên một bo mạch 10x10 cm. Cĩ tích hợp đầy đủ các cổng nạp cho chương trình, cổng Com để kết nối máy tính. Mạch này cĩ thể được cấp nguồn từ adaptor hoặc từ pin.
a. Khối mạch tích hợp
Sau khi thiết kế phiên bản một cịn một số hạn chế về nguồn, kích thước, khả năng linh hoạt cĩ thể mang trên cơ thể. Phiên bản hai được thiết kế lại giảm bớt các khối chức năng nhưng cĩ thể gần giống hơn một thiết bị cĩ khả năng mang theo người.
Hình 4.4 Khối mạch tích hợp mặt sau
b. Giao diện trên máy tính.
Đã được hồn thành từ chương trình Visual Basic cĩ khả năng kết nối và nhận dữ liệu từ cổng Com trên mơ đun phát hiện ngã và truyền về máy tính thơng qua cáp kết nối Usb to Com.
4.2 Khả năng hoạt động
a. Khả năng hiển thị gia tốc đối tượng trên LCD
- Khi modul nhận dạng nằm ngang với mặt đất gia tốc theo trục Z
Hình 4.5 Khi modul nhận dạng nằm ngang với mặt đất gia tốc theo trục Z - Khi modul nằm nghiêng gia tốc theo trục X
Hình 4.8 - Khi modul nằm nghiêng gia tốc theo trục X
- Khi modul nằm nghiêng gia tốc theo trục Y
Hình 4.6 - Khi modul nằm nghiêng gia tốc theo trục Y
b. Khả năng khảo sát trên giao diện máy tính
Do khả năng lọc nhiễu cịn hạn chế và đặc tính khơng ổn định của linh kiện cũng như đường truyền mà tín hiệu nhận được cịn chưa đúng với tính tốn lý thuyết.
Hình 4.7 Tín hiệu cảm biến giám sát khi đứng im
Hình 4.9 Tín hiệu cảm biến giám sát trạng thái đi
Hình 4.10 Tín hiệu gia tốc trạng thái ngã, chấn động
Hệ thống hoạt động giao tiếp với các thiết bị ngoại vi tốt. Trong quá trình thử nghiệm khả năng nhận đúng của hệ thống là trên 75%.
phát triển và thương mại hĩa. Luận văn này thể hiện một cơng việc được thực hiện xuyên suốt từ nghiên cứu lý thuyết, thực thi phần cứng và lập trình nhúng dù chương trình cịn khá đơn giản. Để thực hiện được đề tài cần ứng dụng khá nhiều các cơng nghệ liên quan như sử dụng và xử lý tín hiệu từ cảm biến gia tốc vi cơ điện tử, nghiên cứu các chuẩn và quy tắc truyền thơng: SPI, UART, truyền tin nhắn SMS. Ngồi ra cần phải nghiên cứu động lực học cũng như nghiên cứu thực nghiệm đối với hiện tượng ngã ở người cao tuổi. Sau khi hồn thành đề tài, học viên đã chế tạo ra một hệ thống prototype cảnh báo ngã. Luận văn cĩ đề cập tới 3 giải thuật phát hiện ngã khác nhau là: 1) Phát hiện tác động đơn giản; 2) Phát hiện ngã dựa vào định hướng; 3) Phát hiện ngã dựa vào định hướng đầu cuối và định hướng quá trình. Trong đĩ giải thuật thứ 3 là do tác giả đề xuất trên cơ sở giải thuật 2) đã được đề cập trong tài liệu [9] nhằm khắc phục những hạn chế của nhĩm tác giả. Trong quá trình thực hiện, chương trình đã hoạt động tốt với giải thuật 1 (xem phụ lục), cịn các giải thuật nâng cao hơn vẫn chưa hoạt động ổn định.
Đề tài thực hiện được giải thuật phát hiện ngã dựa vào gia tốc của người mang thiết bị và gĩc di chuyển của người mang. Đồng thời, cĩ thể nghiên cứu được chuyển động của đối tượng một cách trực quan dựa vào giao diện máy tính được thiết kế cùng. Đây là một đề tài mang tính thực tiễn cao vì vậy khi tiến hành nghiên cứu thiết kế học viên cũng gặp nhiều khĩ khăn tuy nhiên cũng đã hồn thành được các cơng việc đề ra trong đề cương luận văn.
Bước tiếp theo của luận văn, học viên sẽ đi sâu vào việc cải thiện độ chính xác của thuật tốn nhằm từng bước đưa vào ứng dụng thực tiễn.
TÀI LIỆU THAM KHẢO
1. Nguyễn Quốc Trung (2002), Xử lý tín hiệu số và lọc số, Nhà xuất bản Đại học Quốc gia Hà Nội.
2. Nguyễn Văn Hịa (2005), Giáo trình đo lường điện và cảm biến đo lường, Nhà xuất bản giáo dục.
3. Nguyễn Văn Khang (2007), Động lực học hệ nhiều vật, Nhà xuất bản khoa học và kỹ thuật.
4. Clark, Russell D., Stephen R. Lord, and Ian W. Webster. "Clinical parameters associated with falls in an elderly population." Gerontology 39.2 (2009): 117-123. 5. Phillips, Lisa RS, Gaynor Parfitt, and Alex V. Rowlands. "Calibration of the
GENEA accelerometer for assessment of physical activity intensity in children." Journal of Science and Medicine in Sport (2012).
6. Liu, Jiayang, et al. "uWave: Accelerometer-based personalized gesture recognition and its applications." Pervasive and Mobile Computing 5.6 (2009): 657-675. 7. Tudor-Locke, Catrine, et al. "Accelerometer profiles of physical activity and
inactivity in normal weight, overweight, and obese US men and women." Int J Behav Nutr Phys Act 7.1 (2010): 60.
8. Lai, Chin, et al. "Adaptive body posture analysis using collaborative multi-sensors for elderly falling detection." IEEE Intell Syst 25.2 (2010): 20-30.
9. Jey Chen (2005), Wearable Sensors for Reliable Fall Detection, Proceedings of the IEEE.
Chip type : ATmega8 Program type : Application Clock frequency : 8.000000 MHz Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/ #include <mega8.h> #asm .equ __lcd_port=0x1B ;PORTA #endasm #include <lcd.h> #include <delay.h> #include <stdio.h> #include <math.h> #define SS PORTB.4 #define THRESH_TAP 29 #define DUR 33 #define THRESH_FF 40 #define TIME_FF 41 #define TAP_AXES 42 #define BW_RATE 44 #define POWER_CTL 45 #define DATA_FORMAT 49 #define FIFO_CTL 56 #define FIFO_STATUS 57 #define OFSX 30 #define OFSY 31
#define OFSZ 32
#define numberr 10 // number times of getting sample for calibration .... // USART Receiver buffer
//volatile unsigned long int sx,sy,sz; //volatile int data[6],x,y,z,x0,y0,z1,z0; char rx_buffer[8];
unsigned char rx_wr,rx_rd,counter;
char A[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//mang de kiem tra du lieu tu modul sim tra ve
bit over; int i;
interrupt [USART_RXC] void ngatUART(void) { char data; data=UDR; if ((UCSRA&28)==0) { rx_buffer[rx_wr]=data; if (++rx_wr == 8) rx_wr=0; if (++counter == 8) { counter=0; over=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data;
#asm("cli") --counter; #asm("sei") return data; } #pragma used- #endif void reset_sim() {
//gui lien tiep lenh ATZ de reset sim printf("ATZ\n\r"); printf("ATZ\n\r"); printf("ATZ\n\r"); printf("ATZ\n\r"); printf("ATZ\n\r"); i=0;
//Cho den khi modul tra ve chuoi 'OK' while(i++) { A[i]=getchar(); if((A[0]=='\n')&&(A[1]=='O')&&(A[2]=='K')&&(A[3]=='\r')&&(A[4]=='\n'))break; } lcd_gotoxy(4,0);//lcd_putsf("Reset Sim"); lcd_putchar(A[0]); lcd_putchar(A[1]); lcd_putchar(A[2]); lcd_putchar(A[3]); delay_ms(500);//lcd_clear(); } void gui_tn()
{
printf("AT+CMGS=\""); //gui cho modul lenh viet tin nhan printf("0979317151"); //so dien thoai can gui
printf("\"\r\n"); i=0;
while(i++) //cho khi nao co chuoi 'OK' gui ve tu modul {
A[i]=getchar();
if((A[0]=='\n')&&(A[1]=='O')&&(A[2]=='K')&&(A[3]=='\r')&&(A[4]=='\n'))break; }
printf("xe bi do"); //noi dung tin nhan putchar(0x1A); //ky tu ket thuc noi dung printf("\"\r\n"); putchar(0x0D); putchar(0x0A); delay_ms(1000); putchar(0x0A); lcd_clear(); lcd_gotoxy(5,0); lcd_putsf("Okie"); lcd_gotoxy(3,1);
lcd_putsf("DA GUI TIN"); delay_ms(200);lcd_clear(); }
/*****SPI dung cho ADXL******/ unsigned char spi(unsigned char x) {
SPDR=x; while ((SPSR&128)==0); return SPDR;
}
spi(dia_chi); //goi dia chi ra de ghi
spi(gia_tri); //ghi gia tri vao dia chi vua goi delay_us(10);
SS=1; //keo chan CS len 1 de ket thuc truyen delay_us(100);
}
unsigned char read(unsigned char dia_chi) {
unsigned char x=0;
SS=0; //keo chan CS cua ADXL xuong 0 bat dau truyen delay_us(10);
spi((128|dia_chi)); //goi dia chi can doc
x=spi(0); //truyen byte trong de nhan duoc du lieu cua dia chi vua goi delay_us(10);
SS=1; //keo chan CS len 1 de ket thuc truyen delay_us(10);
return x; }
void khoitao_adxl() {
write(FIFO_CTL,0x9F); // promance in stream_mode and data is storeed in limit of 32 samples.
write(DATA_FORMAT,0); // data is ringht_justified,range +/-2g,resolution 10 bits. write(BW_RATE,13); // set outputing data rate that is 800hz...
write(OFSX,0); write(OFSY,0); write(OFSZ,18); write(TAP_AXES,6);
write(THRESH_TAP,4); write(DUR,50);
write(THRESH_FF,0x2B); // 450mg.... write(TIME_FF,0x10); // 100ms....
write(POWER_CTL,0x2D); // into bybass mode... delay_us(10);
write(POWER_CTL,8); // into measure mode }
// hien thi so tren LCD
void hienthi(long so,char h,char c) { long number; long ng, tr,ch,dv,p1; if(so<0) { number=-so;
lcd_gotoxy(c,h); //vi tri hien thi,cot, hang lcd_putchar('-');
} else {
number= so;
lcd_gotoxy(c,h); //vi tri hien thi,cot, hang lcd_putchar('+');
}
ng=number/1000;
tr=(number%1000)/100; //lay hang tram ch=((number%1000)%100)/10; //hang chuc dv=(((number%1000)%100)%10)/1; //hang don vi //p1=((number-(tr*100+ch*10+dv))*10)/10;
p1=(((number%100)%10)%1)*10/10; lcd_putchar(ng+48);
//lcd_putchar(','); //lcd_putchar(p1+48); }
//void hienthi2(long kt,char r,char l) //{
//lcd_gotoxy(r,l); //lcd_putchar(kt); //lcd_putchar(':') ; //}
void hienthi2(long so) {
long number;
long ng, tr,ch,dv,p1; //if(so<0)
{
number=-so; //vi tri hien thi,cot, hang //putchar('-');
} //else {
number= so;
//vi tri hien thi,cot, hang //putchar('+');
}
ng=number/1000;
ch=((number%1000)%100)/10; //hang chuc dv=(((number%1000)%100)%10)/1; //hang don vi //p1=((number-(tr*100+ch*10+dv))*10)/10;
//p1=(((number%100)%10)%1)*10/10;
//lcd_putchar(tr+48); /******cong them 48 *****/ putchar(ng+48);
putchar(tr+48); putchar(',');
/******trong bang ma ASCI *****/ putchar(ch+48); /******de doi ra so *****/ putchar(dv+48); delay_ms(100); } long g1,g2,g3, g; void htg() { int datax,datay,dataz; datax=((read(51)<<8)|read(50));
delay_ms(10); //du lieu tu truc x(DATAX0+DATAX1) datay=((read(53)<<8)|read(52));
delay_ms(10); //du lieu tu truc y dataz=((read(55)<<8)|read(54)); delay_ms(10); //du lieu tu truc z
g1=((datax)*3.9); //tinh gia toc theo truc x g2=((datay)*3.9); //tinh gia toc theo truc y g3=((dataz)*3.9); //tinh gia toc theo truc z g=sqrt((g1*g1)+(g2*g2)+(g3*g3));
//hienthi2(88,0,0); //hienthi2(89,0,8);
hienthi(g3,1,5); hienthi2(g); delay_ms(100); } void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x10; DDRB=0xB0; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; /**SPI**/ SPCR=0x5F; SPSR=0x00; TWCR=0x00; /**UART**/ UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; ACSR=0x80; SFIOR=0x00; lcd_init(16);
#asm("sei") khoitao_adxl(); delay_ms(2000); reset_sim(); //delay_ms(1000); //printf("AT+CMGD=1\n\r"); //delay_ms(1000); while (1) { } }
2. Code Visual Basic Option Explicit Dim ve1 As Boolean Dim counter1 As Integer Dim giatoc As Variant Dim X As Double Dim Y As Double Dim A As Variant
……….. Private Sub dung_ve_tocdo_Click()
If ve1 = True Then ve1 = False End If
End Sub
Private Sub Exit_Click()
If MSComm1.PortOpen = True Then 'Dong cong COM MSComm1.PortOpen = False
End If
End 'ket thuc End Sub
.CommPort = 4 .Settings = "9600,N,8,1" .RThreshold = 5 'SThreshold = 0 'InputMode = 0 'InputLen = 0
If .PortOpen = False Then .PortOpen = True
End If End With
khoitao_dothi_giatoc ''khoitao_dothi End Sub
Public Sub khoitao_dothi_giatoc() With NTGraph1
.PlotAreaColor = vbBlack 'Chon mau nen la mau den .FrameStyle = Bitmap ' Chon khung la dang Bitmap ' Khung co 3 dang Bitmap, Flat, Scope
.Caption = " DO THI DO GIA TOC" 'Dat tieu de cho do thi .XLabel = "THOI GIAN (s)" 'Dat tieu de cho truc X .YLabel = " GIA TOC" 'Dat tieu de cho truc Y
.ClearGraph ' Xoa tat ca cac do thi va cai dat do thi moi
.ElementLineColor = RGB(255, 255, 0) ' chon mau cho duong do thi .SetRange 0, 30, -20, 20
End With End Sub
……… Private Sub MSComm1_OnComm()
Dim u1 As Variant
If MSComm1.CommEvent = comEvReceive Then str = MSComm1.Input u1 = Val(str) u = Left(str, 5) toc_do.Text = u If Val(str) >= 15 Then CANHBAO.Text = "NGA" Else: CANHBAO.Text = " " End If End If End Sub
Private Sub Timer1_Timer() counter1 = counter1 + 1 If ve1 = True Then giatoc = Val(toc_do.Text) X = counter1 If (giatoc >= 0) Then Y = giatoc NTGraph1.PlotXY X, Y, 0 If counter1 = 30 Then khoitao_dothi_giatoc counter1 = 0 End If End If End If End Sub ………. Private Sub Timer3_Timer()
'Dong ho bao ngay/thang/nam-gio/phut/giay Dim h, m, s As Byte
ve1 = True End Sub