小学校の理科で使ったような普通のモーター、DCモーター(直流モーター)に棒を直付けして、振り子の振り上げをやってみたいと思っていた。
しかしチャレンジしてみたところ、DCモーターで、上側で振り子のバランスを取りながらリアルタイムで安定させるというのは、思った以上に難しかった。モーターがいったん動き出すとそれを止めるのが難しく、トルクで制御するシミュレーションのようにはいかなかった。そもそもDCモーターで倒立振り子をやったという話は聞いたことがなく、だからか~、と納得した。
そこで、プーリーを使って回転速度を1/5に落とし、上部に上がればそこで振り子が安定して止まるようにした。プーリーが入っても振り子を持ち上げるほどの力はないが、ブランコのように振って反動をつけることで、振り上げることができるはずだ。そして、ちょうど上部で止まるような力で振り上げられれば、そこで振り子が止まるだろう。
そこでまず、その振り上げが本当にできるかを検証するために、ボタン操作で動く振り子を作った。
材料
RaspberryPi3 Model B+, 1個
電池ボックス(単3×4本), 1個 –> 後で、5V, 2A の電源に変更
10kΩ抵抗, 3個(モーター用1個、タクトスイッチ用2個)
330Ω抵抗, 2個(LED用)
モータードライバ 東芝TA7291P, 1個 秋月で購入(2個で300円) しかし生産終了予定らしい。
DCモーター FA-130RA, 1個 (秋月で100円)
セラミックコンデンサ 0.01μF (Amazon 100個で156円)
タクトスイッチ 2個(秋月で1個10円)
ブレッドボード 2個(1つをコントローラーのようにした)
プーリーベルトφ1.5mm, 1巻, (モノタロウで10m 479円)
ハードウェア
モーターと振り子は以下のようにプーリーで作った。
回路
ブレッドボードに実装したのが、下図。カメラもついていますが、今の段階では使いません。
プログラム
プログラムは、以下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# coding: utf-8 import RPi.GPIO as GPIO import time LED_L = 27 LED_R = 22 BUT_L = 17 BUT_R = 4 MOT_L = 24 MOT_R = 25 GPIO.setmode(GPIO.BCM) GPIO.setup(MOT_L, GPIO.OUT) GPIO.setup(MOT_R, GPIO.OUT) GPIO.setup(LED_L, GPIO.OUT) GPIO.setup(LED_R, GPIO.OUT) GPIO.setup(BUT_L, GPIO.IN) GPIO.setup(BUT_R, GPIO.IN) try: while True: if GPIO.input(BUT_L) == GPIO.HIGH: GPIO.output(LED_L, GPIO.HIGH) GPIO.output(MOT_L, GPIO.HIGH) else: GPIO.output(LED_L, GPIO.LOW) GPIO.output(MOT_L, GPIO.LOW) if GPIO.input(BUT_R) == GPIO.HIGH: GPIO.output(LED_R, GPIO.HIGH) GPIO.output(MOT_R, GPIO.HIGH) else: GPIO.output(LED_R, GPIO.LOW) GPIO.output(MOT_R, GPIO.LOW) except KeyboardInterrupt: pass GPIO.cleanup() |
動いている様子
動作の動画です。
うまく振り上げれば上でとまることが分かりました。結構練習しました。