画像処理 デジカメ弐号機 第2回 SDカードとリアルタイムクロック
2022.10.21
YouTubeでポイントを説明しています。画像をクリックすると再生できます。
デジカメ弐号機 第2回では、SDカードモジュールとリアルタイムクロックモジュールの単体テストを行います。
●Adafruit QT Py ESP32-S2 WiFi Dev Board with STEMMA QT
弐号機で使用するマイコンボードです。
・ESP32-S2 240MHz Tensilica processor
・4 MB Flash & 2 MB PSRAM
・2.4 GHz Wi-Fi System-on-Chip (SoC)
・3.3V regulator with 600mA peak output
Ref.Adafruit QT Py ESP32-S2
■Adafruit Micro SD SPI or SDIO Card Breakout Board - 3V ONLY!
microSDカードモジュールです。3.3V駆動系専用です。
下記のように結線しています。
| QT Py | - | micro SDカード |
| 3V | - | 3.3V |
| GND | - | GND |
| SCK[SCK] | - | CLK:SPI Clock pin |
| MI[MISO] | - | SO:Microcontroller In Serial Out pin |
| MO[MOSI] | - | SI:Microcontroller Out Serial In pin |
| A3 | - | CS:Chip Select pin |
| RasPi[10]←TX | | |
ラズベリーパイと繋いで、ソースコードをビルドします。

ソースコードのビルドには、PlatformIOを使用しています。
Arduino開発環境構築 PlatformIO
プロジェクトを作成します。
$ mkdir ArduCam
$ cd ArduCam
$ platformio init -b adafruit_qtpy_esp32s2
環境設定ファイルを編集します。
$ vi platform.ini
[env:adafruit_qtpy_esp32s2]
platform = espressif32
board = adafruit_qtpy_esp32s2
framework = arduino
platform_packages =
framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32
build_flags =
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
upload_port = /dev/ttyACM0
●SDカードチェック用ソースコード
テストとして、SDカード内のファイルを表示します。
よくあるコードなので説明することはないのですが、
QT Py ESP32-S2 では、TX, RX はハードウェアシリアル Serial1 に関連付けられています。
$ vi src/listfiles.ino
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
File root;
#define SPI_MISO MISO
#define SPI_MOSI MOSI
#define SPI_SCK SCK
#define SPI_SD_SS A3
SPIClass SDSPI(HSPI);
void setup() {
Serial1.begin(115200);
Serial1.println("Initializing SD card...");
SDSPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI, -1);
pinMode(SPI_SD_SS, OUTPUT);
while(!SD.begin(SPI_SD_SS, SDSPI)) {
Serial1.println("initialization failed!");
delay(1000);
}
Serial1.println("initialization done.");
root = SD.open("/");
printDirectory(root, 0);
Serial1.println("done!");
}
void loop() {}
void printDirectory(File dir, int numTabs) {
// Begin at the start of the directory
dir.rewindDirectory();
while(true) {
File entry = dir.openNextFile();
if (! entry) break; // no more files
for (uint8_t i=0; i<numTabs; i++) {
Serial1.print('\t'); // we'll have a nice indentation
}
Serial1.print(entry.name());
// Recurse for directories, otherwise print the file size
if (entry.isDirectory()) {
Serial1.println("/");
printDirectory(entry, numTabs+1);
} else {
// files have sizes, directories do not
Serial1.print("\t\t");
Serial1.println(entry.size(), DEC);
}
entry.close();
}
}
ソースコードをビルドして、QT Py に書き込みます。
$ pio run -t upload
PlatformIOのデバイスモニターで、SDカード情報をラズベリーパイのコンソールに表示します。
$ pio device monitor -p /dev/ttyAMA0 -b 115200
Initializing SD card...
initialization done.
System Volume Information/
IndexerVolumeGuid 76
WPSettings.dat 12
treva.bmp 20790
YoRHa2B.tga 172818
AkaiHana.jpg 15175
AvePooling.tga 230418
Chchange.tga 230418
GrayScale.tga 230418
interface_noise_black.jpg 10368
ReverseColor.tga 230418
done!
ArduinoのSDカード用標準ライブラリでは、ファイル名は8.3形式([8文字以内半角英数ファイル名].[3文字以内拡張子])ですが、
ESP32系ライブラリでは、この制約はありません。
■Adafruit PCF8523 Real Time Clock (RTC) Breakout Board - STEMMA QT / Qwiic
PCF8523 RTC を搭載 - 3.3V または 5V の電源とロジックから実行できます。
CR1220リチウムボタン電池でバックアップされたリアルタイムクロックモジュールです。
| QT Py | - | PCF8523(RTC) |
| 3V | - | VIN |
| GND | - | GND |
| SCL | - | SCL |
| SDA | - | SDA |
|
The default I2C address is 0x68.
The SQW pin is for square-wave output if you enable it.
|
adafruit/RTClib

実装のポイント
1.ESP32のプログラム起動時の初期処理で、WiFi接続を行い、NTPによりタイムサーバーから時刻を取得する。
2.自宅ではブロードバンドルーター、.屋外ではAndroidスマホのテザリング機能を利用して、WiFi接続を行う。
3.取得した時刻情報をもとに、リアルタイムクロックの保持している時刻を補正する。
下記の解説記事も参考にしてください。
NTP 時刻取得と活用
$ vi src/pcf8523.ino
#include <SPI.h>
#include <WiFi.h>
#include <time.h>
#include "RTClib.h"
#define TIMEZONE_JST (3600 * 9) // 日本標準時:UTC(世界標準時)より9時間早い
#define DAYLIGHTOFFSET_JST (0) // サマータイムなし
const char* ntp_server1 = "ntp.nict.jp";
const char* ntp_server2 = "pool.ntp.org";
static char *ssid[] = {"xxxxxxxx","xxxxxxxx"};
static char *password[] = {"xxxxxxxx","xxxxxxxx"};
int wifi_cnt = 2;
static time_t t = 0;
RTC_PCF8523 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"};
void get_ntp(int num) {
int cnt = 0;
WiFi.begin(ssid[num], password[num]);
while (WiFi.status() != WL_CONNECTED) {
if ((++cnt)==20) return;
delay(500);
}
configTime(TIMEZONE_JST, DAYLIGHTOFFSET_JST, ntp_server1, ntp_server2);
for (cnt=0;cnt<10;++cnt) {
t = time(NULL);
if (t>TIMEZONE_JST) break;
delay(500);
}
WiFi.disconnect();
}
void setup () {
Serial1.begin(115200);
if (! rtc.begin()) {
Serial1.println("Couldn't find RTC");
Serial1.flush();
while (1) delay(10);
}
for (int i=0;i<wifi_cnt;++i) {
get_ntp(i);
if (t>TIMEZONE_JST) {
struct tm* tm = localtime(&t);
rtc.adjust(DateTime(tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec));
break;
}
}
rtc.start();
}
void loop () {
DateTime now = rtc.now();
Serial1.printf("%04d/%02d/%02d(%s)%02d:%02d:%02d\n",
now.year(),
now.month(),
now.day(),
daysOfTheWeek[now.dayOfTheWeek()],
now.hour(),
now.minute(),
now.second());
delay(3000);
}
static char *ssid[] = {"xxxxxxxx","xxxxxxxx"};
static char *password[] = {"xxxxxxxx","xxxxxxxx"};
配列 ssid[],password[] の1番目に自宅のブロードバンドルータのSSIDとパスワード、
2番目にAndroidスマホのアクセスポイントのSSIDとパスワードを設定しています。
ビルドに必要なライブラリに関しては、設定ファイル(platform.ini)の
lib_deps = に指定してもよいのですが、GitHubからライブラリをダウンロード、展開して、必要なファイルをソースと同じディレクトリに置いてビルドしています。
adafruit/Adafruit_BusIO
adafruit/RTClib
・Adafruit_I2CDevice.cpp
・Adafruit_I2CDevice.h
・RTC_PCF8523.cpp
・RTClib.cpp
・RTClib.cpp
$ pio run -t upload
$ pio device monitor -p /dev/ttyAMA0 -b 115200
2022/10/04(Tue)12:28:55
2022/10/04(Tue)12:28:58
2022/10/04(Tue)12:29:01
2022/10/04(Tue)12:29:04
2022/10/04(Tue)12:29:07
2022/10/04(Tue)12:29:10
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」
「一念発起して何かを始めても、いつも三日坊主で終わってしまう」
「色んなことを先延ばしにしたまま、時間だけが過ぎていく」
そこで本書では、そんな著者が独自に開発した、
まったく新しい目標達成メソッド「100日デザイン」について、
その知識と技術を、余すところなくご紹介します。
まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。
ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。
今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。
ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。
29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!
【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。
基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説!
500以上のサンプルを掲載。実行結果も確認。
全24章の包括的なチュートリアル。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。
Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード
電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)
|