t-kondoy が 2024年01月31日22時40分42秒 に編集
コメント無し
メイン画像の変更
本文の変更
## 最初に 以前ArduinoUnoとカメラボードでデジカメを作りたいと試した事があったのですが、 その時はうまくいかず断念。 PCと接続してPCの画面には表示出来たところでプロジェクトは終了してしまいました。 今回このコンテストでモニター提供頂いた事をきっかけに再びデジカメ製作意欲が湧いたので再度挑戦する事にしました。 Spresenseを使用するメリットは高性能かつ省電力と言う部分だと思います。 またSONY製のHDRの対応カメラボードがそのまま使用出来るのも開発のハードルを大きく下げてくれているように思います。 それでは製作の流れは以下 ## 使用部材 - **Spresenseメインボード** - **Spresense拡張ボード** - **Spresense HDRカメラボード** - **ILI9341搭載2.8インチSPI制御タッチパネル付TFT液晶 MSP2807** - タクトスイッチ 12mm TVGP01-G73BB(黒) - スライドスイッチ 1回路2接点 - スライドスイッチ 1回路2接点 - リチウムイオンバッテリー3.7V 600mA - リチウム電池充電器基板 USB Type-C TP4056 5V 1A - 3Dプリンタ用フィラメント - MicroSDHC 32GB - USBケーブル(MicroB) ※モニター試供品は太字にしています。 ## 接続図 接続図は以下の通りです。 ![キャプションを入力できます](https://camo.elchika.com/c9d1ff64a4a1afe71b4969fca50d9b258c98ca8d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37343262393632352d373139662d343934302d613061642d3030333032623965366136662f39353135656535322d643562622d343061312d393539362d346631363930346464666363/) 液晶ディスプレイとタクトスイッチ共に拡張ボード側の端子を使用しています。 カメラはフレキシブルケーブルで繋がってますが断線しそうで怖い。。。 ## モデリング カメラの筐体についてはAutodeskのFusion360で製作しました。 モデルリンクはこちらです。 https://a360.co/3SD7iv3 カメラモジュールやディスプレイ、タクトスイッチ等メーカーの仕様を確認してモデリングを行っています。 部品寸法を書いてくれているのは本当に有り難いです。 # 各種参考データシート https://developer.sony.com/spresense/development-guides/home_ja.html https://akizukidenshi.com/goodsaffix/msp2807.pdf https://akizukidenshi.com/goodsaffix/CAP.pdf https://akizukidenshi.com/goodsaffix/AKIZUKI-SS-12F15G6.pdf ## プログラム 今回はArduinoIDEを使用してシンプルなカメラ機能に絞っています。 電源が入ると起動しディスプレイにカメラの映像が表示されるので、 タクトスイッチを押す事で撮影されMicroSDに保存されます。 撮影時のプレビューは3秒に設定しています。 また個人的に白黒写真にハマっているので白黒写真しか撮れない仕様にしました。 ```arduino:Spresense_camera #include <Camera.h> #include <SPI.h> #include <SDHCI.h> #include "Adafruit_GFX.h" #include "Adafruit_ILI9341.h" // TFTディスプレイのピン定義 #define TFT_RST 8 #define TFT_DC 9 #define TFT_CS 10 // TFTディスプレイの初期化 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS ,TFT_DC ,TFT_RST); SDClass theSD; bool bButtonPressed = false; int gCounter = 0; // タクトスイッチが押された時の状態変更関数 void changeState () { bButtonPressed = true; } // カメラからの画像取得コールバック関数 void CamCB(CamImage img){ if (img.isAvailable()) { img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565); tft.drawRGBBitmap(0, 0, (uint16_t *)img.getImgBuff(), 320, 240); if (bButtonPressed) { tft.setTextSize(2); tft.setCursor(100, 200); tft.setTextColor(ILI9341_RED); tft.println("Shooting"); } } } int intPin = 2; // タクトスイッチのピン番号 void setup() { pinMode(LED0, OUTPUT); pinMode(intPin, INPUT_PULLUP); theSD.begin(); Serial.begin(115200); tft.begin(); tft.setRotation(3); CamErr err; // カメラの初期化 err = theCamera.begin(); if (err != CAM_ERR_SUCCESS) { Serial.println("Error: Failed to initialize camera"); return; } // カメラのカラー効果を白黒に設定 err = theCamera.setColorEffect(CAM_COLOR_FX_BW); if (err != CAM_ERR_SUCCESS) { Serial.println("Error: Failed to set color effect to black and white"); return; } // カメラのストリーミング開始 theCamera.startStreaming(true, CamCB); // 画像のフォーマット設定 theCamera.setStillPictureImageFormat( CAM_IMGSIZE_QUADVGA_H, CAM_IMGSIZE_QUADVGA_V, CAM_IMAGE_PIX_FMT_JPG); // タクトスイッチの割り込み設定 attachInterrupt(digitalPinToInterrupt(intPin), changeState, FALLING); } void loop() { if (!bButtonPressed) return; Serial.println("button pressed"); digitalWrite(LED0, HIGH); // ストリーミングを一時停止 theCamera.startStreaming(false, CamCB); // 画像の撮影 CamImage img = theCamera.takePicture(); if (img.isAvailable()) { char filename[16] = {0}; sprintf(filename, "PICT%03d.JPG", gCounter); File myFile = theSD.open(filename, FILE_WRITE); myFile.write(img.getImgBuff(), img.getImgSize()); myFile.close(); ++gCounter; } // 撮影後の待機時間 delay(3000); // ボタンの状態をリセットし、ストリーミングを再開 bButtonPressed = false; theCamera.startStreaming(true, CamCB); digitalWrite(LED0, LOW); } ``` Spresenseとディスプレイの接続はSONYのチュートリアルを参考にしました。 タクトスイッチは拡張ボードのD2ピンで入力検出を行っています。 コードもシンプルなので動作は非常に安定しています。 ## 完成 ![キャプションを入力できます](https://camo.elchika.com/7e968bf6fd17b88cd202c74ea551da61b049db38/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37343262393632352d373139662d343934302d613061642d3030333032623965366136662f31643032623863342d343432382d346536392d613731332d636464646139666364313164/)
![キャプションを入力できます](https://camo.elchika.com/774d08570acc27c0b5860ea153a1ff581a03ec09/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37343262393632352d373139662d343934302d613061642d3030333032623965366136662f66663630303466342d343036382d346232302d626133372d303235336161656238643836/) ![キャプションを入力できます](https://camo.elchika.com/5dc5702bb375b97ed144ebc62a65b9b448863984/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37343262393632352d373139662d343934302d613061642d3030333032623965366136662f33343337373039362d383636372d343236382d623932662d323737343266343330356464/) ![キャプションを入力できます](https://camo.elchika.com/162d88d477a8db868e2b26e35fdd968391bb77d9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37343262393632352d373139662d343934302d613061642d3030333032623965366136662f37663432646162302d313539312d343233342d613730662d306162656431323539653334/)
## 個人的感想とか 何かを個人で製作する時はモチベーションが続かなくなる事が結構あります。 特に私はすぐに違う事柄に目がいきがち。 製作期間が長くなればなるほど、またエラーの解消に時間がかかればかかる程モチベーションは下がりますよね。 なのでこのようなコンテストを開催してもらえるのは本当にありがたいと思います。 期限設定がありますし、コンテスト作品をたくさんの人に見ていただけるのも嬉しいポイントです。 ## 製作秘話 まず最初は通信するものに使用と思っていましたがBluetoothモジュールと9軸の加速度センサーを希望したと勘違いしていて、同封されていなかったことから通信を諦めました。 個人的に写真が趣味なので自作のカメラが作れたら楽しいだろうなと思っていました。 まぁスマホがあるから、「それ要る?」って思うかもですが、カメラとして白黒の写真だけが撮れるカメラって「なんかいいな!」と思っていたのと市販のトイデジはカッコよくないんですよね。 だから自作で自分の欲しいカメラが作れたらクールだなと考えた訳です。 こうやって自分が欲しいものを形に出来る事に「良い時代に生まれたな」と感じた次第です。 3Dプリントは失敗しまくりです。 冬の寒さもありファーストレイヤーが反って剥がれてしまいパスタが沢山出来上がりました。 あとはフィラメントが湿気ていたのも原因かもしれません。 本当は透明の筐体で作りたかったのですが、泣く泣く新品の光沢なしフィラメントを出して出力しました。 プラス日中の暖かい時に印刷をした事で無事作れました。 ## 今後について コンテスト作品としてはここで完成としますが、今後機能追加を考えています。 Bluetooth接続でスマホと繋いでNTPサーバの日時取得。 写真の転送機能 撮影ポイントのGPS位置情報 撮影ポイント周辺の歴史についてChatGPTAPIから音声出力 シャッター時の音追加 NNCを利用したAI機能など 実現出来るかは分かりませんが引き続き少しずつ触りながら記事追加していきたいと思います。 ## 最後に 製作レベルやクオリティは千差万別だと思いますが、どの人も作品を完成させるまでには、その人にしか分からない苦悩と努力が必ずあります。 何かを作ることって本当に難しい。 今回応募されたすべての方の作品と努力に敬意を表したいと思います。 本当にお疲れ様でした。