톱니바퀴 제어 서보 모터(PCA9685) 사용
21012 단어 PythonRaspberry Pipygamepca9685tech
개시하다
전자 작업 중에 서보 모터를 제어할 기회가 매우 많다.그래서 이번에는 톱니바퀴로 서보 모터를 제어하고 싶다.
그러나 PWM으로 서보 모터를 제어할 수 있는 GPIO의 수가 적기 때문에 I2C를 통해 서보 모터를 제어할 수 있는 서보 모터 드라이브(PCA9685)를 사용하고 싶습니다.
PCA9685를 사용하여 I2C를 통해 16개의 서보 모터를 제어할 수 있습니다.가격도 아마존 두 개에 1000엔 정도인데 값이 싸요.
그리고 이번 기사'게임 패드의 입력 가져오기🎮와 결합하면 게임 매트에서 서보 모터를 제어할 수 있다.
이번에 사용한 물건.
Raspberry Pi3 모델 B
무선 게임 패드 - JC-U4113SBK
서보 모터 드라이브 - PCA9685
서보 모터 - TG9e
Python 3.9.x
Adafruit_PCA9685 설치
PCA9685를 사용하여 Pytohon에 라이브러리를 설치합니다.
앱으로 설치
$ sudo pip3 install adafruit-pca9685
회로도
신호는 렌즈파→PCA9685→서보 모터 순으로 흐른다.
고무 파이와 PCA9685
PIN1(3.3V PWR) - VCC
PIN2(5V PWR) - V+
PIN3(I2C SDA) - SDA
PIN4(I2C SCL) - SCL
PIN6(GND) - GND
PCA9685 및 서보 모터
PWM - PWM
V+ - V+
GND - GND
렌즈파의 인발 배열 참고↗️
PCA9685를 통해 서보 모터를 제어하는 프로그램
우선 단일 이동 서보 모터를 시험해 보자.
함수 설명
pwm.set_pwm()
pwm.set_pwm (채널, 0, 펄스 폭) 에 사용합니다.
채널: PCA9685의 0~15개 채널을 지정합니다.이번에는 서보 모터를 0 채널에 연결해서 0을 0에 건네준다.
0:길어지기 때문에 사랑을 끊는다.아무튼 일단 0부터 주면 오케이!
펄스폭: 서보전기의 종류에 따라 달라질 수 있으며, 이번 전달 펄스폭은 150~650(서보전기의 각도 0~180)이다.
test.py
import Adafruit_PCA9685
import time
# PCA9685初期設定
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)
def main():
while True:
pwm.set_pwm(0, 0, 150)
time.sleep(1)
pwm.set_pwm(0, 0, 650)
time.sleep(1)
if __name__ == '__main__':
main()
프로그램 실행$ sudo python3 test.py
[응용] 게임 패드를 통해 서보 모터를 제어한다
게임 패드의 조종봉으로 서보 모터를 제어해 보세요.
프로그램의 절차는'게임 패드의 입력 얻기'→'게임봉의 값 변환'→'변환된 값을 PCA9685에 넘기기'다.
※ 게임 매트를 획득하는 방법은 지난 기사 "게임 패드의 입력 가져오기🎮"를 참조하십시오.
test.py
import pygame
import Adafruit_PCA9685
# pygame初期設定
pygame.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()
# PCA9685初期設定
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)
# ジョイスティックの出力範囲をサーボモーターの出力範囲に変換
def map_pca9685(val):
in_min = -100
in_max = 100
out_min = 150
out_max = 650
return int((val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# ジョイスティックの出力範囲を調整
def map_axis(val):
val = round(val, 2)
in_min = -1
in_max = 1
out_min = -100
out_max = 100
return int((val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# ジョイスティックの出力範囲を調整(L2 R2ボタン)
def map_axis_t(val):
val = map_axis(val)
if val <= 0 and val >= -100:
in_min = -100
in_max = 0
out_min = 0
out_max = 50
return int((val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
else:
in_min = 0
in_max = 100
out_min = 50
out_max = 100
return int((val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
def main():
while True:
# イベントチェック
if pygame.event.get():
gamepad_data = {
"joy_lx": map_axis(joystick.get_axis(0)),
"joy_ly": -map_axis(joystick.get_axis(1)),
"joy_rx": map_axis(joystick.get_axis(3)),
"joy_ry": -map_axis(joystick.get_axis(4)),
"joy_lt": map_axis_t(joystick.get_axis(2)),
"joy_rt": map_axis_t(joystick.get_axis(5)),
"hat_x": joystick.get_hat(0)[0],
"hat_y": joystick.get_hat(0)[1],
"btn_a": joystick.get_button(0),
"btn_b": joystick.get_button(1),
"btn_x": joystick.get_button(2),
"btn_y": joystick.get_button(3),
"btn_lb": joystick.get_button(4),
"btn_rb": joystick.get_button(5),
"btn_back": joystick.get_button(6),
"btn_start": joystick.get_button(7),
"btn_guide": joystick.get_button(8),
"btn_joyl": joystick.get_button(9),
"btn_joyr": joystick.get_button(10)
}
# ゲームパッド(左ジョイスティックのx軸)を取り出しPCA9685に渡す。
pulse = map_pca9685(gamepad_data["joy_lx"])
print(pulse)
pwm.set_pwm(0, 0, pulse)
if __name__ == '__main__':
main()
프로그램 실행$ sudo python3 test.py
끝맺다
게임 패드가 서보 모터를 제어할 수 있습니다!이렇게 되면 리모컨의 핸들을 제어할 수 있다!
다음에는 게임 패드로 DC 모터를 구동하고 싶어요.
Reference
이 문제에 관하여(톱니바퀴 제어 서보 모터(PCA9685) 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/naoya_oshiro/articles/fa95bd81e3ac8a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)