【RotorHazard】Raspberry Pi 3BへRTCモジュール(DS3231Mチップ)を搭載してみた

# 26. 父さん(テム・レイ)のパーツで瞬発力が数倍！(うそ)

この記事はFPVドローン ラップ計測システム【RotorHazard】をRaspberry Piで作成するにあたってのTipsをまとめたものです。ですが一般的なラズパイ構築方法としても参考になるかと思いますので、ぜひご活用ください。

:::note warn
#### 注意 (2024/04/30 追記)
複数のRH機を並列運用することで計測精度を高めることができますが、プライマリ / セカンダリ間でNTPサーバによる時刻同期を実施しズレのないラップシステムを構成する必要があります。その際、プライマリ機にNTPサービスを稼働させますが、NTPクライアントソフトが競合してしまうことから、標準のsystemd-timesyncdがアンインストールされ、NTPSecがインストールされますのでご注意ください。下記の内容はRTCモジュールを一度動作確認するという手順となります。
:::

### 26-1. RTCモジュールを試す…まずは準備なり

このパーツを入れたからといって…瞬発力は数倍に跳ね上がるわけはなくｗ でも、投げ捨てないでっ！時計って大事なのｗ ※まあなんとなく書いてみたかっただけです。

ここまでの連載を見てくれた皆さんなら、もうラズパイの構築はほぼ出来上がったも同然、何をインストールして使うようにしても問題ないベース環境ができたのではないでしょうか？今回、プラス要素としてはRotorHazard for ラズパイ版を構築するにあたり、Yanazooさんから提供いただいた **RTCモジュール(DS3231)** をせっかくなので入れ込みたいと思います。

ちょっとハードウェアは苦手なワイなので、少し勉強といいますか、下調べを色々実施しました。っていうことで、まずはラズパイさんのデバイスを確認するツール群をインストールしていきます。下記がリアルタイムクロックモジュールです。ピンがいっぱい出ていますが、今回は左側の **SCL、SDA、VCC、GND** の4つをラズパイ側に接続します。(まあ後からRotorHazardのI2Cポートに挿すってことなんですけども、まずは動作確認をするのに)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/685928b7-9eea-940b-c12f-ea511f979318.png)

最初、ラズパイ側の準備を進めていきます。
```
pinout
```
このコマンドを打ち込むと、下記のようにコンソールに絵が出てきます。(標準かと)
まずはこちらを確認ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/8e48a766-e01f-e9ef-9518-db36240d736a.png)

先日紹介しました下記サイトでも、ハードウェア情報を確認するのに記載があります。
ちなみに手元のラズパイ3Bは **a22082** と表示されているため、**Embest社製 Raspberry Pi 3B (CPU 1.2GHz、メモリ 1GB)** ということがわかりました。

https://www.fabshop.jp/%E3%80%90step-32%E3%80%91%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E6%83%85%E5%A0%B1%E3%82%92%E8%A1%A8%E7%A4%BA/

### 26-2. RTCモジュールを準備する

先ほどのRTCモジュールなのですが、調べていたら色々な面白いことがわかってきました。
真ん中の **DS3231 M** と書かれたチップですが、どうも中華あるあるのようで **M** は精度が低いようです。低いといっても何か我々素人が気にする必要なんてほとんどない程度の誤差で通常に使えるようですが、本当のリテール品はチップ左側に切り欠きがあったり、他の英数が記載されていたりと見た目もちょっと違うみたい… ですがRTCモジュールそのものがアリエクとかで激安で販売していますので、我々はこちらを選択しない手はないものと思います。また他の方の分析では、その精度の補正をソフト的に修正して出荷しているようです。これはこれで面白いっすね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/ff25d3ca-757a-0ea2-3cc2-e7b447d8b530.png)

そして、今回赤or黄でマークした部分もポイントです。
このDS3231チップを使ったRTCモジュールは、充電型ボタン電池の **LIR2032 (3.6V)** が用いられます。しかしながらヤマダ電機とか街中の量販店さんではLIR2032なんて見かけることはありません。売っているのは **CR2032 (3.0V)** のみかと思います。これ、間違ってCR2032を入れたときには、乾電池を無理やり充電しちゃって火を噴かせちゃうなんていう事故と同様に、ヤバい状態になってしまう可能性がありますのでご注意ください。電池が膨らんで、下手すると爆発らしいですが、充電できないようにすれば良いだけなので皆さん大体加工して利用することが多いのだとか…。ちなみに電力量が非常に小さいのもあり、CR2032でも普通に10年以上は持つとのことでしたｗ。

充電できないようにする為に、①抵抗もしくは②ダイオードを撤去(両方撤去も良し)、または充電の電流が流れないようにするため③の箇所をパターンカットをするとのことでした。パターンカットだと元にもどせる？なんて書いてあるブログも多いのですが、ワイのようなはんだ付けダメダメおじさんはカット部の復活なんて考えずに①か②の部分を取っ払うことにしました。

:::note
2024/07/18 追記
『②コンデンサ』と記載していましたが、『②ダイオード』であるとのご連絡いただきました。改めまして修正を致します。ご連絡ありがとうございました。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/70670d45-b827-6c4b-e265-9b99f60dea9b.png)

はい！①の抵抗を外しました。はんだゴテ(少し温度高くし370℃設定)でアチチにして、ピンセットでつまむ(というよりずらす？)感じで。最後ははんだ吸い取り線でお掃除してきれいに除去できました。これで **充電しない仕様** になったので安心して利用可能っす。


### 26-3. 接続して認識させるぅ！

まずはI2Cツール群を事前に入れておきます。(入っているか否かの確認も込めて)
```
sudo apt update
sudo apt install -y i2c-tools
```

次に **/boot/config.txt** に記載してRTCモジュールを認識させる準備をします。
```
sudo vi /boot/config.txt
```
```/boot/config.txtの編集
dtoverlay=i2c-rtc,ds3231
```

/boot/config.txtを変更しましたので **sudo shutdown -h now** で一度停止します。CR2023電池をぶち込んだRTCモジュールをこんな感じで接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/4f9f2985-349a-dc0e-06b6-3b432ecc3336.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/e6d2891d-28cb-4a25-2dc0-23842c3304eb.png)

ピン配列を見ながらPIN03～06につなげますよ。全力で注意しながらラズパイとRTCモジュールを接続したら、早速起動してI2Cデバイスとしてどのように見えているかを確認します。

```
i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
```

上記の値の **68 ⇒ UU** という表示になると、正しくRTCモジュールが認識した状態とのことです。次に各種時刻の確認とRTC時刻が認識されているか？を確認します。
```
timedatectl
               
               Local time: 日 2024-04-21 12:18:23 JST
           Universal time: 日 2024-04-21 03:18:23 UTC
                 RTC time: 日 2024-04-21 03:18:23
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```

はい。3行目の **RTC time** に値が入っていれば成功です。表示に何か違和感等があるようなら下記コマンドを入力します。
```
sudo hwclock -r

2024-04-21 14:27:47.392578+09:00
```
これでOKです。もしかしたら状況によって **systemd-timesyncd** コマンドがない場合もあるかもしれません。NTP serviceが **active** でない場合は、set-ntpをしますが怒られる場合があります。
```
sudo timedatectl set-ntp true

Failed to set ntp: NTP not supported
```
上記のように表示された場合は足りないものがありますので、その時は下記のように後付けでインストールしましょう。
```
sudo apt update
sudo apt install systemd-timesyncd
```


### 26-4. NTPサーバの調整

NTPサーバは初期状態でつかんでいるようですが **2.debian.pool.ntp.org** のようです。遠い海外で同期をする必要はないので、これは日本の値を設定すると良きと思います。systemctk statusコマンドを入れ、一度確認します。

```
sudo systemctl status systemd-timesyncd

● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-04-21 12:15:56 JST; 2h 16min ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 304 (systemd-timesyn)
     Status: "Initial synchronization to time server [2400:8902:e001:347:0:a789:b456:c123]:123 (2.debian.pool.ntp.org)."
      Tasks: 2 (limit: 775)
        CPU: 584ms
     CGroup: /system.slice/systemd-timesyncd.service
             mq304 /lib/systemd/systemd-timesyncd

 4月 21 12:15:40 rotorhazard systemd[1]: Starting Network Time Synchronization...
 4月 21 12:15:56 rotorhazard systemd[1]: Started Network Time Synchronization.
 4月 21 12:16:29 rotorhazard systemd-timesyncd[304]: Initial synchronization to time server [2400:8902:e001:347:0:a789:b456:c123]:123 (2.debian.pool.>
```

NTPサーバの指定は下記パラメータを変更していきます。
```
sudo vi /etc/systemd/timesyncd.conf
```

```/etc/systemd/timesyncd.confの編集
[Time]
NTP=ntp.jst.mfeed.ad.jp ntp.nict.jp
FallbackNTP=time.google.com
```

編集が終わったら、下記コマンドを叩いて反映します。
```
sudo timedatectl set-ntp true
sudo systemctl daemon-reload
sudo systemctl restart systemd-timesyncd
```

そして、再度値が変更されたか？確認します。
```
sudo systemctl status systemd-timesyncd

● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-04-21 14:42:26 JST; 20s ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 1848 (systemd-timesyn)
     Status: "Initial synchronization to time server 210.173.160.27:123 (ntp.jst.mfeed.ad.jp)."
      Tasks: 2 (limit: 775)
        CPU: 224ms
     CGroup: /system.slice/systemd-timesyncd.service
             mq1848 /lib/systemd/systemd-timesyncd

 4月 21 14:42:26 rotorhazard systemd[1]: Starting Network Time Synchronization...
 4月 21 14:42:26 rotorhazard systemd[1]: Started Network Time Synchronization.
 4月 21 14:42:26 rotorhazard systemd-timesyncd[1848]: Initial synchronization to time server 210.173.160.27:123 (ntp.jst.mfeed.ad.jp).
```

### 26-5. (備考) プルアップ抵抗は外すべき？そのまま？

他サイトの引用なのですが…

I2Cは 2本のシングルクロック(SCL)とシングルデータ(SDA)ライン配線で通信する方式です。Raspberry Pi 3は、この2線はともに1.8kΩで3.3Vにプルアップされています。接続する機器にもプルアップ抵抗が付いてる場合は、抵抗値により波形がきれいな方形波にならず、通信エラーになってしまう場合があります。たまに通信エラーになるという現象も起きますので、I2Cを使う場合は、オシロスコープで波形を確認することをおすすめします…

https://www.raspberrypirulo.net/entry/raspberrypi-i2c

とありました。でもワイはオシロなんてないのでーｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/9fdd5ec4-9226-933d-fa64-3ac892ad2257.png)

今回のDS3231モジュールとラズパイ1.8KΩとの合成抵抗の計算:
**(1.8KΩ × 4.7KΩ) / (1.8KΩ + 4.7KΩ) = 8.46KΩ / 6.5KΩ = 1.3KΩ**

他の方もこの件に関して記載されているのを確認しました。(BME280 温湿度・気圧センサモジュールキット) GPIO2、GPIO3には1.8KΩのプルアップ抵抗があります。ちなみにこれがあるからが故かショートすると電源起動スイッチをGPIO2＋GNDにつけろということみたいですが、合成抵抗がかかり低いので信号への影響も低い(波形崩れがそれほど起きない？)のかもしれません。

ラズパイ構築編のつづきはこちら

https://qiita.com/tmac116/items/4fe0bbe51200ffa7c871