|
本帖最后由 andy 于 2016-10-28 08:49 编辑
已最低成本来玩四轴飞行器,大家先在淘宝购买一部39cm的玩具级四轴飞行器,来改装熟于自己DIY四轴飞行器,可以玩avr mega328或arm STM32以及stm8都可以的。DIY最重要的一点是,要将自己的指挥系统(脑袋)要发挥到最佳作用,才是硬道理啊。
第一步
要改装2.4ghz手控,加装nokia 5110 lcd 显示 我现做到是原装的16PIN单片机遥控信号是共存的,亦即是说,改装遥控信号单片机mega328来控制的,全球首创。
由最简单开始吧:
现玩AVR Mega328P 非常简单,由Arduino IDE 来玩、只买几个Arduino mini Mega328P板仔就可玩了,不用开发工具及什么下载器,只买以下图片看到的FT233RL USB转换为 DTR,TXD,RXD,VCC,GND 就OK。
玩ARM STM32亦非常容易的,因39cm的玩具级四轴飞行器飞控板本身cpu,就是STM32了,只不过在国内没有多少人提及吧。
玩ARM STM32 由 Keil IDE 来玩。
首先把手控电路板PCB的原理图整理出来,有2组+字摇杆(4路ADC 1.Thrttle 2.yaw 3.Pitch 4.Roll),2路(ADC)按健1-5/6个,1路led红色显示_output,1路蜂鸣器_output,1路ADC(1.5v*4=6v 电池电压采样),5条i/o连接nrf24l01 2.4GHz通讯,这一共是14条I/O加上Vcc GND 16Pin单片机原装控(但是不清楚是什么型号单片机,因打磨了型号)。
5110 lcd 要显示4路ADC 1.Thrttle 2.yaw 3.Pitch 4.Roll,2组+字摇杆百分比(%),留下2行显示4个内容,1和2是显示1-12个按健,3显示每次四轴飞行器由开始至没有电量时的一共多少时间,4显示1.5V*4电池还有多少电量。
大家熟读以下内容啊,这里写得很好的,但是,按这里制作四轴飞行器,大家就可知道以下是多少价钱来制作一部50cm四轴飞行器(总价1,468元),手控要购买现成的(学不到2.4ghz手控通讯格式了),所以,我这里是最全面技术及最实惠的,每一年大学生的新生们,要接触这个科目,最适及的。我在这里提昌:我为人人,人人亦可为我,的精神思想。
***********************************************************************************************************
超酷MWC四轴飞行器DIY全套教程,资料经验大放送!顶!顶...
http://www.amobbs.com/thread-5546057-1-6.html
9、经费预算
按照性价比指标来计算,我做了这个使四轴能稳定飞行经费预算表,不加GPS。
材料 数量 单价/元 总价/元
机架 1 55 55
电机 4 90 360
电调 4 45 180
电池 1 99 99
充电器+电源适配器 1 178 178
桨 4 9 36
遥控器+控 1 495 495
低压报警器 1 15 15
其他零散配件 不计 50 50
-------------------------------------------------------------------------------
总价 1468
以上这些材料及其售价完全参考淘宝标价,无丝毫篡改。我个人觉得要做好一架能稳定飞行的四轴飞行器,以上材料是一定要具备的。
*********************************************************************************************************************
以下手掌型四轴飞行器亦不简单,同一厂商出品、用同一个手控遥控讯号的,飞控板采用到3个芯片构成(一般都是这个结构成为四轴飞控板的) 1 > STM32F031K4U6,2 > MPU6050,3 > HS6200(国产 nrf24l01) 和4个触立IC电机芯片控制是H桥路控制的,高级啊。
以下:是我在2016-4-2 香港举行《四軸航拍机》讲座的内容
1 > 探索
21世紀初50cm以下直經的小四軸飛行器和微型四軸飛行器(大小如手掌) 進入各國高上學府,並設立項目研究、實驗、實踐、探索、試驗了各種不同“控制算法”(單片機飛控軟件) 。
國外高上學府,有
1. 濱夕法尼亞大學2002年
2. 瑞士洛桑聯邦理工大學2003年
3. 斯坦福大學的Mesi copter飛行研究組
4. 麻省理工大學Robust Robotics研究組
國內高上學府,包括
5. 國防科技大學2004年
6. 哈爾濱工業大學
7. 南京航空航天大學
8. 西北工業大學
9. 香港科技大学 … 等
2 > 結構
四軸飛行器機械構造簡單,只要通過控制4個電機(螺旋漿) 的速度 ,四軸飛行器便可完成: 滾轉 、俯仰 、偏擺 、和加速度…等動作,在空中飛行。
ROLL PITCH YAW ACCELERATION
3 > 應用
網站發布開源“控制算法”(單片機飛控軟件) 程序冒起,有德國MK飛控代碼2007-2009年、KK飛控代碼…等,就這個時段很多商業公司或個人(愛好者) 都搭上了這一輛“四軸飛行器”方便列車(開發飛控源代碼C語言程序) ,DIY愛好者制造自己的四軸飛行器,商業公司就將開源飛控源代碼優化,增加多項新功能,變成成熟的商業級四軸飛行器產品,推出市場銷售(代表作如法國的 AR Drone) ,玩具級的便宜四軸飛行器亦相繼推出市場銷售。
到2010年法國人Alex在網站發布了他的MultiWii開源飛控源代碼程序,徹底地將制作四軸飛行器的難度降低,令到每個愛好者都能輕鬆地制作自己的四軸飛行器,因為MultiWii是配合Arduino IDE 簡易單片機開發平台。
最近10年很多公司都投入到這個四軸飛行器的行業,四軸飛行器套件價格拉到了“平易近人”每個人都買得起。
入門級(玩具級)
套件價格加配鏡頭 幾百 ~ 幾仟港元
鏡頭級數 100萬 ~ 500萬像素
中當級(玩家級)
套件價格加配鏡頭 5000 ~ 10000港元
鏡頭級數 500萬 ~ 1400萬像素
專業級(專家級)
套件價格加配鏡頭 10000 ~ 10多萬港元
鏡頭級數 1200萬像素 ~ 4K高清視頻
4 > 四軸飛行器應用到各行各業:
1. 航拍:一般航拍、專業航拍、電視台各方面航拍、電影航拍或體育運動航拍。
2. 維修航拍: 高壓電纜、高層電塔、風力發電機…等。
3. 保安業航拍。
4. 工程多方面應用到四軸飛行器協助工作。
5. 開發未來四軸飛行器載人飛行(新的交通運輸工具) 。
6. 國外內網購商都正在開發四軸飛行器自動飛行,將貨件速遞到客戶手上(代替人員來速遞送貨件) 。
〈2015年最熱門產品之一四軸飛行器加配航拍鏡頭〉
5 > 未來
國外內名牌大公司如: Intel、亞馬遜、Facebook、Google、小米…等都相繼投入到四軸飛行器開發商品推出市場銷售。
預估全球市場規模10年之內將達到1400億美元,相等於1萬1仟億港元。
國內有名四軸飛行器生產商“大疆”2014年賣出40萬套四軸航拍機,公司資產值100億美元。
6 > 無人飛行器執照
國際民航協會AOPA無人飛行器執照。
四軸飛行器藍天飛揚,操控無人飛行器人員必須要具備無人飛行器執照,在國內多個城市都開辦了無人飛行器執照訓練班課程,期期爆滿,每一個班組學位難求,學費人民幣12,800元。
//------------------------------------------------------------------------------------------------------------
我香港《四軸飛行器制作班》讲义
第一章 飛行器前世今生
1中國人古時神話故事〈嫦娥奔月〉。
2中國人的古代風箏。
3中國人的竹蜻蜓。
4中國人〈萬戶飛天〉:
明朝一位官員(萬戶),他為實現自已的飛天夢想,自已坐上一張太師椅綁上47支火箭炮(沖天炮),雙手各拿上風箏,一聲令下,叫下人點火點著沖天炮向天空飛去。
20世紀70年代,國際天文聯會將月球背面的一座還型山,命名為“萬戶還型山”,為紀念這名前人成為人類第一個向天飛去。
5發明熱氣球載人吊籃升空。
6發明火箭
火箭之父2名︰
甲·美國羅伯特戈達德1914-16年對火箭理論進行實驗性研究1919年經典名著到達極大高度的方法問世。
乙·俄國齊奧爾科夫斯基1929年提出多級火箭理論。
火箭研究及應用3名︰
A 德國V2火箭創始人《馮布勞恩(華納馮布郎)》,由1936年開始研究發展火箭, 1940年研制成功,將新型火箭武器發射到英國倫敦,二次大戰結束后到了美國,繼續發揮他的才華,發展長程火箭及航天事業。
B 俄國火箭團隊領軍人《謝爾蓋帕洛夫維奇科羅廖夫》。
C 中國火箭創始人《錢學深》1929-34年上海交通大學選修機械工程,1935年8月作為一名公費留學生赴美國學習和研究航空學工程以及空氣動力學。
7發明固定翼飛機1903年萊特兄弟第一次人類進行有動力飛行。
8發明直升機1939年
9上世紀50-70年人類〈美國軍方支持發展〉發明各式各樣飛行器如、背包噴氣個人飛行器(007電影出現過)。
10 仿生鳥〈一個電機加上一個舵機撲翼飛行器〉。
11本世紀現正全力發展飛行汽車〈離地飛行幾十米至一千米之間〉。
第二章 Arduino軟硬件結構
Arduino,是一個基於開放原始碼的軟硬體平臺,構建於開放原始碼simple I/O介面版,並且具有使用類似Java,C語言的Processing/Wiring開發環境。
讓您可以快速使用Arduino語言與Macromedia Flash, Processing, Max/MSP, Pure Data, SuperCollider…等軟體,作出互動作品。 Arduino可以使用開發完成的電子元件例如Switch或感測器或其他控制器件、LED、步進馬達或其他輸出裝置。 Arduino也可以獨立運作成為一個可以跟軟體溝通的介面,例如說: Macromedia Flash, Processing, Max/MSP, Pure Data, 或其他互動軟體…。 Arduino開發IDE介面基於開放原始碼原,可以讓您免費下載使用開發出更多令人驚嘆的互動作品。
Arduino IDE 本身嵌入了AVRGCC C語言編譯軟件,所以基本是C語言,但是又簡化了很多繁瑣設置〈單片機本身各個接口的控制寄存器設置〉定義。
Arduino IDE具備2大優點︰
1·即時編譯Arduino的語言,同時上傳到目標板上的單片機系統直接執行編譯後HEX Code程式。
2·ATMega系列的單片機可橫跨應用,例如:Arduino的語言源先開發給Mega8單片機,後升級更改為Mega328/ Mega2560單片機,Arduino的軟件語言不用作改動。
Arduino IDE BootLoad功能:
單片機的Reset引腳上拉1K電阻,同時連接1個0.1uF電容 => DTR。
Mega328內有兩個存儲區,一個是bootloader區,一個是你正常運行的程式區。 bootloader是用來監控或是下載用的,比如Arduino UNO中的Mega328就燒錄了相應的bootloader,之後,可直接用相應的arduino IDE 一體化的編譯下載,很方便。
這個是使用在系統程式設計的啟動代碼區,也就是說,你可以遠端(遠在千里之外),利用這個區的代碼配置及熔絲位元的配置對系統進行線上程式設計。
第三章 固定翼飛機原理
固定翼飛機方向舵的作用原理跟在水中是一樣的,因為空氣和水都是一種介質。
基本4種動作︰1滾轉(Roll) 、2俯仰(Pitch) 、3偏擺(Yaw) 、4加速度(Acceleration) 。
*********************************************************************************************************************
这里最困难的技术是2.4GHz自动跳频(自动选择空的频道2.4GHz)通讯,大家可在本论坛找一找或「搜索一下」可否有关这方面资料啊?
其实在「2.4GHz」蓝牙、Wifi 2.4GHz自动跳频通讯技术是非常成熟的,但是,业内(行内)是不会放出大量技术资料的,行业外的只能一步一步地进行摸索这方面技术了。
*********************************************************************************************************************
将这套四轴飞行板要组装大四轴如50cm直经,也很简单,因为 四轴飞行板原理都是一样的,装上电调,三相航模电机就可了,超简单的。
*********************************************************************************************************************
最下面的相片是原装STM32F031K4U6飞行板,就可以破解nrf24l01通讯格式,以及可从新写入新的飞控RAM程式啊。
**********************************************************************************************************************
最下面的附件,是一个原整的Mega328 mpu6050 nrf24l01飞控板的程式,是Arduino MultiWii的程式。
**********************************************************************************************************************
现放上简单的 5110 lcd 显示程式 Arduino的
#include "font.h"
//端口定义 诺基亚5110显示屏
int LCD_5110_BL=4;
int LCD_CE=5;
int LCD_RST=6;
int RED_LED=9;
int BUZZER=10;
int SDIN=11;
int LCD_DC=12;
int SCLK=13;
/****************************************************************/
void setup()
{
pinMode(A7,INPUT);
pinMode(A6,INPUT);
//pinMode(A5,INPUT); //没有使用
pinMode(A4,INPUT);
pinMode(A3,INPUT);
pinMode(A2,INPUT);
pinMode(A1,INPUT);
pinMode(A0,INPUT);
pinMode(RED_LED, OUTPUT);
digitalWrite(RED_LED, LOW);
pinMode(BUZZER, OUTPUT);
// pinMode(LCD_5110_BL, OUTPUT);
// digitalWrite(LCD_5110_BL, LOW);
}
/************************LCD初始化函数********************************/
void LCD_init(void)
{
//先设置为输出
pinMode(SCLK,OUTPUT);
pinMode(SDIN,OUTPUT);
pinMode(LCD_DC,OUTPUT);
pinMode(LCD_CE,OUTPUT);
pinMode(LCD_RST,OUTPUT);
// 产生一个让LCD复位的低电平脉冲
digitalWrite( LCD_RST, LOW);
delayMicroseconds(1);
digitalWrite( LCD_RST, HIGH);
// 关闭LCD
digitalWrite( LCD_CE, LOW);
delayMicroseconds(1);
// 使能LCD
digitalWrite( LCD_CE, HIGH); //LCD_CE = 1;
delayMicroseconds(1);
LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
LCD_write_byte(0xbf, 0); // 设置偏置电压
LCD_write_byte(0x04, 0); // 4 温度校正
LCD_write_byte(0x12, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令
LCD_clear(); // 清屏
LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
// 关闭LCD
digitalWrite( LCD_CE, LOW); //LCD_CE = 0;
}
/************************LCD清屏函数*******************************/
void LCD_clear(void)
{
unsigned int i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
LCD_write_byte(0, 1);
}
/*----------------设置字符位置函数---------------------
LCD_set_XY : 设置LCD坐标函数
输入参数:X :0-83
Y :0-5
-------------------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x80 | X, 0); // row 列
LCD_write_byte(0x40 | Y, 0); // column 行
}
/*************************ASCII字符显示函数*************************/
void LCD_write_char(unsigned char c){
unsigned char line;
c -= 0x20;
for (line=0; line<5; line++)
LCD_write_byte(font6x8[c][line], 1);
}
/*******************************************************************/
/*-------------------------------------------------
LCD_write_english_String : 英文字符串显示函数
输入参数:*s :英文字符串指针;
X、Y : 显示字符串的位置,x 0-83 ,y 0-5
--------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s){
LCD_set_XY(X,Y);
while (*s){
LCD_write_char(*s);
s++;
}
}
/******************************************************************/
/*---------------------------------------------
LCD_write_byte : 写数据到LCD NOKIA 5110 显示摸块
输入参数:data :写入的数据;
command :写数据=0/命令选择=1;
---------------------------------------------*/
void LCD_write_byte(unsigned char dat, unsigned char command){
unsigned char i;
digitalWrite( LCD_CE, LOW); // 使能LCD_CE = 0
digitalWrite( LCD_DC, LOW); // 传送命令LCD_DC = 0;
if(command)
digitalWrite( LCD_DC, HIGH); // 传送数据LCD_DC = 1;
for(i=0;i<8;i++){
digitalWrite( SDIN, LOW); // SDIN = 0;
if(dat & 0b10000000)
digitalWrite( SDIN, HIGH);// SDIN = 1;
digitalWrite( SCLK, LOW); // SCLK = 0;
dat <<=1;
digitalWrite( SCLK, HIGH); // SCLK = 1;
}
digitalWrite( LCD_CE, HIGH); // LCD_CE = 1
}
/*-------------------------------------------------
lcd_write_chinese_string: 在lcd上显示汉字
输入参数:x、y :显示汉字的起始x、y坐标;
ch_with :汉字点阵的宽度
num :显示汉字的个数;
line :汉字点阵数组中的起始行数
row :汉字显示的行间距
--------------------------------------------------*/
void lcd_write_chinese_string(unsigned char x, unsigned char y,
unsigned char ch_with,unsigned char num,
unsigned char line,unsigned char row)
{
unsigned char i,n;
LCD_set_XY(x,y); //设置初始位置
for (i=0;i<num;)
{
for (n=0; n<ch_with*2; n++) //写一个汉字
{
if (n==ch_with) //写汉字的下半部分
{
if (i==0)
LCD_set_XY(x,y+1);
else
LCD_set_XY((x+(ch_with+row)*i),y+1);
}
"nop";
// lcd_write_byte(hzk[line+i][n],1);
}
i++;
LCD_set_XY((x+(ch_with+row)*i),y);
}
}
/***********************************************/
/*----------------------------------------------
lcd_draw_map : 位图绘制函数
输入参数:x、y :位图绘制的起始x、y坐标;
*map :位图点阵数据;
pix_x :位图像素(长)
pix_y :位图像素(宽)
-----------------------------------------------*/
void lcd_draw_bmp_pixel(unsigned char x,unsigned char y,unsigned char *map,
unsigned char pix_x,unsigned char pix_y)
{
unsigned int i,n;
unsigned char row;
if (pix_y%8==0)
{
row=pix_y/8; //计算位图所占行数
}
else
{
row=pix_y/8+1;
}
for (n=0;n<row;n++)
{
LCD_set_XY(x,y);
for(i=0; i<pix_x; i++)
{
"nop";
// lcd_write_byte(map[i+n*pix_x], 1);
}
y++; //换行
}
}
void LcdCharacter(char character)
{
LCD_write_byte(0, 1);//写入一字节的数据
for (int index = 0; index < 5; index++)
LCD_write_byte(font6x8[character - 0x20][index],1);//写入一字节的数据
LCD_write_byte(0, 1);//写入一字节的数据
}
void LcdString(char *characters)
{
while (*characters)
LcdCharacter(*characters++);
}
/*************************以下为主函数*****************************/
char string[8];
void loop()
{
LCD_init();//初始化液晶
LCD_clear();
while(1)
{
// LCD_write_english_string(0,0,"Thrttle 50% "); // 油门大小调节
// LCD_write_english_string(0,1,"Yaw 50% "); // 航向,将物体绕Y轴旋转(localRotationY)
// LCD_write_english_string(0,2,"Pitch 50% "); // 俯仰,将物体绕X轴旋转(localRotationX)
// LCD_write_english_string(0,3,"Roll 50% "); // 横滚,将物体绕Z轴旋转(localRotationZ)
//LCD_write_english_string(0,0,"VOLTAGE"); // 0,列位 1 行位
//LCD_set_XY(0,0);
//LcdString("Thrttle");
LCD_write_english_string(0,0,"Thrttle"); // 显示 油门大小
float voltage = analogRead(A7) * 3.3 / 1023;
LCD_set_XY(50,0);
LcdString((dtostrf(voltage,5,2,string)));
LCD_write_english_string(0,1,"Yaw"); // 显示 转向左右
float voltage1 = analogRead(A6) * 3.3 / 1023;
LCD_set_XY(50,1);
LcdString((dtostrf(voltage1,5,2,string)));
LCD_write_english_string(0,2,"Pitch"); // 显示 前后
float voltage2 = analogRead(A4) * 3.3 / 1023;
LCD_set_XY(50,2);
LcdString((dtostrf(voltage2,5,2,string)));
LCD_write_english_string(0,3,"Roll"); // 显示 横行左右
float voltage3 = analogRead(A0) * 3.3 / 1023;
LCD_set_XY(50,3);
LcdString((dtostrf(voltage3,5,2,string)));
LCD_write_english_string(54,4,"KEY= "); //2-6 显示 左手边 按健2-6
float voltage4 = analogRead(A2);
if(voltage4 < 3)
key=2;
if((voltage4 > 871-3)&&(voltage4 < 871+3 ))
key=3;
if((voltage4 > 326-3)&&(voltage4 < 326+3 ))
key=4;
if((voltage4 > 459-3)&&(voltage4 < 459+3 ))
key=5;
if((voltage4 > 933-3)&&(voltage4 < 933+3 ))
key=6;
if(voltage4 >1018)
LCD_write_char(' ');
else
LCD_write_char(0x30+key);
//-------------------------------------------------------------------------------------
LCD_write_english_string(54,5,"KEY="); // 显示 右手边 按健7-12
float voltage5 = analogRead(A1);
if(voltage5 < 3)
key1=7;
if((voltage5 > 933-3)&&(voltage5 < 933+3 ))
key1=8;
if((voltage5 > 816-3)&&(voltage5 < 816+3 ))
key1=9;
if((voltage5 > 559-3)&&(voltage5 < 559+3 ))
key1=10;
if((voltage5 > 704-3)&&(voltage5 < 704+3 ))
key1=11;
if((voltage5 > 460-3)&&(voltage5 < 460+3 ))
key1=12;
if(voltage5 > 1018)
{
LCD_write_char(' ');
LCD_write_char(' ');
}
else
{
if(key1 < 10)
LCD_write_char(0x30+key1);
else
{
LCD_write_char( 0x30+key1/10); //显示十位数
LCD_write_char( 0x30+key1%10); //显示个位数
}
}
float voltage6 = analogRead(A3)* 6.00 / 1023;
LCD_write_english_string(0,5,"Bt=");
LCD_set_XY(18,5);
LcdString((dtostrf(voltage6,3,2,string)));
}
delay(500);
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|