今天小拜年給大家?guī)淼氖莵碜悦绹?guó)的Maker Rob Lauer的基于樹莓派5的蜂窩網(wǎng)絡(luò)項(xiàng)目,了解如何為新的 Raspberry Pi 5 單板計(jì)算機(jī)添加低帶寬蜂窩連接。
材料清單
硬件列表
Raspberry Pi 5(這也適用于Pi 4或Pi Zero 1或2)
Raspberry Pi 攝像頭模塊 v2
藍(lán)調(diào)記事卡手機(jī)+WiFi
Blues Notecarrier Pi 帽子
軟件列表
Datacake
Blues Notehub.io
現(xiàn)在幾乎成為一年一度的傳統(tǒng),我們?cè)?Raspberry Pi 的朋友發(fā)布了我們都知道和喜愛的單板計(jì)算機(jī)的最新型號(hào) Raspberry Pi5。
Pi 5采用新的電路板布局、更好的性能和新的接口,是一款令人興奮的產(chǎn)品。Pi 上還有一個(gè)實(shí)時(shí)時(shí)鐘,可以將你的 Pi 從睡眠模式中喚醒——而且它是可編程的——這使得在電池供電的邊緣部署中使用 Pi 稍微逼真一些。
不過我最喜歡的功能是什么?電源按鈕!
雖然我們?cè)?Pi 上執(zhí)行的絕大多數(shù)工作都在訪問家庭/辦公室 Wi-Fi 范圍內(nèi),但我們中有很多人在遠(yuǎn)程環(huán)境中使用 Pi(如果您愿意的話,在前面提到的“邊緣”)。
在這些情況下,訪問 Wi-Fi 很困難或不可能,唯一有效的連接選項(xiàng)往往是蜂窩(太貴!)或 LoRaWAN(太罕見?。?。嗯,怎么辦?。?/p>
Blues Notecard的出現(xiàn)為圍繞低功耗和低帶寬連接場(chǎng)景而設(shè)計(jì),提供了一種簡(jiǎn)單(但功能強(qiáng)大)的方法,可通過預(yù)付費(fèi)蜂窩網(wǎng)絡(luò)、Wi-Fi 或 LoRa 將無線連接添加到幾乎任何物理設(shè)備(是的,包括 Pi)。
在Raspberry Pi 5 上準(zhǔn)備蜂窩網(wǎng)絡(luò)
在這個(gè)項(xiàng)目中,我將創(chuàng)建一個(gè) Python 應(yīng)用程序,它既充當(dāng)人員計(jì)數(shù)器,又充當(dāng)溫度/壓力/濕度跟蹤器。我們將使用 Blues Notecard 將數(shù)據(jù)與云同步。然后,我們可以使用Datacake?平臺(tái)生成路由數(shù)據(jù)的基于云的儀表板。
應(yīng)用工作流如下所示:
使用 Pi 的攝像頭和 OpenCV 檢測(cè)人臉。
記錄檢測(cè)到的人臉數(shù)量。
每分鐘將人臉計(jì)數(shù)以及溫度/壓力/濕度數(shù)據(jù)發(fā)送到云端。
在基于云的儀表板上顯示累積數(shù)據(jù)的報(bào)告。
這是一個(gè)就簡(jiǎn)單的項(xiàng)目,但它也展示了收集數(shù)據(jù)、通過蜂窩網(wǎng)絡(luò)將其發(fā)送到云以及創(chuàng)建儀表板來查看累積數(shù)據(jù)是多么容易:
項(xiàng)目硬件
對(duì)于這個(gè)項(xiàng)目,我將使用以下硬件:
Raspberry Pi 5(這也適用于Pi 4或Pi Zero 1或2)
Raspberry Pi 攝像頭模塊 v2
藍(lán)調(diào)記事卡手機(jī)+WiFi
Blues Notecarrier Pi 帽子
Adafruit BME280 溫度/壓力/濕度傳感器
不涉及任何接線,因?yàn)?Notecard 插入 Notecarrier Pi Hat,而 BME280 通過提供的 Qwiic 端口之一連接到 Notecarrier:
帶有記事卡的蜂窩網(wǎng)絡(luò)(或 Wi-Fi 或 LoRa)
Notecard 是這個(gè)項(xiàng)目的理想選擇,因?yàn)樗怯脕戆l(fā)送和接收小數(shù)據(jù)包的 JSON 數(shù)據(jù)包(在 Blues 術(shù)語中稱為 Notes)。這非常適合邊緣機(jī)器學(xué)習(xí)等方案,在這些方案中,處理是在設(shè)備上完成的,唯一需要中繼到云的數(shù)據(jù)是包含生成的推理的小型有效負(fù)載。同樣,記事卡可以處理從物理世界收集傳感器數(shù)據(jù)并需要每小時(shí)、每天、每周一次等提供一次數(shù)據(jù)的情況。
需要明確的是,Blues Notecard 并不是 Raspberry Pi 上 Wi-Fi 的直接替代品。它專為低帶寬數(shù)據(jù)傳輸而設(shè)計(jì),因此您不會(huì)在無人區(qū)中瀏覽網(wǎng)頁。
您為記事卡支付一次性費(fèi)用,它附帶 500MB 的數(shù)據(jù)和 10 年的全球蜂窩服務(wù)。沒有每月的SIM卡費(fèi)用或訂閱。
還有 Wi-Fi 和 LoRa 選項(xiàng)(相同的開發(fā)人員 API,相同的硬件占用空間):
記事卡“正常工作”,因?yàn)椋?/p>
它與名為Notehub的云服務(wù)安全配對(duì)(自動(dòng))。無需認(rèn)證管理或設(shè)備配置。
告訴記事卡它應(yīng)該連接到哪個(gè) Notehub 項(xiàng)目。
通過兩行代碼(基于 JSON 的 API 調(diào)用),您可以將 Pi 連接到云:
1. {"req":"hub.set","product":"com.blues.me:product","mode":"periodic"} 2. {"req":"note.add","body":{"temperature":21.3,"humidity":65.4}}
說了這么多,讓我們開始這個(gè)項(xiàng)目吧!
在安裝庫和測(cè)試相機(jī)
我們的項(xiàng)目從note-python開始,這是 Blues 支持的 SDK,用于通過 Python 處理記事卡。在 Pi 終端上使用以下命令進(jìn)行安裝:note-python
pip3 install note-python
接下來安裝一些其他 Python 庫,包括(用于通過 I2C 與外圍設(shè)備通信)、(我們將用于面部識(shí)別)和(與 BME280 交互)。python-peripheryopencv-pythonpimoroni-bme280
接下來,使用此命令測(cè)試您的相機(jī)是否正常運(yùn)行(您應(yīng)該看到相機(jī)的輸入出現(xiàn)在 Pi 桌面上):
libcamera-hello –camera 0 -t 0
都好嗎?讓我們開始編寫一些代碼!
Python 代碼
僅供參考,完整的 Python 代碼可以在(https://gist.github.com/rdlauer/8cecc03e1f44fe5643f50d42b06a9467)中找到
首先包含相關(guān)依賴項(xiàng):
#!/usr/bin/python3 import notecard from notecard import hub from periphery import I2C import cv2 import keys import time from picamera2 import Picamera2 from smbus2 import SMBus from bme280 import BME280
通過 I2C 總線連接到記事卡,并在Notehub上為您的云項(xiàng)目的唯一標(biāo)識(shí)符(例如)添加一個(gè)占位符:productUID
# init the notecard productUID = keys.NOTEHUB_PRODUCT_UID port = I2C("/dev/i2c-1") nCard = notecard.OpenI2C(port, 0, 0)
Notehub 在這里非常有價(jià)值,因?yàn)樗粌H可以充當(dāng) Notecard 發(fā)送數(shù)據(jù)的安全云代理,還可以讓您快速將數(shù)據(jù)路由到您的云應(yīng)用程序(例如 AWS、Azure、Datacake、Ubidots 等)。它可免費(fèi)用于大多數(shù)項(xiàng)目。
將記事卡與您的免費(fèi) Notehub 項(xiàng)目鏈接,并將記事卡的蜂窩調(diào)制解調(diào)器置于模式。continuous
這告訴記事卡保持連續(xù)的蜂窩連接(這對(duì)演示有好處,但對(duì)電池壽命不利,這就是為什么記事卡默認(rèn)為僅定期發(fā)送數(shù)據(jù)并節(jié)省電量的原因):periodic
# connect notecard to notehub rsp = hub.set(nCard, product=productUID, mode="continuous") print(rsp)
初始化 BME280 傳感器:
# init the BME280 bus = SMBus(1) bme280 = BME280(i2c_dev=bus, i2c_addr=0x77)
接下來,需要從此 GitHub 存儲(chǔ)庫下載相應(yīng)的“正面”預(yù)訓(xùn)練分類器。我們將使用OpenCV?來檢測(cè)圖像并將其分類為人臉。此 XML 文件需要保存到您的 Pi 的可訪問目錄中。
加載分類器 XML 文件并初始化 Pi 相機(jī):
# Grab images as numpy arrays and leave everything else to OpenCV. face_detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") cv2.startWindowThread() picam2 = Picamera2() picam2.configure(picam2.create_preview_configuration(main={"format": 'XRGB8888', "size": (640, 480)})) picam2.start()
添加一些變量,用于跟蹤檢測(cè)到的人臉計(jì)數(shù)以及用于將數(shù)據(jù)發(fā)送到云的時(shí)間戳:
# keep track of face counts between notes face_count = 0 # keep track of seconds for adding faces/syncing start_secs_face = int(round(time.time())) start_secs_note = int(round(time.time()))
接下來,定義一個(gè)函數(shù),該函數(shù)將向 Notehub(也稱為事件)發(fā)送注釋。“Note”是圍繞任何任意 JSON 有效負(fù)載(布爾值、字符串、整數(shù)等)的 JSON 修飾:
def send_note(c):
# query the notecard for power supply voltage req = {"req": "card.voltage", "mode": "?"} rsp = nCard.Transaction(req) voltage = rsp["value"] # get the temp/pressure/humidity from bme280 temperature = bme280.get_temperature() pressure = bme280.get_pressure() humidity = bme280.get_humidity() req = {"req": "note.add"} req["file"] = "face.qo" req["body"] = {"face_count": c, "voltage": voltage, "temperature": temperature, "pressure": pressure, "humidity": humidity} req["sync"] = True rsp = nCard.Transaction(req) print(rsp)
最后,啟動(dòng)一個(gè)無限循環(huán),并在該循環(huán)中:
嘗試對(duì)人臉進(jìn)行分類(同時(shí)繪制邊框并向識(shí)別的人臉添加一些標(biāo)簽)。
如果檢測(cè)到人臉,則遞增變量。face_count
最后,如果一分鐘過去了,請(qǐng)執(zhí)行上述函數(shù)將此數(shù)據(jù)發(fā)送到云端!send_note
while True: # track the current time current_seconds = int(round(time.time())) im = picam2.capture_array() grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(grey, 1.1, 5) # Add text around each face font = cv2.FONT_HERSHEY_DUPLEX fontScale = 1 color = (0, 0, 255) thickness = 2 # Draw the rectangle around each face for (x, y, w, h) in faces: cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0)) face_plural = 's' if face_count == 1: face_plural = '' cv2.putText(im, 'Face found!', (x, y-10), font, fontScale, color, thickness, cv2.LINE_AA) cv2.imshow("Camera", im) if len(faces) > 0: # check to make sure it's been at least three seconds since the last time we checked for faces if current_seconds - start_secs_face >= 3: face_count += len(faces) print("We found some faces: " + str(len(faces)) + " to be exact! (Pending sync: " + str(face_count) + " faces)") start_secs_face = int(round(time.time())) # create an outbound note every 5 minutes with accumulated face counts if current_seconds - start_secs_note >= 60: send_note(face_count) print("####################") print("Sending a new note with " + str(face_count) + " faces.") print("####################") face_count = 0 start_secs_note = int(round(time.time())) cv2.waitKey(1)
就是這樣!
運(yùn)行 Python 應(yīng)用程序,您應(yīng)該會(huì)看到相機(jī)窗口出現(xiàn),開始將數(shù)據(jù)保存到記事卡上的閃光燈,并立即將該數(shù)據(jù)同步到 Notehub:
We found some faces: 1 to be exact! (Pending sync: 1 faces) We found some faces: 1 to be exact! (Pending sync: 2 faces) We found some faces: 1 to be exact! (Pending sync: 3 faces) We found some faces: 1 to be exact! (Pending sync: 4 faces) We found some faces: 1 to be exact! (Pending sync: 5 faces) We found some faces: 1 to be exact! (Pending sync: 6 faces) We found some faces: 1 to be exact! (Pending sync: 7 faces) {'template': True} #################### Sending a new note with 7 faces. ####################
提醒:完整的 Python 代碼可以在face-detect.py · GitHub上的這個(gè)要點(diǎn)中找到。
Notehub 到云
當(dāng)項(xiàng)目處于當(dāng)前狀態(tài)時(shí),記事卡將在數(shù)據(jù)進(jìn)入時(shí)立即開始與 Notehub 同步數(shù)據(jù)(每分鐘一次)。您將看到這些注釋(或事件)顯示在項(xiàng)目的“事件”選項(xiàng)卡中:
雖然看到這些數(shù)據(jù)出現(xiàn)很酷,但它并不是那么有用。讓我們添加一個(gè)快速集成,以使用Notehub Routes?和 Datacake 構(gòu)建基于云的儀表板。
Notehub 支持通過 HTTPS 和 MQTT 協(xié)議將數(shù)據(jù)路由到幾乎任何托管云服務(wù)。Blues 提供路由教程,引導(dǎo)您完成流程中的每一步。將數(shù)據(jù)路由到 Datacake
Datacake?是一個(gè)低代碼平臺(tái),可讓您在最短的時(shí)間內(nèi)構(gòu)建 IoT 應(yīng)用程序(正如我們今天將在這里看到的那樣)。
現(xiàn)在,如果您查看發(fā)送到 Notehub 的事件之一并查看 JSON 選項(xiàng)卡,您將看到可以路由到 Datacake 的大量數(shù)據(jù):
{ "event": "1ab42897-17c6-4877-b902-c2ee1c1c7e96", "session": "e889f105-226d-45f6-a3cc-d8028a655326", "best_id": "dev:860322068073292", "device": "dev:860322068073292", "product": "productfaceml", "app": "app:0c85569f-5cd8-4d84-9548-eab244c57f59", "received": 1701718035.34947, "req": "note.add", "when": 1701718034, "file": "face.qo", "body": { "face_count": 8, "humidity": 27.78125, "pressure": 983.5, "temperature": 24.5, "voltage": 5.171875 }, "best_location_type": "triangulated", "best_location_when": 1701462279, "best_lat": 43.071243, "best_lon": -89.43282, "best_location": "Shorewood Hills WI", "best_country": "US", "best_timezone": "America/Chicago", "tri_when": 1701462279, "tri_lat": 43.071243, "tri_lon": -89.43282, "tri_location": "Shorewood Hills WI", "tri_country": "US", "tri_timezone": "America/Chicago", "tri_points": 3, "status": "success", "fleets": [ "fleet:664b55a8-d3c0-4e76-8588-90e8fef53d20" ] }
我們希望將此數(shù)據(jù)路由到 Datacake,但我們唯一關(guān)心的值是temperature 、 pressure 、 humidity 、 voltage 和 face_count 。
創(chuàng)建Datacake路由
與其重新發(fā)明輪子,不如前往 blues.dev 上的完整 Datacake 教程來完成路由的初始創(chuàng)建。來吧,我發(fā)誓不會(huì)花太長(zhǎng)時(shí)間!
我們需要對(duì) Datacake 中的字段和有效負(fù)載解碼器設(shè)置的配置進(jìn)行一些編輯。
在 Datacake 中添加字段
由于我們要向 Datacake 發(fā)送上述temperature、pressure、humidity 、 voltage 和 face_count變量,因此我們需要確保 Datacake 知道預(yù)期它們。
導(dǎo)航到 Datacake 中設(shè)備配置的“字段”部分。確保這些值與此處顯示的值一致(如果您有其他字段,那很好,它們將被儀表板忽略):
在 Datacake 中更新 HTTP 有效負(fù)載解碼器
Datacake 有一個(gè)“有效負(fù)載解碼器”,它將使用您從 Notehub 發(fā)送的 JSON 有效負(fù)載,然后將該數(shù)據(jù)調(diào)整為在儀表板中表示它所需的格式。
我將為您省去一個(gè)步驟,并為您提供我使用的完整有效負(fù)載解碼器代碼:
function Decoder(request) { var data = JSON.parse(request.body); var device = data.device; var file = data.file; var decoded = {}; decoded.voltage = data.body.voltage; decoded.temperature = data.body.temperature; decoded.humidity = data.body.humidity; decoded.pressure = data.body.pressure; decoded.face_count = data.body.face_count; if (("best_lat" in data) && ("best_lon" in data)) { decoded.device_location = "(" + data.best_lat + "," + data.best_lon + ")"; } decoded.rssi = data.rssi; decoded.bars = data.bars; // Array where we store the fields that are being sent to Datacake var datacakeFields = [] // take each field from decodedElsysFields and convert them to Datacake format for (var key in decoded) { if (decoded.hasOwnProperty(key)) { datacakeFields.push({field: key.toUpperCase(), value: decoded[key], device: device}) } } // forward data to Datacake return datacakeFields; }
創(chuàng)建 Datacake 儀表板
接下來,導(dǎo)航到 Datacake 中的“儀表板”選項(xiàng)卡。使用它們提供的 GUI 工具將適當(dāng)?shù)男〔考砑拥綀D表值,如溫度、壓力、檢測(cè)到的人臉數(shù)量等。
總而言之,您應(yīng)該擁有一個(gè)華麗的基于云的儀表板!
下一步是什么?
希望您已經(jīng)看到向 Raspberry Pi 添加低帶寬蜂窩連接是多么容易。需要注意的是,Notecard 還支持幾乎所有現(xiàn)代主機(jī) MCU(如 STM32、ESP32、Nordic 等)。您可以使用Blues Starter Kit開始使用STM32主機(jī)。
不過,更有可能的是,您正在尋找Blues Notecarrier Pi 帽子和任何記事卡,以開始在 Pi 上使用蜂窩網(wǎng)絡(luò)。
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2565文章
52981瀏覽量
767249 -
蜂窩網(wǎng)絡(luò)
+關(guān)注
關(guān)注
2文章
212瀏覽量
22382 -
樹莓派
+關(guān)注
關(guān)注
121文章
2005瀏覽量
107438 -
RaspberryPi
+關(guān)注
關(guān)注
1文章
46瀏覽量
9457
原文標(biāo)題:創(chuàng)客項(xiàng)目秀|基于 Raspberry Pi 5 的蜂窩物聯(lián)網(wǎng)
文章出處:【微信號(hào):ChaiHuoMakerSpace,微信公眾號(hào):柴火創(chuàng)客空間】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
名單公布!樹莓派5(Raspberry Pi 5)開發(fā)板免費(fèi)試用?。。?/a>
為什么選擇蜂窩物聯(lián)網(wǎng)
第二代Raspberry Pi發(fā)布,微軟推出Windows 10 for Raspberry Pi 2
基于node-Red和Raspberry Pi的物聯(lián)網(wǎng)實(shí)驗(yàn)設(shè)計(jì)
Raspberry Pi 標(biāo)準(zhǔn)的40針連接器設(shè)計(jì)方案
分享一款不錯(cuò)的基于樹莓派Raspberry Pi CM的物聯(lián)網(wǎng)網(wǎng)關(guān)方案
蜂窩物聯(lián)網(wǎng)的應(yīng)用有哪些?
蜂窩物聯(lián)網(wǎng)是什么_蜂窩物聯(lián)網(wǎng)建設(shè)意義
使用Raspberry Pi和Particle Cloud進(jìn)行物聯(lián)網(wǎng)控制的家庭自動(dòng)化

通過Raspberry Pi進(jìn)行簡(jiǎn)單的物聯(lián)網(wǎng)LED控制

通過Raspberry Pi的簡(jiǎn)單物聯(lián)網(wǎng)按鈕教程

通過Raspberry Pi的物聯(lián)網(wǎng)有源蜂鳴器

用于測(cè)試項(xiàng)目的4個(gè)最佳樹莓派Raspberry Pi模擬器
【樹莓派Pi5】樹莓派 Raspberry Pi 5 正式發(fā)布!

Banana Pi M5 與 Raspberry Pi 4 – 基準(zhǔn)測(cè)試

評(píng)論