Thiết kế và thi công vòng đeo tay đếm bước chân dựa trên thuật toán DECSION TREE Thiết kế và thi công vòng đeo tay đếm bước chân dựa trên thuật toán DECSION TREE Thiết kế và thi công vòng đeo tay đếm bước chân dựa trên thuật toán DECSION TREE Thiết kế và thi công vòng đeo tay đếm bước chân dựa trên thuật toán DECSION TREE Thiết kế và thi công vòng đeo tay đếm bước chân dựa trên thuật toán DECSION TREE
TÓM TẮT Cảm biến chuyển động trở thành chức phải có điện thoại thơng minh tablet lượng thơng tin khổng lồ mà cung cấp cho người dùng Trong điện thoại thông minh, cảm biến ứng dụng lệnh nắm bắt cử để điều khiển, tăng cường giải trí, tương tác với thực tế, chụp ảnh toàn cảnh định hướng việc giao thông lại Với khả theo dõi xác chuyển động người dùng, cơng nghệ cảm biến chuyển động biến thiết bị cầm tay thành thiết bị thông minh 3-D mà sử dụng ứng dụng sức khỏe, theo dõi luyện tập đến dịch vụ xác định vị trí Một ứng dụng phổ biến cảm biến chuyển động vịng đeo tay dùng để theo dõi việc luyện tập thể dục ngày Các vịng đeo tay tính tốn số bước chân, tính tốn khoảng cách di chuyển cho người sử dụng Thiết bị trở thành thành phần hữu ích quan trọng sống người Tuy nhiên, hầu hết mẫu sản phẩm xây dựng độc lập độ xác bị ảnh hưởng hoạt động ngẫu nhiên người sử dụng Các sản phẩm chưa có khả phân biệt hoạt động thể chất khác để ghi nhận xác số bước chân hoạt động tương ứng Điều dẫn đến sản phẩm có sai số khác với nhiều người dùng khác Luận văn nghiên cứu tập trung vào việc xây dựng ngun mẫu vịng đeo tay có khả đếm bước chân kết nối với smartphone; đồng thời cải thiện thuật tốn đếm bước chân xác cách thu thập liệu huấn luyện tạo decision tree Kết từ decision tree feedback lại thuật tốn vịng đeo tay để phát bước chân xác trang bị cho khả phân biệt hoạt động thể chất v ABSTRACT Motion sensor has become one of the must-have functions on smart phone and tablet because of the large information they gave the user On smart phone, motion sensor is used to detect motion fro controlling, enhanced entertainment, reality interaction, panoramic photos, orienting traffic With the ability to capture exactly motion of users, motion detection technology can change the smart phone to smart 3-D device which can be used in health monitoring, exercising monitoring and location detection One of the most common applications of motion detection is exercising monitoring function of the smart watch Smart watch has become very useful in daily life However, most the products on the market were built independently and the accuracy of these products is affected by random motion of the users They also did not have the ability to distinguish types of activities, therefore they could not detect steps in corresponding activities This can lead to difference results for difference users This thesis will focus on building a smart watch which can count steps precisely and communicate with smart phone Also the thesis will improve algorithm for detecting steps by collecting raw data and training data to get a decision tree Result from this decision tree will be used to improve detecting steps and the device can distinguish the activities vi MỤC LỤC TRANG TỰA QUYẾT ĐỊNH GIAO ĐỀ TÀI BIÊN BẢN CỦA HỘI ĐỒNG ĐÁNH GIÁ LUẬN VĂN PHIẾU NHẬN XÉT GIẢNG VIÊN PHẢN BIỆN PHIẾU NHẬN XÉT GIẢNG VIÊN PHẢN BIỆN LÝ LỊCH KHOA HỌC i LỜI CAM ĐOAN iii LỜI CẢM ƠN iv TÓM TẮT v ABSTRACT vi MỤC LỤC vii DANH MỤC CÁC CHỮ VIẾT TẮT x DANH MỤC CÁC BẢNG BIỂU xi DANH MỤC CÁC HÌNH ẢNH, BIỂU ĐỒ xii CHƯƠNG TỔNG QUAN 1.1 Tổng quan tình hình nghiên cứu 1.2 Tính cấp thiết đề tài 1.3 Mục tiêu nghiên cứu 1.4 Nhiệm vụ nghiên cứu 1.5 Phương pháp nghiên cứu 1.6 Bố cục luận văn CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 Nguyên lý đếm bước chân 2.2 Bluetooth Low Energy (BLE) 11 vii 2.2.1 Giới thiệu BLE 11 2.2.2 Các chế độ hoạt động BLE 13 2.2.3 Các trình hoạt động BLE 15 2.2.4 Các đặc tính tần số cấu trúc truyền liệu BLE .16 2.3 Decision Tree 19 2.3.1 Thuật toán ID3 22 2.3.2 Thuật toán C4.5 23 2.4 Cross Validation (Đánh giá chéo) 25 2.4.1 Random Subsampling 26 2.4.2 K-fold-Cross-Validation .27 2.4.3 Leave one-out Cross Validation 28 2.5 Confusion Matrix 28 2.6 Board nRF51822 29 2.6.1 Giới thiệu nRF51822 29 2.6.2 Thơng số kỹ thuật, tính board nRF51822 30 2.7 MPU-6050 33 2.7.1 Giới thiệu MPU-6050 33 2.7.2 Các tính MPU-6050 .34 2.7.3 Sơ đồ chân MPU-6050 36 2.10 Weka 39 2.10.1 Giới thiệu giao diện Weka .40 2.10.2 Chuẩn bị liệu cho Weka 42 CHƯƠNG 47 THIẾT KẾ SẢN PHẨM VÀ THUẬT TOÁN 47 3.1 Thiết kế phần cứng 47 3.2 Xây dựng thuật toán 55 3.2.1 Xây dựng thuật toán đếm bước chân 55 3.2.2 Thu thập liệu, huấn luyện cải tiến thuật toán 62 CHƯƠNG 67 viii KẾT QUẢ NGHIÊN CỨU VÀ THỰC NGHIỆM 67 4.1 Nguyên mẫu xây dựng 67 4.2 Mô tả thực nghiệm 68 4.3 Kết thực nghiệm 69 CHƯƠNG 71 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 71 5.1 Kết đạt 71 5.2 Hướng phát triển đề tài 72 PHỤ LỤC 75 ix DANH MỤC CÁC CHỮ VIẾT TẮT IoT Internet of Things BLE Bluetooth Low Energy PDU Packet Data Unit MEMS Microelectromechanical systems DMP Digital Motion Processor SoC System on Chip x DANH MỤC CÁC BẢNG BIỂU Bảng 2.1: So sánh BLE với chuẩn kết nối không dây Bảng 2.2: Các giai đoạn hoạt động BLE central BLE peripheral Bảng 2.3: Tập liệu thời tiết output tương ứng Bảng 2.3: Tập liệu thời tiết output tương ứng Bảng 2.4: Bảng Confusion Bảng 2.5: Sơ đồ chân pinout MPU-6050 Bảng 3.1: Tốc độ bước hàm tốc độ (số bước 2s) chiều cao Bảng 3.2: Tương quan tiêu thụ calo tốc độ chạy Bảng 4.1: Số mẫu người hoạt động Bảng 4.2: Kết thực nghiệm xi DANH MỤC CÁC HÌNH ẢNH, BIỂU ĐỒ Hình 1.1: Quảng cáo cho thiết bị Manpo-meter Nhật Hình 1.2: Sản phẩm Fitbit Tracker đưa thị trường vào năm 2009 Hình 1.3: Mẫu đồng hồ thơng minh Gear Fit hãng Samsung Hình 1.4: Một số mẫu thiết bị theo dõi sức khỏe Hình 2.1: Nguyên lý hoạt động kim loại dao động máy đếm bước chân Hình 2.2: Logo BLE Hình 2.3: Mơ hình truyền nhận liệu master slave Hình 2.4: Quá trình hoạt động BLE Hình 2.5: Ba kênh Advertising 37 kênh data BLE Hình 2.6: Quá trình Scanning BLE central Advertising BLE peripheral Hình 2.6: Cấu trúc liệu advertising data Hình 2.7: Cấu trúc decision tree Hình 2.8: Ví dụ decision tree ứng dụng cho tập liệu thời tiết Hình 2.9: Cách chia tập liệu phương pháp Random Subsampling Hình 2.10: Cách chia tập liệu theo phương pháp k-Fold Cross Validaiton Hình 2.11: Cách chia tập liệu theo phương pháp Leave one-out Cross Validation Hình 2.12: Sơ đồ chân nRF51822 Hình 2.13: Sơ đồ phân bố chân MPU-6050 (top view) xii Hình 2.14: Mạch charge TP4056 1A Hình 2.15: Pin lipo 3.7V 500mA Hình 2.16: Giao diện Weka version 3.8.1 Hình 2.17: Giao diện Explorer Weka Hình 2.19: Giao diện Knowledge Flow Hình 2.20: Ví dụ cấu trúc file ARFF Hình 3.1: Sơ đồ nguyên lý phần cứng vòng đeo tay Hình 3.2: Cảm biến gia tốc ba trục MPU-6050 Hình 3.3: Board NRF51822 Hình 3.4: OLED SSD 1306 1.2’ Hình 3.5: Giao diện phần mềm Android Studio Hình 3.6: Mạch charge pin Lithium TP4056 Hình 3.7: Pin Lipo 3.7V 500mA Hình 3.8: Cấu trúc phần cứng vịng đeo tay Hình 3.9: Sơ đồ nguyên lý khối nguồn vịng đeo tay Hình 3.10: Sơ đồ ngun lý khối xử lý truyền nhận tín hiệu nrf51822 vịng đeo tay Hình 3.11: Sơ đồ nguyên lý khối càm biến gia tốc Hình 3.12: Khối hiển thị OLED SSD1306 Hình 3.13: Ba thành phần người chuyển động Hình 3.14: Sự thay đổi gia tốc trục chu kì bước xiii Hình 3.15: Ngưỡng đặc tính độ xác đặc tính Hình 3.16: Sơ đồ giải thuật thuật tốn đếm bước chân Hình 3.17: Các bước thu thập liệu huấn luyện tạo decision tree Hình 3.18: Tập liệu thơ phân loại Hình 3.19: Mơ hình decision tree tạo Hình 4.1: Ngun mẫu vịng đeo tay Hình 4.2: Quá trình hoạt động đếm bước chân, quãng đường di chuyển vận tốc di chuyển đo hiển thị app xiv if(j%11 == 0){ x++; ssd1306_setXY(x,y); } ssd1306_data(smallNum[0][j]); } return; } while (num > 0){ num_buff[i] = num % 10; num = num /10; i ; } while (i < 9){ i++; ssd1306_setXY(x,y); for ( j = 0; j < 22; ++j){ if(j%11 == 0){ 117 x++; ssd1306_setXY(x,y); } ssd1306_data(smallNum[num_buff[i]][j]); } x-=2; y+=2; } } void UpdateUI(uint8_t step_status,uint16_t step_count) { static uint8_t i = 0; if (step_status == && i < 5) i++; else i = 0; ssd1306_setXY(0,0); ssd1306_drawBitmap(0, 0,5,24,WalkMan[i]); 118 ssd1306_smallNumber(0,5,step_count); } #include "pedometer.h" #include "nrf.h" #include "nrf_drv_timer.h" #include "bsp.h" #include "app_error.h" #include enum Axis{ X_AXIS = 0, Y_AXIS = 1, Z_AXIS = 2, }_model_axis; int _model_val; int32_t _curr_val; int _model_ratio; 119 int _last_val; const nrf_drv_timer_t TIMER_MPU = NRF_DRV_TIMER_INSTANCE(0); uint32_t time_ms = 100; //Time(in miliseconds) between consecutive compare events uint32_t time_ticks; uint32_t err_code = NRF_SUCCESS; uint8_t stat_Calc = 0; uint32_t pedometer_stepCalc(void); void pedometer_updateModelAxis(void); void pedometer_getValue(void); void pedometer_getValidValue(void); /** * @brief Handler for timer events */ void timer_mpu_event_handler(nrf_timer_event_t event_type, void* p_context) { switch (event_type) { case NRF_TIMER_EVENT_COMPARE0: 120 stat_Calc = 0; break; default: //Do nothing break; } } void pedometer_init() { /* Initial the MPU6050 Accelerometer Full Scale Range = 2g [-2g,+2g] Sample rate = 1kHz */ mpu6050_init(); stepCount = 0; 121 /*Update raw data from MPU6050 (read 60 times) => we'll have largest average value model_val (belongs to model_axis) and model ratio */ pedometer_updateModelAxis(); _curr_val = 0; nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG(0); err_code = nrf_drv_timer_init(&TIMER_MPU, &timer_cfg, timer_mpu_event_handler); APP_ERROR_CHECK(err_code); time_ticks = nrf_drv_timer_ms_to_ticks(&TIMER_MPU, time_ms); nrf_drv_timer_extended_compare( &TIMER_MPU, NRF_TIMER_CC_CHANNEL0, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true); } void pedometer_updateModelAxis(void) { int16_t x,y,z; 122 time_ticks, // sum[3] = {0;0;0} sum[0]=sum[X_Axis];sum[1]=sum[Y_Axis];sum[2]=sum[Z_Axis]; int32_t sum[MAX_AXIS] = {0}; float a,b,c; //Read 60 raw samples for(int i = 0; i < SAMPLING_MODEL_NUMBER; i++){ //SAMPLING_MODEL_NUMBER=60 sample 60 raw values mpu6050_readAccelerometer(&x, &y, &z); //read raw data from MPU-6050 sum[X_AXIS] += abs(x); //sum of 60 sample values of X_Axis sum[Y_AXIS] += abs(y); //sum of 60 sample values of Y_Axis sum[Z_AXIS] += abs(z); //sum of 60 sample values of Z_Axis } //Calculate the average value in each axis sum[X_AXIS] /= SAMPLING_MODEL_NUMBER; // Average of 60 // Average of 60 // Average of 60 sample values of X_Axis sum[Y_AXIS] /= SAMPLING_MODEL_NUMBER; sample values of Y_Axis sum[Z_AXIS] /= SAMPLING_MODEL_NUMBER; sample values of Z_Axis 123 //Find the axis that has the largest accleration value _model_axis = sum[X_AXIS] >= sum[Y_AXIS]?X_AXIS:Y_AXIS; _model_axis = sum[_model_axis] >= sum[Z_AXIS]?_model_axis:Z_AXIS; // the largest average acceleration value _model_val = sum[_model_axis]; // Ratio of the largest average value over //ratio = (model_val+10)/20 //perhaps [-10,+10] => range:20 _model_ratio = (_model_val+MODEL_STANDARD_VALUE/2)/MODEL_STANDARD_VALUE ; } void pedometer_getValue(void) { int16_t tmp_val[MAX_AXIS]; _curr_val = 0; for(int i = 0; i < MAX_WINDOW; i++){ mpu6050_readAccelerometer(&tmp_val[X_AXIS], &tmp_val[Z_AXIS]); 124 &tmp_val[Y_AXIS], _curr_val += abs(tmp_val[_model_axis]); } _curr_val /= MAX_WINDOW; _curr_val = (_curr_val + _model_ratio/2)/_model_ratio; } void pedometer_getValidValue(void) { uint32_t i = 0; do{ i++; if (i%100 == 0) { //printf("getValidValue:_curr_val = %d ,_model_val = %d ,_last_val = %d \n\r", _curr_val,_model_val,_last_val); } pedometer_getValue(); }while((abs(_curr_val-_model_val) = 23){ while(1){ pedometer_getValidValue(); if(_curr_val