
ESPcopter無人機初探(UWB定位+ESP8266MCU)
這篇文章就開始對無人機的源碼開始分析了,對飛機的具體說明在上了鏈接~

按說這個庫是可以記載在Arduino的,但是失敗了
http://espcopter.com/code-release/
改了名字也加載不了

今天看這個源碼

readme沒有對自己的項目做描述,而是在講述昨天說的定位模塊

標準的格式,最重要的是name,version

關鍵字,這個東西被加載到arduino以后。關鍵字的顏色是高亮的

分為源碼以及demo,我們先看demo。然后實現看源碼

基礎的這是LED小燈

配置+loop

這個函數在所有的ino內,被首先調用。足以見其的重要性

前面這些code在我昨天的文章里面已經有詳細的分析了
PWM,英文名Pulse Width Modulation,是脈沖寬度調制縮寫,它是通過對一系列脈沖的寬度進行調制,等效出所需要的波形(包含形狀以及幅值),對模擬信號電平進行數字編碼,也就是說通過調節占空比的變化來調節信號、能量等的變化,占空比就是指在一個周期內,信號處于高電平的時間占據整個信號周期的百分比,例如方波的占空比就是50%.PWM用途很廣,像一些步進電機、舵機等等都需要用到。

看樣子是用循環對PWM的引腳初始化

搜索

4個螺旋槳

自定義PWM通道

名稱:pwm_init含義:PWM 初始化示例:pwm_init(uint32 freq, uint32 *duty, uint32 pwm_channel_num, uint32 (*pin_info_list)[3]);描述:PWM GPIO, 參數和定時器初始化參數:uint32 freq: PWM 的周期uint32 *duty: 各通道占空比參數uint32 pwm_channel_num: PWM 通道數。uint32 (*pin_info_list)[3]: PWM 各通道的 GPIO 硬件參數,該參數是一個 n*3 的數組指針。數組中定義了 GPIO 的寄存器,對應 PIN 腳的 IO 復用值,和 GPIO 對應的序號。例如:初始化一個 3 通道的 PWM。uint32 io_info[][3] ={{PWM_0_OUT_IO_MUX, PWM_0_OUT_IO_FUNC, PWM_0_OUT_IO_NUM},{PWM_1_OUT_IO_MUX, PWM_1_OUT_IO_FUNC, PWM_1_OUT_IO_NUM},{PWM_2_OUT_IO_MUX, PWM_2_OUT_IO_FUNC, PWM_2_OUT_IO_NUM}};pwm_init(light_param.pwm_period, light_param.pwm_duty, 2, io_info);調用:系統初始化時調用。目前只能調用一次。返回值:無
到現在完成了引腳的PWM初始化

PWM的頻率

對于PWM的初始化以外,就是pwm的啟動了。以上代碼就是pwm的啟動

接著是這個函數,掃描擴展的傳感器地址
先總線初始化,然后定義兩個比特變量
設備數初始化為0,然后打印開始打印

從1地址開始,遍歷所有的
i2c_scanner使用Write.endTransmisstion的返回值來查看設備是否確實確認了該地址。

下面對返回值進行判斷

error為0的時候先打印0x處未發現設備,address小于16,打印0 addres !

22和41是激光傳感器

122是多重環狀激光避障傳感器


查了一下這個

8是光流傳感器

9是短波

注意這里會對發現的傳感器進行計數

用這個語句打印

以及沒有找到這些擴展傳感器,打印沒有找到

此時我們的代碼讀到一半了
此時讓我們回顧一下,我們現在學到的東西。首先就是開啟了調試用的串口,初始化了所有的引腳,以及明確了引腳的狀態。接著就是初始化了4個PWM的引腳,而且讓4個PWM的引腳成為可以使用的就緒態。接著讓記載的燈亮起。EEPROM一開始申請512字節。以及一個函數去掃描(為了注冊傳感器)的一個函數,而且都是I2C的通信的傳感器。
以下插一些相關的資料:
https://www.cnblogs.com/liming19680104/p/11176481.html
EEPROM(Electrically Erasable Programmable Read-Only Memory),電可擦可編程只讀存儲器——一種掉電后數據不丟失的存儲芯片。
EEPROM可以在不使用文件和文件系統的情況下用來固化一些數據,常見的比如用來保存SSID或者Password,保存用戶設置等數據,這樣就可以不用每次都通過燒寫程序來改變系統運行時的初始值。
Arduino提供了完善的eeprom庫,不過需要注意的是ESP8266沒有硬件EEPROM,使用的是flash模擬的EEPROM
EEPROM庫在Arduino中經常用于存儲設定數據。當然基于Arduino的ESP8266也不例外。但是,和真正的Arduino板子不一樣的是,ESP8266采用的方式是將flash中某一塊4K的存儲模擬成EEPROM。至于為什么是4K呢?主要原因是flash是以sector為一個單位,1 sector等于4096Bytes(4KB),操作flash時是以sector為一個整體來操作
讀取操作是通過ESP8266 SDK提供的API將flash中的內容讀取到Buffer中是沒有限制一次就要將4K全讀完,Buffer的大小由EEPROM.begin(size)決定,但是由于Buffer大小會占用內存RAM,所以務必按照實際需要來定義大小
寫入操作是通過commit將flash eeprom地址的4K 存儲內容刪除后才將Buffer寫入flash中(也就是說就算你buffer只有4個字節,但是最終還是會刷新整個sector)
和標準的EEPROM庫不一樣的是,你需要在讀或者寫操作之前先通過 EEPROM.begin(size) 來聲明你需要操作的存儲大小,size取值范圍為4~4096字節
EEPROM.write() 不會立刻把內容寫進flash,如果你希望保持到flash去,那么你必須調用 EEPROM.commit()。當然,EEPROM.end() 不僅也能完成commit,同時會釋放申請的eeprom ram資源
EEPROM庫非常簡單:

函數:begin(size) 該功能用于申請具體大小的ram內存空間并從flash中讀取相應數據到內存
size:要申請的內存大小(size取值范圍為4~4096字節)
返回值:無
注意點:size必須大于0
雖然我們可以輸入自定義size,但是最終會經過計算得到真正的size(4的倍數),并申請對應的內存空間
函數:write(address,value) 該功能用于往內存空間寫入數據
address:要寫入的地址位置,取值范圍為內存空間的地址0~size
val:寫入的數據。
返回值:無
注意點:寫入的數據只是寫入到申請的內存空間,并不是立刻寫入到flash中
EEPROM其實是從外部flash中存儲器最末尾開辟的4096字節空間
【write只寫一個字節的數據,所以數據的值應該在0~255之間,超過255的數據寫入就不正確了】
函數:read(address) 該功能用于讀取數據操作
address:要讀取的地址位置,取值范圍為內存空間的地址0~size
返回值:返回存儲數據
注意點:讀取的數據也是從begin中生成的內存空間中去獲取,并不會直接操作flash
【read只讀一個字節的數據】
函數:commit() 該功能用于把內存空間的數據覆蓋到flash eeprom塊去
參數:無;
返回值:返回bool值,表示是否覆蓋成功;
注意點:這個方法才是真正的把數據從內存控件寫回到flash空間;
而且,寫回flash之前會把整一塊sector全部擦除掉,也就意味著就算我們begin(1)最終也是會擦除4096字節空間。但是size的大小決定了內存空間的剩余量以及回寫的快慢,所以根據具體情況來設置size
函數:end() 該功能用于寫入flash,并且釋放內存空間
參數:無
返回值:無
注意點:end包含了寫入flash,并且回收內存空間
建議讀者操作完EEPROM之后,必須調用這個方法,回收內存空間很重要
//功能描述:該代碼向EEPROM寫入100字節數據int addr = 0; //EEPROM數據地址void setup() {Serial.begin(115200);Serial.println("");Serial.println("開始寫write");EEPROM.begin(100);//申請內存并讀取flash中相應的數據到內存for(addr = 0; addr<100; addr++){int data = addr;EEPROM.write(addr, data); //寫數據}EEPROM.end(); //把數據寫入flash,并釋放內存Serial.println("結束write");}void loop() {}
int addr = 0; //EEPROM數據地址void setup() {Serial.begin(115200);Serial.println("");Serial.println("開始讀數據");EEPROM.begin(100);//申請100內存空間for(addr = 0; addr<100; addr++){int data = EEPROM.read(addr); //從內存中讀取一個字節數據Serial.println(data);delay(2);}EEPROM.end();}void loop() {}
以上再給出讀寫的demo~

接著又是一個初始化的工作
這個初始化的工作與飛機的姿態運算有關,是個大的主題放在接下來的飛行控制的篇目里面了~大家關注,點贊加在看哦~
