Nゲージの模型をラズパイで動かす “らずてつ”その2――制御の準備:名刺サイズの超小型PC「ラズパイ」で遊ぶ(第53回)
鉄道模型の運転をラズパイで制御する仕組みに挑戦します。
前回はラズパイと鉄道模型の線路をつなげるところまで進めました。今回はラズパイから指令を出して、鉄道模型を動かすための準備をします。
前回書いた通り、鉄道模型のモーターはPWMによって動かすことになります。今回はGPIO12番にPWMを設定し、パルス幅を周期で割り算した「デューティー比」を指定することで、電圧を変化させます(MONOistの解説)。
まずは単純に、前後に模型を動かすことをやってみましょう。TB6612では、以下のように方向を制御できます。
| TB6612の方向制御 | ||
|---|---|---|
| GPIO20 | GPIO21 | 方向 |
| HIGH | LOW | 右回りに走る |
| LOW | HIGH | 左回りに走る |
| HIGH | HIGH | ブレーキ |
基本はこれに従って、GPIO20とGPIO21をそれぞれHIGHにしたりLOWにしたりして方向を制御します。スピードはPWMのデューティー比で決まりますが、あまりにも高いデューティー比だと暴走します。なので「40」くらいでいいかと思います。これを元にして作ったプログラムが以下です。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
# GPIOの設定
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
motor_r = 20 # 右回り
motor_l = 21 # 左回り
pwm = 12 # PWM
GPIO.setup(motor_r, GPIO.OUT)
GPIO.setup(motor_l, GPIO.OUT)
GPIO.setup(pwm, GPIO.OUT)
pwm_m = GPIO.PWM(pwm, 100)
pwm_m.start(0)
GPIO.output(motor_r, 0)
GPIO.output(motor_l, 0)
time.sleep(1)
# 右回り
pwm_m.ChangeDutyCycle(0)
GPIO.output(motor_r, 1)
GPIO.output(motor_l, 0)
print ("go forward")
pwm_m.ChangeDutyCycle(40) # ここの「40」を変えると最大速度が変化する
time.sleep(10) # ここの数値を変えると走る距離が変化する
pwm_m.ChangeDutyCycle(0)
# 動作停止
print ("stop")
GPIO.output(motor_r, 1)
GPIO.output(motor_l, 1)
time.sleep(3)
# 左回り
GPIO.output(motor_r, 0)
GPIO.output(motor_l, 1)
print ("go backward")
pwm_m.ChangeDutyCycle(40) # ここの「40」を変えると最大速度が変化する
time.sleep(10) # ここの数値を変えると走る距離が変化する
pwm_m.ChangeDutyCycle(0)
GPIO.output(motor_l, 0)
# 動作停止
print ("stop")
GPIO.output(motor_r, 1)
GPIO.output(motor_l, 1)
pwm_m.stop()
GPIO.cleanup()
test1.py
「pwm_m.ChangeDutyCycle(40)」とあるところの「40」を増減させると最大スピードが変わります。筆者の持っているキハ30では40くらいがスケールスピードかな、と思いました。「GPIO.output(motor_r, 0)」と「GPIO.output(motor_l, 1)」という箇所の、右側の「1」、「0」を変えると方向が変わります。「1」と「1」にするとブレーキがかかりますので、ピタッと止まるようになります。なお「pwm_m = GPIO.PWM(pwm, 100)」でPWMの周波数を指定していますが(ここでは100Hz)、低いと前照灯や室内灯がちらつきますので、できるだけ上げておいた方がいいです。
ただしこのプログラムだと模型がいきなりトップスピードで走るので、少し面白くありません。そこで速度を段々と上げたり下げたりして走るようにしてみましょう。数値の変化はloop関数を使って「for i in range」でiの数値を変化させ、それをデューティー比の構文「pwm_m.ChangeDutyCycle(i)」と組み合わせればできそうです。for文を入れてtest1.pyを加工したのが以下のプログラムになります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
# GPIOの設定
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
motor_r = 20 # 右回り
motor_l = 21 # 左回り
pwm = 12
GPIO.setup(motor_r, GPIO.OUT) # 右回り
GPIO.setup(motor_l, GPIO.OUT) # 左回り
GPIO.setup(pwm, GPIO.OUT) # PWM
pwm_m = GPIO.PWM(pwm, 100)
pwm_m.start(0)
GPIO.output(motor_r, 0)
GPIO.output(motor_l, 0)
time.sleep(1)
# 右回り
pwm_m.ChangeDutyCycle(0)
GPIO.output(motor_r, 1)
GPIO.output(motor_l, 0)
print ("go forward")
for loop in range(1):
for i in range(0,40,1): # ここの「40」を変えると最大速度が変化する
pwm_m.ChangeDutyCycle(i)
time.sleep(0.1)
time.sleep(10) # ここの数値を変えると走る距離が変化する
for i in range(40,0,-1): # ここの「40」を変えると最大速度が変化する
pwm_m.ChangeDutyCycle(i)
time.sleep(0.1)
time.sleep(3)
pwm_m.ChangeDutyCycle(0)
# 動作停止
print ("stop")
GPIO.output(motor_r, 1)
GPIO.output(motor_l, 1)
# 左回り
GPIO.output(motor_r, 0)
GPIO.output(motor_l, 1)
print ("go backward")
for loop in range(1):
for i in range(0,40,1): # ここの「40」を変えると最大速度が変化する
pwm_m.ChangeDutyCycle(i)
time.sleep(0.1)
time.sleep(10) # ここの数値を変えると走る距離が変化する
for i in range(40,0,-1): # ここの「40」を変えると最大速度が変化する
pwm_m.ChangeDutyCycle(i)
time.sleep(0.1)
# time.sleep(3)
pwm_m.ChangeDutyCycle(0)
# 動作停止
print ("stop")
GPIO.output(motor_r, 1)
GPIO.output(motor_l, 1)
pwm_m.stop()
GPIO.cleanup()
いかがでしょうか。ゆっくりとスタートしてゆっくりと止まるようになりました。これで鉄道模型のコントロールがワンランクアップした気がします。次回はラズパイでポイントをコントロールする仕組みについて考えていきたいと思っています。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
Nゲージの模型をラズパイで動かす “らずてつ”その1――鉄道模型とラズパイをつなぐ
今回から鉄道模型の運転をラズパイで制御する仕組みに挑戦します。
部屋の二酸化炭素濃度を測定しよう ラズパイでCO2センサーを作る
ラズパイを使ってCO2を計測し、部屋の換気をする目安にしてみましょう。
550円の「Raspberry Pi Pico」でIoT その1:気温と湿度、気圧を測定する
独自開発のチップ「RP2040」を搭載したマイコンボード「Raspberry Pi Pico」でセンサーデバイスをテスト。
ラズパイで「Windows 10 on ARM64」を動かす(オーバークロック編)
ラズパイにARMプロセッサ向けの「Windows 10 on ARM64」をインストールしてみた。今回はオーバークロックで快適動作を実現。
ラズパイで「Windows 10 on ARM64」を動かす(インストール編)
ラズパイにARMプロセッサ向けの「Windows 10 on ARM64」をインストールしてみた。
ラズパイで「Windows 10 on ARM64」を動かす(事前準備編)
ラズパイにARMプロセッサ向けの「Windows 10 on ARM64」をインストールしてみた。
ラズパイ一体型キーボード「Raspberry Pi 400」レビュー 特例制度のWeb申請で“技適なし”を回避した
かつての“マイコン”を思わせるラズパイ一体型キーボード「Raspberry Pi 400」のレビューのファーストインプレッションをお届け。海外製品を日本国内で使うために気を付けるべきポイントも紹介。
ラズパイ一体型キーボード「Raspberry Pi 400」の性能は? ベンチマークテストで従来モデルと比べた
かつての“マイコン”を思わせるラズパイ一体型キーボード「Raspberry Pi 400」でベンチマークテストを実施。その実力とは?
ラズパイで気温と湿度を測定、LINEで通知を受け取る 〜前編〜
今回は温湿度センサーモジュールとラズパイを組み合わせ、LINEと連携させる方法を紹介します。
ラズパイを無線LANルーター化する 〜アクセスポイント編〜
家庭内で無線LANルータを使っている人は多いかと思います。今回はそのルーター機能をラズパイに持たせて、ラズパイを使った無線LANルーターの構築方法についてご紹介します。
本格的な撮影が楽しめる公式カメラモジュール「Raspberry Pi High Quality Camera」を試す
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。Raspberry Pi公式のカメラとして本格的な撮影が楽しめる「Raspberry Pi High Quality Camera」を紹介します。
ラズパイで新型コロナウイルス解析に参加する 〜Ubuntu Serverの構築編〜
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。今回はラズパイで。
ラズパイでスマートスピーカーを作る 「アレクサ!あしたの天気は?」 〜ソフトウェア準備編〜
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。今回は米Amazonが開発したAIアシスタント「Alexa」をラズパイで使えるようにしてみます。
これが“らずキャン△”だ! キャンプ場で役立つ「気温・湿度・気圧センサー」の作り方
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。まずはキャンプ場で気温、湿度、気圧を測れるデバイスを作ってみます。
ラズパイで「YouTube」と「Amazon プライムビデオ」を見る
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。音楽や動画のメディアサーバ化するために入れたOS「OSMC」で、YouTubeやAmazon プライムビデオなどを楽しんでみましょう。