월세가 월급의 36퍼센트 소득 3분의 1이 주거비로 사라지는 서울의 현실
지난 글에서 아두이노를 이용한 로봇 제어의 기본 프로그래밍 개념들을 알아보았습니다. 아두이노가 로봇의 '근육'과 '감각'을 제어하는 데 최적화되어 있다면, 이제 라즈베리 파이와 함께 로봇에 더욱 복잡하고 강력한 '지능'을 부여할 차례입니다. 라즈베리 파이는 단순한 마이크로컨트롤러를 넘어 작은 컴퓨터에 가까우며, 배우기 쉽고 활용도가 높은 파이썬(Python) 언어를 통해 그 잠재력을 최대한 발휘합니다. 이 글에서는 라즈베리 파이 설정부터 파이썬 프로그래밍의 기본 문법, 그리고 이를 활용하여 로봇을 제어하는 방법까지 상세히 안내하며, 인공지능 기반의 똑똑한 로봇을 향한 첫 걸음을 내딛게 될 것입니다.
아두이노가 간단하고 실시간 제어에 강점을 가진다면, 라즈베리 파이는 다음과 같은 이유로 더욱 복잡하고 지능적인 로봇 프로젝트에 적합합니다.
라즈베리 파이를 로봇의 두뇌로 사용하기 전에 기본적인 설정이 필요합니다.
ssh 사용자이름@라즈베리파이_IP주소 명령으로 접속합니다.pip 명령어를 사용하여 설치합니다. (예: pip install RPi.GPIO numpy opencv-python)파이썬은 매우 직관적이고 배우기 쉬운 언어입니다. 아두이노(C/C++ 기반)와는 문법이 다르지만, 기본적인 프로그래밍 논리는 유사합니다.
파이썬에서는 변수를 선언할 때 자료형을 명시하지 않습니다. 값이 할당될 때 자동으로 자료형이 결정됩니다.
int (정수), float (실수)
motor_speed = 150 # 정수
distance = 25.7 # 실수
str
robot_name = "RoboMaster"
bool (True/False)
obstacle_detected = False
sensor_readings = [10, 20, 15, 22]
robot_position = (0, 0, 0) # (x, y, z)
robot_status = {"speed": 100, "battery": 85, "mode": "idle"}
산술, 비교, 논리 연산자는 아두이노와 유사하지만, and, or, not 키워드를 사용합니다.
+, -, *, /, // (정수 나눗셈), % (나머지), ** (거듭제곱)==, !=, >, <, >=, <=and, or, not조건에 따라 다른 코드를 실행합니다. 들여쓰기(indentation)로 코드 블록을 구분하는 것이 파이썬의 특징입니다.
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)
특정 작업을 반복합니다.
for 문: 컬렉션의 요소를 하나씩 순회하거나, 정해진 횟수만큼 반복할 때 사용합니다.
# 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 문: 조건이 참인 동안 반복합니다.
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)
코드의 재활용성과 가독성을 높입니다. def 키워드를 사용하여 함수를 정의합니다.
def move_forward(speed):
"""로봇을 전진시키는 함수"""
print(f"로봇이 {speed} 속도로 전진합니다.")
# 여기에 라즈베리 파이 GPIO를 이용한 모터 제어 코드 작성
def stop_motors():
"""로봇을 정지시키는 함수"""
print("로봇이 정지합니다.")
# 여기에 모터 정지 코드 작성
# 함수 호출
move_forward(100)
time.sleep(2)
stop_motors()
파이썬은 모듈(파일)과 라이브러리(모듈 묶음)를 import하여 기능을 확장합니다.
import time # 시간 관련 함수를 제공하는 기본 모듈
# 라즈베리 파이 GPIO 제어 라이브러리 (별도 설치 필요: pip install RPi.GPIO)
import RPi.GPIO as GPIO
# OpenCV 라이브러리 (별도 설치 필요: pip install opencv-python)
import cv2
print(time.ctime()) # 현재 시간 출력
라즈베리 파이는 GPIO(General Purpose Input/Output) 핀을 통해 외부 하드웨어(모터, 센서 등)를 제어합니다. RPi.GPIO 라이브러리가 이 역할을 수행합니다.
GPIO.setmode(GPIO.BCM): 핀 번호를 BCM 모드로 설정 (GPIO 번호 사용).GPIO.setup(핀번호, GPIO.OUT) 또는 GPIO.setup(핀번호, GPIO.IN): 핀을 출력 또는 입력으로 설정.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 설정 초기화 (필수)
GPIO.PWM(핀번호, 주파수): PWM 객체 생성.pwm.start(듀티사이클): PWM 시작 (0~100).pwm.ChangeDutyCycle(새_듀티사이클): 듀티 사이클 변경.pwm.stop(): PWM 정지.GPIO.input(핀번호)로 읽기. (예: 버튼)라즈베리 파이는 다음과 같은 복잡한 로봇 프로젝트에 강력한 이점을 제공합니다.
GPIO.cleanup(): 프로그램 종료 시 GPIO.cleanup()을 호출하여 사용했던 GPIO 핀 설정을 초기화하는 것이 중요합니다. 그렇지 않으면 다음 프로그램 실행 시 오류가 발생할 수 있습니다.이번 글에서는 로봇에 고급 지능을 부여하는 데 필수적인 라즈베리 파이와 파이썬 프로그래밍의 기초를 알아보았습니다. 라즈베리 파이의 강력한 연산 능력과 파이썬의 풍부한 라이브러리는 여러분의 로봇을 단순한 기계에서 벗어나 환경을 인식하고, 판단하며, 자율적으로 행동하는 지능적인 존재로 만들 수 있는 무한한 가능성을 열어줄 것입니다. 아두이노와 라즈베리 파이의 장점을 이해하고 적절히 활용하는 것이 성공적인 로봇 프로젝트의 핵심입니다.
다음 편에서는 로봇이 스스로 주변을 탐색하고 목표를 찾아가는 로봇 자율 주행의 첫걸음, 장애물 회피 알고리즘 구현에 대해 자세히 다룰 예정입니다. 센서 데이터를 바탕으로 로봇이 스스로 길을 찾아가는 방법을 배우게 될 것입니다. 이제 여러분의 라즈베리 파이로 간단한 파이썬 코드를 실행해 보고, GPIO 핀을 제어하여 LED를 깜빡이거나 모터를 움직여 보세요!
댓글
댓글 쓰기