관리 메뉴

KorSA

Person Detection + 아두이노 자동차 키트 (f. RoboPet) 본문

Study/Machine Learning

Person Detection + 아두이노 자동차 키트 (f. RoboPet)

Praiv. 2024. 5. 12. 16:05
320x100

 
 

#01. TinyML 스터디

11주에 걸쳐 참여했던 "모두의 연구소 - 내 TinyML 능력이 세상을 구하는 방법" 스터디가 끝이 났다!
 
이 스터디를 참여하면서 10여년만에 Arduino도 써보고 Colab으로 MobileNet 모델을 분석하고 튜닝해보기도 했다.
 ML 입문자였던 나는 나름 ML과 친해질 수 있는 계기가 되지 않았나 싶다.
 
마지막 프로젝트로 진행했던 주제가 잊혀지는 게 아쉬워 간단히 정리해보고자 한다.
 

#02. RoboPet

[ 프로젝트명 ]
RoboPet (애완로봇)
 
[ 목표 ]
RoboPet 은 Robotics 와 Pet 의 합성어로
집 문을 열고 들어가면 주인을 기다리고 있던 로봇이 나를 반겨준다.
 
[ 준비물 ]
1. Arduino 자동차 키트
2. 카메라 모듈 (OV2640)
3. Arduino Nano 33 BLE 보드
4. 브레드보드 (빵판)
5. 점퍼선
6. (Nano 보드에 헤더가 연결되어 있지 않을 경우) 인두기
7. Nano 보드 전원 공급장치
8. C-Type to Micro선 (이 선을 찾을수 없어서 나는 USB to Micro + C-Type to USB 젠더 조합을 사용했다.)
 
 

#03. OV2640 카메라 모듈 + Arduino Nano 33 BLE 보드

첫 시작은 Nano 33 BLE 보드에 Image Classification을 위한 TinyML Model을 올리는 작업이었다.
리소스가 제한적인 모바일 디바이스나 엣지 디바이스 같은 경우
Image Classification을 위해 MobileNet 을 tflite로 변환하여 많이 사용한다.
나도 Person Detection 예제 코드를 가져와 업로드했는데 이 예제 코드는 추론 시간이 5초 정도 걸리는 게 단점이었다.
그래서 직접 MobileNet V3 코드를 Colab에서 튜닝해보려 했는데
1MB 이하에서도 정확도를 유지해줄 모델을 만드는 데 실패해서 그냥 예제 코드를 쓰기로 결정했다..ㅠ
 
업로드만 하고 끝이 아니라 OV2640 카메라 모듈과 Nano 33 BLE 보드를 연결해주어야 한다.
OV2640의 Pin 번호와 Nano 33 BLE의 Pin 번호를 매핑하기 위해 점퍼선과 빵판을 사용했다.

OV2640 - Nano 보드 연결 구상

 
아래는 실제로 연결한 모습이다.
Person Detection 예제를 Nano 보드에 업로드했기 때문에
사람이 인식되지 않으면 빨간빛을 내고 사람이 인식되면 파란빛을 낸다.

실제 연결된 모습

 
 

#04. Arduino 자동차 Kit

그리고 이 모듈들을 탑재할 Arduino 자동차가 있어야 한다.
이런 자동차를 처음 조립해봐서 좀 삽질을 했다.
가장 최악이었던 순간은
80%정도 조립을 마무리해갈 때 쯤 메인 판때기가 뒤집혀있다는 사실을 깨달았을 때였다.
잠시 현타의 시간이 흐르고.. 결국 다 분해해서 다시 조립했다.
 
남아있는 사진이 아래 한 장 밖에 없지만 나름 귀엽게 조립이 완성되었다.
 

Arduino 자동차 키트 완성

 
 
5초마다 한번씩 전진하도록 코딩을 해봤는데 알아서 잘 움직인다.

 
 

#05. OV2640 카메라모듈 + Arduino Nano 33 BLE 보드 + Arduino 자동차 Kit

이제 이 자동차와 위에서 테스트했던 카메라 + Nano 보드를 합쳐야 한다.
 
우선 자동차 키트에서 당장 사용하지 않을 센서들은 모두 제거했다.
그래서 주변 사물을 detect 하기 위해 사용하는 초음파센서와 Line Tracking을 하기 위한 센서를 떼버렸다.
초음파센서는 나중에 필요할 것 같긴했지만.. 빵판 등을 자동차에 탑재하려면 우선 무게를 줄이는게 우선이었다.
그리고 자동차키트에서 기본 제공되는 Arduino Uno R3 보드와 쉴드를 제거했다. 이 역할은 Nano 보드가 대신해줄거니까.
 
이제 합치기만 하면 되겠다 싶었는 데 PIN 연결 과정에서 문제가 발생했다.
 
Uno R3 보드에서는 Digital 4번 S핀을 DC제어보드(L298N 보드)의 IN1 핀에 연결하고
Digital 4번 V핀을 자동차 DC제어보드의 VMS와 연결해주었었다.
 
그런데 Nano 33 BLE 보드에는 4번 핀이 하나밖에 없었다..
느낌상 S핀이 Signal의 약자이지 않을까 싶어서 Nano 보드의 4번 핀을 DC제어보드의 IN1 핀에 연결했다.
DC제어보드의 VMS에도 같은 4번 핀을 연결하면 혹시 되지 않을까 싶었는데 역시 안되었다.
여러 삽질 끝에 VMS 핀은 그냥 Nano 보드에서 사용하는 VCC를 연결해주면 되었다.
정확히 말하면 빵판에서 Nano 보드의 VCC가 꽂혀있는 + 라인에 연결해주면 된다.
 
또 다른 PIN 연결 문제는 카메라모듈과 DC제어보드가 Nano의 같은 PIN을 사용한다는 점이었다.
이 문제는 DC제어보드로 연결되는 PIN을 다른 PIN으로 대체하는 방식으로 해결했다.
DC제어보드가 원래 D13, D12, D11 PIN을 사용했었는데 각각 D10, D9, D8 핀의 Output을 사용하도록 점퍼선을 재연결했다.
그리고 카메라모듈이 D13, D12, D11 PIN을 사용하도록 했다.
 
어찌저찌 PIN연결을 끝냈는데 이번엔 전력 문제가 발생했다.
자동차 키트에 기본적으로 있는 1.5V건전지 * 4 연결 부품은 DC제어보드와 카메라 모듈에 전력을 공급하기 바빴다.
그래서 Nano 보드에 전력을 전달해줄 별도의 전원공급장치를 달아야했다.
부품을 사기에는 시간이 너무 없었기에 생각해낸 방법이 집에 굴러다니는 보조배터리를 Nano 보드에 연결하는 것이었다.
다행히 집에서 존재감이 지내던 보조배터리 하나를 발견해서 겨우 Nano 보드에 별도 전력을 공급할 수 있었다.
 
 

#06. 움직이는 무언가

휴..
이렇게 해서 겨우 아래와 같이 사람 인식 + 움직임 을 하는 로봇을 구동시켜 볼 수 있었다.
사람이 인식되지 않으면 빨간빛을 내며 가만히 있고
사람이 인식되면 파란빛을 내며 1초간 직진한다.
그리고 직진 코드가 실제 직진이 아닌 이유는 자동차에 얹은 빵판과 보조배터리 무게가 좌우대칭이 아니기 때문이어서 그런 듯 하다.
(얼굴 인식시키면서 영상을 찍으려고 하니 좀 많이 흔들리네..)
 

 
이 정도 가지고 애완로봇이라 하긴 좀 그렇지만
그래도 프로토타입으로 방향성을 한 번 검증해보았다는 데 의의를 두어야겠다...
 
앞으로 더 발전시켜서 Person Detection 결과에 따라 좌회전, 우회전도 판단하고 초음파 센서로 장애물도 피해가게 해보고 싶다.
 
 
 
 

728x90
728x90
Comments