katiのアイコン画像
kati 2025年01月26日作成 © MIT
製作品 製作品 閲覧数 66
kati 2025年01月26日作成 © MIT 製作品 製作品 閲覧数 66

高齢者の見守り

高齢者の見守り

デモ動画

ここに動画が表示されます

部品

使用するハードウェアを次に示します。

部品名 個数
Spresenseメインボード 1
Spresense拡張ボード 1
Spresense HDRカメラボード 1
ILI9341搭載2.8インチSPI制御タッチパネル付TFT液晶 MSP2807 1 1
SPRESENSE用ガスセンサ BME680基板 1

使用するソフトウェアを次に示します。

ソフトウェア名
Arduino IDE

設計図

「高齢者の見守り」は、一人身の高齢者や、遠く離れて生活している高齢者の親の生活状況を監視し、その結果を液晶に表示し、LINEを使って(この機能については未実装)介護者や家族のパソコンや携帯に通知する、見守り機能を持ちます。

「高齢者の見守り」は、次に示すハードウェアにより構成されます。

キャプションを入力できます

「高齢者の見守り」は、次のようにして開発しました。

  • Spresenseメインボード上で動作するプログラムはArduino IDEを使って開発します。
  • 定期的に HDRカメラボードからの画像データや、ガスセンサ BME680基板 からの温度・湿度データを取得して液晶モジュールに表示します。

接続図

Spresenseメインボードに ガスセンサ BME680基板をAddonし、カメラコネクタによりHDRカメラボード を接続し、Spresenseメインボードと接続したSpresense拡張ボードに、SPIインタフェースを持つ液晶モジュールを次のように接続します。なお、ガスセンサ BME680基板は、I2Cインタフェースにより温度・湿度データを取得します。

キャプションを入力できます

ハードウェア

液晶モジュールは、背面からSpresense拡張ボードにSPIインタフェースにより接続します。Spresenseメインボードに接続されたHDRカメラボードからの画像データと、ガスセンサ BME680基板からの温度・湿度データは、定期的に取得して液晶モジュールに表示します。

キャプションを入力できます

ソースコード

プログラム「高齢者の見守り」のSpresenseメインボード上で動作するコード「 SpresenseCamera.ino」は、Arduino IDEを使用して開発します。

コード「 SpresenseCamera.ino」は、4秒ごとにHDRカメラボードからのカメラ画像を、ビットマップに変換して液晶モジュールに表示します。同時にガスセンサ BME680基板から取得した温度、気圧、湿度、CO2の値を液晶モジュールの画面に重ねて表示します。

SpresenseCamera.ino

#include "SPI.h" #include "Adafruit_ILI9341.h" #include <Camera.h> #include "Adafruit_BME680.h" #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME680 bme(&Wire); // I2C #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); /**************************************************************************** * Print error message ****************************************************************************/ void printError(enum CamErr err) { Serial.print("Error: "); switch (err) { case CAM_ERR_NO_DEVICE: Serial.println("No Device"); break; case CAM_ERR_ILLEGAL_DEVERR: Serial.println("Illegal device error"); break; case CAM_ERR_ALREADY_INITIALIZED: Serial.println("Already initialized"); break; case CAM_ERR_NOT_INITIALIZED: Serial.println("Not initialized"); break; case CAM_ERR_NOT_STILL_INITIALIZED: Serial.println("Still picture not initialized"); break; case CAM_ERR_CANT_CREATE_THREAD: Serial.println("Failed to create thread"); break; case CAM_ERR_INVALID_PARAM: Serial.println("Invalid parameter"); break; case CAM_ERR_NO_MEMORY: Serial.println("No memory"); break; case CAM_ERR_USR_INUSED: Serial.println("Buffer already in use"); break; case CAM_ERR_NOT_PERMITTED: Serial.println("Operation not permitted"); break; default: break; } } void CamCB(CamImage img) { /* Check the img instance is available or not. */ if (img.isAvailable()) { if (!bme.performReading()) { Serial.println("Failed to perform reading :("); return; } /* If you want RGB565 data, convert image data format to RGB565 */ img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565); /* You can use image data directly by using getImgSize() and getImgBuff(). * for displaying image to a display, etc. */ tft.fillRect(0, 0, 100, 240, ILI9341_WHITE); tft.drawRGBBitmap(100, 0, (uint16_t *)img.getImgBuff(), 320, 240); tft.setTextSize(2); tft.setCursor(0, 0); tft.setTextColor(ILI9341_BLACK); tft.println(); tft.println("TEMP(*C):"); tft.println(bme.temperature); tft.println(); tft.println("PRES(hPa):"); tft.println(bme.pressure / 100.0); tft.println(); tft.println("HUM(%):"); tft.println(bme.humidity); tft.println(); tft.println("GAS(KOhm):"); tft.println(bme.gas_resistance / 1000.0); tft.println(); delay(4000); } else { Serial.println("Failed to get video stream image"); } } void setup() { CamErr err; Serial.begin(115200); Serial.println("ILI9341 text start!"); tft.begin(); tft.setRotation(1); if (!bme.begin()) { Serial.println("Could not find a valid BME680 sensor, check wiring!"); while (1) ; } // Set up oversampling and filter initialization bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms Serial.println("Prepare camera"); err = theCamera.begin(); if (err != CAM_ERR_SUCCESS) { printError(err); } /* Start video stream. */ Serial.println("Start streaming"); err = theCamera.startStreaming(true, CamCB); if (err != CAM_ERR_SUCCESS) { printError(err); } } void loop(void) { }

感想と展望

今回は、LTE拡張ボードを使用したLINEによる通信機能が実装できませんでした。時間を取り、SIMカードを入手して取得したカメラ画像や温度等の環境情報を、携帯に転送してみたいと考えています。

  • kati さんが 2025/01/26 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する