Arduino用のSDカードシールドをMicroPythonで使ってみようと思います。
Amazonで購入しました。
https://www.amazon.co.jp/dp/B07GDZ9XLN/
ボードは NUCLEO-F446RE を使用しています。
Arduino互換のピン配置なのでピッタリ収まります。
SDカードへアクセスする前にRTCを動かしてみます。
RTCクラスをインポートして簡単に表示できました。
from machine import RTC
import utime
rtc = RTC()
while True:
dt = rtc.datetime()
print(dt)
utime.sleep_ms(1000)
何も設定していないのに現在時刻・・。
PCの現在時刻を変更したらRTCの時刻も変更されました。
この辺がどういう仕組みなのかは良くわかっていませんが、シールド上のIC「DS1307」を使用しているわけでは無いようです。
秋月電子にあるデータシートから調べるとDS1307へアクセスするI2CのSCL, SDAは、F446REのPC0, PC1に接続されていました。
DS1307用のライブラリをダウンロードしてインストールします。
https://github.com/mcauser/micropython-tinyrtc-i2c
200ミリ毎にDS1307から時刻を読み取りOLEDへ表示してみました。
F446REのPC0, PC1はI2C用のピンでは無いので、SoftI2Cを使ってDS1307へアクセスしています。
from machine import I2C, SoftI2C, RTC
import ds1307
import ssd1306
import utime
i2c_oled = I2C(1, freq=100000)
i2c_rtc = SoftI2C(scl='PC0', sda='PC1', freq=100000)
display = ssd1306.SSD1306_I2C(128, 64, i2c_oled)
display.init_display()
display.write_cmd(0xa0)
display.write_cmd(0xc0)
rtc = RTC()
dt = rtc.datetime()
rtc = ds1307.DS1307(i2c_rtc)
rtc.datetime(dt)
while True:
display.fill(0)
dt = rtc.datetime()
p0 = "{:d}/{:d}/{:d}".format(dt[0], dt[1], dt[2])
p1 = "{:02d}:{:02d}:{:02d}".format(dt[4], dt[5], dt[6])
display.text(p0, 0, 0, True)
display.text(p1, 16, 10, True)
display.show()
utime.sleep_ms(200)
下記のコードでPCの時刻を読み取り、DS1307へ設定しています。
rtc = RTC()
dt = rtc.datetime()
rtc = ds1307.DS1307(i2c_rtc)
rtc.datetime(dt)
正しく表示できました。
スタンドアロンでも試してみます。
DS1307への書き込みをコメントアウトして、main.pyへ上記のコードを貼り付けて保存します。
rtc = RTC()
dt = rtc.datetime()
rtc = ds1307.DS1307(i2c_rtc)
バックアップ電池(CR1220)をセットしているので、PCと切断してUSB電源に繋ぐと現在時刻が表示されました。