資料介紹
描述
背景:
我正在尋找一個跳傘數字高度計,發現它們在這里的價格約為 300 到 500 美元。不僅如此,它們中的大多數都具有三個按鈕,但它們在每個設備上執行的功能并不相同。因此,我們必須閱讀手冊并記住每個功能的按鈕按下順序。
在本教程中,我們將大量提及Audible Abby ,因此,熟悉該項目會有所幫助。我收到的關于 Audible Abby 的反饋之一是“那么,您如何更改警報高度?”。老實說,如果你不了解 Arduino,那你就不走運了!
上述問題的解決方案是一個免費的 Android 藍牙低功耗 (BLE) 應用程序,它允許您使用智能手機調整飛機的高度。啟動后,該應用程序會連接到由安森美半導體的 RSL10-SENSE-DB-GEVK 提供支持的自制高度計 (ALTER)。
本教程的目的是教你如何釣魚,而不是僅僅看著我吃生魚片。您將學習如何進行恢復出廠設置、創建 BLE Android 應用程序、將 OLED 添加到您的項目中、從 RSL10-SENSE-DB-GEVK 中獲取更多 GPIO,以及應對生活中的逆境。
一路走來,我會盡我所能來招待你,因為這將是一個很長的教程;所以,你可能想坐下。如果您已經坐下,則無需采取進一步行動。
軟件:沒有 ALTER 就無法拼寫高度計
這一步可能看起來很嚇人,但是一旦你知道了幾件事,它就真的很簡單了。Martyn Currey的教程展示了如何輕松創建免費的 Android 應用程序以將您的手機連接到 BLE 設備。這里的問題是 UUID 看起來像這樣:
0000FFE0-0000-1000-8000-00805F9B34FB
如果您打開 BLE_ICS.h(在 Pack 文件夾中),您會看到如下內容:
#define ICS_SERVICE_UUID { 0x24, 0xdc, 0x0e, 0x6e, 0x01, 0x40, \ 0xca, 0x9e, 0xe5, 0xa9, 0xa3, 0x00, \ 0xb5, 0xf3, 0x93, 0xe0 }
以下是如何將您的格式轉換為ai2.appinventor.mit.edu可用的格式:
1 - 保留空格并刪除花括號、逗號和 0x 24 dc 0e 6e 01 40 ca 9e e5 a9 a3 00 b5 f3 93 e0
2 - 反轉所有對的順序(第一對變為最后,最后一對變為第一) e0 93 f3 b5 00 a3 a9 e5 9e ca 40 01 6e 0e dc 24
3 - 刪除空格 e093f3b500a3a9e59eca40016e0edc24
4 - 添加四個戰略破折號 e093f3b5-00a3-a9e5-9eca-40016e0edc24
您只需執行一次,因為其他 UUID 僅相差幾位數。
讀取 = e093f3b6-00a3-a9e5-9eca-40026e0edc24
寫入 = e093f3b7-00a3-a9e5-9eca-40036e0edc24

如果你的藍牙模塊看起來不同,你必須看看這個:
基本上,在 4:24,您必須導入 BLE 擴展。為了節省您的搜索時間,您可以從此頁面下載最新版本。
以下是我們設想應用程序的工作方式:
我們首先掃描 BLE 設備,然后我們使用計時器在稍有延遲后連接到 MAC 地址(您可以使用 RSL10 Sense and Control App 找到您的 MAC)。連接后,我們停止掃描,禁用計時器并啟用向上和向下按鈕。接下來,我們注冊字符串以偵聽 RSL10-SENSE-DB-GEVK 數據。我們需要一個將值寫回設備的過程。第一次使用此過程時,我們先發送 +1,然后發送 -1。這是啟動接收高度字符串強制刷新手機號碼所必需的。
同樣在這些塊中,我們有一個退出按鈕,以及幾個按鈕來增加和減少高度 50 英尺。收到字符串后,我們將刪除其中的括號并顯示當前高度值。
我導出了 aia 文件,然后在本教程結束時將其上傳到項目存儲庫中的 Github。我試圖發布 appinventor 項目,但該網站不允許我發布。

硬件:
我非常喜歡 RSL10-SENSE-DB-GEVK 硬件,我考慮從本節開始而不是軟件。板上有五個孔,其中四個可用于 I2C 連接。我有一個 OLED 正在等待一個項目,所以我將它直接焊接到 RSL10-SENSE-DB-GEVK。




在嘗試將 ALTER 移動到我可以像手表一樣戴在手上的情況下,我設法打破了第一個 OLED 顯示屏。此外,我損壞了第二個顯示器,雪上加霜,我在此過程中破壞了 SCL 和 SDA 針孔。現在是個人的。
這里有幾個選項可以推進項目:
- 像一些“制造商”在 YouTube 上做的那樣偽造它——如果你偽造它,你將永遠無法做到
- 買一塊新板——它只有 50 塊骨頭,喲
- 使用 Arduino Pro Mini 從 RSL10-SENSE-DB-GEVK 上可用的最后一個引腳 (GIO) 獲取 UART 數據,然后通過 Arduino 的 I2C 將其發送到 OLED
我開始沿著最后一個選項的路徑與我們尚未討論的另一個選項并行。
使用 Arduino Pro Mini 選項的問題之一是我擁有的兩個是 5V,與 RSL10-SENSE-DB-GEVK 或 OLED 電壓不兼容。我不僅要擴大 CR2032 電源的尺寸以適應 OLED,還必須考慮另一塊板的電源要求。
我們將帶著懸念離開本節,但在繼續下一節之前,我們將簡要討論一下外殼。
我必須能夠在瓶蓋內安裝 Arduino Pro Mini 以及 RSL10-SENSE-DB-GEVK、OLED 和電池。最重要的是,它必須是藍色的。

固件:
當我開始使用 Eclipse 時,我沒有任何使用經驗,但是我能夠使用這個文檔進行恢復出廠設置。我很快意識到我必須找到一個例子來修改和在這個項目中使用。

我選擇了“自定義服務固件”,因為它具有 BLE 和 BME680 代碼。它也沒有深度睡眠代碼帶來的并發癥。如果代碼太多,您可以隨時刪除或注釋掉,就像我們即將在這里做的那樣。如果這看起來工作量太大,請不要擔心,我在本教程結束時將最終的工作合并代碼上傳到 Github 項目存儲庫。
就像 Audible Abby 一樣,ALTER 需要計算高度。我們將使用來自車載集成傳感器的壓力和溫度數據來計算地面以上值的變化。ALTER 還需要在 OLED 屏幕上顯示實時高度,但 ON Semiconductor IDE 中沒有示例說明如何做到這一點。我嘗試了幾件事,但拯救的是一個不太可能的項目,這是我在 2019 年唯一沒有贏得的比賽。
我從這里獲取了 5 個文件,并對其進行了修改,以使它們與 RSL10-SENSE-DB-GEVK 一起使用,就像使用 Azure Sphere Starter-Kit 一樣。我將這些文件放在工作區的 2 個文件夾中:
- src\oled.c
- src\sd1306.c
- 包括\font.h
- 包括\oled.h
- 包括\sd1306.h
運行代碼會導致一些錯誤,這很好,因為我可以注釋掉導致問題的代碼。這是我為清理這個爛攤子所做的事情:
- sd1306.h像這樣注釋掉第 8 行和第 9 行//#include "i2c.h" //#include 并添加#include
- oled.h像這樣注釋掉第 9、10、11 和 58 行//#include "applibs_versions.h" //#include //#include "deviceTwin.h" //uint8_t SSID[ WIFICONFIG_SSID_MAX_LENGTH];
- oled.c像這樣注釋掉第 24、25、26、27、64、65、66、67 和 287行 //extern uint8_t oled_ms1[CLOUD_MSG_SIZE]; //extern uint8_t oled_ms2[CLOUD_MSG_SIZE]; //extern uint8_t oled_ms3[CLOUD_MSG_SIZE]; //extern uint8_t oled_ms4[CLOUD_MSG_SIZE]; //sd1306_draw_string(OLED_LINE_1_X, OLED_LINE_1_Y, oled_ms1, FONT_SIZE_LINE, white_pixel); //sd1306_draw_string(OLED_LINE_2_X, OLED_LINE_2_Y, oled_ms2, FONT_SIZE_LINE, white_pixel); //sd1306_draw_string(OLED_LINE_3_X, OLED_LINE_3_Y, oled_ms3, FONT_SIZE_LINE, white_pixel); //sd1306_draw_string(OLED_LINE_4_X, OLED_LINE_4_Y, oled_ms4, FONT_SIZE_LINE, white_pixel); //sd1306_draw_string(sizeof(str_SSID)*6, OLED_LINE_1_Y, network_data.SSID, FONT_SIZE_LINE, white_pixel);
- sd1306.c我們這里有幾行不能只注釋掉;我們必須找到替代品。第 48 行變為:retval = HAL_I2C_Write(addr, data_to_send, 2, false); //I2CMaster_Write(i2cFd, addr, data_to_send, 2); 第 73 行變為:retval = HAL_I2C_Write(addr, data_to_send, 1025, false); //I2CMaster_Write(i2cFd, addr, data_to_send, 1025);
- font.h我確實修改了該文件以使 0 和 1 看起來更好。您會認為微控制器可以使這兩個正確!{0x3E, 0x51, 0x49, 0x45, 0x3E} 變為 {0x3E, 0x41, 0x41, 0x41, 0x3E} {0x04, 0x02, 0x7F, 0x00, 0x00} 變為 {0x00, 0x02, 0x7F, 0x00, 0x00}
您會在 oled.c 中找到的另一件事是從第 698 行開始的徽標。互聯網上有很多關于如何創建自己的 OLED 徽標的教程。我使用了 LCDAssistant ,但您也可以使用http://javl.github.io/image2cpp/這是一個在線解決方案,可以將圖像轉換為 C 可以理解的數字。
在我們繼續固件之前,讓我們回到硬件部分。還記得我說過我沒有 SCL 或 SDA 嗎?這意味著 src\sd1306.c 中的第 48 行和第 73 行將無法向 OLED 發送任何內容。我剛剛添加了它們,因為你可能還有你的 I2C 引腳。
如果你想使用 UART,你必須在里面找到并修改 PinNames.h
C:\Users\<...>\PACK\ONSemiconductor\BDK\1.12.1\include\target\RSL10_SENSE將PIN_UART_TX = NC 和 PIN_GIO_SPARE = PIN_DIO3替換為PIN_UART_TX = PIN_DIO3 和 PIN_GIO_SPARE = NC
由于我也沒有使用 UART,正如您很快就會發現的那樣,我對 PinNames.h 所做的唯一更改是 PIN_BUTTON0 = NC 和 PIN_GIO_SPARE = NC。
UART 對我來說是 B 計劃,因為我正在努力制作與 I2C 功能相似的東西。就在那時我發現了 Bit Banging(是的,它聽起來很酷)。那里有很多 Bit Bangers,但我發現Kevin Darrah的教程對于理解 I2C 協議的基礎知識非常有用。我還必須使用GreatScott的教程來學習端口操作的概念。RSL10-SENSE-DB-GEVK 不是 Arduino,因此,我不得不相應地調整代碼。想知道為什么我們需要端口操作嗎?
您可能會說“UART 只需要一根線,但 I2C 需要兩根線。您只剩下一個位置可以在板上焊接一根線。您將如何實現 Bit Banging I2C?” 我回復:

ICYMI,我將一根電線焊接到一個按鈕的未接地側。
在 sd1306.c 第 49 行現在是:retval = SWI2C(data_to_send, 2); 現在第 74 行是:retval = SWI2C(data_to_send, 1025);
我們還需要兩個文件:BitBanging.c 和 BitBanging.h。確保將 #include 添加到 main.c。您還應該添加 BitBanging_Init(); 在無限循環和 SendAltitudeToDisplay() 之前;在里面。
在 C:\Users\<...>\PACK\ONSemiconductor\BDK\1.12.1\source\firmware\BoardSupport\hb\src\ics 中找到 CS.c 并在頂部添加以下行:
#include <BitBanging.h>
#include
int InitialAlt = -9999;
int OffsetAlt;
int AGL;
int PreviousAGL = -9999;
您還需要添加幾個程序:
int CalculateAltitude(float P, float T) {
// Get Altitude from Pressure and Temperature
return (int) ((pow(P / 101.325, 0.190223) - 1) * (T * 280.4137 + 128897.8));
}
void SendAltitudeToDisplay(void) {
// Save the response values
float ResponseP, ResponseT;
// Send a request in a specific format
cs.node[1]->request_handler((struct CS_Request_Struct[] ) {{ "5", "EV", "P" }}, cs_node_response);
// Save Pressure value
ResponseP = atof(&cs_node_response[2]);
if (ResponseP != 0.00) {
// Send a request in a specific format
cs.node[1]->request_handler((struct CS_Request_Struct[] ) {{ "6", "EV","T" }}, cs_node_response);
// Save Temperature value
ResponseT = atof(&cs_node_response[2]);
// Right align text on OLED
char TextBuffer[5];
// Check if baseline altitude has been set
if (InitialAlt == -9999) {
// Set baseline
InitialAlt = CalculateAltitude(ResponseP, ResponseT);
} else {
// Measure from baseline and take into account external Altitude adjustment
AGL = InitialAlt - CalculateAltitude(ResponseP, ResponseT) + OffsetAlt;
// Less than 1000 feet
if (AGL < 1000) {
// Print into 4 places to right align text on OLED
snprintf(TextBuffer, sizeof(TextBuffer), "%4d", AGL);
} else {
// Less than 10000
if (AGL < 10000) {
// Print whole number into two places and one after the decimal
snprintf(TextBuffer, sizeof(TextBuffer), "%2d.%d",AGL / 1000, AGL % 1000 / 100);
} else {
// Just use all of OLED
snprintf(TextBuffer, sizeof(TextBuffer), "%d.%d",AGL / 1000, AGL % 1000 / 100);
}
}
// Send to OLED if it has been more than 0.2 seconds since last update
////if (HAL_Time() - TimeStamp > 200) {
//sd1306_draw_string(0, 15, TextBuffer, 5, white_pixel);
// Loop through digits
for (uint16_t k = 0; k < 4; k++) {
// Remove ASCII offset
char digit = TextBuffer[k] - 48;
// Adjust if decimal point or negative
if (digit < 0) digit = digit + 13;
// Loop through pages
for (uint16_t j = 0; j < 8; j++)
// Columns of each page
for (uint16_t i = j * 128; i < j * 128 + 32; i++)
// Copy to OLED buffer in specific order
if (digit >= 0)
oled_buffer[i + k * 32] = Image_num_bmp[i - (j * 128) + (j * 32) + (digit * 256)];
else
// If blank
oled_buffer[i + k * 32] = 0x00;
}
// Send OLED buffer to sd1306
WriteBufferToDisplay();
// Send via BLE only if AGL value has changed
if (PreviousAGL != AGL) CS_PlatformWrite(TextBuffer, sizeof(TextBuffer));
TimeStamp = HAL_Time();
PreviousAGL = AGL;
////}
}
}
}
此外,在 CS.c 中,您需要將以下內容添加到 CS_Loop(當然,在“int errcode, bytes, i;”之后)
// Read available BLE packet
memset(cs_rx_buffer, 0, 21);
CS_PlatformRead(cs_rx_buffer, 21, &bytes);
// New packet available
if (bytes > 0) {
// New AGL offset
OffsetAlt = OffsetAlt + atoi(cs_rx_buffer);
// Fore update BLE
PreviousAGL = -9999;
}
// We're done here
return 0;
我插入了 x = x+ 大??;在 sd1306.c 的第 770 行,只是為了在數字之間添加一些空格。最后,注釋掉 main.c 中的以下幾行以獲得急需的速度:ASSERT_ALWAYS(CSN_ALS_CheckAvailability() == true); ASSERT_ALWAYS(CS_RegisterNode(CSN_ALS_Create()) == CS_OK); ASSERT_ALWAYS(CSN_AO_CheckAvailability() == true); ASSERT_ALWAYS(CS_RegisterNode(CSN_AO_Create()) == CS_OK); ASSERT_ALWAYS(CS_RegisterNode(CSN_PB_Create()) == CS_OK);
TL;博士:

。
。
結論:
在構建這個項目時,我花了數百個小時享受樂趣和學習。在沒有任何特殊門戶、額外的 MCU 甚至外部傳感器的情況下,我能夠如此快速地推出最小可行產品給我留下了深刻的印象。對我來說,這真的很強大。回顧之前的比賽,很多提交的作品都是使用硬件和軟件,幾乎沒有修改,但這不是我的 MO 同時,我希望我的定制是可重現和可維護的,啟用 RSL10-SENSE-DB-GEVK 的靈活性我來改變我的想法。
ALTER 只是一個開始,可以擴展到記錄跳躍、總自由落體時間、垂直速度等。它也可以被修改以供飛行員使用,他們通過 BLE 應用程序更新氣壓以獲得飛行中的準確高度在 OLED 顯示屏上。天空才是極限!
我希望你發現這個項目很有用,并且和我一樣喜歡它。我不希望看到很多使用 BLE、OLED 甚至 GPIO 的提交。因此,我希望安森美半導體可以使用這個項目或其中的一部分作為示例,讓其他人從中受益并在此基礎上再接再厲。

?
- 火箭高度計開源硬件
- 基于Arduino的9美元可聽高度計
- 如何構建藍牙低能耗跳傘高度計
- 針對汽車無線連接應用市場,TI再推 SimpleLink? 低能耗藍牙產品
- ERM和LRA觸覺參考設計 具有Bluetooth reg低能耗遠程
- UART至Bluetooth reg低能耗(BLE)橋參考設計
- 探討高度計在健身追蹤器中的作用 17次下載
- KT6368A藍牙低能耗標準電路原理圖免費下載 25次下載
- BLE藍牙低能耗模塊測試報告的詳細資料說明 24次下載
- 基于模糊控制的低能耗分簇協議 10次下載
- 基于低能耗的觸摸感應延長電池壽命的解決方法 11次下載
- 用于電子產品的硅高度計的設計 6次下載
- 基于CC2541的藍牙低能耗2.4GHz應用 28次下載
- 藍牙低能耗技術并不僅僅是另一種藍牙技術——它是一種全新的技術 3次下載
- 低能耗三輸入AND_XOR門的設計 0次下載
- MS4525DO-SS3BJ015AS氣壓計怎么換算高度 669次閱讀
- 產品介紹:i.MX 93應用處理器,賦能更加安全智能的邊緣應用 1639次閱讀
- 基于多組分的WLED結構的特點 1324次閱讀
- 基于Arduino UNO和HC-05藍牙模塊控制伺服電機 5095次閱讀
- dfrobot模擬聲級計/分貝計/噪音計簡介 2373次閱讀
- dfrobot模擬PH計 (Arduino兼容)簡介 2118次閱讀
- 基于容量證明的共識機制PoC介紹 2219次閱讀
- 如何才能使用CC2541藍牙模塊與單片機進行串口通信 1.1w次閱讀
- 新能源汽車在炎熱的夏天安全性能如何 736次閱讀
- 片上光網絡及其關鍵低能耗光子集成器件 2151次閱讀
- 如何制作一個帶藍牙功能的電子體溫計? 1.3w次閱讀
- 植物工廠關鍵技術及系統集成或將LED植物照明技術助推到新的高度 1.1w次閱讀
- 基于低能耗藍牙的半雙工語音通信 1738次閱讀
- 支持藍牙連接的低能耗可穿戴醫療健康參考設計精選 770次閱讀
- 技術前瞻:未來冷存儲技術解決方案 1790次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論