不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

CrowPiレッスン13:サーボインターフェースを使用してサーボモーターを制御する

2020-11-09 00:11:04 | CrowPi

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」と書いている方に接続するようになっており、レッスン動画でも同様であった。


↑右の白いソケット部分が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で終了させる。

動きはカクカクだが、ちゃんと動くので少し感動😂