Raspberry Pi3でpigpioライブラリを使ってLチカする

この記事はSFC-RG Advent Calendar 2017の19日目です。
Raspberry Pi3でラズビアンやpigpioライブラリを入れて、Lチカ（LEDの点滅）する方法について書きました。
Pythonでやってます。
___

## GPIO楽しいよ
みんな大好きRaspberry Pi。ただの小型Linuxマシンとして使ってませんか(´・ω・｀)？
普通のPCと違ってRaspberry PiにはGPIO、すなわち「汎用入出力端子」があります。40個並んだピンヘッダがそれです。それを使うか使わないかはその人のやりたいこととの兼ね合いなので仕方のないことですが、全く使い方を知らないというのは非常にもったいないことだと思うのです。

シェル、その他にCやPythonなどで書いたのプログラムからLEDとかモーターとかトグルスイッチといった電子部品を制御したり逆に入力を受つけたりすることは普通できません。だって今のPCにLEDとか挿す端子ないし・・・USBにぶっ刺すのか(´・ω・｀)？まぁPC98とかだとできたらしいですが・・・
プログラムからこういった電子部品を動かすための端子がラズベリーパイには用意されています。それがGPIOです。ただ端子の電圧をHIGH(3.3V)にする、LOW(0V)にする。ただ端子の状態（電圧）がHIGHかLOWかを調べる。こういったレベルの超汎用的な入出力を行うことができます。
　

## raspbianをインストールする
[Raspbian](https://www.raspberrypi.org/downloads/raspbian/)のイメージファイルと、イメージファイルをSDカードに書き込むための[Etcher](https://etcher.io/)をダウンロードします。
Raspbian: [https://www.raspberrypi.org/downloads/raspbian/](https://www.raspberrypi.org/downloads/raspbian/)
Etcher: [https://etcher.io/](https://etcher.io/)

Etcherで、microSDカードにOSのイメージを書き込みます。
インストールイメージとインストール先のSDカードを選択し、「FLASH!」ボタンを押します。
![2017-12-19.png](https://qiita-image-store.s3.amazonaws.com/0/213714/efade7c3-ad97-0c05-0e92-59555df2662d.png)

## pigpioライブラリのインストール

ラズベリーパイのGPIOにアクセスするには、本来ならばCPUのレジスタの値を操作する必要があります。が、毎度毎度それを行うのはめんどくさいといいますか難しすぎるので、レジスタ操作をラッパーしてくれるライブラリがいろいろあります。
この記事ではその中でいくつかあるライブラリの中で、pigpioライブラリを使用します。
シェルからGPIOを叩けたり、PythonとCからGPIOを利用できるようになります。

pigpio: [http://abyz.me.uk/rpi/pigpio/](http://abyz.me.uk/rpi/pigpio/)

aptコマンドでインストールすることができます。

```shell:pigpioインストール

pi@raspberrypi:~ $ sudo apt install pigpio
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  pigpio
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 196 kB of archives.
After this operation, 1,297 kB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
  pigpio
Install these packages without verification? [y/N] y
Get:1 http://archive.raspberrypi.org/debian/ jessie/main pigpio armhf 1.60-1 [196 kB]
Fetched 196 kB in 2s (82.9 kB/s)                          
Selecting previously unselected package pigpio.
(Reading database ... 31969 files and directories currently installed.)
Preparing to unpack .../pigpio_1.60-1_armhf.deb ...
Unpacking pigpio (1.60-1) ...
Processing triggers for man-db (2.7.5-1~bpo8+1) ...
Setting up pigpio (1.60-1) ...

```
pigpioライブラリを使ってGPIOにアクセスするには、pigpiodを起動する必要があります。また、pigpiodは管理者権限で動作します。
以下のコマンドで実行できます。

```shell
pi@raspberrypi:~ $ sudo pigpiod
```

## Lチカ
Lチカ（LEDの点滅）は、マイコンボード界隈でのHello,Worldに相当するとよく言われます。
+ (ラズパイの場合3.3V)と -（0V）の間にLED（と保護抵抗）を繋げばLEDは点灯します。- と - の間にLEDを繋げばLEDは消灯します。
ラズベリーパイはGPIOの状態をHIGH（ラズベリーパイの状態は3.3V）にしたり、LOW(0V)にしたりすることができます。
ピンにLED（と保護抵抗）をつなぎ、一定間隔をおいてピンの状態をHIGHにしたりLOWにしたりすれば、Lチカをすることができます。

まず配線をします。ラズベリーパイのピン配置は以下の図のようになっています。
![physical-pin-numbers.png](https://qiita-image-store.s3.amazonaws.com/0/213714/c6a7e6fb-453e-804a-287d-48b91955d710.png)
出典: [https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md](https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md)
ラズパイ３もこの図と一緒です。

![pi3_gpio.png](https://qiita-image-store.s3.amazonaws.com/0/213714/ba262188-0c12-5769-e78e-226b4a51c70a.png)
画像を引っ張ってきた元のサイト(https://matome.naver.jp/odai/2146277598114754901)[https://matome.naver.jp/odai/2146277598114754901]
大元は多分ここだと思う
[https://www.element14.com/community/docs/DOC-73950/l/raspberry-pi-3-model-b-gpio-40-pin-block-pinout](https://www.element14.com/community/docs/DOC-73950/l/raspberry-pi-3-model-b-gpio-40-pin-block-pinout)


LEDはこんな感じで繋ぎます。
ピン12＝GPIO18をLEDの
ジャンプワイヤとブレッドボードを実際に使うときは使います。どっちも生協で売ってますので。
![gpio-led-pi2.png](https://qiita-image-store.s3.amazonaws.com/0/213714/378e1225-7ebe-1492-1eb8-3d95bc2a6f52.png)
出典: [https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md]

プログラムはこんな感じです

```python3
  1 #!/usr/bin/python3
  2 # -*- coding: utf-8 -*-
  3 
  4 import time
  5 import pigpio #pigpioライブラリをインポートする
  6 
  7 pi = pigpio.pi() #GPIOにアクセスするためのインスタンスを作成します
  8 pi.set_mode(18, pigpio.OUTPUT) #GPIOのモードを設定します他にINPUTとかある。18はGPIO18の18番です。
  9 
 10 while True:
 11     pi.write(18, 1) #GPIO18番のレベルをHIGHにします
 12     time.sleep(0.5)
 13     pi.write(18, 0) #GPIO18番のレベルをLOWにします
 14     time.sleep(0.5)
```

実行すると、LEDが0.5秒おきに明滅すると思います。
pigpiodを起動しておくのをお忘れなく。

![IMG_20171220_030012_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/213714/40bd81e0-7ce6-ff66-3a70-7796ed396818.jpeg)


## 最後に
　ここまで読んでくださり、ありがとうございましたm(_ _)m
　プログラムからGPIOが制御できるのは、最初の頃割りと不思議に感じていてあのですが、よく考えてみればそんなことはないです。CPUは電圧のHIGHとLOWかをの状態を利用して計算を行っているわけで、CPUの内部ピンいくつか外に出してくれば、CPU内部でほげほげ処理をした結果としてそのピンの電圧をHIGHにしたりLOWにしたり、そのピンの状態をCPUで使うことができる・・・という理解でぼくはいます。
　pigpioライブラリ結構高性能で、サーボモーターが回せたり、ピンの状態の変化を検知してコールバック関数を読んでくれたりします。他にもUARTやI2C、SPIといった数本のピンを用いて行う通信方式で他のデジタルなセンサ（温度計でも加速度計でもいろいろあります）などと通信を行ったりもできます。
　ぼく自身も全然使いこなせてないですが、ぜひGPIOの面白さを知ってもらえたらなと思います。


## 追記 pigpiodを自動起動する
```
sudo systemctl enable pigpiod
sudo reboot
```
参考: https://www.fabshop.jp/%E3%80%90-%E7%AC%AC31%E5%9B%9E-%E3%80%91pigpio%E3%81%A7%E3%82%82%E3%82%B5%E3%83%BC%E3%83%9C%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E3%83%95%E3%83%AB%E3%82%B9%E3%82%A4%E3%83%B3%E3%82%B0%EF%BC%81/