今天小拜年給大家?guī)淼氖莵碜悦绹腗aker Rob Lauer的基于樹莓派5的蜂窩網(wǎng)絡項目,了解如何為新的 Raspberry Pi 5 單板計算機添加低帶寬蜂窩連接。
材料清單
硬件列表
Raspberry Pi 5(這也適用于Pi 4或Pi Zero 1或2)
Raspberry Pi 攝像頭模塊 v2
藍調記事卡手機+WiFi
Blues Notecarrier Pi 帽子
軟件列表
Datacake
Blues Notehub.io
現(xiàn)在幾乎成為一年一度的傳統(tǒng),我們在 Raspberry Pi 的朋友發(fā)布了我們都知道和喜愛的單板計算機的最新型號 Raspberry Pi5。
Pi 5采用新的電路板布局、更好的性能和新的接口,是一款令人興奮的產(chǎn)品。Pi 上還有一個實時時鐘,可以將你的 Pi 從睡眠模式中喚醒——而且它是可編程的——這使得在電池供電的邊緣部署中使用 Pi 稍微逼真一些。
不過我最喜歡的功能是什么?電源按鈕!
雖然我們在 Pi 上執(zhí)行的絕大多數(shù)工作都在訪問家庭/辦公室 Wi-Fi 范圍內(nèi),但我們中有很多人在遠程環(huán)境中使用 Pi(如果您愿意的話,在前面提到的“邊緣”)。
在這些情況下,訪問 Wi-Fi 很困難或不可能,唯一有效的連接選項往往是蜂窩(太貴?。┗?LoRaWAN(太罕見!)。嗯,怎么辦???
Blues Notecard的出現(xiàn)為圍繞低功耗和低帶寬連接場景而設計,提供了一種簡單(但功能強大)的方法,可通過預付費蜂窩網(wǎng)絡、Wi-Fi 或 LoRa 將無線連接添加到幾乎任何物理設備(是的,包括 Pi)。
在Raspberry Pi 5 上準備蜂窩網(wǎng)絡
在這個項目中,我將創(chuàng)建一個 Python 應用程序,它既充當人員計數(shù)器,又充當溫度/壓力/濕度跟蹤器。我們將使用 Blues Notecard 將數(shù)據(jù)與云同步。然后,我們可以使用Datacake?平臺生成路由數(shù)據(jù)的基于云的儀表板。
應用工作流如下所示:
使用 Pi 的攝像頭和 OpenCV 檢測人臉。
記錄檢測到的人臉數(shù)量。
每分鐘將人臉計數(shù)以及溫度/壓力/濕度數(shù)據(jù)發(fā)送到云端。
在基于云的儀表板上顯示累積數(shù)據(jù)的報告。
這是一個就簡單的項目,但它也展示了收集數(shù)據(jù)、通過蜂窩網(wǎng)絡將其發(fā)送到云以及創(chuàng)建儀表板來查看累積數(shù)據(jù)是多么容易:
項目硬件
對于這個項目,我將使用以下硬件:
Raspberry Pi 5(這也適用于Pi 4或Pi Zero 1或2)
Raspberry Pi 攝像頭模塊 v2
藍調記事卡手機+WiFi
Blues Notecarrier Pi 帽子
Adafruit BME280 溫度/壓力/濕度傳感器
不涉及任何接線,因為 Notecard 插入 Notecarrier Pi Hat,而 BME280 通過提供的 Qwiic 端口之一連接到 Notecarrier:
帶有記事卡的蜂窩網(wǎng)絡(或 Wi-Fi 或 LoRa)
Notecard 是這個項目的理想選擇,因為它是用來發(fā)送和接收小數(shù)據(jù)包的 JSON 數(shù)據(jù)包(在 Blues 術語中稱為 Notes)。這非常適合邊緣機器學習等方案,在這些方案中,處理是在設備上完成的,唯一需要中繼到云的數(shù)據(jù)是包含生成的推理的小型有效負載。同樣,記事卡可以處理從物理世界收集傳感器數(shù)據(jù)并需要每小時、每天、每周一次等提供一次數(shù)據(jù)的情況。
需要明確的是,Blues Notecard 并不是 Raspberry Pi 上 Wi-Fi 的直接替代品。它專為低帶寬數(shù)據(jù)傳輸而設計,因此您不會在無人區(qū)中瀏覽網(wǎng)頁。
您為記事卡支付一次性費用,它附帶 500MB 的數(shù)據(jù)和 10 年的全球蜂窩服務。沒有每月的SIM卡費用或訂閱。
還有 Wi-Fi 和 LoRa 選項(相同的開發(fā)人員 API,相同的硬件占用空間):
記事卡“正常工作”,因為:
它與名為Notehub的云服務安全配對(自動)。無需認證管理或設備配置。
告訴記事卡它應該連接到哪個 Notehub 項目。
通過兩行代碼(基于 JSON 的 API 調用),您可以將 Pi 連接到云:
1. {"req":"hub.set","product":"com.blues.me:product","mode":"periodic"} 2. {"req":"note.add","body":{"temperature":21.3,"humidity":65.4}}
說了這么多,讓我們開始這個項目吧!
在安裝庫和測試相機
我們的項目從note-python開始,這是 Blues 支持的 SDK,用于通過 Python 處理記事卡。在 Pi 終端上使用以下命令進行安裝:note-python
pip3 install note-python
接下來安裝一些其他 Python 庫,包括(用于通過 I2C 與外圍設備通信)、(我們將用于面部識別)和(與 BME280 交互)。python-peripheryopencv-pythonpimoroni-bme280
接下來,使用此命令測試您的相機是否正常運行(您應該看到相機的輸入出現(xiàn)在 Pi 桌面上):
libcamera-hello –camera 0 -t 0
都好嗎?讓我們開始編寫一些代碼!
Python 代碼
僅供參考,完整的 Python 代碼可以在(https://gist.github.com/rdlauer/8cecc03e1f44fe5643f50d42b06a9467)中找到
首先包含相關依賴項:
#!/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上為您的云項目的唯一標識符(例如)添加一個占位符:productUID
# init the notecard productUID = keys.NOTEHUB_PRODUCT_UID port = I2C("/dev/i2c-1") nCard = notecard.OpenI2C(port, 0, 0)
Notehub 在這里非常有價值,因為它不僅可以充當 Notecard 發(fā)送數(shù)據(jù)的安全云代理,還可以讓您快速將數(shù)據(jù)路由到您的云應用程序(例如 AWS、Azure、Datacake、Ubidots 等)。它可免費用于大多數(shù)項目。
將記事卡與您的免費 Notehub 項目鏈接,并將記事卡的蜂窩調制解調器置于模式。continuous
這告訴記事卡保持連續(xù)的蜂窩連接(這對演示有好處,但對電池壽命不利,這就是為什么記事卡默認為僅定期發(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 存儲庫下載相應的“正面”預訓練分類器。我們將使用OpenCV?來檢測圖像并將其分類為人臉。此 XML 文件需要保存到您的 Pi 的可訪問目錄中。
加載分類器 XML 文件并初始化 Pi 相機:
# 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()
添加一些變量,用于跟蹤檢測到的人臉計數(shù)以及用于將數(shù)據(jù)發(fā)送到云的時間戳:
# 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()))
接下來,定義一個函數(shù),該函數(shù)將向 Notehub(也稱為事件)發(fā)送注釋。“Note”是圍繞任何任意 JSON 有效負載(布爾值、字符串、整數(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)
最后,啟動一個無限循環(huán),并在該循環(huán)中:
嘗試對人臉進行分類(同時繪制邊框并向識別的人臉添加一些標簽)。
如果檢測到人臉,則遞增變量。face_count
最后,如果一分鐘過去了,請執(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)
就是這樣!
運行 Python 應用程序,您應該會看到相機窗口出現(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上的這個要點中找到。
Notehub 到云
當項目處于當前狀態(tài)時,記事卡將在數(shù)據(jù)進入時立即開始與 Notehub 同步數(shù)據(jù)(每分鐘一次)。您將看到這些注釋(或事件)顯示在項目的“事件”選項卡中:
雖然看到這些數(shù)據(jù)出現(xiàn)很酷,但它并不是那么有用。讓我們添加一個快速集成,以使用Notehub Routes?和 Datacake 構建基于云的儀表板。
Notehub 支持通過 HTTPS 和 MQTT 協(xié)議將數(shù)據(jù)路由到幾乎任何托管云服務。Blues 提供路由教程,引導您完成流程中的每一步。將數(shù)據(jù)路由到 Datacake
Datacake?是一個低代碼平臺,可讓您在最短的時間內(nèi)構建 IoT 應用程序(正如我們今天將在這里看到的那樣)。
現(xiàn)在,如果您查看發(fā)送到 Notehub 的事件之一并查看 JSON 選項卡,您將看到可以路由到 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,但我們唯一關心的值是temperature 、 pressure 、 humidity 、 voltage 和 face_count 。
創(chuàng)建Datacake路由
與其重新發(fā)明輪子,不如前往 blues.dev 上的完整 Datacake 教程來完成路由的初始創(chuàng)建。來吧,我發(fā)誓不會花太長時間!
我們需要對 Datacake 中的字段和有效負載解碼器設置的配置進行一些編輯。
在 Datacake 中添加字段
由于我們要向 Datacake 發(fā)送上述temperature、pressure、humidity 、 voltage 和 face_count變量,因此我們需要確保 Datacake 知道預期它們。
導航到 Datacake 中設備配置的“字段”部分。確保這些值與此處顯示的值一致(如果您有其他字段,那很好,它們將被儀表板忽略):
在 Datacake 中更新 HTTP 有效負載解碼器
Datacake 有一個“有效負載解碼器”,它將使用您從 Notehub 發(fā)送的 JSON 有效負載,然后將該數(shù)據(jù)調整為在儀表板中表示它所需的格式。
我將為您省去一個步驟,并為您提供我使用的完整有效負載解碼器代碼:
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 儀表板
接下來,導航到 Datacake 中的“儀表板”選項卡。使用它們提供的 GUI 工具將適當?shù)男〔考砑拥綀D表值,如溫度、壓力、檢測到的人臉數(shù)量等。
總而言之,您應該擁有一個華麗的基于云的儀表板!
下一步是什么?
希望您已經(jīng)看到向 Raspberry Pi 添加低帶寬蜂窩連接是多么容易。需要注意的是,Notecard 還支持幾乎所有現(xiàn)代主機 MCU(如 STM32、ESP32、Nordic 等)。您可以使用Blues Starter Kit開始使用STM32主機。
不過,更有可能的是,您正在尋找Blues Notecarrier Pi 帽子和任何記事卡,以開始在 Pi 上使用蜂窩網(wǎng)絡。
審核編輯:湯梓紅
-
傳感器
+關注
關注
2551文章
51099瀏覽量
753568 -
蜂窩網(wǎng)絡
+關注
關注
2文章
209瀏覽量
21652 -
樹莓派
+關注
關注
116文章
1707瀏覽量
105631 -
RaspberryPi
+關注
關注
1文章
40瀏覽量
9091
原文標題:創(chuàng)客項目秀|基于 Raspberry Pi 5 的蜂窩物聯(lián)網(wǎng)
文章出處:【微信號:ChaiHuoMakerSpace,微信公眾號:柴火創(chuàng)客空間】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論