Controlling servos motors using the servo interfaces.
レッスン13"サーボインターフェースを使用してサーボモーターを制御する"をやっていく。
CrowPi-lessons.pdfに記載された概要の訳を、以下に引用する。
サーボは、デバイスを機械的に制御し、部品を動かすことができる本当にクールなモジュールです。 このようなサーボを使用して、スマートなゴミ箱、スマートな開閉ドア付きのキャンディーボックス、その他多くの興味深いプロジェクトを作成できます。
ステップモーターとは違って、今度こそ動きのあるものが作れるのかな?
何を学習するか
このレッスンを終了すると、次のことができるようになります。
- サーボを複数方向に接続して制御します
何が必要か
- 初期設定後のCrowPiボード
- マイクロサーボ(CrowPiに付属)
↑サーボモーターに白い部品を取り付けた
Requires switching modules using the switch
- はい、右スイッチ-ピン番号7、8-スイッチを入れてオンにします(センサーの切り替え方法を忘れた場合は、5ページを参照してください)
CrowPi上のサーボモジュールの位置
ここは結構重要なので、CrowPi-lessons.pdfに記載された解説の訳を、以下に引用する。
CrowPiには2つのサーボインターフェースが含まれており、どちらもサーボを制御する目的で使用できます。 このチュートリアルでは、「Servo1」とマークされたインターフェース番号1を使用します。もう一方のインターフェースもいつでも使用できますが、サンプルスクリプトを適切なGPIOピンに変更する必要があります。サーボには、正、負、データの3つのピンがあります。プラスのピンは常に赤いケーブルで、マイナスのピンは黒いケーブル(アースとも呼ばれます)であり、データケーブルは通常カラフルなケーブルです。
次のように接続します
- 赤いケーブル(正)は最初のサーボの真ん中のピンに行きます
- 黒いケーブル(マイナスはグラウンドとも呼ばれます)は最初のサーボの右側のピンに接続します
- カラフルなケーブル(青またはオレンジの場合があります)は、最初のサーボの左側にあるGPIOピンに接続します。
って書いているけど、実はCrowPiに同梱されているサーボモーターのコネクタは、「Servo2」と書いている方に接続するようになっており、レッスン動画でも同様であった。
このスクリプトを実行すると、サーボモーターに取り付けた白い部品が左や右にゆっくりと回転する。
スクリプトは無限ループとなっているので、CTRL+Cで終了させる。
↑右の白いソケット部分がServo2で、その左の黒いピン3つがServo1と書かれている。付属のサーボモーターはServo2の方に接続する。
↑サーボモーターをCrowPiボードに取り付けたところ
ちなみに、Servo1とServo2のBOARDとBCMのピン番号を以下にまとめる。
BOARD | BCM | |
Servo1 | 37 | 26 |
Servo2 | 22 | 25 |
サーボの操作
このレッスンで使用するPythonスクリプトは以下の通り。
Examples/servo.py
#!/usr/bin/python # -*- coding: utf-8 -*- # Author : Original author WindVoiceVox # Original Author Github: https://github.com/WindVoiceVox/Raspi_SG90 # http://elecrow.com/ import RPi.GPIO as GPIO import time import sys class sg90: def __init__( self, direction): self.pin = 25 GPIO.setmode( GPIO.BCM ) GPIO.setup( self.pin, GPIO.OUT ) self.direction = int( direction ) self.servo = GPIO.PWM( self.pin, 50 ) self.servo.start(0.0) def cleanup( self ): self.servo.ChangeDutyCycle(self._henkan(0)) time.sleep(0.3) self.servo.stop() GPIO.cleanup() def currentdirection( self ): return self.direction def _henkan( self, value ): return 0.05 * value + 7.0 def setdirection( self, direction, speed ): for d in range( self.direction, direction, int(speed) ): self.servo.ChangeDutyCycle( self._henkan( d ) ) self.direction = d time.sleep(0.1) self.servo.ChangeDutyCycle( self._henkan( direction ) ) self.direction = direction def main(): s = sg90(0) try: while True: print("Turn left ...") s.setdirection( 100, 10 ) time.sleep(0.5) print("Turn right ...") s.setdirection( -100, -10 ) time.sleep(0.5) except KeyboardInterrupt: s.cleanup() if __name__ == "__main__": main() |
↑Pythonだからインデントが大事なんだが、いかんせんブログでコードを書く方法を知らないので、いちいち全角スペースで打っていくの大変だな😅
書いてあるコードのインデントを保存したまま、コピーできないのかな?🤔
例のごとく、GPIO.setmodeとpin番号を修正。
修正後
def __init__( self, direction): self.pin = 22 GPIO.setmode( GPIO.BOARD ) |
スクリプトは無限ループとなっているので、CTRL+Cで終了させる。
動きはカクカクだが、ちゃんと動くので少し感動😂