메이크닷

MIE capstone
이동: 둘러보기, 검색

목차

프로젝트 개요

기술개발 과제

국문 : 스마트 점자 라벨 프린터

영문 : Smart Braille Printer For Embossment Tapes

과제 팀명

메이크닷

지도교수

이세정 교수님

개발기간

2019년 9월 ~ 2019년 12월 (총 4개월)

구성원 소개

서울시립대학교 기계정보공학과 2014430010 김준형(팀장)

서울시립대학교 기계정보공학과 2014430004 김경진

서울시립대학교 기계정보공학과 2014430012 김진현

서울시립대학교 기계정보공학과 2014430020 신승찬

서론

개발 과제의 개요

개발 과제 요약

사람의 오감은 촉각, 청각, 미각, 후각, 시각으로 구분된다. 그 중 일상 생활이 불가능하다고 보일 정도로 큰 장애를 가져오는 감각은 ‘시각’이라고 단언할 수 있다. 그 중 전맹자(시각을 완전히 사용할 수 없는 시각 장애인)의 경우, 물체를 구분할 수 없고 오로지 촉각을 활용한 점자와 청각을 통한 의사소통 만으로 일상 생활을 할 수밖에 없다. 그렇기에 항상 보조자가 필요하다. 보조자가 없다면, 같은 통에 담긴 후추와 소금조차 구분할 수 없다. 하지만 모든 전맹자들을 보조하기에는 턱없이 인원이 부족한 것은 현 장애인 복지의 현실이다. 뿐만 아니라, 최근 화제가 된 기사인 ‘콜라 캔 위에 새겨진 점자의 소름돋는 진실’의 내용은 캔 음료에 적혀 있는 점자는 모두 ‘음료’ 두 글자라는 것이다. 전맹자들은 자신이 마시고 싶은 음료를 타인에게 의지하지 않으면 고를 수도 없는 것이다. 이렇게 사회는 점자에 의지할 수밖에 없는 사회적 약자인 전맹자들에게 불친절하다. 우리는 이러한 전맹자들의 불편을 조금이나마 덜어주고자 사물에 보다 쉽게 라벨을 붙일 수 있는 스마트 라벨 프린터기를 제작하고자 한다. 또한 최근 화두가 된 기술인 3D 프린팅을 최대한 활용함으로써 비용을 최대한 절감해 현실적인 사회적 공학 가치를 실현할 것으로 기대된다.

개발 과제의 배경 및 효과

배경

현재 우리 사회에서 시각장애인들이 겪는 불편함은 수도 없이 많다. 그 중 가장 큰 불편함은 정보의 습득이 쉽지 않다는 것이다. 사람의 정보 습득의 대부분을 차지하는 것은 ‘시각’이다. 그렇기에 시각의 제한을 받는 시각장애인의 경우 정보의 습득을 점자를 이용하여 얻고 있다. 하지만 생활에 대한 대부분의 정보를 점자로 표현해서 붙이기는 쉽지 않다. 그렇기에 원하는 정보를 점자로 프린트한 후 프린트한 것을 원하는 곳에 붙일 수 있게 하는 생각에서 착안하였다. 현재 이러한 시각장애인들을 위해 점자를 프린트하는 기기가 출시되어 있긴 하지만 구비하기 어려울 정도로 고가의 제품이다. 더불어 시각장애인이 이용하기에는 어려움이 있다. 본 프로젝트를 통해 시각장애인과 비시각 장애인 모두 사용하기 편하면서 현재 출시된 제품보다 가격 경쟁력을 가질 수 있게 할 것이다.

기대효과

본 개발을 통해 완성될 스마트 점자 라벨 프린터는 사용자가 원하는 정보를 붙이기 쉬운 라벨지에 프린트하는 프린터이다. 또한 핸드폰 어플리케이션과 내부 LCD를 이용한 이용하기 용이한 인터페이스는 현재 출시된 다른 기기들과 차별화된 강점을 가질 수 있게 할 것이다. 이는 개인적으로 프린터를 소지하거나 복지관에 구비함으로써 시각장애인을 위한 점자 정보들을 쉽게 출력하여 시각장애인이 겪는 불편함을 해소할 수 있을 것이라 기대한다.

개발 과제의 목표와 내용

본 개발 과제인 스마트 점자 라벨 프린터의 목표는 다음과 같다.

정확성

현재 점자는 국립국어원에서 정의하고 있는 규격이 있다. 현재 통용되고 있는 점자의 규격은 다음과 같다.

점의 높이 점의 지름 점간 간격 자간 간격 줄간 간격
0.6~0.7mm 1.5mm 2.5mm 4~6mm 5~5.2mm

본 기기는 다음과 같은 규격에 맞게 프린트 할 수 있는 것을 목표로 삼아 설계, 제작한다.

경제성

현재 출시된 제품들과 비교했을 때 경제적인 강점을 보여야한다. 현재 출시된 제품들과 같은 목적을 가진 제품이기에 보다 가격 경쟁력 있는 부품과 재료를 선택하여 제작한다.

편의성

사용하기 쉬운 구동방식과 인터페이스 구축을 통해 시각장애인과 비시각장애인 모두 손쉽게 사용하도록 한다.

관련 기술의 현황

State of art

원판 인쇄

Makedot1.png

알루미늄·아연 합금원판에 점자제판기를 이용하여 제판한 이후 점자전용 롤인쇄기를 통과시켜 인쇄하는 방식이다. 주로 단종 대량방식에 쓰이며 빠른 인쇄속도와 우수한 점자인쇄 품질을 얻을 수 있다. 다양한 지질·두께의 인쇄용지에 구애받지 않고 점자인쇄 할 수 있으며, 인쇄용지 사이즈에도 크게 영향을 받지 않는다. 특히, 최근에 시도되고 있는 묵·점자 혼용 점자인쇄물에 매우 적합하여 다양한 종류의 점자인쇄물을 생산할 수 있다.

점자 프린터

Makedot2.png

점역이 끝난 점자 파일을 컴퓨터와 점자프린터를 연결하여 직접 출력해내는 방식이다. 이 방식은 주로 다종소량 점자인쇄물 제작 시에 많이 쓰이며, 조작이 간단하고 쉽게 점자인쇄물을 얻을 수 있어 널리 쓰이고 있다. 쉽게 출력하여 점자인쇄물을 얻을 수 있는 반면에 출력속도가 느리며, 점자프린터 전용 전산용지를 사용하여야 해서 다양한 사이즈와 지질의 점자인쇄물에는 적합하지 않다.

UV 프린터

한번 컬러 인쇄를 진행한 후 점자는 반복 인쇄를 통해 점자에 입체감을 부여한다. 이 방식은 다종소량 점자인쇄물 제작시에 활용가능하며 UV프린터의 특성상 유리, 아크릴, 금속 등 거의 모든 소재에 인쇄가 가능하다. 하지만 점자를 따로 이미지 또는 문서로 변환하는 과정이 별도로 필요하다.

3D 프린터

Makedot3.png

3D 프린팅 기술을 이용해 점자를 인쇄하는 방식이다. 3D 프린팅의 특성상 점자를 직접 모델링하는 과정이 필요하며, PLA, ABS 등 특정 소재로만 출력할 수 있다.

기술 로드맵

Makedot4.png Makedot5.png

특허조사

프린터를 이용한 점자출력물 제작방법

Makedot6.png

점자인쇄모듈/점자인쇄모듈을 포함하는 점자인쇄장치

Makedot7.png

Makedot8.png

가이드 롤러 프레스를 구비한 휴대용 점자 인쇄기

Makedot9.png

점자 출력 장치 및 그 방법

Makedot10.png

점자라벨 및 점자라벨 제조방법

Makedot11.png

특허전략

음성 인식-출력 프로세스

현재 특허에는 음성인식-출력의 프로세스를 갖는 기기의 특허는 존재하지 않는다. 이를 통해 신규성은 만족한다고 볼 수 있다. 하지만 기존의 음성인식 관련 특허들이 많이 존재하며, 점자 출력 관련 특허 또한 상당수 존재한다. 이를 고려해보았을 때, 진보성을 만족할 수 있는 가는 이후 해결해야할 과제이며 이 점이 해결되지 않는다면 이 부분의 특허 출원은 기대할 수 없을 것으로 보인다.

프린팅 메커니즘

설계에 맞는 효율적인 메커니즘을 직접 구상하도록 한다. 먼저, UV 프린팅의 경우 특허로 등록되어 있어 이를 프린팅 메커니즘으로 선택하게 되면 특허를 피할 수 없을 것으로 보인다. 그러므로 UV 프린팅 메커니즘은 배제하고, 소형화의 목적상에도 맞지 않으므로 약품 또는 특정 소재를 사용하는 약품출력 방식을 제외한 압인 방식을 채택하도록 한다.

압인 방식의 경우, 대부분이 대규모의 프린터에 사용되는 출력 모듈/메커니즘이다. 소형 출력의 경우에도 몇 가지의 경우가 존재하나 압인 메커니즘의 특성 상 그 제품의 형태/구조에 맞춰서 적용될 수 있기에 특허 회피 자유도가 높은 편이다. 그러므로 압인 인쇄 방식을 채택해 이후 설계될 기기의 요구조건에 맞는 메커니즘을 구상할 경우 ‘구성요소 완비의 원칙’에 따라 특허침해를 피할 수 있을 것으로 기대된다.

관련 시장에 대한 분석

경쟁제품 조사 비교

제품명 Vrailler 모이텍 점박이 HIMS BL-1000 메이크닷
제품 정보 사용자가 직접 구슬을 이용해 점자를 올린 뒤,

슬라이드를 이용해 점자 라벨을 만드는 방식

키패드와 점자 키보드를 이용해 사용자가

직접 라벨지를 타이핑하고 이를 출력하는 방식

PC에 점역프로그램을 설치한 이후

PC와 연결해 라벨지를 프린팅하는 방식

점자 터치스크린 및 음성인식 지원.음성출력

안내를 이용한 시각장애인 활용

크기 매우 작음 보통 작음 보통
가격대 저렴 매우 비쌈 비쌈 30만원대
접근성 X

(시각장애인 이용 불가)

O

(PC 이용으로 인한 제한)

편의성
어플 지원 X X X
부가 기능 X X X

마케팅 전략

주 고객층 선정

(1) 시각장애인 및 보호자

(2) 시각장애인 복지관 및 공공시설

(3) 시각장애인이 이용하는 시설

목표 시장 선정

Makedot12.png

시장 진입 및 자금 확보 전략

(1) 한국사회적기업진흥원의 사회적 기업 지원 제도를 활용한 시장진입

(2) 와디즈, 텀블벅 등 크라우드 펀딩과 유튜브를 활용한 홍보 및 초기 자금 확보

(3) 시장의 크기와 안정성을 고려해 주문 제작 방식을 채택

SWOT 분석
항목 내용
강점

(Strength)

3D 프린팅, 음성인식, 어플리케이션 등 최근 기술에 의해 활용할 수 있는 요소들이 결합된 점자 라벨러.

기술의 진보가 다른 분야에 비해 굉장히 느린 시각 장애인 보조기구 산업에서 큰 경쟁력을 갖게 됨.

기회

(Opportunity)

전맹자 뿐만 아니라 저시력자도 활용 가능한 보조기구로 발전 시, 목표 시장 대폭 확대 가능.

한글 / 영어 뿐만 아니라 타 언어를 지원함으로써 해외 시장까지 확대.

약점

(Weakness)

타 제품에 비해 너무 많은 기능으로 인한 사용자 조작 불편.

기존에 사용하던 제품과 조작법의 차이가 있어 초기 시장 진입의 어려움.

위협

(Threat)

일반적인 산업에 비해 굉장히 작은 시장 규모점자를 완벽히 대체할 기술의 등장

개발과제의 기대효과

기술적 기대효과

음성인식 분야에서는 구글 API를 활용하도록 한다. 구글 Speech Recognition API는 한글은 90%, 영어는 95%의 음성인식 성공률을 보인다. 음성인식 후 확인하는 과정을 거치면 사용자가 입력한 글자와 실제 인쇄되는 점자의 일치율은 100%이다.

한 번에 한 줄의 점자를 라벨에 프린트함으로써 보다 빠른 속도의 프린팅 기술력을 기대할 수 있다. 이는 출력 프로세스의 최적화를 거치면 더욱 빠른 속도를 얻어 낼 수 있을 것으로 기대된다.

경제적 및 사회적 파급효과

기존 점자 라벨러는 높은 가격대를 형성하고 있어 시각장애인이 개인적으로 구매하기에는 비용적 부담이 크다. 하지만 본 기기는 기존 점자 라벨러보다 높은 편의성, 기능을 가지고 있으면서 가격은 오히려 더 낮으므로 시각장애인의 가정에서도 쉽게 구매할 수 있어 접근성이 높아진다.

사회적 약자를 위한 사회적 가치 공학 실현 아이디어로 많은 소외된 장애우들에게 희망을 심어줄 것이다. 또한, 본 기기에 적용된 여러 최신 기능들에 아이디어를 얻어 비단 점자 라벨 프린터에 국한되지 않은 여러 공학적 아이디어가 새롭게 등장할 것으로 기대된다.

구성원 및 추진체계

Makedot13.png

설계

설계사양

제품 요구사항

번호 요구사항 D or W
1 가로 x 세로 x 높이 : 20 x 20 x 20 (cm) 이하 D
2 정밀한 양각 & 음각 D
3 어플리케이션 개발 D
4 음성인식기능 D
5 정확한 모터제어 D
6 소음감소 W
7 튼튼함 W
8 신속한 동작 W
9 용이한 라벨교체 W
10 가벼움 W
11 사용의 용이성 W

목적 계통도

Makedot14.png

평가 내용

제품의 핵심은 점자, 라벨, 통신, 정확성, 금액이라고 생각했다. 메커니즘 부분에서는 어떻게 라벨에 정확한 점자를 찍을것인가? 라는 문제를 해결해야 하며, 재료와 소프트웨어 부분에서는 어떻게 프린터의 통신과 경제성을 확보할 것인가? 라는 문제를 해결해야한다.

이 두가지를 종합한 결과 스마트 점자 라벨 프린터의 정확성, 경제성이 핵심 문제라는 것을 확인할 수 있었다. 이 문제를 해결하기 위해 위와 같은 요구사항과 희망사항, 목적 계통도를 작성하였다. 이를 통해 정확하고 경제적인 스마트 점자 라벨 프린터를 제작하고자 한다.

설계 사양

거시적 기능분할

1. 케이스 : 외부 충격과 내부 응력을 견딜 수 있는 견고함이 필요하다. 또한 전체 크기를 가로 세로 높이 각 20cm이하로 하고자 하며 발열을 대비한 통붕구조와 심미성을 포함한 디자인이 요구된다.

2. 통신부 : 어플리케이션과 컴퓨터와의 원활한 통신이 보장되어야 하며, 특히 통신의 신뢰성이 확보되어야 한다. 정확한 마이크 입력과 스피커 출력이 요구된다.

3. 구동부 : 메커니즘을 최소화 할 수 있어야 하며, 양각과 음각의 정밀한 결합과 제어가 요구된다. 또한 구동의 결과로 명확한 점자가 출력될 수 있어야 한다.

기능에 따른 설계 사양 변수 중요도

개념설계안

개념설계안으로 총 3개자의 구동부 메커니즘 아이디어를 고안하였다. 스마트 점자 라벨 프린터의 경우 케이스와 통신부의 개념설계는 점자를 찍는다는 주 목적을 달성하는데 크게 영향을 미치지 않는다고 판단하여 점자를 찍는 메커니즘인 구동부 개념설계를 중점으로 진행하였다.

다양한 메커니즘 후보에서 평가 기준에 따라 평가한 결과 다음과 같은 메커니즘을 사용하기로 최종적으로 결정되었다.

리드 스크류를 사용하여 부피를 축소하였고 양각판의 면에 위치함에 따라 발생되는 모멘트를 최소화하는 메커니즘을 선정하였다.

Makedot17.png

이론적 계산 및 시뮬레이션

목표

CAE 프로그램인 ANSYS를 활용하여 현재 설계된 본 모델에서 작동하였을 때 반력으로 인해 변형이 생기거나 파손이 일어날지 예측하여 안정적인 제품을 설계하는 것을 목표로 한다.

초기 모델 설정

(1) 외부 케이스는 두께 5mm, 재질은 PLA 형태이며 3D 프린팅 FDM 방식으로 제작한다.

(2) 부품 고정하는 밑판은 두께 5mm, 재질은 PLA 형태이며 3D 프린팅 FDM 방식으로 제작한다.

ANSYS에서의 해석 조건

본 제품의 구동 과정에서 발생되는 반력을 각 면에 100N 적용하여 ANSYS를 확용하여 변형률을 확인해본다. 내부부품과 외부 케이스가 볼트로 체결되어 있다는 경계조건 설정 후 해석을 진행한다.

ANSYS 해석 결과 및 분석

ANSYS를 통해 해석한 결과 작동과정에서 0.0143mm의 최대 변형이 생긴다는 것을 예측해 볼 수 있었다. 이는 외부 케이스의 두꼐인 5mm에 비해 0.0286%로 미세한 변형이기에 설계 변경하지 않고 제작을 진행한다.

Makedot18.png

조립도

조립도

Makedot19.png

최종 설계한 본 모델은 가로 20cm, 세로 20cm, 높이 12cm의 크기를 가지며 무게는 약 4kg의 무게를 가질 것으로 예상한다.

조립순서

조립 순서 설명

본 제품은 크게 구동부, 이송부, 케이스 및 디스 플레이로 구성된다. 3가지 부분을 따로 조립한 후 조립한 조립체들을 밑판에 결합하여 조립할 수 있다.

구동부 조립 순서

(1) 양각과 양각을 제어하는 스텝모터를 결합한다.

(2) 양각 제어 스텝모터를 브라켓과 결합 후 이와 리드 스크류와 결합한다.

(3) 직선 왕복 운동을 위해 브라켓과 LM 가이드를 결합한다.

이송부 조립 순서

(1) 급지롤러와 그에 맞는 롤러 지지대를 끼운다

(2) 급지 롤러가 잘 돌 수 있도록 각 부분에 베어링을 위치 시켜준다.

(3) 급지 롤러와 연마봉을 꽂은 후 연마봉과 풀리를 고정 시킨다.

(4) 급지 롤러를 제어하는 스텝모터에 풀리를 고정하고 연마봉 풀리와 스텝 모터 풀리에 벨트를 연결시킨다.

케이스 및 디스플레이 조립 순서

(1) 밑판에 구동부와 이송부를 각 부분에 위치 시킨 후 볼트를 통해 체결한다.

(2) 외부 케이스와 LCD 디스플레이를 고정 시킨다,

(3) 외부 케이스와 밑판을 꽂은 뒤 볼트로 고정 시킨다.

부품도

3D 프린팅 이용

구매하지 않고 제작하는 부품의 경우는 3D 프린터를 이용하여 제작하였다. 3D 프린터의 경우 원하는 설계 제품을 주문 제작하는 것보다 빠르게 제작하여 본 제품 제작 시간을 단축할 수 있다는 장점을 가지고 있다. 본 팀은 2가지의 3D 프린터의 출력 방식을 선택하여 경제성과 정밀성을 고려하여 부품을 제작하였다.

SLA 방식

SLA(Stereo Lithography Apparatus) 방식은 액체 상태의 광경화성 수지가 담긴 수조안에 저전력, 고밀도의 UV 레이저를 투사하여 수지를 굳혀서 적층해 조혀물을 제조하는 방식이다. SLA의 장점으로는 출력된 조형물의 정밀도가 매우 높고 표면이 깨끗하게 출력되며 설계자가 원하는 정확한 조형이 가능하다. 이러한 장점을 활용하여 정확성을 반드시 확보해야하는 양각을 출력하였다. 하지만 단점으로는 가격이 상당히 비싸기에 가격 경쟁력 확보를 위해 정밀도를 요구하는 부품인 양각만 SLA 방식을 사용하여 출력하였다.

FDM 방식

FDM(Fused Deposition Modeling) 방식은 뜨거운 노즐을 통해 고체상태의 재료를 녹여 노즐에서 분사하여 적층하는 방식이다. FDM 방식은 현재 가장 대중적으로 사용하는 방식으로 저렴하며 쉽게 접할 수 있는 3D 프린터 방식이다. 정밀도가 낮은 만큼 0.5mm 의 공차를 누고 모든 제품들을 제작하였고, 조립 과정에서 약간의 오차가 발생하는 부분은 후가공을 통해 부품을 수정하였다. 대부분의 부품들을 모두 FDM을 활용하여 출력하였다. FDM으로 출력한 부품들은 다음과 같다.

제어부 및 회로설계

상용보드

제어 처리 보드 음성 인식 및 GUI 처리 보드
제품명 Arduino Mega 2560 Raspberry Pi 3B+
제품 사진 Makedot20.png Makedot21.png
사양 ATmega2560 MCU

16MHz / 8-bit Microcontroller

Digital Pin : 54 (PWM : 16)

Analog Pin : 16

Flash Memory : 256KB

SRAM : 8KB

Quad Core 1.2GHz 64bit CPU

1GB RAM

Ethernet LAN

Bluetooth 4.1

USB 2.0 x 4

제어부 회로 설계

Makedot22.png

제어부는 위 그림과 같이 회로를 설계하였다. Arduino Mega 2560 위에 Ramps 1.4 쉴드를 탑재하고 3개의 스텝모터 드라이버가 각각 스텝 모터를 제어한다. 또한 물리식 엔드스탑 스위치로 프레서의 Base 위치를 확인하며, 광학식 엔드스탑 스위치로 양각의 Base 위치를 확인해 제어를 진행한다.

처리부 회로 설계

Makedot23.png

음성처리와 GUI 인터페이스 구성을 위해 위 그림과 같이 처리부의 회로를 설계하였다. 라즈베리 파이 3B를 기반으로 터치스크린, USB 마이크를 구성하였으며, 음성 안내 재생을 위한 오디오 Amp를 결선하였다.

전원부

Makedot24.png

전원부는 12V 200W 사양의 SMPS를 사용하였다. 본 제품의 회로 설계 구성상 최대 사용 전력은 100W로 SMPS 허용 전력 대비 50%의 수치로 설정하여 SMPS의 부하를 최소화 하였다. 또한 Ramps 1.4 쉴드 내의 퓨즈를 이용해 가장 중요한 전원부의 안정성을 확보하였다.

소프트웨어 설계

통신 방식 설계

Makedot25.png

각 보드, 스마트폰과의 통신 방식은 위 그림과 같이 설계하였다. Arduino와 Raspberry Pi는 Serial Wrie을 통해 UART 통신을 한다. 주변 기기(스마트폰, 여타 주변기기)와 통신하기 위해 기본적으로 Raspberry에서 AP 역할을 하며 UDP 통신을 이용해 데이터를 송/수신한다. 이외에도 프린터 자체 음성인식을 위해 유선랜을 통해 Google Cloud Platform 음성인식 API를 사용한다.

Arduino FW 설계

Makedot26.png

Arduino 내부 펌웨어는 C++을 이용하여 개발하였다. 전체적인 흐름도는 초기화 및 교정, 명령어 읽기 및 스케쥴링, 모터 제어 및 인쇄 3과정으로 나뉘며 명령어는 위와 같이 4개의 명령어를 지원한다.

Raspberry Pi SW 설계

Makedot27.png

Raspberry Pi SW는 위 그림과 같이 설계하였다. C를 이용해 Arduino와 직접적으로 UART 통신을 하는 Arduino Driver를 개발하였다. GUI와 STT(Speech to Text) 구현을 위해 Python과 PyQT를 활용해 개발하였다. Arduino Driver와 GUI간의 종속성을 줄이기 위해 내부 UDP 통신을 사용했다.

Android App 설계

Makedot28.png

위 그림과 같이 총 4개의 액티비티로 앱을 구성하였다. 와이파이(SSID : makedot)를 이용해 내부 UDP 통신을 진행한다. 기본적인 UI는 제스쳐(플립, 탭)와 음성안내 기반 인터페이스를 채택하였으며, 한국어 영어 음성 인식을 지원한다. 음성인식 이외에도 수동입력을 지원하는데, 이 때의 확인 방법은 진동을 통해 입력한 점자를 확인할 수 있다.

자재소요서

부품번호 부품명 규격 재질 수량 구매, 외주, 제작 비고
1 급지롤러 HP8100 급지롤러 고무 2 구매
2 베어링 MR128zz 볼 베어링 금속 4 구매
3 LCD - 1 구매
4 고무발 3M 범폰 PR2-12-4T 고무 4 구매
5 스텝모터 드라이버 스텝모터 드라이버 DRV8825 - 4 구매
6 임베디드 보드 Arduino MEGA 2560 - 1 구매
7 임베디드 보드 Raspberry Pi 3B+ - 1 구매
8 파워 서플라이 200W 방수형 파워서플라이 12V - 1 구매
9 확장 보드 로드셀 24bit 앰플리파이어 모듈 - 1 구매
10 확장 보드 65dB 마이크로폰 모듈 - 1 구매
11 컨버터 DC-DC 5V 3A 전압 강하형 변환 모듈 - 1 구매
12 스텝모터 - 2 구매
13 리드 스크류 - 1 구메
14 양각 3D 프린팅 ABS 1 외주
15 음각 3D 프린팅 ABS 1 제작
16 밑판 3D 프린팅 ABS 1 제작
17 케이스 3D 프린팅 ABS 1 제작
18 연마봉 금속 1 구매
19 급지롤러 지지대 3D 프린팅 ABS 1 제작
20 풀리 2 구매
21 벨트 1 구매
22 라벨 스티커 Nema 17 PVC 1 구매
23 볼트 / 너트 금속 30 구매
24 스텝모터 브라켓 3D 프린팅 ABS 1 제작

결과 및 평가

완료작품 소개

프로토타입 사진

Makedot29.png

Makedot30.png

Makedot31.png

Makedot32.png

포스터

Makedot33.png

특허출원번호 통지서

Makedot34.png

Makedot35.png

Makedot36.png


개발사업비 내역서

항 목

(품명, 규격)

수 량 단 가 금 액 비 고
현금





Nema 17 Step Motor 2 13.8 27.6
Nema 17 Step Motor/Lead Screw 1 12.4 12.4
Hexagonal Nut M2 16 0.03 0.48
Hexagonal Nut M3 6 0.03 0.18
Hexagonal Nut M4 60 0.04 2.4
Wrench Bolt M2 10mm 10 0.1 1
Wrench Bolt M2 4mm 6 0.1 0.6
Wrench Bolt M3 25mm 6 0.05 0.3
Wrench Bolt M4 40mm 6 0.08 0.48
Wrench Bolt M4 35mm 18 0.07 1.26
Wrench Bolt M4 8mm 6 0.03 0.18
Wrench Bolt M4 20mm 18 0.06 1.08
Wrench Bolt M4 45mm 2 0.09 0.18
Wrench Bolt M4 6mm 6 0.03 0.18
Wrench Bolt M4 10mm 4 0.04 0.16
Lead Screw Nut T8 1 2 2
LM Block 1 12.5 12.5
LM Rail 1 5.3 5.3
Pulley 12teeth 2 1.3 2.6
Timing Belt gt2 240mm 1 1.3 1.3
Steel Bar S45C 5ϕ 70mm 1 3.4 3.4
Bearing MR128zz 2 0.3 0.6
Bearing MR115zz 2 0.3 0.6
Washer Ring M5 2 0.03 0.06
PLA filament 1.75mm 2 17.4 34.8
Feeding Roller 2 2.4 4.8
Raspberry Pi 3B+ 1 48.5 48.5
Arduino MEGA 2560 1 9.2 9.2
DC Converter 5V 3A 1 3.3 3.3
Power Supply 200W 12V 1 26.4 26.4
7“ Touch Screen 1 44 44
SLA 3D Printed Parts 1 100 100
합 계 59 277.88 301.14

완료 작품의 평가

평가항목 평가방법 적용기준 개발목표치 비중(%) 평가결과
1.출력 속도 한 글자 출력 시간의 평균 초/글자 1 10 중상(0.8)
2.음성 인식 정확도 단어 음성 입력 정확률  % 99 15 상(100)
3.점자의 높이 출력된 점자의 높이 측정 mm 0.6~0.9 25 상(0.7)
4.점자의 지름 출력된 점자의 지름 측정 mm 1.5~1.6 25 상(1.5)
5.점간 간격 출력된 점자의 점간 간격 측정 mm 2.3~2.5 25 상(2.4)

향후평가

본 작품의 제작 순수 총 단가가 약 27만원이다. 그러나 이는 절감될 여지가 많이 남아있다고 생각한다. 대량 생산을 가정한다면 단가의 대부분을 차지하고 있는 아두이노와 라즈베리 파이와 같은 보드는 직접 PCB를 설계, 제작한다면 제작 단가가 더 절감될 것이고 케이스와 같은 플라스틱 부품들은 단조 등 여러 방법을 사용한다면 제작 단가가 더 절감될 것이다. 또한 DIY 키트 방식으로 판매를 한다면 조립 공정에서의 인건비를 절감할 수 있을 것이다.그러나 본 작품 분야의 신제품이 출시된지 8년이 지났을 정도로 본 작품 분야의 시장은 크지 않다. 2011년에 약 80만원의 가격으로 국내에서 개발된 점자 라벨 프린터가 출시되었다. 우리나라에는 점자법이 있고 제2조, 제5조 1항가 제5조 2항에서 국가와 국민은 점자의 발전을 위해 노력해야하고 공공기관은 시각장애인을 위해 점자가 널리 사용될 수 있는 정책을 수립, 시행해야 한다고 되어있다. 앞으로 점자법과 더 나아가 공공기관 및 민간장소에 문자 표기에 점자를 반드시 병기해야 한다는 정책이 수립, 시행된다면 본 작품 분야의 시장이 커질 것이라고 예상한다.

부록

참고문헌 및 참고사이트

[1] 김영일, 『점자 활용 규격 표준화 및 사용자별 교육 과정 개발』 (국립국어원, 2016), 40.

관련특허

제10-2017-0167067호(2017.12.04) 프린터를 이용한 점자출력물 제작방법 제10-2019-0132613호(2019.11.14) 가이드 롤러 프레스를 구비한 휴대용 점자 인쇄기 제10-2014-0043618호(2014.04.11) 점자 출력 장치 및 그 방법 제10-2015-0165123호(2015.11.25) 점자라벨 및 점자라벨 제조방법

소프트웨어 프로그램 소스

makedot_control.c(Aurdino Driver Code)
#include <stdio.h>
#include <errno.h>

#include <pthread.h>
#include <wchar.h>

#include <stdlib.h> 
#include <locale.h>
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 

#include <wiringPi.h>
#include <wiringSerial.h>

#define UDP_MAX_BUFFER      1024
#define SERIAL_MAX_BUFFER   1024
#define UDP_PORT            12345 

#define SERIAL_BAUDRATE 115200

extern int text2braille(wchar_t *src, int len, char *dot);

struct serial_state_t{
    int fd;
    char buffer_rx[SERIAL_MAX_BUFFER], buffer_tx[SERIAL_MAX_BUFFER];
} serial_state;

struct udp_state_t{
    int fd;
    int opened;
    char buffer_rx[UDP_MAX_BUFFER], buffer_tx[UDP_MAX_BUFFER];
    wchar_t buffer_un[UDP_MAX_BUFFER / 2];//, buffer_u8[UDP_MAX_BUFFER / 2];
    struct sockaddr_in servaddr;
} udp_state;

void udp_open(struct udp_state_t *s);
void *udp_recv(void *arg);
void serial_open(struct serial_state_t *s);
void serial_print_dot(char *dot);
void *serial_recv();

#define MAKEDOT_REST    0
#define MAKEDOT_BUSY    1

static int makedot_state = MAKEDOT_REST;
pthread_mutex_t mutex_lock;

int main(){
    char buf[1024];
    pthread_t tid, tid2;

    pthread_mutex_init(&mutex_lock, NULL);
    
    setlocale(LC_ALL, "");

    serial_open(&serial_state);
    udp_open(&udp_state);

    pthread_create(&tid, NULL, udp_recv, NULL);
    pthread_create(&tid2, NULL, serial_recv, NULL);

    while(1){
//      fscanf(stdin, "%s", buf);
  //      serialPrintf(serial_state.fd, buf);
    }

    pthread_join(tid, NULL);
    pthread_join(tid2, NULL);
    return 0 ;
}

void udp_open(struct udp_state_t *s){
    // Creating socket file descriptor 
    if ( (s->fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0 ){
        perror("socket creation failed"); 
        exit(EXIT_FAILURE); 
    }
    memset(&(s->servaddr), 0, sizeof(s->servaddr));

    // Filling server information 
    s->servaddr.sin_family      = AF_INET; // IPv4 
    s->servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    s->servaddr.sin_port        = htons(UDP_PORT);
      
    // Bind the socket with the server address 
    if (bind(s->fd, (const struct sockaddr*) &(s->servaddr),\
            sizeof(s->servaddr)) < 0 ){ 
        perror("bind failed"); 
        exit(EXIT_FAILURE); 
    }

    printf("udp server open\n");
}

void *udp_recv(void *arg){
    int len, n;
    struct udp_state_t *s = &udp_state;
    struct sockaddr_in cliaddr;
    struct sockaddr_in brdaddr;

    memset(&cliaddr, 0, sizeof(cliaddr));
    memset(&brdaddr, 0, sizeof(brdaddr));

    brdaddr.sin_family = AF_INET;
    brdaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    brdaddr.sin_port = htons(5001);


    printf("udp receive start\n");
    while(s->fd != -1){
        n = recvfrom(s->fd, (char *)(s->buffer_rx), UDP_MAX_BUFFER,\
                MSG_WAITALL, ( struct sockaddr *) &cliaddr,\
                &len);

        s->buffer_rx[n] = '\0';
        printf("%d Get from Client : %s\n", n, s->buffer_rx);

        //n = MultiByteToWideChar(CP_ACP, 0, s->buffer_rx, n, NULL, NULL);
        //MultiByteToWideChar(CP_ACP, 0, s->buffer_rx, s->buffer_un, n);

        printf("next\n");

        int i = 0;
        while(i < n && s->buffer_rx[i++] != ':');
        s->buffer_rx[i - 1] = '\0';

        if(strcmp(s->buffer_rx, "#makedot") == 0){
            if(makedot_state == MAKEDOT_BUSY){
                sendto(s->fd, "busy", 5, 0, (const struct sockaddr *) &cliaddr, sizeof(cliaddr));
            }
            printf("get makedot\n");
            char *cmd = s->buffer_rx + 9;
            char *value;

            i = 0;
            while(i < n && cmd[i++] != ':');
            cmd[i - 1] = '\0';

            printf("Cmd(%d) : %s\n", strlen(cmd), cmd);

            if(!strcmp(cmd, "ko") || !strcmp(cmd, "en")){
                value = cmd + 3;

                printf("Value(%d %d) : %s\n", strlen(value), n - 12, value);
                n = mbstowcs(s->buffer_un, (const char*)value, 1000);
                len = text2braille(s->buffer_un, n, s->buffer_tx);

                s->buffer_tx[len] = '\0';
                printf("serial(%d) : %s\n", len, s->buffer_tx);
                sendto(s->fd, s->buffer_tx, len, 0, (const struct sockaddr *) &brdaddr, sizeof(brdaddr));
                len = strlen(value);
                serial_print_dot(s->buffer_tx);

                //sendto(s->fd, (const char *)(s->buffer_tx), strlen(s->buffer_tx),\
                        MSG_CONFIRM, (const struct sockaddr *) &cliaddr, len);
            }
            else if(!strcmp(cmd, "state")){
                //sendto(s->fd, (const char *)(s->buffer_tx), strlen(s->buffer_tx),\
                MSG_CONFIRM, (const struct sockaddr *) &cliaddr, len);
            }
        }
    }
}

void serial_open(struct serial_state_t *s){
    /* Serial Open */
    if ((s->fd = serialOpen ("/dev/ttyS0", SERIAL_BAUDRATE)) < 0){
        fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno));
        exit(EXIT_FAILURE);
    }

    if (wiringPiSetup() == -1){
        fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno));
        exit(EXIT_FAILURE);
    }
}

void serial_print_dot(char *dot){
    struct serial_state_t *s = &serial_state;

    printf("serial go : %s\n", dot);
    fflush(stdout);
    pthread_mutex_lock(&mutex_lock);
    serialFlush(s->fd);
    
    serialPrintf(s->fd, "#D");
    int i = 0;
    while(dot[++i] != '\0');
    while(--i >= 0){
        serialPrintf(s->fd, "%c", dot[i]);
    } 
    serialPrintf(s->fd, "\n");
    
    pthread_mutex_unlock(&mutex_lock);
}

void *serial_recv(){
    struct serial_state_t *s = &serial_state;
    char buf[1024];
    int i = 0;

    printf("serial receive start\n");
    while(s->fd != -1){
        if(serialDataAvail(s->fd)){
            pthread_mutex_lock(&mutex_lock);
            buf[i++] = serialGetchar(s->fd);
            if(buf[i - 1] < 0 || buf[i - 1] >= 128)
            i--;
            if(i >= 1023 || buf[i - 1] == '\n'){
                buf[i] = '\0';
                printf("[from makedot] : %s\n", buf);
            //	fflush(stdout);
                i = 0;
            }
            pthread_mutex_unlock(&mutex_lock);
        }
    }
}