Raspberry piでDCモータやLEDをオン・オフする

#はじめに
この記事は、[JAWS-UG関西IoT専門支部 ✕ 関西おうちハック「夏休み自由研究お助けIoTハンズオン 親子もお1人様も大歓迎！」](https://jawsugosaka.doorkeeper.jp/events/48313)のハンズオン用資料です。

#[1]Raspberry Piに電子工作部品を接続
##[1.1]部品リスト

1. ブレッドボード（BB−801タイプを推奨）
1. LEDの灯り
 2. [1]LED（赤色 or 青色）
 2. [2]滅光キャップ
 2. [3]抵抗(100Ω)
 2. [4]ピンポン玉
 2. 紙コップ
 2. [5]オス・メス ジャンパーケーブル 2本
1. 扇風機
 2. [6]モータードライバ TA7291
 2. [7]DCモーター
 2. [8]ファン（扇風機の羽根） 
 2. ボール紙
 2. [5]オス・メス ジャンパーケーブル 2本
1. [5]オス・メス ジャンパーケーブル 6本

![PICture.jpg](https://qiita-image-store.s3.amazonaws.com/0/4092/6f2d4445-3a5a-abe0-66a1-595cfb02a39a.jpeg "PICture.jpg")

## [1.2]LEDの灯りを作る
LEDに滅光キャップをつけてピンポン球をかぶせるとぼんやりとしたイイ感じの灯りになります。紙コップを台にして作ってみましょう。

[1.2.1]まず、抵抗(100Ω)の片方を電線を1cm残して切ります。LEDに滅光キャップを取り付けておきます。
![Kobito.Lbvh85.png](https://qiita-image-store.s3.amazonaws.com/0/4092/1ff43642-0945-9f8d-37df-b77570bf93e9.png "Kobito.Lbvh85.png")
残った電線は、ブレッドボード上のジャンパー線に使います。
![Kobito.8VWc20.png](https://qiita-image-store.s3.amazonaws.com/0/4092/70418e54-c0d9-caa2-8c51-3ed675895f10.png "Kobito.8VWc20.png")

[1.2.2]ピンポン玉の穴にLEDを差し込み、LEDの長い方の足（アノード側）に抵抗を巻きつけます。抵抗も長い足の方を巻きつける方に使います。
残った電線は、曲げてジャンパー用に置いておきます。
![Kobito.IkEr7y.png](https://qiita-image-store.s3.amazonaws.com/0/4092/f0e0f907-8314-d1ea-7b5a-f263b2685065.png "Kobito.IkEr7y.png")
[1.2.3]メス・オスのジャンパーケーブルをLEDの足の短い方に差し込みます（画像では上側）。その際セロハンテープで固定します。
LEDの足の長い方にもメス・オスのジャンパーケーブルを差し込みます（画像では下側）。こちらもセロハンテープで固定しますが、LEDの長い足に巻きつけた抵抗のリード線部分にも絶縁と固定のためセロハンテープを巻いておきます。
![Kobito.zymmrM.png](https://qiita-image-store.s3.amazonaws.com/0/4092/8384b73b-73eb-d159-98e5-6513fd6b020f.png "Kobito.zymmrM.png")
[1.2.4]紙コップの底をカッターなどで切り目を入れます。
![Kobito.xhfv3r.png](https://qiita-image-store.s3.amazonaws.com/0/4092/83d4a41c-6a1b-9e5e-1641-f6579be50fb6.png "Kobito.xhfv3r.png")
[1.2.5]切れ目からケーブルを差し込んで、灯りの完成です。
![PICture2.jpg](https://qiita-image-store.s3.amazonaws.com/0/4092/dcec1ee9-d8f8-7214-5101-9be595928060.jpeg "PICture2.jpg")

## [1.3]ミニ扇風機を作る
[1.3.1]ミニ扇風機に必要なモーター、オス・メスケーブル2本、ファンを用意します。
![IMG_00001.jpg](https://qiita-image-store.s3.amazonaws.com/0/4092/01b52b62-c3c9-d057-e0ce-152a25c00657.jpeg "IMG_00001.jpg")
[1.3.2]DCモータのケーブルをオス・メスケーブルに差し込んで、セロハンテープでとめてください。
![IMG_00003.jpg](https://qiita-image-store.s3.amazonaws.com/0/4092/bdeabfd7-d721-d2c7-fc4e-e01f464dde1f.jpeg "IMG_00003.jpg")
[1.3.3]土台の穴にモーターの軸を差し込んでファンを取り付けます。
![IMG_00004.jpg](https://qiita-image-store.s3.amazonaws.com/0/4092/4a3fe16a-a9f3-4e77-0644-43d29d5f5321.jpeg "IMG_00004.jpg")
[1.3.3]フード部分を取り付けて完成です。
![PICture3.jpg](https://qiita-image-store.s3.amazonaws.com/0/4092/24515064-fadf-ae5c-323f-013279f27f13.jpeg "PICture3.jpg")


##[1.2]配線図および配線リスト
Half+サイズのブレッドボード（BB−801またはEIC-801タイプなど）では行に番号・列にアルファベットのプリントがあるため、接続するホール（穴）を指定できます。以下に配線のリストを示します。
![ブレッドボード](http://akizukidenshi.com/img/goods/2/P-00315.JPG)
実体配線図
![Kobito.mFSd5O.png](https://qiita-image-store.s3.amazonaws.com/0/4092/94eb4278-04b2-4532-a00f-b0bc166b46e4.png "Kobito.mFSd5O.png")



1. ブレッドボード側
 2. モータードライバ TA7291の1番〜10番ピンをe4〜e13へ差し込む
 2. オス・オス ジャンパーを(-)からa4に接続
 2. オス・オス ジャンパーを(+)からa10に接続
 2. DCモーターの黒ワイヤ側をb5（かb13）へ
 2. DCモーターの赤ワイヤ側をb13（かb5）へ
	 * DCモーターは逆につけると逆回転します。取り付けるファンで風が前に吹くように後からb5とb13への接続を繋ぎかえて変更できます。 
 2. オス・オス ジャンパーケーブルをb10とb11へ
	 * 抵抗の端子の切れ端をジャンパーに使います。
 2. LEDのアノード側（ピンが長い方）をc1へ
 2. LEDのカソード側（ピンが短い方）を(-)へ
1. ラズパイとブレッドボード間の接続
 2. （赤色の）ジャンパーコードでラズパイの1番ピンと(+)を接続
 2. （黒色の）ジャンパーコードでラズパイの9番ピンと(-)を接続
 2. ジャンパーコードでラズパイの11番ピンとa1を接続
 2. ジャンパーコードでラズパイの12番ピンとa7を接続
 2. ジャンパーコードでラズパイの13番ピンとa8を接続
 2. ジャンパーコードでラズパイの15番ピンとa9を接続 

#[2]PythonプログラムでLEDとモータの動作確認
##[2.1]LEDの点滅（Lチカ）を確認

Raspberry Piに接続したコンソール（SSH接続が望ましい）で、Python 2.7サンプルソース `blink.py`をviなどで作成してください。

```python:blink.py
# coding: utf-8
# GPIOとtimeライブラリをインポート
import RPi.GPIO as GPIO, time

# ピン番号の割り当て方式を「コネクタのピン番号」に設定
GPIO.setmode(GPIO.BOARD)

# 使用するピン番号を代入
LED = 11
# 11 番ピンを出力ピンに設定し、初期出力をローレベルにする
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

try:
    # 無限ループ
    while 1:
        # ハイレベルを出力
        GPIO.output(LED, GPIO.HIGH)
        # 0.5 秒待つ
        time.sleep(0.5)

        # ローレベルを出力
        GPIO.output(LED, GPIO.LOW)
        time.sleep(0.5)

# キーボード例外を検出
except KeyboardInterrupt:
    # 何も処理しない
    pass

# GPIO を解放
GPIO.cleanup()
```

作成したら、以下のコマンドで実行します。現行のRasbianのバージョンではPython 2.7でRPi.GPIOパッケージを使う場合sudoコマンドが不要です。

```bash
python blink.py
```

0.5秒おきにLEDが点滅すれば正常に動作されています。動作を確認したらCtrl+Cキーでブレイクしてください。
点滅しない場合、LEDまわりの配線を見直してください。プラスとマイナスの極性が逆になっている場合が大半です。

##[2.2] モーターの回転を確認
次にDCモーターを正方向に回転させるPython 2.7サンプルソース `motor01.py`をviなどで作成してください。

```python:motor01.py
# coding: utf-8

# GPIOおよびtimeライブラリをインポート
import RPi.GPIO as GPIO, time

# ピン番号の割り当て方式を「コネクタのピン番号」に設定
GPIO.setmode(GPIO.BOARD)

# 使用するピン番号を代入
PWMA = 12
AIN1 = 13
AIN2 = 15

# デューティ比を変化させるステップを定義
c_step = 10

# 各ピンを出力ピンに設定
GPIO.setup(AIN1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(AIN2, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(PWMA, GPIO.OUT, initial=GPIO.LOW)

# PWM オブジェクトのインスタンスを作成
# 出力ピン：12 番、周波数：100Hz
p = GPIO.PWM(PWMA, 100)

# PWM信号を出力
p.start(0)

#モータを前進方向へ回転する関数
def forwardMotor(val):
	GPIO.output(AIN1, GPIO.HIGH)
	GPIO.output(AIN2, GPIO.LOW)
	p.ChangeDutyCycle(val)
#モータを反転方向へ回転する関数
def reverseMotor(val):
	GPIO.output(AIN1, GPIO.LOW)
	GPIO.output(AIN2, GPIO.HIGH)
	p.ChangeDutyCycle(val)
#モータを停止する関数
def stopMotor():
    GPIO.output(AIN1, GPIO.LOW)
    GPIO.output(AIN2, GPIO.LOW)
#モータをブレーキかけて停止する関数
def breakMotor():
    GPIO.output(AIN1, GPIO.HIGH)
    GPIO.output(AIN2, GPIO.HIGH)

#正転する
forwardMotor(100)
#逆転する
#reverseMotor(100)
try:
    # 無限ループ
    while 1:
		time.sleep(2)
# キーボード例外を検出
except KeyboardInterrupt:
    # 何も処理しない
    pass

# PWM を停止
p.stop()

# GPIO を解放
GPIO.cleanup()
```

作成したら、以下のコマンドで実行します。

```bash
python motor01.py
```

DCモーターが（正方向に）回転すれば正常に動作されています。動作を確認したらCtrl+Cキーでブレイクしてください。
DCモーターにファンを取り付けて、回転させて風の向きを確認しましょう。もし風が前方向に出てこない場合、DCモータの接続を入れ替えて逆転させます。