RaspberryPi 4B+Ubuntu 21+DockerからLEDを操作

2022年12月23日

環境

  • Raspberry Pi 4B
  • Mac OSX Monterey

手順

SDカードを用意

  • ここ(https://www.raspberrypi.com/software/)からRaspberry Pi Imagerをダウンロード&インストール
  • Raspberry Pi Imagerを起動
  • CHOOSE OS -> Other general purpose OS -> Ubuntu -> Ubuntu Desktop 21.10 64-bitを選択
  • CHOOSE STORAGE -> 接続したSDカードを選択

Ubuntuの初期設定

本節のみRaspberry Piにディスプレイ、有線マウス、有線キーボードを繋いで直接操作する
(他の節の作業は別端末から)

  • Raspberry Piにディスプレイ、有線マウス、有線キーボードを繋いで電源を接続
  • Ubuntuの初期設定(言語、キーボードレイアウト、Wifi接続、ユーザー作成)
  • ターミナルを開いて、下記のコマンドを実行
    $ sudo apt update & sudo apt -y upgrade
    $ sudo apt install openssh-server
  • opensshの動作確認
    $ sudo systemctl status ssh
    ssh.service - OpenBSD Secure Shell server
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
    Active: active (running) since Fri 2021-12-17 15:23:57 JST; 18min ago
      Docs: man:sshd(8)
        man:sshd_config(5)
    Process: 788 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
    Main PID: 807 (sshd)
      Tasks: 1 (limit: 8895)
    Memory: 4.0M
        CPU: 196ms
    CGroup: /system.slice/ssh.service
            └─807 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
  • IPアドレスの確認
    $ ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
        link/ether e4:5f:01:71:c7:34 brd ff:ff:ff:ff:ff:ff
    3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether e4:5f:01:71:c7:35 brd ff:ff:ff:ff:ff:ff
        inet 192.168.11.5/24 brd 192.168.11.255 scope global dynamic noprefixroute wlan0
           valid_lft 171693sec preferred_lft 171693sec
        inet6 fe80::a407:d150:b9a1:38f4/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever

この後、固定IPを割り当てれば、電源を切っても確実にRaspberry Piに繋げられるが方法は調査中

sshでRaspberry Piに接続

  • 別のPCのターミナルから下記のコマンドでssh接続
    % ssh ubuntu@192.168.11.5
  • パスワードを入力してログイン完了
    ubuntu@192.168.11.5's password: 

これ以降、別PCからターミナルでsshに繋いだ状態でRaspberry PiのUbuntu上で作業する

Dockerインストール

  • 公式サイトの手順通りに下記のコマンドを実行していく
    $ sudo apt-get update
    $ sudo apt-get install -y ca-certificates curl gnupg lsb-release
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    $ echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    $ sudo apt-get update
    $ sudo apt-get install -y docker-ce docker-ce-cli containerd.io

Dockerイメージ作成

  • 作業ディレクトリ作成して移動
    $ pwd
    /home/ubuntu
    $ mkdir docker

    $ cd docker
  • Dockerfileを作成する
    $ touch Dockerfile
  • 下記の内容を書き込み(nanoで開くなら、$ nano Dockerfile
FROM resin/rpi-raspbian:stretch

RUN echo "deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi firmware" > /etc/apt/sources.list

RUN apt-get update -y
RUN apt-get install -y --no-install-recommends \
        vim git less wget \
        build-essential \
        libatlas-base-dev \
        python3-pip python3-dev python3-setuptools\
        python3-scipy python3-h5py \
        libraspberrypi-bin \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN pip3 install --upgrade pip setuptools
RUN pip3 install rpi.gpio
  • ビルドする
    $ sudo docker build -t rpi/rpi:0.1 .
    • ビルド時、下記のWarningが出た。ベースのイメージを変えた方がよさそう(? 要調査)。
      __      ___   ___ _  _ ___ _  _  ___ 
      \ \    / /_\ | _ \ \| |_ _| \| |/ __|
        \ \/\/ / _ \|   / .` || || .` | (_ |
         \_/\_/_/ \_\_|_\_|\_|___|_|\_|\___|
      ======================================
      resin base images have been deprecated
      in favour of the new balenalib images,
      read more about it in our docs:

      https://www.balena.io/docs/reference/base-images/base-images/
      ======================================
    • Python3.5に関する下記のWarningも出たのでPythonのバージョンも上げたい
      DEPRECATION: Python 3.5 reached the end of its life on September 13th, 2020. Please upgrade your Python as Python 3.5 is no longer maintained. pip 21.0 will drop support for Python 3.5 in January 2021. pip 21.0 will remove support for this functionality.
  • imagesを確認
    $ sudo docker images
    REPOSITORY           TAG       IMAGE ID       CREATED             SIZE
    rpi/rpi              0.1       4d88efe98f33   1 hours ago         596MB
    resin/rpi-raspbian   stretch   524f39464d9c   2 years ago         139MB

Dockerコンテナの起動・イメージの

  • コンテナを起動(下記のコマンドでrootユーザーとしてコンテナ内部に入れる)
    $ docker run --name rpi_test -ti --privileged rpi/rpi:0.1 /bin/bash
    root@0258b2187f09:/#
  • エディターをインストール、作業ファイルに移動して.pyファイルを作成
    # apt update
    # apt install nano
    # mkdir /home/ws

    # cd /home/ws
    # nano test.py
  • 下記の内容を書き込み(GPIO 17でLEDを光らせるコード)、保存
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
while True:
    GPIO.output(17, True)
    time.sleep(1)
    GPIO.output(17, False)
    time.sleep(1)
  • 回路を確認(次節)し、test.pyを実行
    # python3 test.py
  • LEDが点滅することを確認

今回使った回路

(Raspberry Pi GPIO 17) — (足長 LED 足短) — (抵抗 1kΩ) — (Raspberry Pi Ground)

関連記事

参考にしたサイト