ゆるく楽しむプログラミング

M5StickCで作るクロック&カレンダー

内蔵RTCを使用して、クロックとカレンダー、ついでに1分タイマーを作ります
時刻合わせはUIを作るのが面倒なので、起動時にNTPから現在時刻を取得します。
表示の切り替えは、IMU(加速度センサー)でM5StickCの姿勢を計測して行います。



RTC(BM8563)

RTCはI2C(SDA-G21、SCLーG22)で接続している。
M5ライブラリを使用する場合にはWire1に割り当てられる、M5.begin()内で定義されるようで、Wire1の定義は不要

RTC(BM8563)のレジスタ
アドレス BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT70
00h TEST1 x STOP x TESTC x x x
01h x x x TI_TP Alerm TIMER Alerm割込 TIMER割込
02h VL 秒 10の位 0~5 秒 1の位 0~9
03h x 分 10の位 0~5 分 1の位 0~9
04h x x 時 10の位 0~2 時 1の位 0~9
05h x x 日 10の位 0~2 日 1の位 0~9
06h x x x x x 曜日 0~6
07h 世紀 x x 月 0~1 月 1の位 0~9
08h 年 10の位 0~2 年 1の位 0~9
STOP:1にするとClockが停止
TI_TP:1にするとPowerOnで設定がリセット

IMU(加速度センサー)

XYZ軸の加速度と角速度を検知する6軸の加速度センサー MPU6886 を内蔵しており I2C(SDA-G21、SCLーG22)で接続している


起動時にはスリープモードになっているので
動作モードを設定しないと動きません。

使わない時は止まっているので邪魔にならない仕様です。
レジスタ 内容
0x3B-0x3C X軸加速度 (符号付き16Bit)
0x3D-0x3E Y軸加速度 (符号付き16Bit)
0x3F-0x40 Z軸加速度 (符号付き16Bit)
0x41-0x42 センサーの温度
0x43-0x44 X軸角速度 (符号付き16Bit)
0x45-0x46 Y軸角速度 (符号付き16Bit)
0x47-0x48 Z軸角速度 (符号付き16Bit)
0x1B 角速度計測レンジ
[4-3]:00=±250dps
01=±500dps
10=±1000dps
11=±2000dps
0x1C 加速度計測レンジ
[4-3]:00=±2g
01=±4g
10=±8g
11=±16g
0x6B [7]:リセット
[6]:SLEEP (起動時には1:スリープモード)
[5]:CYCLE
[4]:ジャイロスタンバイ
[3]:温度センサー無効
[2-0]:クロック選択
  0x68に動作モードを設定
 ※加速度と角速度を使用する場合 0 で良い。

0x1Bと0x1Cに計測レンジを設定

符号付き16Bitから加速度(g)への変換は
 センサー値 ÷ (32767÷計測レンジ)

 Ex.計測レンジが±2gの場合
  センサー値÷16384

符号付き16Bitから角速度(dps)への変換は
 センサー値 ÷ (326787÷計測レンジ)

 Ex.計測レンジが±250dpsの場合
  センサー値÷131


加速度からXY平面の傾きを求める

▼の式で求められます、単位はラジアンです。



Deg単位に変換する場合は π÷180 を掛ければよいです。
ArduinoIDEでは π÷180 が変換係数 RAD_TO_DEG で定義されていますので、コレをかけるだけです。

万年カレンダー

カレンダ―の表示に必要なのは、その月が何日あるのかと、1日が何曜日なのかの2点です
その月が何日あるかは、2月以外は固定ですし、2月は閏年か平年かで判定できます。

閏年の条件
・ 4で割り切れる年は閏年
・ただし、100で割り切れる年は平年
・ただし、400で割り切れる年は閏年

Y年M月D日の曜日
基準日を設定して、基準日からの経過日数を7で割った余りで求められます。
ツェラーの公式に当てはめれば

int yy = (month <= 2) ? year -1 : year ;
int mm = (month <= 2) ? month + 12 : month ;
int C = yy / 100 ;
int Y = yy % 100 ;
int wd = (5*C + Y + Y/4 + C/4 + (26*mm + 26)/10+day-1) % 7 ;

で求めることが出来ます。

wdは0~6の値をとり、それぞれに日曜~土曜に対応します。

スケッチ


YuruPuro/M5StickC-CLOCK-and-CALENDER

解説動画