#はじめに
電子工作作品の制御によく使っているラズパイですが、似たような実験環境を頻繁に作っているので、設定内容やダウンロード先など、いつも繰り返し作業している、基本的な手順をまとめました。
この記事では、Raspberry Pi 3 B+
の使用を前提にインストールを進めています。
本記事は、myasuの過去の記事の内容をベースに、Ubuntu 20.04環境に合わせた内容に直しています。
#1. Ubuntu 20.04 のインストール
####ダウンロード先
こちらのリンク先のページから、ディスクイメージをダウンロードします。
####ディスクイメージの書き込み
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点灯の自作評価ボード)
Raspberry Pi 4での注意
20/4/28時点では、まだRaspberry Pi 4では試してないですが、
aptでインストールされるWiringPiは、Ver.2.50なので、Raspberry Pi 4では正常に動かない可能性があります。
その場合は、wiringpi作者さんが公開している修正パッケージをインストールしてみてください。私の方でも導入記事を書いてます。
②Grove.py
IoT機器の試作によく使われるGROVEシステムを、RaspberryPiから簡単に繋ぐライブラリです。ここではRaspberryPi用のインターフェース・ボードとしてこちらを使ってます。
- Grove Base Hat for Raspberry Pi
- https://www.switch-science.com/catalog/5336/
- http://akizukidenshi.com/catalog/g/gM-13879/
# 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
#!/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
[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の活用)を楽しみましょう!
-
https://qiita.com/myasu/items/a4e036a86976e3081a19#%EF%BC%95%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%88%B6%E5%BE%A1%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB ↩
-
https://raspberrypi.stackexchange.com/questions/40105/access-gpio-pins-without-root-no-access-to-dev-mem-try-running-as-root ↩ ↩2