1
1

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/

おわり

これでラズパイを持ってない人でもラズパイ開発ができますね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1