PCA9685로 다중 서보 모터 제어

소개



로봇 암적인 것을 자작하고 싶었기 때문에 서보 드라이버 PCA9685를 사용하여 만들어 보았습니다. 프로토 타입도 프로토 타입이므로 슈퍼 황삭하고 생산 종료 서보 모터를 사용하고 있기 때문에 참고가되지 않는 생각도합니다.


다양한 구성



1. Raspbian이 들어간 RaspberryPi3

2.서보 모터×4(VIGOR VS-2)
메르카리로 4개 세트 1500엔으로 입수했습니다

3.PCA9685
서보 모터를 최대 16개까지 움직일 수 있는 드라이버입니다. 아마존이라면 680엔으로 바로 구입할 수 있습니다.
HiLetgo PCA9685 16채널 12비트

4. 외부 전원
PCA9685의 외부 전원으로서 충전지(1.2v)를 직렬로 4개이므로 4.8v를 넣고 있습니다. RaspberryPi에서 5V만으로도 좋지만, 만약을 위해서입니다.

5. 점퍼 와이어
이것은 공작할 때에는 필수군요. 많이 있으면 좋다고 생각합니다.
HiLetgo® 6개 세트 2*120개 3종류 오스오스 메스메스 오스메스

6.서보끼리 붙이기 위한 토대
이것은 3D 프린터로 만들었습니다.

배선 ①~③



①RaspberryPi측
왼쪽에서 검은색(GND)・일개 날려 녹색(GPIO:SCL)・흰색(GPIO:SDA)・적색(3.3V)


②PCA9685측
흑(GND)・한개 날려 녹색(SCL)・흰(SDA)・적(Vcc)에 꽂아 주세요.
서보 모터의 핀을 채널 0~2 나란히 꽂아 주십시오.
※메르카리로 4개 샀습니다만 1개 기어가 망가지고 있던 것이 있었으므로 수리할 때까지는 3개입니다.


③외부 전원


배선은 이상입니다.

RaspberryPi 및 드라이버 설정



이쪽이 알기 쉽게 기사를 써 주고 있으므로 이쪽을 참고로 커멘드로 동작 확인까지 가 주세요.
Raspberry Pi 3에서 PCA9685 사용

명령
pi@raspberry:~ $sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- -- 

0 줄에 40이나 70처럼 표시되어 있으면 괜찮습니다.
그렇지 않은 경우 배선 실수의 가능성이 있습니다.

파이썬으로 각 서보 모터 제어



아래 코드로 쉽게 이동해보십시오.
이쪽은 이쪽의 코드를 참고로 하고 있습니다.
Hobby robot laboratory
가능한 한 초보자라도 알 수 있듯이 주석 과다기미입니다.

servo_test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import Adafruit_PCA9685
import time

#サーボモーターをコントロールするためのクラス
class servo_Class:
    #ChannelはPCA9685のサーボモーターを繋いだチャンネル
    #ZeroOffsetはサーボモーターの基準の位置を調節するためのパラメーターです
    def __init__(self, Channel, ZeroOffset):
        self.Channel = Channel
        self.ZeroOffset = ZeroOffset

        #Adafruit_PCA9685の初期化
        self.pwm = Adafruit_PCA9685.PCA9685(address=0x40)
        self.pwm.set_pwm_freq(60)

    """角度を設定する関数です"""
    def SetPos(self,pos):
        #pulse = 150~650 : 0 ~ 180度
        #PCA9685はパルスで角度を制御しているため0~180のように角度を指定しても思った角度にはなりません
        #そこで角度の値からパルスの値へと変換します。PCA9685ではパルス150~650が角度の0~180に対応しているみたいです
        #下の式の(650-150)/180は1度あたりのパルスを表しています
        #それにpos(制御したい角度)を掛けた後、150を足すことでことで角度をパルスに直しています。
        #最後にZeroOffsetを足すことで基準にしたい位置に補正します
        pulse = (650-150)/180*pos+150+self.ZeroOffset
        self.pwm.set_pwm(self.Channel, 0, pulse)


"""制御を行うメインの部分です"""
if __name__ == '__main__':
    #今回はサーボモーターが3つあります
    Servo0 = servo_Class(Channel=0, ZeroOffset=-5)
    Servo1 = servo_Class(Channel=1, ZeroOffset=-5)
    Servo2 = servo_Class(Channel=2, ZeroOffset=-5)

    try:
        #テストでそれぞれのサーボモーターを45度,90度と繰り返し動かしてみます。
        while True:
            print '45'
            Servo0.SetPos(45)
            time.sleep(2)
            Servo1.SetPos(45)
            time.sleep(2)
            Servo2.SetPos(45)
            time.sleep(2)

            print '90'
            Servo0.SetPos(90)
            time.sleep(2)
            Servo1.SetPos(90)
            time.sleep(2)
            Servo2.SetPos(90)
            time.sleep(2)

    except KeyboardInterrupt  :         #Ctl+Cが押されたらループを終了
        print("\nCtl+C")
    except Exception as e:
        print(str(e))

스크립트를 원하는 곳에 저장하고 저장된 디렉토리에서 다음 명령을 실행합니다.

명령
pi@raspberry:~ $python servo_test.py
45
90
45
90
45
90
#Ctl+cを押すと止まります

끝에



여기까지 PCA9685의 간단한 사용법을 소개해 왔습니다.
마음이 가면 좀 더 응용 프로그램을 실고 싶습니다.

참고 사이트



· htps : // 코 m / 쵸코 야마 / ms / 935b51128d2d5d b26f15
· htps : // / s. 오, ぇ. 코 m / 해 / 메모란 즈 m ゔ 아 안다 l 고리 thm / 라 sp 밧
· htps : // cd 응-쇼 p. 아다 f 루이 t. 이 m / 다만 ts / P 또는 9685. pdf

좋은 웹페이지 즐겨찾기