Raspberry PIのGPIOをDockerで検証する
以前執筆した、
「ミーティング中を検知して周囲の人間に知らせる」
の番外編です。(第二回で番外編かよって感じですが)
私のお家にはRaspberryPI4が一台あるのですが、RaspberryPIで動くアプリの開発をしていく上で毎回実機で検証を行うのは面倒です。
かと言って、RaspberryPI上で直接開発するのは別の開発端末でちょっとコードを変えたいときなどに不便です。
そこで、Docker上でGPIOの動作確認を含めてRaspberryPIの開発ができるようにします。
手順
RasberryPIには専用OSの"Raspberry Pi OS"がインストールされています。
このOSのファイルを抜き出してそれをもとにDockerImageを作成してあげればDocker上でRaspberry Pi OSを動かすことができます。
Docker上のRaspberry Pi OSからGPIOを操作する方法は後述します。
Raspberry Pi OSのダウンロード
以下のリンクから、ブラウザなりCURLなりでRaspberry Pi OSのファイルをダウンロードします。
https://downloads.raspberrypi.org/raspios_lite_arm64/root.tar.xz
DockerImageの作成
上記でダウンロードしたファイルをもとにDockerImageを作成します。
docker image import {ダウンロードしたOSファイルへのパス} {イメージ名}
DevContainerを作成
以下のdevcontainer.jsonとdocker-compose.ymlを作成します。
devcontainer.json
{
"name": "raspi",
"dockerComposeFile": [
"../docker-compose.dev.yml"
],
"service": "raspi",
"workspaceFolder": "/workspace",
"remoteUser": "root"
}
docker-compose.yml
version: '3'
services:
raspi:
image: {先程作成したイメージ名}
tty: true
volumes:
- .:/workspace
environment:
- GPIOZERO_PIN_FACTORY=mock
上記docker-compose.ymlのGPIOZERO_PIN_FACTORY=mock
がミソです。
この環境変数をmockに設定すると、GPIOのピンが存在していなくてもOS内で仮想でGPIOを再現してくれます。
GPIOの状態を確認する
上記で作成したdevcontainerを起動し、ターミナルで以下のコマンドを実行してください。
pinout
すると以下のように仮想のGPIOが有効になっていることがわかります。
,--------------------------------.
| oooooooooooooooooooo J8 +====
| 1ooooooooooooooooooo | USB
| +====
| Pi Model 3B V1.2 |
| +----+ +====
| |D| |SoC | | USB
| |S| | | +====
| |I| +----+ |
| |C| +======
| |S| | Net
| pwr |HDMI| |I||A| +======
`-| |--------| |----|V|-------'
Revision : a02082
SoC : BCM2837
RAM : 1GB
Storage : MicroSD
USB ports : 4 (of which 0 USB3)
Ethernet ports : 1 (100Mbps max. speed)
Wi-fi : True
Bluetooth : True
Camera ports (CSI) : 1
Display ports (DSI): 1
J8:
3V3 (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
GND (25) (26) GPIO7
GPIO0 (27) (28) GPIO1
GPIO5 (29) (30) GND
GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
GND (39) (40) GPIO21
For further information, please refer to https://pinout.xyz/
おわり
これでラズパイを持ってない人でもラズパイ開発ができますね。