【ラズパイ】水中ポンプ(DC 12V)を動かしてみた

# はじめに
ラズパイを使ってDC 12Vの水中ポンプを動かしてみた。

部品の選び方も含めて電子回路とコードを記事に残す。

動作環境
マイコン：RaspberryPi 4b
プログラミング言語：Python

# 水中ポンプについて
### 水中ポンプとは
水などの液体を移動させることができるポンプである。

使用用途は給水や汚水の排水などである。

使用時はポンプ本体を水中に沈める必要がある。

### 使用するポンプのスペック

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/bf45da0c-1806-9354-9bd9-d1cb4340ecd0.png" width="200">

品名：[LEDGLE 水中ポンプ DC 12V](https://www.amazon.co.jp/gp/product/B07D29YT2C/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&th=1)
動作電圧：DC 12V
消費電力：3.6W
流量：240L/H
大きさ：5.5 X 4 X 3.4 cm

水槽の水換えに使うため、小型でそこそこ流量のあるポンプを選択した。

# 動かしてみた
水中ポンプを動かすための電子回路とコードについて説明する。

## 電子回路
### 方針
今回使用する水中ポンプを動かすには12Vの電圧が必要である。

ラズパイのGPIOは3.3V出力のため、12Vの電圧で動作する水中ポンプを直接制御することはできない。

そこで、水中ポンプを動かすための電力は外部電源から取得し、
トランジスタでラズパイのGPIOから水中ポンプを制御することにした。

### 回路設計
部品の選び方を中心に回路について説明する。

#### 電子回路概要
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/408b81ac-1ec2-975e-8395-80ed96edfc92.png" width="300">

上図は外部電源をトランジスタで制御するための電子回路である。
[参考サイト](https://misoji-engineer.com/archives/raspberrypi-gpio.html)

この電子回路を以下の手順で完成させる。
(1)動かしたいものを決め、動作に必要な電圧と電流を決める。
(2)動作に必要な電圧と電流から外部電源を決める。
(3)動作に必要な電圧と電流から使用するトランジスタを決める。
(4)動作に必要な電流から抵抗を決める。

#### (1)動かしたいものの選定
今回は水中ポンプを動作させる。

動作に必要な電圧は12V
動作に必要な電流は0.3A
である。

また水中ポンプはDCモーターのため、トランジスタ保護のためにダイオードをつけた方がよいと思われる。
[参考サイト](https://misoji-engineer.com/archives/raspberrypi-gpio.html)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/7f45017b-131d-624a-28de-69f679a473ca.png" width="300">

#### (2)外部電源の選定
(1)で調べた動作に必要な電圧と電流から外部電源を選定した。
外部電源から12Vを供給する方法として以下の方法が考えられる。

・ACアダプタを使用してコンセントから電力を取得
・乾電池から電力を取得

乾電池を使用すると乾電池の管理を行う必要がある。
そのため、今回はACアダプタを使用することにした。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/05a7e18c-9c60-c776-3ec1-742f1128e1d4.jpeg" width="300">

[使用したACアダプタ](https://www.amazon.co.jp/gp/product/B0995FWR9S/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1)
スペック
入力電圧：AC 100V
出力電圧：DC 12V
出力電流：DC 1A

以下の基準からACアダプタを選定した。

外部電源ACアダプタの選定基準
　電圧：使用する電圧と同じもの
　電流：使用する電流よりも少し余裕を持たせたもの
[参考サイト](http://www.ops.dti.ne.jp/~ishijima/sei/letselec/letselec9.htm)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/a58599b2-d34f-9c16-e8b0-4982161e027e.jpeg" width="200">

[使用したDC電源ケーブル](https://www.amazon.co.jp/gp/product/B095XY4Z8Y/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&th=1)

DCプラグのままでは電子工作しにくいため、DC電源ケーブルも使用した。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/2b7322a1-ea0f-1f4a-8be2-eb47fb808ec2.png" width="300">

#### (3)トランジスタの選定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/ad962ae3-bc00-5294-006d-6374a6bf49c8.png" width="500">

[用語参照サイト](https://toshiba.semicon-storage.com/info/application_note_ja_20210127_AKX00005.pdf?did=63508)



まず、(1)で調べた動作に必要な電圧と電流からNPNトランジスタの要求スペックを洗い出した。

次に、[トランジスタ一覧サイト](https://eleshop.jp/shop/pages/search_tr.aspx)から必要スペックを満たすトランジスタを選定した。

今回は要求スペックに対して余裕のある2SD882を選定した。
[2SD882データシート](https://pdf1.alldatasheet.jp/datasheet-pdf/view/77279/NEC/2SD882.html)

#### (4)抵抗の選定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/3c96ae31-361f-0c7f-22d6-37b891d968b7.png" width="300">

(3)でも述べたように、GPIOからトランジスタのベースに流す電流を0.003Aにするため、抵抗1を0.1kΩに、抵抗2を1kΩに設定した。
また、GPIO保護のため、抵抗値を大きくした回路でも動作テストを行った。

#### 回路図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/afe18094-cbc4-9c60-8bf9-dbff296786fd.png" width="300">

(1)～(4)までで使用する部品が決まった。
これを基に回路図を作成した。

### 電子回路の作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/41e14538-0ed2-2771-ec65-969811d7797e.jpeg" width="300">

回路図を基にブレッドボードに電子回路を作成した。

## コード

"水中ポンプが1秒動作し、1秒停止する"動作を繰り返すコードをPythonで作成した。

```python
import RPi.GPIO as GPIO
import time

PumpSwitchGpio = 18             #トランジスタのベースに繋がるGPIO端子番号
PumpOperationTimes = 10         #ポンプを操作する回数
WaitTime = 1                    #ポンプのON/OFFを切り替える時間

#GPIOの設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(PumpSwitchGpio, GPIO.OUT)

#水中ポンプを操作する
for i in range(PumpOperationTimes):
    #水中ポンプを動かす
    GPIO.output(PumpSwitchGpio, True)
    time.sleep(WaitTime)
    #水中ポンプを停止する
    GPIO.output(PumpSwitchGpio, False)
    time.sleep(WaitTime)
    
#終了
GPIO.cleanup
```

## 動作テスト結果
https://twitter.com/hamadaira0412/status/1642380738610999299?s=20

コード通りに水中ポンプが動作していることが確認できた。
思っていたよりも水流が強かった。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300264/488cbc74-936b-947f-17d3-e391f2faaa2f.png" width="300">

また、抵抗値を変えて動作テストも行った。
パターン③まで動作した。
抵抗値が変わっても、目視ではあるが流量に変化は見られなかった。