DCモーターを動かす 【Raspberry Pi】

Raspberry Pi

Raspberry Pi を使って DC (直流)モーターを動かしてみます。
以下の環境で動作確認をしています。
環境:
・ Raspberry Pi 5 (bookworm)
・ Windows パソコン(リモートデスクトップの設定済み、Raspberry Pi を動かすため)
・ LAN ネットワーク(Raspberry Pi と Windows パソコンは LAN ネットワークに接続済み)
・ DC モーター、電子回路(以下参照)

背景 ~ DCモーターを動かしてみる

以前に、Raspberry Pi を使って、LED やサーボモーターを動かすスクリプトなどについてまとめています。
そこで今回は、Raspberry Pi で DCモーターを動かす方法について、ポイントをまとめておくことにします。

使用するものは、たまたま手元にある、LEGO のモーター、バッテリー、電子デバイスとし、できるだけシンプルな構成で動かしてみます。
モーターやバッテリーを差し替えることで、一般の模型用モーターなどを動かすことが可能です。また、今回の駆動系を複数セット準備することで、複数のモーターを自由にコントロールできるようになります。
スクリプトはモーターを ON/OFF させるシンプルなものと、PWM 制御としたものをまとめておきます。任意に作った可動部をスムーズに/滑らかに動くようにしたいといった程度であれば、LEGO などを PWM 制御することで簡単に実現できます。

なお以前に、ベクター画像の描画ソフトを自作し公開しています。図形を自由に描画できますので、ブレッドボード図も自作してみることにします。
モーターの動かし方などを忘れたときは、以下を参照することで、回路やプログラムをすぐに作ることができるよう、情報を集約しておくことにします。

手順

① Raspberry Pi に GPIO のテスト用のフォルダとテキストファイルを作成し、下記のサンプルスクリプトをコピー&ペーストして保存してください。
例: home/pi/user1/GPIO1/GPIO1.py
② Raspberry Pi の GPIO から、ジャンパーケーブルでブレッドボードに信号を引き出すなどして、DC モーターの駆動回路を作成します。以下に参考例として、ブレッドボード図を記載しておきます。
③ Python のスクリプトを実行してください。
例: python home/pi/user1/GPIO1/GPIO1.py
→ モーターが動いたら成功です。

うまく動いたら

・ GPIO1.py のスクリプトがうまく動いたら、GPIO2.py のスクリプトも追加して動かしてみてください。
GPIO1.py は、シンプルに Raspberry Pi の GPIO 出力 (Low, High) を変更するスクリプトです。
GPIO2.py は、PWM (パルス幅変調)制御を使って、モーターの回転速度を少しずつ上げるようにしたものです。
具体的には、PWM 制御で周期を 50ms としてデューティを、duty1 = 0% → 100% に順次変更することで、負荷(モーター)に与える平均電力を 0% から 100% (最大出力)まで段階的に変えられるようにしたものです。
デジタルの出力ではモーターの ON/OFF 程度しかできませんが、パルス幅変調を使うことで、モーターの回転速度やトルクを微調整したり、スムーズに変化させることなどが可能になります。
・ 余裕があるようでしたら、下記の関連リンク「Raspberry Pi で PWM 制御」のスクリプトも試してみてください。
キーボードのキー d (down)、u (up) を押すと、PWM 制御のデューティを変えられるようにしており、モーターの速度・トルクを微調整できます。
・ 上記の構成をアレンジしていくことで、ソフトウェア、電気回路、メカ機構のいずれであっても、機能を発展させていくことが可能です。より高度な駆動系を実現できるかと思います。
・ GPIO 出力を増やして、モーターの数を増やすことも可能です。二足歩行ロボットや車など、より複雑な制御が可能です。
・ モーターから先を LEGO としています。これにより、ロボットや移動ステージなど、欲しい機能を短時間で実現できると思います。
・ なお写真は、ロボット工学の二足歩行などで使われるチェビシェフリンク機構を作ってみた一例です。回転運動から直線状の部分を含む軌跡に変換しています。足を2本に増やして強化する等により、歩行メカニズムの実験なども可能だと思います。
・ 以前に Python を使って、テオ・ヤンセン機構など、任意のリンク機構をシミュレーションするプログラムを作りました。リンク機構のシミュレーションを行って構想が固まったら、今回の構成により、動作検証も容易になります。
・ ブレッドボード図は、ライブラリ等は使わずに独自で作っています。ベクター画像などのデザインなどに興味のある方は参考にしてみてください。

構成例

ブレッドボード図

ブレッドボード図を以下にまとめておきます。回路図も以下で代用します。

部品リスト

使用する部品等は以下の通りです。
・ Raspberry Pi 5 (bookworm)、電源一式
・ ブレッドボード BB601 x 2個
・ 抵抗 330Ω(橙橙茶金)
・ ダーリントントランジスタ 2SD1415A 120V 5A
・ ダイオード 1N4007 1kV 1A
・ ワニ口クリップ x 2個、ジャンパーケーブル x 9本(以上)
・ バッテリーボックス(単三電池4本対応、スイッチつき)
・ ピンヘッダー 1×2 (不図示、2.54mmピッチ バッテリーのケーブルをブレッドボードに接続するため)
・ 単三形充電式電池(エネループ)× 4本
・ DC モーター(9V、LEGO Mindstorm (旧式)の DC モーター)

※ 上記の部品の大半は、秋葉原の秋月電子、千石電商などで購入したものです。
※ LEGO のモーターは旧式ですので入手が難しいと思いますが、LEGO Functions シリーズなどの DC モーターあたりであれば Raspberry Pi から制御できるかと思います。PWM 制御のモーターよりは DC モーターのほうが制御しやすいと思います。(ご自分の責任でご確認ください。)

電子回路の説明

・ 上記のブレッドボード BB601 は、列数 5 x 2、行数 17 のものです。
図では、水平方向に並んだ5つの穴が電気的に直結しています。他とは絶縁となっています。
・ 上側のブレッドボードは、Raspberry Pi の GPIO から外部の負荷を ON/OFF するためのスイッチ用の回路です。
・ 上側のブレッドボードで、トランジスタは3本足が出ており、上から順に、ベース、コレクタ、エミッタ端子となっています。一番上のベース端子の電圧を High にすると、コレクタ端子からエミッタ端子に向けて電流が流れる仕様になっています。
・ 回路の動きとしては、まず、GPIO 14 が Low (0V) の状態ではモーターには電流が流れません。 GPIO 14 が High (3.3V) になると、緑色のジャンパーケーブルから青色のジャンパーケーブルに向かって電流が流れるようになり、下側のブレッドボードのスイッチとして機能します。
・ 図の下側のブレッドボードは、DC モーターの制御用回路です。
下側のブレッドボードで、緑色と青色のジャンパーケーブルを直結すると、外部バッテリーの電流が DCモーターに流れ、モーターが回転するようにしてあります。これにより、GPIO 14 が High になると、DCモーターが回転します。
・ 上記のブレッドボードをいくつか用意しておき、LED 回路、一般の模型用モーター、ヒーターなど、任意の回路を試作していくことで、ブレッドボードを交換するだけで、欲しい機能やそのとき思いついた機能を最短で実現できるようにしてあります。
・ DC モーターは LEGO Mindstorm のモーターです。Mindstorm には、DCモーターが2つついています。2自由度までであれば、LEGO で容易に駆動系を製作できます。
・ LEGO Mindstorm のDCモーターは、電池6本の 9V で動く仕様となっています。エネループなどの充電池 4本 1.2V x 4 ≒ 5V とすれば問題なく動きます。そこで、単三電池が4本入る電池ボックス(黒色)を DCモーター用の外部電源としています。
一般に、モーターなど消費電力が相対的に大きなもの、消費電力の変化が大きなものは、Raspberry Pi などの制御系とは別電源にすることでシステム全体が安定になります。
・ ダイオードは電流の逆流防止用です。モーターなどコイルを使った負荷を扱う場合、ON/OFF 時などに電流が逆流することがあります。今後、プログラム側でパルス幅制御(ON/OFF が頻繁)などを発展させる可能性が高いため、逆流防止用のダイオードをつけています。電圧を低めにして使うのであれば/機能を確認する程度であれば、なくても動くと思います。
・ なお、上記では、写真撮影の都合上、リンク機構を右側に配置し、回路の接続の様子も見やすくしたかったため、GND 共通は意識していません。GND 共通が気になる場合は、モーターとバッテリーの位置を入れ替えてください(バッテリーのマイナス側とエミッタが直結するようにする)。
・ 今回は LEGO のモーターとしていますが、模型用のモーターなども動かすことができます。この場合は、模型用モーターと単三電池2本のバッテリーボックス程度に差し替えればそのまま動きます。
Raspberry Pi 側から、モーターなど任意の機器を動かすことができることになります。

まとめ

Raspberry Pi で DC モーターを動かす方法についてまとめました。
今回は、LEGO のモーターを動かしてみました。上記の回路を作るだけであれば、10分前後でできるのではないかと思います。LEGO などで駆動系を作ることができると、メカ周りの機能試作や動作検証を最短化できます。

Raspberry Pi 側では、すでにカメラや機械学習のプログラムを動かすことができています。AI、ディープラーニングとメカを連携させるなど、どのようにでも活用範囲を広げていくことが可能です。
機械工学や制御工学などが得意な方であれば、たとえば人手不足を解消する自立搬送ロボ、清掃・配膳ロボ、 AI ドローンなどを考案・製作できるのではないかなと思います。

関連リンク
・ サーボモーターを動かす 【Raspberry Pi】
・ Raspberry Pi で PWM制御 【Python】
・ 温度、湿度、気圧を測定する 【Raspberry Pi & BME280】
・ LED を ON/OFF する 【Raspberry Pi & Python】
・ リンク機構をシミュレーションしてみる 【Python】
・ ベクター形式でお絵描きをしてみる 【JavaScript】
   上記のブレッドボード図は、こちら↑のソフトで作図し、タグをカスタマイズして作成しています。
・ 静止画でオブジェクト検出 【Raspberry Pi & Tensorflow Lite】
・ 乾燥時間の機械学習を行う 【Python & Tensorflow】

サンプルスクリプト

スクリプト1: GPIO1.py ~ GPIO の出力切り替え

import time as tm1 
from gpiozero import OutputDevice 

output1 = OutputDevice(14)              # GPIO14 

output1.value = 1
tm1.sleep(5) 

output1.value = 0 
tm1.sleep(1) 

スクリプト2: GPIO2.py ~ PWM 制御とした場合

import time as tm1 
from gpiozero import PWMOutputDevice 

output1 = PWMOutputDevice(14, initial_value=0, frequency=20)   # GPIO14, 50ms 

duty1 = 0.0 

for i1 in range(6): 
    print("duty: " + str(duty1)) 
    output1.value = duty1               # duty 
    tm1.sleep(2) 
    duty1 = duty1 + 0.2 
#   duty1 = duty1 + 0.02 

duty1 = 0.0 
print("duty: " + str(duty1))
output1.value = duty1                   # duty 
tm1.sleep(2) 

タイトルとURLをコピーしました