라즈베리파이 DC모터 4개 - lajeubelipai DCmoteo 4gae

8. 라즈베리파이 DC 모터 제어하기 2

지난 포스팅에서 라즈베리파이를 이용하여 간단하게 DC 모터 방향 및 속도 제어 방법에 대해서 알아 보았습니다.

계속 이어서 DC 모터 2개를 동시에 속도와 방향을 제어하는 방법에 대해서 같이 확인해 봅시다. 

먼저 아래 그림과 같이 DC 모터 2개를 구동하기 위한 회로를 구성해 봅시다.

외부 전원 6 Volt 사용(1.5 Volt 4개 직렬 연결)

  • L298N 모터 드라이브의 GND는 라즈베리파이의 Ground와 외부 전원의 (-) 극과 연결
  • L298N 모터 드라이브의 +12V는 외부 전원의 (+)극과 연결
  • L298N 모터 드라이브의 OUT1OUT2는 DC 모터(왼쪽)의 2개의 선과 연결(순서에 상관없이 연결 후 모터 회전 방향이 생각했던 방향과 반대로 회전하면 연결하였던 선의 순서를 변경하면 됩니다.)
  • L298N 모터 드라이브의 IN1과 라즈베리파이 GPIO 12 핀과 연결
  • L298N 모터 드라이브의 IN2와 라즈베리파이 GPIO 16 핀과 연결
  • L298N 모터 드라이브의 OUT3OUT4는 DC 모터(오른쪽)의 2개의 선과 연결
  • L298N 모터 드라이브의 IN3과 라즈베리파이 GPIO 20 핀과 연결
  • L298N 모터 드라이브의 IN4와 라즈베리파이 GPIO 21 핀과 연결

준비가 완료되었으면 2개의 모터를 동시에 제어하기 위한 파이썬 코드를 작성해보자.

지난번 포스팅에서는 DC 모터 1개를 제어하기 위해서 gpiozero.Motor()라는 Class을 사용하였지만 이 번 포스팅에서는 gpiozero.Robot()라는 Class을 사용하여 DC 모터 2개를 동시 제어합니다.

Robot Class에서 left는 왼쪽 DC 모터에 연결된 GPIO번호(12와 16)를 튜플 형식으로 입력하고 right에는 마찬가지로 오른쪽 DC 모터에 연결된 GPIO 번호(20과 21)를 입력하면 2개의 모터가 동시 제어가 가능해 집니다. 

forward(), backward()함수 내의 speed에는 0에서 1 사이의 숫자를 입력하면 입력한 숫자에 따라 DC 모터의 속도가 가변 됩니다. 1 일 때가 최대 속도입니다. 

from gpiozero import Robot

import time

dc_motor = Robot(left=(12, 16), right=(20, 21))

for num in range(4):

print(num, "Forward 회전")

dc_motor.forward(speed=1)

time.spleep(3)

print("모터 정지")

dc_motor.stop()

time.sleep(0.5)

print(num, "Backward 회전")

dc_motor.backward(speed=0.5)

time.sleep(3)

dc_motor.stop()

DC 모터 2 개가 동시에 잘 동작하나요?

앞으로 회전할 때는 최대 속도로 3 초간 회전하고 잠시(0.5초) 정지 후 50%의 속력으로 뒤로 3 초간 회전하는 것을 4회 반복할 것입니다.

오늘은 DC 모터 2개를 동시에 제어하는 방법에 대해서 알아보았습니다.  

내용 중에 잘 안되는 부분이 있으면 댓글 남겨 주세요.

Jetson Nano를 얹어서 완성된 자동차

Jetson Nano를 충동적으로 구입하고 (//practical.kr/?p=125) 테스트를 해본 후 뭘 만들까 고민을 하다가 자동차를 만들어 볼까? 생각을 했다. 전년도에 라즈베리파이를 이용해서 자동차를 만들려고 구매해 두었던 4륜 자동차 바디가 그대로 있어서 여기에 젯슨나노를 얹어 보기로 했다.

실패한이유

근데 생각해 보니 그때 라즈베리 기반의 자동차를 만들다 그만둔 이유가 라즈베리파이의 Digital I/O 의 숫자가 부족하다는걸 알고 나서였다. 바퀴하나를 구동하려면 모터드라이브 컨트롤러를 써야하는데 주로 L298N을 많이 사용한다. 대략 아래와 같은 연결로 모터 두개를 움직일 수 있다.

전원부를 제외하고 모터 4개를 구동하려면 12개의 DIO를 사용해야 한다. 라즈베리에서 IO를 모두 끌어쓰면 대충 맞긴한데 이러면 다른 작업을 전혀 할 수가 없다. 그래서 주로 2륜 구동으로 자동차를 만드는게 아닌가 하는 생각을 하고 바퀴를 새로 사기가 싫어서 그냥 그만 두고 말았다.

PCA9685

이렇게 생겼다

그래도 젯슨은 뭔가 좀 다르겠지 싶었지만 라즈베리와 젯슨나노의 IO Pin 구조는 거의(?) 동일하다. 그런데 스터디중 Nvidia – Jetbot 에서는 PCA9685 라는 컨트롤러를 쓰고 있었다. 젯슨과 I2C로 통신을 하고 16개의 dio 채널을 가진 PWM 컨트롤러 였다. 대략 아래의 그림과 같이 문어발(?)을 만들 수 있다.

//cdn-shop.adafruit.com/datasheets/PCA9685.pdf

이걸 활용하면 젯슨나노에서는 4핀의 I2C 입출력 만으로 4개의 모터를 구동할 수 있고 나머지핀들은 다른용도로 활용할 수도 있다. 택배비 포함해서 2개에 만원정도니까 비싸지도 않다.

검색을 해보면 주로 서보모터를 운용할때 사용하는데 DC모터를 제대로 컨트롤 하려면 아래 그림과 같이 L298N과 함께 연결해줘야 한다.

자동차의 하체

하체의 중간에 PCA9685를 놓고 앞뒤로 L298N 모터 컨트롤러를 연결했다.모터 구동을 위한 별도의 전원은 9V 건전지를 사용했는데 조립중 테스트에서는 별 문제 없이 바퀴가 잘 돌았는데 다 조립하고 중량이 무거워지니 전후진이 안되었다. 그래서 9V 건전지 두개를 병렬로 연결했다. 움직이긴 하는데 힘이 없었다. 역시 전기 자동차는 배터리가 중요하다. 한개 더 달던지 해야 한다.

하체 조립중

하체 조립완료

차체조립

조립후

짧은 목표가 조립 & 이동 이었기 때문에 가지고 있던 이런저런 부품들을 모아 모아 모니터, 젯슨나노 & 모니터 전원을 위한 충전 배터리 향후 사용할 카메라까지 조립을 했다.

소프트웨어

검색을 해보니 PCA9685를 활용하는 대부분의 셈플들이 서보모터 구동용이라 찾기가 쉽지는 않았는데 다행히 원래 보드 제작사에서 만든 파이썬용 라이브러리가 있었다. 링크참조

//github.com/adafruit/Adafruit_CircuitPython_Motor

//cdn-learn.adafruit.com/downloads/pdf/adafruit-16-channel-servo-driver-with-raspberry-pi.pdf

위 라이브러리를 기반으로 아래와 같은 코드를 만들어 자동차를 움직여 봤다. 잘 움직인다.

import time import busio from board import SCL, SDA from adafruit_pca9685 import PCA9685 from adafruit_motor import motor i2c = busio.I2C(SCL, SDA) pca = PCA9685(i2c, address=0x40) pca.frequency = 100 pca.channels[0].duty_cycle = 0xFFFF pca.channels[5].duty_cycle = 0xFFFF pca.channels[6].duty_cycle = 0xFFFF pca.channels[11].duty_cycle = 0xFFFF motor1 = motor.DCMotor(pca.channels[1], pca.channels[2]) motor2 = motor.DCMotor(pca.channels[3], pca.channels[4]) motor3 = motor.DCMotor(pca.channels[8], pca.channels[7]) motor4 = motor.DCMotor(pca.channels[10], pca.channels[9]) print("Forwards slow") motor1.throttle = 0.5 motor2.throttle = 0.5 motor3.throttle = 0.5 motor4.throttle = 0.5 time.sleep(3) print("Forwards") motor1.throttle = 1 motor2.throttle = 1 motor3.throttle = 1 motor4.throttle = 1 time.sleep(3) print("Backwards") motor1.throttle = -1 motor2.throttle = -1 motor3.throttle = -1 motor4.throttle = -1 time.sleep(3) print("Backwards slow") motor1.throttle = -0.5 motor2.throttle = -0.5 motor3.throttle = -0.5 motor4.throttle = -0.5 time.sleep(3) print("Stop") motor1.throttle = 0 motor2.throttle = 0 motor3.throttle = 0 motor4.throttle = 0 time.sleep(3) print("Spin freely") motor1.throttle = None motor2.throttle = None motor3.throttle = None motor4.throttle = None pca.deinit()

위 소스와 키입력으로 전, 후, 좌, 우로 이동하는 소스를 아래 링크에 공유 했다.

//github.com/bipark/jetson-nano-car

실제 젯슨 나노의 GPU를 기반으로 자동차와 함께 할 수 있는 일들이 많을것 같은데 그건 다음에 해보기로 하고 오늘은 여기까지…

글 내비게이션

Toplist

최신 우편물

태그