PCA9685 사용하기

4 minute read

PCA9685

pca9685

pca 9685 입니다.
PWM 16개 채널을 가지고 있으며 12-bit 칩입니다.

저는 SBC(ODROID-C4)를 가지고 사용했습니다.
사용방법은 크게 2가지가 있는데,
커널 드라이버를 사용하거나, Adafruit의 파이썬 패키지를 사용하면 됩니다.

여기서는 파이썬 패키지를 사용하는 방법을 정리하겠습니다.

사용 준비

개발 환경은 다음과 같습니다.

board: ODROID-C4
OS: ubuntu20.04 LTS
kernel: 4.9.y
servo: MG996R
# ODROID-C4 gpio 40 pin header
 +-----+-----+---------+------+---+--- C4 ---+---+------+---------+-----+-----+
 | I/O | wPi |   Name  | Mode | V | Physical | V | Mode |  Name   | wPi | I/O |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3V |      |   |  1 || 2  |   |      | 5V      |     |     |
 | 493 |   8 |   SDA.2 | ALT1 | 1 |  3 || 4  |   |      | 5V      |     |     |
 | 494 |   9 |   SCL.2 | ALT1 | 1 |  5 || 6  |   |      | 0V      |     |     |
 | 481 |   7 |  IO.481 |   IN | 1 |  7 || 8  | 1 | ALT1 | TxD1    | 15  | 488 |
 |     |     |      0V |      |   |  9 || 10 | 1 | ALT1 | RxD1    | 16  | 489 |
 | 479 |   0 |  IO.479 |   IN | 1 | 11 || 12 | 1 | IN   | IO.492  | 1   | 492 |
 | 480 |   2 |  IO.480 |   IN | 1 | 13 || 14 |   |      | 0V      |     |     |
 | 483 |   3 |  IO.483 |   IN | 1 | 15 || 16 | 1 | IN   | IO.476  | 4   | 476 |
 |     |     |    3.3V |      |   | 17 || 18 | 1 | IN   | IO.477  | 5   | 477 |
 | 484 |  12 |    MOSI | ALT4 | 1 | 19 || 20 |   |      | 0V      |     |     |
 | 485 |  13 |    MISO | ALT4 | 1 | 21 || 22 | 1 | IN   | IO.478  | 6   | 478 |
 | 487 |  14 |    SLCK | ALT4 | 1 | 23 || 24 | 1 | OUT  | SS      | 10  | 486 |
 |     |     |      0V |      |   | 25 || 26 | 0 | IN   | IO. 23  | 11  | 433 |
 | 474 |  30 |   SDA.3 | ALT2 | 1 | 27 || 28 | 1 | ALT2 | SCL.3   | 31  | 475 |
 | 490 |  21 |  IO.490 |   IN | 1 | 29 || 30 |   |      | 0V      |     |     |
 | 491 |  22 |  IO.491 |   IN | 1 | 31 || 32 | 0 | IN   | IO. 24  | 26  | 434 |
 | 482 |  23 |  IO.482 |   IN | 0 | 33 || 34 |   |      | 0V      |     |     |
 | 495 |  24 |  IO.495 |   IN | 0 | 35 || 36 | 1 | OUT  | IO. 22  | 27  | 432 |
 |     |  25 |   AIN.2 |      |   | 37 || 38 |   |      | 1V8     | 28  |     |
 |     |     |      0V |      |   | 39 || 40 |   |      | AIN.0   | 29  |     |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | I/O | wPi |   Name  | Mode | V | Physical | V | Mode |  Name   | wPi | I/O |
 +-----+-----+---------+------+---+--- C4 ---+---+------+---------+-----+-----+

C4 부팅 후 보드에서 다음 과정들을 진행합니다.

회로 구성

i2c 장치를 찾고 i2c-0에 pca9685를 붙일 예정입니다.

(i2c 장치 찾기)
$ ls /dev/i2c*
/dev/i2c-0

pca9685

pca9685 gpio 40 pin
Vcc 1
SDA 3
SCL 5
GND 9

/dev/i2c-0 장치가 없는 경우 여기를 확인하세요.

(장치연결 확인)
$ sudo apt update
$ sudo apt-get install i2c-tools
$ i2cdetect -y 0


모터는 위에 pca9685 사진에서 왼쪽부터 0 ~ 15 채널입니다.
신호선, 파워선, 접지선 맞춰서 연결하면 됩니다.
pca9685 외부 입력은 6V/3A를 사용했습니다.

소프트웨어

파이썬 패키지 설치 이전에 필요한 패키지를 먼저 설치합니다.

$ sudo apt update
$ sudo apt-get install build-essential python3 python3-dev python3-venv


pca9685전용 pip패키지를 설치합니다.
가상환경을 따로 세팅할 경우, 가상환경을 만들어 줍니다.

$ python3 -m venv .venv/pca9685
$ source .venv/pca9685/bin/activate
$ sudo python3 -m pip install --upgrade pip
$ sudo python3 -m pip install adafruit-circuitpython-pca9685 \
  adafruit-python-shell click wheel \
  Adafruit-Blinka \
  adafruit-circuitpython-register \
  adafruit-circuitpython-busdevice


끔찍한 요구사항이 하나 있는데 설치해줍니다.

$ cd ~
$ wget https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/libgpiod.py
$ sudo python3 libgpiod.py # 라즈베리파이가 아니면 오류가 엄청 나오는데 무시
$ git clone https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/
$ cd libgpiod
$ git checkout v1.4.2 -b v1.4.2
$ sudo ./autogen.sh --enable-tools=yes --prefix=/usr/local/ --enable-bindings-python CFLAGS="-I/$include_path"
$ sudo make
$ sudo ldconfig
$ sudo cp bindings/python/.libs/gpiod.* /usr/local/lib/python3.?/dist-packages/


설치가 다 끝났으면 예제 코드를 다운로드 및 실행합니다.
사용할 서보모터는 MG996R 입니다.
모터 주파수는 50Hz, 가용 듀티비는 약 5~10%정도 이므로 코드를 일부 수정해야합니다.

$ cd ~
$ git clone https://github.com/adafruit/Adafruit_CircuitPython_PCA9685.git
$ cd Adafruit_CircuitPython_PCA9685
$ vi examples/pca9685_simpletest.py
from board import SCL, SDA
import busio
...

pca.frequency = 50
pca.channel[0].duty_cycle = 0x1FFF
...


수정 후 실행합니다.

$ sudo python3 examples/pca9685_simpletest.py

Leave a comment