MAGAZINE

キャリテク!マガジン

  • TOP
  • キャリテク!マガジン
  • ラズパイで電子工作! 〜ラズパイで自由にモーターを制御する〜(ラズパイで作ってみたコラム)
コラム

ラズパイで電子工作! 〜ラズパイで自由にモーターを制御する〜(ラズパイで作ってみたコラム)

こんにちは、穂苅と申します。

ラズベリーパイ(ラズパイ)を使って電子工作やガジェットを作っていく、「ラズパイで作ってみたコラム」の5回目です。私自身は今までラズパイを触ったことがない初学者ですが、ラズパイにはとても興味がありましたので、この機会に自分の学習とともにお読みいただいている皆様にもお役に立てる情報を出していけたらと思っています。
やさしくはじめるラズベリー・パイ 改訂2版』という書籍をベースに学習を進めます。

今回は、ラズパイでものを動かしてみることを学習してみました。書籍のChapter3-10「サーボモーターを動かしてみよう」です。前回はLEDの制御を行いましたが、今回は更に動きがわかりやすいモーターの制御です。

ラズパイでモーターを制御するための準備

ラズパイでモーターを制御できるようになると、自分でモーターの動きや頻度などが自由自在になりますので、例えば設置したカメラの向きを変えたり、タイヤの動きを変えたりすることもできてきます。

それではまずはラズパイでモーターを制御するために必要な材料の説明です。

いちばん重要なのはサーボモーター(Servomotor)です。これは任意の角度でモーターを回転させることができるモーターのことです。PWM信号を使ってモーターを制御する仕組みで、PWM(Pulse Width Modulation)信号というパルス幅を変えることで電流の時間を変化させてモーターなどを制御するものです。

このサーボモーターをラズパイに接続し、Pythonのスクリプトで制御するということをやってみます。前回も利用していますが、ラズパイとサーボモーターを接続するためにブレッドボードを使います。

ブレッドボードは、電子部品やジャンパ線をボードの穴に差し込むだけで手軽には電子回路を組むことができる基盤のことです。はんだ付けなども不要なためとても便利なものです。

その他、カーボン抵抗器(1KΩ)とタクトスイッチという押しボタンスイッチも使いました。

ラズパイでサーボモーターを制御してみる

まずはラズパイ、ブレッドボード、サーボモーターをつなぎます。更に制御をするためのタクトスイッチも繋いでいきます。完了すると以下のような形になります。

その後、ラズパイ側でPythonファイルを作り以下のようなプログラムを書いていきます。色々細かくて難しいのですが、1つずつ理解していくとなんとか理解できると思います。

# PythonでラズパイのGPIOを制御するパッケージをインポート
import RPi.GPIO as GPIO
from time import sleep
 
# ポート番号やサーボモーターの情報を指定 --- (*1)
SV_PORT = 18
SW1_PORT = 20
SW2_PORT = 21
 
SV_FREQ = 50 # PWM信号のサイクルが20ms(50Hz)だったため
SV_DUTY_OFFSET = 0.025 # デューティー比で回転角度を指定するための設定
SV_DUTY_RES = (2.4 - 0.5) / 20 / 180 # デューティー比で回転角度を指定するための設定
 
# GPIOの設定 --- (*2)
GPIO.setmode(GPIO.BCM) # RPi.GPIOでRaspberry PiのGPIOの各ピンを指定
GPIO.setup(SV_PORT, GPIO.OUT) # サーボモーター(出力の指定)
GPIO.setup([SW1_PORT, SW2_PORT],
    GPIO.IN, # 入力の指定
    pull_up_down=GPIO.PUD_DOWN) # ボタンのプルダウンの設定
 
# PWMを利用する準備 --- (*3)
servo = GPIO.PWM(SV_PORT, SV_FREQ) # 第1引数はpin, 第2引数はHz
servo.start(0)
sleep(0.3) # 指定の時間待機
 
# サーボモーターの角度を計算し変更する関数, -90度から+90度までの範囲
def set_angle(angle):
    if angle < -90: angle = -90
    if angle > 90: angle = 90
    degree = (angle + 90)
    duty = (SV_DUTY_OFFSET + SV_DUTY_RES * degree) * 100
    print("angle=",angle,"duty=", int(duty))
    servo.ChangeFrequency(SV_FREQ) # PWM周波数を変更
    servo.ChangeDutyCycle(duty) # デューティー比の変更
 
# ボタンに応じてサーボの角度を変える
angle = 0
set_angle(angle)
while True:
    try:
        # ボタンの状態を監視し、任意のボタンが押されていれば角度を変更させる --- (*4)
        if GPIO.input(SW1_PORT) == GPIO.HIGH:
            angle -= 10
            set_angle(angle)
        if GPIO.input(SW2_PORT) == GPIO.HIGH:
            angle += 10
            set_angle(angle)
        sleep(0.1)
    except KeyboardInterrupt: # キーボード入力によって処理を抜ける
        break
 
GPIO.cleanup() # GPIOピンの開放

ここまで書けたら保存し、ラズパイのターミナルにてこのプログラムを実行します。
プログラムを記載したファイルが存在するディレクトリに移動し、以下のコマンドを実行させます。
※servo-switch.py の部分は、保存した際のファイル名に変更してください。

python3 servo-switch.py

すると、サーボモーターが動き出せる準備が整いますので、ブレッドボード上のタクトスイッチを長押ししてみてください。

サーボモーターがタクトスイッチによって動いたら成功です。

角度や条件を変更していけば、様々なカスタマイズができてきそうですので私もPythonファイルのプログラムに変更を加えて色々試してみたいと思いました。

今回のまとめ

今回は、サーボモーターをラズパイとPythonで自由に制御してみました。ブレッドボードへの接続も複雑になってきまして、動いたときはとても嬉しかったです。

いかがでしたでしょうか。

ものづくりが好きな方や新しいことが好きな方はラズパイを手に取るととても楽しいです。こんなに小さい基盤にOSを入れて自分のPC経由で楽しんで学ぶことができると思いますのでおすすめです。

今回で最終回になります。最後までお読みいただき、ありがとうございました。今回のコラムが学習のヒントになれば幸いです。 それではまたどこかでお会いできることを楽しみにしております。

関連記事

facebook シェアシェア
LINE シェアシェア