Raspberry Pi の基本

# はじめに
久しぶりにRaspberry Piをインストールしたので、改めてセットアップの手順やRaspberry Piの基本的なことについてまとめました。

※本記事はRaspberry Pi 3 Model Bを対象としています。

## 最近のRaspberry Pi
2年前はイギリス製（RSコンポーネンツ）と中国製（element14）のみでしたが、現在は日本製のRaspberry Pi（RSコンポーネンツ）が主流のようです。ちなみに日本製のRaspberry Piは愛知県稲沢市のソニーの工場で作られています。

※Raspberry Piの産地における違いは、ブランドや中国製（element14）の場合、GPIOのヘッダピンが金色で少し価格が安いのが特徴だと思います。

![写真 2018-02-23 22 46 18.jpg](https://qiita-image-store.s3.amazonaws.com/0/221759/71abb0b3-1e1a-3a18-42a6-ad7af9f93b25.jpeg)


## Raspberry Piに必要な周辺機器
Raspberry Piの動作に必要な周辺機器は以下になります。なお、microSDカードはclas10以上で16GB以上がお勧めです。

[参考（SDメモリカードの違い）](http://www.toshiba-personalstorage.net/howto/sd/sd_memory_cards.htm)

**ハードウェア**

- [x] Raspberry Pi
- [x] microSDカード
- [x] カードリーダー
- [x] microUSBケーブル（Aタイプ、micro-B）
- [x] ACアダプタ　※Raspberry Pi 3 Model Bの場合は、2.5A推奨
- [x] キーボード（USB）
- [x] マウス（USB）
- [x] HDMIケーブル
- [x] Raspberry Piのケース
- [x] ディスプレイまたはテレビ（HDMI）

**ソフトウェア**

- [x] [SDメモリカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/)
- [x] [OS（NOOBS）](https://www.raspberrypi.org/downloads/noobs/)/[OS（イメージファイル）](https://downloads.raspberrypi.org/raspbian/images/) ※インストール方法に合わせてどちらかを用意

## OSインストール
Raspberry PiにOSをインストールする場合は、「NOOBS」と「イメージ」による2種類の方法があります。
本記事ではmacを使用して「Raspbian」の「イメージ」をインストールする手順を記載します。
なお、初めてインストールする方は「NOOBS」で行った方が安全です。

環境：mac + Raspberry Pi 3 Model B + NOOBS

### SDカードフォーマット
SDカードのフォーマット手順について記載します。

1. [SDメモリカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/)を起動する。
![スクリーンショット 2018-02-23 00.50.29.png](https://qiita-image-store.s3.amazonaws.com/0/221759/4173eed6-d274-0793-d955-9ff90ee9765e.png)

2. フォーマットオプションは「上書きフォーマット」を選択する。
![スクリーンショット 2018-02-12 09.04.48.png](https://qiita-image-store.s3.amazonaws.com/0/221759/684f5b15-44aa-7e18-57e3-fcb32b1a04dd.png)

3. 「オプション」をクリックし論理アドレス調整を「する」を選択してOKをクリックする。
![スクリーンショット 2018-02-12 09.06.41.png](https://qiita-image-store.s3.amazonaws.com/0/221759/0784eb24-ed4a-ce73-1594-653d74b4453f.png)

4. フォーマットをクリックする。フォーマットが正常に終了すると、正常に終了しましたのメッセージが出力される。
![スクリーンショット 2018-02-12 09.42.33.png](https://qiita-image-store.s3.amazonaws.com/0/221759/75052955-950b-38f1-ba27-903549dae6cc.png)

### イメージファイル書き込み 
イメージファイルの書き込み手順について記載します。

1. ターミナルを起動して「diskutil」コマンドを実行しSDカードの位置を特定する。※本記事の例では0番の右に表示されている「IDENTIFER」のディスク名をさす。
![スクリーンショット 2018-02-12 09.45.58.png](https://qiita-image-store.s3.amazonaws.com/0/221759/613a09d9-bea8-c651-676f-6b9836d2b0c5.png)

2. 「diskutil」コマンドを実行してアンマウントする。
![スクリーンショット 2018-02-12 09.48.06.png](https://qiita-image-store.s3.amazonaws.com/0/221759/d4fd1907-e962-e77f-788e-a523d22903a3.png)
3. 「dd」コマンドを実行してイメージファイルを書き込む。（※）このとき「of=」で指定する出力先に注意する
![スクリーンショット 2018-02-12 13.32.02.png](https://qiita-image-store.s3.amazonaws.com/0/221759/292f1cad-443c-2812-58d6-07154e947c57.png)

4. 書き込み終了後SDカードをRaspberry Piに入れて電源を投入する。正常に起動するとデスクトップ画面が表示される。
![スクリーンショット 2018-02-22 21.48.52.png](https://qiita-image-store.s3.amazonaws.com/0/221759/55001cae-b7a7-0d08-7f33-99c3dfa6d5b6.png)
※画面が正常に映らない場合はHDMIで接続した後にRaspberry Piを起動しているか確認してみてください。→Raspberry Pi起動時にディスプレイを認識しているため、Raspberry Piの起動後にHDMIを接続しても認識されません。

### NOOBS2.0
NOOBSはRaspbianのインストーラのことをさしますが、2016年9月にリリースされた「NOOBS2.0」よりいくつか変更されました。主な変更点を以下に記載します。なお、以前のリリースとバージョンの変更リストについては、[github](https：//github.com/raspberrypi/noobs/releases)をご覧ください。

- 日本語フォント
Noobs 2.0では、日本語が表示できるフォントがあらかじめ導入されています。よって、日本語フォントのインストールは基本的には不要です。

- デスクトップ環境は「LXDE」から「PIXEL」に変わりました。そのため、デスクトップ関連のデザインが大幅に変更されています。

- SSH無効
最新版RaspbianではSSHの自動起動設定は無効になっています。

- VNC
最新版Raspbianでは正統なVNCである[RealVNC](https://www.realvnc.com/)が最初からインストールされていますが、派生品である[TigerVNC](http://tigervnc.org/)がお勧めです。

### 初期設定
Raspberry Piの操作に最低限必要と思われる初期設定について以下に記載します。

- piユーザ及びrootのパスワード設定
- ロケール、タイムゾーン、キーボード配列の設定
- 無線LANアクセスポイントの設定、固定IPアドレスの設定
- パッケージ情報の取得  
`$ sudo apt-get update`
- 全てのパッケージのアップデート   
`$ sudo apt-get upgrade`
- vimのインストール    
`$ sudo apt-get install vim`
- SSHの自動起動有効       
`$ sudo systemctl enable ssh `
- SSHの自動起確認     
`$ systemctl list-unit-files --type=service | grep ssh`
- VNCサーバーのインストール    
`$ sudo apt-get install tightvncserver`
- VNCサーバーの起動。始めて起動すると、パスワードの入力が求められるのでパスワードを入力する。   
`$ tightvncserver :1 -geometry 1280x800 -depth 24`
- VNCサーバーを自動起動したい場合は、以下のファイルを配備して実行権限を付与する。

*/etc/init.d/tightvnc*

```bash
#! /bin/bash

### BEGIN INIT INFO
# Provides: tightvnc
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start VNC Server at boot time
# Description: Start VNC Server at boot time.
### END INIT INFO

# /etc/init.d/tightvnc

USER=pi
HOME=/home/pi

DISPNO=1       # Display No
WIDTH=1280     # Display geometry widht
HEIGHT=800     # Display geometry height
DEPTH=24       # Use color depth

OPTIONS=":${DISPNO} -geometry ${WIDTH}x${HEIGHT} -depth ${DEPTH}"

export USER HOME

case "$1" in
    start)
        echo "Starting TightVNC Server"
        #Insert your favoured settings for a TightVNC session
        su $USER -c "/usr/bin/tightvncserver ${OPTIONS}"
        ;;

    stop)
        echo "Stopping VNC Server"
        su $USER -c "/usr/bin/tightvncserver -kill :$DISPNO"
        ;;

    *)
        echo "Usage: /etc/init.d/tightvnc {start|stop}"
        exit 1
        ;;
esac

exit 0
```


- VNCサーバーの自動起動有効  　　   
`$ sudo update-rc.d tightvnc defaults`

### Raspberry Piの設定ファイル
Raspberry Piの起動に係わる設定ファイルは「/boot/config.txt」になります。ディスプレイの設定などで表示解像度や画面解像度等の設定を行うことができます。

例えば、画面周囲の黒い外枠で実際の画面より小さく表示される場合は、「#disable_overscan=1」のコメントをとれば枠を広げることができます。

*/boot/config.txt*


```bash
# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on
```
## GPIOとI2C
Raspberry Piででセンサなどの周辺機器を扱いたい場合は[GPIO](https://ja.wikipedia.org/wiki/GPIO)端子を利用します。また[I2C](https://ja.wikipedia.org/wiki/I2C)の端子としても利用できます。

（※）Raspberry PiではGPIOとI2Cは同じ端子となっていているため、混合しやすいですが、GPIOとI2Cはそれぞれ別の規格になります。


### PythonでGPIOを使用
PythonでGPIOを使用する場合は、GPIOのライブラリをインポートします。

```python
# GPIOライブラリのインポート
import RPi.GPIO as GPIO
# GPIOの初期化
GPIO.cleanup()
# Broadcomチップに準拠する場合
GPIO.setmode(GPIO.BCM)
# ボードの端子番号を利用
GPIO.setmode(GPIO.BOARD)
```
### I2Cの設定
Raspberry Pi 3 Model Bかつ、最新のRaspbianを使用する場合、I2Cについては必要なパッケージは最初から導入されているので「Raspberry Piの設定」で「インターフェイス」タブの「I2C」を有効にすることでI2Cを使用することができます。

### Raspberry Piのコマンド

- GPIOのバージョンを出力
`$ gpio -v`

- GPIOの情報を出力
`$ gpio readall`

```bash
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | 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 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | 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 |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | 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 3---+---+------+---------+-----+-----+
```
- I2Cデバイスのアドレスを確認 ※引数はI2Cデバイスのチャンネル番号を指定   
`$ sudo i2cdetect 1`

```bash
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --  
```

## 回路図
回路図作成は[Fritzing](http://fritzing.org/home/)がお勧めです。フリーソフトウェアで、グラフィカルにブレッドボードや回路図の作成ができます。また、回路図で使用できるパーツの自作も可能です。

![スクリーンショット 2018-02-22 22.00.28.png](https://qiita-image-store.s3.amazonaws.com/0/221759/ef496c03-17a2-1f2c-9f09-6b57f8defc41.png)

## 参考
- NOOBSのソースコードは[github](https://github.com/raspberrypi/noobs)で公開されています。