編集履歴一覧に戻る
katiのアイコン画像

kati が 2025年01月26日05時01分32秒 に編集

初版

タイトルの変更

+

高齢者の見守り

タグの変更

+

Arduino-IDE

+

SPRESENSE

+

液晶モジュール

+

HDRカメラボード

+

ガスセンサ

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

ライセンスの変更

+

(MIT) The MIT License

本文の変更

+

# デモ動画 @[youtube](https://youtu.be/V3hU87MgWCI) # 部品 使用するハードウェアを次に示します。 | 部品名 | 個数 | |:---:|:---| | Spresenseメインボード | 1 | | Spresense拡張ボード | 1 | | Spresense HDRカメラボード | 1 | | ILI9341搭載2.8インチSPI制御タッチパネル付TFT液晶 MSP2807 1 | 1 | | SPRESENSE用ガスセンサ BME680基板 | 1 | 使用するソフトウェアを次に示します。 | ソフトウェア名 | |:---:| | Arduino IDE | # 設計図 「高齢者の見守り」は、一人身の高齢者や、遠く離れて生活している高齢者の親の生活状況を監視し、その結果を液晶に表示し、LINEを使って(この機能については未実装)介護者や家族のパソコンや携帯に通知する、見守り機能を持ちます。 「高齢者の見守り」は、次に示すハードウェアにより構成されます。 ![キャプションを入力できます](https://camo.elchika.com/46e7b9acccf8ada64da7b8b34cd06a7202260cda/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376166663263352d333862312d343363632d386666362d6634376364396530343432352f31646566663438662d666130622d343863382d613636312d636461323337623961313838/) 「高齢者の見守り」は、次のようにして開発しました。 - Spresenseメインボード上で動作するプログラムはArduino IDEを使って開発します。 - 定期的に HDRカメラボードからの画像データや、ガスセンサ BME680基板 からの温度・湿度データを取得して液晶モジュールに表示します。 # 接続図 Spresenseメインボードに ガスセンサ BME680基板をAddonし、カメラコネクタによりHDRカメラボード を接続し、Spresenseメインボードと接続したSpresense拡張ボードに、SPIインタフェースを持つ液晶モジュールを次のように接続します。なお、ガスセンサ BME680基板は、I2Cインタフェースにより温度・湿度データを取得します。 ![キャプションを入力できます](https://camo.elchika.com/fbaa1d63a7fb21f092f82520d0a1431ec6716e86/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376166663263352d333862312d343363632d386666362d6634376364396530343432352f61323438383537642d346637632d346565642d613739632d326337393664366664393665/) # ハードウェア 液晶モジュールは、背面からSpresense拡張ボードにSPIインタフェースにより接続します。Spresenseメインボードに接続されたHDRカメラボードからの画像データと、ガスセンサ BME680基板からの温度・湿度データは、定期的に取得して液晶モジュールに表示します。 ![キャプションを入力できます](https://camo.elchika.com/a7482c5bc94e7251164add791b3a4d7559670b4c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376166663263352d333862312d343363632d386666362d6634376364396530343432352f39373666396435302d373835312d343765382d623738652d316164346461333964373633/) # ソースコード プログラム「高齢者の見守り」のSpresenseメインボード上で動作するコード「 SpresenseCamera.ino」は、Arduino IDEを使用して開発します。 コード「 SpresenseCamera.ino」は、4秒ごとにHDRカメラボードからのカメラ画像を、ビットマップに変換して液晶モジュールに表示します。同時にガスセンサ BME680基板から取得した温度、気圧、湿度、CO2の値を液晶モジュールの画面に重ねて表示します。 ```html: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カードを入手して取得したカメラ画像や温度等の環境情報を、携帯に転送してみたいと考えています。