基於STM32的無線飛鼠 二

2021-07-02 07:38:45 字數 4515 閱讀 4975

在前一篇部落格中講了下一些題外話,從本篇開始講講重點的知識,說說無線飛鼠過程用到的模組

細說mpu6050

mpu6050整合了3軸加速度和3軸陀螺儀,是一款不錯的感測器模組,可以用在很多方面,比如:四軸飛控、空中滑鼠、兩輪平衡車、gps定位方面、遊戲機、3d遙控器、平板裝置等等,此模組給我們提供了強大的資料**,由於將加速度和陀螺儀整合到了一起,免去了組合這兩個模組時之間的軸差問題,減少了包裝問題,這兩年很火,成了diy製作者的最愛。

在**上買mpu6050時,要注意一下幾點:

檢視賣家給出的介紹資訊,是否刻意誇大,結合自己所學的知識進行判斷。比如:當時在某個論壇上看到某位大神將的,tb上說他們的模組採用高效能的微處理器和先進的動力學解算與卡爾曼動態濾波演算法,能夠快速求解出模組當前的實時運動姿態。細心的你就會發現它的這種處理器根本就不能提供這種需求,也就是會所計算不出來。(stm8是8位的微控制器,能做姿態解算和濾波嗎?)呵呵……想了下都有點搞笑.這個論壇上有詳細的解說:

不要讓模組受到碰撞,否則會影響他的效能。

mpu6050資料是用iic進行讀取的,so必須學會iic。類似於usb協議,不過和usb比起來可以說是小巫見大巫。

iic技術概述

iic 即inter-integrated circuit(積體電路匯流排),這種匯流排型別是 由飛利浦半導體公司在八十年代初設計出來的兩線式序列匯流排

特點:介面線少、器件封裝形式小、通訊速率較高

iic匯流排只有兩根雙向訊號線,如下圖所示:

iic資料傳輸

資料有效位的定義:

 iic匯流排在進行資料傳輸時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線的高電平或低電平狀態才允許變化

起始和停止條件:

 當scl線是高電平時,sda線從高電平向低電平切換,這個情況視為起始條件。

 當scl線是高電平時,sda線有低電平向高電平切換,表示停止條件

資料傳輸格式:

iic匯流排定址

iic匯流排規定:從機位址有第乙個位元組的7位組成

(想要插入**,可是在這裡不會用了,直接從world中截張圖算了)

iic匯流排編號

從機的位址有固定部分和可程式設計部分組成。在乙個系統中可能希望接入多個相同的從機,從機位址中科程式設計部分決定了可接入匯流排該類期間的最大數目

例如:乙個從機的7位定址中有4為是固定的,3位是可程式設計的,那個這時僅能定址8個同類期間。

熟悉mpu6050管腳

上圖是我自己的模組,由於連上了線,管腳不是很清楚,可以看著一張,管腳和清楚的。

管腳功能介紹

這裡已經很詳細的介紹了各個管腳的功能,在心裡就有個大概了解,在後面編寫**中就會明白好多,更多細節可以檢視手冊的!

當時開始做這個東西的時候參考了原子、野火的各個例子,再次感謝你們。

mpu初始化:

void mpu_init()

下邊是讀取陀螺儀的資料函式:

void read_gyro_data(short *rxbuf)

printf("\r\n");}}

/*

* 函式名:data_send_status

* 描述 :資料傳送 感測器 的狀態

根據匿名四軸最新上位機編寫的顯示姿態的程式

* 輸入 :pitch:俯仰角

roll :橫滾角

yaw :航向角

gyro :陀螺儀

accel:加速度

* 輸出 :

* 呼叫 :

*/void data_send_status(float pitch,float roll,float yaw,int16_t *gyro,int16_t *accel)

; //傳送陣列,初始化為0

data_to_send[_cnt++] = 0xaa; // 幀頭 170

data_to_send[_cnt++] = 0xaa; // 170

data_to_send[_cnt++] = 0x01; // 功能字 1

data_to_send[_cnt++] = 0; // 長度 0

//橫滾角

_temp = (int)(roll * 100);

data_to_send[_cnt++] = byte1(_temp); // 高 8 位

data_to_send[_cnt++] = byte0(_temp); // 低8位

//俯仰角

_temp = 0 - (int)(pitch * 100);

data_to_send[_cnt++] = byte1(_temp);

data_to_send[_cnt++] = byte0(_temp);

//航向角

_temp = (int)(yaw * 100);

data_to_send[_cnt++] = byte1(_temp);

data_to_send[_cnt++] = byte0(_temp);

data_to_send[3] = _cnt - 4; //資料長度

//和校驗

for(i = 0;i < _cnt;i++)

sum += data_to_send[i];

data_to_send[_cnt++] = sum;

data_to_send[_cnt++] = '\0';

//nrf_tx_dat(data_to_send); //傳送到nrf緩衝區

//printf("\r\ndata_send_status:\r\n");

// for (j = 0; j < 12;j++)

//

// printf("\r\n");

// //串列埠傳送資料

for(i=0;i<_cnt>

anbt_uart1_send_char(data_to_send[i]);

} /*

* 函式名:send_data

* 描述 :用於傳送感測器的資料

* 輸入 :gyro:陀螺儀存放字元指標

accel:加速度存放指標

* 輸出 :

* 呼叫 :

*/void send_data(int16_t *gyro,int16_t *accel)

// printf("\r\n");

// delay_ms(1000);

// status = nrf_tx_dat(data_to_send);

//

// /*判斷傳送狀態*/

// switch(status)

//

//

// delay_ms(1000);

// //串列埠傳送資料

for(i = 0;i <_cnt>

anbt_uart1_send_char(data_to_send[i]);

}

在主函式中呼叫相應的函式即可獲取相關資料,做乙個簡單的測試。

一下是我從串列埠中獲取的資料:

以及其他資料:

因為**中使用了圓點博士的開源**,而且都是現成的,就不往出貼了……

以上只是做了個簡單介紹,以及獲取到了資料,但是並沒有說明怎樣處理資料,這是很關鍵的也是最重要的,本次無線飛鼠的資料不好處理,我做到現在資料也不是很穩定,任然有一定幅度的變化。

email:[email protected]

一 mpu6050簡介

二 細節問題

三相關技術

四操作步驟

五實現**

**塊目錄

基於STM32的串列埠通訊

序列通訊一般是以幀格式傳輸資料,即一幀一幀的傳輸,每一幀都含有起始訊號,資料資訊以及停止資訊等。資料各個位同時傳輸,速度快,但是占用引腳資源多。eg led1602 資料按位順序傳輸,占用引腳資源少,但是速度相對較慢。一位一位傳輸 bit iic spi 串列埠通訊 單工,半雙工,全雙工 同步通訊 ...

基於STM32的恆流源設計

本設計以stm32f103rct6為主控晶元,利用mos管的恆流區特點,設計恆流源。設計電流範圍為1 300ma。基本原理圖 q2為n溝道mos管,在正常工作情況下,運放與mos管之間構成深度負反饋,使得輸入控制電壓與vr虛短,近似相等。這可以得到負載電流 3.1.電源 電路圖如圖所示 電源由 12...

STM32基礎入門(二) STM32入坑指南

最近有不少學弟新入微控制器的坑,萬事開頭難。作為乙個比較陌生的領域,再結合我當時入坑時的一些問題,寫下這篇部落格,希望能夠給初學者一些啟發。1.開發板的選擇 學習stm32,不能繞開的第一件事,那就是開發板。開發板的意義 開發板提供了足夠的資源,包含硬體資源和軟體資源。硬體資源,即開發板上自帶的le...