聚豐項目 > 四軸無人機姿態調整系統
隨著信息技術的高速發展,以傳感器為應用的物聯網(IoT)得到了前所未有的發展, 物聯網產品應用廣泛,市場規模巨大。主流傳感器中,又以位置、流量、氣體、濕度等傳感器備受市場青睞。 本項目是借助 IDT ZMID5201STKIT開發套件,利用ZMID520xMROT36001 Rotary Application Module模塊,將無人機飛行過程中的飛行方向偏移角發送給MCU,經過MCU解析后,發送到NRF2401。通過NRF2401無線數據傳輸,最終將數據發送到手持設備上,可直觀的觀察到無人機姿態偏斜方向。 該項目的無人機具有一定的使用價值,可在科教、娛樂等領域應用,在工業、民用安防、智慧城市建設方面具有一定的應用價值,市場前景廣闊,在未來商業應用方面潛力巨大。
llzhang
分享llzhang
團隊成員
劉聽強 硬件工程師
1、主控芯片:STM32F103C8T6作為主控MCU,STM32F103C8T6采用
Corex-M3內核,工作頻率可達到72MHz,20KB SRAM,共3個定時器和3個USART。48個LQFP引腳足夠外圍電路使用。如下圖所示。
圖1 主控芯片
2、電源部分:供電方案采用先升壓再降壓的方案,由于第一次使用1S的鋰離子電池,給四個空心杯進行空載供電的時候,四軸啟動是沒有問題的。但是如果四個空心杯都帶上負載,如果瞬間提速到滿速,那么電池輸出電壓拉低到3V以下,如果不采用升壓方案,直接用電池給LDO供電,那LDO就會失效。所以通過升壓再降壓后給單片機系統供電是一個可行的方案,如下圖所示。
圖2 升壓電路部分
圖3 降壓電路部分
3、傳感器部分:MPU6050六軸傳感器芯片通過數據濾波處理把三軸陀螺儀數據和三軸加速度數據以及ZMID520xMROT36001 Rotary Application Module角度偏移數據引入MCU進行IMU姿態解算,如下圖所示。
圖4 陀螺儀
4、四軸空心杯:無人機能否平穩操控,主要在四個電機上,空心杯選的好,對應姿態的穩定有較大的幫助。當然了驅動電機的MOS管上、陀螺儀上、PCB對四軸最終的效果也起到關鍵的作用。電機的頻率,會才生干擾的頻率點,會使無人機振動較大不好控制。另外就是同一批次的電機性能差異很大,導致PID調節的輸出差異很大,最終會影響MOS管的壽命、電機壽命。空心杯電機使用SI2302這款MOS管進行驅動,這是非常常見的一款MOS管,便宜又好用。如下圖所示。
圖5 空心杯(前)
5、射頻部分:采用NRF2401,這是一塊常用芯片,性能也是可以的,無線發射可以做到7dB,加上發射和接收端都采用陶瓷天線,可以達到50m的通訊距離。如果加上AP,那達到100米應該沒有問題。通過兩個低成本的0歐電
阻對電源進行了單點接地,防止電機回路的電流波動串進射頻回路對射頻造成干擾。
圖7 射頻部分
6、燈光模塊:采用3個SOT23-3封裝的MOS管進行開關控制,與MCU隔離電源。
7、遙控器電路:采用傳統的DBUS遙控器反向電路。
1、無線射頻傳輸部分代碼:
/**********************************************************************
配置NRF2401為RX模式,準備開始接收數據
***********************************************************************/
void RX_Mode(void)
{
CE_LOW; //拉低CE,進入待機模式,準備開始往NRF2401中的寄存器中寫入數據
SPI_Write_Byte(WRITE_REG_CMD + CONFIG, 0x0f); //配置為接收模式
SPI_Write_Byte(WRITE_REG_CMD + STATUS, 0x7e); //寫0111 xxxx 給STATUS,清除所有中斷標志,防止一進入接收模式就觸發中斷
CE_HIGH; //拉高CE,準備接受從外部發送過來的數據
}
/**********************************************************************
從NRF2401的RX的FIFO中讀取一組數據包
輸入參數rx_buf:FIFO中讀取到的數據的保存區域首地址
***********************************************************************/
void NRF2401_ReceivePacket(u8* rx_buf)
{
CE_LOW;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //從RX端的FIFO中讀取數據,并存入指定的區域,注意:讀取完FIFO中的數據后,NRF2401會自動清除其中的數據
SPI_Write_Byte(FLUSH_RX,0xff); //清除接收FIFO
CE_HIGH; //重新拉高CE,讓其重新處于接收模式,準備接收下一個數據
}
/**********************************************************************
配置NRF2401為TX模式,并發送一個數據包
輸入參數tfbuf:即將要發送出去的數據區首地址
***********************************************************************/
void NRF2401_SendPacket(u8* tfbuf)
{
CE_LOW; //拉低CE,進入待機模式,準備開始往NRF2401中的寄存器中寫入數據
// SPI_Write_Buf(WRITE_REG_CMD + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); //裝載接收端地址,由于這里只有一個通道通訊,不用改變接收端的NRF2401的接收通道地址,所以,這句可以注釋掉
SPI_Write_Buf(WR_TX_PLOAD, tfbuf, TX_PLOAD_WIDTH); //將數據寫入TX端的FIFO中,寫入的個數與TX_PLOAD_WIDTH設置值相同
SPI_Write_Byte(WRITE_REG_CMD + CONFIG, 0x0e); //將NRF2401配置成發射模式
SPI_Write_Byte(WRITE_REG_CMD + STATUS, 0x7e); //寫0111 xxxx 給STATUS,清除所有中斷標志,防止一進入發射模式就觸發中斷
CE_HIGH; //拉高CE,準備發射TX端FIFO中的數據
delay_ms(1); //CE拉高后,需要延遲至少130us
}
void WaitFlY_Connection(void)
{
static u8 cnt = 0,preaddr;
ConnectingDisplay();//斷線連接狀態顯示
while(1)
{
if(FLY_Connect_OK)
{
cnt = 0;
if(preaddr != TX_ADDRESS[TX_ADR_WIDTH-1])
{
PID_WriteFlash();
// printf("Address save :%d preaddr:%d\r\n",TX_ADDRESS[4],preaddr);
}
// printf("Fly connect OK!!!\r\n");
return;
}else if(cnt++ < 10)
{
PID_ReadFlash(); //讀取上一次保存的飛機的NRF2401地址
preaddr = TX_ADDRESS[TX_ADR_WIDTH-1];
NRF2401_Config();
delay_ms(50);
// printf("Flash read NRF2401addr:%d\r\n",TX_ADDRESS[4]);
}
else
{
TX_ADDRESS[TX_ADR_WIDTH-1]++ ;
RX_ADDRESS[TX_ADR_WIDTH-1]++ ;
if(TX_ADDRESS[TX_ADR_WIDTH-1]>AddrMax && RX_ADDRESS[TX_ADR_WIDTH-1]>AddrMax)
{
TX_ADDRESS[TX_ADR_WIDTH-1] = 0x00;
RX_ADDRESS[TX_ADR_WIDTH-1] = 0x00;
}
SPI_Write_Buf(WRITE_REG_CMD + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG_CMD + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);
delay_ms(100);
}
if(ADC_CALIBRATOR_OK)
{
OLED_ShowString(byte(2),line4,"Calibration",8);
}
else
{
OLED_ShowString(byte(2),line4,"Connecting...",8);
}
}
}
void ReconnectionFly(void)
{
if(Reconnection_flag)
{
ConnectingDisplay();
if(FLY_Connect_OK) //遙控已重新連接
{
Display_init();
Reconnection_flag = 0; //斷線重連標志復位
return;
}
NRF2401_Config();
}
}
圖8 無線射頻傳輸部分代碼
2、手持終端顯示部分代碼:
void ButtonCMDDisplay(void)
{
if(GET_FLAG(FLY_ENABLE))
{
OLED_ShowString(byte(11),line4,"Nolink",6);
}else
{
OLED_ShowString(byte(11),line4,"Link ",6);
}
SenserOffsetDisplay();
WiFiOnOffDisplay();
ModeSelectDisplay();
}
void ConnectingDisplay(void)
{
OLED_Clear();
OLED_ShowCHinese(1,line1,WiFi,0); //信號強度
OLED_ShowString(byte(3)+4,line1," IDT_Fly",8); //大賽名
OLED_ShowCHinese7x7(121,line1,BATT,0); //電池圖標
OLED_ShowString(111,line1,"%",6); //
OLED_ShowNum(108,line2,0,2,6); //電池電壓比例
}
}
圖9 無線射頻傳輸部分代碼
四軸無人機下方為自制的指南針,用來定位起飛前的方向。南針放在四軸無人機下方,為了防止電機風力而引起的擺動。
無人機起飛、平衡性并不理想,主要還是在數據傳輸部分,不能及時將傳感器發送的數據,進行其實的處理去調整無人機的姿態。但是是MPU6050還是ZMID520xMROT傳輸的數據,都能顯示在RGB LED屏上。
圖9 正面圖
圖10 背面圖
圖11 連接圖
(0.55 MB)下載