Raspberry Pi OS の インストール(64bit)

後に気づいたのですが、このバージョンではカメラは動作しません

カメラを使用したい場合はLegacy版を使用しましょう

 

Raspberry Pi OS が正式に64bit化したとの記事を見たので、改めてRaspberry Pi について書いていこうと思います

あまり高度な内容は詳しい方のほうを見ていただくとして、なるべく丁寧に、自分のような初心者の方でもわかりやすくを心がけていこうと思います

なお、64bitが動作するのは、
Raspberry Pi 3 /4/ 400
のみのようです

  1. SDカードへのセットアップ
    まずは、今まで通り、「Raspberry Pi Imager」にてSDカードにOSを書き込んでいきます。あまり難しいことはありませんが、手順ををって説明します
    1. Raspberry Pi Imager」のダウンロード
      公式サイトからダウンロードします。残念ながら日本語化していないようですが、シンプルなデザインなので困ることは無いでしょう

      www.raspberrypi.com
      画面中ほどの「Download for Windows」ボタンをクリックするとダウンロードが始まります(Windowsを使用の場合)

      f:id:kobatom5278:20220207132613j:plain

      ダウンロードできたら、ダウンロードした「imager_X.X.X.exe」(X.X.Xはその時点での最新バージョンを示す)を起動します
      OSから「起動していいか」との警告が出ますが、「はい」で進めます
      (選ぶものがないので割愛します)

    2. Raspberry Pi Imager」を使ってSDカードへ書き込み
      起動すると、以下の画面が出ます。

      f:id:kobatom5278:20220207133007j:plain

      左から選んで進めていくのですが、
      「CHOOSE OS」をクリックすると、

      f:id:kobatom5278:20220207133217j:plain

      となっています。
      何も考えないで選んでしまうと、1番上のものを選んでしまいそうですが、これは32bitのもの。今回は64bitをインストールしたいので、
      Raspberry PI OS (OTHER)」を選び、

      f:id:kobatom5278:20220207133500j:plain

      Raspberry PI OS (64-bit)」を選びます。「Raspberry PI OS Lite (64-bit)」はGUIの無いものですので、今回は選びません。
      SDカードをリーダ・ライタにセット、「CHOOSE STRAGE」をクリック、対象のSDカードを選択した状態が以下です

      f:id:kobatom5278:20220207135038j:plain

      「WRITE」をクリックで書き込みが始まるのですが、その前に右下の歯車ボタンを押して、事前にセットアップしましょう

      f:id:kobatom5278:20220207140018j:plain

      f:id:kobatom5278:20220207140220j:plain

      上から、
      ・ネットワーク上などからのRaspberry Pi の名前
      SSHの有効化
      ・ユーザー名とパスワード
      Wifiの設定
      ・使用する国とキーボードのレイアウト
      にチェックを入れ、入力しました(一部隠しています。ユーザー名は、まぁいいや)
      これは便利

      ここまで来たら「WRITE」をクリック、確認ダイアログが出るので「YES」で書き込みを開始します
      しばらく待ちましょう

      f:id:kobatom5278:20220207154547j:plain

       

    3. 起動
      書き込みの終わったSDカードをRaspberry PI に挿入、電源ONで起動します。

全く苦労することなく起動できたと思います。

デスクトップですが、壁紙が変わった以外は、32bitと変わりないですね

Raspberry Pi ドライブレコーダーの作成⑩ RTC問題

  1. 世にあるほとんどのPCであれば、電源を抜いて時間が経過した後でも、数年の間を開けなければ年月日日時は正確な状態だと思います(多少のずれはあったとしても)


Raspberry PI に至っては、起動時にインターネットから現在の時間を取得するハードウェア仕様のため、「インターネットに接続できない環境では時計が狂う」問題が発生します。

これは、ハードウェア的に「RTC」という機能がないために発生します。

 

ドライブレコーダーとしては、常にインターネットに接続できる状況は考えずらいため、ハードウェア的に「RTC」機能を付与します。

 

まずは物品購入。

GPIOに刺すだけで使えます(設定は後述)

 

 

電源OFF、GPIOに刺したら起動します。

なお、ボタン電池が入っていない場合は入れておきましょう。

 

設定方法は以下。

  1.i2cの有効化

   GPIOに接続、i2cにて認識させるので、i2cを有効にします。

   $ sudo raspi-config

   にてOSの設定を行います。

   OSのバージョンにより内容が変わるのですが、

   「Interface Options」に「I2C」があると思うので、有効にして再起動します。

  2.RTCモジュールのデバイス登録

   OSにRTCモジュールを登録します。

   /boot/config.txt

   の末尾に

   dtoverlay=i2c-rtc,ds3231

   を追記します。

   接続したRTCモジュールに合わせて「ds3231」は変更が必要です。

  3.接続確認

   ターミナルにて、
   $ timedatectl

   を実行すると、「RTC TIME:」の後に日時が表示されます。

   「N/A」と表示されている場合は接続がうまくできていません。

  4.「fake-hwclock」の無効可

   RaspberryPiは、シャットダウン時点での時刻を保存、再起動時に復元することで、

   なんとなく日時を保存しているようです。

   これはRTCを組み込んだ場合は不要となるので無効にします。

   ターミナルにて、

   $ sudo apt-get purge fake-hwclock

   を実行します。

  5.RTCモジュールから日時を取得するように

   以下の内容でファイル「/etc/udev/rules.d/85-hwclock.rules」を新規作成します。

   KERNEL=="rtc0", RUN+="/sbin/hwclock --rtc=$root/$name --hctosys"

 

 

Raspberry Pi ドライブレコーダーの作成⑨ USBメモリの容量不足対策

動画ファイルをh264にした、常時録画などの仕様のため、油断しているとUSBメモリはあっという間に容量不足になります。

ですので、古い(ファイル名の昇順)で古い順に、ある程度空き容量が不足した時点で消しにかかります。


運用としては、何かあった(事故とか…)場合は、USBメモリをRasperry Pi から引き抜くで済ませようかと思います。

(世にあるドラレコは、大きな音、大きなショック、ボタン押下で録画を保存するようですが、今回は常時録画、古い順に消していく方式にします)

以下、Python3でのソースコード。rc.localにsudo で python3 コマンドにファイル名を渡して起動しましょう。

import os
import time
import stat

# 定数
TargetDir = "/mnt/usb1/capturedVideos/"
FreeMin = 1000

while True:
    # 空き容量の取得(MB)
    dirStat = os.statvfs(TargetDir)
    freeSize = dirStat.f_bsize * dirStat.f_bfree / 1024 / 1024

    print("FreeSize(MB):" + str(freeSize))

    if freeSize <= FreeMin :
        # ファイル一覧取得、ファイル名でソート
        fileList = os.listdir(TargetDir)
        fileList.sort()
        # 順に消してみる
        for delTarget in fileList:
            try:
                print("DEL:" + TargetDir + delTarget)
                os.chmod(TargetDir + delTarget, stat.S_IWRITE )
                os.remove(TargetDir + delTarget)
except: print("File Delete Error !!") time.sleep(10)

 

Raspberry Pi ドライブレコーダーの作成⑧ 少しだけ、方向転換

ドライブレコーダーとして録画するに際して、以下の情報が埋め込まれている(表示されている)ほうがよいではと考えました。

・録画年月日、時間

・録画した場所(GPS情報)

 

前途の「raspivid」コマンドでも文字を動画に埋め込めるのですが、

「raspividコマンドを実行した時点での文字」となってしまうため、

録画されている時点の時刻ではなかったりします。

さらには、GPS情報も移動すれば常に変わっていくため、

実行した時点での情報ではあまり意味がありません。

 

ということで、今回はpythonコードにて録画します。

出力される動画フォーマットはh264形式のため取り回しが悪い(動画再生ソフトで速雄売りができなかったりします)ので、不本意ではあるのですが、

Rapsberry Pi Zero での処理速度を考えて、まぁ、良しとします。

 

ソースコードは以下。

60秒ごとに、開始年月日時間をファイル名とした「.h264」ファイルに録画動画を保存します。

解像度は「1280 × 720」。フレームレートはちょっと高めの24fps。

動画の上部に年月日時間を標準フォーマットした状態、白字で表示します。

さらには接続したディスプレイに録画状態をプレビューします。

接続しているディスプレイがHDMIではなくGPIO接続のようなものの場合は、かなりコマ落ちして表示されます。

録画された動画はコマ落ちしていないようですので、OKとします。

import picamera
import datetime as dt

with picamera.PiCamera() as camera:
    # 録画基本設定
    camera.resolution = (1280, 720)
    camera.framerate = 24
    camera.start_preview()

    while (True):
        start = dt.datetime.now()

        # ファイル名
        recStart = start.strftime('%Y%m%d_%H%M%S')
        camera.start_recording(recStart + '.h264')

        # 指定時間毎に録画ファイルを切り替える(単位は秒)
        while (dt.datetime.now() - start).seconds < 60:

            camera.annotate_text = str(dt.datetime.now())
            camera.wait_recording(0)
        camera.stop_recording()

Raspberry Pi ドライブレコーダーの作成⑦ 電源ブチ切り問題対策

Raspberry Pi(nanoを除く)は、性能を抑えているとはいえ、PCやスマートフォンと同様です。

電源OFFからの起動に時間がかかれば、電源にするための段取りもあります。

この段取りなしに電源が落ちた場合、終了処理が正しく行われず、Micro SD カードが破損する可能性があります。

ドライブレコーダーとしては、エンジン(イグニッション)OFFで、シガーソケットの電源も「バンッ」と落ちるので、ちょっと都合がよくありません。

UPSキットのようなものもありますが(USB供給の電源が落ちたら、シャットダウンシーケンスを実行する)ような便利なものもあります。

ですが、ちょっと高価ですね…。


今回は、その対策として、マウントされたMicro SD カードのリードオンリー化で対応します。

 

手順としては案外簡単。

Raspbery Pi にSSH接続、

$suso raspi-config

にて「overlay File System」を探して(バージョンで違うっぽいので詳細は割愛)、「Enabled」にします。

ここで注意ですが、「Enaled」したままだと、システムの設定や保存したファイルの内容などは破棄されます。

 

Raspberry Pi ドライブレコーダーの作成⑥ ともあれZeroで

諸問題は山積しているものの、まずは録画してみましょう。

 

1.以下のスクリプトを保存する

  以下のシェルスクリプトを保存します。

  仕様としては、

  ・USBメモリをマウントしてみる(2本刺さっていたら~とか、細かいことは気にしない)

  ・1分ごとの動画として録画、USBメモリに年月日日時ファイルとして保存

  ・フレームレートは15fps(たぶん、コマ落ちはしないかな)

  です。

  Lite版のOSを使用していない限り、外部ライブラリなど(ffmpeg)を追加インストールする必要は無いようです。スバラシイ。

  カメラから動画を取得する方法としては、「raspivid」コマンドが最速のようです。個人的にはPythonスクリプトを組んで~としたかったのですが、コマ落ちが嫌なので最速と言われる「raspivid」コマンドの内容を「ffmpeg」にパイプ、60秒ごとの動画ファイルに区切って保存としました。

 

#!/bin/sh

# USBメモリをアンマウント、マウントする
sudo umount /mnt/usb1/
sudo mount /dev/sda1 /mnt/usb1/


# 録画していく(raspvidで取得した動画をffmpegにパイプ、60秒で区切って年月日ファイル名でUSBメモリに保存)
sudo raspivid -o - -t 0 -fps 15 -w 800 -h 600 |
 ffmpeg \
  -r 15 \
  -i - \
  -vcodec copy \
  -f segment \
  -strftime 1 \
  -segment_time 60 \
  -segment_format_options movflags=+faststart \
  -segment_format mp4 \
  -reset_timestamps 1 \
  /mnt/usb1/capturedVideos/%Y-%m-%d_%H-%M-%S.mp4

この内容でどこかに保存します(何も考えないのであれば、「/home/pi/」かな)

2.起動時処理として登録
  作成したシェルスクリプトが起動したら実行されるように登録しておきます。
  起動時に実行する処理を登録する方法は多々あるようですが、以下の方法にて確認しました。
 /etc/rc.local
  に下記を追記します。(「exit 0」より上に書く!)
  「sleep~」は、内部の時計が毎回狂う(リセット?)ために、録画開始時間をちょっとずらそうという悪あがきです。上記シェルスクリプトを「/home/pi/」に「captureD.sh」として保存した場合です。

sleep $((RANDOM % 10))
sudo sh /home/pi/captureD.sh &

Raspberry Pi ドライブレコーダーの作成⑤ 問題山積

USBメモリをUSBポートに差し込んだ状態で、スクリプトを実行すると、起動完了から1分ごとの動画がUSBメモリに撮りためられていくことは出来ました。

ただし、大きな問題がいくつか発見されました。

 

問題1:raspberry pi は内部にクロック(時計)を持たない

  Wifiなど、インターネットに接続できる環境でRaspberry Pi を使用した場合は問題ありませんが、そうではない環境でRaspberry Pi を起動すると、時計が狂います。

  狂うというよりは、正解がわからない状態ですかね…。

  別途RTC(Real Time Clock)機能をもつ外部機器をGPIOに接続、設定してあげることで解決はできます。

  IOT(インターネットに接続されている前提)なので、この機能を持たないのでしょう。

 

  この機能が無いことにより問題としては、録画ファイル名に録画開始年月日時間を持つようにしたかったのですが、そもそも意味を持たなくなります。

  RTC機器はこれらが該当します。

 

問題2:録画された日時・時分秒などを動画に埋め込むにはパワー不足

  録画された動画に、文字情報を合成するには、Zero の処理パワーでは力不足。

  ハードウェアエンコーダーを持っているので、録画→動画ファイル化は15fpsくらいでは可能でしたが、これに文字を入れるとコマ落ちしすぎて、1fpsも出ませんでした。

  (ffmpeg のコーデック指定がうまくできていないのかもしれませんが)

  将来的にはGPSからの緯度経度も文字情報として埋め込みたかったのですが、ちょっと無理そうです。

  接続予定のGPS機器はこれらが該当します。

 

問題3:音声

  画像に関してはカメラモジュールから取得できるのですが、rapsberry Pi にはマイクがありません。

  USB接続できる安価なサウンドバイスで試そうとは思うのですが、Zeroでは動画化する際に音声を合成するパワーがなさそうな気がします。