物づくりの小部屋

個人で活躍するクリエーターになりたい現役エンジニアの行動記録

【ラズパイ】Raspberry Pi4でマブチモータを回して小型扇風機を作る

f:id:zaloha8:20210904141759j:plain

こんにちは。alohaです。

 

Raspberry Pi4のGPIOの使い方を勉強していて、LEDを光らせる方法は分かりました。でも、これだけだと小型信号機くらいしか作れないので、作れる物がかなり限定されてしまいます。

 

もう少しレベルアップして、モータを回せる様になると工作の幅が広がって、作れる物が増えそうです。

 

ただ、一口に『モータを回す』と言っても、モータの種類には、DCモータやステッピングモータ、サーボモータ等があり、回す方法もそれぞれ異なるので、モータの種類に合わせて回路と動作プログラムを変更する必要があります。

 

今回は、Raspberry Pi4でモータを回す最初の一歩として、模型用モータとしておなじみのマブチモータを回してみます。基本的でシンプルな回路なので、マブチモータを『回す/止める/速度調整する 』くらいしかできませんが、モータ駆動の基本を学ぶには丁度良い気がします。

 

単純にモータを回すだけだと面白くないので、モータのシャフトにファンを付けて小型扇風機を作ってみます。

 

 <部品一覧(Raspberry Pi4以外に必要な物)>

  • マブチモータ(RE-260RA-2670)    1個
  • ダイオード(1N4001)           1個
  • トランジスタ(2SC2655-Y)        1個
  • バッテリーボックス(3.0 V用)        1個
  • 抵抗(4.7 Ω, 220 Ω, 10 kΩ)         各1個
  • 配線用のワイヤ、ブレッドボード       適量
  • 模型用ファン                1個

f:id:zaloha8:20210904145811j:plain

 

<回路図>

Qt-BSch3Vで回路図を書くと下図の様になります。大前提として、Raspberry Pi4のGPIOが流せる電流は16 [mA]と小さいので、モータを回すには全然足りません。そこで、Raspberry Pi4とは別にバッテリーボックスを用意する必要があります。

f:id:zaloha8:20210829164552j:plain

各部品を適当に選定してもとりあえず動くかもしれませんが、せっかくなのでデータシートから色々計算して部品を選定してみます。

 

行った計算は下記の通りです(間違っていたらごめんなさい)。

 

 ① モータに流れる電流を制限する抵抗R3

モータの性能表を見ると、今回使うRE-260RA-2670の適正電圧はVcc=3.0 [V]、消費電流はIm=700 [mA](0.7 [A])なのでオームの法則から、R3は次の様になります。

R3=\frac{Vcc}{Im}=\frac{3.0}{0.7}=4.29 \left[\Omega\right]

手持ちの抵抗の中から抵抗値の近い値を選択し、R3=4.7 [Ω]を使います。

f:id:zaloha8:20210829165538j:plain

 

② ダイオード

念のため、モータの回転/停止の切替えの際に発生する逆起電力からモータを保護するダイオードを付けます。性能として、逆耐圧VRが電源電圧Vcc=3.0 [V]の10倍以上、平均清流電流Ioがモータの消費電流Im=700 [mA](0.7 [A])以上の物を使う様です。

今回は、VR=50 [V], Io=1.0 [A]の1N4001を使います。

 

③ トランジスタ

トランジスタのデータシートを見て、 コレクタ定格電流Icがモータの消費電流Im=700 [mA](0.7 [A])よりも大きい物を使います。今回使うトランジスタは、コレクタ定格電流Ic=2.0 [A]の2SC2655-Yです。データシートを見ると、直流電流増幅率はhFE=120~240となっていますが、直流電流増幅率はバラつくため、計算は最小値の1/2(hFE=60)で計算します。

トランジスタのベース電流Ibは以下の式から計算します。

Ib=\frac{Im}{hFE}=\frac{700}{60}=11.7 \left[mA\right]

ベース電流Ibは、Raspberry Pi4のGPIOが出力可能な電流(16 [mA])以下にします。

 

④ ベースエミッタ間抵抗R2 

誤動作を防止するために入れるベースエミッタ間抵抗R2は通常1 [kΩ]〜100 [kΩ]の物を使う様ですが、今回は手持ちの抵抗から10 [kΩ]を選定します。

トランジスタのデータシートに記載のコレクタ遮断電流Icbo=1.0 [uA](0.000001 [A])と抵抗R2=10 [kΩ](10000 [Ω])から、ベースエミッタ間の電圧降下Vibeを以下の様に計算します。

Vibe=Icbo\times R2=0.000001\times10000=0.01 \left[V\right]

このVibeがトランジスタのベースエミッタ間最小動作電圧Vbe(最小値)=0.6 [V](データシートのIc-Vbeグラフから読み取り)より小さければ良いらしいです。

 

⑤ ベース抵抗R1

最後に、ベース電流Ib=11.7 [mA](0.0117 [A])を流すための抵抗R1を計算します。Raspberry Pi4のGPIOの出力電圧Vras=3.3 [V] 、トランジスタのベースエミッタ間電圧Vbe=0.75 [V](データシートのIc-Vbeグラフから読み取り)から、オームの法則より以下の様に計算します。

R1=\frac{Vras - Vbe}{Ib}=\frac{3.3 - 0.75}{0.0117}=218 \left[\Omega\right]

よって、手持ちの抵抗から220 [Ω]を選定します。 

 

ブレッドボードを使って配線すると写真の様になります。

f:id:zaloha8:20210829170918j:plain

 

 

<動作プログラム>

動作プログラムはPythonで2種類作成しました。

  • モータ5秒回転、5秒停止を繰り返すプログラム
  • スライドバー付きのGUIプログラムでモータ速度を変えるプログラム

ソースコードとプログラム実行時の写真は下の通りです。

 

<DC_Motor_01.py(モータの回転、停止を繰り返す)>

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

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

#使用するピン番号を代入
LED=8

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

#例外を検出する
try:
    #無限ループ
    while 1:
        #ハイレベルを出力
        GPIO.output(LED,GPIO.HIGH)
        
        #5待つ
        time.sleep(5.0)
        
        #ローレベルを出力
        GPIO.output(LED,GPIO.LOW)
        
        #5秒待つ
        time.sleep(5.0)
    
#キーボードの例外を検出
except KeyboardInterrupt:

    #メッセージを表示
    print("Pushed Ctrl+C")
    print("End of program")

#GPIOを開放
GPIO.cleanup()

f:id:zaloha8:20210829171705j:plain

いい感じですね。

 

<tk_DC_Motor_02.py(GUIでモータの速度を変える)>

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#Tkinterライブラリをインポート
import tkinter as tk #Python3
#import Tkinter as tk #Python2

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

#使用するピン番号を代入
LED=8

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

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

#Tkオブジェクトのインスタンスrootを作成
root=tk.Tk()

#スライドバーの値として使うVariableオブジェクトのインスタンスを
#浮動小数点型で作成
led_val=tk.DoubleVar()

#0をセット
led_val.set(0)

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

#デューティ比を変更する関数を定義
def change_duty(dc):
    #デューティ比を変更
    p.ChangeDutyCycle(led_val.get())

#rootに表示するスライドバーを定義
#ラベル[LED]、水平に表示、数値の範囲は0~100
s=tk.Scale(root,label="Motor 速度",orient="h",\
           from_=0,to=100,variable=led_val,\
           command=change_duty)

#スライドバーを配置
s.pack()

#rootを表示
root.mainloop()

#PWMを停止
p.stop()

#GPIOを開放
GPIO.cleanup()

f:id:zaloha8:20210829192244j:plainf:id:zaloha8:20210829192254j:plainf:id:zaloha8:20210829192305j:plainf:id:zaloha8:20210829192315j:plain

スライドバーの位置によって、モータの速度が変わります。

 

3Dプリンタでフレームを作成する>

最後に、より扇風機らしくするために、ファンの周りに3Dプリンターで造形したフレームを設置します。この様な線の細い造形物も3Dプリンタですぐに作れるのはとても便利ですね。

f:id:zaloha8:20210829192905j:plain

 

<まとめ>

という訳で、Raspberry Pi4を使ってマブチモータを回し、小型扇風機を作ってみました。単純にモータを回すだけでも、まじめに電子部品の要素計算をしてみると学べる事がたくさんありますね。今回はトランジスタを使ってモータを回しましたが、この方式だと正転 / 逆転はできないので、次はモータドライバを使ってもう少し複雑なモータ駆動を試してみたいと思います。

 

それでは、また。