電子工作ファン向けのRaspberry Pi・セットアップ（Ubuntu 18.04LTS編）

#はじめに

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

***過去の記事[「電子工作ファン向けのRaspberry Pi・セットアップ（Raspbian編）」](https://qiita.com/myasu/items/a4e036a86976e3081a19) の内容をベースに、Raspbianと所々設定方法が異なるUbuntu18.04環境に合わせた内容に直しています。***


**注意**
GPIO周りでハマりどころがあるので、例えばどうしても18.04で「ROSを使いたい」縛りがなければ、19.10以降をお使いになる事をお勧めします・・・

##ここで想定するラズパイの使い方
- 手元のLAN環境に常時接続して、パソコン側からラズパイのssh/共有フォルダで開発
- ~~（極力）ヘッドレスで使う~~（Raspbianのような方法は分からず。その代わりシリアルコンソールが便利！）
- GPIO、I2C、SPIなどで、電子工作作品の制御をする
- [ROS2](https://index.ros.org/doc/ros2/)を使う（Ubuntuで公開のイメージは64bitなので！）

##概要
1. Ubuntu18.04のインストールと基本設定
1. NTP、sambaの設定
1. ハードウェア制御に必要なパッケージのインストール

#1. Ubuntu 18.04 のインストール

**注意**
本記事は、ubuntu-18.04.3をベースに書いてます。

##ダウンロード先

 - https://ubuntu.com/download/raspberry-pi 

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/edf0e2b5-1e75-587e-34ba-bd47d2a45f41.png)

2020/2/20: 新しいページが出来ていたので書き換え。
（旧：~~https://wiki.ubuntu.com/ARM/RaspberryPi~~　~~ARM64のところから、ディスクイメージをダウンロードします。~~）

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

[こちら](https://qiita.com/myasu/items/a4e036a86976e3081a19#%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF)の手順を参照してください。


#２．インストール後の基本設定

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

シリアルコンソールは、デフォルトで有効になっています。
ネットワーク環境やディスプレイがなくても、RaspberryPiのTX/RXピン経由でシリアル通信が出来ます。
（例：[秋月電子「ＵＳＢシリアル変換ケーブル（３．３Ｖ）」](http://akizukidenshi.com/catalog/g/gM-05840/)）


**■注意■**
イメージを書き込んだ直後の初回起動の時は、シリアルコンソールは通信できません。
（20年2月頃のイメージを使用した場合）
・・・と言うわけで、初回だけはヘッドレスでは立ち上げられません。
（sshは使えるので、ネットワーク経由で初期設定することは出来ます）



```shell:コマンドライン
#アップデート
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
Mon Sep 30 14:38:00 JST 2019
# ↑ここで、日本時間になっていればOK
```

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

#３．その他の環境整備

##（１）NTP

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

```sh:コマンドライン
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と同じです。[^1]

[^1]: https://qiita.com/myasu/items/a4e036a86976e3081a19#%EF%BC%93ntp%E3%81%AE%E8%A8%AD%E5%AE%9A

```conf: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
```

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

```sh:コマンドライン
#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; vendo
  Drop-In: /usr/lib/systemd/system/systemd-timesyncd.service.d
           mqdisable-with-time-daemon.conf
   Active: active (running) since Mon 2019-09-30 14:24:26 JST; 18min ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 2768 (systemd-timesyn)
   Status: "Synchronized to time server for the first time 91.189.89.199:123 (nt
    Tasks: 2 (limit: 1043)
   CGroup: /system.slice/systemd-timesyncd.service
           mq2768 /lib/systemd/systemd-timesyncd

Sep 30 14:24:24 ubuntu systemd[1]: Starting Network Time Synchronization...
Sep 30 14:24:26 ubuntu systemd[1]: Started Network Time Synchronization.
Sep 30 14:24:26 ubuntu systemd-timesyncd[2768]: Synchronized to time server for
```

設定変更を反映します。

```sh:コマンドライン
#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; vendo
  Drop-In: /usr/lib/systemd/system/systemd-timesyncd.service.d
           mqdisable-with-time-daemon.conf
   Active: active (running) since Mon 2019-09-30 14:43:52 JST; 3s ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 11918 (systemd-timesyn)
   Status: "Synchronized to time server for the first time 133.243.238.243:123 (
    Tasks: 2 (limit: 1043)
   CGroup: /system.slice/systemd-timesyncd.service
           mq11918 /lib/systemd/systemd-timesyncd

Sep 30 14:43:50 ubuntu systemd[1]: Starting Network Time Synchronization...
Sep 30 14:43:52 ubuntu systemd[1]: Started Network Time Synchronization.
Sep 30 14:43:52 ubuntu systemd-timesyncd[11918]: Synchronized to time server for
```

##（２）Samba

インストール

```sh:コマンドライン
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`の設定は、[こちら](https://qiita.com/myasu/items/a4e036a86976e3081a19#%EF%BC%94samba%E3%81%AE%E8%A8%AD%E5%AE%9A)を参考にしてください

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

ユーザの作成

```sh:コマンドライン
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
```


設定変更を反映します。

```sh:コマンドライン
#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
```


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

Raspbianと概ね同じです。[^2]

[^2]: 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

##（１）I2C

```sh:コマンドライン
#インストール
ubuntu@raspi3u:~$ sudo apt install i2c-tools -y
ubuntu@raspi3u:~$ sudo apt install python3-smbus -y
#自分をi2cグループに追加
ubuntu@raspi3u:~$ 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: -- -- -- -- -- -- -- --
```


##（２）GPIO

Raspbianと比べてハマリどころがあるので、インストール手順は、[こちら](https://qiita.com/myasu/items/e3f81b2826ed5797a040)を参照してください。

Ubuntu 19.10以降ではWiringPiパッケージが存在して、上記の問題他を解決するパッチが適用されています。「ROSを使いたい」という縛りがなければ、19.10以降をお使いになる事をお勧めします。

以下に、個別の考察を書きました。

### WiringPi

 - https://github.com/WiringPi

Raspbianと比べてハマリどころがあるので、インストール手順は、[こちら](https://qiita.com/myasu/items/e3f81b2826ed5797a040#1-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E7%89%88%E3%81%AEwiringpi)を参照してください。

### RPi.GPIO

エラーが出て動かない・・・。

### pigpio

 - http://abyz.me.uk/rpi/pigpio/index.html

不具合が１点。
GPIO入力の**アップ・ダウントリガだけは検出できる(callbackは取得できる)**が、**ON状態/OFF状態を読み取れない(pinの状態をreadするといつも"0")**
（GPIO出力は問題無いです）

この点の考察については、[こちら](https://qiita.com/myasu/items/e3f81b2826ed5797a040#%EF%BC%92gpio%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81)を参考ください。

```sh:コマンドライン
#unzipをインストール
~$ sudo apt install zip unzip -y

#ソースのダウンロードと展開
~$ mkdir gitwork
~$ cd gitwork
~/gitwork$ wget abyz.me.uk/rpi/pigpio/pigpio.zip
~/gitwork$ unzip pigpio.zip
~/gitwork$ cd PIGPIO/

#ビルド
~/gitwork$ make

#porgで簡易パッケージ管理でインストール
~/gitwork$ sudo porg -lp pigpio make install
~/gitwork$ porg -a
pigpio

#pigpiodデーモン起動
~/gitwork$ sudo pigpiod

```

起動時にデーモンとして自動起動する場合は、[こちら](https://l-w-i.net/t/raspbian/pigpio_001.txt)を参考に、systemdに登録してください。


## （３）ROS 2

これはあっさりと入ります。
インストール手順は、こちらの[Ubuntu LinuxでROS 2のインストール](https://gbiggs.github.io/rosjp_ros2_intro/computer_prep_linux.html)を参照してください。