LSI Jiu-Jitsu

電子工作とブラジリアン柔術

MicroPythonで遊ぶ (4) - SDカードシールド(RTC)

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)  # Ch.1 SCL=PB8, SDA=PB9
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)
#rtc.datetime(dt)


バックアップ電池(CR1220)をセットしているので、PCと切断してUSB電源に繋ぐと現在時刻が表示されました。