rpi-arduino-pin 0.2.4
A Python library for controlling Raspberry Pi GPIO, I2C, SPI and communicating with Arduino via serial.
Requires Python: >=3.6

# `pin.py`: Raspberry Pi & Arduino 제어 라이브러리

`pin.py`는 라즈베리파이의 GPIO 핀을 직접 제어하고, 시리얼 통신을 통해 아두이노를 제어할 수 있는 기능을 제공하는 파이썬 라이브러리입니다. `Rasp` 클래스와 `Ard` 클래스로 구성되어 있습니다.

## 주요 기능

- **라즈베리파이 GPIO 제어 (`Rasp` 클래스):**
  - 디지털 입력/출력
  - 초음파 센서(HC-SR04) 거리 측정
  - 서보 모터 제어 (PWM)
  - 인터럽트(Edge) 감지
- **아두이노 시리얼 제어 (`Ard` 클래스):**
  - 디지털/아날로그 입출력
  - 서보 모터 제어
  - **인터럽트(Edge) 감지**
  - 다중 아두이노 지원

## 설치 및 요구사항

### pip 를 통해 설치
```bash
pip install rpi-arduino-pin
```
*주의: `gpiozero` 라이브러리는 `rpi-arduino-pin` 설치 시 자동으로 함께 설치됩니다.*
### 주의
* 이 라이브러리는 RaspberryPi 환경에서만 사용할수 있습니다.

### 아두이노 설정
`Ard` 클래스를 사용하려면, `pin.py`에서 보내는 시리얼 명령어를 해석하여 실행할 수 있는 스케치가 아두이노에 업로드되어 있어야 합니다. (`pin/Ard_ino/ard.ino` 파일 참조)

---

## `Rasp` 클래스 사용법 (라즈베리파이)

### 1. 초기화 및 정리
GPIO를 사용하기 전에 `Setup`을 호출하고, 사용이 끝나면 `Clean`을 호출하여 리소스를 정리해야 합니다.

```python
from pin import Rasp
import time

# GPIO 핸들 초기화
Rasp.Setup()

try:
    # 여기에 코드 작성
    Rasp.Write(17, 1) # GPIO 17번 핀에 HIGH 출력
    time.sleep(1)
    print(f"GPIO 17번 핀 상태: {Rasp.Read(17)}")

finally:
    # 사용한 모든 핀을 정리하고 핸들을 닫습니다.
    Rasp.Clean()
    print("GPIO가 정리되었습니다.")
```

### 2. 디지털 입출력

- `Rasp.Write(pin_num, value)`: `value` (0 또는 1)를 지정된 핀에 출력합니다.
- `Rasp.Read(pin_num)`: 지정된 핀의 디지털 값을 읽어 0 또는 1을 반환합니다.

### 3. 초음파 센서 거리 측정

- `Rasp.GetDistance(trig_pin, echo_pin)`: 트리거 핀과 에코 핀을 사용하여 거리를 cm 단위로 측정합니다.

```python
# Trig: GPIO 23, Echo: GPIO 24
distance = Rasp.GetDistance(23, 24)
if distance != -1:
    print(f"측정된 거리: {distance:.2f} cm")
else:
    print("측정 실패")
```

### 4. 서보 모터 제어

`Rasp` 클래스의 서보 모터 제어는 내부적으로 `gpiozero` 라이브러리를 사용합니다. 이는 라즈베리파이 5와 같은 최신 모델에서 서보 제어의 안정성과 호환성을 높이기 위함입니다.

- `Rasp.ServoWrite(pin_num, angle)`: 지정된 핀에 연결된 서보 모터를 `angle` (0~180도)만큼 회전시킵니다.
- `Rasp.ServoStop(pin_num)`: 서보 모터 작동을 중지합니다.

```python
# GPIO 18번 핀에 연결된 서보 모터
Rasp.ServoWrite(18, 90) # 90도로 회전
time.sleep(1)
Rasp.ServoStop(18)
```

---

## `Ard` 클래스 사용법 (아두이노)

`Ard` 클래스는 이제 인스턴스 기반으로 작동하며, 여러 아두이노를 동시에 제어할 수 있습니다. 핀 모드 설정은 각 메소드 호출 시 자동으로 처리됩니다.

### 1. 아두이노 연결 및 종료
아두이노와 통신을 시작하려면 `Ard` 객체를 생성하고, 사용이 끝나면 `close` 메소드를 호출합니다.

```python
from pin import Ard
import time

# 아두이노와 시리얼 연결 시작 (포트와 보드레이트 지정)
# 여러 아두이노를 연결하려면 각각 다른 포트로 Ard 객체를 생성합니다.
uno = Ard(port="/dev/ttyACM0", baud=9600)
# mega = Ard(port="/dev/ttyACM1", baud=9600) # 예시: 두 번째 아두이노

try:
    # LED를 1초간 켭니다. (핀 모드 자동 설정)
    uno.write(13, 1) # 13번 핀에 HIGH 출력
    time.sleep(1)
    uno.write(13, 0) # 13번 핀에 LOW 출력

    # 아날로그 값 읽기
    # sensor_val = uno.analog_read(A0) # A0 핀의 아날로그 값 읽기
    # print(f"A0 핀 아날로그 값: {sensor_val}")

finally:
    # 아두이노 연결을 닫고 서보를 해제합니다.
    uno.close()
    # mega.close() # 예시: 두 번째 아두이노 정리
    print("아두이노 연결이 종료되었습니다.")
```

### 2. 핀 제어

- `instance.write(pin_num, value)`: 디지털 핀에 `value` (0 또는 1)를 씁니다. (자동으로 `OUTPUT` 모드 설정)
- `instance.read(pin_num)`: 디지털 핀의 값을 읽습니다. (자동으로 `INPUT` 모드 설정)
- `instance.analog_write(pin_num, value)`: 아날로그(PWM) 핀에 `value` (0~255)를 씁니다. (자동으로 `OUTPUT` 모드 설정)
- `instance.analog_read(pin_num)`: 아날로그 핀의 값을 읽습니다. (자동으로 `INPUT` 모드 설정)

### 3. 서보 모터 제어

- `instance.servo_write(pin_num, angle)`: 아두이노의 지정된 핀에 연결된 서보 모터를 `angle` (0~180도)만큼 회전시킵니다.
- `instance.servo_stop(pin_num)`: 서보 모터 작동을 중지합니다.