ASRock BC-250 보드 RAZER CORE X CHROMA 에 설치하기 5

주문 제작 하였던 브라켓이 도착하였다.  재질은 철이 아니고 알루미늄이라 그런지 상당히 가볍고 잘못하면 휘어질 것 같은 느낌이 든다. 제작하고 수령하기 까지 거의 3주라는 긴 시간이 걸렸다. 원래 이렇게 까지 걸리진 않는데 원인은 가공 엔지니어로 부터 온 메일을 확인하지 않고 3일이나 흐른 뒤에 답장을 하였고, 연말 기간도 걸려서 늦어져 버렸다. BC-250 카드에 기존 브라켓을 제거하고 새로 설계한 브라켓을 달아보니 아주 잘 맞았다. 버튼도 잘 눌리고 이더넷, USB, DP 포트 모두 사용에 문제가 없다. 이렇게 보고 나서 알아차린 부분이지만 하단 쪽에 고정 다리를 추가한다는 것을 빼먹었다. 다시 만드는 건 금액도 만만치 않았기 때문에 수정해서 발주를 다시 넣지는 않을 예정이고 튼튼하게 고정하기 위해 다른 솔루션을 찾아 보려고 한다. 사실 브라켓을 설계한 건 설치 문제도 있지만 완성된 시스템이 외관상으로 봤을 때 튀는 부분 없이 완성도가 높아 보이길 원했기 때문이다. 이렇게 보니 모양도 그럴싸하고 원래 이런 제품일지도 모른다는 착각도 든다. 타공 모양도 벌집 모양으로 했으면 더 완벽했겠지만 만드는 동안에는 그런 생각 없이 만들었기 때문에 큰 후회는 없다. 장착 되어있던 USB 허브 보드 대신 사용될 PCB도 도착하였다. 기존 허브 보드와 비교하자면 사이즈만 많이 커졌지만 브라켓과 호환이 되는지 확인하였고 장착하는 데는 문제가 없을 것으로 예상하고 있다.  지금 보니 오디오 앰프가 꼭 있어야 했는지 살짝 욕심이 과했다는 생각도 든다. 조립에 사용될 부품들은 아직 수급 중이며 차근차근 조립을 해 나갈 예정이다. 먼저 설계했던 PSU 전원 컨트롤 보드는 다음과 같이 장착 되었고 주요 동작에는 큰 이상이 없으나 몇 가지 수정 사항이 생겼다. 수정 사항은 허브 보드을 새로 설계하면서 발생한 것으로 두 보드 간에 별도의 통신 선이 연결된다. 사실 이렇게 기능을 분리할 필요는 없었는데 첫 번째로 만든 보드에서 하드웨어 적으로 누락된 기능이 있기 때문에 허...

Radxa Zero 3W GPIO 제어하기


Radxa Zero 3W 모델이다. 나온지 좀 된 모델이고 RK3566은 에뮬레이터 게임기에도 많이 사용되고 있는 칩이다. 가격은 RaspberryPi Zero 2W 랑 가격 차이는 별로 안나지만 성능은 확실히 차이가 있다.

1. 동작 클럭이 더 높다. 그러나 발열도 더 느껴진다

2. LPDDR4 를 지원하여, LPDDR2 보다 더 빠른 전송 속도와 넓은 대역폭 그리고 저전력으로 동작한다. 

3. eMMC 추가 옵션

4. 외부 안테나 지원 (오버레이로 내장 외장 안테나 선택 가능 [sudo rsetup] )

5. 더 좋은 네트워크 및 무선 연결 

6. RaspberryPi 와 동일한 레이아웃의 GPIO 헤더, 전원 및 그라운드의 위치 동일

7. 기본적으로 핀들이 I2C, UART, SPI 등의 기능에 할당되어있다.
    사용하려면 디바이스 트리구조를 수정해야 한다.

8. GPIO 제어를 위해 libgpiod 를 사용하지만 gpiochip* 넘버와 line* 넘버를 설정하여 코드를 작성해야한다.
    이런 점은 RaspberryPi 의 RPi.GPIO 보다 다소 귀찮다고 할수 있다.

9. USB C 타입 사용


이런 점들을 보면 RaspberryPi Zero 2W 와 비교해보면 성능에 비해 가격이 저렴하게 느껴진다.

하지만 운용면에서는 다소 불편 할수도 있다.


Radxa Zero 3W는 GPIO 를 제어하려면 libgpiod 를 사용해야한다.

먼저 아래 명령어를 입력해서 라이브러리를 설치한다.


sudo apt update
sudo apt install libgpiod-dev

문서에 보면 각 핀 정보를 알아 볼 수 있다.

만일 본인이 핀을 설정하여 프로그램을 작성하였으나 의도대로 동작하지 않는다면 이미 해당 핀이 다른기능으로 설정이 되어있거나 사용중인 것일수도 있다.

다음 사용할 핀들을 알아보기 위해 아래 명령어를 입력한다.

gpioinfo gpiochip3

line 뒤에오는 숫자가 라인 넘버이고 PIN_*  이런식으로 이름이 붙은 것은 실체 핀의 넘버와 일치한다.

RaspberryPi 처럼 깔끔하게 정리되어있지는 않고 이렇게 각 gpiochip* 에 여기저기 퍼져있다.

어떻게 운용 할지는 본인의 선택이다.


다음은 PIN 11, 13, 12, 15 에 연결된 릴레이를 제어하는 간단한 c 예제이다.

어떤 보드가 되었건 기본은 켜고 끄는것 부터 시작이다.

#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>

// 상수 정의
#define CHIP_NAME "gpiochip3" // 사용할 GPIO 칩 이름
#define INTERVAL 100000 // 간격 (마이크로초)

// 사용할 GPIO 라인 번호
int gpio_lines[] = {1, 2, 3, 8}; // 핀 헤더 11, 13, 12, 15 에 해당
int num_lines = sizeof(gpio_lines) / sizeof(gpio_lines[0]);

// 함수 선언
struct gpiod_chip* initialize_chip(const char *chipname);
int initialize_lines(struct gpiod_chip *chip, struct gpiod_line *lines[], int *gpio_lines, int num_lines);
void control_gpio(struct gpiod_line *lines[], int *gpio_lines, int num_lines, int interval);
void release_resources(struct gpiod_chip *chip, struct gpiod_line *lines[], int num_lines);

int main() {
struct gpiod_chip *chip;
struct gpiod_line *lines[4]; // 최대 4개의 GPIO 라인 관리

// GPIO 칩 초기화
chip = initialize_chip(CHIP_NAME);
if (!chip) return 1;

// GPIO 라인 초기화
if (initialize_lines(chip, lines, gpio_lines, num_lines) < 0) {
gpiod_chip_close(chip);
return 1;
}

// GPIO 제어
control_gpio(lines, gpio_lines, num_lines, INTERVAL);

// 리소스 해제
release_resources(chip, lines, num_lines);

return 0;
}

// GPIO 칩 초기화 함수
struct gpiod_chip* initialize_chip(const char *chipname) {
struct gpiod_chip *chip = gpiod_chip_open_by_name(chipname);
if (!chip) {
perror("gpiod_chip_open");
}
return chip;
}

// GPIO 라인 초기화 함수
int initialize_lines(struct gpiod_chip *chip, struct gpiod_line *lines[], int *gpio_lines, int num_lines) {
for (int i = 0; i < num_lines; i++) {
lines[i] = gpiod_chip_get_line(chip, gpio_lines[i]);
if (!lines[i]) {
perror("gpiod_chip_get_line");
return -1;
}

// GPIO를 출력으로 요청
if (gpiod_line_request_output(lines[i], "gpio_control", 0) < 0) {
perror("gpiod_line_request_output");
return -1;
}
}
return 0;
}

// GPIO 제어 함수
void control_gpio(struct gpiod_line *lines[], int *gpio_lines, int num_lines, int interval) {
for (int i = 0; i < num_lines; i++) {
gpiod_line_set_value(lines[i], 1); // GPIO On
printf("GPIO C3-L%d: ON\n", gpio_lines[i]);
usleep(interval);
gpiod_line_set_value(lines[i], 0); // GPIO Off
printf("GPIO C3-L%d: OFF\n", gpio_lines[i]);
usleep(interval);
}
}

// 리소스 해제 함수
void release_resources(struct gpiod_chip *chip, struct gpiod_line *lines[], int num_lines) {
for (int i = 0; i < num_lines; i++) {
gpiod_line_release(lines[i]);
}
gpiod_chip_close(chip);
}


아래 명령어를 사용해서 컴파일하고 실행한다.


gcc gpio_test.c -o gpio_test -lgpiod sudo ./gpio_test

다음과 영상과 같이 릴레이가 동작한다면 성공이다.






Comments

Popular posts from this blog

[POE] - 패스 오브 엑자일 획득키 F 의 사용법 (Path of Exile)

[AD보드] - 맥북 패널을 모니터로 만들기 ( LP154WP4-TLA1 )

[Arduino] - HC-06를 이용해 PC 와 Arduino 블루투스 연결