March 24, 2019

디바이스마트 미디어:

[37호]전도성 페인트를 이용한 Electric Menu

전도성 페인트를 이용한 Electric Menu

글 | 단국대학교 강영웅, 이주명

심사평

펌테크 일상 생활에 접목된 참신한 아이디어 제품이라고 생각됩니다. 얇고 가볍게 기획한다면 상업성도 충분하다고 생각합니다.
JK전자 낮은 가격에 기존의 값 비싼 패드를 대체하여 사용이 가능하도록 설계한 아이디어는 괜찮다. 전자식 메뉴판에 화면이 없을 경우 주문을 하고나서 바로 취소를 한다던지 하는 비정형적인 상황을 모두 처리하기에는 부족한 면이 있을 수 있을것 같다.
뉴티씨 일상 생활에서 무심코 지나치던 불편함을 여러 기술을 통해 해결한 좋은 모범 솔루션이다. 주변의 식당에 이것이 도입이 안된것이 아쉽다. 다음에는 여러 식당에서 이 솔루션을 많이 채택했으면 하는 작은 소망이 있다.
칩센 사용자 편의성을 고련한 아이디어로 어느 정도 상품성은 있다고 본다. 음식점 이용자의 정확한 메뉴 선정과 인건비 절감이 가장 큰 기대 효과로 보여진다. 하지만 제품 완성도는 휴대성을 고려할 때 배터리 문제, 충전지 사용시 충전 문제 등 운용 관리 부분은 매우 미흡한 점이 보여 아쉽다.
위드로봇 기존 서비스를 제공하는 방식에서 가격을 낮추는 시도는 항상 성공할 수 있는 방식이라고 생각합니다. 특히 전도성 페인트를 이용하여 고가의 스마트 패드를 대치한다는 아이디어는 창의성 측면에서 매우 멋진 아이디어로 생각됩니다. 또한 메뉴판만 제작하는 시도에 더하여 주방에서 이를 처리할 수 있는 부분과 카운터 부분까지 구현한 것은 전체 데모 시나리오를 볼 수 있어 완성도가 높아 보입니다. 반면 스위치 입력 처리하는 부분은 단순 인터럽트 처리 보다는 스캔하는 방식으로 구현하면 MCU 리소스를 많이 줄일 수 있었을 것입니다. 그럼에도 불구하고 전체 시스템을 구현하여 그 동작을 확인했다는 측면에서 높이 평가합니다.

작품개요

오늘날의 음식점 또는 주점의 주문 시스템은 매우 수동적이라는 것을 잘 알고 있을 것이다. 메뉴판을 하나하나씩 넘겨가면서 메뉴를 고른 뒤에 직접 종업원을 불러서 주문하는 방식이다. 이러한 단점들을 보완하여 몇몇 음식점이나 주점 또는 카페에서는 아이패드를 이용한 주문 방식이 도입된 곳이 있다. 그러한 주문 방식은 기존의 주문방식과 전혀 다르다는 것을 알 수 있다. LCD를 보면서 자신들이 원하는 메뉴를 선택하여서 주문하는 방식인데 이 시스템이 좋지만 가장 큰 단점은 가격이 만만치 않다는 것이다. 그것을 보완하고자 이번에 전도성 페인트를 이용하여 Electric Menu board를 개발하게 되었다.
Electric Menu board는 기존의 2가지의 형태로 책자 형식과 패드 형식이 있다. 메뉴판에서 선택한 메뉴를 데이터 형식으로 넘겨서 작은 이동식 PC인 라즈베리파이라는 보드 내의 database에 data들을 차곡차곡 쌓는다. 라즈베리파이는 이동하면서 쓸 수 있다는 큰 장점이 있기 때문에 음식을 만드는 주방이나 계산대에서 LCD를 통해서 실시간으로 바로바로 주문한 내역들을 확인할 수가 있고 이후 상황에 따른 대처를 쉽게 할 수 있을 것이다. 또한 웹서버 구축을 통하여 종업원을 따로 불러서 물어볼 필요없이 핸드폰으로 실시간 주문내역 확인도 가능하다. 이 메뉴판은 기존의 아이패드 방식의 단점을 보완하여 단가를 최대한 낮추면서 주문 시스템을 효율적으로 운영할 수 있다는 큰 장점이 있으므로 더욱더 완벽한 제품으로 개발하여 구현시킬 것이다.

작품설명
작품 특징
· 라즈베리파이를 이용하여 database를 통해서 메뉴판에서 통신으로 오게 되는 data의 효율적인 관리와 웹서버 구축을 통해서 주문내역을 실시간으로 확인 할 수 있다.
· 전도성 페인트를 이용하여 깔끔한 스위칭 형식의 내부 회로 설계와 간결한 디자인을 설계한다.
· 메뉴판을 서로 다른 테이블에서 동시에 사용했을 때 data 전송에 있어서 문제가 없도록 특정 값을 설정해 두어서 필터링 시킨다.
· 구동방법 설계 : 전도성 페인트를 이용하여 스위칭 형식의 내부 회로 설계를 한 후에 메뉴를 골라 선택하게 되면 데이터를 전송하게 되고 그 데이터를 라즈베리파이에서 받아 database에 저장시킨다. 라즈베리파이에는 웹서버가 구축되어 있기 때문에 굳이 카운터 쪽에서 시스템을 구현시켜 놓지 않아도 매장 운영 및 관리를 쉽게 할 수가 있다.
· 주문이 정확하게 잘 되었는지 눈으로 바로 확인하기 위해서 메뉴판 자체에 LED를 사용해서 라즈베리 파이 쪽에 data 송신과 동시에 특정한 값을 수신 받도록 설정해 두어서 확인한다.
· 차후에 웹에서 회원가입 시스템을 도입해서 사전 예약이 가능하고 회원 관리도 할 수 있도록 개발할 계획이다.

보유핵심기술
전도성 페인트를 이용한 간결하면서 효율적인 메뉴판에서 Bluetooth 통신을 이용하여 메뉴 Data를 Raspberrypi(이하 라즈베리파이)라는 이동식 소형 PC쪽으로 정보를 넘기게 되면, 그 정보를 체계적으로 관리할 수 있는 Database와 모바일 웹상으로 실시간으로 정보를 확인할 수 있도록 하는 기술이다.

2015ict융합 37호 (1)

주 연구 내용으로는 흔히 많이 쓰이고 있는 메뉴판의 수동적인 단점과 아이패드를 이용한 전자식 메뉴판의 단가적인 문제의 단점을 개선하였고 전도성 페인트를 이용하여서 아주 간결하게 하나의 메뉴판처럼 제작하였다. 또한 라즈베리파이가 이동식 소형 PC같은 보드이기 때문에 공간 제약 없이 언제 어디서든 쓸 수 있도록 환경을 만들어 놓을 수 있다.
이 외에도 보유 기술로서 LED를 이용하여 충전 및 전압 잔량이나 데이터의 송수신을 나타내는 기술이 있으며 마지막으로 여러 개의 Bluetooth 송수신에 있어서 Data filtering을 통하여 정확한 송수신을 할 수 있는 기술을 보유하고 있다.

2015ict융합 37호 (2)

특허 및 경쟁기술 비교
우리 제품의 강점은 기존에 있던 수동적인 메뉴판과 아이패드를 이용한 메뉴판의 단점들을 보완했다는 점이다. 가장 먼저 현재 시중에서 가장 많이 쓰이는 수동적인 메뉴판은 손님들이 붐비는 음식점이나 주점에서 메뉴를 선택한 후 종업원을 호출하고 주문하기까지 아주 불편한 부분들이 많았다. 이러한 어려움이 있기 때문에 종업원 호출 없이 자유롭게 메뉴를 고를 수 있도록 해두었고 받는 쪽에서도 메뉴 데이터가 날아오게 되면 신속하게 처리할 수 있기 때문에 능률이 훨씬 더 좋아 질 것이다.
그리고 시중에서 쓰긴 하지만 보편화가 그리 많이 되지 않은 아이패드 같은 경우에는 제품의 단가가 매우 비싸기 때문에 넓은 규모의 음식점이나 주점에서 테이블마나 한 개씩 충당하기엔 매우 부담감이 클 것이다. 그러한 점을 보완하여 낮은 단가에 똑같은 주문 방식을 구현함으로써 훨씬 경제적이고 효율적일 것이다. 또한 실시간으로 자신이 앉은 테이블 정보를 핸드폰 웹상으로 눈으로 학인할 수가 있기 때문에 훨씬 더 수월하게 이용할 수 있을 것이다.

Software 구성
Data Transmission
전도성 페인트와 트랜지스터로 만든 터치형 스위치를 누르면 데이터 값이 Bluetooth를 통해서 송신이 된다. 이때 Bluetooth에는 메뉴판의 송신완료 스위치를 누르기 전까지 값이 날아가지 않고 있다가 메뉴를 모두 고른 뒤에 송신완료를 누르게 되면 각각의 메뉴의 데이터 값을 하나의 패킷 형태로 라즈베리파이의 수신담당 Bluetooth로 값을 보내게 된다. 패킷형태로 보내기 때문에 여러 데이터를 좀 더 효율적으로 보낼 수 있다.

2015ict융합 37호 (3)
Data Reception
메뉴판 쪽에서 송신완료의 명령을 주면 패킷의 형태로 데이터 값을 라즈베리파이의 수신 Bluetooth로 송신을 하게 된다. 수신을 담당하는 Bluetooth는 그 패킷 안에 있는 데이터 값을 앞에서부터 차례대로 MYSQL Database(이하 DB)에 저장하게 된다.

2015ict융합 37호 (4)
DB의 구성
DB의 구성은 위와 같다. 먼저 TABLE DB는 매장 안에 있는 Table 정보를 저장 하는 곳이다. 다른 것은 말 그대로 날짜, 테이블번호, 메뉴, 가격, 주문 개수, 주문가격 합, 세일된 주문가격 합 인데 주문 상태와 주문 양 상태는 의미가 있다. 주문 상태는 TABLE DB에 주문이 들어오게 되면 State가 1에서 2로 변하게 된다. 그렇게 함으로써 나중에 웹페이지에서 데이터를 끌어 갈 때 가져갈 수 있는 것이다. 주문 양 상태라는 것은 메뉴판을 이용할 때 소비자들이 단 한번만 시킬 경우는 없을 것이다. 아마 여러 번 시킬 경우도 있을 텐데 그 경우를 대비하여 주문 양 상태라는 것을 count해서 주방용 모니터링 시스템에서 추가 주문이 들어왔을 경우에 추가 주문된 메뉴를 바로 제공해 줄 수 있도록 설계하였다.
두 번째로 총 누적 DB는 매장의 한 달 매출과 연 매출들을 관리하기 위해 설계해 두었다. 매장 운영 시 어느 품목이 가장 잘 팔리고 전체적인 매출관리도 해야 할텐데 그 부분을 고려하여 설계해 두었고 한 달에 한 번씩 새롭게 갱신이 된다. 포스 시스템에서 매출관리 및 품목관리가 가능하다.

Web server
Tomcat을 이용하여 서버를 구축하였고 Java Server Page (이하 JSP)를 써서 각각 포스기 시스템, 주방용 모니터링 시스템, 모바일 시스템을 만들었다. 가장 첫 번째로 포스기 시스템을 설명하자면 흔히 매장에서 볼 수 있는 포스기 시스템과 유사하다. 테이블마다 어떤 메뉴를 시켰고 금액은 얼마 정도가 나왔는지 확인이 가능하며 메뉴를 잘못 시켰을 경우에 선택하여 취소할 수 있는 기능과 한 달에 한번 매장의 매출이 얼마나 나왔는지 확인이 가능하며 한 달이 지났을 경우엔 새로운 DB로 갱신하여 저장한다. 특정 메뉴가 어느 정도 팔렸고 그 가격이 어느 정도인지 확인 할 수 있는 기능도 있고 지금까지 총 판매 누적금액이 어느 정도인지 확인 할 수 있는 기능도 추가해 두었다. 계산 부분에선 총 금액이 어느 정도이며 거스름돈 계산과 동시에 완료를 누르게 되면 Date는 다시 새롭게 갱신된다.
두 번째로 주방 시스템은 주방 자체에 모니터를 통하여 실시간으로 테이블에서 들어오는 메뉴들을 확인한다. 이렇게 함으로써 주방에서 주문을 받는 사람들은 모니터링을 통해 메뉴가 들어오면 즉시 메뉴를 만들어서 밖으로 내기만 하면 되기 때문에 이전의 고전적인 메뉴 주문 방식과 다르게 신속하게 처리가 가능해져 일의 능률이 올라갈 것으로 생각된다. 마지막으로 모바일 시스템은 사용자들이 식사를 하다가 자신들이 어느 정도 이용했고 금액은 어느 정도 책정되었는지 모바일을 통하여 즉시 확인할 수 있는 시스템이다. 이 모바일 시스템은 깔끔한 디자인 형태로 제작되었으며 매장의 정보와 메뉴 정보 등을 알 수 있고 매장 이용시 건의 사항들은 메일로서 모바일에서 바로 보낼 수 있다.

2015ict융합 37호 (6)
전체적인 시스템 흐름

Software 흐름도

블루투스를 통해 데이터 값이 들어오게 되면 라즈베리파이에 올라가 있는 DB에 데이터가 저장이 된다. DB에 저장되어 있는 데이터 값에 따라 웹 페이지에서는 State의 상태에 따라 값들을 뿌린다. 포스기에서 테이블 정보를 전체적으로 확인하면서 계산 및 매장 정보까지 확인할 수 있고 주방용 모니터링 시스템에선 State의 값이 설정해 놓은 조건에 충족될 경우 지속적으로 나오게 됨과 동시에 모바일 웹 페이지에서 사용자들은 테이블 정보를 확인할 수 있다. 모바일 웹 페이지는 소비자들의 디바이스의 크기가 모두 다르기 때문에 반응형 웹의 형태로 제작되었고 포스기에서 계산을 완료하기전 총 누적 DB에 값을 저장시켜 놓는다. 매장 관리자는 이 DB를 통해 품목마다 팔린 수량이 어느 정도 되는지 검색을 통하여 확인함과 동시에 총 누적 금액도 알 수 있다. 나머지 계산 부분에선 원래 가격에서 10% Discount 된 가격으로 책정되며 포스기에서 소비자가 지불한 금액에 대해서 거스름돈도 책정된다. 모든 과정이 끝나고 계산완료 버튼을 누르게 되면 DB는 초기화되고 Table에 올라가 있던 데이터들은 모두 사라진다.

2015ict융합 37호 (6)
라즈베리파이 & 웹 서버 알고리즘

 

Software 기능
소비자들이 메뉴판에서 메뉴를 선택하기 전 DB의 State는 1로 유지된다. 메뉴가 선택이 되는 순간 State는 2로 변하게 되면서 블루투스를 통해 데이터가 패킷의 형태로 순서대로 메뉴의 번호에 따라 순서대로 라즈베리파이의 DB에 차곡차곡 쌓이게 된다. 라즈베리파이에는 Tomcat으로 서버가 구축되어 있는데 서버에는 JSP로 만들어진 포스기 시스템, 모바일 시스템 그리고 주방용 모니터링 시스템이 있다. 각각의 시스템들은 Table마다 State가 2인 메뉴 값들을 모두 뽑아온다. 주방용 모니터링 시스템은 3초에 한 번씩 Refresh되는데 소비자가 메뉴를 주문했을 때 라즈베리파이로 데이터가 오자마자 바로 웹상으로 띄운다. 마지막에 계산을 하기 전까지는 메뉴마다 이 상태는 계속 지속된다. 그런데 소비자가 계산을 하게 되면 State는 1로 초기화 되고 시스템들은 State가 2가 아니기 때문에 목록상에 띄우지 않게 된다. 그 후 테이블에 있던 모든 메뉴들은 초기화가 되고 다음 소비자들이 메뉴를 주문할 때 까지 Date값은 0을 유지한다.

 

2015ict융합 37호 (7)
메뉴판 & 라즈베리파이 알고리즘

전도성 페인트로 만들어 놓은 메뉴판에서 메뉴를 선택하게 되면 데이터 값이 블루투스를 통해 날아가게 된다. 그 데이터는 패킷의 형태로 날아가며 날아감과 동시에 메뉴판에 부착된 LCD에 값이 나오게 된다. 라즈베리파이에서 수신 블루투스는 패킷의 형태로 데이터 값을 받아서 DB에 순서대로 채워 넣게 된다. 그러다가 한 번 더 패킷의 형태로 데이터 값이 날아 왔을 때에는 업데이트 형식으로 기존에 있던 데이터 값에서 추가 되는 형식으로 DB에 저장이 된다.

2015ict융합 37호 (2)
포스기 시스템

프로그램 사용 모습

흔히 매장에서 볼 수 있는 포스기 시스템과 유사하다. 테이블마다 어떤 메뉴를 시켰고 금액은 얼마 정도가 나왔는지 확인이 가능하며 메뉴를 잘못 시켰을 경우에 취소할 수 있는 기능과 한 달에 한 번 매장의 매출이 얼마나 나왔는지 확인이 가능하며 한 달이 지났을 경우엔 새로운 DB로 갱신하여 저장한다. 특정 메뉴가 어느 정도 팔렸고 그 가격이 어느 정도 인지 확인할 수 있는 기능도 있고, 지금까지 총 판매 누적 금액이 어느 정도 인지 확인할 수 있는 기능도 추가해 두었다. 계산 부분에선 총 금액이 어느 정도이며 거스름돈 계산과 동시에 완료를 누르게 되면 DB는 다시 새롭게 갱신된다.

2015ict융합 37호 (8)
주방 모니터링 시스템

주방 모니터링 시스템은 2초마다 Refresh 되도록 설계해 두었다. 지속적인 업데이트를 통하여 소비자가 메뉴를 주문했을 때 즉시즉시 모니터링 해서 해당 메뉴를 만들어 낸다. 리스트 항목에서 상태 부분은 소비자가 메뉴를 주문했을 때 하나의 패킷형태로 날아오기 때문에 이전에 주문했던 수량과 다음에 추가 주문한 수량을 비교하여 몇 개를 주문했는지 Count해서 추가 주문된 수량을 표시해 주는 항목이다.

2015ict융합 37호 (9)
모바일 웹 시스템

반응형 웹을 이용하여 소비자들의 디바이스의 크기에 상관없이 가지각색의 디스플레이에 적용되도록 만들어 두었다. 사용자들이 식사를 하다가 자신들이 어느 정도 이용했고 금액은 어느 정도 책정되었는지 모바일을 통하여 즉시 확인할 수 있다. 모바일 시스템은 깔끔한 디자인 형태로 제작되었고 매장의 정보와 메뉴 정보 등을 알 수 있도록 되어있으며, 매장 이용 시 건의 사항이나 문의 사항들은 메일로서 모바일에서 보낼 수도 있다.

System Architecture (시스템 구성)

2015ict융합 37호 (10)
System Architecture는 크게 메뉴판 부분과 라즈베리파이 부분으로 나눌 수 있다. 메뉴판 부분은 Atmega8 MCU에 입출력 장치인 LCD와 핀 입력을 받는 터치스위치 부분이 있으면 블루투스로 라즈베리파이로 전송을 한다. 라즈베리파이는 기본적으로 라즈비안이라고 하는 리눅스 OS가 올라가 있다. 라즈베리파이는 전송받은 문자열을 검사하고 필터링하여 해당 DB의 테이블 수량을 변경시킨다. 주문 현황이나 가격을 알 수 있는 모바일용, PC용 웹 페이지가 존재하며, 또한 주방에서 실시간으로 주문현황을 할 수 있도록 하는 웹 페이지와 계산을 위한 POS 페이지도 별도 구성되어 있다.

개발 환경

2015ict융합 37호 (11)
· 언어 : C, Java, HTML5+Css3+Javascript, JSP & Servlet
· 툴 & 환경 : Codevision, Eclipse, Gcc, Linux

단계별 제작 과정

2015ict융합 37호 (12)

패드형식의 기본 구성은 Atmega8 2개가 TWI 통신을 하도록 되어있고, 블루투스와 2*22 CLCD가 연결되어 있는 모습이 초기 구성형태이다.
블루투스는 Blue M -G 시리즈를 초기에 사용하였다.

2015ict융합 37호 (13)

2015ict융합 37호 (14)

전도성 페인트를 통해 손으로 제어를 시도하는 경우 신호의 입력을 받도록 처리해야하는데, 사람 손의 저항이 너무 커서 핀입력 제어가 되지 않는 문제점이 생겼다. 그래서 NPN 트랜지스터 2개를 이용해 터치스위치 회로도를 구성하는 방법을 알게되어, 이를 패드형식에 붙일 수 있도록 터치스위치를 구성하였다. LED는 해당 터치스위치가 제대로 동작하는지 확인할 수 있는 역할 겸 다이오드의 역할을 하도록 부착하였다.

2015ict융합 37호 (15)2015ict융합 37호 (16)

NPN 트랜지스터 2개를 이용한 터치스위치 구성의 실험과 전도성 페인트를 같이 이용하여 잘 동작하는를 실험하는 과정이다.
터치스위치의 회로도를 보면 터치 단자의 한쪽은 VCC쪽이고 한쪽은 트랜지스터와 연결되므로 전도성 페인트와 연결되는 부분에 한쪽은 VCC, 나머지 한쪽은 트랜지스터 쪽으로 연결되도록 구성하였다.
터치할 때 전류가 흐르는 부분은 MCU의 핀 부분으로 연결이 되어 있어서, 터치가 이루어질 때마다 핀 입력 제어를 할 수 있도록 구현하였다.

2015ict융합 37호 (17)

패드의 기본 틀은 포맥스를 이용하여 만들었고, 위에서 제작한 각각의 부품들을 종합하여, 틀 안에 배치를 하고 움직이지 않도록 고정을 시켜놓는 과정이다. 상단부는 CLCD가 연결되어 있다.

2015ict융합 37호 (18)

위에서 제작한 패드의 전면부의 모습이고, 그려져 있는 부분은 전도성 페인트로 그려놓은 부분이다. 단자는 임의로 일렬로 그려놨지만, 만약 원하는 위치가 다르다면 마음대로 그려서 사용이 가능하다. 또한 유지보수적인 측면에서도 다시 펜으로 그리면 끝이기 때문에 매우 편리하다.

2015ict융합 37호 (19)

이 사진은 위에서 패드 형식의 메뉴판을 만드는 동안 포맥스를 자르고 점프선을 이용하여 내부 회로들을 구성하고 있는 사진이다.

2015ict융합 37호 (20)

메뉴판에서 블루투스를 통해 라즈베리파이로 수신을 받으면, 라즈베리파이는 정해진 패킷 형태에 따라 해당 테이블의 주문 메뉴의 수량을 올려주게 되고, 라즈베리파이는 가격과 세일된 가격, 수량 등을 업데이트 구문을 통해 바꿔주게 된다. 수량이 1개 이상이면 상태를 2로 바꿔주고, 나중에 상태가 2인 부분들만 가져가서 데이터 처리를 할 수 있도록 구현하였다.

2015ict융합 37호 (21)

책자 형식의 메뉴판을 만들기 위해 기본 틀이 되는 책자를 구하였고, 그곳에 기본 단자들을 그리고 있는 과정이다. 물론 단자는 어떤 위치에 그려도 상관이 없다.

2015ict융합 37호 (22)

책자 형식의 메뉴판에다가 기본 단자의 위치 구성을 하고, MCU와 연결되도록 선들을 펜으로 그리고 있는 과정이다. 펜을 이용하면 선을 그리듯이 사용하면 되기 때문에 작업에 수월함이 있다.

2015ict융합 37호 (23)

책자 형식에선 Atmega128 2개를 이용하여 구성을 하였고, 아래 LED 부분은 터치스위치 회로를 구성해 놓은 부분이다.
TWI 통신을 사용하는 이유는 평소에 주문 수량에 따라 LED가 깜빡거리다가 스위치가 눌리면 바로 수량이 추가가 되는 동작을 해야하는데, 이러기 위해서 인터럽트(interrupt)가 필요하다.

2015ict융합 37호 (24)

그런데 Atmega128의 외부 인터럽트의 수는 단자의 수보다 훨씬 적기 때문에, 일반 핀입력 제어를 하고, TWI 인터럽트를 사용하기로 했다. 다른 방법으로, 포트확장 칩을 사용할 수도 있지만, 추후에 매우 많은 핀이 생길 것이라는 가정 하에 프로세스 부를 2부분으로 나누어 처리하도록 하였다.

2015ict융합 37호 (25)

2015ict융합 37호 (26)

책자 형식의 메뉴판 제작에서는 선처리를 하는 부분에서 많은 어려움들이 있었다. 점프선 말고도 전도성 실이나 전도성 고무줄도 있는 것을 확인하였다. 이 부분을 실로 철한다면 훨씬 처리하기 수월했을 것이라고 생각한다. 이미 구성 부분을 거의 한 상태라 실로 처리하는 것은 추후에 보완을 하여 만들어도 좋을 것이라고 생각한다.

2015ict융합 37호 (27)

MCU까지 부착한 최종 형태. 기존의 패드 형식은 LCD마저 가격이 나가기때문에 책자 형식은 LED를 이용한 카운팅 방식을 이용한다. 그리고 기존의 패드는 터치시 바로 메뉴가 추가됐지만, 책자 형식은 한번에 모아서 주문완료 버튼으로 주문을 하기 때문에 더욱 실효성을 높인 형태이다.
테이블 단위로 선택하는 번호는 Onclick 이벤트로 인해 String값으로 테이블 값이 날아가게 된다. String형의 테이블 번호는 int형으로 변환되며 그 번호에 속한 테이블의 주문한 메뉴와 책정 금액 등을 확인할 수 있다. 자바스크립트를 이용하여 거스름돈 계산, 총 매출 확인, 메뉴 삭제, 특정 메뉴의 판매량 등의 기능을 구현하였으며, 계산을 완료 했을 시에는 테이블의 DATA값들을 총 매출 테이블로 복사함과 동시에 초기화 시킨다.

2015ict융합 37호 (30)

주방에서 지속적으로 확인할 수 있는 주방 카운팅 뷰 시스템이다. 이 페이지가 지속적으로 업데이트 되는 것을 확인하기 위하여 페이지를 5초에 한번씩 Refresh시키는데, 이것은 Meta 속성 내부에 http-equiv 속성 중 refresh를 사용하고 content 내부에 숫자를 입력해주면 sec 단위로 문서를 reload 시킨다. 이것을 이용하여 블루투스로 송신되는 DATA값들을 지속적으로 확인한다. 만약 메뉴가 추가 되었을 시에는 몇 개가 추가 되었는지 확인할 수 있으며, 이 시스템도 테이블 단위로 확인이 되고 테이블의 DATA값이 초기화됨과 동시에 같이 초기화된다.

2015ict융합 37호 (9)

소비자들이 언제든지 자신이 속한 테이블의 정보를 확인할 수 있도록 만든 모바일 웹 시스템이다. View Port를 사용하여 디바이스 크기가 모두 다른 소비자들의 다양한 스마트 폰을 반응형 웹을 사용하여 언제든지 최적화된 화면으로 확인할 수 있도록 만들었으며, 모바일 뿐만 아니라 데스크탑이나 타블렛 등도 가능하도록 만들었다. 식당의 위치를 구글 맵 API를 사용하여 표시해 두었으며, 이 모바일 웹 역시 테이블 단위로 확인이 가능하다.
기타
소스코드 함수 설명
소스코드 함수들의 설명
파일 구성

2015ict융합 37호 (31)
Atmega8 Slave 부분 Atmega8 Slave 부분
2015ict융합 37호 (32)
라즈베리파이 부분 웹 서버 페이지 부분

함수별 기능

Menu_Master 부분 함수 (atmega8 중 master부분)
1) void Transm(void);
이 함수는 메뉴판의 전도성 페인트를 이용해 핀입력을 받는 부분에서 사용한다. 핀 입력이 들어올때마다 인터럽트가 걸리도록 구성했다. 초기의 구상은 LCD를 통해 계속 디스플레이를 하다가 핀 입력이 들어올 때 블루투스로 값을 전송을 하려고 하였는데, LCD안의 delay함수로 인해 핀입력시 바로 처리되지 않는 문제점이 생겨서 TWI통신을 사용했다.
외부 인터럽트를 생각했지만, atmega8의 외부인터럽트 핀이 매우 부족하여, 많은 핀입력들을 모두 인터럽트로 처리하지 못한것도 TWI 인터럽트를 사용한 이유이다.
이 함수의 역할은 while문 안에서 계속 반복되며, pin의 값은 모두 DDR을 통해 입력으로 설정하고 초기 값을 1로 모두 입력해준다. 그럼 항상 high인 상태이며, 이 상태에서 스위치를 통해 입력이 발생되면 값이 Low로 변하게 되고 이때의 신호를 잡도록 하기 위한 것이 바로 void Transm(void); 함수이다.
우선 pin B, C, D의 상태를 비트 연산자를 통하여 KeyB, C, D라는 변수에 저장을 한다. 이 저장된 unsigned char 변수를 if문을 통해 어떠한 핀이 입력이 들어왔는지 검사한다. 예를들어, if(keyC==0x0e)라면 keyC가 0b00001110으로 즉, 0번 핀이 high값에서 low로 변할때 if문 안으로 들어가는 것이다. 즉 필터링 역할을 해주는 함수이다.
함수 안으로 들어오면 str이라는 char 변수에 ‘a’부터 ‘o’까지의 문자를 저장시키고 이를 TWI 송신 함수를 이용하여 slave쪽으로 전송을 한다. delay를 준 이유는, 키를 누르고 있는 동안 문자가 slave로 여러 번 전송되는 것을 막기 위해 받는 쪽과 같이 delay를 넣어서 한번 눌렀을 때 한번 송수신을 하도록 했다.

2) void TWI_Page_WRITE(int add);
TWI통신이란 두 개의 선을 이용한 통신으로, 병렬적으로 여러 개가 버스 형식으로 연결이 가능한 통신이다. SDA와 SCL선이 있으며, 두 개의 선을 이용한 효율적인 통신 방식이다. 보통 master와 slave로 설정을 해주면 동작을 한다. 최대 400KHz까지의 통신속도를 지원한다. atmega8에서는 PINC의 4,5번이 이 두 개의 선에 해당한다.
동작되는 방식은 처음에 TWCR값을 조절하여 송신 start조건을 내보낸다. while문에서 TWINT가 1로 설정되기를 기다린다. 이는 start조건이 완료된 것을 의미하는데, TWINT는 작업이 끝나면 다시 1로 되기 때문이다. TWDR에 넣는 값이 전송하려는 값이 되며, TWCR 레지스터는 TWINT를 클리어 시키기 위해 새로 써넣는다. 그 다음 while(!((TWCR&TWINT)&&(TWSR&TW_MT_SLA_ACK))); 문장은 데이터가 전송 완료되어 ACK 신호를 받았는지 확인하는 것이다. 그리고 잠시 대기한 후 다시 TWCR에 stop 조건을 넣어주면서 송신기능을 마무리 하게된다.
slave 부분에서는 이와 비슷한 과정이 반복된다. 대신 TWDR에 값을 넣는 것이 아니라 TWDR의 값을 다른 곳으로 저장하는 부분이 다르다.

3) void Pin_Init(void);
메뉴판에서 핀입력을 여러개 받아야 하는데, 핀입력을 받으려면 DDRA=0×00;과 같이 입력 받을 핀을 0으로 설정해주며 입력으로 사용하는 것이 가능하다. 따라서 핀입력을 위한 설정이다.
DDRC=0×00;, PORTC=0xff;, DDRB=0×00;, PORTB=0xff;, DDRD|=0×00;, PORTD=0x1f; 등과 같이 입력으로 쓸 것으로 설정을 하고, 초기 값을 1로 주어 high로 설정해 놓는 함수이다.

< Menu_Slave부분 함수 (atmega 8중 slave부분) >
1) 블루투스 관련 함수들
ㄱ) void uart_init(void);
UART통신을 위해 atmega8에서 필요한 초기 레지스터 설정을 해주는 함수이다. UCSRB를 통해 수신 인터럽트, 수신, 송신을 enable 시킬 수 있도록 설정이 가능하다.
UCSRC의 경우 비동기방식, no parity, stop 비트1, 8비트 등의 블루투스 전송에 대한 기본적인 설정을 해주는 레지스터이다. atmega128같은 경우는 2개가 있지만 atmega8로 작품을 만들었기 때문에 하나의 UART통신이 가능하다.
UBRRH와 UBRRL레지스터를 통해 블루투스 전송속도를 설정 가능하다. 우리 작품의 경우는 16Mhz 크리스탈을 사용하므로 데이터시트를 참고하였을 때, UBRRH = 0×00;, UBRRL = 0×08;의 값으로 설정하면 115200bps의 전송속도가 설정된다.

ㄴ) void put_str(char* ch);
아래의 Putch 함수는 하나의 문자를 전송시켜주는 함수이고, put_str 함수는 포인터와 Putch 함수를 이용하여 parameter로 입력된 문자열을 전송시키는 함수이다. 기본적인 동작은 Putch 함수와 같고 다만 차례로 문자를 전송해 전체적인 문자열을 전송시켜줄 뿐이다.

ㄷ) void Putch(char data);
UCSRA과 0×20과 비교하며 6번째 비트가 0인지 1인지 비교하다가 송신할 준비가 되면 UDR값에 data를 넣어서 값을 전송시켜주는 간단한 함수이다.

ㄹ) char Getch(void);
UCSRA의 0×80과 비교하며 8번째 비트가 0인지 1인지 비교하다가 데이터가 수신되면 UDR값에 data를 수신하여 return 시켜주는 함수이다.

ㅁ) void atcommand (flash unsigned char *s);
블루투스로 명령어를 전송할 때 이 함수를 이용했었지만, 테스트 중에는 보드를 이용해 페어링 시켰기 때문에 실제로 사용하지 않았다. 하지만 추후에 조금 더 안정적인 블루투스 연결을 위해 내부에 이 함수를 이용하여 블루투스의 데이터시트에 있는 AT command를 전송하도록 소스를 구성할 예정이다.

2) LCD 관련 함수들
ㄱ) void LCD_Blink(void);
현재 제작한 메뉴판에는 총 15개의 핀이 있는데, 그 중 실제 메뉴는 14개만 사용중이며, 하나의 핀은 현재 수량을 나타내도록 사용한다. 그것에 해당하는 함수가 이 함수인데, 우선 DataCopy라는 함수를 통해 4개의 배열에 LCD에 디스플레이 할 문자들을 저장한다.
메뉴가 14개이기 때문에, 한 줄에 나타낼 수 있는 문자수를 고려하여 4개의 줄로 구성하였다. LCD_String 함수에 아까 저장한 배열을 입력해주면 첫줄에 출력이 되고, Command 함수의 명령어를 통해 2번째 줄로 이동한다. 그 다음 2번째 줄에 해당하는 배열을 똑같은 방식으로 출력해준다.
2×22 CLCD이므로 이렇게 하면 화면이 꽉찬다. delay를 조금 여유 있게 주어 사용자가 충분히 볼 수 있도록 한 후, Command 함수를 통해 화면을 모두 지워준다. 그 다음은 3번째와 4번째 줄을 표시하기 위한 과정이며 위의 과정을 반복하게 된다.

ㄴ) void DataCopy(void);
CLCD에 현재 메뉴판의 14개의 주문 현황을 나타내기 위해 필요한 과정이다. LCD의 길이에 맞도록 char형 배열을 선언하고, 이 배열에 sprintf를 이용해 원하는 문자열을 복사한다. sprintf를 사용하는 이유는 문자와 숫자를 동시에 쓰고 싶고 메뉴의 수량이 계속 변하기 때문에, 이 변하는 숫자 값을 저장시켜 주기 위해 사용하였다.

ㄷ) void LCD_init(void);
CLCD를 사용하기 위해서 초기에 가장 먼저 설정해주어야 하는 함수이다. 이 작품을 만들 때 생겼던 문제는, atmega8을 사용하다보니 포트수가 매우 적었다. 어쩔 수 없이 B나 D포트를 사용해야하는데 B포트는 사용할 수 없어서 D포트에 LCD를 연결했지만, D포트의 0번과 1번이 UART통신을 통해 블루투스 통신을 해주고 있었기 때문에 겹쳐서 문제가 발생하였다. 때문에 B포트에 0, 1, 2포트와 D포트의 4, 5, 6, 7 포트를 사용하는 것으로 수정했다. 따라서 처음에 이를 위한 DDR 설정이 있다. 그 다음은 Command 함수를 이용하여 데이터시트를 참고하여 초기화에 필요한 레지스터 값을 설정해주는 단계이다.

ㄹ) void Command(unsigned char);
이 함수는 좀 더 편하게 LCD의 명령어를 입력하고 제어하기 위해 설정한 함수이다. 상단에 #define을 통해 LCD의 동작값 비트를 설정해 놓았고, 데이터 시트를 참고하여 LCD의 4번부터 6번핀의 값인 RS, R/W, E값을 조절하며 LCD의 동작모드를 설정한다. 이러한 동작모드의 설정은 B포트와 관련되어 있고, 직접적인 데이터가 입력되는 부분은 포트 D의 4~7번 비트이다.

ㅁ) void Data(unsigned char);
위의 Command 함수를 통해 동작모드를 설정하게 되고 Data 함수는 실제로 LCD에 출력하기 위해 데이터를 쓰는 함수이다. 인자로 전달받은 값은 포트 D의 값과 비트 연산을 하게 된다. 비트는 8개의 비트지만 LCD에서 4개의 포트만 연결하여 사용하기 때문에 상위 4개 바이트와 하위 4개 바이트를 따로 처리하며, 인자값과 0xf0과의 &연산을 통해 상위비트만 걸러낸다. 포트 B를 조절해 write 기능을 동작하도록 한다. 그 후 포트B의 E=1로 설정해 LCD가 동작하도록 했다가 다시 0으로 만들어준다. 하위바이트는 시프트 연산을 통해 왼쪽으로 4칸 이동하여 하위 4개의 비트를 포트 D에 저장시킨다. 그 후 똑같이 레지스터를 설정해 write하는 과정을 거친다.

ㅂ) void LCD_String(char *str);
이 함수는 단순히 포인터로 인자를 전달받아 위의 Data 함수로 포인터를 차례대로 전송하여 LCD에 문자열이 출력되도록 하는 함수이다.

3) 데이터 분류 함수
ㄱ) void twi_slave_read(void);
위에서 설명한 master의 송신부분과 유사하며, 수신을 하는 함수이다. TWINT값이 1로 설정되기를 기다리며, ACK 신호를 받았는지 확인한다. 그리고 TWDR에 들어있는 값을 다른 변수에 저장하고, 이 변수가 바로 다음 detect1 함수의 인자로 전달되도록 되어있다. 그 후 다시 stop 조건을 걸어주고 끝난다. 이 함수는 while문 안에서 계속 수신하도록 반복되고 있다. master로부터 ‘a’부터 ‘o’까지의 문자중 하나를 받아 해당하는 동작을 하도록 연결해주는 역할을 한다.

ㄴ) void detect1(char ar1);
TWI의 slave 수신 모드 안에 속해 있는 함수로 ‘a’부터 ‘o’까지 입력받은 문자를, if문으로 필터링하여 넘어온 문자에 해당하는 핀값에 따라 블루투스를 이용해 라즈베리파이로 문자 패킷을 전송한다. 예를 들어, T1M01; 이라는 패킷을 전송하게 되면, T와 M과 ;을 기준으로 제대로 된 정보가 넘어왔는지 판단하고, 테이블 번호와 몇 번째 메뉴를 주문한 것인지 구분 하게된다. 블루투스를 전송하고 동시에 LCD에 몇 번 메뉴를 전송했는지 출력을 해주며, 전체 수량 출력을 위해 전역변수로 선언된 num 변수의 해당 메뉴 수량을 하나 올리는 역할을 한다.

라즈베리파이 소스의 함수
void Table_init(void);
typedef struct{
int menu[15];
int price[15];
}table
다음과 같은 구조체가 선언되어 있는데, 블루투스로 날라온 테이블과 메뉴에 해당하는 곳의 배열의 수량이 하나씩 추가되도록 되어있다. price에는 메뉴의 가격들이 저장되어 있다. 그 이유는 Mysql과 연동해 업데이트 시킬 때, 할인율이나 주문 개수에 따른 총 가격등을 업데이트 하기위해 초기 가격이 필요하기 때문에 저장해놓은 값이다. 이 함수는 이러한 구조체 변수를 초기화시키기 위한 함수이다.

※ 추가적 설명
while문 안에서 SerialGetchar 함수를 통해 입력을 받고 이를 터미널 창에 출력을 해준다. if문을 통해 문자 패킷이 프로토콜에 맞는 패킷인지 구분 한다. 예를들어 T1M01;은 주문을 의미하는 것이고 끝이 -로(T1M01-) 끝나면 값들을 모두 초기화 시키도록 하였다. 정상적인 값이 올 경우 01이라는 수량은 문자로 인식하기 때문에 이를 숫자로 바꿔 인식하는 작업을 해준다. 이 수량을 첫 번째 데이터와 두 번째 데이터라고 했을 때, 첫 번째 데이터가 0이라면 단순히 두 번째 데이터만 숫자로 변환하면 된다. 그렇지 않고 처음 데이터가 0이 아닐 경우 10의 자리를 무시할 수 없으므로, 처음 수신 데이터 값도 숫자로 바꾸고 10을 곱하여 두 수를 더해서 처리한다. 이렇게 테이블 번호와 메뉴 번호를 저장하고, 라즈베리파이의 mysql 관련 라이브러리를 설치한다. mysql.h라는 헤더파일을 이용하여 mysql과 연동하게 된다.
처음 연동시, localhost를 적고, mysql 계정과 비밀번호, database 등의 정보를 이용해 접속 한다. 접속된 후에, szQuery라는 배열에 sprintf를 이용하여 Mysql의 update 문장을 넣는다. 이 업데이트문은 아까 접속한 TMenu라는 database 안에 있는 tblinfo라는 테이블에 많은 값들을 변경시켜준다. 변경이 잘 된다면, 해당테이블과 메뉴의 쿼리 변경 현황을 터미널창에 출력하도록 되어 있다.

주요 함수의 흐름도

2015ict융합 37호 (33)
라즈베리파이 & 서버 함수 흐름도
2015ict융합 37호 (34)
메뉴판 & 라즈베리파이 함수 흐름도

 

참고문헌
우분투 리눅스, 강문규, 나익수, 이귀봉, 이병수, 가메 출판사
임베디드 리눅스 기초와 응용, 사공준, 우종정, 한빛 미디어
리눅스와 함께하는 라즈베리 파이, 피터엠브리, 데이비드 하우스, 제이펍
AVR Atmega128, 윤왕철, 복두 출판사
Learning PHP, MySQL & JavaScript , 로빈 닉슨, 에이콘 출판사
이것이 자바다, 신용권, 한빛 미디어
백견불여일타 JSP & Servlet, 성윤정, 로드북
Do it! HTML5 + CSS3 웹 표준의 정석, 고경희, 이지스퍼블리싱

프로젝트 시연 영상

2015ict융합 37호 (38)

https://www.youtube.com/watch?v=L0ppK_3X42I

회로도

2015ict융합 37호 (35)
5V 공급을 위한 전원부 회로도
2015ict융합 37호 (36)
NPN트랜지스터 2개를 이용한 터치 스위치 회로도
2015ict융합 37호 (3)
블루투스 3.3V 공급을 위한 전원부 회로도
2015ict융합 37호 (37)
전체적인 회로도
Leave A Comment

*