"

晨光彩票app-APP全能版下载拥有全球最顶尖的原生APP,每天为您提供千场精彩体育赛事,晨光彩票app-APP全能版下载更有真人、彩票、电子老虎机、真人电子竞技游戏等多种娱乐方式选择,晨光彩票app-APP全能版下载让您尽享娱乐、赛事投注等,且无后顾之忧!

"
首頁 > 微型四軸飛行器

微型四軸飛行器

互聯網 2021-04-10 17:34:10

課程設計報告

第一章

1.1飛行器的背景和意義

每個人的童年都有個飛行夢,因為每個人都會渴望一片又高又遠的自由天地。進入21世紀,社會科技化以及信息化的程度越來越高,單片機的應用也越來越廣泛,成為人們生活必備的一部分。

單片機作為主體可以做成擁有各種用途的小機器。我們制作的這臺小巧的四軸飛行器,正是要小小地滿足每個人心中那份對自由翱翔的想望。

1.2飛行器的原理和功能

ATmega328p作為大腦,處理由飛控模塊收集的信息,發出指令控制四個高速空心杯在飛行中調整,保持機身的平穩,而藍牙模塊作為信號的接收器,則接受操控者的指令,交由“大腦”去執行。

我們制作的這臺飛行器工藝并不復雜,體型小巧,便于攜帶,操作方便,可使用手機軟件直接操控。同時外置電池,可隨時更換。并且充電時間短,僅需20分鐘。

第二章

2.1大腦——ATmega328p

高性能、低功耗的 8 位AVR 微處理器先進的RISC 結構131 條指令 – 大多數指令執行時間為單個時鐘周期 32 個8 位通用工作寄存器全靜態工作工作于20 MHz 時性能高達20 MIPS 只需兩個時鐘周期的硬件乘法器

2.2五官——飛控模塊MPU-6050

MPU-6000(6050)為全球首例整合性6軸運動處理組件,相較于多組件方案,免除了組合陀螺儀與加速器時之軸間差的問題,減少了大量的包裝空間。

MPU-6000(6050)整合了3軸陀螺儀、3軸加速器,并含可藉由第二個I2C端口連接其他廠牌之加速器、磁力傳感器、或其他傳感器的數位運動處理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以單一數據流的形式,向應用端輸出完整的9軸融合演算技術InvenSense的運動處理資料庫,可處理運動感測的復雜數據,降低了運動處理運算對操作系統的負荷,并為應用開發提供架構化的API。

2.3.知覺——藍牙模塊

用以實現使用安卓手機控制飛行器

2.4內能——電機系統

高速空心杯,螺旋槳

空心杯電動機主要有:

1、節能特性:能量轉換效率很高,其最大效率一般在70%以上,部分產品可達到90%以上(鐵芯電動機一般在70%)。

2、控制特性:起動、制動迅速,響應極快,機械時間常數小于28毫秒,部分產品可以達到10毫秒以內(鐵芯電動機一般在100毫秒以上);在推薦運行區域內的高速運轉狀態下,可以方便地對轉速進行靈敏的調節。

3、拖動特性:運行穩定性十分可靠,轉速的波動很小,作為微型電動機其轉速波動能夠容易的控制在2%以內。另外,空心杯電動機的能量密度大幅度提高,與同等功率的鐵芯電動機相比,其減輕1/3-1/2。

第三章

一.拷貝與DIY

我們要先打開MWC源代碼。首先啟動Arduino.exe程序,看到如下窗口:

點擊菜單中的“File”-“Open”

選擇準備好的MWC主程序工程文件:

這里MWC的程序版本為MultiWii_2.2,選擇打開MultiWii_x4_mpu6050_last.ino文件,打開后即可看到該工程文件包含多個源代碼文本,會在新窗口中顯示。

到這里就可以上傳程序到飛控進行試飛了,上傳之前還有兩件事情需要準備好,一個是FTDI端口和飛控類型的選擇,另外一個是電腦、FTDI和飛控之間連接要準備好。此飛行器是328P單片機,所以需要在Arduino的菜單“Tools”-“Board”中選擇對應的選項arduino Pro or Pro Mini

在“processor”中選擇ATmega328 (5V,16Mhz):

FTDI工具在本機分配到的端口為COM7(每臺電腦可能會不同),所以在“Tools”-“Serial Port”中需要選擇“COM7”,如果沒找到這個COM口,需要檢查與電腦的連接是否正常,還有驅動是否已經安裝好,可以到“設備管理器”里面檢查。

這兩個地方設置完以后,需要確認飛控與FTDI工具是否連接好(見上圖),飛控在使用FTDI的時候無需單獨供電,只需與FTDI直接對接即可,接上后飛控就會開始啟動,LED會亮并且閃動。這樣上傳程序前的硬件連接工作就已經完成了。

此時應該保存原版程序,出問題好用源程序,方便日后直接調用。

上圖中點此為保存按鈕(save)

上圖為上傳好修改的程序(upload)

然后會看到Arduino底部出現相應的狀態信息

順利上傳后,會顯示Done uploading,沒有紅色提示為正確上傳,否則存在問題需重新上傳或者修改代碼,也可能是前面幾步不正確需重新確認是否正確接線,是否選擇好COM口,是否安裝了驅動,FTDI與飛控是否正確連接,都是問題。

現在飛控已經可以正常工作,可以斷開FTDI與飛控之間的連接。

二.后期試飛——微型四軸安卓手機控制

圖中4個紅色箭頭指的是四個電機的開關指示燈,亮為電機已就緒,滅為未就緒或電量不足。

藍色箭頭指的是狀態指示燈,在不同階段指示燈表示的含義不一樣,后面詳述。

微型四軸反面還有1個藍牙連接指示燈,閃為未連接,常亮為藍牙已連接。

安卓手機控制步驟:

??手機裝上新版藍牙控制端的apk程序,安裝方法:將apk文件拷貝到手機里,然后在手機上點擊apk文件進行安裝。

??微型四軸插上已充滿電的電池,紅色線插正極(圖中上側為正極)。此時不要打開電機開關,將微型四軸平放于地面,程序需要時間自動校準。檢查:四軸底面藍色燈閃爍,正面指示燈閃爍后熄滅,此時如果拿起四軸任意傾斜時,正面指示燈會閃爍。

??手機端打開“設置”->“藍牙”,查找名稱為“x4”的設備,并使用“0000”密碼進行配對(只需進行一次設置)

??手機打開MultiWii EZ程序,后面將使用這個程序于微型四軸進行通信、調試、飛行控制。

?

?

?

??點擊“Settings”->“選擇MultiWii藍牙”,選擇藍牙設備“x4”?!斑b控器模式”選擇“左手油門”或“右手油門”,建議選擇“右手油門”我測試左手油門時,解鎖不方便,希望是個例。

??點擊“連接飛控”,與微型四軸進行藍牙連接檢查:手機藍牙打開,底面的藍牙連接指示燈常亮

??點擊“PID”查看和設置各項參數,群主建議新手“遙控舵量”設置成0.4,數值越低,推油門感覺越慢。其它暫時無需改動。

??點擊“高級設置”,此時你的微型四軸已經就緒,點擊“用手機控制飛機”就可以進入到控制界面。

??如果前面沒有任何報警,此時可以打開微型四軸的電機供電電源開關(在電池那里)

?

檢查:4個電機指示燈常亮,正面上面兩個指示燈常亮,狀態指示燈滅(重要!表示控制端已鎖定,不會誤操作),底面藍牙指示燈常亮

??手機端解鎖飛控:油門拉到最低,放手時,油門指示桿會自動降到最低,表示油門解鎖成功。

方向拉到最右,微型四軸正面的狀態指示燈由滅變常亮,表示四軸準備起飛。

如果你是左手油門,方向解鎖可能會遇到點困難,多次嘗試,或者換右手油門。檢查:狀態指示燈常亮,藍牙指示燈常亮,電機指示燈常亮,手機電量充足

如果有任何報警提示,不管是聲音還是文字,一定要仔細檢查,確認沒有問題時再繼續。

一般的報警就是油門沒有回零報警,這會造成微型四軸起飛即為最大馬力。

第四章

一.Multiwill源碼

/*

MultiWiiCopter by Alexandre Dubus

www.multiwii.com

March 2013 ? ? V2.2

This program is freesoftware: you can redistribute it and/or modify

it under the terms of theGNU General Public License as published by

the Free SoftwareFoundation, either version 3 of the License, or

any later version. see

*/

#include

#include "config.h"

#include "def.h"

#include

#define ?VERSION ?220

?

/*********** RC alias*****************/

enum rc {

?ROLL,

PITCH,?

?YAW,

?THROTTLE,

?AUX1,

?AUX2,

?AUX3,

?AUX4

};

?

enum pid {

?PIDROLL,

PIDPITCH,?

?PIDYAW,

?PIDALT,

?PIDPOS,

?PIDPOSR,

?PIDNAVR,

?PIDLEVEL,

?PIDMAG,

PIDVEL, ? ? // not used currently

?PIDITEMS

};

?

const char pidnames[] PROGMEM =

?"ROLL;"

?"PITCH;"

?"YAW;"

?"ALT;"

?"Pos;"

?"PosR;"

?"NavR;"

?"LEVEL;"

?"MAG;"

?"VEL;"

;

?

enum box {

?BOXARM,

?#if ACC

? ?BOXANGLE,

? ?BOXHORIZON,

?#endif

?#if BARO &&(!defined(SUPPRESS_BARO_ALTHOLD))

? ?BOXBARO,

?#endif

?#ifdef VARIOMETER

? ?BOXVARIO,

?#endif

?#if MAG

? ?BOXMAG,

? ?BOXHEADFREE,

? ?BOXHEADADJ, //acquire heading for HEADFREE mode

?#endif

?#if defined(SERVO_TILT) ||defined(GIMBAL) ?|| defined(SERVO_MIX_TILT)

? ?BOXCAMSTAB,

?#endif

?#if defined(CAMTRIG)

? ?BOXCAMTRIG,

?#endif

?#if GPS

? ?BOXGPSHOME,

? ?BOXGPSHOLD,

?#endif

?#if defined(FIXEDWING) ||defined(HELICOPTER)

? ?BOXPASSTHRU,

?#endif

?#if defined(BUZZER)

? ?BOXBEEPERON,

?#endif

?#if defined(LED_FLASHER)

? ?BOXLEDMAX, //we want maximum illumination

? ?BOXLEDLOW, //low/no lights

?#endif

?#ifdefined(LANDING_LIGHTS_DDR)

? ?BOXLLIGHTS, //enable landing lights at any altitude

?#endif

?#ifdefINFLIGHT_ACC_CALIBRATION

? ?BOXCALIB,

?#endif

?#ifdef GOVERNOR_P

? ?BOXGOV,

?#endif

?#ifdef OSD_SWITCH

? ?BOXOSD,

?#endif

?CHECKBOXITEMS

};

?

const char boxnames[] PROGMEM =// names for dynamic generation of config GUI

?"ARM;"

?#if ACC

? "ANGLE;"

? "HORIZON;"

?#endif

?#if BARO &&(!defined(SUPPRESS_BARO_ALTHOLD))

? "BARO;"

?#endif

?#ifdef VARIOMETER

? "VARIO;"

?#endif

?#if MAG

? "MAG;"

? "HEADFREE;"

? "HEADADJ;" ?

?#endif

?#if defined(SERVO_TILT) ||defined(GIMBAL)|| defined(SERVO_MIX_TILT)

? "CAMSTAB;"

?#endif

?#if defined(CAMTRIG)

? "CAMTRIG;"

?#endif

?#if GPS

? ?"GPSHOME;"

? ?"GPSHOLD;"

?#endif

?#if defined(FIXEDWING) ||defined(HELICOPTER)

? "PASSTHRU;"

?#endif

?#if defined(BUZZER)

? "BEEPER;"

?#endif

?#if defined(LED_FLASHER)

? "LEDMAX;"

? "LEDLOW;"

?#endif

?#ifdefined(LANDING_LIGHTS_DDR)

? "LLIGHTS;"

?#endif

?#ifdefINFLIGHT_ACC_CALIBRATION

? "CALIB;"

?#endif

?#ifdef GOVERNOR_P

? "GOVERNOR;"

?#endif

?#ifdef OSD_SWITCH

? ?"OSDSW;"

?#endif

;

?

const uint8_t boxids[] PROGMEM ={// permanent IDs associated to boxes. This way, you can rely on an ID numberto identify a BOX function.

?0, //"ARM;"

?#if ACC

? ?1,//"ANGLE;"

? ?2,//"HORIZON;"

?#endif

?#if BARO &&(!defined(SUPPRESS_BARO_ALTHOLD))

? ?3,//"BARO;"

?#endif

?#ifdef VARIOMETER

? ?4,//"VARIO;"

?#endif

?#if MAG

? ?5,//"MAG;"

? ?6,//"HEADFREE;"

? ?7,//"HEADADJ;" ?

?#endif

?#if defined(SERVO_TILT) ||defined(GIMBAL)|| defined(SERVO_MIX_TILT)

? ?8,//"CAMSTAB;"

?#endif

?#if defined(CAMTRIG)

? ?9,//"CAMTRIG;"

?#endif

?#if GPS

? ?10,//"GPS HOME;"

? ?11,//"GPS HOLD;"

?#endif

?#if defined(FIXEDWING) ||defined(HELICOPTER)

? ?12,//"PASSTHRU;"

?#endif

?#if defined(BUZZER)

? ?13,//"BEEPER;"

?#endif

?#if defined(LED_FLASHER)

? ?14,//"LEDMAX;"

? ?15,//"LEDLOW;"

?#endif

?#ifdefined(LANDING_LIGHTS_DDR)

? ?16,//"LLIGHTS;"

?#endif

?#ifdefINFLIGHT_ACC_CALIBRATION

? ?17,//"CALIB;"

?#endif

?#ifdef GOVERNOR_P

? ?18,//"GOVERNOR;"

?#endif

?#ifdef OSD_SWITCH

? ?19,//"OSD_SWITCH;"

?#endif

};

?

?

static uint32_t currentTime = 0;

static uint16_t previousTime = 0;

static uint16_t cycleTime =0; ? ? // this is the number in micro second to achieve afull loop, it can differ a little and is taken into account in the PID loop

static uint16_t calibratingA =0; ?// the calibration is done in the main loop. Calibrating decreases ateach cycle down to 0, then we enter in a normal mode.

static uint16_t calibratingB =0; ?// baro calibration = get new ground pressure value

static uint16_t calibratingG;

static uint16_tacc_1G; ? ? ? ? ? ?//this is the 1G measured acceleration

static uint16_t acc_25deg;

static int16_t gyroADC[3],accADC[3],accSmooth[3],magADC[3];

static int16_t heading,magHold,headFreeModeHold; // [-180;+180]

static uint8_t vbat; ? ? ? ? ? ? ? ? ?// battery voltage in 0.1V steps

static uint8_t ?vbatMin =VBATNOMINAL; ?// lowest battery voltage in 0.1V steps

static uint8_t rcOptions[CHECKBOXITEMS];

static int32_t BaroAlt,EstAlt,AltHold; // in cm

static int16_t ?BaroPID = 0;

static int16_t errorAltitudeI = 0;

static int16_t ?vario =0; ? ? ? ? ? ? // variometer in cm/s

?

#if defined(ARMEDTIMEWARNING)

?static uint32_t ArmedTimeWarningMicroSeconds = 0;

#endif

?

static int16_t ?debug[4];

static int16_t ?sonarAlt;//to think about the unit

?

struct flags_struct {

?uint8_t OK_TO_ARM :1 ;

?uint8_t ARMED :1 ;

?uint8_t I2C_INIT_DONE :1 ;// For i2c gps we have to now when i2c init is done, so we can updateparameters to the i2cgps from eeprom (at startup it is done in setup())

uint8_t ACC_CALIBRATED :1 ;?

?uint8_t NUNCHUKDATA :1 ;

?uint8_t ANGLE_MODE :1 ;

?uint8_t HORIZON_MODE :1 ;

?uint8_t MAG_MODE :1 ;

?uint8_t BARO_MODE :1 ;

?uint8_t GPS_HOME_MODE :1 ;

?uint8_t GPS_HOLD_MODE :1 ;

?uint8_t HEADFREE_MODE :1 ;

?uint8_t PASSTHRU_MODE :1 ;

?uint8_t GPS_FIX :1 ;

?uint8_t GPS_FIX_HOME :1 ;

?uint8_t SMALL_ANGLES_25 :1 ;

?uint8_t CALIBRATE_MAG :1 ;

?uint8_t VARIO_MODE :1;

} f;

?

//for log

#if defined(LOG_VALUES) ||defined(LCD_TELEMETRY)

?static uint16_tcycleTimeMax = 0; ? ? ? // highest ever cycletimen

?static uint16_tcycleTimeMin = 65535; ? // lowest ever cycle timen

?static uint16_t powerMax =0; ? ? ? ? ? // highest evercurrent;

?static int32_t BAROaltMax; ? ? ? ? // maximum value

#endif

#if defined(LOG_VALUES) ||defined(LCD_TELEMETRY) || defined(ARMEDTIMEWARNING) ?||defined(LOG_PERMANENT)

?static uint32_t armedTime= 0;

#endif

?

static int16_t i2c_errors_count = 0;

static int16_t annex650_overrun_count = 0;

?

// **********************

//Automatic ACC OffsetCalibration

// **********************

#ifdefined(INFLIGHT_ACC_CALIBRATION)

?static uint16_tInflightcalibratingA = 0;

?static int16_tAccInflightCalibrationArmed;

?static uint16_tAccInflightCalibrationMeasurementDone = 0;

?static uint16_tAccInflightCalibrationSavetoEEProm = 0;

?static uint16_tAccInflightCalibrationActive = 0;

#endif

?

// **********************

// power meter

// **********************

#if defined(POWERMETER)

#define PMOTOR_SUM8 ? ? ? ? ? ? ? ? ? ?// index into pMeter[] for sum

?static uint32_tpMeter[PMOTOR_SUM + 1]; ?// we use [0:7] for eight motors,one extra forsum

?static uint8_tpMeterV; ? ? ? ? ? ? ? ? // dummy to satisfy the paramStruct logic inConfigurationLoop()

?static uint32_tpAlarm; ? ? ? ? ? ? ? ? // we scale the eeprom value from [0:255] to this value we can directly compareto the sum in pMeter[6]

?static uint16_t powerValue= 0; ? ? ? ? ?// last knowncurrent

#endif

static uint16_t intPowerMeterSum,intPowerTrigger1;

?

// **********************

// telemetry

// **********************

#if defined(LCD_TELEMETRY)

?static uint8_t telemetry =0;

?static uint8_ttelemetry_auto = 0;

#endif

#ifdef LCD_TELEMETRY_STEP

?static chartelemetryStepSequence [] ?= LCD_TELEMETRY_STEP;

?static uint8_ttelemetryStepIndex = 0;

#endif

?

// ******************

// rc functions

// ******************

#define MINCHECK 1100

#define MAXCHECK 1900

?

#define ROL_LO ?(1

免責聲明:非本網注明原創的信息,皆為程序自動獲取互聯網,目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責;如此頁面有侵犯到您的權益,請給站長發送郵件,并提供相關證明(版權證明、身份證正反面、侵權鏈接),站長將在收到郵件12小時內刪除。
晨光彩票app-APP全能版下载 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>