女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內(nèi)不再提示

如何使用RUI3制作一款用于電腦的多功能LoRa?適配器

瑞科慧聯(lián)(RAK) ? 2022-11-29 14:33 ? 次閱讀

LoRa?和 LoRaWAN?已經(jīng)成為了物聯(lián)網(wǎng)世界的重要技術(shù),也向人們提供了諸多易于使用的遠(yuǎn)程通信解決方案。在這過(guò)程中電腦設(shè)備卻被忽略了,我們會(huì)發(fā)現(xiàn)帶有 LoRa?模塊的筆記本電腦很少見(jiàn)。

現(xiàn)在這種局面陸續(xù)得到了改善,在一些解決方案中,已經(jīng)開(kāi)始出現(xiàn)用于筆記本電腦的 LoRa?模塊了。最近筆者利用瑞科慧聯(lián)的低代碼開(kāi)發(fā)平臺(tái) RUI3 制作了一個(gè) LoRa?USB 適配器,它可以直接連接到筆記本電腦或樹(shù)莓派上。大多數(shù)時(shí)候,這個(gè)適配器可以作為收發(fā)器用于家居場(chǎng)景種;但它也作為一個(gè)方便測(cè)試的平臺(tái),比如:遠(yuǎn)程用筆記本電腦發(fā)送命令、記錄結(jié)果等等。

poYBAGOFeB-AKC3yAABUGPoWbhU732.png

使用瑞科慧聯(lián)的模塊化硬件開(kāi)發(fā)平臺(tái) WisBlock,讓這樣的應(yīng)用開(kāi)發(fā)變得更加簡(jiǎn)單。筆者通過(guò) WisBlock 制作了兩種適配器,一種是使用計(jì)算機(jī)上的自定義軟件來(lái)管理 LoRa?模塊的 AT 固件,另一種是直接在LoRa?模塊上完成大部分工作。在這兩種適配器中,電腦都是作為終端來(lái)使用。今天要介紹的是后一種適配器,主要就是使用 RUI3 為 LoRa?通信模塊 RAK4631-R 制作一個(gè)簡(jiǎn)單的自定義固件。

一、前期準(zhǔn)備

  • 硬件

1、選擇 RAK4631-R(不同國(guó)家或地區(qū)對(duì)應(yīng)頻率的頻段不同)。

poYBAGOFeB-Aa7o2AALW9vCoSKQ801.png(注意,這里我們也可以使用另一款通信模塊 RAK3172,因?yàn)樗麄兙С?RUI3 編譯,只要有自己所需要的功能就行。因?yàn)?RAK3172 不支持藍(lán)牙和硬件加密,但該項(xiàng)目需要加密 LoRa??數(shù)據(jù)包,而且將 AES128 添加到代碼中也超出了本文的范圍,所以這里我們選擇了 RAK4631-R。)

2、底板:本例中,我們選擇了 RAK19003,它具有最小的封裝尺寸 30 mm x 35 mm。

3、USB 電纜(適用于 RAK19003 的 USBType-C)。

  • 軟件

1、Arduino IDE。

2、終端應(yīng)用程序,例如筆者最喜歡的 CoolTerm。當(dāng)然 Arduino IDE 的串行終端,也能完成開(kāi)發(fā)。

  • 工作模式

LoRa?適配器基本上需要兩種工作模式:傳輸模式和設(shè)置模式。而 AT固件本質(zhì)上是單模模式的,即它們總是處于設(shè)置模式。在設(shè)置模式中,甚至發(fā)送和接收都是命令。與此相反,默認(rèn)的傳輸模式充當(dāng) LoRa?模塊和 USB端口之間的橋梁:“無(wú)論一端輸入任何內(nèi)容,都將從另一端輸出”。只有當(dāng)用戶發(fā)出特殊字符串時(shí),適配器才會(huì)在傳輸和設(shè)置模式之間切換。 筆者見(jiàn)過(guò)一些 LoRa?模塊為此提供一兩個(gè)引腳來(lái)實(shí)現(xiàn)這一點(diǎn),可以設(shè)置引腳高低電平從硬件上切換這兩種模式,但這樣的操作對(duì)電腦來(lái)說(shuō)是不可能的。因此,用戶可以使用不太可能出現(xiàn)的特殊字符串去切換這兩種模式。然而在調(diào)制解調(diào)器時(shí)代,“$$$”經(jīng)常作為特殊的字符串去使用,所以我們也可以使用該字符串實(shí)現(xiàn)。

二、工作流程

在常規(guī)的 LoRa?應(yīng)用程序中,工作流程通常如下:

  • 初始化串口
  • 設(shè)置 Wire,然后設(shè)置 LoRa?模塊(引腳分配等)
  • 設(shè)置 LoRa?配置(SF、BW、頻率等)

本文使用到 RUI3,因此可直接去掉第二點(diǎn),因?yàn)?API 已經(jīng)配置完成、電池也配置好了。在RUI的 API中,LoRaWAN?是提供了LoRa選項(xiàng)區(qū)域幫助用戶配置 LoRa?。并且LoRa?模塊在 RAK4631-R 中是預(yù)先連通的,所以只需調(diào)用 LoRaWAN?的幾行 API 設(shè)置所需的配置,就可以檢查結(jié)果:

bool rslt = api.lorawan.nwm.set(0); if (!rslt) { // Do something } rslt = api.lorawan.pfreq.set(myFreq); if (!rslt) { // Do something } rslt = api.lorawan.psf.set(sf); if (!rslt) { // Do something } rslt = api.lorawan.pbw.set(bw); if (!rslt) { // Do something } // etc etc etc...

通過(guò)檢查,已經(jīng)設(shè)置完成了,結(jié)果與 API設(shè)定的配置是一致的。

然后設(shè)置 LoRa?回調(diào):接收和傳輸。這里讓用戶能夠以異步方式將“管理這些事件的代碼”單獨(dú)管理運(yùn)行,而不是在主 loop() 代碼中循環(huán)運(yùn)行。

最后一行是為了將 LoRa?模塊設(shè)置為了永久監(jiān)聽(tīng)模式。

api.lorawan.registerPRecvCallback(recv_cb); api.lorawan.registerPSendCallback(send_cb); rslt = api.lorawan.precv(65534);

最后,就可以在 setup()中完成自己的需求了。例如:讓 OLED 檢查狀態(tài),或設(shè)置 LED的狀態(tài)(電路板上有 2 個(gè)可用,1 個(gè)綠色和 1 個(gè)藍(lán)色)等。到這一步一切都準(zhǔn)備好了,一起來(lái)看看接下來(lái)會(huì)發(fā)生什么?

三、loop()

在 loop() 中,循環(huán)檢查串行端口是否有字符傳入,并對(duì)其進(jìn)行相應(yīng)的操作。稍后我會(huì)詳細(xì)介紹這一點(diǎn)。接著還需要檢查 LoRa?模塊,如果有接收到數(shù)據(jù)包,則將接收數(shù)據(jù)包中的內(nèi)容打印到串口上。這是兩個(gè)部分之間的橋梁。在其他框架中,這通常與串口相同。接著 LoRa?模塊循環(huán)監(jiān)聽(tīng),如果有內(nèi)容,直接讀取。這個(gè)功能 RUI3中并不包含,需要在上面聲明的 void recv_cb(rui_lora_p2p_recv_t data) 函數(shù)中自己實(shí)現(xiàn)并進(jìn)行,在將LoRa?模塊接收的原始數(shù)據(jù)發(fā)送到 Serial 之前,可以在這個(gè)函數(shù)中決定如何處理原始數(shù)據(jù)。例如:如果需要 JSON 數(shù)據(jù),可以將其解析之后在打印到串口。同樣,如果數(shù)據(jù)是加密的,或者希望它是加密的,就可以在進(jìn)一步處理之前在那進(jìn)行解密。回調(diào)函數(shù)代碼如下所示:

void recv_cb(rui_lora_p2p_recv_t data) { uint16_t ln = data.BufferSize; char plainText[ln + 1] = {0}; char buff[92]; sprintf(buff, "Incoming message, length: %d, RSSI: %d, SNR: %d", data.BufferSize, data.Rssi, data.Snr); Serial.println(buff); if (needAES) { // Do we need to decrypt the data? int rslt = aes.Process((char*)data.Buffer, ln, myIV, myPWD, 16, plainText, aes.decryptFlag, aes.ecbMode); if (rslt < 0) { Serial.printf("Error %d in Process ECB Decrypt\n", rslt); return; } } else { // No? Just copy the data memcpy(plainText, data.Buffer, ln); } // The easiest way to know whether the data is a JSON packet is to try and decode it :-) StaticJsonDocument<200> doc; DeserializationError error = deserializeJson(doc, plainText); if (!error) { JsonObject root = doc.as(); // using C++11 syntax (preferred): for (JsonPair kv : root) { sprintf(buff, " * %s: %s", kv.key().c_str(), kv.value().as()); Serial.println(buff); } return; // End for JSON messages } // There was an error, so this is not a JSON packet – not well-formed anyway. // Print it as a plain message Serial.println("Message:"); Serial.println(plainText); }

四、Tx(發(fā)送)

發(fā)送同樣也有一個(gè)回調(diào)函數(shù),當(dāng)數(shù)據(jù)發(fā)送完成時(shí)可調(diào)用。用戶也可以在那里添加?xùn)|西,但它在正常使用中基本上是為了確保LoRa?模塊返回到監(jiān)聽(tīng)模式中:

void send_cb(void) { // TX callback Serial.println("Tx done!"); isSending = false; // Flag used to determine whether we're still sending something or we're free to send. api.lorawan.precv(65534); }

該回調(diào)函數(shù)需要快速的執(zhí)行并使 Lora?模塊返回到監(jiān)聽(tīng)模式,不需要在其中加入長(zhǎng)延時(shí)等待。

五、設(shè)置模式

當(dāng)用戶發(fā)送 $$$(后綴為 \n)時(shí),代碼會(huì)切換到設(shè)置模式。這部分稍微復(fù)雜一些,發(fā)送命令這一段會(huì)重復(fù)被使用,所以為了使用方便,大部分都是復(fù)制粘貼后,對(duì)該段進(jìn)行更改其函數(shù)名,并為每個(gè)命令添加合適的代碼。因此我們需要一個(gè)統(tǒng)一的命令結(jié)構(gòu),如下所示:

int cmdCount = 0; struct myCommand { void (*ptr)(char *); // Function pointer char name[12]; char help[48]; };

(cmdCount 馬上就會(huì)派上用場(chǎng))。命令的結(jié)構(gòu)由指針函數(shù)、函數(shù)名和命令描述三部分組成。

下圖是聲明了一個(gè)命令數(shù)組:

myCommand cmds[] = { {handleHelp, "help", "Shows this help."}, {handleP2P, "p2p", "Shows the P2P settings."}, {handleFreq, "fq", "Gets/sets the working frequency."}, {handleBW, "bw", "Gets/sets the working bandwidth."}, {handleSF, "sf", "Gets/sets the working spreading factor."}, {handleCR, "cr", "Gets/sets the working coding rate."}, {handleTX, "tx", "Gets/sets the working TX power."}, {handleAES, "aes", "Gets/sets AES encryption status."}, {handlePassword, "pwd", "Gets/sets AES password."}, {handleIV, "iv", "Gets/sets AES IV."}, {handleJSON, "json", "Gets/sets JSON sending status."}, };

到目前為止一切都順利。所以在 setup() 函數(shù)啟動(dòng)時(shí),會(huì)計(jì)算可用命令的數(shù)量,以便知道我們有多少個(gè)命令。cmdCount = sizeof (cmds)/ sizeof (myCommand):這在 evalCmd函數(shù)中用于遍歷命令,cmdCount即為最終統(tǒng)計(jì)到的命令個(gè)數(shù)。

void evalCmd(char *str, string fullString) { uint8_t ix, iy = strlen(str); for (ix = 0; ix < iy; ix++) { char c = str[ix]; // lowercase the keyword if (c >= 'A' && c <= 'Z') str[ix] = c + 32; } Serial.print("Evaluating: `"); Serial.print(fullString.c_str()); Serial.println("`"); for (int i = 0; i < cmdCount; i++) { if (strcmp(str, cmds[i].name) == 0) { // call the function cmds[i].ptr((char*)fullString.c_str()); return; } } }

在此之后,添加命令和處理它們的調(diào)用就非常容易了。讓我們來(lái)看看 handleHelp (char*)命令:

void handleHelp(char *param) { Serial.printf("Available commands: %d\n", cmdCount); for (int i = 0; i < cmdCount; i++) { sprintf(msg, " . %s: %s", cmds[i].name, cmds[i].help); Serial.println(msg); } }

char *param 參數(shù)可能需要也可能不需要,因此默認(rèn)發(fā)送,每個(gè)命令都可以自由使用或者直接忽略它。例如:handleFreq() 命令便要使用該參數(shù):

void handleFreq(char *param) { if (strcmp("fq", param) == 0) { // no parameters sprintf(msg, "P2P frequency: %.3f MHz\n", (myFreq / 1e6)); Serial.print(msg); sprintf(msg, "Fq: %.3f MHz\n", (myFreq / 1e6)); displayScroll(msg); return; } else { // fq xxx.xxx set frequency float value = atof(param + 2); if (value < 150.0 || value > 960.0) { // sx1262 freq range 150MHz to 960MHz // Your chip might not support all... sprintf(msg, "Invalid frequency value: %.3f\n", value); Serial.print(msg); return; } myFreq = value * 1e6; api.lorawan.precv(0); // turn off reception while we're doing setup sprintf(msg, "Set P2P frequency to %3.3f: %s MHz\n", (myFreq / 1e6), api.lorawan.pfreq.set(myFreq) ? "Success" : "Fail"); Serial.print(msg); api.lorawan.precv(65534); sprintf(msg, "New freq: %.3f", value); displayScroll(msg); return; } }

poYBAGOFeB-AEMkXAAFueGbNSLk032.png

一切操作之后有了現(xiàn)在的結(jié)果,編碼歷時(shí)幾個(gè)小時(shí),就得到了一個(gè)功能齊全的 LoRa?USB適配器。但實(shí)際上沒(méi)有用這么多時(shí)間,因?yàn)楣P者重用了以前項(xiàng)目中的 Commands.h 代碼,并且暫時(shí)跳過(guò) AES 加密部分,把它留在示例項(xiàng)目中是因?yàn)樗鄬?duì)比較復(fù)雜,且通常不是簡(jiǎn)單項(xiàng)目的一部分。通??梢栽陧?xiàng)目正常運(yùn)行后再添加 AES,這樣就不必?fù)?dān)心其他東西會(huì)受影響。但是,就像 Commands.h 一樣,筆者已經(jīng)從其他項(xiàng)目準(zhǔn)備好 AES 文件,所以對(duì)它的實(shí)現(xiàn)也只是復(fù)制粘貼工作。

pYYBAGOFeB-ARMFAAACe1v8dqBU954.png

六、擴(kuò)展

功能蔓延(feature creep)一直都是困擾開(kāi)發(fā)人員的問(wèn)題,但現(xiàn)在我們暫時(shí)可以先忽略這一點(diǎn)。一起來(lái)看看這個(gè)項(xiàng)目可以有哪些擴(kuò)展:

1、OLED顯示屏

由于引腳配置,顯示屏要在底板背面添加,但添加起來(lái)也是很方便。學(xué)習(xí)一些如何關(guān)閉屏幕的編程代碼,可以幫助節(jié)省能源和保護(hù)屏幕;

2、RTC實(shí)時(shí)時(shí)鐘

可以在 JSON 數(shù)據(jù)包或類似 Cayenne LPP 的格式中為數(shù)據(jù)包添加時(shí)間戳;

3、GNSS模塊

用戶可以將 GPS 坐標(biāo)添加到數(shù)據(jù)包中,而且如果已經(jīng)在家中設(shè)置了收發(fā)器的坐標(biāo),還可以使用它們的自動(dòng)計(jì)算距離(Haversine 公式)的功能。

4、固件的BLE UART路由

添加這個(gè)功能很簡(jiǎn)單。一旦設(shè)置了 BLE,代碼就與串行代碼幾乎相同了。這樣操作之后,它就不僅僅是一個(gè)用于電腦的 USB LoRa?適配器了,加上電池它可以成為手機(jī)無(wú)線 LoRa?適配器。

以上這些,這個(gè)使用 RUI3 制作的項(xiàng)目都能實(shí)現(xiàn)、也都可以擁有這些功能。如果你們感興趣,也可以自己動(dòng)手試試!

pYYBAGOFeB-Ae_OBAACtuD2MIT0208.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2927

    文章

    45900

    瀏覽量

    388212
  • LoRa
    +關(guān)注

    關(guān)注

    351

    文章

    1763

    瀏覽量

    234313
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    MITEQ適配器-N型

    MITEQ適配器-N型 MITEQ適配器中的N型(M/F)至SMA(M/F,DC至18 GHz)是一款高性能、高可靠性的射頻適配器,適用于
    發(fā)表于 03-12 09:44

    電源適配器做什么的

    )的作用包括: 1.電流調(diào)節(jié) :設(shè)備通常需要特定的電流(單位是安培A)。適配器會(huì)根據(jù)設(shè)備的要求,提供合適的電流強(qiáng)度。 2.電壓轉(zhuǎn)換 :家庭用電般是220V或110V的交流電,而很多電子設(shè)備(如筆記本電腦
    發(fā)表于 02-12 11:46

    適配器的電壓與功率選擇

    適配器通常包含個(gè)變壓器和個(gè)整流器,變壓器用于降低電壓,而整流器則將交流電轉(zhuǎn)換為直流電。此外,適配器還可能包含穩(wěn)壓電路和濾波電路,以確保
    的頭像 發(fā)表于 02-06 17:14 ?1023次閱讀

    藍(lán)牙適配器連接技巧

    常重要的。市面上主要有以下幾種類型的藍(lán)牙適配器: USB藍(lán)牙適配器 :這是最常見(jiàn)的類型,通過(guò)USB接口連接到電腦或其他設(shè)備。 內(nèi)置藍(lán)牙適配器
    的頭像 發(fā)表于 02-06 17:05 ?974次閱讀

    適配器與轉(zhuǎn)接頭的區(qū)別

    (Adapter) 適配器種電子設(shè)備,用于個(gè)接口轉(zhuǎn)換為另個(gè)接口,以便連接不同的設(shè)備。適配器
    的頭像 發(fā)表于 02-06 17:00 ?839次閱讀

    電源適配器怎么使用?

    價(jià)格優(yōu)勢(shì),超低空載和待機(jī)能量損耗。符合CEC標(biāo)準(zhǔn),超安全設(shè)計(jì),電源適配器符合各國(guó)安規(guī)認(rèn)證。高效率的電路設(shè)計(jì),性能穩(wěn)定,低溫升。   如果沒(méi)有電源適配器的話,旦電壓不穩(wěn),我們的電腦,筆
    發(fā)表于 01-18 11:04

    電源適配器和開(kāi)關(guān)電源之間的區(qū)別

    隨著電力電子技術(shù)的發(fā)展和創(chuàng)新,使得電源產(chǎn)品市場(chǎng)發(fā)展十分的迅速,技術(shù)也在不斷地創(chuàng)新,這成本反轉(zhuǎn)點(diǎn)日益向低輸出電力端移動(dòng),這為電源適配器和開(kāi)關(guān)電源產(chǎn)品提供了廣闊的發(fā)展空間。開(kāi)關(guān)電源和電源適配器應(yīng)
    發(fā)表于 01-16 10:57

    光纖跳線是否帶適配器

    光纖跳線本身并不直接包含適配器,但光纖跳線的兩端通常會(huì)裝有光纖連接器,用于與光纖端口或適配器對(duì)接。光纖適配器種使不同尺寸或不同類型的光纖
    的頭像 發(fā)表于 12-23 10:02 ?394次閱讀

    電腦紅外適配器有哪些

    電腦紅外適配器種利用紅外線技術(shù)實(shí)現(xiàn)電腦與其他電子設(shè)備之間進(jìn)行數(shù)據(jù)交換和傳輸?shù)脑O(shè)備。隨著科技的不斷發(fā)展,電腦紅外
    的頭像 發(fā)表于 10-14 10:56 ?1136次閱讀

    外接電源適配器的工作原理是什么

    外接電源適配器種將交流電(AC)轉(zhuǎn)換為直流電(DC)的設(shè)備,廣泛應(yīng)用于各種電子設(shè)備中,如筆記本電腦、手機(jī)、平板電腦等。它通常由
    的頭像 發(fā)表于 10-12 09:23 ?1420次閱讀

    電源適配器空載電壓高怎么回事

    )的設(shè)備,廣泛應(yīng)用于各種電子設(shè)備中,如筆記本電腦、手機(jī)、平板電腦等。電源適配器的主要組成部分包括: 輸入濾波器:用于濾除輸入交流電中的高頻噪
    的頭像 發(fā)表于 09-27 15:32 ?1955次閱讀

    電源適配器電流大小對(duì)電器影響

    電源適配器電流大小對(duì)電器的影響是個(gè)復(fù)雜而重要的問(wèn)題。 、電源適配器的工作原理 電源適配器
    的頭像 發(fā)表于 08-02 09:40 ?5797次閱讀

    適配器的電流大于原適配器可以嗎

    適配器的電流大于原適配器是否可行,這是個(gè)涉及到電子設(shè)備電源適配器使用和安全性的問(wèn)題。 適配器
    的頭像 發(fā)表于 08-02 09:38 ?2725次閱讀

    usb-c多口適配器

    面臨的大問(wèn)題。在這樣的背景下,Type-C多口適配器應(yīng)運(yùn)而生,以其高效、便捷的特點(diǎn),成為了現(xiàn)代充電與連接的新選擇 概述 Type-C多口適配器,顧名思義,是指具有多個(gè)Type-C充電接口的
    的頭像 發(fā)表于 07-01 09:13 ?680次閱讀
    usb-c多口<b class='flag-5'>適配器</b>

    電源適配器有哪些作用

    電源適配器的作用有哪些 電源適配器,又稱電源轉(zhuǎn)換器或電源供應(yīng)器,是種將電源輸入轉(zhuǎn)換為特定電壓和電流輸出的電子設(shè)備。它廣泛應(yīng)用于各種電子設(shè)備中,如手機(jī)、筆記本
    的頭像 發(fā)表于 06-10 17:07 ?1.1w次閱讀