Khung Tricopter làm bằng nh m ơn giản

Một phần của tài liệu Mô hình máy bay điều khiển từ xa TRICOPTER (Trang 53)

48

Hình 5. 2 : Khung Tricopter khi gắn ộng cơ

49

50

5.2 Lập trình cho board Arduino 5.2.1 Lƣu đồ lập trình hệ thống 5.2.1 Lƣu đồ lập trình hệ thống Đ S S S Kiểm tra cân bằng Chạy tốc độ khởi động Kiểm tra tín hiêu điều khiển Tín hiệu Khởi động ? Đ Đ A Begin

51

S

Đ

- Giải thích lƣu ồ: Khi bật nguồn lên cảm biến sẽ kiểm tra hay h ng. Nếu h ng thì sẽ quay lại kiểm tra. Khi cân bằng rồi hệ thống sẽ kiểm tra tín hiệu iều khiển. Nếu có tín hiệu iều khiển từ tay cầm thì máy bay sẽ ƣợc khởi ộng với tốc ộ ban ầu. Sau ó hệ thống sẽ kiểm tra xem có cân bằng PID h ng. Nếu h ng cân bằng sẽ dừng máy bay, nếu cân bằng thì xung PWM sẽ ra ộng cơ ể iều khiển ộng cơ chạy theo ý muốn của mình.

A Khởi động máy bay Cân bằng PID ? PWM ra động cơ Dừng máy bay

Hình 5.5: Lƣu ồ lập trình iều khiển bay

52

- Một số code chính cho lƣu ồ: + Code cho cảm biến cân bằng :

#define GYRO_SCALE (4 / 16.0 * PI / 180.0 / 1000000.0) //16.4 LSB = 1 deg/s -- 16.0 apparently gives beter results than 16.4 (empirical)

#endif

#if defined(MPU6050) || defined(MPU3050)

#define GYRO_SCALE (4 / 16.4 * PI / 180.0 / 1000000.0) //16.4 LSB = 1 deg/s + Code iều khiển hƣớng bay

#define PID_CONTROLLER 1 #define YAW_DIRECTION 1 #define YAW_DIRECTION -1

#define SERVO_RATES {30,30,100,100,100,100,100,100} #if defined (AIRPLANE) || defined(FLYING_WING)

#define FIXEDWING  Giải thích sơ ồ: PIN Khối điều khiển trung tâm

Cảm biến gia tốc và góc nghiêng

Động Khối điều khiển động cơ Khối điều khiển hƣớng bay Khối nhận tín hiệu

Rx nhận tín hiệu từ tay điều khiển

Tay điều khiển phát ra tín hiệu

53

- Tay iều khiển phát ra tín hiệu iều khiển

- Rx nhận tín hiệu từ tay iều khiển và giải mã tín hiệu.

- Khối iều khiển hƣớng bay: nhận tín hiệu 4 bít và giải mã, xuất tín hiệu

PWM ến khối trung tâm

- Cảm biến (MPU 6050): Cảm biến có chức năng o vận tốc góc và gia tốc góc.

- Khối iều khiển trung tâm: xử lý tín hiệu từ cảm biến và hối iều khiển hƣớng bay ể xuất tín hiệu iều khiển PWM ến khối iều khiển ộng cơ. - Khối iều khiển ộng cơ ( ESC ): iều khiển các ộng cơ quay theo yêu cầu từ khối iều khiển.

-Động cơ: quay cánh quạt tao lực nâng cho tricopter. - Pin: cấp nguồn cho tất cả các hối.

5.2.2 Phần mềm lập trình cho board Arduino

Hiện nay board arduino ƣơc lập trình, biên dịch, nạp trực tiếp lên board

bằng chƣơng trình arduino 1.6.8. Hầu hết các thƣ viện ều ƣợc cộng ồng arduino hỗ trợ nên việc lập trình rất dễ dàng.

54

5.3 Trang trí cho tricopter

Sau khi thi c ng hung và mạch iện xong, tiến hành trang trí tricopter, vật liệu trang trí bằng mica, xốp và decan.

Hình 5.9 : Tricopter sau hi trang trí.

55

C ƢƠNG 6 : K T LUẬN VÀ ƢỚNG P ÁT TR ỂN 6.1 Kết luận

6.1.1 Kết quả đạt đƣợc

Sau một khoảng thời gian nghiên cứu và thực hiện ề tài “Mơ hình máy bay

điều khiển từ xa Tricopter” em ã ạt ƣợc một số nội dung sau:

- Sử dụng thành c ng board Arduino Uno trong tricopter.

- Thiết kế và thi c ng thành c ng m hình cơ hí cho tricopter nhỏ gọn. - Giải quyết ƣợc bài toán cân bằng ộng cho m hình theo 3 trục x, y, z. - Tỷ lệ cất cánh thành c ng 80%.

- Thiết kế thành c ng bộ iều khiển cân bằng cho máy bay tricopter trong m hình thực tế.

6.1.2 Một số hạn chế

Bên cạnh các ết quả ạt ƣợc thì ề tài cịn nhiều hạn chế nhƣ sau:

- M hình cơ hí tự thiết kế nên vấn ề cân bằng của khung m hình chƣa tốt.

- Tuy giải quyết ƣợc vấn ề cân bằng cho phép m hình cất cánh và bay trên h ng nhƣng cân bằng chƣa thật sự tốt, mức ộ dao ộng vẫn cịn tuy nhiên là rất ít, ộ ổn ịnh chƣa cao lắm.

- Tỷ lệ cất cánh thành c ng chƣa tuyệt ối.

- Giải thuật iều khiển hƣớng bay chƣa thật sự tốt, hó có thể iều khiển nhiều hƣớng bay cùng một lúc.

6.2 ƣớng phát triển cho đề tài

Đối với m hình do nhóm thiết kế thì ề tài cần có cải tiến tốt hơn theo các hƣớng nhƣ sau:

- Cái tiến bộ iều khiển PID hay tìm các hệ số Kp, Ki, Kd ể cho kết quả tốt hơn hoặc thay thế bằng một bộ iều khiển hác tốt hơn (có thể sử dụng logic mờ hoặc một giải thuật hác).

56

- M hình bay có thể gắn thêm camera và truyền hình ảnh trực tiếp về máy tính, ngồi ra việc sử dụng thêm một số cảm biển tích hợp nhƣ nhiệt ộ, hói,…

- Với việc phát triển m hình bay theo các hƣớng nhƣ trên có thể giúp biến m hình bay thành các thiết bị giám sát từ xa, có thể ứng dụng trọng giám sát an ninh, giám sát giao th ng, iểm tra và phòng chống cháy rừng,…

57

TÀI LIỆU THAM KHẢO

Tiếng Việt

[1]. Nguyễn Đình Phú, “VI XỬ LÝ 1”, Đại học Sƣ Phạm K Thuật TP.HCM, 2006.

[2]. Nguyễn Đình Phú, “VI XỬ LÝ 2”, Đại học Sƣ Phạm K Thuật TP.HCM, 2007.

[3]. Trần Thu Hà, Trƣơng Thị Bích Ngà, Nguyễn Thị Lƣỡng, Bùi Thị Tuyết Đan, Phú Thị Ngọc Hiếu, Dƣơng Cẩm Tú, “ĐIỆN TỬ CƠ BẢN”, nhà xuất bản ại học quốc gia TP.HCM.

[4]. Lâm Ngọc Tâm, “THI T K VÀ CH TẠO MƠ HÌNH MÁY BAY- QUADROCOPTER”, Đại học Đà Nẵng, 2012.

58

Phụ lục

Chƣơng trình iều khiển

***************************Code cho cảm biến ********************

#ifndef SENSORS_H_ #define SENSORS_H_ void ACC_getADC (); void Gyro_getADC (); uint8_t Mag_getADC(); uint8_t Baro_update(); void Sonar_update(); void initSensors();

void i2c_rep_start(uint8_t address); void i2c_write(uint8_t data ); void i2c_stop(void);

void i2c_write(uint8_t data );

void i2c_writeReg(uint8_t add, uint8_t reg, uint8_t val); uint8_t i2c_readReg(uint8_t add, uint8_t reg);

uint8_t i2c_readAck(); uint8_t i2c_readNak();

void i2c_read_reg_to_buf(uint8_t add, uint8_t reg, uint8_t *buf, uint8_t size); #if defined(MMA7455) #define ACC_1G 64 #endif #if defined(MMA8451Q) #define ACC_1G 512 #endif #if defined(ADXL345) #define ACC_1G 265 #endif

#if defined(BMA180) || defined(BMA280) || defined(LIS3LV02) || defined(LSM303DLx_ACC) || defined(LSM330)

59 #endif #if defined(BMA020) #define ACC_1G 63 #endif #if defined(ADCACC) #define ACC_1G 75 #endif #if defined(MPU6050) #if defined(FREEIMUv04) #define ACC_1G 255 #else #define ACC_1G 512 #endif #endif #if !defined(ACC_1G) #define ACC_1G 256 #endif

#define ACCZ_25deg (int16_t)(ACC_1G * 0.90631) // 0.90631 = cos(25deg) (cos(theta) of accZ comparison)

#define ACC_VelScale (9.80665f / 10000.0f / ACC_1G)

// GYRO SCALE: we ignore the last 2 bits and convert it for rad/s #if defined(ITG3050)

#define GYRO_SCALE (4 / 16.0 * PI / 180.0 / 1000000.0) //16.4 LSB = 1 deg/s -- 16.0 apparently gives beter results than 16.4 (empirical)

#endif

#if defined(MPU6050) || defined(MPU3050)

#define GYRO_SCALE (4 / 16.4 * PI / 180.0 / 1000000.0) //16.4 LSB = 1 deg/s

#endif

#if defined(ITG3200)

#define GYRO_SCALE (4 / 14.375 * PI / 180.0 / 1000000.0) //ITG3200 14.375 LSB = 1 deg/s

#endif

#if defined(L3G4200D) || defined(LSM330)

#define GYRO_SCALE ((4.0f * PI * 70.0f)/(1000.0f * 180.0f * 1000000.0f)) // 70 milli deg/s /digit => 1 deg/s = 1000/70 LSB #endif

#if defined(WMP)

60

#endif

#endif /* SENSORS_H_ */

- Lập trình cho board arduino iều khiển hƣớng bay #ifndef CONFIG_H_ #define CONFIG_H_ #define TRI #define MINTHROTTLE 1070 // (*) (**) #define MAXTHROTTLE 1850 #define MINCOMMAND 1000 #define I2C_SPEED 100000L #define LOOP_TIME 2800

// #define GY_86 // Chinese 10 DOF with MPU6050 HMC5883L MS5611, LLC

//#define GY_88 // Chinese 10 DOF with MPU6050 HMC5883L BMP085, LLC

#define GY_521 // Chinese 6 DOF with MPU6050, LLC

#define PID_CONTROLLER 1

/* NEW: not used anymore for servo coptertypes <== NEEDS FIXING - MOVE TO WIKI */

#define YAW_DIRECTION 1

//#define YAW_DIRECTION -1 // if you want to reverse the yaw correction direction

#define ONLYARMWHENFLAT //prevent the copter from arming when the copter is tilted

#define ALLOW_ARM_DISARM_VIA_TX_YAW

//#define ALLOW_ARM_DISARM_VIA_TX_ROLL

61 #define CAM_TIME_HIGH 1000 #define FLAPPERON_EP { 1500, 1700 } #define FLAPPERON_INVERT { -1, 1 } #define YAW_COLL_PRECOMP 10 #define YAW_COLL_PRECOMP_DEADBAND 120

#define COLLECTIVE_PITCH THROTTLE

#define COLLECTIVE_RANGE { 80, 0, 80 } #define YAWMOTOR 0 #define SERVO_NICK { +10, -10, 0 } #define SERVO_LEFT { +10, +5, +10 } #define SERVO_RIGHT { +10, +5, -10 } #define CONTROL_RANGE { 100, 100 } }

#define SBUS_MID_OFFSET 988 //SBUS Mid-Point at 1500

#define SERIAL0_COM_SPEED 115200

#define SERIAL1_COM_SPEED 115200

#define SERIAL2_COM_SPEED 115200

#define SERIAL3_COM_SPEED 115200

#define NEUTRALIZE_DELAY 100000

#define FAILSAFE_DELAY 10 // Guard time for failsafe activation after signal lost. 1 step = 0.1sec - 1sec in example

#define FAILSAFE_OFF_DELAY 200 // Time for Landing before motors stop in 0.1sec. 1 step = 0.1sec - 20sec in example

#define FAILSAFE_THROTTLE (MINTHROTTLE + 200) // (*) Throttle level used for landing - may be relative to MINTHROTTLE - as in this case

62

#define GPS_BAUD 57600 // GPS_BAUD will override SERIALx_COM_SPEED for the selected port

#define GPS_LED_INDICATOR #define NAV_CONTROLS_HEADING 1 //(**) #define NAV_TAIL_FIRST 0 //(**) #define NAV_SET_TAKEOFF_HEADING 1 //(**) #define MAG_DECLINATION 4.02f //(**) #define GPS_LEAD_FILTER //(**) #define GPS_WP_RADIUS 100 //(**) #define SAFE_WP_DISTANCE 500 //(**)

//Maximu allowable navigation altitude (in meters) automatic altitude control will not go above this height

#define MAX_NAV_ALTITUDE 100 //(**)

// minimum speed when approach waypoint

#define NAV_SPEED_MIN 100 // cm/sec //(**)

// maximum speed to reach between waypoints

#define NAV_SPEED_MAX 400 // cm/sec //(**)

// Slow down to zero when reaching waypoint (same as NAV_SPEED_MIN = 0)

#define NAV_SLOW_NAV 0 //(**)

// Weight factor of the crosstrack error in navigation calculations (do not touch)

#define CROSSTRACK_GAIN .4 //(**)

// Maximum allowable banking than navigation outputs

#define NAV_BANK_MAX 3000 //(**)

#define RTH_ALTITUDE 15

63

#define NAV_TAKEOVER_BARO 1

#define IGNORE_THROTTLE 1

#define FENCE_DISTANCE 600

//This governs the descent speed during landing. 100 is equals approc 50cm/sec

#define LAND_SPEED 100

#define LCD_SERIAL_PORT 0

#define LCD_MENU_PREV 'p'

#define LCD_MENU_NEXT 'n'

#define LCD_VALUE_UP 'u'

#define LCD_VALUE_DOWN 'd' #define LCD_MENU_SAVE_EXIT 's' #define LCD_MENU_ABORT 'x' #define VBATSCALE 131 #define VBATNOMINAL 126 #define VBATLEVEL_WARN1 107 #define VBATLEVEL_WARN2 99 #define VBATLEVEL_CRIT 93 #define NO_VBAT 16 / #define VBAT_OFFSET 0 #define VBAT_CELLS_NUM 0

#define VBAT_CELLS_PINS {A0, A1, A2, A3, A4, A5 }

#define VBAT_CELLS_OFFSETS {0, 50, 83, 121, 149, 177 }

#define VBAT_CELLS_DIVS { 75, 122, 98, 18, 30, 37 }

#define PSENSORNULL 510 /* (*) hard only: set to analogRead() value for zero current; for I=0A my sensor

64

#define PINT2mA 132

#define BOARD_NAME "MultiWii V-.--"

// 123456789.123456

/************* Support multiple configuration profiles in EEPROM ************/

//#define MULTIPLE_CONFIGURATION_PROFILES

/************* do no reset constants when change of flashed program is detected ***********/ #define NO_FLASH_CHECK #define VBAT_PRESCALER 16 #define MIDRC 1500 #define SERVO_RFR_50HZ #define MEGA_HW_PWM_SERVOS

#define SERVO_RFR_RATE 50 // In Hz, you can set it from 20 to 400Hz, used only in HW PWM mode for mega and 32u4

#define ESC_CALIB_LOW MINCOMMAND

#define ESC_CALIB_HIGH 2000

//#define ESC_CALIB_CANNOT_FLY // uncomment to activate

#define LCD_TELEMETRY_FREQ 23 // to send telemetry data over serial 23 <=> 60ms <=> 16Hz (only sending interlaced, so 8Hz update rate)

#define LCD_TELEMETRY_AUTO_FREQ 967// to step to next telemetry page 967 <=> 3s

#define PSENSOR_SMOOTH 16 // len of averaging vector for

smoothing the PSENSOR readings; should be power of 2; set to 1 to disable

#define VBAT_SMOOTH 16 // len of averaging vector for smoothing the VBAT readings; should be power of 2; set to 1 to disable

65

#define RSSI_SMOOTH 16 // len of averaging vector for smoothing the RSSI readings; should be power of 2; set to 1 to disable

#define DISABLE_POWER_PIN #endif /* CONFIG_H_ */ *******************Chƣơng trình cho RX************************** #ifndef RX_H_ #define RX_H_ void configureReceiver(); void computeRC();

uint16_t readRawRC(uint8_t chan);

void readSerial_RX(void);

#if defined(OPENLRSv2MULTI)

void initOpenLRS(void);

void Read_OpenLRS_RC(void);

#endif

#if defined(SPEK_BIND) // Bind Support

void spekBind(void);

#endif

#endif /* RX_H_ */

************Chƣơng trình cho alarm****************************

#ifndef ALARMS_H_

#define ALARMS_H_

void blinkLED(uint8_t num, uint8_t ontime,uint8_t repeat);

uint8_t isBuzzerON(void);

void alarmHandler(void);

66 void i2CLedRingState(void); void blinkLedRing(void); void auto_switch_led_flasher(); void init_led_flasher(); void led_flasher_set_sequence(uint8_t s); void led_flasher_autoselect_sequence(); void init_landing_lights(void); void auto_switch_landing_lights(void);

void PilotLamp(uint8_t count);

/* AlarmArray 0: toggle 1: failsafe 2: noGPS 3: beeperOn 4: pMeter 5: runtime 6: vBat 7: confirmation 8: Acc 9: I2C Error */ enum alrm_fac { ALRM_FAC_TOGGLE = 0, ALRM_FAC_FAILSAFE,

67 ALRM_FAC_GPS, ALRM_FAC_BEEPERON, ALRM_FAC_PMETER, ALRM_FAC_RUNTIME, ALRM_FAC_VBAT, ALRM_FAC_CONFIRM, ALRM_FAC_ACC, ALRM_FAC_I2CERROR,

ALRM_FAC_SIZE, // MUST be LAST - used for size of array alarmArray

}; /* Resources: 0: onboard LED 1: Buzzer 2: PL GREEN 3: PL BLUE 4: PL RED */ enum alrm_res { ALRM_RES_LED = 0, ALRM_RES_BUZZER, ALRM_RES_PL_GREEN, ALRM_RES_PL_BLUE, ALRM_RES_PL_RED, ALRM_RES_PL ,

68 ALRM_RES_ANY , }; enum alrm_lvl_onoff { ALRM_LVL_OFF = 0, ALRM_LVL_ON = 1, }; enum alrm_lvl_failsafe { ALRM_LVL_FAILSAFE_FINDME = 1, ALRM_LVL_FAILSAFE_PANIC, }; enum alrm_lvl_toggle { ALRM_LVL_TOGGLE_1 = 1, ALRM_LVL_TOGGLE_2 , ALRM_LVL_TOGGLE_ELSE , }; #if GPS enum alrm_lvl_gps { ALRM_LVL_GPS_NOFIX = 2, }; #endif #ifdef VBAT enum alrm_lvl_vbat { ALRM_LVL_VBAT_INFO = 1, ALRM_LVL_VBAT_WARN , ALRM_LVL_VBAT_CRIT ,

69 }; #endif enum alrm_lvl_confirm { ALRM_LVL_CONFIRM_1 = 1, ALRM_LVL_CONFIRM_2 , ALRM_LVL_CONFIRM_ELSE , };

#define SET_ALARM(fac, level) alarmArray[fac] = level

#ifdef BUZZER

#define SET_ALARM_BUZZER(fac, level) SET_ALARM( fac, level)

#else

#define SET_ALARM_BUZZER(fac, level)

#endif

#define IS_ALARM_SET(fac, level) ( alarmArray[fac] == level )

#endif /* ALARMS_H_ */

Xác nhận của GVHD SV thực hiện ĐATN

Một phần của tài liệu Mô hình máy bay điều khiển từ xa TRICOPTER (Trang 53)

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

(75 trang)