RaspberryPi4をPIGPIOが動かせるまで構築

久々にRaspberry Pi 4を触る機会があったので、そのついでに再構築することにした。
その際、例のpep668のおかげでpip installが素直にできないと知ったので、再構築するまでの記録を備忘録として残す。

## 使用ハード
Raspberry Pi 4 4GB
シリコンパワー SSD M.2 SP256GBSS3A55M28

*USBbootでSSDから起動。

## 使用するOS
Raspberry Pi OS 最新版 64bit (2024年8月時点)


## Rasberry Pi ImagerでmicroSDにOSをインストール

インストール時のオプションでホスト名、ユーザーIDとPassword、ロケールの設定、SSHの有効化は設定する。

## OSが立ち上がったらIPアドレスを固定
wifiでつないでるためwifiの設定
#### GUIから
右上のタスクバーから赤丸のアイコンを選択。
![QUIITA1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471681/200f94e1-79cc-30f6-c39a-8d953e1b6ed1.png)

SSIDが表示されるのでつなぎたいSSIDを選択してとりあえず接続。
接続が終わったら、一番下のAdvanced Optionsにマウスカーソルを合わせるとoption一覧が表示される。
![QUIITA_SSID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471681/31c110b2-e17c-48d1-7fdf-480c006f3553.png)


Advanced Optionsが表示されたら、一番下のEdit Conections...を選択。

![QUIITA_SSID_Advancedoptions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471681/c00d137a-4ee3-032a-1c82-cf09779bf474.png)

SSID一覧が表示されるのでIPを固定したいSSIDを選択。
![AUIITA_SSID_OPTION.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471681/e5939339-8156-9be4-a692-03b6feebd91b.png)

SSIDの詳細画面が出るので、IPv4Settingsのタブを選択
MethodをAutomaticからManualに変更(赤枠)
Address Netmask Gateway等を設定(青枠)
設定が終わったら保存(緑枠)
![QUIITA_IP固定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471681/92714ff0-6e05-3049-e488-8f9a73fa63d9.png)

再起動をかけて、ifconfig。
inet 以降が設定した値になっていれば固定が完了。
```shell-session
$ ifconfig
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet xxx.xxx.x.xxx  netmask 255.255.255.0  broadcast xxx.xxx.x.xxx
        inet6 xxxx::xxxx:xxxx:xxxx:xxx  prefixlen xx  scopeid 0x20<link>
        inet6 xxxx:xx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx  prefixlen xx  scopeid xxx<global>

```
以下consolでのコマンドは母艦からSSH接続。
このRaspberry　Piは電子工作の検証時のみ起動するので鍵の設定はなし。
GUIはまだ使うのでそのままにする。

## アップデート　アップグレード　インストール
アプデ、アプグレ、必要なもののインストール。
インストールはとりあえず最低限の物。
エディターの宗教戦争はNG。
```shell-session
$ sudo apt update
$ sudo apt full-upgrade
$ sudo apt install vim
```

## 電子工作用のpythonの環境づくり。
プロジェクト用のディレクトリを作成しそこへ移動。
ディレクトリ名はpython_projyectとした。
```shell-session
$ mkdir python_projyect
$ cd python_projyect
hoge@hogetime:~/python_projyect $ #プロジェクト用のディレクトリに入る。
```
#### 以下プロジェクト用のディレクトリでの作業。
仮想環境を作成。
仮想環境のディレクトリ名は.venvとした。
```shell-session
$ python3 -m venv .venv
```
lsで確認。
仮想環境のディレクトリが作成できてれば成功。
```shell-session
$ ls -al
合計 20
drwxr-xr-x  3 hoge hoge 4096  7月 28 14:23 .
drwx------ 17 hoge hoge 4096  8月 12 20:58 ..
drwxr-xr-x  5 hoge hoge 4096  7月 27 19:27 .venv　
```
仮想環境を有効化する。
```shell-session
$ source .venv/bin/activate 
```
有効化後、コマンドラインの頭に仮想環境のディレクトリの名前が付いていれば仮想環境内になっている。
```shell-session
(.venv) hoge@hogetime:~/python_projyect $
```
念のため、pythonのインタプリタの場所を確認。
```shell-session
(.venv) hoge@hogetime:~/python_projyect $ which python
/home/hoge/python_projyect/.venv/bin/python
```
結果が仮想環境内のpythonになっていれば仮想環境内でpythonを動かすことができている。


仮想環境内で以下のコマンドを実行すると、仮想環境から抜けることができる。
```shell-session
(.venv) hoge@hogetime:~/python_projyect $ deactivate
hoge@hogetime:~/python_projyect $
```

## 環境作成後、python関係をやる場合の手順。
プロジェクトのディレクトリに入り、仮想環境を有効化。
そこでpython関係の作業をする。
```shell-session
hoge@hogetime:~ $ cd python_projyect/ #プロジェクトのディレクトリに移動
hoge@hogetime:~/python_projyect $　source .venv/bin/activate #仮想環境有効化
(.venv) hoge@hogetime:~/python_projyect $ python3 test.py #例としてtestプログラム実行
```

## pythonのLibraryを入れて行く。
仮想環境が構築できたので、仮想環境内のpythonにLibraryを入れて行く。
とはいえ仮想環境に入ってしまえば従来のpip installと変わらない。
#### 以下仮想環境内で実行すること

使う前にpipのアップグレード
```shell-session
$ python3 -m pip install --upgrade pip
```
試しにPIGPIOをインストールする。
```shell-session
$ pip install pigpio
```
仮想環境内でのpip installなのでpep668のお行儀問題はでなくなった。
後は各々必要なものを入れて行く。

## PIGPIOの自動起動の設定
PIGPIOをそのまま使う場合、毎回実行コマンドを叩く必要があるがめんどくさいので自動化する。
#### この項目は仮想環境内である必要はない。
pigpioのdaemonを自動起動するために、systemdへ自動実行サービスファイルを作成。
```shell-session
$ sudo vim /etc/systemd/system/pigpiod.service
```
サービスファイルの記述内容
```shell-session
[Unit]
Description=Pigpio daemon

[Service]
ExecStart=/usr/bin/pigpiod
ExecStop=/bin/systemctl kill pigpiod
Type=forking

[Install]
WantedBy=multi-user.target
```
サービスファイルを再読み込みして有効化。
```shell-session
$ sudo systemctl daemon-reload
$ sudo systemctl enable pigpiod.service
```
以降、起動時にサービスファイルが実行されるが、初回時に再起動をしない場合は以下コマンドでサービスファイルを実行。
```shell-session
$ sudo systemctl start pigpiod.service
```
ここまででraspberry pi 4でPIGPIOを使った電子工作をするための必要最低限のものはそろった。
## USBbootを使ってSSDからシステムを読み込む
microSDbootから変更して、USB経由でSSDから起動するようにする。
もちろん速度も速くなるが、どちらかというと寿命対策。

2024/8月時点で最新版OSを入れているのであれば基本boot loaderのversionは対応の物になっているはず。

もし、USB bootの設定がない等の問題があるならここのページの動画のほうで最新版のboot loaderに変えてる場面があるのでそちらをやってみるのも手。（ただし自己責任）


ラズパイ側からラズパイコンフィグを開く
```shell-session
$ sudo raspi-config
```
そうするとラズパイコンフィグが開くので6のAdvanced Optionsを選択。
![rspiconfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471681/317deb6c-8b93-0807-a975-17a5fafcfc26.png)
Advanced optionが開くのでA4のBoot orderを選択。
![bootorder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471681/db534cdf-e93b-ebe1-4315-f9bfd1f009ee.png)
Boot orderが出るのでB1のSD Card BootからB2の NVMe/USB Bootに変更して了解（英語の場合select)
![ブート選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471681/b2031cc1-4041-ed0c-e97e-2076457566a0.png)

変更していいかと聞かれるので許可して、SDカードをぬいてrebootと出るので、そこでSDcardを抜いてrebootを選択(SS撮るの忘れた)

これでSSDからのbootになる。

## 露骨なステマ
ここまでやったのを動画でも備忘録を残しています。
合成音声等色々ごちゃまぜ茶番マシマシなので暇でしょうがないという奇特な方は見てやってください。

https://www.nicovideo.jp/watch/sm44045344

## 雑談とか感想文
久々に触ったけど、いろいろ変わってますねぇ。
まぁ、pep668の言いたいことの理解はできる。めんどくさいけど。

動画の方でも触れたけど、オプション入れたりapt使えばOSで使うほうのpythonも変更できるが、まぁ、知ってしまったからには一応従おうとはおもった。理解はできたしね。めんどくさいけど。
とはいえ、venvはraspberry pi OSには標準で入ってるものだからまだ楽なんだけどね。

他の仮想環境に関しては自分がやることでどうしても必要になったら考える。
もしくは主流が決まったらかな。

少しの間調べたけど、正直今のところだといろいろあって、アプデも急速に行われてるしでまだ慌てる時間じゃない。という感じ。