2019年11月17日日曜日

ラズベリーパイでradikoラジオをつくる: その2 OSセットアップと自動シャットダウンの設定

事前に準備するもの

  • Raspberry Pi Zero W(Wi-Fi対応) ※WHタイプはヘッダピン実装済み
  • microSDカード: 容量8から32GB、速度Class 10程度
  • miniHDMI変換アダプタ・HDMIケーブル
  • USBホストケーブル(OTGケーブル;microUSB オス-USB A メス変換)、キーボード、給電機能付きUSBハブ、microUSBケーブル
  • microUSBケーブル付き ACアダプタ

microSDカードにOSイメージを書き込み

  • OSイメージをmicroSDカードに書き込み
  • Raspbian Buster Lite をダウンロードしOSイメージファイルを解凍
  • ダウンロードしたOSイメージをbalenaEtcherアプリでSDカードに書き込み

Raspbian起動とOSの設定

  • Raspberry Pi ZeroにはmicroUSBコネクタが2個あり、中央寄りがデータ用、残りは電源接続用です。キーボードに電源を供給するため給電機能付きUSBハブを経由でRaspberry Pi ZeroのUSBコネクタに接続
  • 親基板の電源接続用USBコネクタにACアダプタを接続します。Raspberry Pi Zeroの電源は、ヘッダピン経由で親基板から供給されるので、Raspberry Pi Zeroの電源接続用USB端子には何も繋がなくてもOKです
  • Raspberry Pi ZeroのminiHDMI端子にディスプレイを接続
  • OSイメージを書き込んだmicroSDカードを装着し親基板の電源スイッチを投入
  • ログインidは pi、初期passwordは raspberry
  • raspi-config アプリを起動します (上下キー、TAB、ENTERで操作します)
$ sudo raspi-config 
1 Change User Password
 ユーザpi のパスワードを適宜変更
2 Network Options
 N1 Hostname  適宜
 N2 Wi-fi Country/SSID/パスフレーズ
4 Localisation Options Setup...
 L2 Change Timezone: Asia - Tokyo
 L3 Change Keyboard Layout: 日本語キーボードのときは適宜変更
5 Interfacing Options
 P2 SSH: Enable
 P4 SPI: Enable
Finishして再起動
  • 再ログイン後 Wifiから割り振られたIPアドレスを確認します
$ ifconfig
  • ここからはPCから作業できます。TeraTermから先ほどのIPアドレスにSSHログインします。まずはIPアドレスを固定するため、nanoエディタで dhcpcd.conf を編集します。(Ctrl+O 保存、Ctrl+X終了)
$ sudo nano /etc/dhcpcd.conf
とし、最終行に次の内容を追加
interface wlan0
static ip_address=192.168.0.x/24 ⇒ 固定したいIPアドレス
static routers=192.168.0.x ⇒ デフォルトゲートウェイ
static domain_name_servers=192.168.0.x ⇒ DNS
  • 再起動
$ sudo reboot
  • rootのパスワードも設定する
$ sudo passwd root
  • インストール済みソフトウエアパッケージ、パッケージ情報のアップデート
$ sudo apt update
$ sudo apt upgrade

samba をインストール


  • 手順は次の通り。

$ sudo apt-get update
$ sudo apt-get install samba
$ mkdir /home/pi/public
$ sudo nano /etc/samba/smb.conf
[global]項に以下を追記します。IPアドレスは環境に適宜合わせます。
interfaces 192.168.2. wlan0
bind interfaces only = yes
hosts allow = 192.168.2.
security = user
共有フォルダ名を「public」とするため、末尾に次のように追記します。
[public]
comment = IPRadioReceiver
path = /home/pi/public
guest ok = yes
read only = no
browsable = yes
force user = pi

  • smbサービスの再起動

$ sudo service smbd restart

  • Windowsから \\192.168.2.xx\public のファイルを読み書きできればOK (2020.1.1追記)


自動シャットダウンスクリプトの準備

Pythonから利用できるGPIO制御ライブラリはいくつかありますが、標準インストールされているRPi.GPIOを使います。スクリプトは、ImageCanvas Annex "Raspberry Pi Zero用 簡易UPSの作成"を参考にさせて頂きました。停電あるいは電源スイッチオフから3秒経過したら自動的にシャットダウンするようにします。スクリプト作成をミスると、再起動を繰り返すなど手に負えなくなる場合がありますから、事前の動作テストは必須です。
  • nanoで ~/operation_panel/power_monitor.py を新規作成します。スクリプトは次のようにしました。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import time
import os
import RPi.GPIO as GPIO
GPIO_POWER_GOOD = 17
THRESHOLD = 3
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_POWER_GOOD, GPIO.IN, GPIO.PUD_UP)
while True:
  count = 0
  GPIO.wait_for_edge(GPIO_POWER_GOOD, GPIO.FALLING)
  while True:
    state = GPIO.input(GPIO_POWER_GOOD)
    if state == False:
      count += 0.05
      if count >= THRESHOLD:
        print("[Power Monitor] SHUTDOWN NOW!")
        os.system("sudo shutdown -h now")
        break
    if count > 0 and state == True:
      break
    if count == 0:
      break
    time.sleep(0.05)
  • スクリプトを動作確認します。電源スイッチをオフにして3秒後にシャットダウンするはずです。
$ python power_monitor.py
  •  無事動作したら rc.local に登録してOS起動時に自動実行させます。
$ sudo nano /etc/rc.local
  • rc.localの “exit 0” の前の行に次の文を追記します。2019.11.20 ディレクトリ表記が間違っていたのを修正しました
python /home/pi/operation_panel/power_monitor.py &
  • ラズベリーパイを再起動後、電源スイッチをオフにして暫くするとOSが自動シャットダウンされることを確認できればOKです。ところで、OSシャットダウン後の再起動はラズベリーパイの電源リセットが必要です。再起動させるには、親基板のLEDが消灯するのを待って、電源スイッチを再度オンにします。以上、さらりと書いてますが、不慣れゆえ、ここに到るまで結構苦労しました。

0 件のコメント:

コメントを投稿