電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>Arduino藍(lán)牙低能耗跳傘高度計

Arduino藍(lán)牙低能耗跳傘高度計

2023-07-05 | zip | 0.32 MB | 次下載 | 免費

資料介紹

描述

背景:

我正在尋找一個跳傘數(shù)字高度計,發(fā)現(xiàn)它們在這里的價格約為 300 到 500 美元。不僅如此,它們中的大多數(shù)都具有三個按鈕,但它們在每個設(shè)備上執(zhí)行的功能并不相同。因此,我們必須閱讀手冊并記住每個功能的按鈕按下順序。

在本教程中,我們將大量提及Audible Abby ,因此,熟悉該項目會有所幫助。我收到的關(guān)于 Audible Abby 的反饋之一是“那么,您如何更改警報高度?”。老實說,如果你不了解 Arduino,那你就不走運了!

上述問題的解決方案是一個免費的 Android 藍(lán)牙低功耗 (BLE) 應(yīng)用程序,它允許您使用智能手機(jī)調(diào)整飛機(jī)的高度。啟動后,該應(yīng)用程序會連接到由安森美半導(dǎo)體RSL10-SENSE-DB-GEVK 提供支持的自制高度計 (ALTER)。

本教程的目的是教你如何釣魚,而不是僅僅看著我吃生魚片。您將學(xué)習(xí)如何進(jìn)行恢復(fù)出廠設(shè)置、創(chuàng)建 BLE Android 應(yīng)用程序、將 OLED 添加到您的項目中、從 RSL10-SENSE-DB-GEVK 中獲取更多 GPIO,以及應(yīng)對生活中的逆境。

一路走來,我會盡我所能來招待你,因為這將是一個很長的教程;所以,你可能想坐下。如果您已經(jīng)坐下,則無需采取進(jìn)一步行動。

軟件:沒有 ALTER 就無法拼寫高度計

這一步可能看起來很嚇人,但是一旦你知道了幾件事,它就真的很簡單了。Martyn Currey的教程展示了如何輕松創(chuàng)建免費的 Android 應(yīng)用程序以將您的手機(jī)連接到 BLE 設(shè)備。這里的問題是 UUID 看起來像這樣:

0000FFE0-0000-1000-8000-00805F9B34FB

如果您打開 BLE_ICS.h(在 Pack 文件夾中),您會看到如下內(nèi)容:

#define ICS_SERVICE_UUID { 0x24, 0xdc, 0x0e, 0x6e, 0x01, 0x40, \ 0xca, 0x9e, 0xe5, 0xa9, 0xa3, 0x00, \ 0xb5, 0xf3, 0x93, 0xe0 }

以下是如何將您的格式轉(zhuǎn)換為ai2.appinventor.mit.edu可用的格式

1 - 保留空格并刪除花括號、逗號和 0x 24 dc 0e 6e 01 40 ca 9e e5 a9 a3 00 b5 f3 93 e0

2 - 反轉(zhuǎn)所有對的順序(第一對變?yōu)樽詈?,最后一對變?yōu)榈谝唬?/font> e0 93 f3 b5 00 a3 a9 e5 9e ca 40 01 6e 0e dc 24

3 - 刪除空格 e093f3b500a3a9e59eca40016e0edc24

4 - 添加四個戰(zhàn)略破折號 e093f3b5-00a3-a9e5-9eca-40016e0edc24

您只需執(zhí)行一次,因為其他 UUID 僅相差幾位數(shù)。

讀取 = e093f3b6-00a3-a9e5-9eca-40026e0edc24

寫入 = e093f3b7-00a3-a9e5-9eca-40036e0edc24

pYYBAGOYqPyAYkUBAAGUKO10oeI019.png
所有的塊
?

如果你的藍(lán)牙模塊看起來不同,你必須看看這個:

?

基本上,在 4:24,您必須導(dǎo)入 BLE 擴(kuò)展。為了節(jié)省您的搜索時間,您可以從此頁面下載最新版。

以下是我們設(shè)想應(yīng)用程序的工作方式:

我們首先掃描 BLE 設(shè)備,然后我們使用計時器在稍有延遲后連接到 MAC 地址(您可以使用 RSL10 Sense and Control App 找到您的 MAC)。連接后,我們停止掃描,禁用計時器并啟用向上和向下按鈕。接下來,我們注冊字符串以偵聽 RSL10-SENSE-DB-GEVK 數(shù)據(jù)。我們需要一個將值寫回設(shè)備的過程。第一次使用此過程時,我們先發(fā)送 +1,然后發(fā)送 -1。這是啟動接收高度字符串強(qiáng)制刷新手機(jī)號碼所必需的。

同樣在這些塊中,我們有一個退出按鈕,以及幾個按鈕來增加和減少高度 50 英尺。收到字符串后,我們將刪除其中的括號并顯示當(dāng)前高度值。

我導(dǎo)出了 aia 文件,然后在本教程結(jié)束時將其上傳到項目存儲庫中的 Github。我試圖發(fā)布 appinventor 項目,但該網(wǎng)站不允許我發(fā)布。

poYBAGOYqP6AVvXwAAAaLhJwtCk539.png
?

硬件

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

poYBAGOYqQKAR-FpAAIYM-qJvCo074.png
連接板到 OLED
?
pYYBAGOYqQWAfv-0AAB3bMrn3QY512.png
調(diào)整 OLED 引腳以與電路板對齊并添加絕緣膠帶
?
pYYBAGOYqQeAU73xAAEFss6btzo076.png
適合牙線盒
?
poYBAGOYqQmAEGdoAAE_yDwljpg995.jpg
比 Audible Abby 更緊湊
?
?

在嘗試將 ALTER 移動到我可以像手表一樣戴在手上的情況下,我設(shè)法打破了第一個 OLED 顯示屏。此外,我損壞了第二個顯示器,雪上加霜,我在此過程中破壞了 SCL 和 SDA 針孔。現(xiàn)在是個人的。

這里有幾個選項可以推進(jìn)項目:

  • 像一些“制造商”在 YouTube 上做的那樣偽造它——如果你偽造它,你將永遠(yuǎn)無法做到
  • 買一塊新板——它只有 50 塊骨頭,喲
  • 使用 Arduino Pro Mini 從 RSL10-SENSE-DB-GEVK 上可用的最后一個引腳 (GIO) 獲取 UART 數(shù)據(jù),然后通過 Arduino 的 I2C 將其發(fā)送到 OLED

我開始沿著最后一個選項的路徑與我們尚未討論的另一個選項并行。

使用 Arduino Pro Mini 選項的問題之一是我擁有的兩個是 5V,與 RSL10-SENSE-DB-GEVK 或 OLED 電壓不兼容。我不僅要擴(kuò)大 CR2032 電源的尺寸以適應(yīng) OLED,還必須考慮另一塊板的電源要求。

我們將帶著懸念離開本節(jié),但在繼續(xù)下一節(jié)之前,我們將簡要討論一下外殼。

我必須能夠在瓶蓋內(nèi)安裝 Arduino Pro Mini 以及 RSL10-SENSE-DB-GEVK、OLED 和電池。最重要的是,它必須是藍(lán)色的。

?
poYBAGOYqRaAAZJsAACjfiV3HqI363.jpg
?
1 / 6 ?第 1 步:找一個藍(lán)色瓶蓋的瓶子
?

固件:

當(dāng)我開始使用 Eclipse 時,我沒有任何使用經(jīng)驗,但是我能夠使用這個文檔進(jìn)行恢復(fù)出廠設(shè)置。我很快意識到我必須找到一個例子來修改和在這個項目中使用。

pYYBAGOYqRiARgU1AABNl-By-zE780.png
這是我的出發(fā)點
?

我選擇了“自定義服務(wù)固件”,因為它具有 BLE 和 BME680 代碼。它也沒有深度睡眠代碼帶來的并發(fā)癥。如果代碼太多,您可以隨時刪除或注釋掉,就像我們即將在這里做的那樣。如果這看起來工作量太大,請不要擔(dān)心,我在本教程結(jié)束時將最終的工作合并代碼上傳到 Github 項目存儲庫。

如果您想了解更多信息,請繼續(xù)閱讀,或者直接跳到下一部分。

就像 Audible Abby 一樣,ALTER 需要計算高度。我們將使用來自車載集成傳感器的壓力和溫度數(shù)據(jù)來計算地面以上值的變化。ALTER 還需要在 OLED 屏幕上顯示實時高度,但 ON Semiconductor IDE 中沒有示例說明如何做到這一點。我嘗試了幾件事,但拯救的是一個不太可能的項目,這是我在 2019 年唯一沒有贏得的比賽。

我從這里獲取了 5 個文件,并對其進(jìn)行了修改,以使它們與 RSL10-SENSE-DB-GEVK 一起使用,就像使用 Azure Sphere Starter-Kit 一樣。我將這些文件放在工作區(qū)的 2 個文件夾中:

  • src\oled.c
  • src\sd1306.c
  • 包括\font.h
  • 包括\oled.h
  • 包括\sd1306.h

運行代碼會導(dǎo)致一些錯誤,這很好,因為我可以注釋掉導(dǎo)致問題的代碼。這是我為清理這個爛攤子所做的事情:

  • 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 行變?yōu)椋?/font>retval = HAL_I2C_Write(addr, data_to_send, 2, false); //I2CMaster_Write(i2cFd, addr, data_to_send, 2); 第 73 行變?yōu)椋?/font>retval = HAL_I2C_Write(addr, data_to_send, 1025, false); //I2CMaster_Write(i2cFd, addr, data_to_send, 1025);
  • font.h我確實修改了該文件以使 0 和 1 看起來更好。您會認(rèn)為微控制器可以使這兩個正確!{0x3E, 0x51, 0x49, 0x45, 0x3E} 變?yōu)?{0x3E, 0x41, 0x41, 0x41, 0x3E} {0x04, 0x02, 0x7F, 0x00, 0x00} 變?yōu)?{0x00, 0x02, 0x7F, 0x00, 0x00}

您會在 oled.c 中找到的另一件事是從第 698 行開始的徽標(biāo)?;ヂ?lián)網(wǎng)上有很多關(guān)于如何創(chuàng)建自己的 OLED 徽標(biāo)的教程。我使用了 LCDAssistant ,但您也可以使用http://javl.github.io/image2cpp/這是一個在線解決方案,可以將圖像轉(zhuǎn)換為 C 可以理解的數(shù)字。

在我們繼續(xù)固件之前,讓我們回到硬件部分。還記得我說過我沒有 SCL 或 SDA 嗎?這意味著 src\sd1306.c 中的第 48 行和第 73 行將無法向 OLED 發(fā)送任何內(nèi)容。我剛剛添加了它們,因為你可能還有你的 I2C 引腳。

如果你想使用 UART,你必須在里面找到并修改 PinNames.h

C:\Users\<...>\PACK\ONSemiconductor\BDK\1.12.1\include\target\RSL10_SENSEPIN_UART_TX = NC 和 PIN_GIO_SPARE = PIN_DIO3替換為PIN_UART_TX = PIN_DIO3 和 PIN_GIO_SPARE = NC

由于我也沒有使用 UART,正如您很快就會發(fā)現(xiàn)的那樣,我對 PinNames.h 所做的唯一更改是 PIN_BUTTON0 = NC 和 PIN_GIO_SPARE = NC。

UART 對我來說是 B 計劃,因為我正在努力制作與 I2C 功能相似的東西。就在那時我發(fā)現(xiàn)了 Bit Banging(是的,它聽起來很酷)。那里有很多 Bit Bangers,但我發(fā)現(xiàn)Kevin Darrah的教程對于理解 I2C 協(xié)議的基礎(chǔ)知識非常有用。我還必須使用GreatScott的教程來學(xué)習(xí)端口操作的概念。RSL10-SENSE-DB-GEVK 不是 Arduino,因此,我不得不相應(yīng)地調(diào)整代碼。想知道為什么我們需要端口操作嗎?

?

您可能會說“UART 只需要一根線,但 I2C 需要兩根線。您只剩下一個位置可以在板上焊接一根線。您將如何實現(xiàn) Bit Banging I2C?” 我回復(fù):

poYBAGOYqRuAUpXEAAEiN7MjXzM864.jpg
將另一根電線焊接到 DIY GPIO 的按鈕上
?

ICYMI,我將一根電線焊接到一個按鈕的未接地側(cè)。

在 sd1306.c 第 49 行現(xiàn)在是:retval = SWI2C(data_to_send, 2); 現(xiàn)在第 74 行是:retval = SWI2C(data_to_send, 1025);

我們還需要兩個文件:BitBanging.c 和 BitBanging.h。確保將 #include 添加到 main.c。您還應(yīng)該添加 BitBanging_Init(); 在無限循環(huán)和 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 中,您需要將以下內(nèi)容添加到 CS_Loop(當(dāng)然,在“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 行,只是為了在數(shù)字之間添加一些空格。最后,注釋掉 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;博士:

pYYBAGOYqSCAdAN3AAB7eAptsSw699.jpg
?

。

?

。

?

結(jié)論:

在構(gòu)建這個項目時,我花了數(shù)百個小時享受樂趣和學(xué)習(xí)。在沒有任何特殊門戶、額外的 MCU 甚至外部傳感器的情況下,我能夠如此快速地推出最小可行產(chǎn)品給我留下了深刻的印象。對我來說,這真的很強(qiáng)大。回顧之前的比賽,很多提交的作品都是使用硬件和軟件,幾乎沒有修改,但這不是我的 MO 同時,我希望我的定制是可重現(xiàn)和可維護(hù)的,啟用 RSL10-SENSE-DB-GEVK 的靈活性我來改變我的想法。

ALTER 只是一個開始,可以擴(kuò)展到記錄跳躍、總自由落體時間、垂直速度等。它也可以被修改以供飛行員使用,他們通過 BLE 應(yīng)用程序更新氣壓以獲得飛行中的準(zhǔn)確高度在 OLED 顯示屏上。天空才是極限!

我希望你發(fā)現(xiàn)這個項目很有用,并且和我一樣喜歡它。我不希望看到很多使用 BLE、OLED 甚至 GPIO 的提交。因此,我希望安森美半導(dǎo)體可以使用這個項目或其中的一部分作為示例,讓其他人從中受益并在此基礎(chǔ)上再接再厲。

pYYBAGOYqS-AYwRSAAPpXC2r6Sg750.jpg
開啟!
?

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關(guān)電源設(shè)計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設(shè)計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費