Chương trình điều khiển:

Một phần của tài liệu (LUẬN văn THẠC sĩ) thiết kế hệ thống điều khiển mô phỏng chuyển động cánh tay (Trang 44 - 74)

Các thiết bị dựa trên nền tảng Arduino được lập trình bằng ngôn riêng. Ngôn ngữ này dựa trên ngôn ngữ Wiring. Và Wiring lại là một biến thể của C/C++. Một số người gọi nó là Wiring, một số khác thì gọi là C hay C/C++. Nhưng thực tế, nhà sản xuất định danh ngôn ngữ này là ngôn ngữ Arduino. Ngôn ngữ Arduino bắt nguồn từ C/C++ phổ biến hiện nay do đó rất dễ học, dễ hiểu. Nếu học tốt chương trình Tin học 11 thì việc lập trình Arduino là hoàn toàn khả thi.

Trong luận văn này, chúng ta sẽ đi vào chi tiết 3 vấn đề. Vấn đề thứ nhất là thiết lập giao tiếp I2C giữa cảm biến và vi điều khiển cũng như xác định giá trị tương đương của cảm biến biến trở, vấn đề thứ 2 là xử lý dữ liệu từ cảm biến MPU6050, vấn đề thứ 3 là xây dựng ma trận cử động tương ứng giữa cử động đầu vào và giá trị đầu ra. Sau đây, chúng ta sẽ đi vào chi tiết lần lượt từng vấn đề.

t l p giao ti p I2C v nh giá tr u vào c a bi

Thiế ậ ế ới MPU6050 và xác đị ị đầ ủ ến

trở.

I

Để thiết lập được giao tiếp I2C ( nterface Intergrated Circuit) giữa MPU6050 và Arduino, ta thực hiện kết nối giữa chân SCL của MPU6050 với chân SCL (chân

A5) của vi điều khiển Arduino và chân SDA của MPU6050 và chân SDA (chân A4) của vi điều khiển Arduino, đồng thời cấp nguồn cho MPU6050 ở ngưỡng 5V / 3.3V. Lúc này đã thực hiện xong việc thiết lập phần cứng cho giao thức I2C giữa

Hình 3-9. Kết nối giữa Arduino và MPU6050 theo giao thức I2C.

Lúc này MPU6050 sẽ đóng vai trò như một mạch cấp dưới ( Slave ) của Arduino và các giá trị của MPU6050 sẽ được gọi ra theo các hàm truyền đạt và sử sẵn có trong thư viện Mpu6050.h được viết sẵn. Khi sử dụng thư viện MPU6050.h. Các giá trị của gia tốc các trục x, y, z cũng như giá trị gyro của các trục này được thư viện MPU6050.h khởi tạo sẵn và thực hiện xử lý ngay trong khối xử lý chuyển động của MPU6050.

Dưới đây là các giá trị được tạo sẵn mà ta có thể sử dụng khi khai thác thư viện MPU6050.h

uint8_t dmpSendQuaternion(uint_fast16_t accuracy);

uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy); uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);

uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy); uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);

uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy); uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy); uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);

uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy); uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);

uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy); uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);

hàm xác định chuyển động xoay.

void getRotation(int16_t* x, int16_t* y, int16_t* z); int16_t getRotationX();

int16_t getRotationY(); int16_t getRotationZ();

hàm xác định gia tốc

void getMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz);

void getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);

void getAcceleration(int16_t* x, int16_t* y, int16_t* z); int16_t getAccelerationX();

int16_t getAccelerationZ();

Dựa vao các kết quả trên ở phần thân chương trình, code được rút ngắn như

sau: #include "Wire.h" #include "I2Cdev.h" #include "MPU6050.h" #include "Servo.h" MPU6050 mpu; int16_t ax, ay, az; int16_t gx, gy, gz; Servo truc_xoay,truc_gap; int xoay,gap; void setup() { Wire.begin(); Serial.begin(9200); Serial.println("Initialize MPU"); mpu.initialize();

truc_xoay.attach(9); truc_gap.attach(8); }

void loop() {

mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); gap = map (ax, -16500,16500,0, 179);

xoay = map(ay, -16500, 16500, 0, 179); truc_xoay.write(xoay);

truc_gap.write(gap); delay(50);

}

Với các giá trị có thể lấy được từ hàm getMotion6, các chuyển động được lấy tỉ lệ theo phép toán ánh xạ map với biên giới hạn là giá trị off set của MPU6050 - là .

Thiết lập giao ti p kế ết n i v i bố ớ ộ ả c m bi n bi n trở. ế ế

Thực hiện kết nối biến trở là bước đầu tiên trong quá trình đo và xác định giá trị chuyển động của ngón tay.Kết nối này được minh họa bằng hình 3 10, qua đó -

ta thấy được các kết nối của một cảm biến với Arduino. Đầu vào của biến trở có thể là một trong số các cổng vào bất ky từ A0 đến A5 của kit Arduino. Khi đó, giá trị phân áp trên biến trở sẽ cung cấp trị đầu vào cho phép đều chế độ rộng xung PWM.

Hình 3-10. Minh họa cho kết nối giữa biến trở và Arduino.

#include <Servo.h>

Servo ngon_tro,ngon_giua,ngon_aput,ngon_ut,ngon_cai; // create servo object to control a servo

int ts_tro = 0;// analog pin used to connect the potentiometer int ts_giua = 1;

int ts_aput= 2; int ts_ut= 3; int ts_cai=4;

int tro;// variable to read the value from the analog pin int giua;

int aput; int ut; int cai;

void setup() {

ngon_tro.attach(9); // attaches the servo on pin 9 to the servo object ngon_giua.attach(10); ngon_aput.attach(11 ); ngon_ut.attach(6); ngon_cai.attach(5); } void loop() {

tro = analogRead(ts_tro); // reads the value of the potentiometer (value between 0 and 255)

tro = map(tro, 0, 127, 0, 180); // scale it to use it with the servo (value between 0 and 180)

ngon_tro.write(tro); // sets the servo position according to the scaled value

giua = analogRead(ts_giua); // reads the value of the potentiometer (value between 0 and 255)

giua = map(giua, 0, 127, 0, 180); // scale it to use it with the servo (value between 0 and 180)

ngon_giua.write(giua); // sets the servo position according to the scaled value

aput = analogRead(ts_aput); // reads the value of the potentiometer (value between 0 and 255)

aput = map(aput, 0, 127, 0, 180); // scale it to use it with the servo (value between 0 and 180)

ngon_aput.write(aput); // sets the servo position according to the scaled value

ut = analogRead(ts_ut); // reads the value of the potentiometer (value between 0 and 255)

ut = map(ut, 0, 127, 0, 180); // scale it to use it with the servo (value between 0 and 180)

ngon_ut.write(ut); // sets the servo position according to the scaled value

cai = analogRead(ts_cai); // reads the value of the potentiometer (value between 0 and 255)

cai = map(cai, 0, 127, 0, 180); // scale it to use it with the servo (value between 0 and 180)

ngon_cai.write(cai); // sets the servo position according to the scaled value

delay(15); // waits for the servo to get there }

Trong chương trình này, giá trị của đầu vào là dạng 8 bit được xử lý trong phép ánh xạ quy đổi (val,0,127,0,180). Các giá trị từ 0 đến 127 cung cấp dải quy đổi tương đương gồm 128 giá trị với độ phận giải của về góc tương ứng của hệ thống là

1.40. 128 giá trị tương đương này tương đương với 28trạng thái trong hệ nhị phân,

qua đó chuyển đổi giá trị tương đương của biến trở thành giá trị góc gần đúng. Với hàm analogRead() và hàm servo.write(); giá trị được đọc trực tiếp từ chân kết nối với biến trở thông qua hàm analogRead( đầu vào), với đầu vào tương ứng với các chân A0 đến A5. Sau đó, hệ thống sẽ thực hiện việc quy đổi giá trị tương đương giá trị điều chế D với giá trị mà hệ thống đọc được từ đầu vào. Một xung vuông sẽ được hình thành dựa vào giá trị điều chế D theo biểu thức nêu ở mục 2.3.2, sau đó đượcc chuyển đến hàm servo.write() để thực thi điều chế PWM với cơ chế servo.

Đó là toàn bộ những điểm cần chú ý trong chương trình xử lý dữ liệu từ cảm biến của khối vi điều khiển. Bên cạnh những điểm đã được khắc phục và xử lý; hệ

chỉnh lý và hoàn thiện nhằm phục vụ các ứng dụng thực tiễn hơn, không chỉ bó gọn trong chức năng mô phỏng điều khiển.

Chương 4: Kết quả và Bàn luận.

Hệ thống mô phỏng chuyển động mô phỏng lại được các chuyển động lớn của cánh tay và chuyển động nhỏ của ngón tay. Độ chính xác của hệ thống điều khiển mô phỏng chuyển động chưa được tiến hành kiểm chứng trong khuôn khổ nghiên cứu. Với hệ thống điều khiển có kiểm soát bằng điều chế biên độ rộng xung, hệ thống hoàn toàn kiểm soát được độ chính xác của tín hiệu đầu ra khi sử dụng điều khiển cơ cấu chấp hành servo. Các nhân tố ảnh hưởng đến độ chính xác, và tốc độ đáp ứng của cơ cấu chấp hành là các nhân tố cơ khí như các khớp mô phỏng, độ chính xác khi thiết kế và chế tạo cơ cấu chấp hành.

Hình 4-1. Các cử động mô phỏng qua cơ cấu chấp hành của ngón tay giữa.

Với kết quả cử động của ngón tay được thể hiện ở hình trên, việc phát triển hệ thống cánh tay mô phỏng chuyển động của con người là bước tiếp theo của luận văn này. Bằng việc kết hợp các nghiên cứu về cơ cấu chấp hành cũng như về vật liệu, nghiên cứu tiếp tục mở rộng của hệ thống điều khiển sẽ gồm việc nâng cấp nhận dạng tín hiệu sinh học của con người – nhận diện sinh trắc học Bằng việc -.

tích hợp sử dụng nguyên lý “chứa trong”, hệ thống điều khiển sẽ được chuyển đổi thành một cánh tay robot cơ khí thực sự với khả năng chuyển động đầy đủ các bậc tự do (22 bậc tự do).

Trong các vấn đề còn tồn tại của hệ thống, việc giảm tuổi thọ trong quá trình sử dụng của biến trở thanh trượt là vấn đề khá nan giải. Với biến trở thanh trượt, cách tiếp cận này bộc lộ rất nhiều ưu điểm. Trong đó phải kể đến sự đơn giản hóa đến mức tối đa các chuyển đổi tín hiệu chuyển động sang tín hiệu điện. So với những cảm biến chuyển động khác sử dụng nguyên lý vi cơ điện tử hay sử dụng vật liệu áp điện. Do đó, xác định phương án thay thế tương đương cho biến trở thanh trượt hoặc đề xuất cách nâng cấp và phát triển biến trở thanh trượt có tuổi thọ cao là điều rất quan trọng đối với nghiên cứu này.

Một vấn đề nảy sinh trong quá trình nghiên cứu hệ thống điều khiển mô phỏng chuyển động cánh tay người là đặc điểm sinh học của bàn tay người. Mỗi người đều sở hữu các nét đặc biệt trên bàn tay như chiều dài, đường kính ngón tay, cũng như giới hạn chuyển động của ngón tay mỗi người là khác nhau. Điều này dẫn đến 1 vấn đề khá nghiêm trọng là việc áp dụng hệ thống này trên diện rộng là rất khó nếu không phát triển hệ thống theo hướng sử dụng các hệ thống có luật học kiểm soát sử dụng trí tuệ nhân tạo. Bởi các chương trình được viết sẵn không thể nhận biết sai khác ngay từ đối tượng đầu vào. Nếu đối tượng đầu vào thay đổi, việc thay đổi tín hiện đo ở khối cảm biến là hệ quả tất nhiên. Nó sẽ khiến hệ thống nhận định sai về giá trị cần mô phỏng nếu ta xử lý trên miền biến dạng dọc. Do đó, giải đáp cho vấn đề này là việc sử dụng cảm biến biến dạng dạng thanh. Khi đó toàn bộ các biến dạng dọc sẽ được chuyển thành các biến dạng gập, lúc này vấn đề chiều dài không đồng bộ của ngón tay sẽ được triệt tiêu và thay vào đó là việc xử lý độ biến thiên của giá trị dựa vào độ biến thiên góc trên ngón tay.

Thêm một vấn đề khác nữa là việc nâng cấp hệ thống chấp hành cho hệ thống mô phỏng chuyển động cánh tay. Do đặc điểm cấu tạo của do có độ đàn hồi biến dạng nên cánh tay con người là cơ cấu rất khó thực hiện mô phỏng tái tạo với vật liệu thông thường. Việc sử dụng các vật liệu thông thường như giấy, nhựa, cao su đều gặp phải trở ngại. Nếu giấy tetra pad cho phép xây dựng hệ thống chấp hành nhẹ, có độ chịu lực cao thì vấn đề xảy ra là độ đàn hồi biến dạng rất thấp. Dẫn đến tính mô phỏng hầu như hạn chế rất nhiều khi tay thực hiện các động tác có sự biến

dạng bề mặt lớn như nắm tay hoặc xoay cổ tay. Nếu sử dụng nhựa PVC thì hệ thống có ưu điểm chịu lực cao xong độ đàn hồi biến dạng là không có, việc này đưa đến một vấn đề lớn trong thiết kế cánh tay chấp hành. Người thiết kế phải xử lý các khớp nối vô cùng phức tạp để đạt được hiệu quả tương tự như các khớp ở tay người nhưng độ mềm dẻo của cử động rất thấp. Quá đó ta có thể thấy, cách tiếp cận xây dựng cơ cấp chấp hành cho hệ thống mô phỏng chuyển động là rất khó và đòi hỏi nghiên cứu chuyên sâu và bài bản hơn. Với việc phát triểnxây dựng cánh tay chấp hành dựa trên cấu trúc giải phẫu sinh lý của cánh tay người đưa ra một ý tưởng rất khả thi cho phương án nâng cấp của hệ thống. Với đầu vào tín hiệu là tín hiệu điện não đồ EEG cùng với các hệ thống cảm biến áp lực và hệ thống tạo phản hồi cho hệ thần kinh, hệ thống hoàn toàn có thể nâng cấp trở thành thiết bị thay thế cho chi cho người khuyết tật.

Qua nghiên cứu này, chúng ta cũng thấy rõ được sự hạn chế của cảm biến đề xuất, do thiết kế cơ cấu đo chuyển động nhỏ đề nghị cho ngón tay không được nghiên cứu kế thừa mà được sử dụng dựa vào tính sẵn có và độ đơn giản khi tiếp cận nên rất nhiều chỉ số của cơ cấu đo bị bỏ qua do không có khả năng đáp ứng như độ phân giải, độ tin cậy, .v.v…. Điều này dẫn đến một sự đòi hỏi một nghiên cứu bài bản và lâu dài để có thể hoàn thiện thiết kế này, và nâng cấp chúng lên các thiết bị có thể gắn trên cơ thể nhằm tăng tính tiện dụng. Ngoài ra, việc mở rộng các giao thức kết nối khác như SPI hoặc các chuẩn kết nối công nghiệp và an toàn công nghiệp để đưa hệ thống điều khiển phục vụ sản xuất công nghiệp, trong bốc dỡ hàng hóa tại các điểm trung chuyển hàng hóa là hướng đi hoàn toàn hứa hẹn. Trên đây là các điểm còn tồn tại và cần nghiên cứu thêm của hệ thống điều khiển. Tuy còn hạn chế, xong hệ thống điều khiển mô phỏng chuyển động cánh tay đã cung cấp một cách tiếp cận đơn giản, dễ thực hiện. Nó có ý nghĩa ứng dụng cao trong việc xây dựng mô hình học tập trong các trường có giảng dạy về cơ sinh, cơ sinh ứng dụng, cũng như điều khiển học.

Tài Liệu tham khảo

[1]Arduino Reference, [Online]. Availabe:

http://www.ele.uri.edu/Courses/ele205/ELE205Lab/ELE205_Lab_files/Arduino %20-%20Reference.pdf

[2]Arduino MPU6050 [Oniline] Availabe:

http://playground.arduino.cc/Main/MPU-6050

[3]Nhóm tác giả Dieutri.vn, Giải phẫu chi trên [Online] Availabe:http://www.dieutri.vn/giaiphaunguoi/31-3-2015/S6816/Giai-phau- -co chi-tren.htm

[4]Philipp Lang, Daniel Steines, Hacene Bouadi, David Miller, Barry J. Linder, Cecily Anne Snyder (2003), Minimally invasive Joint implant with 3 dimensional geometry matching the articular surfaces [Online] Availabe: http://www.google.com/patents/WO2004032806A1?cl=en#backward-citations

Phụ Lục

Thư viện hàm “MPU6050.h”

#ifndef _MPU6050_H_ #define _MPU6050_H_ #include "I2Cdev.h"

// supporting link: http://forum.arduino.cc/index.php?&topic=143444.msg1079517#msg1079517 // also: http://forum.arduino.cc/index.php?&topic=141571.msg1062899#msg1062899s

#ifndef __arm__

#include <avr/pgmspace.h> #else

#define PROGMEM /* empty */ #define pgm_read_byte(x) (*(x)) #define pgm_read_word(x) (*(x)) #define pgm_read_float(x) (*(x)) #define PSTR(STR) STR #endif

#define MPU6050_ADDRESS_AD0_LOW 0x68 // address pin low (GND), default for InvenSense evaluation board

#define MPU6050_ADDRESS_AD0_HIGH 0x69 // address pin high (VCC) #define MPU6050_DEFAULT_ADDRESS MPU6050_ADDRESS_AD0_LOW

#define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD

#define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD

#define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD

#define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN #define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN #define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN #define MPU6050_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS #define MPU6050_RA_XA_OFFS_L_TC 0x07

#define MPU6050_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS #define MPU6050_RA_YA_OFFS_L_TC 0x09

#define MPU6050_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS #define MPU6050_RA_ZA_OFFS_L_TC 0x0B

#define MPU6050_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR #define MPU6050_RA_XG_OFFS_USRL 0x14

#define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR #define MPU6050_RA_YG_OFFS_USRL 0x16

#define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR #define MPU6050_RA_ZG_OFFS_USRL 0x18

#define MPU6050_RA_SMPLRT_DIV 0x19 #define MPU6050_RA_CONFIG 0x1A #define MPU6050_RA_GYRO_CONFIG 0x1B #define MPU6050_RA_ACCEL_CONFIG 0x1C

#define MPU6050_RA_MOT_DUR 0x20 #define MPU6050_RA_ZRMOT_THR 0x21 #define MPU6050_RA_ZRMOT_DUR 0x22 #define MPU6050_RA_FIFO_EN 0x23 #define MPU6050_RA_I2C_MST_CTRL 0x24 #define MPU6050_RA_I2C_SLV0_ADDR 0x25 #define MPU6050_RA_I2C_SLV0_REG 0x26 #define MPU6050_RA_I2C_SLV0_CTRL 0x27 #define MPU6050_RA_I2C_SLV1_ADDR 0x28 #define MPU6050_RA_I2C_SLV1_REG 0x29 #define MPU6050_RA_I2C_SLV1_CTRL 0x2A #define MPU6050_RA_I2C_SLV2_ADDR 0x2B #define MPU6050_RA_I2C_SLV2_REG 0x2C #define MPU6050_RA_I2C_SLV2_CTRL 0x2D #define MPU6050_RA_I2C_SLV3_ADDR 0x2E #define MPU6050_RA_I2C_SLV3_REG 0x2F #define MPU6050_RA_I2C_SLV3_CTRL 0x30 #define MPU6050_RA_I2C_SLV4_ADDR 0x31 #define MPU6050_RA_I2C_SLV4_REG 0x32 #define MPU6050_RA_I2C_SLV4_DO 0x33 #define MPU6050_RA_I2C_SLV4_CTRL 0x34 #define MPU6050_RA_I2C_SLV4_DI 0x35 #define MPU6050_RA_I2C_MST_STATUS 0x36 #define MPU6050_RA_INT_PIN_CFG 0x37 #define MPU6050_RA_INT_ENABLE 0x38 #define MPU6050_RA_DMP_INT_STATUS 0x39 #define MPU6050_RA_INT_STATUS 0x3A #define MPU6050_RA_ACCEL_XOUT_H 0x3B #define MPU6050_RA_ACCEL_XOUT_L 0x3C #define MPU6050_RA_ACCEL_YOUT_H 0x3D #define MPU6050_RA_ACCEL_YOUT_L 0x3E #define MPU6050_RA_ACCEL_ZOUT_H 0x3F #define MPU6050_RA_ACCEL_ZOUT_L 0x40 #define MPU6050_RA_TEMP_OUT_H 0x41 #define MPU6050_RA_TEMP_OUT_L 0x42 #define MPU6050_RA_GYRO_XOUT_H 0x43

Một phần của tài liệu (LUẬN văn THẠC sĩ) thiết kế hệ thống điều khiển mô phỏng chuyển động cánh tay (Trang 44 - 74)

Tải bản đầy đủ (PDF)

(74 trang)