이번 프로젝트에서 하드웨어 부분을 맡아 하드웨어 기술에 쓰일 라즈베리파이와 카메라, 서보모터 모듈의 사용법과 이외에 사용된 자체제작 함의 제작 과정에 대해 소개할 예정이다.
먼저 우리 프로젝트의 내용은 다음과 같다.
<딥러닝 기반 중고거래 플랫폼 : MATCHAT >
중고거래 상품의 판매자가 판매하고자 하는 상품을 MATCHAT 사이트에 상품의 사진과 함께 사전 등록하고 인증번호를 부여받는다. 사전 등록된 상품은 사이트에 노출되지 않는다. 판매자는 등록한 상품을 가지고 MATCHAT 함으로 이동해 인증번호를 입력한 뒤 사전등록한 상품을 투입한다. 함에서는 상품의 사진을 찍고 사전등록된 상품과 투입한 상품이 동일한 상품인지에 대해 판정을 받는다. 동일한 상품이라면 함의 잠금 장치는 잠궈지고 사전 등록 상품은 등록 완료되어 MATCHAT 사이트에서 확인할 수 있다.
구매자는 MATCHAT 사이트에서 판매 상품 목록을 확인하고 구매하고자 하는 상품이 있으면 챗봇을 통해 문의한다. 문의 후 구매 의사가 있는 상품은 사이트에서 결제할 수 있고 결제가 완료되면 인증번호를 부여받는다.
이후 MATCHAT 함으로 이동해 인증번호를 입력한 뒤 결제 완료된 인증번호임이 확인 되면 잠금 장치가 열리고 상품을 수령한다.
상품을 투입하고 사진을 찍을 용도의 함을 제작하고 이때 사용될 카메라, 서보모터 모듈을 조작할 라즈베리파이의 사용법을 소개하고자 한다.
1. 라즈베리파이B3+

라즈베리파이란 ?
라즈베리 파이는 영국에서 교육 목적으로 만들어진 싱글 보드 컴퓨터이다. 기본적으로 마이크로프로세서, 메모리, 각종 i/o 장치( 오디오, 비디오, 카메라, HDMI)등이 장체 내장되어 있고 라즈베리 파이 3 이상부터는 와이파이, 블루투스가 기본 내장되어 있다. 한마디로 하나의 작은 컴퓨터라고 보면 된다.
-라즈베리파이 세팅 방법
먼저, 라즈베리 파이도 하드웨어를 제어하기 위해 운영체제가 필요한데 이때 필요한 운영체제가 라즈비안이다.
라즈비안은 라즈베리파이의 공식 운영체제이다.
그럼 본격적인 라즈베리 파이 사용에 앞서, SD 카드에 라즈비안 운영체제를 설치해보도록 하자.
먼저 SD카드 리더기에 sd카드를 꼽고 컴퓨터와 연결한다.
Raspberry Pi OS – Raspberry Pi
Raspberry Pi OS – Raspberry Pi
From industries large and small, to the kitchen table tinkerer, to the classroom coder, we make computing accessible and affordable for everybody.
www.raspberrypi.com
운영체제인 라즈비안을 설치하기 전에 이 운영체제를 설치하기 위한 도구가 필요하다. 이 도구가 라즈베리파이 이미저 인데 운영체제를 설치하기 위해 라즈베리파이 이미저를 먼저 설치해 준다.
이 이미저도 자신의 컴퓨터 운영체제에 맞게 설치해 주면 된다.

이미저를 잘 설치되었다면 아래와 같은 앱이 생성된다.

먼저 SD카드 리더기에 sd카드를 꼽고 컴퓨터와 연결한다.
앱을 열 아래와 같은 창이 보인다.

다음은 설치할 os 선택을 위해 choose os 를 선택하고 기본 os를 설치해 주었다.


저장할 stotage 를 선택하는데 위치는 컴퓨터 연결해 놓은 sd 카드를 선택하면 된다. 연결이 잘 되어있다면 choose storage를 선택하면 sd 카드 저장고간이 보인다.


위 과정이 모두 끝났으면 write를 선택하면 설치가 진행 된다.


설치하는데 한 10분정도 걸린다..


설치가 모두 완료되면 이제 라즈베리파이 운영체제가 sd 카드에 설치된 것이고 sd 카드를 라즈베리파이에 아래와 같이 꽂아서 사용하면 된다.

이제 본격적인 라즈베리파이 세팅 방법에 대해 알아보자.
라즈베리파이 부품을 먼저 소개하면 다음과 같다.
부품 : 라즈베리파이B3+ , 터치스크린 , 케이블 선, 전원 선, 키보드 , 마우스 , 모듈 카메라 ,서보 모터








이제 라즈베리파이와 스크린을 분리하는 방법으로 연결 지켜보자.
케이블선으로 라즈베리파이와 터치스크린을 연결하고

라즈베리파이, 터치스크린 각각 전원 연결한다.


(라즈베라파이를 연결할 때는 전원은 모두 꺼둔 상태로 연결하는 것이 좋다.)
아래는 전원 들어왔을 때 라즈베리파이 모습이고 파란불이 깜빡 거리고 있어야 전원이 제대로 들어왔다는 것이다.

아래는 전원을 안들어왔을 때/들어왔을 때 스크린 모습


마우스, 키보드 라즈베리파이에 연결해준다.

모두 연결하고 전원을 켜서 확인해보면 라즈베리파이가 하나의 작은 컴퓨터가 되는 것을 확인할 수 있다.

* 컴퓨터처럼 와이파이 사용도 가능한데 공용 와이파이와 핫스팟은 사용할 수 없었다..
1. 카메라 모듈 사용
우리 프로젝트에서는 라즈베리파이에서 키오스크 역할을 할 라즈베리파이 내의 로컬 앱이 필요했다.
flask 와 django 과 같은 프레임으로 처음 만들기 시작했었는데 이 프레임들은 라즈베리파이 내에서 사용하기 어려웠다. 라즈베리파이에서 제공해주는 개발 도구인 지니 나 thonny는 하나의 폴더로 파일을 묶어서 열 수 없어 개별적으로 모든 파일을 열어줘야하고 vscode 과 같은 개발도구를 설치해서 사용해 봤으나 실행하면 라즈베리파이가 계속 멈춰 사용할 수 가 없었다. 그래서 라즈베리파이 내에서 가볍게 사용할 수 있는 GUI인 tkinter 를 사용하여 로컬 앱을 제작하게 되었다.
다음은 tkinter 로 만들어진 앱으로 카메라 모듈을 제어해보자.
먼저 ,라즈베리파이에서 사진 촬영을 위해 라즈베리파이에 카메라 모듈을 아래와 같이 연결해준다.




이렇게 연결하고 닫아준다.
다음은 카메라 모듈 사용을 위해 설정을 해주어야 했다.
터미널을 열고 아래와 같은 명령어를 입력해 설정 창을 열어준다.
sudo raspi-config





위 과정을 모두 실행해주면 카메라 모듈을 사용할 수 있는 설정은 모두 끝났다.
터미널에서도 간단하게 카메라가 연결되었는지 확인하고 촬영을 테스트할 수 있다.
카메라 모듈이 잘 연결되어있는 지 확인을 위해 터미널에 아래와 같은 명령어를 입력한다.
vcgencmd get_camera
연결 여부는 아래와 같이 확인 가능하다.
#제대로 연결이 되었을 때
supported =1 , detected=1
#연결이 되지 않았을 때
supported =1 , detected=0
촬영을 위해서는 다음과 같은 명령어는 다음과 같고 높이과 너비도 지정할 수 있다.
raspistill -o Desktop/test.jpg -w 640 -h 480
그럼 카메라가 비추는 화면이 잠깐 나타났다 자동으로 사진이 찍히고 지정한 파일 경로에 사진이 저장되는 것을 확인할 수 있었다.
위 과정을 통해 터미널에서 카메라 모듈이 제대로 연결되었는지 사진 촬영이 되는지에 대해 확인했다.
다음은 프로젝트에 쓰일 카메라 모듈을 연결하고 키오스크 GUI에서는 어떤 식으로 쓰이는지 알아보자.
기본 카메라 모듈보다 좋은 화질의 사진을 찍기위해 HQ카메라모듈과 광각렌즈를 사용하기로 했다.
두 어댑터 부분을 연결해주고 바로 사진 촬영을 해보면 화면이 흐릿해서 사물이 안보인다.
초점을 맞춰줘야 하는데 초점을 담당하는 아래 빨간 테두리 부분을 FAR 쪽으로 돌려주면 카메라 사이에 틈이 생기면서 초점이 점점 선명해지는 것을 확인할 수 있었다. 적정 초점을 찾으면 렌즈가 더 이상 돌아가지 않도록 일자 볼트 고정나사로 고정시켜준다.


왼쪽은 기본 카메라로 찍은 사진이고 오른쪽은 광각렌즈로 찍은 사진이다. 비교해보면 화질에 차이가 많이 난다.


\
우리 프로젝트에서는 상품을 함에 넣으면 GUI로 만든 아래와 같은 창이 뜬다.

판매자가 사전등록을 마치고 판매할 상품을 함으로 가져와 넣고 라즈베리파이 스크린에 띄어져 있는 위와 화면을 볼 수 있다. 상품의 배치가 끝나면 사진 찍기 버튼을 눌러 사진 촬영을 할 수 있다.
코드는 다음과 같다.
import tkinter as tk
import tkinter.font
import boto3
from sale import sale_key_input,sale_key
from config import REGION,BUCKET_NAME
import sale
from picamera import PiCamera
window=tk.Tk()
window.title("MATCHAT")
window.geometry('635x450')
window.resizable(False,False)
window.configure(bg='#1abc9c')
camera=PiCamera()
def capture():
camera.start_preview()
camera.capture('/home/pi/save_folder/product.jpg')
camera.stop_preview()
try:
s3 = boto3.client('s3')
key=sale.sale_key
print(key)
image_name='raspberrypi/'+key+".jpg"
print(image_name)
s3.upload_file("/home/pi/save_folder/product.jpg", "matchat", 'raspberrypi/'+key+".jpg")
print('success')
url="https://s3-%s.amazonaws.com/%s/%s" %(REGION,BUCKET_NAME,image_name)
print(url)
except Exception as err:
print("input error", err)
font=tkinter.font.Font(family="Consolas",size=15,weight=tkinter.font.BOLD)
font2=tkinter.font.Font(family="Consolas",size=20,weight=tkinter.font.BOLD)
label1=tk.Label(window, text=" MATCHAT[판매자]", width=100, height=3,anchor='w', fg="white",bg="#343a40" ,relief="flat",font=font)
label1.pack()
label2=tk.Label(window,text='상품배치가 완료되면',font=font2,bg="#1abc9c")
label2.place(x=185,y=150)
label3=tk.Label(window,text='사진찍기 버튼을 눌러주세요.',font=font2,bg="#1abc9c")
label3.place(x=140,y=195)
bt1=tk.Button(window,text="사진찍기",font=font, width=15,height=3,command=capture)
bt1.place(x=230,y=290)
window.mainloop()
사진을 찍으면 라즈베리파이의 로컬 파일에 저장이 되고 그 파일을 S3에 저장하여 챗봇에서 라즈베리파이 내에서 촬영된 사진을 사용자에게 보여줄 수 있도록 한다.
2.서보 모터
프로젝트에서 사용되는 함의 잠금 장치로 서보모터를 사용하게 되었다. 판매자가 상품 등록이 완료되는 잠금 장치가 잠기게 되고 구매자가 결제한 상품의 인증번호를 맞게 입력하였을 때 잠금 장치가 열려 상품을 가져갈 수 있도록 할 예정이다. 서보모터는 회전 각도가 180도로 한정되어있지만 우리 프로젝트에서 사용될 잠금 고리의 열고 닫음 기능을 하기에 적합했다.
서보모터 사용전에 알아야할 것은 GPIO에 대해 이해하고 있어야한다.
GPIO(General Purpose Input Output)란 마이크로프로세서가 주변 장치와 통신하기 위해 범용으로 사용되는 입출력 포트를 나타낸다.GPIO 핀은 입력 또는 출력으로 설정하여 사용할 수 있다. GPIO핀들 외에 5V와 3.3V의 전원용 핀이 각각 2개씩 있고 그라운드(GND) 핀들이 8개가 있다.
아래 그림과 같이 정해진 포트들이 정해져 있다.
서보 모터 연결에는 2,4,12,번 포트를 사용할 예정이다.

연결은 다음과 같이 빨간선은 5V 에 연결, 노란색선은 GPIO 18 에 연결 , 검은색선은 GND에 연결한다.

그리고 서보모터의 회전 각도를 조절해려면 PWM(Pulse Width Modulation)에 대해 알야하한다.
PWM은 깊게 파고들면 정말 알아야 할게 많지만.. 간단하게 얘기를 하면 일정 간격으로 신호의 하이레벨과 로우 레벌의 폭을 전환해서 디지털 신호를 아날로그 신호 값처럼 사용하는 것인데 이를 조절해서 원하는 출력을 할 수 있도록 하는 것이다.. 여기서 듀티(duty)라는 개념이 나오는데 이 듀티는 pwm의 한주기에서 하이레벨이 차지하는 비율이다.

서보 모터에서 사용되는 이 듀티 비율은 7.5 ,12.5 ,2.5 가 있는데 이 값들을 가지고 GPIO 라이브러리가 제공하는 ChangeDutyCycle함수를 이용해 서보모터의 각도를 조절할 수 있다.
듀티비에 해당하는 각도는 아래와 같다.
각도 | 듀티비 |
0 | 2.5 |
90 | 7.5 |
180 | 12.5 |
코드는 다음과 같다.
import RPi.GIOP as GPIO
from time import sleep
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12,GPIO.OUT)
p=GPIO.PWM(12,50)
p.start(0)
p.ChangeDutyCycle(7.5)
time.sleep(1)
p.ChangeDutyCycle(12.5)
time.sleep(1)
p.ChangeDutyCycle(2.5)
time.sleep(1)
p.stop()
위 코드를 실행하면 아래와 같이 작동하는 것을 확인할 수 있다.
https://youtu.be/i8T619i3XXk
서보모터의 잠금 장치에 부착해 판매자의 상품이 등록 완료되었을 때와 판매자가 상품을 수령해 갈 때 잠금 장치가 열고 닫힐 수 있도록 하였다.
3. 함 자체 제작 과정
프로젝트에서 상품으로 신발을 선정하여 신발을 넣을 함이 필요했다. 함은 카메라를 설치하고 잠금 장치 역할을 할 서보모터를 설치할 예정이다.
처음 도안은 아래와 같이 그림으로 그려 시작했고 다음은 박스로 간단한 재료들로 만들어 보았다.
함의 크기는 여자 신발 기준으로 정해졌고 바닥과 신발을 둘러싼 3면은 사진 촬영을 했을 때 주변의 다른 물건을 detect 하지 않도록 불투명하게 제작하기로 했고 시연과정에서 잘 보이도록 하기위해 앞 문은 불투명하게 제작하고 천장은 라즈베리파이와 연결된 선들이 자유롭게 배치될 수 있도록 없이 제작되었다.
아래와 같은 그림 도안과 박스로 만드 모형을 거쳐서....


아래와 같은 함이 만들어 졌다.

'캡스톤디자인프로젝트' 카테고리의 다른 글
[RaspberryPi3]라즈베리파이 한글 설정하기 (0) | 2022.02.26 |
---|---|
[Object detection]YOLO (1) | 2021.11.25 |