Technical Information/Raspberry Pi

Edit  

ラズベリーパイ用RTC+シャットダウン&起動ボタンユニットの作成

2019/01/05

ラズベリーパイを公式7インチタッチスクリーンディスプレイに接続して使っていたのですが、シャットダウンの後電源を入れ直さないと再起動出来ないことと、起動時にインターネットに繋がないと日時情報を失ってしまうことが煩わしく、RTCとシャットダウンおよび起動ボタンをもつアドオンボードを作りました。

P1060303_A.JPG
 
Edit  

回路図

WS000214.PNG
 
Edit  

部品構成

  • ラズベリーパイ3 model B
  • 自作基板
    ReferenceValuePART
    B0028自作基板B0028
    BT1リチウムイオン2次電池MS621FE FL11E
    CN1ピンソケット_2x17 2.54mmピッチFHU-2x42SG (同等品可)
    D1共通カソードDUAL DIODEM1MA142WKT1G
    R1680Ω チップ抵抗 1608サイズRK73B1JTTD681J (同等品可)
    R20Ω チップ抵抗 1608サイズRK73Z1JTTD (同等品可)
    R3100KΩ チップ抵抗 1608サイズRK73B1JTTD104J (同等品可)
    R4470Ω チップ抵抗 1608サイズRK73B1JTTD471J (同等品可)
    S1タクトスイッチTVDP01-G73BB with Black cap
    S2タクトスイッチTVDP01-G73BB with Red cap
    U2リアルタイムクロックモジュールAE-RX-8025NB
    ※C1,CN2,R5,U1は実装しない

    P1060305_A.JPG P1060306_A.JPG

 
Edit  

ソフトウェア構成

  • Raspbian GNU/Linux 9.6 (stretch)
 
Edit  

機能

  • 日時情報のバックアップ
    • OSの起動時にインターネットに接続されている場合はntpによる時刻取得およびRTCの更新を行う
    • OSの起動時にインターネットに接続されていない場合はRTCの保持している時刻をシステム時刻に設定する
  • シャットダウンボタン押下による自動シャットダウン
  • 再起動ボタン押下による再起動
 
Edit  

導入方法

 ※ラズベリーパイをインターネットに繋いだ状態で作業してください

  1. アドオンボードをラズベリーパイのGPIO端子に装着
  2. RTCのドライバをインストール
    1. i2cdetect コマンドにて、接続されているi2cデバイスののアドレスを確認
      pi@raspberrypi:~ $ sudo i2cdetect -y 1
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
      00:          -- -- -- -- -- -- -- -- -- -- -- -- --
      10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      30: -- -- 32 -- -- -- -- -- -- -- -- -- -- -- -- --
      40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      70: -- -- -- -- -- -- -- --
    2. ドライバが有るかどうか確認。 rx-8025が存在。
      pi@raspberrypi:~ $ ls -l /lib/modules/$(uname -r)/kernel/drivers/rtc/
      合計 436
      -rw-r--r-- 1 root root 16552  9月 25 18:07 rtc-abx80x.ko
      -rw-r--r-- 1 root root 10912  9月 25 18:07 rtc-bq32k.ko
      -rw-r--r-- 1 root root  8436  9月 25 18:07 rtc-ds1302.ko
      -rw-r--r-- 1 root root 13308  9月 25 18:07 rtc-ds1305.ko
      -rw-r--r-- 1 root root 29676  9月 25 18:07 rtc-ds1307.ko
      -rw-r--r-- 1 root root 11624  9月 25 18:07 rtc-ds1374.ko
      -rw-r--r-- 1 root root  8324  9月 25 18:07 rtc-ds1390.ko
      -rw-r--r-- 1 root root  8892  9月 25 18:07 rtc-ds1672.ko
      -rw-r--r-- 1 root root 14576  9月 25 18:07 rtc-ds3232.ko
      -rw-r--r-- 1 root root  7612  9月 25 18:07 rtc-em3027.ko
      -rw-r--r-- 1 root root  9964  9月 25 18:07 rtc-fm3130.ko
      -rw-r--r-- 1 root root  9300  9月 25 18:07 rtc-isl12022.ko
      -rw-r--r-- 1 root root 17524  9月 25 18:07 rtc-isl1208.ko
      -rw-r--r-- 1 root root 19760  9月 25 18:07 rtc-m41t80.ko
      -rw-r--r-- 1 root root  8728  9月 25 18:07 rtc-m41t93.ko
      -rw-r--r-- 1 root root  7876  9月 25 18:07 rtc-m41t94.ko
      -rw-r--r-- 1 root root  7680  9月 25 18:07 rtc-max6900.ko
      -rw-r--r-- 1 root root  6956  9月 25 18:07 rtc-max6902.ko
      -rw-r--r-- 1 root root 10808  9月 25 18:07 rtc-pcf2123.ko
      -rw-r--r-- 1 root root 13096  9月 25 18:07 rtc-pcf2127.ko
      -rw-r--r-- 1 root root  8624  9月 25 18:07 rtc-pcf8523.ko
      -rw-r--r-- 1 root root 14016  9月 25 18:07 rtc-pcf8563.ko
      -rw-r--r-- 1 root root  8008  9月 25 18:07 rtc-pcf8583.ko
      -rw-r--r-- 1 root root  7996  9月 25 18:07 rtc-r9701.ko
      -rw-r--r-- 1 root root  8260  9月 25 18:07 rtc-rs5c348.ko
      -rw-r--r-- 1 root root 15308  9月 25 18:07 rtc-rs5c372.ko
      -rw-r--r-- 1 root root 18664  9月 25 18:07 rtc-rv3029c2.ko
      -rw-r--r-- 1 root root  8468  9月 25 18:07 rtc-rx4581.ko
      -rw-r--r-- 1 root root 12112  9月 25 18:07 rtc-rx8025.ko
      -rw-r--r-- 1 root root  9884  9月 25 18:07 rtc-rx8581.ko
      -rw-r--r-- 1 root root 11764  9月 25 18:07 rtc-s35390a.ko
      -rw-r--r-- 1 root root 13880  9月 25 18:07 rtc-x1205.ko
    3. RX-8025をOSで管理できるように設定する

      まず、modprobe コマンドで、対象のモジュール(i2c-devおよびrtc-rx8025)をロードする。つづいて、先程調べた RX-8025のi2cアドレスをOSが新しく管理するデバイスとして設定する。もう一度i2cdetect コマンドを実行し、RX-8025がOSに管理されていることを確認する。(UUが表示されればOK)
      pi@raspberrypi:~ $ sudo su
      root@raspberrypi:/home/pi# modprobe i2c-dev
      root@raspberrypi:/home/pi# modprobe rtc-rx8025
      root@raspberrypi:/home/pi# echo rx8025 0x32 > /sys/class/i2c-adapter/i2c-1/new_device
      root@raspberrypi:/home/pi# exit
      exit
      pi@raspberrypi:~ $ i2cdetect -y 1
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
      00:          -- -- -- -- -- -- -- -- -- -- -- -- --
      10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      30: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- --
      40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      70: -- -- -- -- -- -- -- --
    4. 時刻の自動更新を行えるように、fake-hwclockを無効にする
      pi@raspberrypi:~ $ sudo apt-get purge fake-hwclock
      パッケージリストを読み込んでいます... 完了
      依存関係ツリーを作成しています
      状態情報を読み取っています... 完了
      以下のパッケージは「削除」されます:
        fake-hwclock*
      アップグレード: 0 個、新規インストール: 0 個、削除: 1 個、保留: 0 個。
      この操作後に 32.8 kB のディスク容量が解放されます。
      続行しますか? [Y/n] Y
      (データベースを読み込んでいます ... 現在 84579 個のファイルとディレクトリがインストールされて います。)
      fake-hwclock (0.11+rpt1) を削除しています ...
      man-db (2.7.6.1-2) のトリガを処理しています ...
      (データベースを読み込んでいます ... 現在 84573 個のファイルとディレクトリがインストールされて います。)
      fake-hwclock (0.11+rpt1) の設定ファイルを削除しています ...
      systemd (232-25+deb9u6) のトリガを処理しています ...
      pi@raspberrypi:~ $
    5. RTCに、現在のOSのシステムクロックの時刻を書き込む
      pi@raspberrypi:~ $ sudo hwclock -w
    6. ブートごとにRTCの更新処理を行うスクリプトを作成する
      pi@raspberrypi:~ $ sudo vi /etc/rc.local
      編集内容は以下のとおり。exit 0 の前に、# RTC Settings から始まるスクリプトを追加する。
      #!/bin/sh -e
      #
      # rc.local
      #
      # This script is executed at the end of each multiuser runlevel.
      # Make sure that the script will "exit 0" on success or any other
      # value on error.
      #
      # In order to enable or disable this script just change the execution
      # bits.
      #
      # By default this script does nothing.
      
      # Print the IP address
      _IP=$(hostname -I) || true
      if [ "$_IP" ]; then
        printf "My IP address is %s\n" "$_IP"
      fi
      
      # RTC Settings
      modprobe rtc-rx8025
      echo rx8025 0x32 > /sys/class/i2c-adapter/i2c-1/new_device
      sleep 1
      /sbin/hwclock -s
      sleep 15
      /usr/sbin/ntpdate -b ntp.nict.jp && /sbin/hwclock -w
      
      exit 0
    7. ブート時にRTCの初期化を行わないように/etc/default/hwclock を編集
      pi@raspberrypi:~ $ sudo vi /etc/default/hwclock
      変更内容は、 HWCLOCKACCESS=yes を HWCLOCKACCESS=no に変更するだけ。
      # Defaults for the hwclock init script.  See hwclock(5) and hwclock(8).
      
      # This is used to specify that the hardware clock incapable of storing
      # years outside the range of 1994-1999.  Set to yes if the hardware is
      # broken or no if working correctly.
      #BADYEAR=no
      
      # Set this to yes if it is possible to access the hardware clock,
      # or no if it is not.
      #HWCLOCKACCESS=yes
      HWCLOCKACCESS=no
      
      # Set this to any options you might need to give to hwclock, such
      # as machine hardware clock type for Alphas.
      #HWCLOCKPARS=
      
      # Set this to the hardware clock device you want to use, it should
      # probably match the CONFIG_RTC_HCTOSYS_DEVICE kernel config option.
      #HCTOSYS_DEVICE=rtc0
    8. 以上で設定は完了したので、再起動してRTCの動作を確認する。たとえば、LANケーブルを抜いて再起動しても時刻を保持していることや、異なる時刻を設定したあとLANケーブルを接続して再起動し、正しい時刻に修正されることを確認する。
      pi@raspberrypi:~ $ sudo shutdown -r now
  3. シャットダウンボタンのドライバをインストール
    1. スクリプトを作成。ここでは /home/pi/script/shutdown.pyとする。
      pi@raspberrypi:~/script $ vi shutdown.py
      スクリプトの内容は以下の通り:
      #!/usr/bin/python
      # coding:utf-8
      import time
      import RPi.GPIO as GPIO
      import os
      
      pinnumber=4
      GPIO.setmode(GPIO.BCM)
      
      # GPIO4pinを入力モードにする
      # 外部プルアップのため、pull up設定をoffにする
      GPIO.setup(pinnumber,GPIO.IN,pull_up_down=GPIO.PUD_OFF)
      
      while True:
          GPIO.wait_for_edge(pinnumber, GPIO.FALLING)
          sw_counter = 0
      
          while True:
              sw_status = GPIO.input(pinnumber)
              if sw_status == 0:
                  sw_counter = sw_counter + 1
                  if sw_counter >= 5:
                      print("Detect long-pressing the BCM4 button for 0.5 seconds.")
                      os.system("sudo shutdown -h now")
                      break
              else:
                  print("Detect short-pressing the BCM4 button.")
                  break
      
              time.sleep(0.1) 
      
          print(sw_counter)
    2. ファイルの属性を実行可能モードに変更
      pi@raspberrypi:~/script $ sudo chmod 755 shutdown.py
    3. サービスファイルを作成
      pi@raspberrypi:~/script $ sudo vi /usr/lib/systemd/system/shutdownbutton.service
      ファイルの編集内容は以下のとおり:
      [Unit]
      Description=Shutdown Daemon
      
      [Service]
      ExecStart =/home/pi/script/shutdown.py
      Restart=always
      Type=simple
      
      [Install]
      WantedBy=multi-user.target
    4. サービスの有効化(これで再起動時に自動的にスクリプトが実行される
      pi@raspberrypi:~ $ sudo systemctl enable shutdownbutton.service
    5. デーモンを再起動
      pi@raspberrypi:~ $ sudo systemctl daemon-reload
    6. 一旦リブート
      pi@raspberrypi:~ $ sudo reboot
    7. サービスの状態を確認 (loaded & active であることを確認する)
      pi@raspberrypi:~ $ systemctl status shutdownbutton.service
      ● shutdownbutton.service - Shutdown Daemon
         Loaded: loaded (/usr/lib/systemd/system/shutdownbutton.service; enabled; vend
         Active: active (running) since Sat 2018-10-27 16:32:00 JST; 3min 1s ago
       Main PID: 973 (shutdown.py)
         CGroup: /system.slice/shutdownbutton.service
                 mq973 /usr/bin/python /home/pi/script/shutdown.py
      
      10月 27 16:32:00 raspberrypi systemd[1]: Started Shutdown Daemon.
    8. 動作確認
      1. S2ボタン(赤色)の0.5秒未満の短押しではシャットダウンが動作せず、0.5秒以上の長押しで即座にシャットダウン動作することを確認。
      2. シャットダウン状態にて、S1ボタン(黒色)を押すとシステムが起動することを確認。
 
Edit  

補足説明

  • RTCモジュールを実装せず、シャットダウン&起動のみのモジュールにすることも出来ます。また、その逆もできます。
  • 入手性を考慮し、RTCは秋月電子のRTCモジュールを使用できるようにしました。
  • RTCモジュールは AE-RX-8025NB の他に AE-RTC-8565NB も使用できるように基板を作成していますが、動作確認はしていません。
  • 自作基板B0028へは、RTCモジュール の他に、RX-8025NBチップ単品 を実装することも出来ます。ただし、C1の追加実装が必要です。(これも動作確認はしていません・・・)
  • 回路図を見ておわかりと思いますが、GPIOは11ピンまでしか使用していませんので、シャットダウン&起動スイッチが押しにくくなければピンソケットの極数を少なく出来ます。
  • その他、スイッチを1つにするショートランドや、外部から制御するためのサービスコネクタを設けています。

トップ   リロード   一覧 単語検索