지난 글에서 아두이노를 이용한 로봇 제어의 기본 프로그래밍 개념들을 알아보았습니다. 아두이노가 로봇의 '근육'과 '감각'을 제어하는 데 최적화되어 있다면, 이제 라즈베리 파이와 함께 로봇에 더욱 복잡하고 강력한 '지능'을 부여할 차례입니다. 라즈베리 파이는 단순한 마이크로컨트롤러를 넘어 작은 컴퓨터에 가까우며, 배우기 쉽고 활용도가 높은 파이썬(Python) 언어를 통해 그 잠재력을 최대한 발휘합니다. 이 글에서는 라즈베리 파이 설정부터 파이썬 프로그래밍의 기본 문법, 그리고 이를 활용하여 로봇을 제어하는 방법까지 상세히 안내하며, 인공지능 기반의 똑똑한 로봇을 향한 첫 걸음을 내딛게 될 것입니다.

로봇만들기

왜 라즈베리 파이와 파이썬인가?

아두이노가 간단하고 실시간 제어에 강점을 가진다면, 라즈베리 파이는 다음과 같은 이유로 더욱 복잡하고 지능적인 로봇 프로젝트에 적합합니다.

  • 강력한 연산 능력: 멀티코어 프로세서와 충분한 RAM을 갖춰 이미지 처리, 음성 인식, 복잡한 인공지능 알고리즘 실행 등 고성능 연산이 필요한 작업을 수행할 수 있습니다.
  • 운영체제 (OS) 지원: 리눅스(Linux) 기반의 운영체제를 통해 다양한 소프트웨어를 설치하고, 네트워크 통신, 파일 시스템 관리 등 일반 컴퓨터와 유사한 기능을 활용할 수 있습니다.
  • 풍부한 라이브러리 생태계: 파이썬을 주력 언어로 사용하며, 파이썬은 인공지능, 데이터 과학, 웹 개발 등 다양한 분야에서 강력한 라이브러리(예: NumPy, OpenCV, TensorFlow)를 제공하여 로봇의 기능을 무한히 확장할 수 있습니다.
  • 다양한 인터페이스: USB, HDMI, 이더넷, Wi-Fi, Bluetooth 등 다양한 포트를 통해 외부 장치 연결 및 통신이 용이합니다.

라즈베리 파이 설정 및 개발 환경 준비

라즈베리 파이를 로봇의 두뇌로 사용하기 전에 기본적인 설정이 필요합니다.

  1. 운영체제 설치 (Raspberry Pi OS):
    • 라즈베리 파이 이미저(Raspberry Pi Imager) 도구를 사용하여 SD 카드에 Raspberry Pi OS Lite (64-bit) 버전을 설치하는 것을 추천합니다. 데스크톱 환경이 없는 Lite 버전은 더 가볍고 로봇 제어에 필요한 리소스만 사용합니다.
    • 설치 시 SSH 활성화 및 사용자 이름/비밀번호 설정, Wi-Fi 설정 등을 미리 해두면 편리합니다.
  2. 원격 접속 (SSH):
    • 모니터, 키보드 없이 PC에서 라즈베리 파이에 접속하여 명령어를 입력할 수 있는 SSH(Secure Shell)를 설정합니다. PuTTY (Windows) 또는 터미널(macOS/Linux)을 사용합니다.
    • ssh 사용자이름@라즈베리파이_IP주소 명령으로 접속합니다.
  3. 파이썬 환경 설정:
    • Raspberry Pi OS에는 파이썬이 기본 설치되어 있습니다.
    • 필요한 라이브러리는 pip 명령어를 사용하여 설치합니다. (예: pip install RPi.GPIO numpy opencv-python)

파이썬 프로그래밍 기본 개념

파이썬은 매우 직관적이고 배우기 쉬운 언어입니다. 아두이노(C/C++ 기반)와는 문법이 다르지만, 기본적인 프로그래밍 논리는 유사합니다.

1. 변수와 자료형

파이썬에서는 변수를 선언할 때 자료형을 명시하지 않습니다. 값이 할당될 때 자동으로 자료형이 결정됩니다.

  • 숫자: int (정수), float (실수)
    Python
    motor_speed = 150 # 정수
    distance = 25.7 # 실수
    
  • 문자열: str
    Python
    robot_name = "RoboMaster"
    
  • 불린: bool (True/False)
    Python
    obstacle_detected = False
    
  • 리스트 (List): 여러 값을 순서대로 저장하는 컬렉션 (변경 가능)
    Python
    sensor_readings = [10, 20, 15, 22]
    
  • 튜플 (Tuple): 여러 값을 순서대로 저장하는 컬렉션 (변경 불가능)
    Python
    robot_position = (0, 0, 0) # (x, y, z)
    
  • 딕셔너리 (Dictionary): '키(Key):값(Value)' 쌍으로 데이터를 저장하는 컬렉션
    Python
    robot_status = {"speed": 100, "battery": 85, "mode": "idle"}
    

2. 연산자

산술, 비교, 논리 연산자는 아두이노와 유사하지만, and, or, not 키워드를 사용합니다.

  • 산술: +, -, *, /, // (정수 나눗셈), % (나머지), ** (거듭제곱)
  • 비교: ==, !=, >, <, >=, <=
  • 논리: and, or, not

3. 조건문 (if, elif, else)

조건에 따라 다른 코드를 실행합니다. 들여쓰기(indentation)로 코드 블록을 구분하는 것이 파이썬의 특징입니다.

Python
distance = 15

if distance < 10:
    print("너무 가까워요! 정지합니다.")
    # stop_motors()
elif 10 <= distance < 30: # 10 이상 30 미만
    print("장애물 근접! 속도를 줄입니다.")
    # set_motor_speed(50)
else:
    print("경로가 깨끗합니다. 전진합니다.")
    # set_motor_speed(150)

4. 반복문 (for, while)

특정 작업을 반복합니다.

  • for 문: 컬렉션의 요소를 하나씩 순회하거나, 정해진 횟수만큼 반복할 때 사용합니다.
    Python
    # 5번 반복
    for i in range(5): # i는 0, 1, 2, 3, 4
        print(f"로봇이 {i+1}번째 동작을 수행합니다.")
    
    # 리스트의 모든 센서 값 출력
    sensor_values = [100, 250, 180]
    for value in sensor_values:
        print(f"센서 값: {value}")
    
  • while 문: 조건이 참인 동안 반복합니다.
    Python
    battery_level = 100
    
    while battery_level > 20:
        print(f"배터리 잔량: {battery_level}%")
        # robot_move_forward()
        battery_level -= 5 # 배터리 감소 시뮬레이션
        if battery_level <= 20:
            print("배터리 부족! 충전하세요.")
            break # 반복문 탈출
        time.sleep(1)
    

5. 함수 (Functions)

코드의 재활용성과 가독성을 높입니다. def 키워드를 사용하여 함수를 정의합니다.

Python
def move_forward(speed):
    """로봇을 전진시키는 함수"""
    print(f"로봇이 {speed} 속도로 전진합니다.")
    # 여기에 라즈베리 파이 GPIO를 이용한 모터 제어 코드 작성

def stop_motors():
    """로봇을 정지시키는 함수"""
    print("로봇이 정지합니다.")
    # 여기에 모터 정지 코드 작성

# 함수 호출
move_forward(100)
time.sleep(2)
stop_motors()

6. 모듈과 라이브러리 임포트

파이썬은 모듈(파일)과 라이브러리(모듈 묶음)를 import하여 기능을 확장합니다.

Python
import time # 시간 관련 함수를 제공하는 기본 모듈

# 라즈베리 파이 GPIO 제어 라이브러리 (별도 설치 필요: pip install RPi.GPIO)
import RPi.GPIO as GPIO

# OpenCV 라이브러리 (별도 설치 필요: pip install opencv-python)
import cv2

print(time.ctime()) # 현재 시간 출력

라즈베리 파이로 로봇 제어하기 (GPIO 활용)

라즈베리 파이는 GPIO(General Purpose Input/Output) 핀을 통해 외부 하드웨어(모터, 센서 등)를 제어합니다. RPi.GPIO 라이브러리가 이 역할을 수행합니다.

  • GPIO 핀 설정:
    • GPIO.setmode(GPIO.BCM): 핀 번호를 BCM 모드로 설정 (GPIO 번호 사용).
    • GPIO.setup(핀번호, GPIO.OUT) 또는 GPIO.setup(핀번호, GPIO.IN): 핀을 출력 또는 입력으로 설정.
  • 디지털 출력 (LED 깜빡이기 예제):
    Python
    import RPi.GPIO as GPIO
    import time
    
    LED_PIN = 17 # 라즈베리 파이 GPIO 17번 핀
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED_PIN, GPIO.OUT)
    
    try:
        while True:
            GPIO.output(LED_PIN, GPIO.HIGH) # LED 켜기 (HIGH는 3.3V)
            time.sleep(0.5)
            GPIO.output(LED_PIN, GPIO.LOW)  # LED 끄기 (LOW는 0V)
            time.sleep(0.5)
    except KeyboardInterrupt:
        GPIO.cleanup() # 프로그램 종료 시 GPIO 설정 초기화 (필수)
    
  • PWM 제어 (모터 속도/서보 각도):
    • GPIO.PWM(핀번호, 주파수): PWM 객체 생성.
    • pwm.start(듀티사이클): PWM 시작 (0~100).
    • pwm.ChangeDutyCycle(새_듀티사이클): 듀티 사이클 변경.
    • pwm.stop(): PWM 정지.
  • 센서 데이터 읽기:
    • 디지털 센서: GPIO.input(핀번호)로 읽기. (예: 버튼)
    • 아날로그 센서: 라즈베리 파이는 ADC(Analog-to-Digital Converter)가 내장되어 있지 않아, 별도의 ADC 모듈(예: MCP3008)을 SPI 통신으로 연결하여 아날로그 값을 읽어야 합니다.

라즈베리 파이 기반 로봇 프로젝트 예시

라즈베리 파이는 다음과 같은 복잡한 로봇 프로젝트에 강력한 이점을 제공합니다.

  • 자율 주행 로봇: 카메라와 OpenCV를 활용한 도로 및 표지판 인식, LIDAR 센서를 이용한 맵핑 및 위치 추정 (SLAM), 경로 계획.
  • 인공지능 로봇: TensorFlow Lite나 PyTorch Mobile을 이용한 객체 인식, 음성 인식(Google Assistant API, CMU Sphinx), 자연어 처리.
  • 로봇 팔: 역운동학(Inverse Kinematics) 계산, 비전 시스템을 이용한 물체 파악 및 조작.
  • 원격 제어 로봇: Wi-Fi 또는 이더넷을 통한 웹 기반 제어, 스트리밍 비디오 전송.
  • ROS (Robot Operating System) 기반 로봇: 로봇 개발의 표준 프레임워크인 ROS를 라즈베리 파이에 설치하여 복잡한 로봇 시스템을 구축합니다. (다음 편에서 자세히 다룰 예정)

개발 팁 및 주의사항

  • 전원 공급: 라즈베리 파이는 안정적인 고전류(모델에 따라 2.5A ~ 3A 이상) 5V 전원 공급이 필수입니다. 불안정한 전원은 오작동의 주원인이 됩니다.
  • GPIO 보호: GPIO 핀은 3.3V 논리 레벨을 사용하며, 5V 신호나 과전류에 취약합니다. 5V 센서나 모듈과 연결 시 레벨 쉬프터(Level Shifter) 또는 적절한 저항을 사용해야 합니다.
  • GPIO.cleanup(): 프로그램 종료 시 GPIO.cleanup()을 호출하여 사용했던 GPIO 핀 설정을 초기화하는 것이 중요합니다. 그렇지 않으면 다음 프로그램 실행 시 오류가 발생할 수 있습니다.
  • 오류 메시지 확인: 파이썬은 오류 발생 시 상세한 트레이스백(Traceback)을 제공하므로, 이를 꼼꼼히 읽어 문제의 원인을 파악하세요.
  • 주석 및 문서화: 복잡한 파이썬 코드를 작성할 때는 주석을 충분히 달고, 함수나 클래스에 Docstring을 작성하여 코드의 가독성을 높이고 유지보수를 용이하게 합니다.

마무리하며...

이번 글에서는 로봇에 고급 지능을 부여하는 데 필수적인 라즈베리 파이와 파이썬 프로그래밍의 기초를 알아보았습니다. 라즈베리 파이의 강력한 연산 능력과 파이썬의 풍부한 라이브러리는 여러분의 로봇을 단순한 기계에서 벗어나 환경을 인식하고, 판단하며, 자율적으로 행동하는 지능적인 존재로 만들 수 있는 무한한 가능성을 열어줄 것입니다. 아두이노와 라즈베리 파이의 장점을 이해하고 적절히 활용하는 것이 성공적인 로봇 프로젝트의 핵심입니다.

다음 편에서는 로봇이 스스로 주변을 탐색하고 목표를 찾아가는 로봇 자율 주행의 첫걸음, 장애물 회피 알고리즘 구현에 대해 자세히 다룰 예정입니다. 센서 데이터를 바탕으로 로봇이 스스로 길을 찾아가는 방법을 배우게 될 것입니다. 이제 여러분의 라즈베리 파이로 간단한 파이썬 코드를 실행해 보고, GPIO 핀을 제어하여 LED를 깜빡이거나 모터를 움직여 보세요!