블로그 이미지
devtang
Instagram : @taebr0 devtaehyeong@gmail.com

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2020. 3. 11. 16:58 개인 프로젝트

*2020년도 10월 교내 캡스톤경진대회 제품제작에 성공하였습니다

youtu.be/OwrC1YFvGH0

 

 

마스크 학습관련내용은 아래 게시물에 있습니다.

https://ultrakid.tistory.com/15

 

[Windows] 마스크 착용 유/무 판단을 위한 YOLO 학습

요즘 코로나 바이러스로 인해 전세계가 혼란입니다. 그래서 마스크를 착용하지 않으면 주변 사람에게 피해가 가니 항상 착용하도록 합시다!! 다름이 아니라 연구실에서 공부겸 간단한 개인 프��

ultrakid.tistory.com

코로나 바이러스로 요즘 전세계적으로 혼란인 가운데,

마스크를 착용하지않으면 상대적으로 타인에게 불안감을 조성할 우려가 있어서

마스크를 착용했을때 문이 열리게 되는 프로젝트를 만들었습니다.

개인적으로 시간이 날때마다 짬짬히 만들어보았습니다.

우선 구현 영상입니다.

https://youtu.be/fcFa_WhXNIo

 

 

라즈베리파이와 컴퓨터간 실시간 소켓 통신을 이용하였으며

컴퓨터에서는 YOLO를 이용한 마스크 착용 인식, 라즈베리에서는 소켓으로 통신받아 GPIO를 제어하였습니다.

 

HC-SR04 초음파센서

우선 사람이 문앞에 있다고 가정하기 위해 초음파센서를 이용하였습니다.

라디오 같이 생긴 이 센서는 송신부인 Trigger와 수신부인 Echo로 나뉘어있는데 송신부에서 초음파를 발사하면 물체에 부딪쳐 나오는 진동을 Echo에서 받은 시간을 이용하여 거리를 측정하는 방식입니다.

이 센서는 최대 4m까지 거리측정이 가능합니다.

 

 

 라즈베리파이와 브레드보드를 이용하여 연결해놓고 잘 작동하는지 테스트해봤습니다.

 LED는 초음파센서와 물체와의 거리가 100cm 이하로 일정 count동안 존재할때 켜지도록 해놨습니다.

 

 서보모터는 SG-90을 이용했으며 서보모터에 나무젓가락 세개를 테이프로 이어붙혀서 만들었습니다.

 출입문 역할로 만들었으며, 마스크를 쓰면 서보모터를 회전시켜 지나갈 수 있도록 만들었습니다.

 이제 남은건 윈도우 환경에서 인식한 결과를 라즈베리에 전송시켜 마스크를 썼을때 서보모터가 움직이게

 두가지를 합쳤습니다.

 

YOLO의 darknet 소스코드찾다 image_opencv.cpp 파일에서 class를 검출하는 소스코드를 찾아냈습니다.

/*********************************************INSERT CODE LINE*******************************************************/
if (strcmp(detectname, names[j]) != 0)
	{
		fp = fopen("***TXT파일위치***", "w");
		fwrite(names[j], strlen(names[j]), 1, fp);
		fclose(fp);
	}
/*********************************************INSERT CODE LINE*******************************************************/

제가 추가한 소스코드입니다. names[j]에 인식된 class의 이름이 저장되있습니다.

TXT파일을 fopen 함수를 이용하여 열어서 fwrite 함수로 TXT파일에 검출된 class를 적게 구현했습니다.

이제 소켓으로 class name을 보내기만 하면 됩니다.

 

윈도우 소켓 코드중 일부입니다.

while (1) 
	{
		fp = fopen("***TXT파일 위치***", "r"); //YOLO에서 검출된name을 적은 TXT파일 열기
		fscanf(fp, "%s", message); // 문장을 복사
		fclose(fp); // 파일닫기
		if (strcmp(message, pre_message) == 0)
			continue;
		else {
			strcpy(pre_message, message);
			printf("SEND : %s\n", pre_message); 
			send(hSocket, message, sizeof(message) - 1, 0); //send를이용하여 라즈베리로 전송
			
		}

	}

 

YOLO와 소켓을 둘다 실행시켜놓고 소켓은 계속 텍스트를 읽어서 보내주기만 합니다.

 

라즈베리파이에서 GPIO를 다루는 코드 중 일부입니다.

if distance <= 100: # *초음파센서와 물체간 거리가 100cm 이하일때
			f = open("라즈베리파이 TXT파일 위치",'r') #윈도우에서 받은 name을 읽기
			read_yolo = f.readline() # read_yolo 변수에 문장을 복사
			f.close()
			right = 'MASK'	
			count += 1 # count가 증가함 
			if count >= 4 and read_yolo == right: # count가 4이상 and 'MASK'라는 name을 받게되면
				# print(2)
				p.ChangeDutyCycle(12) # 서보모터를 올림
				time.sleep(1)
				GPIO.output(LED, GPIO.HIGH) # LED를 켬
				time.sleep(2)	
				p.ChangeDutyCycle(7.5) # 2초후 서보모터를 내림
				time.sleep(1)
				count = 0 # count를 0으로 초기화
				GPIO.output(LED,GPIO.LOW) # LED를 끔
			
			else: # 마스크를 쓰지 않으면 서보모터를 제어하지 않는다.
				continue

일정시간동안 출입문 앞에서 마스크를 끼고 있지 않은 상태로 서있으면 야속하게 문이 열리지 않습니다.

간단하게 GPIO를 제어하여 마스크 착용시에만 문이 열리는 시스템을 만들어 봤습니다.

나중에 추가적으로 소스 코드 수정 및 기능을 개선,추가하여 더 좋은 퀄리티로 만들어 보고 싶습니다.

 

 

posted by devtang