[63호]씀(SSM, Smart Spice machine)
2020 ICT 융합 프로젝트 공모전 장려상
씀(SSM, Smart Spice machine)
글 | 인하대학교 이은성, 강태욱, 남성훈, 이태민, 이홍찬, 정원욱
1. 심사평
칩센 재미있는 작품입니다. 여러가지 레시피를 DB로 등록하고, 사용자가 레시피를 따라 하면서 양념을 준비해야하는 시퀀스와 맞추어 동작하게 되면 매우 재미있을듯 합니다. 시제품이라 사이즈가 크고, 각 조미료 재료 마다 각각의 추출기가 있어야 한다는 것과, 추출기 내부 스크류에 잔류 조미료가 남아있게 된다는 점은 아쉬움이 남습니다. 추출기 내부에 무게를 측정하는 형태로 하여 정량만큼만 추출되는 형태로 하면 더 좋을듯 합니다.
펌테크 실생활에 활용될 수 있는 아이디어와 실용성을 지닌 작품이라고 생각합니다. 기획 의도에 맞게 시스템을 안정적이고 완성도 높게 구현하였고 제출된 보고서 구성 내용도 명확하고, 충실했다고 생각이 듭니다. 전체적으로 기획 의도, 기술 구현도, 완성도 등에서 우수한 작품으로 생각됩니다.
위드로봇 아이디어가 재미있습니다. 배출하고 남은 양념의 처리에 대한 고민이 더 추가되면 좋겠습니다.
2. 작품 개요
보통 요리를 자주 하지 않는 일반인이나 자취하는 학생들은 인터넷이나 책에 있는 음식 레시피를 참고해 요리한다. 요리를 어려워하는 사람들을 위해 요즘 레시피는 정확한 수치보다는 스푼이나 종이컵 등 생활에서 쉽게 구할 수 있는 도구로 계량을 한다. 하지만 이 또한 요리를 잘 하지 않는 사람들에게는 어렵게 느껴진다. 그리고 넣어야 하는 조미료가 많아질수록 도구도 많이 사용하게 되어 번거로움을 느낀다. 이런 사람들을 위해 ‘씀’은 조미료를 자동으로 계량하고 내보낸다. 사용자는 씀과 연동된 애플리케이션을 통해 계량 수치를 입력할 수 있고, 자주 사용하는 레시피는 저장하여 실행할 수도 있다.
본 제품은 애플리케이션을 통해 사용자가 원하는 값을 입력하면, 시스템 내에서 조미료를 분출시키는 동시에 계량을 하기 때문에 입력된 만큼만 분출하여 위생적이다. 또한 거치대와 조미료를 담은 통을 분리할 수 있게끔 설계하여, 조미료를 다 쓴 뒤에는 세척이 가능하다. 기존에 상용화된 조미료통보다 쉽게 사용자가 사용할 수 있게 하고, 위생적인 측면을 극대화하여 가정에서 씀을 사용함으로 좀 더 쉽게 요리를 할 수 있게끔 하였다.
더하여 가정에서뿐만 아니라 카페나 제과점, 프랜차이즈 음식 업계 등 정확한 계량이 필수인 분야에서 필요한 가루를 정확히 계량하는 데에 사용할 수 있어 다양한 분야에서 활용도가 높을 것으로 예상한다.
3. 작품 설명
씀(SSM)은 설계, 제어, 앱, 통신 이렇게 4가지 시스템으로 구성되어 있다.
3.1. 기계
가루나 파우더 형태의 조미료를 투입 후 애플리케이션으로 원하는 만큼의 양을 설정하면 자동으로 원하는 만큼의 양을 배출해준다.
조미료를 통의 상단에 투입하면 아래의 스크류 형태의 회전체가 회전하면서 작품의 앞쪽으로 배출해주며, 배출된 분체는 아래 접시에서 계량된다. 계량이 완료된 경우 스크류가 정지하여 분체 공급을 정지하게 되는 구조이다.
흔히 조미료로 사용하는 설탕, 소금의 경우 습기에 의해 분체간에 엉키거나 덩어리져 원활한 이동이 어려운 경우가 생긴다. 이때 그림의 A 와같이 분체를 섞어주며 덩어리진 분체를 분쇄해주는 역할을 해주는 회전 Paddle을 추가하였다. 또한 작품 내부에서 분체의 고착을 막아 B 로의 전달이 용이하도록 하는 역할도 함께 수행한다.
또한, 그림4과 같이 내부에 경사가 지도록 설계되어 주입된 모든 분체가 중력에 의해 화살표 방향으로 아래로 원활히 이동하도록 하였다.
음식에 사용되는 조미료를 이용하는 작품 특성상 위생에 대한 부분을 고려하여 분리 가능한 형태로 제작하였다. 조미료가 직접 닿는 부분은 본체와 분리하여 물로 세척이 가능하다. 모터가 사용되는 구동부와 분체를 내보내는 부분을 모듈식으로 해서 탈착이 가능하도록 하였는데, 육각형태의 어뎁터를 통해 동력 전달을 하고 있다.
3.2. 제어
아두이노를 통해 시스템을 실행시킨 후 통신이 연결되면 저울 위에 받침대를 놓고 영점 스위치를 누른다. 그 후 안드로이드 앱에서 원하는 무게를 입력하면 NodeMCU가 서버에서 사용자가 입력한 데이터를 가져오고 시리얼 통신을 통해 아두이노 보드로 값을 전달한다. 보드에서 값을 받으면 모터가 동작한다.
3.2.1. 모터
통의 내부에는 2개의 모터가 있다. A의 모터는 조미료가 습기로 인해 굳어지면 배출구를 통과하지 못하는 것을 방지하기 위하여 분쇄하는 역할을 담당한다. B의 모터는 나선형으로 된 스크류(screw)를 돌리면서 조미료가 적당량 나오게 한다. 조미료가 나오면서 무게를 측정하고 목표한 무게에 도달하면 모터가 멈춘다. 이 때 분출구와 저울 사이의 높이차로 인해 목표한 무게와 실제 무게에 차이가 있게 된다. 따라서 모터의 속도를 일정하게 하지 않고 실제 무게가 목표한 무게의 절반 이상이 되었을 때부터 모터의 속도를 감소시켜 오차를 줄이고 섬세하게 무게 조정을 할 수 있도록 하였다.
3.2.2. 스위치
또 서버에서 값을 보내자마자 바로 모터가 작동하여 조미료가 흩뿌려지는 것을 방지하기 위하여 물리적 스위치를 사용했다. 사용자가 준비가 끝난 후 스위치를 누르면 영점이 맞춰지고 모터가 작동된다.
3.3. 사용 부품
3.3.1. 로드셀
외력에 의해 비례적으로 변하는 탄성체에 휘스톤 브릿지 회로로 구성된 스트레인 게이지를 케이스에 내장시킨 센서이다. 힘이나 하중과 같은 물리량을 측정할 수 있다. 로드셀은 무게 값을 파운드 단위로 나타낸다. 상업용 전자거울 등 산업분야의 공장제어, 자동화 분야에 사용되고 있다. 로드셀이 무게를 측정하는 원리에는 로드셀의 표면에 붙어 있는 스트레인 게이지(Strain gauge)가 관여한다. 스트레인 게이지 내부에는 금속 호일이 지그재그로 설치되어 있고 힘을 받아 금속 호일의 길이가 변하면 저항 값이 변화하게 된다. 즉, 형태가 변화하는 만큼 전기신호의 값이 강해지고 이 값으로 무게를 측정할 수 있게 된다.
저항변화에 의한 작은 전압변화를 측정하는 방법으로 로드셀에서 휘트스톤 브리지 회로를 사용했다. 휘트스톤 브리지는 4개의 저항이 다이아몬드 모양으로 연결된다. 4개의 저항이 모두 같으면 중간의 측정단에서는 전압이 0으로 측정된다. 로드셀이 외부로부터 압력을 받으면 내부의 금속 호일이 길어지는 스트레인 게이지는 전류가 지나는 길이가 좁아지고 경로가 길어져 저항이 커진다. 반대로 수축하는 스트레인 게이지는 전류가 지나는 길이 넓어지고 경로는 짧아져 저항이 작아진다. 이렇게 저항이 변하게 되면 각 저항이 달라져 전압차가 발생한다.
3.3.2. HX711 앰프(증폭기)
로드셀에서 받아 들인 값을 아두이노에서 더 정밀하게 사용하기 위해 증폭장치인 hx711을 사용한다.
3.3.3. 모터드라이버(L9110)
하나의 보드에서 2개 이상의 기어 모터를 사용하기 위해 모터드라이버를 사용했다. 이 모듈은 pwm신호를 통해 5~12v에 해당하는 모터의 방향과 속도를 제어 할 수 있다.
3.4. 아두이노 보드 주요 알고리즘
3.4.1. 최초 calibration factor 설정
로드셀로 만든 저울은 만든 구조와 상황에 따라 Calibration Factor의 값이 달라진다. 때문에 저울을 제작할 때마다 Factor 값을 측정하는 코드를 최초 1회 실행해야 한다. 먼저 무게를 정확히 알고 있는 물체를 로드셀 위에 올려 놓고 그 무게를 아두이노에 입력해주면 자동으로 Calibration Factor(힘의 변화에 대한 출력 값의 변화 비율)를 설정해 출력해준다. 그 결과를 실제 무게 측정에 사용될 코드에 추가한다.
저울위에 에어팟(46g)을 올렸을 때 로드셀이 측정한 최초 무게는 41g이다. 이후 시리얼 창에 실제 무게인 46g을 입력하였다. 이후 Calibration Factor값이 1000씩 증감하며 측정 무게 42g을 실제 무게 46g에 맞게 조정한다. 42g으로부터 Calibration Factor값을 1000씩 감소시키며 실제 무게 46g에 자동으로 맞추었다.
3.4.2. 영점 조절과 무게 측정
앞의 Calibration Factor 설정 코드로 맞춘 Calibration Factor값을 적용하여 무게를 측정하였다. 분출되는 조미료의 양을 측정하기 위해서는 그릇을 올린 후 함수 scale.tare()를 이용하여 영점 조정을 해야 한다. 로드셀은 측정한 무게 값을 파운드 단위로 나타내기 때문에 453,492를 곱하여 우리에게 익숙한 g 단위로 변환하였다.
서버에서 목표 무게 값(Target)을 전송하면 NodeMCU를 통하여 값이 전달된다.
모터가 작동하기 시작하면 그릇에 분출된 조미료 양이 증가하는 것이 시리얼 모니터에 위와 같이 나타난다.
3.4.3. 모터 속도 제어
조미료가 떨어지면서 Weight 무게가 총 무게의 50%에 도달하기 전까지는 모터 속도는 최대 속도인 200으로 작동한다. Weight 무게가 Target무게의 50%이상이 되면 일정 간격으로 모터가 멈추었다가 다시 작동하도록 코딩을 하여 조미료가 계속 분출되는 것이 아니라 조금씩 분출되도록 하였다. 시연을 통해 분출된 조미료의 무게가 목표 무게에 도달한 순간에도 떨어지고 있는 잔여 조미료가 있어서 목표 무게보다 조미료가 조금 더 나오는 것을 확인했다. 이를 방지하여 목표 무게에 최대한 정확하게 맞추기 위하여 모터가 목표 무게에 가까워지면 분출되는 양을 적게하여 정확성을 높였다.
3.4.4. NodeMCU 주요 알고리즘
3.4.4.1. HTTP GET 요청
inoExectueData.php에 씀의 id 값을 GET 방식으로 HTTP 요청하여 사용자가 실행할 데이터를 받아 온다.
3.4.4.2. 데이터 받기
서버에서 혼동을 없애기 위해 보낼 값 앞에 ‘*’ 표시를 붙여서 보낸다. ‘*’가 들어오면 그 이후의 값을 읽는다. 그 후 아두이노 보드로 값을 전송한다.
서버로부터 20g의 값이 입력되면 NdeMCU시리얼창에는 c 변수로 2,0값을 받아 str로는 20이라는 값을 받는 것을 시리얼창을 통해 알 수 있다.
4. 애플리케이션
사용자는 자신이 자주 사용하는 레시피의 조미료 양을 저장하고 조미료통으로 실행할 수 있다. 혹은 레시피에 저장하지 않아도 실시간으로 필요한 조미료의 양을 애플리케이션을 통해 실행할 수 있다.
4.1. 애플리케이션 플로우 차트
4.2. 기능
1) 조미료 이름 저장 및 수정 : 애플리케이션을 처음 실행 시 조미료 이름을 저장하게 되고, 메인 레이아웃의 조미료 변경 버튼을 클릭해 변경할 수 있다. SharedPreferences를 사용하여 조미료의 이름을 서버가 아닌 내부적으로 저장 및 수정하게 하였다.
2) 커스텀 레시피의 저장, 수정 및 삭제 : 애플리케이션의 메인 레이아웃에서 우측 하단의 적색 플로팅 액션버튼을 클릭해 커스텀 레시피를 구성할 수 있게 하였다. 사용자가 입력한 값을 서버 데이터 베이스에 저장하여 수정 및 삭제할 수 있도록 하였다. 또한 메인 레이아웃에서 커스텀 레시피를 클릭하면 NodeMCU에게 값을 전송하여 조미료통을 실행한다.
3) 값을 입력해 바로 실행 : 커스텀 레시피를 저장해서 실행해야 하는 것이 아닌, 메인 레이아웃의 바로실행 버튼을 클릭해 조미료의 값만 입력하도록 구성하였고, 그 데이터를 NodeMCU로 바로 전송할 수 있도록 하였다.
4) 도움말 : 사용자가 사용법을 모를 경우 클릭하여 애플리케이션에 대한 전반적인 도움을 줄 수 있도록 실행 사진과 글을 넣어 설명하였다.
5) 애플리케이션 설명
① 처음 애플리케이션의 화면사용자가 사용할 조미료의 이름을 정한다.
②애플리케이션의 메인 레이아웃
숫자에 해당하는 버튼을 클릭 시 다음과 같은 이벤트를 취한다.
1) 앱 종료 (알림 창 팝업)
2) 도움말 액티비티 띄움
3) 레시피를 추가
4) 처음에 설정한 조미료를 변경
5) 조미료 값을 입력해 저장 없이 바로 실행한다. 또한, 휴대폰 자체의 취소버튼 두 번을 연속하면 종료된다.
③ 3번 버튼을 클릭해 동작한 커스텀 레시피 저장 레이아웃. 레시피의 이름, 조미료의 양을 입력 후 확인을 눌러 저장한다.
④ 새로운 커스텀 레시피가 생성된다. 추가된 레시피를 짧게 클릭할 시 선택된 레시피의 값을 서버로 전송한다. 레시피를 길게 클릭할 시 수정 및 삭제를 선택하는 알림창이나 팝업창을 띄운다.
4.3. Android studio의 구성 Activity와 Layout
4.4. 세부 class 설명
4.4.1. Data
· 데이터베이스에 사용하는 데이터들을 관리하는 Class이다.
· 레시피를 구분하는 int형 변수 id, 레시피의 이름을 저장하는 String형 변수 Title, 레시피의 조미료 1, 2의 이름을 저장하는 String형 변수 condiment0, 1, 레시피의 조미료 1, 2의 양을 저장하는 int형 변수 gram0, 1의 생성자와 Getter와 Setter로 이루어져 있다.
4.4.2. GetData
· Http 통신을 통해 서버에 POST 방식으로 데이터를 JSON 형식으로 수신한다.
· AsyncTask를 사용하여 서버 연결에 분리된 스레드를 사용하였다.
4.4.3. InsertData
· Http 통신을 통해 서버에 POST 방식으로 데이터를 송신한다.
· AsyncTask를 사용하여 서버 연결에 분리된 스레드를 사용하였다.
4.4.4. listAdapter
· 데이터와 list_card.xml를 ListView와 연결하기 위해 사용하는 다Class이다.
4.4.5. Preference Manager
· 조미료의 이름을 서버에 저장하는 DB가 아닌 애플리케이션이 설치된 기기 안에서 저장하기 위해 사용한 Class이다.
4.5. 세부Activity 설명
4.5.1. InitialActivity
· 조미료의 이름을 설정하는 Activity, 확인버튼을 클릭하면 PerFerenceManeger Class를 통해 기기 내부에 조미료 이름을 저장한다. 도움말 버튼을 클릭하면 QuestionActivity를 실행한다.
4.5.2. MainActivity
· 이 프로젝트의 애플리케이션에서 기본화면을 담당하고 있는 Activity이다.
· 우측 하단의 적색 플로팅 액션버튼을 클릭하면 AddActivity 실행하고, 우측 상단의 ? 버튼을 클릭하면 QuestionActivity가 실행된다.
· 조미료변경 버튼을 클릭하면 PreferenceManager에서 저장했던 파일을 지우고 InitalActivity을 실행한다.
· 바로실행 버튼을 클릭하면 PlayActivity 실행한다.
· 좌측상단의 X 버튼을 클릭하면 애플리케이션의 종료여부를 묻는 알림창을 실행한다.
· 커스텀 레시피를 추가하여 서버에 데이터베이스가 생성되었다면 그림과 같이 ListView에 데이터가 생긴다.
· 데이터를 짧게 클릭하게 되면 실행여부를 묻는 알림창 생성되며, 데이터를 길게 클릭하게 되면 수정 및 삭제 여부를 묻는 알림창이 생성된다.
· 기기 자체의 뒤로 가기 버튼이 두 번 연속 입력되면 앱이 종료된다.
4.5.3. AddActivity
· 커스텀 레시피를 추가하는 기능을 가진 Activity. 제목과 그램수를 입력하고 확인 버튼을 클릭하게 되면 변수 title, gram0, gram1에 EditText의 값을 불러오고 InsertData 클래스를 통해 데이터베이스에 저장한다. 좌측상단의 X버튼을 누르면 Activity가 닫힌다.
4.5.4. PlayActivity
· 바로 값을 입력하여 PHP를 통해 데이터를 전송시키는 Activity. EditText에 입력된 값을 불러오고 InsertData 클래스를 통해 데이터 전송한다. 좌측상단의 X버튼을 누르면 Activity가 닫힌다.
4.5.5. QuestionActivity
· 사용자에게 도움을 주기위한 Activity. 좌측상단의 X버튼을 누르면 Activity가 닫힌다.
5. 통신
서버와 2개의 클라이언트(애플리케이션, 아두이노)가 통신한다. 서버에는 사용자가 저장한 레시피가 데이터베이스에 저장되어 있다. DB에는 Recipe와 Ino 테이블이 있다.
5.1. recipe 테이블
사용자가 설정한 레시피에 대한 정보가 담겨 있다.
5.1.1. 구조
5.1.2. 필드 설명
5.2. ino 테이블 구조
아두이노에서 실행해야 하는 정보가 담겨 있다.
5.2.1. 구조
5.2.2. 필드 설명
5.2.3. PHP 설명
6. 개발 환경
설계 : NX 10.0, 제어 : Arduino, 애플리케이션 : Android Studio, 통신 : MySQL, Bitnami
7. 단계별 제작 과정
7.1. 작품 설계
분체형태의 조미료를 정확한 양으로 일정하게 배출하는 방법을 고안해 내기까지 설계에 있어 시행착오가 있었다.
설계 초기에는 그림과 같이 중력으로 인해 떨어지는 분체를 여닫는 장치를 사용하여 정량을 배출해내는 방식을 고안했었으나, 분체간의 마찰로 인해 낙하하는 분체의 양이 저장되어 있는 분체의 무게와 분체간의 마찰에 영향을 받아 시간에 따라 일정하지 않게 될 염려가 있었다. 또한, 분체의 이동 중에 즉각적인 차단이 어렵고, 작동 중에 분체가 구동부에 끼어 정확한 동작에 방해가 될수 있다고 판단하였다.
이를 보완하기 위해 최종적으로, 그림과 같이 스크류를 통해 분체를 지면에 수직방향이 아닌 평행한 방향으로 배출하는 방법을 고안하였다. 스크류의 회전에 따라 일정한 양의 분체가 공급되며, 회전이 멈추면 차단되도록 회전수를 조정하였다. 스크류의 경우 모터의 속도와 회전당 공급할수 있는 분체량을 고려하여 회전수를 조정하였다.
7.2. 소재 및 가공방법 선정
소재 선정에 가공 편의성과 정확성, 가공비용 등을 고려했을 때 3D프린터를 통해 가공하는 것이 가장 적절하다고 생각하였다. 특히, 스크류 형태의 부품을 제작함에 있어 절삭등의 방법을 사용하기에는 비용면에서 감당이 불가능하기에 이에 중점을 두고 고려하였다. 필라멘트는 작품이 식품에 사용되는 조미료를 사용함에 따라 안정성 확보를 위해 PLA 필라멘트를 사용하였다.
스크류의 경우 수직으로 길게 가공하는 도중에 3D프린터의 적층 오류로 인해 오차가 발생하였고, 이것이 회전에 있어서 간섭을 발생 시켰다. 이를 선반을 이용해 재가공하여 발생한 오차로 인한 편심을 바로잡도록 하였다.
모든 가공 이후 부품들을 조림하고 테스트를 하였을 때, 굵은 결정체인 설탕이나 소금의 경우 스크류와 본체 벽 간의 공간에 끼어 스크류의 회전이 멈추는 경우가 있었다. 처음 설계한 스크류는 회전시 스크류의 옆면과 벽이 면으로 밀착하게 하여 분체가 흘러들어가는 경우를 막고자 하였으나, 공차가 존재함에 따라 분체가 벽 사이에 끼어드는 경우가 생길수 밖에 없었다. 또한 마찰면적이 넓음에 따라 선정했던 모터의 출력만으로는 정상적인 작동이 어려워지는 문제가 발생하였다. 따라서 스크류의 옆면을 선 형태로 설계하고, 스크류 내부에 가진부분에 부드러운 형상을 가지도록 처리하여 분체를 더 잘 내보낼수 있도록 설계하였다.
초기에 설계한 프레임과 달리 크기가 비교적 크고, 가공 중에 정밀성 요구의 정도가 비교적 적다고 판단하여 프레임은 제작 편의상 5T 포맥스를 사용하여 제작하기로 결정하였고, 위와 같이 설계를 수정 후 제작하였다.
8. 회로도