112
Help us understand the problem. What are the problem?

posted at

updated at

Organization

電子工作ファン向けのRaspberry Pi・セットアップ(Ubuntu 20.04LTS編)

はじめに

電子工作作品の制御によく使っているラズパイですが、似たような実験環境を頻繁に作っているので、設定内容やダウンロード先など、いつも繰り返し作業している、基本的な手順をまとめました。

この記事では、Raspberry Pi 3 B+の使用を前提にインストールを進めています。

本記事は、myasuの過去の記事の内容をベースに、Ubuntu 20.04環境に合わせた内容に直しています。

1. Ubuntu 20.04 のインストール

ダウンロード先

こちらのリンク先のページから、ディスクイメージをダウンロードします。
image.png

ディスクイメージの書き込み

Ubuntu公式さんの手順書、あるいは、こちらの記事の手順を参照してください。
(RaspberryPi公式のイメージライターでも、Ubuntuのisoイメージを指定することで書き込みが出来ます)

2.インストール後の基本設定

今のところraspi-configコマンドはありませんので、Ubuntu Linuxの定石に従って各種設定を進めます。

シリアルコンソールは、デフォルトで有効になっています。
ネットワーク環境やディスプレイがなくても、RaspberryPiのTX/RXピン経由でシリアル通信が出来るので、一つ持っておくと便利です。

初回起動のときの出力の様子

シリアルコンソール
MMC:   mmc@7e202000: 0, mmcnr@7e300000: 1
Loading Environment from FAT... *** Warning - bad CRC, using default environment

In:    serial
Out:   vidconsole
Err:   vidconsole
Net:   No ethernet found.
starting USB...
Bus usb@7e980000: scanning bus usb@7e980000 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
## Info: input data size = 6 = 0x6
Hit any key to stop autoboot:  0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
・・・(省略)・・・
Ubuntu 20.04 LTS ubuntu ttyS0

ubuntu login:

初回ログインの時にパスワードの変更を要求されます。

デフォルト
ユーザ名 ubuntu
パスワード ubuntu
シリアルコンソール
Ubuntu 20.04 LTS ubuntu ttyS0

ubuntu login: ubuntu
Password:
You are required to change your password immediately (administrator enforced)
Changing password for ubuntu.
Current password:
New password:
Retype new password:

パスワードを設定し直すと、そのままログインします。

シリアルコンソール
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-1008-raspi aarch64)
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
  System information as of Sat Apr 25 01:25:10 UTC 2020
  System load:  0.33               Temperature:           41.9 C
  Usage of /:   12.8% of 14.29GB   Processes:             127
  Memory usage: 26%                Users logged in:       0
  Swap usage:   0%                 IPv4 address for eth0: 192.168.0.6
 * Ubuntu 20.04 LTS is out, raising the bar on performance, security,
   and optimisation for Intel, AMD, Nvidia, ARM64 and Z15 as well as
   AWS, Azure and Google Cloud.
     https://ubuntu.com/blog/ubuntu-20-04-lts-arrives
0 updates can be installed immediately.
0 of these updates are security updates.

Last login: Sat Apr 25 01:20:08 UTC 2020 on ttyS0
ubuntu@ubuntu:~$
シリアルコンソール
#アップデート
ubuntu@ubuntu:~$ sudo apt update && sudo apt upgrade -y

#ホスト名の変更
#「raspi3u」の所を好きに変えてください。
ubuntu@ubuntu:~$ hostnamectl set-hostname raspi3u 
ubuntu@ubuntu:~$ hostname
raspi3u
ubuntu@ubuntu:~$ sudo reboot

#タイムゾーンの設定
ubuntu@raspi3u:~$ timedatectl list-timezones | grep -i tokyo
Asia/Tokyo
ubuntu@raspi3u:~$ sudo timedatectl set-timezone Asia/Tokyo
ubuntu@raspi3u:~$ date
Tue Apr 25 22:20:02 JST 2020
# ↑ここで、日本時間になっていればOK

<注意>
インストール直後、ネットワークに繋がっていると、自動的にアップデートが始まっています。アップデート中は、sudo apt updateを実行するとエラーがでますので、そのまま放置してください。

ホームディレクトリの各ディレクトリ名を英語表記に変更

インストーラでインストールする際に、途中の言語設定で''英語''を選ばなかった場合、
ホームディレクトリに自動的に作られるディレクトリ名が日本語文字になっています。

cdコマンドなどを使うときに日本語入力しづらいことがあるので、ディレクトリ名を英語表記に変えるコマンドを実行しておきます。

デスクトップ(X)でログインしているときに、下記を実行します。

コマンドライン
$ LANG=C xdg-user-dirs-gtk-update

ダイアログが開いたら、下記の操作をします。

  • Don't ask me this again にチェックを入れる
  • Update Namesボタンをクリック

これで、ディレクトリ名が英語表記になります。

3.ハードウェア制御に必要なパッケージのインストール

Raspbianと概ね同じです。1

(1)I2C

コマンドライン
#インストール
ubuntu@ubuntu:~$ sudo apt install i2c-tools -y
ubuntu@ubuntu:~$ sudo apt install python3-smbus -y
#自分をi2cグループに追加
ubuntu@ubuntu:~$ sudo adduser ubuntu i2c
#動作確認
ubuntu@raspi3u:~$ i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

上記の例では下記を接続しています。

アドレス 接続しているもの 製品例 活用例
0x20 IOエキスパンダ MCP23017 まだ
0x68 リアルタイムクロック DS1307+ 記事

(2)GPIO

①WiringPi

ついに!普通にGPIOが使える様になりました!!
過去の苦労^^;)

コマンドライン
$ sudo apt install wiringpi

そのままではparmisson errorが出るので、/dev/gpiomemへの書き込み権限を、一般ユーザ(ここではubuntu)に付与します。2
次の配布イメージでは、デフォルトでこうなっていると良いなぁ・・・

コマンドライン
#グループを作る
ubuntu@ubuntu:~$ sudo adduser ubuntu gpio
Adding user `ubuntu' to group `gpio' ...
Adding user ubuntu to group gpio
Done.
#今時点のパーミッションを確認
ubuntu@ubuntu:~$ ls -l /dev/gpiomem
crw------- 1 root root 240, 0 Apr  2 02:23 /dev/gpiomem
#パーミッション変更
ubuntu@ubuntu:~$ sudo chown root.gpio /dev/gpiomem
ubuntu@ubuntu:~$ sudo chmod g+rw /dev/gpiomem
#変更後のパーミッションを確認
ubuntu@ubuntu:~$ ls -l /dev/gpiomem
crw-rw---- 1 root gpio 240, 0 Apr  2 02:23 /dev/gpiomem

ubuntu@ubuntu:~$ 

groupの変更を自分のユーザに反映するため、一旦ログアウトして、ログインし直します。

コマンドライン
ubuntu@ubuntu:~$ exit
logout

Ubuntu 20.04 LTS ubuntu ttyS0

ubuntu login: ubuntu
Password:

ubuntu@ubuntu:~$ gpio readall
 +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
 | 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  | 0 | ALT5 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT5 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 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 | 0 | 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 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | 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 3B+-+---+------+---------+-----+-----+

出力テストをしてみます。

~ $ gpio -g mode 6 out ; gpio -g mode 13 out ; gpio -g mode 19 out ; gpio -g mode 26 out
~ $ gpio -g write 6 1 ; gpio -g write 13 1 ; gpio -g write 19 1 ; gpio -g write 26 1
~ $ gpio -g write 6 0 ; gpio -g write 13 0 ; gpio -g write 19 0 ; gpio -g write 26 0

こんな感じで点灯します。(動画で使っているLED点灯の自作評価ボード

a_320x240_fps15.gif

Raspberry Pi 4での注意

20/4/28時点では、まだRaspberry Pi 4では試してないですが、
aptでインストールされるWiringPiは、Ver.2.50なので、Raspberry Pi 4では正常に動かない可能性があります。
その場合は、wiringpi作者さんが公開している修正パッケージをインストールしてみてください。私の方でも導入記事を書いてます。

②Grove.py

IoT機器の試作によく使われるGROVEシステムを、RaspberryPiから簡単に繋ぐライブラリです。ここではRaspberryPi用のインターフェース・ボードとしてこちらを使ってます。

コマンドライン
# pip入ってないので、忘れずインストール
ubuntu@ubuntu:~/gitwork$ sudo apt install python3-pip
# git cloneしてから、pipインストール
ubuntu@ubuntu:~/gitwork$ git clone https://github.com/Seeed-Studio/grove.py
ubuntu@ubuntu:~/gitwork$ cd grove.py
ubuntu@ubuntu:~/gitwork/grove.py$ pip3 install .
Processing /home/ubuntu/gitwork/grove.py
Requirement already satisfied: RPi.GPIO in /usr/lib/python3/dist-packages (from grove.py==0.6) (0.6.5)
Collecting rpi_ws281x
  Downloading rpi_ws281x-4.2.3.tar.gz (66 kB)
     |████████████████████████████████| 66 kB 754 kB/s 
Collecting smbus2
  Downloading smbus2-0.3.0.tar.gz (10 kB)
Building wheels for collected packages: grove.py, rpi-ws281x, smbus2
  Building wheel for grove.py (setup.py) ... done

・・・(省略)・・・

  Stored in directory: /home/ubuntu/.cache/pip/wheels/76/7b/65/59d3af1a2540ad19754fb47b85e3a0ef9dffe1e2b115a53123
Successfully built grove.py rpi-ws281x smbus2
Installing collected packages: rpi-ws281x, smbus2, grove.py
  WARNING: The scripts grove_12_key_cap_i2c_touch_mpr121, grove_16x2_lcd, grove_1wire_thermocouple_amplifier_max31850, grove_3_axis_accelerometer_adxl372, 

・・・(省略)・・・

grove_uv_sensor, grove_water_sensor and grove_ws2813_rgb_led_strip are installed in '/home/ubuntu/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed grove.py-0.6 rpi-ws281x-4.2.3 smbus2-0.3.0

ワーニングが出ているとおり、あとでパスを通してください。

③pigpio

(20/4/28時点では、まだ試せてないです)

④Python3関連の制御パッケージ

コマンドライン
ubuntu@ubuntu:~$ sudo apt install python3-rpi.gpio python3-serial -y
Lチカ(LED点滅)確認用
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

def main():
    """メイン関数
    """
    # LEDを光らせるピン番号を指定
    PIN = 26
    # BCM端子番号指定を選択
    GPIO.setmode(GPIO.BCM)
    # PIN番号を出力で初期化
    GPIO.setup(PIN, GPIO.OUT)

    # 5回点滅します
    for _ in range(5):
        # 点灯
        GPIO.output(PIN, True)
        time.sleep(0.2)
        # 消灯
        GPIO.output(PIN, False)
        time.sleep(0.2)

    #後始末
    GPIO.cleanup()

if __name__ == '__main__':
    main()

3.その他の環境整備

(1)NTP

設定の前に、設定ファイルをバックアップ。

コマンドライン
ubuntu@raspi3u:~$ cd /etc/systemd/
ubuntu@raspi3u:/etc/systemd$ sudo cp -p timesyncd.conf timesyncd.conf.org
ubuntu@raspi3u:/etc/systemd$ sudo nano timesyncd.conf
ubuntu@raspi3u:/etc/systemd$ cat timesyncd.conf

timesyncd.confの設定

Raspbianと同じです。2

timesyncd.conf
[Time]
NTP=ntp.nict.jp
FallbackNTP=ntp.jst.mfeed.ad.jp ntp.ring.gr.jp ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

設定変更を反映する前の状態を確認します。

コマンドライン
#systemd-timesyncdデーモンの状態確認
ubuntu@raspi3u:/etc/systemd$ systemctl status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-04-27 06:09:28 JST; 1 day 16h ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 1123 (systemd-timesyn)
     Status: "Initial synchronization to time server 91.189.89.198:123 (ntp.ubuntu.com)."
      Tasks: 2 (limit: 1039)
     CGroup: /system.slice/systemd-timesyncd.service
             └─1123 /lib/systemd/systemd-timesyncd

Apr 02 02:23:48 ubuntu systemd[1]: Starting Network Time Synchronization...
Apr 02 02:23:49 ubuntu systemd-timesyncd[1123]: System clock time unset or jumped backwards, restoring from recorded timestamp: Mon >
Apr 27 06:09:28 ubuntu systemd[1]: Started Network Time Synchronization.
Apr 27 06:09:33 ubuntu systemd-timesyncd[1123]: Network configuration changed, trying to establish connection.
Apr 27 06:09:34 ubuntu systemd-timesyncd[1123]: Network configuration changed, trying to establish connection.
Apr 28 22:19:23 ubuntu systemd-timesyncd[1123]: Initial synchronization to time server 91.189.89.198:123 (ntp.ubuntu.com).

設定変更を反映します。

コマンドライン
#systemdデーモン設定の再読込
ubuntu@raspi3u:/etc/systemd$ sudo systemctl daemon-reload
#systemd-timesyncdデーモンを再起動
ubuntu@raspi3u:/etc/systemd$ sudo systemctl restart systemd-timesyncd
ubuntu@raspi3u:/etc/systemd$ systemctl status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-04-28 22:21:25 JST; 5s ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 2283 (systemd-timesyn)
     Status: "Initial synchronization to time server 133.243.238.244:123 (ntp.nict.jp)."
      Tasks: 2 (limit: 1039)
     CGroup: /system.slice/systemd-timesyncd.service
             └─2283 /lib/systemd/systemd-timesyncd

Apr 28 22:21:24 ubuntu systemd[1]: Starting Network Time Synchronization...
Apr 28 22:21:25 ubuntu systemd[1]: Started Network Time Synchronization.
Apr 28 22:21:25 ubuntu systemd-timesyncd[2283]: Initial synchronization to time server 133.243.238.244:123 (ntp.nict.jp).

(2)Samba

インストール

コマンドライン
ubuntu@raspi3u:$ sudo apt install samba -y
ubuntu@raspi3u:$ cd /etc/samba
ubuntu@raspi3u:/etc/samba $ sudo cp -p smb.conf smb.conf.org
ubuntu@raspi3u:/etc/samba $ sudo nano smb.conf

smb.confの設定は、こちらを参考にしてください

注意
[homes]の行もコメントアウトされてる場合があるので、忘れずコメントアウトの#を消して下さい。

ユーザの作成

コマンドライン
ubuntu@raspi3u:/etc/samba$ sudo pdbedit -a ubuntu
new password:
retype new password:
Unix username:        ubuntu
NT username:
Account Flags:        [U          ]
User SID:             ****
Primary Group SID:    ****
Full Name:            Ubuntu
Home Directory:       \\ubuntu\ubuntu
HomeDir Drive:
Logon Script:
Profile Path:         \\ubuntu\ubuntu\profile
Domain:               UBUNTU
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          Thu, 07 Feb 2036 00:06:39 JST
Kickoff time:         Thu, 07 Feb 2036 00:06:39 JST
Password last set:    Mon, 30 Sep 2019 15:13:18 JST
Password can change:  Mon, 30 Sep 2019 15:13:18 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

設定変更を反映します。

コマンドライン
#systemdデーモン設定の再読込
ubuntu@raspi3u:/etc/systemd$ sudo systemctl daemon-reload
#sambaデーモンを再起動
ubuntu@raspi3u:/etc/systemd$ sudo systemctl restart smbd
ubuntu@raspi3u:/etc/systemd$ systemctl status smbd
● smbd.service - Samba SMB Daemon
   Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-10-01 08:53:52 JST; 9h ago
     Docs: man:smbd(8)
           man:samba(7)
           man:smb.conf(5)
 Main PID: 1538 (smbd)
   Status: "smbd: ready to serve connections..."
    Tasks: 5 (limit: 1056)
   CGroup: /system.slice/smbd.service
           ├─1538 /usr/sbin/smbd --foreground --no-process-group
           ├─1567 /usr/sbin/smbd --foreground --no-process-group
           ├─1568 /usr/sbin/smbd --foreground --no-process-group
           ├─1570 /usr/sbin/smbd --foreground --no-process-group
           └─4840 /usr/sbin/smbd --foreground --no-process-group

(3)Docker

そのままaptでインストールできます。
20年4月末時点での最新版が入ってきます。

コマンドライン
$ sudo apt install docker docker-compose -y
$ docker -v
Docker version 19.03.8, build afacb8b7f0

自分のユーザをdockerグループに追加します。
(ここでは、ユーザubuntu)

コマンドライン
$ sudo usermod -aG docker ubuntu

ひとまず、helloworldを立ち上げてみます。

コマンドライン
$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

・・・(省略)・・・

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

ここで試しに、ROS2のDockerイメージを立ち上げてみます。

Dockerを試してみた詳細は、「DockerコンテナからRaspberryPiのGPIOを使う」をご覧下さい。

コマンドライン
$ docker run --name ros2 -h ros2dk -v /home/pi/gitwork:/var/gitwork --device /dev/gpiomem  --device /dev/i2c-1 --privileged -e TZ=Asia/Tokyo -it ros:eloquent
root@ros2dk:/var/workdir#

# コンテナの中に入ったら、バージョン確認

root@ros2dk:/var/workdir# printenv ROS_DISTRO
eloquent

# ros2を動かしてみる

root@ros2dk:/var/workdir# ros2 
usage: ros2 [-h] Call `ros2 <command> -h` for more detailed usage. ...

ros2 is an extensible command-line tool for ROS 2.

optional arguments:
  -h, --help            show this help message and exit

・・・(省略)・・・

  Call `ros2 <command> -h` for more detailed usage.
root@ros2dk:/var/workdir# 

こんな感じで動きます・・・が、RaspberryPi3だとやはりROSが重いですね・・・

5.おわりに

Ubuntu公式さんからラズパイ向けUbuntuが出てから間もないですが、何はともあれGPIOがきちんと動く様になったのは本当に有り難いですね!
間もなくDockerやROSのほうもパッケージがリリースされるはずなので、Raspberry Piで思う存分、快適な作品づくり(特にROSの活用)を楽しみましょう!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
112
Help us understand the problem. What are the problem?