Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.12 MB, 54 trang )
39
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%.
40
KẾT LUẬN
Thiết bị cảnh báo ngã ở người cao tuổi là một ứng dụng mới mẻ trong nước, có tiềm năng
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. Ngoà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 hoà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 đã hoà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
toán nhằm từng bước đưa vào ứng dụng thực tiễn.
41
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.
42
PHỤ LỤC
1. Code Atmega
/*****************************************************
Chip type
: ATmega8
Program type
: Application
Clock frequency
: 8.000000 MHz
Memory model
: Small
External RAM size : 0
Data Stack size
: 256
*****************************************************/
#include
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include
#include
#include
#include
#define SS PORTB.4
#define THRESH_TAP
#define DUR
29
33
#define THRESH_FF
40
#define TIME_FF
41
#define TAP_AXES
42
#define BW_RATE
44
#define POWER_CTL
45
#define DATA_FORMAT
#define FIFO_CTL
56
#define FIFO_STATUS
#define OFSX
49
30
57
43
#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)
{
44
char data;
while (counter==0);
data=rx_buffer[rx_rd];
if (++rx_rd == 8) rx_rd=0;
#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();
}
45
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;
}
46
void write(unsigned char dia_chi,unsigned char gia_tri)
{
SS=0;
//keo chan CS cua ADXL xuong 0 bat dau truyen
delay_us(10);
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);
32 samples.
write(DATA_FORMAT,0);
write(BW_RATE,13);
write(OFSX,0);
write(OFSY,0);
write(OFSZ,18);
// promance in stream_mode and data is storeed in limit of
// data is ringht_justified,range +/-2g,resolution 10 bits.
// set outputing data rate that is 800hz.....
47
write(TAP_AXES,6);
write(THRESH_TAP,4);
write(DUR,50);
write(THRESH_FF,0x2B);
write(TIME_FF,0x10);
// 450mg....
// 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);
48
lcd_putchar(tr+48);
lcd_putchar(',');
/******cong them 48
*****/
lcd_putchar(ch+48);
/******trong bang ma ASCI *****/
lcd_putchar(dv+48);
/******de doi ra so
//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;
*****/
49
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(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);