ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Raspberry Pi】Raspberry Piでカメラのライブストリーミングをやってみる

 ラズパイについて色々調べていたら、カメラを使ったライブストリーミング環境を構築している記事を見つけたのでそれをやってみた備忘録です。

 ほぼこちらの記事そのままなので、詳しい方法などはそちらを参照してください。

 では始めます。


1:Raspberry Piとカメラ
 今回自分が使ったRaspberry Piとカメラは以下の通りです。

Raspberry Pi 4 2GBモデル
 Raspberry Pi 4で一番安いモデルです。

Raspberry Pi カメラモジュール Rev 1.3
 リボンケーブルで接続するタイプのRaspberry Pi用のカメラモジュールです。今買うとしたらV2という新しいバージョンのカメラになっていると思いますが、古いこのタイプでもちゃんとカメラとして映るので大丈夫でした。
 ちなみにRaspberry Pi用のカメラモジュールを使っていますが、市販されているUSBで接続するタイプのカメラでも大丈夫だと思います。

 あとはディスプレイやマウス、キーボードなどを用意します。


2:カメラの確認
 まずはカメラがちゃんと認識されているかを確認します。以下のコマンドを実行して接続されているデバイスを確認します。

$ v4l2-ctl --list-device

 このコマンドが使えない場合は、以下のコマンドを実行してインストールします。

$ sudo apt-get install v4l-utils

「v4l2-ctl --list-device」を実行すると、以下のように接続されているデバイス一覧が表示されます。

$ v4l2-ctl --list-device
bcm2835-codec-decode (platform:bcm2835-codec):
        /dev/video10
        /dev/video11
        /dev/video12

mmal service 16.1 (platform:bcm2835-v4l2):
        /dev/video0

 カメラを1台接続している場合は上記の「/dev/video0」がそのカメラのデバイスになっています。この表示がなければラズパイ側でカメラが認識されていないので、もう一度接続を確認してみてください。


3:FFmpeg、Nginxなどのインストール
 今回のカメラ映像ライブストリーミングの流れを簡単に言うと「カメラ映像→FFmpegH.264に変換→RTMPプロトコルでNginxサーバに送る→WebページでHLS形式で配信」という感じになっています。

 なのでRaspberry PiFFmpeg、Nginxをラズパイにインストールする必要があります。

 これらをインストールするために、以下のコマンドを実行します。

・パッケージリストの更新

$ sudo apt-get update

FFmpegのインストール

$ sudo apt-get install ffmpeg

・Nginxのインストール

$ sudo apt-get install nginx

・NginxにRTMPを対応させるモジュールをインストール

$ sudo apt-get install libnginx-mod-rtmp

 先にapt-get updateをやっておかないとインストールできない場合があるので、実行しておくのを忘れないようにしてください。


4:HLS配信の設定
 必要なもののインストールができたので、次は配信用の設定ファイルを記述していきます。

 以下のコマンドを実行してconfファイルをエディタで開きます。

$ sudo nano /etc/nginx/modules-available/rtmp-live.conf

 rtmp-live.confファイルの中身は以下のように記述します。各設定項目の詳しい説明はこの公式wikiを参照してください。

rtmp-live.conf

rtmp {                            # RTMPでの設定
        server {
                listen 1935;      # ポート番号
                chunk_size 4096;  # チャンクサイズ
                allow play all;   # 許可。play allなので全て再生を許可している。
                access_log /var/log/nginx/rtmp_access.log;  # アクセスログの保存パス

                application live {          # applicationの後の文字が名称がURLの一部になる。つまりrtmp://<ip address>/liveのようになる。
                        live on;            # ライブ配信を受け取る
                        hls on;             # ストリーミング形式をHLSにする
                        record off;         # 録画しない 
                        hls_path /tmp/live; # 配信用ファイル(.tsファイル)保存先
                        hls_fragment 1s;    # .tsファイルに区切る秒数
                }
        }
}

 ファイルの記述が終了したら、今度はシンボリックリンクを作成します。こうすることでNginxを起動させる毎に「rtmp-live.conf」ファイルが読み込まれるようになります。

$ cd /etc/nginx/modules-enabled
$ sudo ln -s ../modules-available/rtmp-live.conf ./99-rtmp-live.conf

 これでHLS配信の設定は完了です。


5:配信ファイルの保存場所をRAMにする
 4までの設定でも問題なく配信はできますが、今のままでは配信用の動画ファイルの一時保存先は「/tmp」になっています。つまりはSDカードに保存されるようになっているので、配信をすると配信用動画の一時保存と削除が大量に行われます。これではSDカードの寿命を縮めることにもなってしまうので、ラズパイ本体のメモリー領域であるRAMに保存するように設定します。

 まず以下のコマンドでfstabファイルをエディタで開きます。

$ sudo nano /etc/fstab

 エディタを開いたら以下の一文を追記します。

tmpfs    /tmp    tmpfs   defaults,noatime,mode=1777    0    0

 追記したらファイルを上書き保存します。

 ちなみに各項目は以下のようになっています。

1.device:マウントされるパーティション/デバイス。tmpfsはRAMディスク。
2.dir:マウントポイント。/tmpを指定。
3.type:ファイルシステムタイプ。RAMディスクなのでtmpfsを指定。
4.options:マウントオプション。mode=1777はファイル操作を行う設定。
5.dump:dumpでバックアップを取るかどうか。0はバックアップなし。
6.fsckfsckによるチェックの順番。0はチェックなし。

 これで/tmpファイルがRAM上に保存されるようになります。ちなみにラズパイを再起動させると自動的に削除されます。


6:Webページの準備
 続いて配信ファイルを表示させるWebページの準備をします。

 Webページは「/var/www/html」配置します。「cd /var/www/html」で移動して、そのディレクトリからライブ配信しているHLS動画を参照できるようシンボリックリンクを設定します。

$ cd /var/www/html
$ sudo ln -s /tmp/live live

 そして「/var/www/html」ディレクトリ内にindex.htmlファイルを作成します。

$ sudo nano /var/www/html/index.html

 HLSを表示させるライブラリはhls.jsなど色々ありますが、今回はVideo.jsというライブラリを使用します。index.htmlファイルの中身は以下のように記述します。

・index.html

<!DOCTYPE html>
<html lang="ja">
	<head>
		<title>Streaming Test</title>
		<!-- このスタイルシートを読み込まないと再生ボタンなどが表示されない -->
		<link href="https://vjs.zencdn.net/7.6.6/video-js.css" rel="stylesheet" />
	  </head>
	  <body>
		<h1>Movie Title</h1>
		<p>description</p>
		<video-js	
		  id="my-video"
		  controls
		  liveui="true"
		  preload="auto"
		  width="1280"
		  height="720"
		  data-setup="{responsive: true}"
		>
		  <source src="/live/stream.m3u8" type="application/x-mpegURL" />
		  <p class="vjs-no-js">
			To view this video please enable JavaScript, and consider upgrading to a web browser that
			<a href="https://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
		  </p>
		</video-js>
		<script src="https://vjs.zencdn.net/7.6.6/video.js"></script>
	  </body>
</html>

 
 index.htmlを保存すればWebページの準備は完了です。

 Webページがちゃんと表示されるかはNginxを起動させてから確認します。

 以下のコマンドでNginxを再起動させます。

$ sudo systemctl restart nginx.service

 Nginxのプロセスがちゃんと動いているかは「ps aux | grep nginx」コマンドで確認します。

$ ps aux | grep nginx
root      3778  0.0  0.0  57776  1324 ?        Ss   14:56   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  3779  0.5  0.3  58036  4716 ?        S    14:56   0:01 nginx: worker process
www-data  3780  0.0  0.1  57916  2844 ?        S    14:56   0:00 nginx: worker process
www-data  3781  0.0  0.1  57916  2844 ?        S    14:56   0:00 nginx: worker process
www-data  3782  0.0  0.1  57916  2844 ?        S    14:56   0:00 nginx: worker process
www-data  3783  0.0  0.1  57908  2908 ?        S    14:56   0:00 nginx: cache manager process
pi        3870  0.0  0.0   3916   560 pts/1    S+   15:00   0:00 grep --color=auto nginx

 Nginxの起動時にエラーが出たりプロセスが確認できない場合は「/var/log/nginx/error.log」を開いてエラーを確認してみてください。

$ cat /var/log/nginx/error.log

 Nginxの起動を確認できたらRaspberry Piのブラウザを開いてURLに「127.0.0.1」と打ち込みます。以下のような画面が表示されればOKです。
f:id:rikoubou:20200930150946p:plain


7:ライブ配信の確認
 ようやくライブ配信の確認です。

 ライブ配信をするにはffmpegを使いますが、コマンドが長くなるのでシェルファイルを記述し、そのファイルを実行するようにします。

 どこでも良いですが、homeディレクトリ直下に「mystreaming.sh」ファイルを作成します。

$ cd
$ nano mystreaming.sh

 シェルファイルの内容は以下のように記述して保存します。

・mystreaming.sh

#!/bin/bash
if pidof -x ffmpeg > /dev/null; then
    echo "FFmpeg is already running."
    exit 1
fi

ffmpeg \
    -f v4l2 -thread_queue_size 8192 -input_format yuyv422 \
    -video_size 1280x720 -framerate 30 \
    -i /dev/video0 \
    -c:v h264_omx -b:v 768k \
    -bufsize 768k -vsync 1 -g 10 \
    -f flv rtmp://localhost/live/stream

 簡単に説明すると、最初のif文ですでにffmpegが実行されているかを確認します。すでに他で実行されていた場合は何もせずに終了します。ffmpegライブ配信部分については、1280×720のサイズでフレームレートを30に設定しています。

 ここまで準備ができたら以下のコマンドでシェルファイルを実行します。ライブ配信を止めたい場合は「Ctrl+C」で終了させます。

$ sh mystreaming.sh

 エラーがなければffmpegのコマンドが実行されるので、その状態でもう一度Raspberry Piのブラウザを開いてURLに「127.0.0.1」と打ち込みます。

 再生ボタンが表示されるので、そのボタンをクリックするとカメラ映像のライブ配信が表示されます。ただ10秒ぐらい遅延があるかと思います。

 また「ip a」コマンドでRaspberry PiIPアドレスを確認してそのアドレスにアクセスすることで別のPCなどからでもライブ配信を確認できます。

$ ip a

 ちなみにライブ配信中に「/tmp/live/」ディレクトリの中を見てみると、以下のように.tsファイルがどんどん作成されています。この.tsファイルが「rtmp-live.conf」の「hls_fragment 」で設定した秒数で細切れになった動画ファイルとなっています。

$ sudo ls /tmp/live/
stream-339.ts  stream-347.ts  stream-355.ts  stream-363.ts  stream-371.ts  stream-379.ts  stream-387.ts  stream-395.ts
stream-340.ts  stream-348.ts  stream-356.ts  stream-364.ts  stream-372.ts  stream-380.ts  stream-388.ts  stream-396.ts
stream-341.ts  stream-349.ts  stream-357.ts  stream-365.ts  stream-373.ts  stream-381.ts  stream-389.ts  stream-397.ts
stream-342.ts  stream-350.ts  stream-358.ts  stream-366.ts  stream-374.ts  stream-382.ts  stream-390.ts  stream-398.ts
stream-343.ts  stream-351.ts  stream-359.ts  stream-367.ts  stream-375.ts  stream-383.ts  stream-391.ts  stream-399.ts
stream-344.ts  stream-352.ts  stream-360.ts  stream-368.ts  stream-376.ts  stream-384.ts  stream-392.ts  stream-400.ts
stream-345.ts  stream-353.ts  stream-361.ts  stream-369.ts  stream-377.ts  stream-385.ts  stream-393.ts  stream-401.ts
stream-346.ts  stream-354.ts  stream-362.ts  stream-370.ts  stream-378.ts  stream-386.ts  stream-394.ts  stream.m3u8


 以上がRaspberry Piでカメラのライブストリーミングをやる方法です。

 ほぼ参考資料のページ様の内容と同じですが、割と簡単にできて驚きました。

 HLSやVideo.js、ffmpegについては何もわかっていないのでそのあたりも掘り下げて色々カスタマイズできるようになるともっと色々面白いことができそうです。


・参考資料

【Windows】バッチファイルで特定のアプリを自動起動させる方法

 Windowsを使っていて特定のアプリを立ち上げなくてはいけない場合、毎回そのアプリを手動で立ち上げるのが面倒になってくると思います。

 実際自分も3つぐらいのアプリをそれぞれ立ち上げる状態を何度かやっていて「バッチファイルで自動起動させるようにした方が楽なのでは?」と思い、バッチファイルでのアプリ起動を色々調べました。

 今回はその備忘録となります。

 バッチファイル自体あまり自分が書いたことがないので色々と不足な部分もあるかと思いますが、詳細は参考資料に挙げたページ様を参照してください。

 では始めます。


1:バッチファイルについて
 すでにご存じかとは思いますが、軽くバッチファイルについて説明しておきます。

 バッチファイルは拡張子が「.bat」で保存されているファイルです。
f:id:rikoubou:20200923161645p:plain

 テキストエディタ等で開くと中身を確認できます。中身はコマンドプロンプトで実行できる形で記述されています。そしてこのファイルをダブルクリックすると中に記述されたコマンドが実行されます。

 簡単に言うと「コマンドプロンプトで実行するコマンドをファイルとして保存しておき、ダブルクリックで自動起動できるようにしたもの」がバッチファイルになります。


2:バッチファイルで特定アプリの起動
 では本題に入ります。

 バッチファイルで特定アプリを起動させる方法は「call」と「start」の2つがあります。記述方法は以下の通りです。

call [起動したいアプリのパス]
start [起動したいアプリのパス]

 callは同一プロセスでの実行で「ひとつ前のcallアプリが終了するのを待ってから起動」、startは別プロセスでの実行で「前のアプリに関係なく起動」という違いがあります。

 実際にこの2つの起動を比べてみます。以下の2つのサンプルをそれぞれ「call_test.bat」、「start_test.bat」としてそのファイルをダブルクリックして実行してみてください。

・call_test.bat

@echo off

rem メモ帳を起動
call notepad.exe

rem 電卓を起動
call calc.exe

rem コマンドプロンプトを終了
exit /B 0


・start_test.bat

@echo off

rem メモ帳を起動
start notepad.exe

rem 電卓を起動
start calc.exe

rem コマンドプロンプトを終了
exit /B 0

 callの方はメモ帳を終了させた後に電卓が立ち上がりますが、startの方は両方立ち上がります。


3:バッチファイルで特定URLをブラウザで開く
 アプリの実行だけなら2で説明した方法でわかりましたが、特定のURLをブラウザで開きたい場合もあるかと思います。その場合の記述は以下のように引数にURLを渡してあげれば自動的にそのURLを開くことができます。

・url_test.bat

@echo off

rem Edge起動
start microsoft-edge:"https://time.is/ja/"

rem chrome起動
start "C:\Program Files\Google\Chrome\Application\chrome.exe" "https://www.yahoo.co.jp/"

rem コマンドプロンプトを終了
exit /B 0

 上記のようにEdgeの場合は「microsoft-edge:」の後にURLの文字列を、chromeの場合はインストールされているexeまでのパスの文字列とその引数にURLの文字列を記述すれば開くことができます。


 以上がバッチファイルで特定のアプリを自動起動させる方法です。

 基本的にはstartかcallで特定のアプリの.exeファイルのパスを記述すれば開くことができます。

 これを使えば割と色々なことが自動化できると思うので、使っていきたいですね。


・参考資料

【Raspberry Pi】プログラムの自動起動

 Raspberry PiはIoT機器としても使われることも多いかと思います。

 例えば、毎日朝に電源が入りデータを取得して夜には電源が落ちる、というような運用方法も割と考えられます。電源が投入される度に必要なプログラムを手動で起動するなんてことはやってられないので、Raspberry Piが起動するとプログラムも自動的に起動するようにするようにしたいところです。

 今回はそのプログラムの自動起動の手っ取り早くできる2つの方法についてです。基本的には参考資料に挙げているこちらのページ様の通りなので、詳しく知りたい方はそちらを参照してください。

 では、始めます。


1:rc.localを使う方法(root権限での実行)
 /etc/rc.localというファイルを編集することで、root権限でプログラムの自動起動ができます。

 まずはsudoコマンドでrc.localファイルを開きます。エディタはなんでもよいです。

$ sudo nano /etc/rc.local

 rc.localのファイルの中身は以下のようになっています。

#!/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

exit 0

 ファイルの最後に「exit 0」という記述があるので、その前に実行したいプログラムを記述します。例えばpython3で動かしたいプログラムがあるなら以下のように記述します。

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

python3 /path/path/hogehoge.py #追加部分

exit 0

 記述できたら上書き保存し、Raspberry Piを再起動させます。

 再起動すると該当のプログラムがroot権限で実行されます。rc.localに記述したのに実行されない場合はこちらのページ様を参照してください。


2:crontabを使う方法(ユーザ権限での実行)
 1の方法ではroot権限でしたが、crontabを使うとユーザ権限での自動起動ができます。root権限で自動実行させたいという場合はあまりないと思うので、こちらを使うのがメインになるかと思います。

 以下のコマンドを実行して、crontabを編集します。

$ crontab -e

 初回起動時にエディタの種類を尋ねられると思いますが、好きな任意のエディタを選んでください。

 エディタが立ち上がるので、自動起動させたいプログラムを記述していきます。例えばpython3で動かしたいプログラムがあるなら以下のように記述します。

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

@reboot python3 /home/pi/path/hogehoge.py #追加部分

 追記したら上書き保存します。

 ちなみにcrontabに登録されている内容を確認するには以下のコマンドを実行します。

$ crontab -l

 これで再起動すると該当のプログラムがユーザ権限で実行されます。

 またcrontabは指定した日付と時間で実行することもできるので、こちらの方が自由度は高いと思います。


3:自動起動したプロセスの確認と終了
 1と2のどちらの方法でも自動起動は可能ですが、ちゃんと動いているかの確認や手動で止めたい場合もあります。

 その場合は実行しているプログラムのプロセスを確認して、そのプロセスを終了させる必要があります。

 実行しているプロセスは以下のコマンドで確認できます。

$ ps aux

 auxの部分はオプションで、aは自分以外のユーザのプロセスも表示、uはユーザ名と開始時刻の表示、xは制御端末のないプロセスの情報も表示です。ただこれだけだとプロセスの一覧が大量に表示されてしまうので、以下のようにgrepで必要なものだけ表示させます。

$ ps aux | grep hoge

 例えば1と2で実行しているのはpythonのプログラムなので「$ ps aux | grep python」としたり、実行ファイル名である「$ ps aux | grep hogehoge」などとすると見つけやすいかと思います。

 実際に実行すると以下のようになります。

$ ps aux | grep python
root       485  0.6  0.4  11436  7680 ?        S    16:33   0:00 python3 /home/pi/path/hogehoge.py
pi        1105  0.0  0.0   3916   580 pts/0    S+   16:33   0:00 grep --color=auto python

 最初に出てくるものがrc.localで実行しているプログラムです。rootユーザが「python3 /home/pi/path/hogehoge.py」を実行していることがわかります。

 これを停止させる場合は、このプロセスをkillする必要があります。

 プロセスをkillするコマンドは以下の通りです。

$ kill プロセス番号

 ユーザ名の後にある番号がプロセス番号です。つまりこの場合、killしたいプロセス番号は「485」になります。またこのプロセスはroot権限で実行されているため、killするときもsudoを付ける必要があります。

 つまりこのプロセスをkillするコマンドは以下になります。

$ sudo kill 485

 実行した後、再度確認するとちゃんとプロセスが消えています。

$ ps aux | grep python
pi        1145  0.0  0.0   3916   548 pts/0    S+   16:34   0:00 grep --color=auto python

 crontabに登録して実行した場合は以下のようになります。

$ ps aux | grep python
pi         473  0.0  0.0   1940   372 ?        Ss   16:45   0:00 /bin/sh -c python3 /home/pi/path/hogehoge.py
pi         475  0.8  0.4  11300  7464 ?        S    16:45   0:00 python3 /home/pi/path/hogehoge.py
pi        1136  0.0  0.0   3916   548 pts/0    S+   16:45   0:00 grep --color=auto python

 上2つがcrontabで実行されているプロセスです。2つあるので面倒ですが、これを一括でkillするには以下のコマンドを使います。

$ pkill -f hogehoge

 これで「hogehoge」という名前を含むプロセスをすべて一括でkillしてくれます。

 実行した後、再度確認するとちゃんとプロセスが消えています。

$ ps aux | grep python
pi        1173  0.0  0.0   3916   560 pts/0    S+   16:52   0:00 grep --color=auto python


 以上がRaspberry Piでプログラムを自動起動させる方法になります。

 割と使う機会があると思うので、IoT関連のことをやらせるときには必要になるかと思います。


・参考資料

【Raspberry Pi/python】Raspberry Pi 4のGPIOのINPUTについて

rikoubou.hatenablog.com

 前回はRaspberry Pi 4のGPIOでのLチカ(OUTPUT)をやったので、今回はGPIOの値を読み取るINPUTについての記事です。

 では、始めます。


1:プルアップ/プルダウンの設定とREAD
 Raspberry Pi 4のGPIOでは内部的にプルアップ/プルダウンの設定ができます。

 プルダウン/プルアップについての詳しい説明は以下のページ様を参照してください。

 プルアップ/プルダウンは、簡単に言うと「タクトスイッチなどの部品を単に繋いだだけではHIGH/LOWがタクトスイッチに連動しないので、ちゃんと連動させるようにするためのもの」という感じです。

 Raspberry PiのGPIOをpythonで制御する場合、このプルアップ/プルダウンの設定は以下のようにします。

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO

SWITCH_PIN = 27 # ピン番号

GPIO.setmode(GPIO.BCM)
GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)   # プルアップの場合
GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # プルダウンの場合

result = GPIO.input(SWITCH_PIN) # ピンの値を読み取る(HIGH or LOWの1 or 0)

 GPIO.setupのところの引数「pull_up_down」の値を「GPIO.PUD_UP」にするとプルアップ、「GPIO.PUD_DOWN」にするとプルダウンになります。

 GPIO.input(ピン番号)でそのピンのHIGH、LOWの値を読み取ります。


・2021/05/26:追記
 公式ページのドキュメントの中で以下のような記述がありました。

Pins GPIO2 and GPIO3 have fixed pull-up resistors,
but for other pins this can be configured in software.

 これは「GPIO2とGPIO3はプルアップで固定されているためソフトウェアでのプルダウンはできない」ということなので、GPIO2とGPIO3を使う場合は注意してください。


2:サンプル
 プルアップ/プルダウン、READのやり方がわかったので軽くサンプルを動かしてみます。

 今回は以下のようにプルダウンで回路を組みます(公式ドキュメントより引用して加工)。
f:id:rikoubou:20200916165132p:plain

 LEDは前回と同じで、今回はタクトスイッチを追加しています。タクトスイッチの一方を3.3V(Raspberry PiのGPIO一番左上)に、もう一方をGPIO27(Raspberry PiのGPIO左列上から7番目)に繋ぎます。

 ちなみにプルアップを使用したい場合は、タクトスイッチの3.3Vに繋いでいる側をGNDに繋ぎます。

 その状態で以下のプログラムを実行します。

・gpio_read_test.py

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

LED_PIN    = 17 # LEDピン番号(BCMの番号)
SWITCH_PIN = 27 # タクトスイッチのピン番号(BCM番号)

def main():
    setup_gpio() # GPIOの準備

    try:
        # 1秒ごとに点灯/消灯を繰り返す
        while(True):
            print("pin status:", read_pin(SWITCH_PIN))
            print("LED ON")
            GPIO.output(LED_PIN, GPIO.HIGH)
            time.sleep(1)

            print("pin status:", read_pin(SWITCH_PIN))
            print("LED OFF")
            GPIO.output(LED_PIN, GPIO.LOW)
            time.sleep(1)

    except KeyboardInterrupt:
        # Ctrl+Cで終了した場合、GPIO設定をクリア
        GPIO.cleanup()

# GPIOを扱う準備
def setup_gpio():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED_PIN, GPIO.OUT)
    # GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # プルアップ
    GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # プルダウン

# ピンの状態を読む
def read_pin(pin_number):
    return GPIO.input(pin_number)

if __name__ == '__main__':
    main()

 実行すると、以下のようにLEDのON/OFFに加えてPINの状態も表示されます。タクトスイッチを押した状態だと1、離した状態だと0と表示されます。

$ python3 gpio_read_test.py
pin status: 0
LED ON
pin status: 0
LED OFF
pin status: 0
LED ON
pin status: 1
LED OFF
pin status: 1
LED ON
pin status: 1
LED OFF
pin status: 1
LED ON
pin status: 0
LED OFF
pin status: 0
LED ON
pin status: 0
LED OFF
pin status: 0
LED ON

^C

 プルアップの場合はタクトスイッチの押した時と離した時のピンの状態が反転します。


 以上がRaspberry Pi 4のGPIOのINPUTについてです。

 Raspberry Piというよりもプルアップ/プルダウンについての記事になってしまった感じですが、物理的なプルアップ/プルダウンを組み込まなくても内部的に設定できるので、知っていれば回路側を少し簡素化できそうですね。


・参考資料

【Raspberry Pi/python】Raspberry Pi 4のGPIOを使ってLチカをする

 Raspberry Pi 4についての記事はいくつか書いてきましたが、そういえばGPIOを扱ったことはありませんでした。

 なので今回はRaspbery Pi 4のGPIOを使ってLチカをやるまでの備忘録になります。

 基本的には参考資料に挙げているページ様の通りなので、詳しくはそちらを参照してください。

 では、始めます。


1:GPIOを使う準備
 Raspberry Pi 4でGPIOを使うには以下のコマンドを実行する必要があります。以下のコマンドを実行しないと、そもそもGPIOの状態を確認する「gpio readall」コマンドを実行することができません。

$ wget https://project-downloads.drogon.net/wiringpi-latest.deb 
$ sudo dpkg -i wiringpi-latest.deb


---- 2021/05/26:追記 ----
 上記の方法だとsudoコマンドを使ってインストールしているため、以後RPi.GPIOライブラリを使用したpythonコードを実行する際にsudoを付けないと実行できない場合があります。

 その回避方法としてpipでのインストール方法もあります。

$ pip3 install rpi.gpio

 こちらではsudoを使わずにインストールしているので、RPi.GPIOライブラリを使用したpythonコードを実行する際にsudoを付ける必要がなくなります。
---- 追記終わり ----


 このコマンドを実行したら、GPIOの状態を確認するために以下のコマンドを実行します。

$ gpio readall

 このコマンドを実行すると、以下のように各GPIOの状態が表示されます。

 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT5 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT5 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 1 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 1 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 1 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 0 | OUT  | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | OUT  | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+

 簡単にこの表の見方を説明すると、以下のようになります。

・BCM:コマンドやプログラムなどで操作する場合に使用するピン番号。
・wPi:Wiring Piというライブラリを使う場合の番号。
・Name :ピンの名前。
・Mode:ピンのモード。出力ならOUT、入力ならIN。
・V:プルアップ/プルダウン。プルアップなら1、プルダウンなら0。
・PhysicalRaspberry Piの物理的なピン番号。

 コマンドやプログラムで制御する場合は「BCM」の番号を設定するということになります。

 これでGPIOを扱う準備ができました。


2:Lチカのサンプル
 では実際にRaspberry PiのGPIOを使ってLチカをやっていきます。

 Raspberry Pi 4の物理ピンの位置は以下のようになっています(公式ドキュメントより引用)。
f:id:rikoubou:20200911172414p:plain

 この物理ピンの位置を元に以下のように回路を作ります(公式ドキュメントより引用して加工)。
f:id:rikoubou:20200911173529p:plain

 LEDのプラス側を「GPIO 17」に、LEDのマイナス側抵抗を付けてある方に「GND」を接続します。「GPIO 17」のBCM番号は「17」なのでサンプルコードで制御するピン番号はこの「17」を使います。

 回路ができたら以下のサンプルコードを記述し、ファイルを保存します。

・gpio_test.py

import RPi.GPIO as GPIO
import time

PIN = 17 # ピン番号(BCMの番号)

# GPIOを扱う準備
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)

try:
    # 1秒ごとに点灯/消灯を繰り返す
    while(True):
        print("ON")
        GPIO.output(PIN, GPIO.HIGH)
        time.sleep(1)

        print("OFF")
        GPIO.output(PIN, GPIO.LOW)
        time.sleep(1)

except KeyboardInterrupt:
    # Ctrl+Cで終了した場合、GPIO設定をクリア
    GPIO.cleanup()

 そして以下のコマンドでサンプルを実行します。

$ python3 gpio_test.py

 すると1秒間隔でLEDの点灯と消灯を繰り返します。終了する時はCtrl + Cで終了させます。

 以上がRaspberry Pi 4のGPIOを使ってLチカするまでの方法です。

 これでRaspberry PiのGPIOの扱い方もわかったので、センサーなどを繋げて色々遊べそうです。


・参考資料

【自作PC】自作PCをやってみた その4:ベンチマーク

 前回の記事でBIOS画面まで表示できた後、OSを入れたりドライバを入れてGPUを認識させたりするところまでの記事を書きました。

 今回はYoutube動画などでよくあるハードウェアの情報を見ることができるソフトウェアやベンチマークソフトウェアの紹介をしていきます。

 では、始めます。


1:ベンチマークを行う際に便利なソフトウェア
 ベンチマークを行う際にPCの状態などを確認できるソフトウェアを紹介していきます。詳しい使い方などは省きますが、別の機会にそれぞれ記事にするかもしれません。

CPU-Z
 CPUの型番やクロックなどかなり詳細な状態を確認できるソフトウェアです。その他にメモリ、GPUなども確認でき、CPU使用率を100%にする負荷テストも行うことができます。
 
GPU-Z
 CPU-ZGPU版のようなソフトウェアです。このソフトウェアではGPUのより詳細な情報を確認することができます。GPU性能テストを行うこともできます。

HWiNFO
 CPUやGPU、ストレージやマザーボードの各状態をリアルタイムで確認できるソフトウェアです。サーマルスロットリングが発生しているかどうかや、各種温度などもリアルタイムで確認できるので何かと便利です。

MSI Afterburner
 ベンチマーク動画でゲームの左上にFPSGPU使用率などを表示させているのをよく見かけますが、それを行うためのソフトウェアです。MSIが提供しているソフトウェアですが、MSI以外のPCでも問題なく使えます。ただしゲームの画面上に常に表示させるには色々と設定をする必要があります。


2:ベンチマークソフト
 様々なベンチマークソフトがありますが、ベンチマーク動画でよく見ていて自分がインストールしたものを紹介していきます。

CINEBENCH R20
 ベンチマーク動画でもやられていることが多いCPUのシングルとマルチを計測するベンチマークです。

FINAL FANTASY XV WINDOWS EDITION Benchmark | SQUARE ENIX
 どのベンチマーク動画でも大体行われている定番のFF15ベンチマークです。ゲームの中でもかなり重い部類に入るそうなので、このベンチマークで「快適」以上の判定になれば大体のゲームは問題なくできるのではないかと思います。大定番で数多く行われているのでスコアの比較はしやすいと思います。

ファイナルファンタジーXIV: 漆黒のヴィランズ ベンチマーク
 これまた定番のFF14ベンチマークです。FF15ベンチマークよりは軽いです。こちらも大定番で数多く行われているのでスコアの比較はしやすいと思います。

ドラゴンクエストX ベンチマーク
 こちらもまた多く行われているドラクエXベンチマークです。このベンチマークはかなり軽い部類らしく、上記のベンチマーク2つが重いかもしれないAPUやオンボードのPCで最低限のゲームができるかの確認に使われている印象です。

3D Mark
 こちらもかなり有名なベンチマークです。CPU性能、GPU性能、2つを合わせた総合的な性能と別々に測定してくれるベンチマーク用のソフトが数種類試せます。また計測後に他の計測値を比較するページを開くこともできます。

CrystalDiskMark
 ストレージの速度をベンチマークで測定できるソフトウェアです。


おまけ:今回の自作PCの各ベンチスコア
 誰も気にする人はいないと思いますが、これらのベンチマークを自作したPCで試した結果も掲載しておきます。裏でchromeを立ち上げたりした状態で計測しているものもあったりするのであくまで目安程度です。

CINEBENCH R20
f:id:rikoubou:20200909204531p:plain

FF15ベンチ
f:id:rikoubou:20200909204633p:plain

FF14ベンチ
f:id:rikoubou:20200909211302p:plain

ドラゴンクエストX ベンチマーク
f:id:rikoubou:20200909204937p:plain

・3D Mark(Time Spy
f:id:rikoubou:20200909205046p:plain

・3D Mark(Fire Strike)
f:id:rikoubou:20200909205139p:plain

CrystalDiskMark
f:id:rikoubou:20200909214447p:plain

 各スコアはこのようになりましたが、これが実際どれぐらい快適なのかはそのゲームをやってみないとわからないとは思います。ただ全体的にみるとフルHDのゲームであれば大体のものは快適に動く程度のスペックにはなっていそうな気がします。


 以上がベンチマークを行う際に便利なソフトウェアとベンチマークソフトの紹介です。

 Youtube動画とかでよく見る各ベンチマークをやってみてわかったのは「ベンチマークは結構時間がかかる」ということでした。何度も検証して比較動画とかを作ってる人の苦労がちょっとだけわかった気がします…。


・参考資料


・関連記事

【自作PC】自作PCやってみた その3:OSやドライバを入れる

 前回の記事で組み立てについての記事を書きました。

 BIOSの起動までは割と自作PCの動画などで紹介されていると思いますが、その後Windowsをインストールしたり、グラフィックボードのドライバを入れたりとやることは多いです。実際自分もどうすればいいのかを結構調べながらやりました。

 基本的には参考資料に挙げているこちらのYoutube動画のままですが、その備忘録や手順を記録しておこうと思った次第です。ちなみに自分が使用しているマザーボードは「ASRock B550M Pro4」、グラフィックボードは「ASRock Radeon RX 5600 XT Challenger D 6G OC」なので別の商品の場合は手順や画面が違っている場合があるので注意してください。

 では始めます。


1:BIOS画面を立ち上げてCPUやメモリを確認する
 OSの入っていない状態でPCの電源を入れてから「Del」キーを連打しているとBIOS画面が表示されます。

 自分の場合は以下のようにASRockのBIOS画面が表示されます。ちなみにBIOS画面で「F12」キーを押すと挿しているUSBメモリに画面キャプチャを保存できます。
f:id:rikoubou:20200907122833p:plain

 赤枠で囲っている部分の一番上がBIOSのバージョンで、その下にはCPUの情報が表示されています。

 緑色で囲った枠にはメモリの情報が表示されています。どのレーンにどのようなメモリが挿さっているかがわかるので、認識していないメモリがあれば一度電源を落としてもう一度挿し直してください。

 ここで問題がなければWindows 10をインストールしていきます。


2:Windows 10をインストールする
 BIOSの起動まで確認できたらWindows 10をインストールしていきます。

 自作したPCにDVDドライブがついていない人も多いと思うので、先にWindows 10のインストールメディアをUSBメモリに作成しておく必要があります。インストールメディアの作り方は以下の記事に書いています。

 基本的にはPCの電源を切っている状態でインストールメディアをUSB端子に挿してから、PCの電源を入れると自動的にWindows 10のインストールが始まるはずです。

 始まらない場合はBIOS画面の項目からUSBメモリを最初に起動するように設定します。

 これで再起動するとWindows 10のインストールが始まります。

 Windows 10のインストールは、HomeやPro、32bitか64bitかを選択して初めてWindowsをインストールするので「カスタム」の方を選びます。あとはMicrosoftが奨めてくる機能を全部OFFにしていけばOKです。

 ちなみにインストールの途中でネットに繋いでプロダクトコードの認証をする部分がありますが、後からネットに繋いで認証することもできるので後回しにしても大丈夫です。後で認証する場合はMicrosoft公式の以下のページを参考にしてください。

 簡単に説明すると、「設定」→「更新とセキュリティ」→「ライセンス認証」を開きます。ライセンスのステータスが「Windows はライセンス認証されていません」となっている場合は認証されてないので下の方にある「プロダクトキーの変更」をクリックしてプロダクトコードを入力すれば認証されます。この作業をするときにはインターネットに接続されている必要があるので注意してください。

 One Driveなども使用したい場合はMicrosoftアカウントを作成して紐づけておく必要もあります。

 Windows 10のインストールができたので早速ゲームを入れて…と行きたいところですが、タスクマネージャを開くと以下のようになっておりGPUの項目が出ていません。
f:id:rikoubou:20200907130200p:plain

 つまりこのままではグラフィックボードを認識していないので、グラフィックボードのドライバをインストールする必要があります。


3:グラフィックボードのドライバをインストールする
 今回の自作PCではAMDRadeonを使っているので、AMDRadeonのサポートページを開きます。

 自分のものはRX5600XTなのでそれを選択して「送信」ボタンをクリックします。
f:id:rikoubou:20200907131150p:plain

 該当しているOSを選択します。ここではWindows 10 64bitなのでそれをクリックします。
f:id:rikoubou:20200907131330p:plain

 表示されるドライバで一番上にあるものが最新になっているので、それをダウンロードします。
f:id:rikoubou:20200907131509p:plain

 あとはダウンロードしたインストーラを起動させて指示に従ってインストールしていきます。
f:id:rikoubou:20200907131724p:plain
f:id:rikoubou:20200907131733p:plain

 Radeonのソフトウェアの画面が立ち上がりますが、これもインストール途中で出てくる画面なので指示に従っていきます。
f:id:rikoubou:20200907131837p:plain

 この画面でグラフィックボードに対応するドライバが表示されるので、それを選択して右下にある「インストール」をクリックします。
f:id:rikoubou:20200907131855p:plain

 残り時間が表示されるので気長に待ちます。
f:id:rikoubou:20200907131954p:plain

 インストールが終わったら右下の「再起動」ボタンをクリックしてPCを再起動させます。AMDに情報を送りたくない場合は画面真ん中の項目のチェックを外しておきましょう。
f:id:rikoubou:20200907132140p:plain

 再起動後、タスクマネージャを立ち上げるとちゃんとGPUの項目が増えており、RX5600XTとして認識されています。
f:id:rikoubou:20200907132227p:plain


4:BIOSのアップデート(やらなくてもよい)
 動作に特に問題なければやる必要はないのですが、BIOSアップデートの方法も説明しておきます。
 BIOSのアップデートは失敗するとPC自体が起動しなくなる可能性があるので、何か不具合がない限りは行わない方がいいかと思います。

 今回のASRockの場合は、マザーボードのサポートページを開くとBIOSの様々なバージョンが公開されているので、まず今回使用しているマザーボード「B550M Pro4」の商品ページを開きます。

 商品ページの「サポート」→「BIOS」の項目をクリックしていくと一番上に最新のBIOSバージョンがあるので「グローバル」と書かれた方をクリックしてダウンロードします。
f:id:rikoubou:20200907142703p:plain

 ダウンロードしたzipファイルを解凍し、USBメモリの中に解凍した中身を入れます。

 一度PCの電源を落としてからUSBメモリを差し込んだ状態でPCを起動させます。ASRockの場合は、OSを入れた状態で起動させた時に「F2」キーを押すことでBIOS画面を立ち上げられます。

 BIOSのアップデートは「Tool」→「Instant Flash」の項目を選択します。これでUSBメモリの中身を読み込み、BIOSのInstant Flashの項目があれば自動的に表示されます。
f:id:rikoubou:20200907143257p:plain

 アップデートしたいBIOSの項目を選択して「OK」ボタンを押すとBIOSのアップデートが実行されます。


5:その他のドライバを入れる
 グラフィックボードの認識はできましたが、マザーボードのオーディオ関係やその他のドライバがインストールされていないのでそれをインストールしていきます。ASRockの場合は自動的にドライバを検索してインストールしてくれるソフトがあるのでそれを入れていきます。

 以下のページを開きます。

 ページを少しスクロールした先にある「Download」ボタンをクリックします。
f:id:rikoubou:20200907135846p:plain

 zipファイルがダウンロードされるので、それを解凍した中にあるインストーラを起動させます。
f:id:rikoubou:20200907140109p:plain

 あとは指示通りにインストールしていきます。デフォルトのままでOKです。
f:id:rikoubou:20200907140233p:plain

 インストールしたASRock App Shopを立ち上げると以下のような画面になります。
f:id:rikoubou:20200907140658p:plain

 今回はドライバを入れたいので「BIOS & Drivers」をクリックして表示し、必要なドライバの項目にチェックを入れた状態で「Update」ボタンをクリックします。
f:id:rikoubou:20200907140734p:plain

 すると自動的に最新のドライバがインストールされます。
f:id:rikoubou:20200907140948p:plain
f:id:rikoubou:20200907140956p:plain

 ドライバによっては再起動が必要なことがあるので、その場合は再起動させます。自動的に再起動する場合もあります。


 以上が自作PCを作った直後からのOSやドライバを入れるまでの手順になります。

 自作PCの解説動画などではWindowsのインストールぐらいまではやってると思いますが、その後どうすればいいかまで解説してるものはあまりなかった印象だったので、わからない人の少しでも手助けになれば幸いです。


 次はベンチマーク動画などでよく見かけるソフト紹介の記事を書いて、ひとまず自作PC関連の記事は一段落しようかと思っています。


・参考資料


・関連記事