Raspberry Pi を使用してモーターを制御する方法は、ロボット開発の第一歩として非常に重要です。このブログでは、モーター制御の基礎知識から具体的な制御方法まで、詳しく解説します。初心者でも取り組みやすい内容なので、ぜひ参考にしてください。
必要な基礎知識
- モーターの種類
- DCモーター: 単方向または双方向の回転が可能で、速度制御も比較的簡単です。
 - サーボモーター: 角度を精密に制御でき、ロボットアームなどに使用されます。
 - ステッピングモーター: 一定のステップで正確に回転し、位置制御に最適です。
 
 - 制御方式
- GPIO (General Purpose Input/Output): Raspberry Pi のピンを使用してモーターを制御します。
 - PWM (Pulse Width Modulation): モーターの速度や角度を制御するための信号方式です。
 - Hブリッジ: DCモーターを双方向に動かすための回路です。
 
 
必要な機材とセットアップ
ハードウェア:
- Raspberry Pi(どのモデルでも可、GPIO ピンがあるもの)
 - DCモーター(またはサーボモーター、ステッピングモーター)
 - モータードライバ(例: L298N、TB6612FNG)
 - 電源(モーター用に別途 5V または 12V 推奨)
 - ジャンパーワイヤー
 - ブレッドボード(プロトタイプ用)
 - 抵抗器やダイオード(必要に応じて)
 
ソフトウェア:
- Raspberry Pi OS
 - Python(モーター制御用ライブラリ)
 
作り方
1. モータードライバの選定と接続
モータードライバは、Raspberry Pi の GPIO ピンからモーターに供給される信号を強化して動作させます。以下は、よく使用されるモータードライバの例です。
- L298N モジュール: DCモーターを2つ制御可能で、Hブリッジ回路を搭載。速度と回転方向の制御が可能です。
 
L298N の基本接続例:
IN1,IN2: モーター1の制御ピン(Raspberry Pi GPIO に接続)ENA: モーター1の速度制御用(PWM信号を送る)VCC: モータードライバの電源入力GND: グラウンド(Raspberry Pi と共有)- モーターの2本の端子を 
OUT1とOUT2に接続 
2. Raspberry Pi との配線
Raspberry Pi の GPIO ピンを使って、モータードライバの入力ピンに接続します。次の例では GPIO 17 と GPIO 27 を制御信号として使用します。
- GPIO 17 → IN1
 - GPIO 27 → IN2
 - GPIO 18 → ENA(PWM信号)
 
3. 基本的な Python コード
以下は、DCモーターを制御する基本コードです。
import RPi.GPIO as GPIO
import time
# GPIO ピンの設定
IN1 = 17
IN2 = 27
ENA = 18
# GPIO モードの設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(ENA, GPIO.OUT)
# PWMの設定
pwm = GPIO.PWM(ENA, 100)  # PWM周波数を100Hzに設定
pwm.start(0)  # 初期速度は0%
# モーターを前進させる関数
def motor_forward(speed):
    GPIO.output(IN1, GPIO.HIGH)
    GPIO.output(IN2, GPIO.LOW)
    pwm.ChangeDutyCycle(speed)
# モーターを後退させる関数
def motor_backward(speed):
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.HIGH)
    pwm.ChangeDutyCycle(speed)
# モーターを停止させる関数
def motor_stop():
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.LOW)
    pwm.ChangeDutyCycle(0)
try:
    while True:
        motor_forward(50)  # 50% の速度で前進
        time.sleep(3)      # 3秒間動作
        motor_backward(50) # 50% の速度で後退
        time.sleep(3)
        motor_stop()       # 停止
        time.sleep(2)
except KeyboardInterrupt:
    print("終了します")
    pwm.stop()
    GPIO.cleanup()
4. プロジェクトの拡張
- センサーとの連携 障害物センサーや距離センサーを組み合わせて、自動で停止や方向転換を行います。
 - ステッピングモーターの制御 ステッピングモーターを使う場合、専用のライブラリ(例: 
RPi.GPIOやgpiozero)を利用します。 - 無線制御 Bluetooth や Wi-Fi モジュールを追加して、スマートフォンや PC からリモート操作を実現します。
 
5. トラブルシューティング
- モーターが動かない場合、電源が十分に供給されているか確認してください。
 - GPIO ピンが正しく接続されているか、
GPIO.cleanup()を使ってリセットしてみましょう。 
応用例
- ロボットカーの作成 Raspberry Pi を使った簡単なロボットカーを作り、障害物回避やライン追跡を実装。
 - ロボットアームの制御 サーボモーターを用いて、複数の関節を持つロボットアームを構築。
 - 自動化装置のプロトタイプ Raspberry Pi を制御装置として使い、工場の自動化装置を模倣。
 
Raspberry Pi を使ったモーター制御は、ロボット開発やプロトタイピングにおける基本スキルです。この知識を活かして、さまざまなプロジェクトに挑戦してみてください!