[38호]友 酒 Like-? 친구야 Cocktail 한잔 어때?
2016 ICT 융합 프로젝트 공모전 참가상
友 酒 Like-? 친구야 Cocktail 한잔 어때?
글 | 상지대학교 김준혁, 유대상, 황보경태
심사평
뉴티씨 매우 고생하여 만든 흔적이 역력하며, 실용적으로 잘만 다듬으면 좋은 제품이 될 수도 있을 것으로 생각된다.
현재는 실용적으로 사용하기는 디자인이나 작품성 면에서 조금 부족하지만, 디자인적인 감성과 기계적인 부분이 잘 접목되면 좋은 작품이 될 것이다. 현재는 그런 베이스가 부족한 상황에서도 전자적인 제어만으로 잘 구현하였다.
칩센 모터 제어를 연습하기 위한 최고의 주제라고 생각한다.
위드로봇 모터 제어 부분과 실제 시스템 동작시 장단점 등의 분석이 보고서에 언급이 되면 좋겠다.
작품 개요
술자리의 의의는 친목을 도모하고 함께하는 사람들과 기억에 남을 추억을 만드는 것이다. 현재 대학생인 우리는 항상 비슷하고 딱딱한 분위기의 술자리에 지루해하고 있다. 그래서 우리는 색다르고 특별한 재미를 첨가시키고 싶었다.
요즘 대학생들 사이에 칵테일은 인기가 많다. 칵테일은 복잡하고 미묘한 맛을 지닌 음료로써 마시는 사람의 기호와 취향에 맞추어 먹는 술의 예술품이라 할 수 있다. 그래서 공대생인 우리는 건전한 음주문화를 재미와 특별함을 위해, 직접 프로그래밍을 하여 칵테일 제조기를 만들게 되었다. 그리고 우리는 1년에 한 번씩 축제를 여는데 그 때 우리가 만든 칵테일 제조기를 사용하여 다른 학과들이 할 수 없는 공대생들의 위엄을 보여 주기로 하였다.
작품 설명
주요 동작 및 특징
Atmel社의 ATmega128에 AVR Studio 프로그램을 삽입하여 모터펌프와 프로펠러, LCD화면을 이용하여 구동하는 칵테일 머신이다. 그림에 보이는 칸 마다 다른 종류의 음료를 배치하고 일렬로 배치된 모터펌프를 이용하여 비율에 맞게 끌어올려서 배합기 통으로 음료를 전달한다. 배합기에서 모인 음료들이 섞이고, 배출구와 연결된 모터펌프가 배합기를 거쳐서 제조된 칵테일을 외부로 배출시킨다. 음료가 완성되면 음악과 LED 조명이 켜지는 등의 심미적인 요소를 더했다. 또 복불복 게임 모드 기능을 추가했는데, 이 기능은 LCD 화면에 4개의 원이 나타나고 이 원을 하나씩 고를 때마다 당첨과 꽝으로 나타난다. 술 게임과 유사한 오락적인 요소로 재미를 더했으며, 음료가 섞이는 배합기를 깨끗하게 세척하기 위해 전동기 모터와 프로펠러를 이용했다. 이 작품의 외형은 아크릴과 포맥스로 제작했고, 테스트 보드는 작년 수업시간에 쓰던 것을 이용했고, 배합 통은 페트병을 이용했다.
개발 환경
AVR Studio를 이용하여 프로그래밍을 하고 난 후 회로를 구성했다.
상황에 따른 모터의 작동 순서와 LED를 출력하기 위해 많은 포트를 사용하느라 기존의 5V 어댑터의 전압만으로는 많이 부족했다. 그래서 별도의 12V 전압을 연결하여 전압을 보충하였다.
제작 과정
12V DC모터펌프에 호스를 연결하여 고정하였다.(위에서 본 사진)
12V 전동기 모터를 이용하여 배합통에 장착될 배합기를 만들었다.
재료통에 연결된 튜브를 배합기으로 이어준다.
ATmega128를 이용하여 회로를 구성하였다.
완성된 友 酒 Like의 모습
이 기계가 구동되는 C언어
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
#include “mp3.h”
#include <util/delay.h>
#include “tftlcd_uart1.h”
#include “tftlcd.h”
/**************************************
[MP3 connection]
PORT MP3 pin
=======================================
1 LED-Acess Mute 24
2 LED-Random LED-PUS 23
3 LED-repeat LED-PSD 22
PA2 —— 4 Reset LED-Play 21
GND —— 5 SEL-Slave LED-Error 20
PA1 —— 6 R1(MUCHNG) Audio-L-Out 19 — L-speaker –o o–+
PA0 —— 7 R2(Busy) Audio-R-Out 18 –R-speaker –o o–+
PA5 -+—- 8 R3(SCL) DC5V 17 —— +5V |
PA4 -|-+– 9 R4(SDA) USB(PM) 16 |
GND -|-|– 10 C1 USB(DM) 15 |
GND -|-|– 11 C2 GND 14– GND —–+
PA3 -|-|– 12 C3(ModeH-2,L-3) DC3.3V 13
| | ========================================
| |
| +—- 10K — +5V
+—— 10K — +5V
PF7 —— 1 18 ——o MOTOR1 o—–+12V
PF6 —— 2 17 ——o MOTOR2 o—–+12V
PF5 —— 3 16 ——o MOTOR3 o—–+12V
PF4 —— 4 15 ——o MOTOR4 o—–+12V
PF3 —— 5 14 ——o MOTOR5 o—–+12V
PF2 —— 6 13 ——o MOTOR6 o—–+12V
PF1 —— 7 12 ——o MOTOR7 o—–+12V
PF0 —— 8 11 ——o MOTOR8 o—–+12V
GND —— 9 10 ———————+12V
|
+–o +12V 전원
GND ————————————–o GND [LED connection}
PORT 2803 LED
PC7 ------ 1 18 ------o LED1 o-----+5V
PC6 ------ 2 17 ------o LED2 o-----+5V
PC5 ------ 3 16 ------o LED3 o-----+5V
PC4 ------ 4 15 ------o LED4 o-----+5V
PC3 ------ 5 14 ------o LED5 o-----+5V
PC2 ------ 6 13 ------o LED6 o-----+5V
PC1 ------ 7 12 ------o LED7 o-----+5V
PC0 ------ 8 11 ------o LED8 o-----+5V
GND ------ 9 10
***************************************/
// mp3.c에 정의된 변수를 사용함
extern uchar volatile uflag;
extern uchar CurrFileNum;
extern uchar SI_Buff[BUFF_MAX];
extern uchar I2C_Read_Buff[76];
#define DISP_START 0×0010
#define DISP_SEL_1 0×0020
#define DISP_SEL_2 0×0030
#define DISP_SEL_3 0×0040
#define DISP_SEL_4 0×0050
#define DISP_SEL_5 0×0060
#define DISP_SEL_6 0×0070
#define DISP_FINISH 0×0080
#define DISP_1 0×0100
#define DISP_2 0×0110
#define DISP_3 0×0120
#define DISP_4 0×0130
#define PIC_INIT 0
#define PIC_START_UP 1
#define PIC_START_DN 2
#define PIC_MENU 3
#define PIC_MAKING 4
#define PIC_FINISH 5
#define PIC_GAME 6
#define PIC_GAMECOLOR 7
#define PIC_GAMERESULT 8
#define OFF 0
#define ON 1
#define RUN_START 0
#define RUN_CHOISE 1
#define RUN_MAKING 2
#define RUN_FINISH 3
#define RUN_GAME 4
unsigned char motor_speed[9]={0,0,0,0,0,0,0,0,0};
unsigned char cur_count=0;
extern volatile char RXFRMOK;
extern unsigned char REC[128];
char run_flag = RUN_START;
unsigned long MSEC10=0;
/////////////////////////////////////////////////////////////
ISR(TIMER0_OVF_vect)
{
int i;
MSEC10++;
for(i=0; i<8; i++)
{
if(motor_speed[i] == cur_count)
{
PORTF |= 1<<i;
}
}
if(motor_speed[8] == cur_count)
{
PORTD |= (1<<0);
}
if(cur_count==0)
{
PORTF = 0×00;
PORTD &= ~(1<<0);
}
cur_count–;
}
//////////////////////////////////////////////////////////////////////
void InitPORT(void)
{
// for MP3 module control
PORTA = 0b00110111;
DDRA = 0b00001100;
// PA5 (I) – I2C SCL
// PA4 (I) – I2C SDA
// PA3 (O) – H:mode2 L:mode3
// PA2 (O) – nRESET
// PA1 (i) – MUCHNG
// PA0 (i) – BUSY
// for MP3 LED
PORTB = 0×00;
DDRB = 0b00111000;
// PB5 (o) – PLAY LED ISP
// PB4 (O) – SLED ISP
// PB3 (o) – ISP
// PB2 (i) -
// PB1 (i) -
// PB0 (i) -
// for LED output
DDRC = 0xff;
// for motor9 output
DDRD = 0×01;
// for motor1-8 output
PORTF=0×00;
DDRF=0xff;
// for key input and TFT LCD
PORTE=0xff;
DDRE=0×00;
_delay_ms(50);
// 타이머 카운트 설정, 1/16us*8분주*(256-156) = 50us
TIMSK = 0×01; // 인터럽트 일단 정지
TCCR0 = 0×02; // clk/8분주
TCNT0 = 0; // 타이머 카운트 레지스터 초기값
완성작
회로도
기타
‘생릉출판’ – 쉽게 배우는 AVR ATmega128 마이크로컨트롤러
‘한빛미디어’ – 디지털 논리회로, AVR마이크로컨트롤러
‘INFINITY BOOKS’ – 한번에 이해되는 AVR ATmega128 C로 배우는 프로그래밍 기초