SSブログ

一月の電子工作「SPRESENSEでタイムラプスカメラを作ろう」ーSDカードドライバの検討ー [SPRESENSE]

前回、SPRESENSEのメインボードのSPIに接続するSDカード・アドオンボードを作りました。今回は、Arduino IDEでカメラ画像をSDカードに保存するためのSDカードドライバを検討しました。


DSC02005.JPG


■ Arduino のSDカードライブラリが使えない!?
Arduino の標準のSDカードライブラリがそのまま使えればラッキーだなと思ったのですが、SPIのインスタンスを渡すAPIがない。CSピンを指定するようになっています。

  class SDClass {
    ... snip ...
    public:
      boolean begin(uint8_t csPin = SD_CHIP_SELECT_PIN);
      boolean begin(uint32_t clock, uint8_t csPin);
  };
    ... snip ...


実装を見ると、ハードウェアはArduino UNO前提で、その他はソフトウェアSPIを使う様になっています。SPRESENSEのハードウェアSPIましてはSPI5はまず使えそうにありません。

で、オリジナルのSDライブラリを作り変えようと思ったらリードオンリ。それではとコピーして作り直そうとしたら名前がバッティングして使えない。

う~ん、困りました。


■ SPRESENSE用のSDカードライブラリを自作
いろいろ試行錯誤をしましたが、無理して使うより既存のArduinoの実装を参考にして作り直したほうが早いんじゃね?と思い、作り直すことにしました。Arduino の Library にしましたので、もしよかったら使ってやってください。恐らく拡張ボードのSPIも使えると思います。
(実は試してない( ^ω^)・・・)


s_github.png YoshinoTaro/SPISD

Contribute to YoshinoTaro/SPISD development by creating an account on GitHub.
github.com



■ 画像をSDカードに記録してみた!
カメラで撮影した画像をSDカードに記録するためのスケッチを作ってみました。このスケッチはサンプルにすでに入れているのですが、こちらでも紹介します。

このSDカードライブラリはクラス名が異なるのと、初期化時にSPIのインスンタンスを与えられるところ以外は従来のSDカードライブラリとまったく同じです。

#include <SPI.h>
#include <SPISD.h>
#include <Camera.h>

SpiSDClass SD(SPI5);

const int intPin = 0;
static bool bButtonPressed = false;
static int gCounter = 0;

void changeState () {
  bButtonPressed = true;
}

void setup() {
  Serial.begin(115200);
  if (!SD.begin(SPI_FULL_SPEED)) {
    Serial.println("SD.begin() failed");
    return;
  }

  theCamera.begin();
  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);
  CamImage img = theCamera.takePicture();
  if (img.isAvailable()) {
      char filename[16] = {0};
      sprintf(filename, "PICT%03d.JPG", gCounter);
      SpiFile myFile = SD.open(filename,FILE_WRITE);
      myFile.write(img.getImgBuff(), img.getImgSize());
      myFile.close();
      ++gCounter;
  }
  bButtonPressed = false;
  digitalWrite(LED0, LOW);
}


このスケッチは、ボタンを押すことで画像を記録するようになっています。かなりシンプルに使えるものになりました。実際に撮影してみた画像がこちら。


PICT001.JPG


なかなかいい感じで取れています。最終的にはタイムラプスにするので、ボタンではなく一定間隔でスリープから起動して記録していくようにしていきます。ここまで出来たので、残りの仕事は大したものではないでしょう。

しかし、記録にかなり時間がかかっています。何か実装がまずいのかも知れません…。とりあえず記録できているので、今の所はヨシとしましょう。

最後の難関は筐体の設計。いろいろと想定と変わってしまったので、最終的な形はスティックにはならなさそうです。簡単にはいかないですねぇ。Fusion360は久しぶりすぎて使えるか不安。
(´・ω・`)



関連リンク
一月の電子工作「SPRESENSEでタイムラプスカメラを作ろう」
https://makers-with-myson.blog.ss-blog.jp/2021-01-04
一月の電子工作「SPRESENSEでタイムラプスカメラを作ろう」ー充電回路の検討ー
https://makers-with-myson.blog.ss-blog.jp/2021-01-10
一月の電子工作「SPRESENSEでタイムラプスカメラを作ろう」ーSDカードの検討ー
https://makers-with-myson.blog.ss-blog.jp/2021-01-17
一月の電子工作「SPRESENSEでタイムラプスカメラを作ろう」ーついに完成!ー
https://makers-with-myson.blog.ss-blog.jp/2021-01-31





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE カメラモジュール CXD5602PWBCAM1

SONY SPRESENSE カメラモジュール CXD5602PWBCAM1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware







nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。