코드 검색

코스 레슨 10개 중 8번째: 라즈베리 파이 피코 스마트 카 – 레슨 8: 서보 모터와 객체 추적

이 수업은 일부입니다.: 라즈베리파이 피코 4WD 스마트카

코스 레슨 10개 중 8번째: 라즈베리 파이 피코 스마트 카 – 레슨 8: 서보 모터와 객체 추적

Robojax의 Raspberry Pi Pico 스마트 자동차 과정에서 제공하는 이 강의는 서보 모터의 기능과 이를 활용하여 물체 추적 또는 "손 따라가기" 로봇을 만드는 방법을 탐구합니다. 이 프로젝트는 단순한 모터 제어를 넘어, 서보로 구동되는 초음파 센서와 지능적인 Python 로직을 결합하여 범위 내의 물체를 능동적으로 탐색하고 추적하는 자동차를 만드는 방법을 보여줍니다. 이는 로봇 공학의 기본 개념으로, 사람을 따라가는 로봇, 공을 가져오는 스마트 반려동물, 움직임을 추적하는 자율 보안 카메라와 같은 대화형 프로젝트를 구축할 수 있게 해줍니다. 이 강의는 또한 특정 거리 구역 내의 물체에 자동으로 접근하고, 밀고, 후진하는 더 간단한 두 번째 프로젝트도 다룹니다.

pi_pico_4WD_follow-hand

하드웨어 및 부품

이 프로젝트는 SunFounder Raspberry Pi Pico 4WD 자동차 키트를 기반으로 합니다. 이 강의에서 사용되는 주요 부품은 다음과 같습니다:

  • Raspberry Pi Pico 보드
  • 모터가 포함된 4WD 스마트 자동차 섀시
  • 서보 모터 (내구성을 위해 이상적으로는 금속 기어 서보)
  • 초음파 거리 센서 (HC-SR04)
  • 모터 드라이버 보드 (자동차 키트의 일부)
  • RGB LED (시각적 피드백용)
  • 전원 공급 장치 (자동차용 배터리 팩)
PICOBOARDWHITEANGLE2_1200x857

서보 모터는 이 강의 기능의 핵심입니다. 연속적으로 회전하는 일반 DC 모터와 달리, 서보 모터는 일반적으로 0도에서 180도 사이의 특정 각도 위치로 회전하여 유지하도록 설계되었습니다. 이는 초음파 센서를 정밀하게 조준하는 데 완벽합니다. 서보의 품질은 종종 기어 재질(플라스틱 대 금속)과 토크에 의해 결정되며, 이는 강도와 내구성을 좌우합니다.

작동 원리

아래 차트는 코드가 어떻게 작동하는지 설명합니다. 

pi_pico_4WD_follow-hand_flow_chart

배선 가이드

이 강의의 배선은 사전 조립된 자동차 키트를 기반으로 하므로 간단합니다. 중요한 연결은 서보 모터로, Pico의 특정 GPIO 핀에 연결해야 합니다.

비디오에서 강사는 서보를 Raspberry Pi Pico의 핀 번호 18에 연결합니다. 초음파 센서는 서보 혼 위에 장착되어 좌우로 회전하며 영역을 스캔할 수 있습니다. 모터, RGB LED 및 전원에 대한 나머지 배선은 과정의 이전 강의에서 사전 연결된 것으로 간주됩니다.

자세한 시각적 가이드는 아래 배선도를 참조하십시오.

Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction

코드 설명

이 강의의 Python 코드는 복잡한 하드웨어 상호 작용을 단순화하는 사용자 정의 pico_4wd 라이브러리를 기반으로 구축되었습니다. 사용자 구성 가능한 부분은 스크립트 상단에 있으며 자동차의 동작을 제어합니다.

로봇의 "손 따라가기" 동작을 사용자 지정하기 위해 조정할 수 있는 주요 변수는 다음과 같습니다:

  • car.RADAR_REFERENCE = 25: 센서가 "볼" 수 있는 최대 거리(센티미터)입니다. 이 거리 너머의 물체는 무시됩니다. 이 값을 늘리면 자동차가 더 민감해지고, 줄이면 더 가까운 물체가 필요합니다.
  • car.RADAR_MAX_ANGLE = 45car.RADAR_MIN_ANGLE = -45: 서보가 스캔할 가장 왼쪽(45) 및 가장 오른쪽(-45) 각도를 정의합니다. 이는 자동차 앞쪽에 90도의 시야각을 만듭니다.
  • car.RADAR_STEP_ANGLE = 10: 서보가 스캔 지점 사이를 이동할 때 사용하는 증분(도)입니다. 더 작은 단계(예: 5)는 더 미세한 해상도를 제공하지만 전체 스캔을 완료하는 데 더 오래 걸립니다. 더 큰 단계(예: 15)는 더 빠르게 스캔하지만 정밀도가 낮아집니다.
  • MOTOR_FORWARD_POWER = 40: 감지된 물체를 향해 자동차가 전진할 때 사용되는 모터 출력(0-100)을 설정합니다. 이를 조정하여 자동차의 추적 속도를 변경할 수 있습니다.
  • MOTOR_TURNING_POWER = 40: 자동차가 물체를 향해 회전할 때 사용되는 모터 출력을 설정합니다. 값이 높을수록 자동차가 더 공격적으로 회전합니다.

main() 함수의 주요 로직은 연속 루프입니다. 먼저 car.radar_scan()을 호출하여 각 스캔 각도에서 물체가 감지되었는지 여부를 나타내는 '1'과 '0'의 문자열을 반환합니다('1'은 물체가 기준 거리 내에 있음을 의미). 그런 다음 코드는 이 문자열을 분석하여 연속된 '1'의 가장 큰 그룹을 찾습니다. 이는 감지된 물체의 중심을 나타냅니다. 스캔 필드에서 이 중심의 위치에 따라 자동차는 물체와 정렬하고 추적하기 위해 왼쪽으로 회전하거나, 오른쪽으로 회전하거나, 전진하도록 명령을 받습니다.

라이브 프로젝트 시연

이 비디오는 프로젝트가 실제로 작동하는 모습을 명확하게 보여줍니다. 강사는 먼저 테스트 스크립트를 실행하여 서보 모터를 90, 0, -90도와 같은 정밀한 각도로 움직일 수 있는지 시연합니다. 이는 서보의 범위를 이해하고 초음파 센서를 올바르게 장착하는 데 중요합니다.

센서를 장착한 후에는 "손 따라가기" 기능이 소개됩니다. 강사가 차량 앞에서 손을 움직이면 서보에 장착된 센서가 좌우로 스캔합니다. 차량의 로직은 센서 데이터를 처리하고 바퀴를 돌려 감지된 손 쪽으로 조향하며, 바닥을 가로질러 효과적으로 손을 따라갑니다. 이 시연은 차량이 물체가 움직일 때 이를 추적하고 그에 따라 방향을 조정하는 방법을 강조합니다. 두 번째 프로젝트도 보여지는데, 차량이 10~20센티미터 사이에서 물체를 감지하면 접근하여 밀고, 물체가 너무 가까워지면(10센티미터 미만) 뒤로 물러나도록 프로그래밍되어 있습니다.

핵심 요점

이 강의는 대화형 로봇 동작을 만들기 위해 서보 모터를 사용하는 방법에 대한 훌륭한 입문서입니다. 서보를 거리 센서와 결합하면 환경을 능동적으로 추적하고 반응할 수 있는 "시각"을 가진 로봇을 구축할 수 있습니다. 스캔 각도, 스텝 크기, 모터 출력과 같은 매개변수를 조정하는 능력은 로봇의 동작을 세밀하게 제어할 수 있게 해주며, 이는 모든 로봇 공학 프로젝트에 필수적인 기술입니다.

챕터

  • [00:00] 서보 모터 및 물체 추적 소개
  • [01:48] 코스 키트 기능 및 성능
  • [03:08] 서보 모터 작동 이해
  • [06:08] Python 코드로 서보 모터 테스트
  • [09:59] "손 따라가기" 기능 설명
  • [10:49] "손 따라가기" 기능 시연
  • [15:37] 프로젝트: 물체 밀기 및 후진
  • [18:40] 물체 밀기 프로젝트 시연
  • [19:25] 결론 및 다음 단계

이미지

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand_flow_chart
pi_pico_4WD_follow-hand_flow_chart
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
905-Lesson 8/10 Pi Pico 4WD card Python code: follow hand
언어: C++
# Lesson 8/10 Pi Car Pico 4WD: Follow hand
# Download and resource page https://robojax.com/RJT630

import pico_4wd as car

car.RADAR_REFERENCE = 25
car.RADAR_MAX_ANGLE = 45
car.RADAR_MIN_ANGLE = -45
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 40
MOTOR_TURNING_POWER = 40

def main():
    while True:
        radar_data = car.radar_scan()
        if isinstance(radar_data, int):
            continue
        radar_data = [str(i) for i in radar_data]
        radar_data = "".join(radar_data)
        paths = radar_data.split("1")
        length_list = []
        for path in paths:
            length_list.append(len(path))
        if max(length_list) == 0:
            car.move("stop") 
        else:
            i = length_list.index(max(length_list))
            pos = radar_data.index(paths[i])
            pos += (len(paths[i]) - 1) / 2
            delta = len(radar_data) / 3
            if pos < delta:
                car.move("right", MOTOR_TURNING_POWER)
            elif pos > 2 * delta:
                car.move("left", MOTOR_TURNING_POWER)
            else:
                #if radar_data[int(len(radar_data)/2-1)] == "0":
                #    car.move("stop")
                #else:
                car.move("forward", MOTOR_FORWARD_POWER)

try:
    main()
finally:
    car.move("stop")
    car.set_light_off()

자원 및 참고자료

아직 자원이 없습니다.

파일📁

파일이 없습니다.